Aller au contenu

Modifier le paramètres d\'un BLOC DYNAMIQUE


rebcao

Messages recommandés

Bonjour,

 

Existe-t-il une commande STANDARD (CHANGER) ou un LISP, en ligne de commande qui permette de modifier la valeur d'un paramètre d'un BLOC DYNAMIQUE. :(

 

Valeur que l'on peut modifier via la commande PROPRIETES... :P ce que je veux éviter !

 

Merci pour votre aide.

 

Christian

Formateur, Consultant Expert AutoCAD, REVIT MEP, INVENTOR, télécharger , des Outils AutoCAD...

cad123 @ wanadoo.fr (enlever les espaces de part et d'autre de @)

Lien vers le commentaire
Partager sur d’autres sites

Salut,

 

Je ne connais pas de commande native qui fasse ça.

C'est possible en LISP, mais il faut connaitre, par avance ou renseigné par l'utilisateur :

- la ou les références de bloc à traiter

- le nom du paramètre

- la nouvelle valeur pour ce paramètre

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Lien vers le commentaire
Partager sur d’autres sites

Bonjour Gilles,

 

Merci pour ta réponse.

 

Le bloc va changer à chaque fois mais ça on va dire que c'est pas un problème !

 

Le/les paramètres sont toujours de paramètres linéaires de nom :

 

distance1

distance2

 

ce serait quoi la syntaxe qui permet d'accéder aux données étendues d'un tel bloc ?

 

Merci.

 

Christian

Formateur, Consultant Expert AutoCAD, REVIT MEP, INVENTOR, télécharger , des Outils AutoCAD...

cad123 @ wanadoo.fr (enlever les espaces de part et d'autre de @)

Lien vers le commentaire
Partager sur d’autres sites

On accède aux propriétés d'un bloc dynamique avec Visual LISP.

 

La fonction vla-GetDynamicBlockProperties retourne un collection de vla-objets représentant les propriétés dynamiques (cette collection est un 'Safearray' contenu dans un variant).

Chaque propriété dynamique a elle même des propriétés (Name et Value pour ce qui nous intéresse).

 

Je te propose trois petites routines qui facilitent la tache.

 

La première requiert un bloc comme argument (sous forme ENAME ou VLA-OBJECT) et retourne une liste de paire pointées contenant toutes les propriétés dynamiques du bloc sous la forme :

(nom_de_la_propriété . vla-object_propriété)

 

La seconde (qui appelle la première) requiert comme arguments un bloc (ename ou vla-object) et un nom de propriété (sensible à la casse). Elle retourne la valeur de cette propriété.

 

La troisième (qui appelle la première) requiert comme arguments un bloc (ename ou vla-object), un nom de propriété (sensible à la casse) et une valeur pour cette propriété. Elle attribue la nouvelle valeur à la propriété et retourne T si l'opération s'est bien passée.

 

Les deux dernières routines peuvent donc être utilisées en 'pur AutoLISP'.

 

;; gc:GetDynProps
;; Retourne la liste des propriétés dynamiques de la référence de bloc
;; sous forme d'une liste de paires pointées : (nom_propriété . propriété)
;;
;; Argument
;; blk   : le bloc (ename ou vla-object)

(defun gc:GetDynProps (blk / lst)
 (vl-load-com)
 (and (= (type blk) 'ENAME) (setq blk (vlax-ename->vla-object blk)))
 (if
   (and
     (= (vla-get-ObjectName blk) "AcDbBlockReference")
     (= (vla-get-IsDynamicBlock blk) :vlax-true)
   )
   (foreach p (vlax-safearray->list (vlax-variant-value (vla-GetDynamicBlockProperties blk)))
     (setq lst (cons (cons (vla-get-PropertyName p) p) lst))
   )
 )
 (reverse lst)
)

;; gc:GetDynPropValue
;; Retourne la valeur d'une propriété dynamique
;;
;; Arguments
;; blk   : la référence de bloc (ename ou vla-object)
;; name  : le nom de la propriété (sensible à la casse)

(defun gc:GetDynPropValue (blk name / val)
 (vl-load-com)
 (if (setq prop (assoc name (gc:GetDynProps blk)))
   (vlax-variant-value (vla-get-Value (cdr prop)))
 )
)

;; gc:SetDynPropValue
;; Attribue la valeur à une propriété dynamique
;; Retourne T si l'opération a réussi, nil sinon
;;
;; Arguments
;; blk   : la référence de bloc (ename ou vla-object)
;; name  : le nom de la propriété (sensible à la casse)
;; val   : la valeur de la propriété

(defun gc:SetDynPropValue (blk name val / prop)
 (vl-load-com)
 (and (numberp val) (setq val (float val)))
 (if (setq prop (assoc name (gc:GetDynProps blk)))
   (not (vl-catch-all-error-p
   (vl-catch-all-apply 'vla-put-Value (list (cdr prop) val))
 )
   )
 )
)

 

Exemple d'utilisation pour tester :

(gc:SetDynPropValue (car (entsel)) "distance1" 500)

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Lien vers le commentaire
Partager sur d’autres sites

Re,

 

SUPER, ça marche nickel...

 

exactement ce qu'il fallait ! ;)

 

Merci Gilles

 

Christian

 

PS : c'est pas la peine que je te demande de m'envoyer la note ! ;)

 

 

 

 

[Edité le 12/7/2011 par rebcao]

Formateur, Consultant Expert AutoCAD, REVIT MEP, INVENTOR, télécharger , des Outils AutoCAD...

cad123 @ wanadoo.fr (enlever les espaces de part et d'autre de @)

Lien vers le commentaire
Partager sur d’autres sites

  • 7 ans après...

Bonjour,

 

je me permet de commenter ce poste car je pense qu'il correspond aux attentes que j'ai besoins mais je dois avouer que je n'arrive pas a mettre cette routine lisp en application pour mon cas.

 

Voila dans l'idéal, je souhaiterais pouvoir créer un lisp qui me permette d'aller chercher un bloc dynamique dans une bibliothèque et lors de l'insertion de ce bloc, j'aimerais pouvoir définir les paramètres dynamique de mon bloc ( les différentes longueurs ) mais également pouvoir l’insérer avec des coordonnés bien précise ( en X et Y).

 

Voila j'espère que vous allez pouvoir m'aider. je suis preneur de toutes les idées possibles pour arriver ce résultat.

 

Merci

Lien vers le commentaire
Partager sur d’autres sites

Créer un compte ou se connecter pour commenter

Vous devez être membre afin de pouvoir déposer un commentaire

Créer un compte

Créez un compte sur notre communauté. C’est facile !

Créer un nouveau compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.

Connectez-vous maintenant
×
×
  • Créer...

Information importante

Nous avons placé des cookies sur votre appareil pour aider à améliorer ce site. Vous pouvez choisir d’ajuster vos paramètres de cookie, sinon nous supposerons que vous êtes d’accord pour continuer. Politique de confidentialité