|
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ł Ł. |
|
|
|
 |
|
|