Szablony i skrypty startowe ZWPack


dmatusz3

Recommended Posts

Historia LISPów startowych ZWPACK:

 

Poniżej oryginalny post.

==========================================================

Zastanawiam się nad jakie stosujecie ustawienia początkowe przy rysowaniu?

Powszechnie znanym sposobem są szablony, ciekawy jestem czy ktoś stosuje zamiast (lub równolegle) swoje skrypty startowe.

Na przykład listę i właściwości warstw można ustawić zarówno w szablonie jak i utworzyć za pomocą LISPa.

Poniżej zamieszczam właśnie taką procedurę. Obsługa jest bardzo prosta, wystarczy dopisać na końcu

 

(Utworzwarstwe "Nazwa_warstwy" Kolor "Rodzaj_linii")

Oto cały kod

(defun Linetype:Load ( linetype filename / *error* doc path linetypes ans )
	 (defun *error* ( msg / ) 
		 (if (not (null msg ) )	(progn (princ "\nLinetype:Load:*error*: " ) (princ msg ) (princ "\n")	) )
	 )
	 (setq path (findfile filename ))
	 (if (not (null path ) ) (progn
		(setq doc (vla-get-activedocument (vlax-get-acad-object) ))
		( setq linetypes ( vlax-get-property doc 'Linetypes ) )
		
		(setq ans(vl-catch-all-apply 'vlax-invoke-method (list linetypes 'Load typlinii path ) ) ) 
		(print ans )
	 ) )
	nil 
 )

	
 (defun Utworzwarstwe ( nazwa kolor typlinii / *error* doc Warstwy Warstwa linetypes linetype )
	 (defun *error* ( msg / ) 
		 (if (not (null msg ) )	(progn (princ "\nUtworzwarstwe:*error*: " ) (princ msg ) (princ "\n")	) )
	 )
	 (setq doc (vla-get-activedocument (vlax-get-acad-object) ))
	 (setq Warstwy (vlax-get-property doc 'Layers ) )
	 (setq Warstwa (vlax-invoke-method Warstwy 'Add nazwa ) )
	 (vlax-put-property Warstwa 'Color kolor )
	 
	 ( setq linetypes ( vlax-get-property doc 'Linetypes ) )
	 (setq ltype(vl-catch-all-apply 'vlax-get-property (list linetypes 'Item typlinii )))
	 (if (vl-catch-all-error-p ltype ) (progn
		(Linetype:Load typlinii "zwcadiso.lin")
	 )
	 )
	 (setq ans(vl-catch-all-apply 'vlax-put-property (list Warstwa 'Linetype typlinii )))
	 
 )
 
 
 (defun c:lstart (/)
 
	(Utworzwarstwe "Osie" 1 "Center")
	(Utworzwarstwe "Ukryte" 254 "Hidden")
	(Utworzwarstwe "Opisy" 253 "Continuous")
	(Utworzwarstwe "Kreskowanie" 253 "Continuous")
	(Utworzwarstwe "Wymiary" 7 "Continuous")
	
 )

 

Po wczytaniu skryptu będzie dostępne polecenie "lstart", które utworzy warstwy jak poniżej.

lstart_warstwy.png

 

Załączam także sam skrypt LISP.

lstart.lsp

 

Link to comment
Share on other sites

Ja np. używam swój szablon dwt. .... natomiast biblioteki Architecture sukcesywnie przenosze do nastepnego rocznika ...ale jest problem braku konsekwencji twórców Architecture te znaczniki dot. stolarki ...tryb 3D jest ok natomiast tryb 2D nie z powodu węgarków...tak wiec biblioteka 2D budowana od wersji 2012 jest do "kosza"

Link to comment
Share on other sites

Moje rozwiązanie jest zbudowane na potrzeby innych lispów, tak aby mogły się odwoływać do warstw poprzez zmienne. Konkretne nazwy są zapisane w zewnętrznym pliku *.ini. Zaznaczam że kody pochodzą sprzed kilku(nastu) lat i dzisiaj pewnie napisałbym to trochę inaczej, ale lepsze jest wrogiem dobrego ;-).


(defun SetLayers (/ temp systemEnv oHandle xName eObject IniList IniFile)
	(setq systemEnv (cd:ENV_SaveEnvVariable))
	(setvar "cmdecho" 0)
	(setvar "regenmode" 0)
	(setq	*layerKontur*	"kontur"
			*layerOsie*	 	"osie"
			*layerUkryte*	"ukryte"
			*layerOpisy* 	"opisy"
			*layerWymiary*	"wymiary"
			*layerStolarka*	"stolarka"
			*layerCienkie*	"cienkie"
			*layerHatche*	"hatche"
			*layerPrety*	"prety"
			*layerObok* 	"obok"
			*layerRzutnie*	"rzutnie"
			*layer3DModel*	"3D_model"
			IniFile	 	(findfile "dodatki.ini")
	)

	(setq IniList (if (not IniFile) (list) (cd:INI_Read IniFile)))
	(or IniFile (setq IniFile (strcat *cd-ApplicationPath* "dodatki.ini")))
	(setq IniList (add_gr_ini IniList "[Layers]"))

	(if (setq temp (get_ini IniList "[Layers]" "kontur"))
		(setq *layerKontur* temp)
		(setq IniList (set_ini IniList "[Layers]" "kontur" *layerKontur*))
	)
	(if (setq temp (get_ini IniList "[Layers]" "osie"))
		(setq *layerOsie* temp)
		(setq IniList (set_ini IniList "[Layers]" "osie" *layerOsie*))
	)
	(if (setq temp (get_ini IniList "[Layers]" "ukryte"))
		(setq *layerUkryte* temp)
		(setq IniList (set_ini IniList "[Layers]" "ukryte" *layerUkryte*))
	)
	(if (setq temp (get_ini IniList "[Layers]" "opisy"))
		(setq *layerOpisy* temp)
		(setq IniList (set_ini IniList "[Layers]" "opisy" *layerOpisy*))
	)
	(if (setq temp (get_ini IniList "[Layers]" "wymiary"))
		(setq *layerWymiary* temp)
		(setq IniList (set_ini IniList "[Layers]" "wymiary" *layerWymiary*))
	)
	(if (setq temp (get_ini IniList "[Layers]" "stolarka"))
		(setq *layerStolarka* temp)
		(setq IniList (set_ini IniList "[Layers]" "stolarka" *layerStolarka*))
	)
	(if (setq temp (get_ini IniList "[Layers]" "cienkie"))
		(setq *layerCienkie* temp)
		(setq IniList (set_ini IniList "[Layers]" "cienkie" *layerCienkie*))
	)
	(if (setq temp (get_ini IniList "[Layers]" "hatche"))
		(setq *layerHatche* temp)
		(setq IniList (set_ini IniList "[Layers]" "hatche" *layerHatche*))
	)
	(if (setq temp (get_ini IniList "[Layers]" "prety"))
		(setq *layerPrety* temp)
		(setq IniList (set_ini IniList "[Layers]" "prety" *layerPrety*))
	)
	(if (setq temp (get_ini IniList "[Layers]" "obok"))
		(setq *layerObok* temp)
		(setq IniList (set_ini IniList "[Layers]" "obok" *layerObok*))
	)
	(if (setq temp (get_ini IniList "[Layers]" "rzutnie"))
		(setq *layerRzutnie* temp)
		(setq IniList (set_ini IniList "[Layers]" "rzutnie" *layerRzutnie*))
	)
	(if (setq temp (get_ini IniList "[Layers]" "3D_model"))
		(setq *layer3DModel* temp)
		(setq IniList (set_ini IniList "[Layers]" "3D_model" *layer3DModel*))
	)

	(cd:INI_Write IniList IniFile)
	
	(setq xName 
		(cond
			((= *cd-AppType* "ZWCAD") "zwcad.lin")
			(t "acad.lin")
		)
	)

	(cd:ACX_LoadLineType "dashed"  xName)
	(cd:ACX_LoadLineType "dashdot" xName)
	(cd:ACX_LoadLineType "hidden2" xName)
	(cd:ACX_LoadLineType "center2" xName)

	(foreach xName 
		(list	
			(list *layerKontur*		"continuous" 	2 T)
			(list *layerOsie*		"center2" 		1 T)
			(list *layerUkryte*		"hidden2" 		1 T)
			(list *layerOpisy*		"continuous" 	7 T)
			(list *layerWymiary* 	"continuous" 	1 T)
			(list *layerStolarka* 	"continuous" 	3 T)
			(list *layerCienkie*  	"continuous" 	1 T)
			(list *layerHatche*   	"continuous"  254 T)
			(list *layerPrety*		"continuous" 	5 T)
			(list *layerObok*     	"continuous" 	9 T)
			(list *layerRzutnie*  	"continuous"   60 T)
			(list *layer3DModel*   	"continuous"   94 T)
		)
		(setq eObject (cd:ACX_AddLayer (nth 0 xName)))
		(vla-put-linetype eObject (nth 1 xName))
		(vla-put-color eObject (nth 2 xName))
		(vla-put-plottable eObject (nth 3 xName))
	)
	(cd:ENV_RestEnvVariable systemEnv)
)

Jak widać ja wczytuję linie z zwcad.lin ale jest to identyczny plik jak zwcadiso.lin. Nie wiem po co są dublowane. Sam plik ini jest banalny ale wydaje się, że użycie takiego sposobu jest łatwiejsze do użycia dla koleżanek i kolegów w biurze, którzy do LISPA trochę z pazurami podchodzą.

[Layers]
kontur=kontur
osie=osie
ukryte=ukryte
opisy=opisy
wymiary=wymiary
stolarka=stolarka
cienkie=cienkie
hatche=hatche
prety=prety
obok=obok
rzutnie=rzutnie
3D_model=3D_model

Dzięki dmatusz3 za swoje rozwiązanie, bo chyba tym wzorem dorzucę sobie do ini również ustawienie linetype, color etc. Przy okazji, jak widać używam  CADPL-Pack-v1, którego gorąco polecam.

Na koniec jeszcze pokażę reaktora na komendy co zwalnia mnie z pamiętania o zmianach warstw w trakcie rysowania. Jest to z małymi poprawkami do ZwCAD'a kod Andrzeja Gumuły na co jest odpowiedni (c) w kodzie. Zdaje się, że na forum było pokazywane inne rozwiązanie chyba nieco mniej rozwlekłe, ale to mi działa i na razie tego nie zmieniam.

;;;* Funkcje ustanawia reaktor do zmiany warstwy dla wyszczególnionych komend

(defun SetLayInCom (layer commandslist)

  (if (= (getvar "PRODUCT") "ZWCAD")
     (progn
        (vlr-remove-all :VLR-Command-Reactor)
        (vlr-command-reactor                          
           nil
           '((:vlr-commandwillstart . bylayer)
	           (:vlr-commandended . previous)
	           (:vlr-commandcancelled . previous)
	           (:vlr-commandfailed . previous)
            ) 
          )
     )
     (progn
        (if (not globalcommandslist)                    ; zabezpiecza przed ponowną deklaracją reaktora
          (vlr-command-reactor                          ; przy ponownym wczytaniu lisp'a
           nil
           '((:vlr-commandwillstart . bylayer)
	           (:vlr-commandended . previous)
	           (:vlr-commandcancelled . previous)
	           (:vlr-commandfailed . previous)
            ) 
          )
        )
     )
  )
  (mapcar '(lambda (x) (set x nil))
	  '(reactorlayer reactorcolor reactorltype reactorlweight)
  )
  (mapcar '(lambda (x y) (set x y))
	  '(globalcommandslist globallayer)
	  (list commandslist layer)
  )

  (foreach x layer
    (if	(not (tblsearch "LAYER" x))
      (entmake (list '(0 . "LAYER")
		     '(100 . "AcDbSymbolTableRecord")
		     '(100 . "AcDbLayerTableRecord")
		     (cons 2 x)
		     '(70 . 0)
		     '(62 . 7)
		     '(6 . "Continuous")
		     '(370 . -3)
	       )
      )
    )					;end if
  )					;end foreach

  (defun bylayer (idreactor namecommand / komendy licznik)
    (setq licznik 0)
    (foreach komendy globalcommandslist
      (if
	(member	(strcase (car namecommand))
		(mapcar 'strcase komendy)
	)
	 (progn
	   (if (not (and reactorlayer
						reactorcolor
						reactorltype
						reactorlweight
					)
	       )
			(mapcar
				'(lambda (x y) (set x (getvar y)))
				'(reactorlayer reactorcolor reactorltype reactorlweight)
				'("clayer" "cecolor" "celtype" "celweight")
			)
	   )	; end if
	   (mapcar '(lambda (x y) (setvar x y))
		   '("clayer" "cecolor" "celtype" "celweight")
		   (list (nth licznik globallayer) "256" "Bylayer" -1)
	   )
	 )
      )					;end If
      (setq licznik (1+ licznik))
    )					;end foreach
  )					;end ByLayer

  (defun previous (idreactor namecommand / komendy licznik)
    (setq licznik 0)
    (foreach komendy globalcommandslist
      (if
	(member	(strcase (car namecommand))
		(mapcar	'strcase
			komendy
		)
	)
	 (progn
	   (if
	     (and reactorlayer reactorcolor reactorltype reactorlweight)
	      (mapcar '(lambda (x y) (setvar x y))
		      (list "clayer" "cecolor" "celtype" "celweight")
		      (list reactorlayer
			    reactorcolor
			    reactorltype
			    reactorlweight
		      )
	      )
	   )
	   (mapcar
	     '(lambda (x) (set x nil))
	     '(reactorlayer reactorcolor reactorltype reactorlweight)
	   )

	 )
      )
      (setq licznik (1+ licznik))
    )					;end cond
  )					;end Previous
  t
  (prompt "SetLayInCom (C)2003 Andrzej Gumuła.")
  (princ)
)					;end file

Na koniec wywołanie w kodzie startowym i mamy piękny reaktor na dowolne komendy jakie sobie dopiszemy.

	(setlayincom
		(list *layerWymiary* *layerHatche* *layerOsie* *layerCienkie* *layerOpisy*)
		'(
			("DIMLINEAR" "DIMALIGNED" "DIMRADIUS" "DIMDIAMETER" "DIMANGULAR" "DIMORDINATE" "DIMCONTINUE" "DIMBASELINE" "QDIM" "DIMJOGGED" "DIMARC")
			("BHATCH")
			("DIMCENTER")
			("QLEADER")
			("DTEXT" "TEXT")
		)
	)

 

 

Edited by perlon
Link to comment
Share on other sites

  • 1 month later...

Nazbierało się trochę lispów, postanowiłem zebrać je w jednym pliku (można go oczywiście dopasować do swoich potrzeb).

Oto jego zawartość:

  • zmiana koloru tła: polecenia: białe, czarne, szare,
  • przełączenie widoczności polilinii podczas edycji: polecenie zz,
  • obrót UCS o wskazany kąt bez zmiany jego początku: polecenie ucsz,
  • dodawanie i usuwanie wierzchołków polilinii: polcenie apv, rmv,
  • odtworzenie obwiedni kreskowania: polecenie ook (na filmie poniżej)
    odtworzenie_kreskowania.gif

 

Skrypt do pobrania skrypt-startowy.lsp

 

 

Link to comment
Share on other sites

UWAGA. Dokonam zmiany w pierwszym poście, tak aby zawsze zawierał on najnowszy skrypt startowy.

Do skryptu startowego zwpack dodaliśmy możliwość tworzenia warstw z możliwością nadawania grubości, oraz polecenie bb (BBEDIT) edytująca bezpośrednio w edytorze bloków wskazany blok (pokazałem to na filmie poniżej).

skrypt-startowy_v01.lsp

bbedit.gif

 

Link to comment
Share on other sites

  • 2 weeks later...

Cześć!

ja mam problem z osiami symetrii i liniami przerywanymi. Zawsze jest zabawa z ltscale, żeby linia przerywana wyglądała jak przerywana.

Czy możecie zrobić skrypt żeby zaznaczyć okno obejmujące rysunek i żeby ltscale dopasowała się do tego okna?

 

Link to comment
Share on other sites

  • 1 month later...
  • dmatusz3 changed the title to Szablony i skrypty startowe ZWPack

Utworzyliśmy dla tego lispa paletę narzędzi oraz dodaliśmy jedno nowe polecenie.

Palet wygląda tak:

zw_pack.png

natomiast nowe polecenie w palecie zaznacza ostatnio wybrany zbiór obiektów. Pokazałem to na filmie.

wybranie_poprzedniego_zbirou_wskazan.gif

 

Pliki do pobrania:  ZWPack_2018.02.zip

Opis instalacji:

  1. Pobrany plik należy rozpakować na dysku
  2. Z rozpakowanego katalogu importujemy paletę narzędzi klikając PPM w palecie 
    dostosuj_palete_cad.png

    import_palety.png
     
  3. Wskazujemy plik ZWPack.xml 
  4. Powinna się pojawić paleta oraz ikony.
  5. Wczytujemy LISP, który znajduje się w rozpakowanym katalogu
    wczytaj_aplikacje.png
     
  6. Dodajmy wybrany LISP do listy startowej, aby po każdym uruchomieniu ZWCADa skrypt został wczytany.

    dodanie_do_listy_startowej.png

 

 

Link to comment
Share on other sites

  • 3 weeks later...

Odnośnie UCSZ - tak z ciekawostek

Brakowało mi czegoś :) a mianowicie automatycznemu dostosowaniu planu do zmienionego układu.

Pod koniec lispa po wierszu 

Cytuj

(command "_UCS" "_Z" (rtos (r2d ang ) ) )

dodałem  linię

Cytuj

(command "_PLAN" "A") 

i nawet działa :biggrin:ucsz v2.flv

Do osób znających się na kodzie lepiej ode mnie: Prośba o sprawdzenie i ewentualnie modyfikację co tam trzeba :) 

Jeszcze przydałby się skrót powrotu do globalnych układów :) 

Link to comment
Share on other sites

  • 5 months later...

mi nadal brakuje możliwości rysowania w trybie "orto" widoku ale w układzie współrzędnych globalnych.. Innymi słowy Brakuje mi obracania widoku ale bez obrotu UCS.

Ponadto taki drobiazg, przy wywoływaniu comm PLAN aktualny widok powraca do widoku "all" a nie ostatniego powiększenia (lub pomniejszenia).. wygodniej było by gdyby był zakres ostatniego widoku. Dla dużych rysunków takie "kręcenie" widokiem z "all" powiększeniem jest uciążliwe.. Taki roboczy obrót widoku jest doskonałym narzędziem do trasowania na planie różnych rzeczy równolegle czy prostopadle do pewnych obiektów..

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...