Szablony i skrypty startowe ZWPack


dmatusz3

Rekomendowane odpowiedzi

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

 

Odnośnik do komentarza
Udostępnij na innych stronach

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"

Odnośnik do komentarza
Udostępnij na innych stronach

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

 

 

Edytowane przez perlon
Odnośnik do komentarza
Udostępnij na innych stronach

  • 1 miesiąc temu...

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

 

 

Odnośnik do komentarza
Udostępnij na innych stronach

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

 

Odnośnik do komentarza
Udostępnij na innych stronach

  • 2 tygodnie później...
  • 1 miesiąc temu...
  • dmatusz3 zmienił(a) tytuł na 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

 

 

Odnośnik do komentarza
Udostępnij na innych stronach

  • 3 tygodnie później...

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

Odnośnik do komentarza
Udostępnij na innych stronach

  • 5 miesięcy temu...

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

Odnośnik do komentarza
Udostępnij na innych stronach

Dołącz do dyskusji

Możesz dodać zawartość już teraz a zarejestrować się później. Jeśli posiadasz już konto, zaloguj się aby dodać zawartość za jego pomocą.

Gość
Dodaj odpowiedź do tematu...

×   Wklejono zawartość z formatowaniem.   Usuń formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Odnośnik został automatycznie osadzony.   Przywróć wyświetlanie jako odnośnik

×   Przywrócono poprzednią zawartość.   Wyczyść edytor

×   Nie możesz bezpośrednio wkleić grafiki. Dodaj lub załącz grafiki z adresu URL.

Ładowanie