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
SETBYLAYER i Ctrl+0
Autor Wiadomość
gruzin 
sanitarnik

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

Cytat:
Dla wielu wskazanych bloków:
Kod:
(defun zk:SSZbr->List (ssZbr / % lista)
(repeat
(setq % (sslength ssZbr))
(setq % (1- %) lista (cons (ssname ssZbr %) lista))
)
)

(foreach % (zk:SSZbr->List (ssget))
(cd:ACX_SetProp (vlax-ename->vla-object %) '(("Color" . 256)))
)



Niedokładnie się wyraziłem. Chodzi mi o zmianę właściwości obiektów wewnątrz bloków. W SETBY LAYER w AC jest taka opcja.
jeżeli w pliku który podczytuje jako odnośnik (Xref) jest kilkaset takich kolorowych bloków to ciężko się odnaleźć bez SETBYLAYER.
_________________
www.instalacjesanitarne.com
www.profilek.net
 
     
Assgarth 
programista

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

wrzuć jakiś przykładowy blok - co by nie błądzić ;)
_________________
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: Pią Sty 20, 12 11:26   

Assgarth napisał/a:
wrzuć jakiś przykładowy blok - co by nie błądzić ;)


Przykładowo pracuję teraz w pliku do którego podczytuję jako 12 plików (jeden z nich w załączniku) jako odnośniki. Codziennie dostaję nowe wersje tych 12 plików i muszę je codziennie obrobić (wyczyścic, naprawić, usunąć zbędne skale i zrobić wszystko JAK WARSTWA aby po podczytaniu móc zmieniać kolory i grubości warstw odnośników).
Zrobiłem sobie oczywiście lispa który to za mnie robi, ale w ZW nie ma funkcji SETBYLAYER i musze to robić na innym kompie na którym jest taka funkcja.

OBR_PB_ZAM_+3.dwg
Pobierz Plik ściągnięto 6 raz(y) 1,49 MB

_________________
www.instalacjesanitarne.com
www.profilek.net
 
     
Assgarth 
programista

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

Sprawdziłem na jednym z bloków, które są na tym rysunku i działa, ale kod jest testowy i wymaga dopracowania - niemniej już jest bliżej niż dalej:

Kod:
(defun zk:SetByLayer (/ AtrVar AtrList)

    (setq AtrVar  (vla-getAttributes (vlax-ename->vla-object (car(entsel)))))
    (setq AtrList (vlax-safearray->list (vlax-variant-value AtrVar)))
    (foreach Item AtrList (vla-put-color Item 256))

    (defun bcls (block_name / block ename ent)
        (setq block (tblsearch "BLOCK" block_name))
        (if block
            (progn
                (setq ename (cdr (assoc -2 block)))
                (while ename
                    (progn
                        (setq ent (entget ename))
                        (setq ent (subst (cons 62 256) (assoc 62 ent) ent))
                        (entmod ent)
                        (setq ename (entnext ename))   
                    )
                )
                (command "_regen")
            )
        )
    )
   
    ;np:
    (bcls "SALON_A.03.07.02_778")
)


blok_test.dwg
Pobierz Plik ściągnięto 5 raz(y) 69,46 KB

_________________
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: Pią Sty 20, 12 12:50   

Swoją drogą te bloki są nieźle pokręcone - nie tylko ATTDEF ale i MTEXT tam mają i inne cuda niewidy :)
Teoretycznie jedna z dwóch metod powinna wystarczyć - zwłaszcza funkcja "bcls", ale niestety nie w Twoim przypadku ;)
Tutaj gotowy programik: link
ale też nie zadziała na całości, tylko tak jak "bcls", stąd dorzuciłem Visual-Lisp'a.

pozdrawiam
_________________
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: Pią Sty 20, 12 12:55   

Jeszcze uwaga, dla ZwCAD ta linijka:
Kod:
(setq AtrList (vlax-safearray->list (vlax-variant-value AtrVar)))

ma wyglądać tak:
Kod:
(setq AtrList (vlax-safearray->list AtrVar))


Assgarth
_________________
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: Pią Sty 20, 12 13:04   

Assgarth napisał/a:
Swoją drogą te bloki są nieźle pokręcone - nie tylko ATTDEF ale i MTEXT tam mają i inne cuda niewidy :)
Teoretycznie jedna z dwóch metod powinna wystarczyć - zwłaszcza funkcja "bcls", ale niestety nie w Twoim przypadku ;)
Tutaj gotowy programik: link
ale też nie zadziała na całości, tylko tak jak "bcls", stąd dorzuciłem Visual-Lisp'a.

pozdrawiam


Swoją droga nie wiedziałem że można vlx podczytać do AWCADA dopuki nie spróbowałem.
_________________
www.instalacjesanitarne.com
www.profilek.net
 
     
Assgarth 
programista

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

Dzięki uprzejmości kojacka, poniżej przedstawiam link do jego funkcji, oraz przykładowe wywołanie (sprawdziłem na Twoim rysunku "OBR_PB_ZAM_+3.dwg" i działa - ale trzeba uzbroić się w cierpliwość, bo obiektów Masz tam od groma i trochę) ;)
link

Kod:
(defun c:SetByLayer (/ lista_z_1 lista_z_ss)
    (foreach blk (jk:BLK_GetBlocks nil)
        (setq lista_z_1 (jk:BLK_Get-DefEnt blk nil))
        (foreach % lista_z_1 (cd:ENT_SetDXF % 62 256))
    )
    (setq lista_z_ss (zk:SSZbr->List (ssget "_x" (list (cons 0 "INSERT")))))
    (foreach % lista_z_ss (foreach %1 (jk:BLK_Get-InsAtts  %)(cd:ENT_SetDXF %1 62 256)))
    (command "_regen")
)


Brakujące funkcje:

Kod:
;;--------------------------------=={ jk:BLK_GetBlocks }==----------------------------------;;
;; Autor: Jacek Kożuszek, www.kojacek.republika.pl                                          ;;
;; Funkcja zwraca liste blokow (bez xref, zaleznych od xref, anonimowych wymiarow i tabel)  ;;
;; Argument [mode] jesli T - dodatkowo bloki anonimowe *U...                                ;;
;;------------------------------------------------------------------------------------------;;
;; (jk:BLK_GetBlocks nil) ;| lub |; (jk:BLK_GetBlocks T)                                    ;;
;;------------------------------------------------------------------------------------------;;
(defun jk:BLK_GetBlocks (mode / bl res m %)
    (setq m "`*D*,`*X*,`*T*,*|*"
          bl (tblnext "BLOCK" T)
    )
    (while bl
        (setq % (cdr (assoc 2 bl)))
        (if
            (not
                (wcmatch %
                    (if mode m (strcat "`*U*," m))
                )
            )
            (setq res (append res (list %)))
        )
        (setq bl (tblnext "BLOCK"))
    )
    res
)


oraz:
Kod:
(defun zk:SSZbr->List (ssZbr / % lista)
    (repeat
        (setq % (sslength ssZbr))
        (setq % (1- %) lista (cons (ssname ssZbr %) lista))
    )
)


Dodam tylko, że powyższe jest przeznaczone do działań na blokach. Pozostałe obiekty zostały opisane wcześniej.

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: Pią Sty 20, 12 15:34   

Assgarth napisał/a:

Dzięki uprzejmości kojacka, poniżej przedstawiam link do jego funkcji, oraz przykładowe wywołanie (sprawdziłem na Twoim rysunku "OBR_PB_ZAM_+3.dwg" i działa - ale trzeba uzbroić się w cierpliwość, bo obiektów Masz tam od groma i trochę) ;)


No własnie. A takich plików do wyczyszczenia jest 12 sztuk. Codziennie. Funkcja SETBYLAYER jest do tego idealna.

Wieczorkiem zobacze te funkcje na ZW. Dzięki

W AC używam czegoś takiego (trochę prymitywne ale nie ma zbędnego klikania) i plik jest zdatny do użycia:

Kod:
(defun c:ppp ()
    (command "_-SCALELISTEDIT" "_r" "_y" "_e")
    (command "_setbylayer" "_all" "" "_y" "_y")
    (command "_audit" "_y")
    (command "_purge" "_a" "" "_n")
    (command "_save" "" "_y")
    (command "_close")
)
_________________
www.instalacjesanitarne.com
www.profilek.net
 
     
gruzin 
sanitarnik

Pomógł: 5 razy
Dołączył: 16 Lip 2009
Posty: 232
Skąd: Białystok
Wysłany: Pią Sty 20, 12 19:40   

Pięknie działa (chociaż trochę wolno i inaczej niż w AC).
Po moich poprawkach w funkcji SetByLayer kod wygląda tak:


Kod:
(defun c:SetByLayer (/ lista_z_1 lista_z_ss)
    (foreach blk (jk:BLK_GetBlocks nil)
        (setq lista_z_1 (jk:BLK_Get-DefEnt blk nil))
        (foreach % lista_z_1 (cd:ENT_SetDXF % 62 256)(cd:ENT_SetDXF % 370 -1))
    )
    (setq lista_z_ss (zk:SSZbr->List (ssget "_x" (list (cons 0 "INSERT")))))
    (foreach % lista_z_ss (foreach %1 (jk:BLK_Get-InsAtts  %)
                                        (progn (cd:ENT_SetDXF %1 62 256)(cd:ENT_SetDXF %1 370 -1)))
    )
    (setq lista_z_ss (zk:SSZbr->List (ssget "_x")))
    (foreach % lista_z_ss (cd:ENT_SetDXF % 62 256)(cd:ENT_SetDXF % 370 -1)
    )
    (command "_regen")
)


;;--------------------------------=={ jk:BLK_GetBlocks }==----------------------------------;;
;; Autor: Jacek Kożuszek, www.kojacek.republika.pl                                          ;;
;; Funkcja zwraca liste blokow (bez xref, zaleznych od xref, anonimowych wymiarow i tabel)  ;;
;; Argument [mode] jesli T - dodatkowo bloki anonimowe *U...                                ;;
;;------------------------------------------------------------------------------------------;;
;; (jk:BLK_GetBlocks nil) ;| lub |; (jk:BLK_GetBlocks T)                                    ;;
;;------------------------------------------------------------------------------------------;;
(defun jk:BLK_GetBlocks (mode / bl res m %)
    (setq m "`*D*,`*X*,`*T*,*|*"
          bl (tblnext "BLOCK" T)
    )
    (while bl
        (setq % (cdr (assoc 2 bl)))
        (if
            (not
                (wcmatch %
                    (if mode m (strcat "`*U*," m))
                )
            )
            (setq res (append res (list %)))
        )
        (setq bl (tblnext "BLOCK"))
    )
    res
)


; =========================================================================================== ;
; Zwraca liste ename obiektow definicji bloku okreslonego typu <EntType> lub wszystkich gdy nil
; =========================================================================================== ;
(defun jk:BLK_Get-DefEnt (Name EntType / en ed res)
  (setq en (tblobjname "BLOCK" Name))
  (while
    (and
      (setq en (entnext en))
      (setq ed (entget en))
      (/= "ENDBLK" (cdr (assoc 0 ed)))
    )
    (if
      (if EntType
        (= (cdr (assoc 0 ed))(strcase EntType))
        (cdr (assoc 0 ed))
      )
      (setq res
        (cons
          (cdr (assoc -1 ed))
          res
        )
      )
    )
  )
  res
)
; =========================================================================================== ;
; zwraca liste ename atrybutow wstawionego bloku <InsEnt>                                     ;
; =========================================================================================== ;
(defun jk:BLK_Get-InsAtts (InsEnt / en ed res)
  (setq en InsEnt)
  (while
    (and
      (setq en (entnext en))
      (setq ed (entget en))
      (/= "SEQEND" (cdr (assoc 0 ed)))
    )
    (if
      (= (cdr (assoc 0 ed)) "ATTRIB")
      (setq res
        (cons
          (cdr (assoc -1 ed))
          res
        )
      )
    )
  )
  res
)

(defun zk:SSZbr->List (ssZbr / % lista)
    (repeat
        (setq % (sslength ssZbr))
        (setq % (1- %) lista (cons (ssname ssZbr %) lista))
    )
)
; =========================================================================================== ;
; Zmiana danych DXF obiektu / Set the DXF data of object                                      ;
;  Ename [ENAME] - nazwa elementu / entity name                                               ;
;  Code  [INT]   - kod pary DXF / code of dotted pair                                         ;
;  Val   [LIST/INT/REAL/STR/ENAME] - wartosc / value                                          ;
; ------------------------------------------------------------------------------------------- ;
; (cd:ENT_SetDXF (entlast) 70 129)                                                            ;
; =========================================================================================== ;
(defun cd:ENT_SetDXF (Ename Code Val / dt new)
  (setq new
    (if
      (not (assoc Code (setq dt (entget Ename))))
      (append dt (list (cons Code Val)))
      (subst
        (cons Code Val)
        (assoc Code dt)
        dt
      )
    )
  )
  (entmod new)
)
_________________
www.instalacjesanitarne.com
www.profilek.net
 
     
Harry 
Gaszenie gazem ;)

Dołączył: 18 Sty 2012
Posty: 4
Skąd: Wrocław
Wysłany: Pon Sty 23, 12 11:53   

Działa :)
_________________
Pozdrawiam
Rafał Ł.
 
     
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 - mangi
Strona wygenerowana w 0,56 sekundy. Zapytań do SQL: 13