Autore |
Discussione  |
|
cantacad
Utente Master
662 Messaggi |
Inserito il - 08 agosto 2014 : 12:23:28
|
Sto utilizzando una serie di blocchi dinamici che ho realizzato per velocizzare la bozza della dotazione impiantistica di un edificio...effettivamente sono molto molto comodi, però hanno un limite che non riesco ad ovviare, cioè la gestione del parametro di visibilità. 1) sarebbe molto comodo se lo stesso fosse visto come una proprietà in modo che quando passo la proprietà (_matchprop) da un blocco dinamico ad un altro gli trasmetto anche la visibilità che desidero (questo aspetto potrebbe avere i suoi pro e contro ma spererei ci fosse un modo veloce per dire "tu tu e tu siete come quello la") 2) sarebbe bello che tramite il comando "selectsimilar" si potessero selezionare "tutti i blocchi con lo stesso parametro di visibilità". ho già dei lisp per la selezione di blocchi simili e vorrei provare a modificarne uno... se per identificare il nome del blocco si usa una formula magica che ha a che fare con "vla-get-EffectiveName obj" qual'è la formula magica che acquisisce il nome del parametro di visibilità?
Saluti
|
|
arri
Utente Master
Regione: Lombardia
14951 Messaggi |
Inserito il - 08 agosto 2014 : 12:27:30
|
qui ci vogliono gli esperti il cui nick inizia con G, T, J
 |
 |
|
cantacad
Utente Master
662 Messaggi |
Inserito il - 08 agosto 2014 : 14:56:55
|
racconto una piccola disavventura con i blocchi dinamici...a disegno finito mi sono inventato di aggiungere all'interno del parametro di visibilità un ulteriore stato di visibilità e fin qui tutto ok, non ho fatto danni...sono andato poi a rinominare alcuni degli stati di visibilità e qui invece il patatrak! al ritorno dall'editor blocchi, tutti blocchi dinamici che avevano uno stato di visibilità rinominato si sono disimpostati e si sono settati sul primo stato del blocco... |
 |
|
GP
Utente Master
Regione: Piemonte
Prov.: Vercelli
2778 Messaggi |
Inserito il - 08 agosto 2014 : 15:17:21
|
Allega un blocco. |
 |
|
GP
Utente Master
Regione: Piemonte
Prov.: Vercelli
2778 Messaggi |
Inserito il - 08 agosto 2014 : 16:06:55
|
Il tempo che ho a disposizione è per un solo quesito (mi piace di più il primo), realizzato velocemente grazie alle funzioni di Lee Mac http://lee-mac.com/dynamicblockfunctions.html
Ho provato su alcuni miei blocchi, spero possa funzionare con tutti gli altri.
; MatchPropVisibility
; Imposta il valore del parametro visibilità del blocco sorgente
; ai blocchi di destinazione, se hanno lo stesso nome
; 08/08/2014
(defun c:mpv ( / blk blks nomevis vis1 blk1 nb)
(vl-load-com)
(vla-startundomark (vla-get-activedocument (vlax-get-acad-object)))
(if (and
(princ "\nSelezionare il Blocco sorgente")
(setq blk (vlax-ename->vla-object (car (entsel))))
(setq nb (vla-get-effectivename blk))
(princ "\nSelezionare i Blocchi di destinazione")
(setq blks (ssget '((0 . "INSERT"))))
(= (vlax-get-property blk 'isdynamicblock) :vlax-true)
)
(if (setq nomevis (LM:getvisibilityparametername blk))
(progn
(setq vis1 (LM:getdynpropvalue blk nomevis))
(repeat (setq n (sslength blks))
(setq blk1 (vlax-ename->vla-object (ssname blks (setq n (1- n)))))
(if (eq nb (vla-get-effectivename blk1))
(LM:SetVisibilityState blk1 vis1)
)
)
)
)
)
(vla-endundomark (vla-get-activedocument (vlax-get-acad-object)))
)
;; Get Visibility Parameter Name - Lee Mac
;; Returns the name of the Visibility Parameter of a Dynamic Block (if present)
;; blk - [vla] VLA Dynamic Block Reference object
;; Returns: [str] Name of Visibility Parameter, else nil
(defun LM:getvisibilityparametername ( blk / vis )
(if
(and
(vlax-property-available-p blk 'effectivename)
(setq blk
(vla-item
(vla-get-blocks (vla-get-document blk))
(vla-get-effectivename blk)
)
)
(= :vlax-true (vla-get-isdynamicblock blk))
(= :vlax-true (vla-get-hasextensiondictionary blk))
(setq vis
(vl-some
'(lambda ( pair )
(if
(and
(= 360 (car pair))
(= "BLOCKVISIBILITYPARAMETER" (cdr (assoc 0 (entget (cdr pair)))))
)
(cdr pair)
)
)
(dictsearch
(vlax-vla-object->ename (vla-getextensiondictionary blk))
"ACAD_ENHANCEDBLOCK"
)
)
)
)
(cdr (assoc 301 (entget vis)))
)
)
;; Get Dynamic Block Property Value - Lee Mac
;; Returns the value of a Dynamic Block property (if present)
;; blk - [vla] VLA Dynamic Block Reference object
;; prp - [str] Dynamic Block property name (case-insensitive)
(defun LM:getdynpropvalue ( blk prp )
(setq prp (strcase prp))
(vl-some '(lambda ( x ) (if (= prp (strcase (vla-get-propertyname x))) (vlax-get x 'value)))
(vlax-invoke blk 'getdynamicblockproperties)
)
)
;; Set Dynamic Block Visibility State - Lee Mac
;; Sets the Visibility Parameter of a Dynamic Block (if present) to a specific value (if allowed)
;; blk - [vla] VLA Dynamic Block Reference object
;; val - [str] Visibility State Parameter value
;; Returns: [str] New value of Visibility Parameter, else nil
(defun LM:SetVisibilityState ( blk val / vis )
(if
(and
(setq vis (LM:getvisibilityparametername blk))
(member (strcase val) (mapcar 'strcase (LM:getdynpropallowedvalues blk vis)))
)
(LM:setdynpropvalue blk vis val)
)
)
;; Get Dynamic Block Property Allowed Values - Lee Mac
;; Returns the allowed values for a specific Dynamic Block property.
;; blk - [vla] VLA Dynamic Block Reference object
;; prp - [str] Dynamic Block property name (case-insensitive)
;; Returns: [lst] List of allowed values for property, else nil if no restrictions
(defun LM:getdynpropallowedvalues ( blk prp )
(setq prp (strcase prp))
(vl-some '(lambda ( x ) (if (= prp (strcase (vla-get-propertyname x))) (vlax-get x 'allowedvalues)))
(vlax-invoke blk 'getdynamicblockproperties)
)
)
;; Set Dynamic Block Property Value - Lee Mac
;; Modifies the value of a Dynamic Block property (if present)
;; blk - [vla] VLA Dynamic Block Reference object
;; prp - [str] Dynamic Block property name (case-insensitive)
;; val - [any] New value for property
;; Returns: [any] New value if successful, else nil
(defun LM:setdynpropvalue ( blk prp val )
(setq prp (strcase prp))
(vl-some
'(lambda ( x )
(if (= prp (strcase (vla-get-propertyname x)))
(progn
(vla-put-value x (vlax-make-variant val (vlax-variant-type (vla-get-value x))))
(cond (val) (t))
)
)
)
(vlax-invoke blk 'getdynamicblockproperties)
)
)
|
Modificato da - GP in data 08 agosto 2014 16:10:33 |
 |
|
cantacad
Utente Master
662 Messaggi |
Inserito il - 09 agosto 2014 : 10:22:54
|
Per chi vuole provare su un blocco dinamico...
https://www.dropbox.com/s/cyo4s5p2ro6pkey/blocchi%20dinamici%20vari%20prova.zip
faccio notare che il parametro di visibilità si può modificare contemporaneamente dalla finestra proprietà, ad un gruppo di oggetti selezionati (ecco un altro buon motivo per tenerla sempre aperta!)...cmq con il lisp postato si fa prima, grazie! |
 |
|
cantacad
Utente Master
662 Messaggi |
Inserito il - 18 agosto 2014 : 16:46:53
|
Salve, purtroppo nemmeno tra i filtri ho trovato qualcosa che mi permetta di selezionare rapidamente tutti i blocchi con nome X e parametro di visibilità Y presenti in un disegno (con lo scopo di modificare/computare)...ho visitato la pagina di Lee Mac indicata da GP e ho individuato una funzione che potrebbe fare al caso mio, mi sembra si parli di "acquisire lo stato di visibilità"
;; Get Dynamic Block Visibility State - Lee Mac ;; Returns the value of the Visibility Parameter of a Dynamic Block (if present) ;; blk - [vla] VLA Dynamic Block Reference object ;; Returns: [str] Value of Visibility Parameter, else nil
(defun LM:getvisibilitystate ( blk ) (LM:getdynpropvalue blk (LM:getvisibilityparametername blk)) )
Mi sembra di capire che la parte che mi serve è "getvisibilitystate"...ma come o uso?...volendo provare a modificare un vecchio lisp di Terminator che data un'area, seleziona tutti i blocchi con lo stesso nome, dovrei farlo diventare un lisp che data un'area, seleziona tutti i blocchi con lo stesso nome E con lo stesso parametro di visibilità (facciamo pure finta che io so di doverlo usare solo sui blocchi dinamici così da poter evitare eventuali sequenze per il controllo del blocco selezionato)
(defun C:SELBLOS (/ obj nomeblocco ssets gruppo fcode fvalue newsset) (vl-load-com) (vla-GetEntity (vla-get-Utility (vla-get-activedocument (vlax-get-acad-object))) 'obj nil "\nSelezionare blocco: ") (setq nomeblocco (vla-get-EffectiveName obj) ssets (vla-get-Selectionsets (vla-get-activedocument (vlax-get-acad-object))) gruppo (ssadd) ) (if (vl-catch-all-error-p (vl-catch-all-apply 'vla-item (list ssets "Selezione1")) ) (setq newsset (vla-add ssets "Selezione1")) (progn (vla-delete (vla-item ssets "Selezione1")) (setq newsset (vla-add ssets "Selezione1")) ) ) (setq fcode (vlax-make-safearray vlax-vbinteger '(0 . 0)) fvalue (vlax-make-safearray vlax-vbvariant '(0 . 0)) ) (vlax-safearray-fill fcode '(0)) (vlax-safearray-fill fvalue '("INSERT")) (vla-SelectOnScreen newsset fcode fvalue) (vlax-map-collection newsset '(lambda (elemento) (if (equal (vla-get-EffectiveName elemento) nomeblocco) (progn (vla-highlight elemento :vlax-true) (ssadd (vlax-vla-object->ename elemento) gruppo) ) ) ) ) (command "_SELECT" gruppo "") (sssetfirst nil gruppo) (princ) )
(princ "\nSELBLOS (vers.1) - by Terminator") (princ "\nDigitare SELBLOS per far partire il lisp")
basterebbe nella riga dove si setta la variabile nomeblocco (setq nomeblocco (vla-get-EffectiveName obj) inserire anche le condizioni sopra esposte che acquisiscono il nome del parametro di visibilità?
Ringrazio anticipatamente per eventuali indicazioni. Saluti
|
 |
|
arri
Utente Master
Regione: Lombardia
14951 Messaggi |
Inserito il - 21 agosto 2014 : 07:26:34
|
Messaggio inserito da cantacad
Salve, purtroppo nemmeno tra i filtri ho trovato qualcosa che mi permetta di selezionare rapidamente tutti i blocchi con nome X e parametro di visibilità Y presenti in un disegno (con lo scopo di modificare/computare)...ho visitato la pagina di Lee Mac indicata da GP e ho individuato una funzione che potrebbe fare al caso mio, mi sembra si parli di "acquisire lo stato di visibilità"
;; Get Dynamic Block Visibility State - Lee Mac ;; Returns the value of the Visibility Parameter of a Dynamic Block (if present) ;; blk - [vla] VLA Dynamic Block Reference object ;; Returns: [str] Value of Visibility Parameter, else nil
(defun LM:getvisibilitystate ( blk ) (LM:getdynpropvalue blk (LM:getvisibilityparametername blk)) )
Mi sembra di capire che la parte che mi serve è "getvisibilitystate"...ma come o uso?...volendo provare a modificare un vecchio lisp di Terminator che data un'area, seleziona tutti i blocchi con lo stesso nome, dovrei farlo diventare un lisp che data un'area, seleziona tutti i blocchi con lo stesso nome E con lo stesso parametro di visibilità (facciamo pure finta che io so di doverlo usare solo sui blocchi dinamici così da poter evitare eventuali sequenze per il controllo del blocco selezionato)
(defun C:SELBLOS (/ obj nomeblocco ssets gruppo fcode fvalue newsset) (vl-load-com) (vla-GetEntity (vla-get-Utility (vla-get-activedocument (vlax-get-acad-object))) 'obj nil "\nSelezionare blocco: ") (setq nomeblocco (vla-get-EffectiveName obj) ssets (vla-get-Selectionsets (vla-get-activedocument (vlax-get-acad-object))) gruppo (ssadd) ) (if (vl-catch-all-error-p (vl-catch-all-apply 'vla-item (list ssets "Selezione1")) ) (setq newsset (vla-add ssets "Selezione1")) (progn (vla-delete (vla-item ssets "Selezione1")) (setq newsset (vla-add ssets "Selezione1")) ) ) (setq fcode (vlax-make-safearray vlax-vbinteger '(0 . 0)) fvalue (vlax-make-safearray vlax-vbvariant '(0 . 0)) ) (vlax-safearray-fill fcode '(0)) (vlax-safearray-fill fvalue '("INSERT")) (vla-SelectOnScreen newsset fcode fvalue) (vlax-map-collection newsset '(lambda (elemento) (if (equal (vla-get-EffectiveName elemento) nomeblocco) (progn (vla-highlight elemento :vlax-true) (ssadd (vlax-vla-object->ename elemento) gruppo) ) ) ) ) (command "_SELECT" gruppo "") (sssetfirst nil gruppo) (princ) )
(princ "\nSELBLOS (vers.1) - by Terminator") (princ "\nDigitare SELBLOS per far partire il lisp")
basterebbe nella riga dove si setta la variabile nomeblocco (setq nomeblocco (vla-get-EffectiveName obj) inserire anche le condizioni sopra esposte che acquisiscono il nome del parametro di visibilità?
Ringrazio anticipatamente per eventuali indicazioni. Saluti
devi aspettare che tornino dalle ferie gli esperti il cui nickname inizia con G - T - J |
 |
|
arri
Utente Master
Regione: Lombardia
14951 Messaggi |
|
cantacad
Utente Master
662 Messaggi |
|
arri
Utente Master
Regione: Lombardia
14951 Messaggi |
|
|
Discussione  |
|