TuttoCAD Forum

TuttoCAD Forum
[ Home | Registrati | Discussioni Attive | Discussioni Recenti | Segnalibro | Msg privati | Sondaggi Attivi | Utenti | Album Fotografico | Download | | Cerca | FAQ ]
Nome Utente:
Password:
Salva Password
Password Dimenticata?

 Tutti i Forum
 1 - TuttoCAD Software
 AutoCAD
 Blocchi dinamici e parametro di visibilità
 Nuova Discussione  Rispondi
 Versione Stampabile Bookmark this Topic Aggiungi Segnalibro
I seguenti utenti stanno leggendo questo Forum Qui c'è:
Autore Discussione Precedente Discussione Discussione Successiva  

cantacad
Utente Master



662 Messaggi

Inserito il - 08 agosto 2014 : 12:23:28  Mostra Profilo Invia a cantacad un Messaggio Privato  Rispondi Quotando
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  Mostra Profilo Invia a arri un Messaggio Privato  Rispondi Quotando
qui ci vogliono gli esperti il cui nick inizia con G, T, J
Torna all'inizio della Pagina

cantacad
Utente Master



662 Messaggi

Inserito il - 08 agosto 2014 : 14:56:55  Mostra Profilo Invia a cantacad un Messaggio Privato  Rispondi Quotando
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...
Torna all'inizio della Pagina

GP
Utente Master


Regione: Piemonte
Prov.: Vercelli


2778 Messaggi

Inserito il - 08 agosto 2014 : 15:17:21  Mostra Profilo Invia a GP un Messaggio Privato  Rispondi Quotando
Allega un blocco.
Torna all'inizio della Pagina

GP
Utente Master


Regione: Piemonte
Prov.: Vercelli


2778 Messaggi

Inserito il - 08 agosto 2014 : 16:06:55  Mostra Profilo Invia a GP un Messaggio Privato  Rispondi Quotando
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
Torna all'inizio della Pagina

cantacad
Utente Master



662 Messaggi

Inserito il - 09 agosto 2014 : 10:22:54  Mostra Profilo Invia a cantacad un Messaggio Privato  Rispondi Quotando
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!
Torna all'inizio della Pagina

cantacad
Utente Master



662 Messaggi

Inserito il - 18 agosto 2014 : 16:46:53  Mostra Profilo Invia a cantacad un Messaggio Privato  Rispondi Quotando
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





Torna all'inizio della Pagina

arri
Utente Master


Regione: Lombardia


14951 Messaggi

Inserito il - 21 agosto 2014 : 07:26:34  Mostra Profilo Invia a arri un Messaggio Privato  Rispondi Quotando
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
Torna all'inizio della Pagina

arri
Utente Master


Regione: Lombardia


14951 Messaggi

Inserito il - 27 agosto 2014 : 13:02:48  Mostra Profilo Invia a arri un Messaggio Privato  Rispondi Quotando
Messaggio inserito da cantacad
Ringrazio anticipatamente per eventuali indicazioni.
Saluti


mi ricordavo di averlo segnalato,
ma non riuscivo più a trovarlo,

è proprio quello che ti serve

SelDB - select dynamic blocks by dynamic properties

http://www.cadforum.cz/cadforum_en/select-dynamic-blocks-by-dynamic-properties-tip7583
Torna all'inizio della Pagina

cantacad
Utente Master



662 Messaggi

Inserito il - 28 agosto 2014 : 12:22:42  Mostra Profilo Invia a cantacad un Messaggio Privato  Rispondi Quotando
trovato per la computazione! (forse arri l'avevi già segnalato? avevo memorizzato il link in "pagine da guardare"

http://www.cadforum.cz/cadforum_en/select-dynamic-blocks-by-dynamic-properties-tip7583

saluti
Torna all'inizio della Pagina

arri
Utente Master


Regione: Lombardia


14951 Messaggi

Inserito il - 28 agosto 2014 : 12:48:04  Mostra Profilo Invia a arri un Messaggio Privato  Rispondi Quotando
Messaggio inserito da cantacad
forse arri l'avevi già segnalato?


sì, 4 anni fa, nel 2010

http://www.cadlandia.com/topic.asp?TOPIC_ID=6324&whichpage=12
Torna all'inizio della Pagina
  Discussione Precedente Discussione Discussione Successiva  
 Nuova Discussione  Rispondi
 Versione Stampabile Bookmark this Topic Aggiungi Segnalibro
Vai a:
TuttoCAD Forum © 2001-2010 CADLandia Torna all'inizio della Pagina
Pagina generata in 0,94 secondi.