Zobrazit plnou verzi příspěvku: dynamický blok a lisp

chlebovsky
10.09.2007, 11:25
Zdravím všechny.
Lze nějak pomoci lispu pracovat s dynamickým blokem, např s viditelností, upravovat a číst jaká je, otočení, délka... i další parametry....
 
Lze to nějak jednoduše ovládat a zjišťovat aktuální nastavení ???
 
Nemyslím základní parametry bloku, ale jeho dynamičnost... asi reaktory...
 
Dík moc předem Martin.

PepaR
10.09.2007, 16:54
Snad by mohlo pomoci následující fórum: http://discussion.autodesk.com/search.jspa?numResults=25&inputEntered=true&source=thread-threaded%7C154&q=lisp&objID=f154

Vladimír Michl
10.09.2007, 19:40
Zde jsou užitečné funkce pro práci s dynamickými bloky z VLISPu (upraveno z diskusní skupiny):
[CODE]
;;Dynamic block functions - Allen Johnson;;;;------------------------------------------------- ---------------------; shows what variables there are in your block(defun c:tdb ()(setq obj (vlax-ename->vla-object (car (entsel))))(if (= (vlax-get-property obj 'isdynamicblock) :vlax-true)(progn(setq v (vla-getdynamicblockproperties obj))(setq vval (vlax-variant-value v))(setq sal (vlax-safearray->list vval))(setq salnth (length sal))(setq count 0)(while (/= count salnth)(vlax-dump-object (nth count sal))(setq count (+ count 1))))(print "Not a dynamic block"))(setq count nil)(princ))
;;;;----------------------------------------------- -----------------------;; changes a given variable in your block
(defun chgdynprop (e propname newval / obj v vval sal tot i)
(setq obj (if (= (type e) 'vla-object) e (vlax-ename->vla-object e)))(if (= (vlax-get-property obj 'isdynamicblock) :vlax-true)(progn(setq v (vla-getdynamicblockproperties obj)vval (vlax-variant-value v)sal (vlax-safearray->list vval)tot (length sal)i 0)(while (< i tot)(if (= (vlax-get-property (nth i sal) "PropertyName") propname)(progn(vlax-put-property (nth i sal) "Value" newval)(setq i tot))(setq i (1+ i)))))))
;;;;--------------------------------------------------------- -------------;; reads a given variable in your block
(defun getdynprop (e propname / obj v vval sal tot i curval)(setq obj (if (= (type e) 'vla-object) e (vlax-ename->vla-object e)))(if (= (vlax-get-property obj 'isdynamicblock) :vlax-true)(progn(setq v (vla-getdynamicblockproperties obj)vval (vlax-variant-value v)sal (vlax-safearray->list vval)tot (length sal)i 0)(while (< i tot)(if (= (vlax-get-property (nth i sal) "PropertyName") propname)(progn (setq curval (vlax-get-property (nth i sal) "Value")) (setq i tot))(setq i (1+ i))))))(if curval (vlax-variant-value curval)))
 
;;;;------------------------------------------ ----------------------------;; returns a selection set of blocks with the same effectivename;; example use:;; (setq dbselset (ssdblk "MyDynBlockName"));;
(defun ssdblk (effname / ssx ssf c en)
(setq ssx (ssget "_X" (list (cons 2 (strcat effname ",`*U*")))))(setq ssf (ssadd)c 0)(if ssx(repeat (sslength ssx)(setq en (ssname ssx c)c (1+ c))(if (= (print (vla-get-effectivename (vlax-ename->vla-object en))) effname)(ssadd en ssf))))ssf)
;;;;--------------------------------------------------- -------------------;;;; find dynamick blocks;; a command line function to select all dynamic blocks;; with the same "effectivename"
(defun c:fdb (/ en obj effname)(setq en (car (entsel)))(if en(progn (setq obj (vlax-ename->vla-object en))(if (vlax-property-available-p obj 'effectivename)(progn (setq effname (vlax-get-property obj "effectivename"))(command "_Select" (ssdblk effname)))(prompt "\nNot a block.\n"))))(princ))
;;;;--------------------------------------------------- -------------------;;  
;sample - set/change visibility:;;(command "_-Insert" shapename ipt 1 1 0);(setq obj (entlast));(chgdynprop obj "BeamSizes" "Beam99");(entupd obj);;where "BeamSizes" is the name of a visibility state and "Beam99" one of the visibility state names[/CODE]

chlebovsky
11.09.2007, 09:47
Chlapy, dík moc.
Obrovská pomoc, naprosto vyčerpávající odpovědi. Mám přesně co jsem potřeboval, díky díky díky.
 
Martin.

DRACON
21.09.2007, 09:59
Pěkný, ale zasek jsem se na chgdynprop

(vlax-get-property (nth i sal) "Value") mi vrací #<variant 2 0>

ale #<variant 2 1> do (vlax-put-property (nth i sal) "Value" newval) nemůžu dostat
- prostě nevím co je zač to #< .. > a jak to do newval dostat

poraďte prosím !

chlebovsky
24.09.2007, 14:57
mě to funguje bezvadně, jestli není problém ve vstupních parametrech :
jsou tři :
e               = jméno entity bloku, napr (car (entsel))propname = jméno parametru (dle bloku)
newval      = nová hodnota parametru
například dyn blok bude mít parametr viditelnosti s označením KONEC a bude mít jako by tři typy viditelností - SROUB/VRUT/TYCOVINA
pak propname = "KONEC" a newval = "SROUB"
 
a spoustí se to pak :
(chgdynprop ((car (entsel)) "KONEC" "SROUB")
pozor blok musí mít parametr daného jména a danou hodnotu 

DRACON
24.09.2007, 16:08
Děkuji za pomoc - sice to nebylo ono, ale vyburcovalo mě to k lepšímu popisu toho co řeším
a výsledkem bylo řešení :)

jednalo se mi o ovládnutí překlápění d.bloku LISPem.
Novou hodnotu newval pro chgdynprop,
kterou jsem potřeboval ve tvaru #<variant 2 1>,
je třeba vytvořit příkazem (vlax-make-var value type)

Přiložený prográmek "překlápí" d.blok tam a zpět.
Pro výpočet stavu překlopení (stav 0 nebo 1) je použita poněkud matoucí finta zbytku po dělení dvěma původního stavu po přičtení jedničky
(zbytek (1+1)/2)=0 , (zbytek (0+1)/2)=1

(defun c:kuku ( / obj a )
(vl-load-com)
(setq obj (car (entsel)))
(setq a (getdynprop obj "Stav překlopení1"))
(chgdynprop obj "Stav překlopení1" (vlax-make-variant (rem (1+ a) 2) vlax-vbInteger))
)