Forum użytkowników programów ZWCAD, KOMPAS-3D, Scan2CAD, PDF2CAD Strona Główna Forum użytkowników programów ZWCAD, KOMPAS-3D, Scan2CAD, PDF2CAD
Forum CAD.

FAQFAQ  SzukajSzukaj  UżytkownicyUżytkownicy  GrupyGrupy
RejestracjaRejestracja  ZalogujZaloguj

Poprzedni temat «» Następny temat
[lisp] - selection set - jak przywrócić?
Autor Wiadomość
gruzin 
sanitarnik

Pomógł: 5 razy
Dołączył: 16 Lip 2009
Posty: 232
Skąd: Białystok
Wysłany: Wto Sty 10, 12 10:20   [lisp] - selection set - jak przywrócić?

Prubuję uporac się z zaznaczeniami w lispie.
1. Wybieram zaznaczone elementy:
Kod:
(vl-load-com)
(setq mh_CadObj (vlax-get-acad-object))
(setq mh_acd_doc (vla-get-activedocument mh_CadObj))
(setq mh_activselection (vla-get-ActiveSelectionSet mh_acd_doc))

2. wykonuje dalszą cześć funkcji w lispie
3. Chciałbym aby po wykonaniu polecenia przywrócić zaznaczenie. Da się to jakoś zrobić? Mógłby mnie ktoś nakierować, czego i gdzie szukać, jakiej funkcji użyć?
_________________
www.instalacjesanitarne.com
www.profilek.net
 
     
Assgarth 
programista

Pomógł: 2 razy
Dołączył: 26 Sty 2009
Posty: 136
Skąd: Poznań
Wysłany: Wto Sty 10, 12 10:47   

Temat jeszcze aktualny? :)
Bo widzę, że na cad.pl kojacek udzielił już odpowiedzi.
_________________
Obecnie używam ZwCAD:
_VERNUM = "2011.10.30(17176)"
 
     
gruzin 
sanitarnik

Pomógł: 5 razy
Dołączył: 16 Lip 2009
Posty: 232
Skąd: Białystok
Wysłany: Wto Sty 10, 12 11:00   

Udzielił, musze tylko przemysleć sobie jak zrobić dobrze dwie funcje
1. zapamiętującą co jest aktualnie zaznaczone i czy czy wogule jest coś zaznaczone
2. przywracającą zaznaczenie o ile takie było
_________________
www.instalacjesanitarne.com
www.profilek.net
 
     
Assgarth 
programista

Pomógł: 2 razy
Dołączył: 26 Sty 2009
Posty: 136
Skąd: Poznań
Wysłany: Wto Sty 10, 12 11:13   

gruzin napisał/a:
Udzielił, musze tylko przemysleć sobie jak zrobić dobrze dwie funcje
1. zapamiętującą co jest aktualnie zaznaczone i czy czy wogule jest coś zaznaczone
2. przywracającą zaznaczenie o ile takie było


Dwie funkcje już Masz (i w sumie tylko tyle jest Ci potrzebne):

Zamienić zbiór wskazań na listę obiektów
Kod:
;;--------------------------------=={ zk:SSZbr->List }==-----------------------------------;;
;;  Zamienia ss-grupę na listę z entity name                                               ;;
;;-----------------------------------------------------------------------------------------;;
;; ssZbr   [SSGET] - SS-group                                                              ;;
;;-----------------------------------------------------------------------------------------;;
(defun zk:SSZbr->List (ssZbr / % lista)
    (repeat
        (setq % (sslength ssZbr))
        (setq % (1- %) lista (cons (ssname ssZbr %) lista))
    )
)


Zamienić listę na zbior wskazań
Kod:
;;--------------------------------=={ zk:LST_SS->List }==-----------------------------------;;
; Ze zbioru SS-GET tworzy listę Entity Name                                                 ;;
;;------------------------------------------------------------------------------------------;;
(defun zk:LST_SS->List (sel / % l)
    (repeat
        (setq % (sslength sel))
        (setq % (1- %)
              l (cons (ssname sel %) l)
        )
    )
)


a potem:
Kod:
(sssetfirst nil ss)
[/quote]
_________________
Obecnie używam ZwCAD:
_VERNUM = "2011.10.30(17176)"
 
     
gruzin 
sanitarnik

Pomógł: 5 razy
Dołączył: 16 Lip 2009
Posty: 232
Skąd: Białystok
Wysłany: Wto Sty 10, 12 12:24   

hmmm. Te dwie funkcje sa identyczne.
Teraz robota się zwaliła, wieczorkiem to dokładniej przeanalizuje.
_________________
www.instalacjesanitarne.com
www.profilek.net
 
     
Assgarth 
programista

Pomógł: 2 razy
Dołączył: 26 Sty 2009
Posty: 136
Skąd: Poznań
Wysłany: Wto Sty 10, 12 12:38   

gruzin napisał/a:
hmmm. Te dwie funkcje sa identyczne.
Teraz robota się zwaliła, wieczorkiem to dokładniej przeanalizuje.


hehe :)
faktycznie wkleiłem Ci tą samą funkcję dwukrotnie (starą wersję i nową) - sorrki :)
No ale tak czy siak, Masz już listę ename, więc utworzyć z niej z powrotem ss-group, to pikuś ;)

pozdrawiam
_________________
Obecnie używam ZwCAD:
_VERNUM = "2011.10.30(17176)"
 
     
gruzin 
sanitarnik

Pomógł: 5 razy
Dołączył: 16 Lip 2009
Posty: 232
Skąd: Białystok
Wysłany: Sro Sty 11, 12 13:18   

mam tyle:
Kod:
;=========================================================================
(defun c:aaa ()
(setq temp (zk:LST_SS->List (ssget)))
)

(defun c:bbb ()
(sssetfirst nil (mh:List->LST_SS temp))
;(mh:List->LST_SS temp)
)

;=========================================================================
; Ze zbioru SS-GET tworzy listę Entity Name
(defun zk:LST_SS->List (SSsel / % listEName)
    (repeat
        (setq % (sslength SSsel))
        (setq % (1- %)
              listEName (cons (ssname SSsel %) listEName)
        )
    )
)
;=========================================================================

;=========================================================================
; Ze listy Entity Name tworzy zbiór wskasań SSGet
(defun mh:List->LST_SS (listEName / % SSzbior)
    (setq SSzbior (ssadd))

    (repeat
        (setq    % (vl-list-length listEName))
        (setq    % (1- %))
        (ssadd (nth % listEName) SSzbior)
    )
    SSzbior
)
;=========================================================================


mysle nad wykozystaniem ssget bo vla-get-ActiveSelectionSet jakoś nie dam rady
_________________
www.instalacjesanitarne.com
www.profilek.net
 
     
Assgarth 
programista

Pomógł: 2 razy
Dołączył: 26 Sty 2009
Posty: 136
Skąd: Poznań
Wysłany: Sro Sty 11, 12 13:36   

No właśnie się zastanawiałem dlaczego chcesz tutaj VisualLisp skoro SSGET z Lisp działa dobrze i szybciej :)
Dodatkowo zauważyłem błąd w ZwCAD:

przy kolejnym wywołaniu
Kod:
(setq adoc (vla-get-activedocument(vlax-get-acad-object)))(vlax-for a (vla-get-activeselectionset adoc))

wyrzuca błąd i to bez względu na postać funkcji.
Po prostu VLA-GET-ACTIVESELECTIONSET albo nie czyści informacji w pamięci, albo wymaga dodatkowego ustawienia (w AC działa bez problemów).
Cytat:
błąd: *BŁĄD*
(VLA-GET-ACTIVESELECTIONSET ADOC)
(VLAX-FOR B (VLA-GET-ACTIVESELECTIONSET ADOC))
_________________
Obecnie używam ZwCAD:
_VERNUM = "2011.10.30(17176)"
 
     
Assgarth 
programista

Pomógł: 2 razy
Dołączył: 26 Sty 2009
Posty: 136
Skąd: Poznań
Wysłany: Sro Sty 11, 12 13:52   

Jeszcze jedna uwaga, zanim użyjesz funkcji vla-get-ActiveSelectionSet, to musisz sprawdzić czy jakiś zbiór istnieje, a jeśli nie, to go utworzyć np.
Kod:
(setq ss (ssget "_x" '((0 . "INSERT") (66 . 1))))

Niemniej i tak występuje błąd w tej funkcji, co też zgłosiłem w odrębnym temacie.

pozdrawiam
_________________
Obecnie używam ZwCAD:
_VERNUM = "2011.10.30(17176)"
 
     
gruzin 
sanitarnik

Pomógł: 5 razy
Dołączył: 16 Lip 2009
Posty: 232
Skąd: Białystok
Wysłany: Sro Sty 11, 12 14:52   

Mam juz i działa

Kod:
;=========================================================================
(defun mh:SYS_GetSelection ()
;Zwraca listę Entity Name zaznaczonych obiektów lub nil jeżeli nic nie było zaznaczone
    (if (not (= nil (ssget "I")))
        (zk:LST_SS->List (ssget "I"))
        nil
    )
)
;=========================================================================

;=========================================================================
(defun mh:SYS_SetSelection ( listEN /)
;listEN - lista entity name
    (if (not (= nil listEN))
        (sssetfirst nil (mh:List->LST_SS listEN))
    )
)
;=========================================================================

;=========================================================================
; Ze zbioru SS-GET tworzy listę Entity Name
(defun zk:LST_SS->List (SSsel / % listEName)
    (repeat
        (setq % (sslength SSsel))
        (setq % (1- %)
              listEName (cons (ssname SSsel %) listEName)
        )
    )
)
;=========================================================================

;=========================================================================
; Ze listy Entity Name tworzy zbiór wskasań SSGet
(defun mh:List->LST_SS (listEName / % SSzbior)
    (setq SSzbior (ssadd))

    (repeat
        (setq    % (vl-list-length listEName))
        (setq    % (1- %))
        (ssadd (nth % listEName) SSzbior)
    )
    SSzbior
)
;=========================================================================


Wywołanie tego np. tak:
Kod:

(setq MHSelMember (mh:SYS_GetSelection)) ;zaznaczenie elementów

(mh:SYS_SetSelection MHSelMember) ; przywrócenie zaznaczenia
_________________
www.instalacjesanitarne.com
www.profilek.net
 
     
Assgarth 
programista

Pomógł: 2 razy
Dołączył: 26 Sty 2009
Posty: 136
Skąd: Poznań
Wysłany: Sro Sty 11, 12 15:07   

Możesz wrzucić jakiś rysunek z obiektami, na których to działa?
Bo nie bardzo rozumiem (ssget "I") - czyli Implied.
_________________
Obecnie używam ZwCAD:
_VERNUM = "2011.10.30(17176)"
 
     
gruzin 
sanitarnik

Pomógł: 5 razy
Dołączył: 16 Lip 2009
Posty: 232
Skąd: Białystok
Wysłany: Sro Sty 11, 12 15:12   

użyj tego
- przed uzyciem zaznacz elementy lub nie

Kod:
(defun c:aaa ( / widok pozx pozy pozz MHSelMember)
(setq MHSelMember (mh:SYS_GetSelection))
;(mh:ustzap)


            (setq    widok (getvar "VIEWCTR")
                    pozx (nth 0 widok)
                    pozy (nth 1 widok)
                    pozz (nth 2 widok)
                    pozy (+ pozy 100.0))
            (command "_.zoom" "_c" (list pozx pozy pozz) "")
       


;(mh:ustprzywr)
(mh:SYS_SetSelection MHSelMember)
);defun
_________________
www.instalacjesanitarne.com
www.profilek.net
 
     
Assgarth 
programista

Pomógł: 2 razy
Dołączył: 26 Sty 2009
Posty: 136
Skąd: Poznań
Wysłany: Sro Sty 11, 12 15:18   

Uhm... ciekawe. Do czego chcesz to zastosować - tak z czystej ciekawości :)
_________________
Obecnie używam ZwCAD:
_VERNUM = "2011.10.30(17176)"
 
     
gruzin 
sanitarnik

Pomógł: 5 razy
Dołączył: 16 Lip 2009
Posty: 232
Skąd: Białystok
Wysłany: Sro Sty 11, 12 15:23   

Mam w swojej nakładce funkcje która zmienia widok o określona wielkośc w lewo prawo itp.
Robiąc projekt budowlany budynku wielokondygnacyjnego muszę szybko przełączać widok między kondygnacjami. To juz miałem więc mogłem szybko sprawdzać czy na kondygnacjach pokrywaja sie szachty instalacyjne, kanalizacyjne itp.
Miałem tez funkcję do kopiowania o określoną odległość (czyli między kondygnacjami).

Teraz mogę przesuwając widok z kondygnacji na kondygnację zaznaczyć jakies elementy i np je skasować razem lub zrobić z nich blok lub grupę i przesuwać wspólnie na wszystkich pietrach.
_________________
www.instalacjesanitarne.com
www.profilek.net
 
     
Assgarth 
programista

Pomógł: 2 razy
Dołączył: 26 Sty 2009
Posty: 136
Skąd: Poznań
Wysłany: Sro Sty 11, 12 15:33   

No to zatem powodzenia w dalszych działaniach :) Projekt rośnie w siłę.
Sprawdź przy okazji czy funkcją "_select" nie załatwiłbyś sprawy szybciej.

Kod:
(setq ssOld (ssget "_x"))
... jakieś działania ...
(command "_select" ssOld "")
(setq ssNew (ssget "_p"))

Co prawda nazwa ss-grupy się zmieni, ale obiekty pozostają te same.

Można ją też wykorzystać w przypadku wyłapania nowych obiektów, w stosunku do poprzedniego wyboru np.

Kod:
(setq ssOld (ssget "_x"))
... pojawiają się nowe obiekty ...
(setq ssNew (ssget "_x"))
(command "_select" ssNew "_r" ssOld "")   ;wyłapanie tylko nowo powstałych obiektów
(setq ssNew1 (ssget "_p"))



pozdrawiam
_________________
Obecnie używam ZwCAD:
_VERNUM = "2011.10.30(17176)"
 
     
Wyświetl posty z ostatnich:   
Odpowiedz do tematu
Nie możesz pisać nowych tematów
Nie możesz odpowiadać w tematach
Nie możesz zmieniać swoich postów
Nie możesz usuwać swoich postów
Nie możesz głosować w ankietach
Nie możesz załączać plików na tym forum
Możesz ściągać załączniki na tym forum
Dodaj temat do Ulubionych
Wersja do druku

Skocz do:  

Powered by phpBB modified by Przemo © 2003 phpBB Group - anime
Strona wygenerowana w 0,16 sekundy. Zapytań do SQL: 10