SETBYLAYER i Ctrl+0


Harry

Rekomendowane odpowiedzi

Witam

Po 10 latach pracy na autocadach przesiadłem się na ZwCAD'a.

Ogólnie programik bardzo fajny, mało zasobożerny a przede wszystkim tani.

Jednak w trakcie użytkowania zauważyłem brak 2 dosyć fajnych funkcji:

1) SETBYLAYER (po PL - ustjakwar) - polecenie sprawia, ze wszystkie zaznaczone obiekty zmieniają kolor, rodzaj linii, grubość na parametr jak warstwa. (przydatne, przy tzw. wyszarzeniu rysunków.

2) Ctrl+0 - skrót klawiszowy, który powodował przejście aplikacji w tryb pełnoekranowy z wyłączeniem paska menu (oraz opcjonalnie paska poleceń). Bardzo przydatna funkcja, szczególnie przy mniejszych monitorach (chociaż stosowałem ją często przy 27 calach).

Jeśli ktoś ma rozwiązanie zastępcze na ww. funkcje, będę bardzo wdzięczny za pomoc.

P.s. wersja 2012 PL - 2011.10.30(17176)

Odnośnik do komentarza
Udostępnij na innych stronach

Żadna z tych metod nie jest tak dobra jak oryginalne SETBYLAYER

W oryginale działa to tak że możemy zmienic na "jakwarstwa" w wybranych elementach określone cechy np kolor, grubość itp. Najlepsze jest to że wewnątrz bloków również wszystkie elementy zmieniają się na JAKWARSTWA.

Jest to konieczne jeżeli podczytujemy sobie plik dwg jako Xref i chcemy nadać warstwom tego pliku określone cechy np szary kolor podkładu od architekta. Jeżeli architekt nadał ścianom kolor np czerwony (ścianom a nie warstwie) to u nas w pliku nie da się tego zmienić bez poprawy pliku np poleceniem SETBYLAYER.

Zwcad 2012 ma kilka pochodnych funkcji SETBYLAYER w narzędziach "Express" -> "Block"

Odnośnik do komentarza
Udostępnij na innych stronach

Żadna z tych metod nie jest tak dobra jak oryginalne SETBYLAYER

W oryginale działa to tak że możemy zmienic na "jakwarstwa" w wybranych elementach określone cechy np kolor, grubość itp. Najlepsze jest to że wewnątrz bloków również wszystkie elementy zmieniają się na JAKWARSTWA.

Jest to konieczne jeżeli podczytujemy sobie plik dwg jako Xref i chcemy nadać warstwom tego pliku określone cechy np szary kolor podkładu od architekta. Jeżeli architekt nadał ścianom kolor np czerwony (ścianom a nie warstwie) to u nas w pliku nie da się tego zmienić bez poprawy pliku np poleceniem SETBYLAYER.

Zwcad 2012 ma kilka pochodnych funkcji SETBYLAYER w narzędziach "Express" -> "Block"

Dokładnie.

Jest to bardzo pomocne przy podkładach od architektów, gdyż wielu z nich rysując w programach typu archicad eksportuje do dwg i bardzo dużo elementów jest np. na warstwie "0" a kolory są ustalane dla poszczególnych obiektów a nie dla warstw.

Odnośnik do komentarza
Udostępnij na innych stronach

1) SETBYLAYER (po PL - ustjakwar) - polecenie sprawia, ze wszystkie zaznaczone obiekty zmieniają kolor, rodzaj linii, grubość na parametr jak warstwa. (przydatne, przy tzw. wyszarzeniu rysunków.

Możesz skorzystać z LISP'a.

Drobna modyfikacja pod kątem ZwCADa (źródło jest na cad.pl):

;;; ======================================================================================= ;;;
;;; CADPL-Pack-v1.lsp                                                                       ;;;
;;;                                                                                         ;;;
;;; ======================================================================================= ;;;

; =========================================================================================== ;
; Zmienia cechy obiektu VLA / Sets the property of VLA-Object                                 ;
;  Obj [VLA-Object] - obiekt / object                                                         ;
;  Lst [list] - lista cech par kropkowych / list of dotted pairs properties                   ;
; ------------------------------------------------------------------------------------------- ;
; (cd:ACX_SetProp                                                                             ;
;   (vlax-ename->vla-object (entlast))                                                        ;
;    '(("LineType" . "BLA")("Color" . 1)("Layer" . "0"))                                      ;
; )                                                                                           ;
; =========================================================================================== ;
(defun cd:ACX_SetProp (Obj Lst / a)
 (if (vlax-write-enabled-p Obj)
   (mapcar
     (function
       (lambda (% / %1)
         (cons
           (car %)
         (if (vlax-property-available-p Obj (car %))	; iCAD
            ;(if (vlax-property-available-p Obj (car a) (cdr a)) ; AutoCAD
             (if
               (setq %1
                 (vl-catch-all-apply
                   (quote vlax-put-property)
                   (list Obj (car %) (cdr %))
                 )
               )
               %1
               :vlax-true
		  )
             :vlax-null
           )
         )
       )
     )
     Lst
   )
 )
)
;przykładowe wywołanie (zmiana typu linii, kolor i warstwa) dla jednego wskazanego obiektu:
;(cd:ACX_SetProp (vlax-ename->vla-object (entlast)) '(("LineType" . "Continuous")("Color" . 256)("Layer" . "0")))

; =========================================================================================== ;
(princ "\n------- CADPL-Pack-v1.lsp - http://forum.cad.pl -------")
(princ "\n--------------- Open Source 2011 - 2012 ---------------")
(princ)

Dalej, aby zadziałać na wszystkich wskazanych obiektach:

;;--------------------------------=={ 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))
)
)

(defun c:Test ()
(foreach % (zk:SSZbr->List (ssget))
(cd:ACX_SetProp (vlax-ename->vla-object %) '(("LineType" . "Continuous")("Color" . 256)("Layer" . "0")("Lineweight" . "50")))
))

W przypadku ZwCAD może być konieczność regeneracji widoku obiektów - funkcja "REGEN".

pozdrawiam

Odnośnik do komentarza
Udostępnij na innych stronach

Zmiana samego koloru nie stanowi problemu, lecz gdy chcemy zmienić również inne parametry jak typ linii, szerokość, kolor, materiał, transparentność, styl wydruku (czyli wszystko to co ma w sobie funkcja SETBYLAYER), to już nie jest jedno kliknięcie. A jak chcemy się szybko przełączać między różnymi cechami obiektów, to Lisp umożliwi coś takiego właśnie prostym kliknięciem.

Wszystko można oczywiście ręcznie sobie ustawiać itp. lecz po co, skoro można szybciej? :)

Odnośnik do komentarza
Udostępnij na innych stronach

Zmiana samego koloru nie stanowi problemu, lecz gdy chcemy zmienić również inne parametry jak typ linii, szerokość, kolor, materiał, transparentność, styl wydruku (czyli wszystko to co ma w sobie funkcja SETBYLAYER), to już nie jest jedno kliknięcie. A jak chcemy się szybko przełączać między różnymi cechami obiektów, to Lisp umożliwi coś takiego właśnie prostym kliknięciem.

Wszystko można oczywiście ręcznie sobie ustawiać itp. lecz po co, skoro można szybciej? :)

No to tak jak napisałem wyżej wszystko się wybiera z paska, nie wiem czy się dobrze zrozumieliśmy dlatego wklejam screena:

beztytuudqn.th.jpg

Uploaded with ImageShack.us

Też nie do końca rozumiem wszyskie wyjaśnienia w tym wątku. Pewne jednak jest, że prosta zmiana koloru nie zmieni nam koloru bloków, które nie zostały stworzone z elementami na warstwie JakBlok. Bloki można rozbić, ale wtedy mamy sieczkę na rysunku.
Jezeli chodzi o bloki to sytuacja wygląda identycznie jak w AC, prawym przyciskiem na blik i "Edytuj blok"
Odnośnik do komentarza
Udostępnij na innych stronach

Nie wiem jakie kto ma zapotrzebowania. Osobiście nic nie projektuję, nie rysuję, ani też nie tworzę obiektów na potrzeby ich prezentacji. Działam tylko w zakresie tworzenia kodu według wytycznych, poprawiania istniejącego itp. To czy ktoś potrzebuje wrzucić wszystko na jedną warstwę, kolor itd. to jedno, a do czego tego użyje, to już nie moja sprawa :)

Odnośnik do komentarza
Udostępnij na innych stronach

No to tak jak napisałem wyżej wszystko się wybiera z paska, nie wiem czy się dobrze zrozumieliśmy dlatego wklejam screena (...)

Nie przeczę, że nie da się tego zrobić, co już wcześniej napisałem, ale musisz po pierwsze kliknąć kilka razy, a nie raz, jeśli chcesz zmienić więcej niż jedną cechę (w lisp masz jedno kliknięcie plus ewentualne wskazanie obiektów, choć i to nie jest konieczne).

I tak jak napisałem w ostatnim moim poście - nie interesuje mnie do czego ktoś potrzebuje narzędzie, jeśli tylko jest ono do wykonania w miarę prosty sposób.

Niemniej jednak, autor postu powinien sam zapoznać się z przedstawionymi propozycjami i wybrać najbardziej mu odpowiadającą ;)

pozdrawiam

Odnośnik do komentarza
Udostępnij na innych stronach

Assgarth a dużo to roboty żeby hurtowo lispem pozmieniac definicie blokow na jak warstwa?

Dla jednego bloku:

(cd:ACX_SetProp (vlax-ename->vla-object (car(entsel))) '(("Color" . 256)))

Dla wielu wskazanych bloków:

(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)))
)

Dla wszystkich bloków:

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

pozdrawiam

Odnośnik do komentarza
Udostępnij na innych stronach

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.

Odnośnik do komentarza
Udostępnij na innych stronach

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

Odnośnik do komentarza
Udostępnij na innych stronach

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:

(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

Odnośnik do komentarza
Udostępnij na innych stronach

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

Odnośnik do komentarza
Udostępnij na innych stronach

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.

Odnośnik do komentarza
Udostępnij na innych stronach

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

(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:

;;--------------------------------=={ 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:

(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

Odnośnik do komentarza
Udostępnij na innych stronach

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:

(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")
)

Odnośnik do komentarza
Udostępnij na innych stronach

Pięknie działa (chociaż trochę wolno i inaczej niż w AC).

Po moich poprawkach w funkcji SetByLayer kod wygląda tak:

(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  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                                      ;
; =========================================================================================== ;
(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)
) 

Odnośnik do komentarza
Udostępnij na innych stronach

Gość
Ten temat został zamknięty. Brak możliwości dodania odpowiedzi.