Aller au contenu

Modifier un bloc dynamique en fonction de son attribut


lolobala

Messages recommandés

Bonjour à tous.

 

J'utilise actuellement l'excellent ixl de Patrick 35, ce lisp me permet d'insérer des blocs avec attribut à des positions précise, les coordonnées sont calculées en fonction d'un tableau excel.

Je souhaiterai aujourd'hui insérer un bloc dynamique et faire varier sa longueur en fonction de son attribut longueur.

Le bloc dynamique est muni, de paramètre d'étirement et aussi paramètre de visibilité que je souhaite également gérer.

 

Est-ce que cela est possible ? Peut être en utilisant les expressions de champ ?

 

Je pensais également à pline_block de gile, peut être en combinant les 2 ?

 

Quelqu'un peut-il me mettre sur la voie, je suis à cour d'idée.

 

Merci à vous

 

Lien vers le commentaire
Partager sur d’autres sites

Salut,

 

Décidément, tu as toujours besoin de LISP très spécifiques, il serait temps d'apprendre à les écrire...

 

Je te propose un petit truc basé sur des routines généralistes.

Pour ton cas il faudra que tu remplaces :

("ETIQUETTE_1" . "NomProprieteDyn_1")
("ETIQUETTE_2" . "NomProprieteDyn_2")

par les vrais noms des étiquettes d'attributs et de propriétés dynamiques correspondantes en respectant la casse avec autant de paires que nécessaire.

 

;; gc:GetDynProps
;; Retourne la liste des propriétés dynamiques de la référence de bloc
;; sous la forme d'une liste de paire pointées (PropertyName . DynamicBlockProperty)
;;
;; Argument
;; bref : référence de bloc (vla-object)
(defun gc:GetDynProps (bref / lst)
 (foreach p (vlax-invoke bref 'getDynamicBlockProperties)
   (setq lst (cons (cons (vla-get-PropertyName p) p) lst))
 )
 (reverse lst)
)

;; gc:GetAttributes
;; Retourne la liste des attributs de la référence de bloc
;; sous la forme d'une liste de paire pointées (TagString . AttributeReference)
;;
;; Argument
;; bref : référence de bloc (vla-object)
(defun gc:GetAttributes	(bref / lst)
 (foreach att (vlax-invoke bref 'GetAttributes)
   (setq lst (cons (cons (vla-get-TagString att) att) lst))
 )
 (reverse lst)
)

;; gc:AttToDynProp
;; Attribut à chaque propriété dynamique de la liste la valeur de l'attribut correspondante
;;
;; Arguments
;; bref : référence de bloc (vla-object)
;; lst : une liste de paires pointées (TagString . PropertyName)
(defun gc:AttToDynProp (bref lst / atts props att prop)
 (setq	atts  (gc:GetAttributes bref)
props (gc:GetDynProps bref)
 )
 (foreach p lst
   (if
     (and
(setq att (assoc (car p) atts))
(setq prop (assoc (cdr p) props))
     )
      (vl-catch-all-apply
 '(lambda (/ typ)
    (setq typ (vlax-variant-type (vla-get-Value (cdr prop))))
    (cond
      ((< 1 typ 4)
       (vla-put-Value (cdr prop) (atoi (vla-get-TextString (cdr att))))
      )
      ((< 3 typ 6)
       (vla-put-Value (cdr prop) (atof (vla-get-TextString (cdr att))))
      )
      ((= 8 typ)
       (vla-put-Value (cdr prop) (vla-get-TextString (cdr att)))
      )
    )
  )
      )
   )
 )
)

(defun c:test (/ lst ss)
 (vl-load-com)
 (or *acad* (setq *acad* (vlax-get-acad-object)))
 (or *acdoc* (setq *acdoc* (vla-get-ActiveDocument *acad*)))

 (setq	lst '(
      ("ETIQUETTE_1" . "NomProprieteDyn_1")
      ("ETIQUETTE_2" . "NomProprieteDyn_2")
     )
 )

 
 (if (ssget '((0 . "INSERT") (66 . 1)))
   (progn
     (vlax-for	bref (setq ss (vla-get-ActiveSelectionSet *acdoc*))
(gc:AttToDynProp bref lst)
     )
     (vla-Delete ss)
   )
 )
 (princ)
)

Gilles Chanteau - gileCAD -
Développements sur mesure pour AutoCAD
ADSK_Expert_Elite_Icon_S_Color_Blk_125.png

Lien vers le commentaire
Partager sur d’autres sites

Bonjour Gile

 

Il est vrai que ma demande est assez spécifique, mais suis-je vraiment le seul à vouloir ce genre d'outil ?

Je serai étonné de voire que personne n'utilise les blocs dynamiques, les attributs, le lisp et excel pour pouvoir tirer un maximum d'autocad.

J'ai parcouru le forum entier, et même d'autre site pour voir s'il y avait un élément de réponse sur ce sujet.

Le sujet à été abordé mais sans suite. J'ai trouvé sur cad xp, les champs dynamique et ton lisp de pline_block mais à priori je faisais déjà fausse route. Puisque tu me propose un petit truc complètement différent.

 

 

il serait temps d'apprendre à les écrire...
sache que j'ai commencé récemment mais mon manque de temps fait que je ne suis pas à la hauteur. Désolé.

 

J'ai testé ce que tu m'as donné, mais quelque chose ne fonctionne pas. Peut être que je m'y prend mal ?

Lorsque je lance ton outil, autocad me demande de choisir l'objet. Je sélectionne mon bloc dynamique mais autocad me renvoi 0 trouvé. J'ai bien remplacé par les vrais noms d'étiquettes mais il y a un soucis, je pense.

 

Merci.

Lien vers le commentaire
Partager sur d’autres sites

Bonjour à toutes et tous,

 

les vrais noms d'étiquettes

 

Et tu en as fait de même pour

 

propriétés dynamiques correspondantes
?

 

As-tu bien

 

respectant la casse avec autant de paires que nécessaire
?

 

Je serai étonné de voire que personne n'utilise les blocs dynamiques, les attributs, le lisp et excel pour pouvoir tirer un maximum d'autocad.

 

Moi aussi, ;)

Civil 3D 2024 - COVADIS_18.2

https://www.linkedin...3%ABt-95313341/

Lien vers le commentaire
Partager sur d’autres sites

Lorsque je lance ton outil, autocad me demande de choisir l'objet. Je sélectionne mon bloc dynamique mais autocad me renvoi 0 trouvé.

 

Ton bloc dynamique a-t-il bien un ou plusieurs attributs ?

 

Pour chaque bloc sélectionné, le LISP récupère la listes des attributs et celle des propriétés dynamiques. Et, pour chaque paire (ETIQUETTE . NomDePropriété), s'il trouve l'étiquette dans la liste des attributs et le nom de propriété dans celle des propriétés dynamiques, il affecte la valeur de l'attribut à la propriété.

N'est-ce pas ce que tu voulais ?

Gilles Chanteau - gileCAD -
Développements sur mesure pour AutoCAD
ADSK_Expert_Elite_Icon_S_Color_Blk_125.png

Lien vers le commentaire
Partager sur d’autres sites

Bonjour lili2006

voilà ce que j'ai écrit :

 

(defun c:test (/ lst ss)

 

(vl-load-com)

 

(or *acad* (setq *acad* (vlax-get-acad-object)))

 

(or *acdoc* (setq *acdoc* (vla-get-ActiveDocument *acad*)))

 

 

 

(setq lst '(

 

("Distance" . "UpdatedDistance")

 

("Visibilité" . "VisibilityState")

 

)

 

)

 

 

 

 

 

(if (ssget '((0 . "INSERT") (66 . 1)))

 

(progn

 

(vlax-for bref (setq ss (vla-get-ActiveSelectionSet *acdoc*))

 

(gc:AttToDynProp bref lst)

 

)

 

(vla-Delete ss)

 

)

 

)

 

(princ)

 

)

 

Je vais tenté de voir si ça marche avec ixl.

 

Lien vers le commentaire
Partager sur d’autres sites

Je répète, ton bloc a-t-il bien des attributs (en plus d'être dynamique) ?

 

Si oui, ETIQUETTE est à remplacer par l'étiquette (tag) de l'attribut (en général en majuscules) et NomProprieteDyn par le nom de la propriété dynamique (que l'on peut changer dans la palette 'Propriété' de l'éditeur de bloc).

Gilles Chanteau - gileCAD -
Développements sur mesure pour AutoCAD
ADSK_Expert_Elite_Icon_S_Color_Blk_125.png

Lien vers le commentaire
Partager sur d’autres sites

Oui mon bloc est dynamique et a 2 attributs. Un attribut Distance lié à mon paramètre d'étirement, et un attribut Visibilité lié au paramètre de Visibilité.

 

J'ai remplacé :

("ETIQUETTE_1" . "NomProprieteDyn_1")

("ETIQUETTE_2" . "NomProprieteDyn_2")

 

Par :

("DISTANCE" . "Distance")

("VISIBILITE" . "Visibilité")

 

En respectant la casse.

 

Tout marche correctement, maintenant j'ai un autre soucis lié à IXL..

 

Petit récapitulatif :

Ixl permet d'insérer des blocs dans autocad depuis Excel, il insére également les attibuts.

L'avantage de Excel ce que l'on peut calculer des positions précise par le biais de formule logique et de calcul complexe. Le problème c'est que Ixl insère des blocs en blocs du coup mon bloc dynamique avec attribut devient un simple bloc sans rien, il faut le décomposer 1 fois pour avoir le dynamisme et 2 fois pour avoir les attributs mais du coup ne sont plus lié au propriété dynamique.

 

Je sais pas si je me suis fait comprendre, pas simple a expliqué.

 

 

 

 

 

Lien vers le commentaire
Partager sur d’autres sites

Le problème c'est que Ixl insère des blocs en blocs du coup mon bloc dynamique avec attribut devient un simple bloc sans rien, il faut le décomposer 1 fois pour avoir le dynamisme et 2 fois pour avoir les attributs mais du coup ne sont plus lié au propriété dynamique.

 

Est-ce que tout fonctionne bien si tu insères le bloc avec la commande INSERER (puis parcourrir) ?

 

Sinon, c'est que ton bloc est mal fait (imbrications de blocs).

Gilles Chanteau - gileCAD -
Développements sur mesure pour AutoCAD
ADSK_Expert_Elite_Icon_S_Color_Blk_125.png

Lien vers le commentaire
Partager sur d’autres sites

Est-ce que tout fonctionne bien si tu insères le bloc avec la commande INSERER (puis parcourrir) ?

 

Non effectivement ça ne marche pas. Je suis obligé de le décomposer pour avoir les paramètres de visibilité et d'étirement.

 

Sinon, c'est que ton bloc est mal fait (imbrications de blocs).

ça me surprend....Je vais revoir ça

 

Merci

Lien vers le commentaire
Partager sur d’autres sites

  • 2 semaines après...

Bonjour à tous et bonne et heureuse année, à vous !!!

 

Tu avais raison Gile, mes blocs dynamiques étaient mal fait, le problème est résolu.

Merci encore pour tes compétences.

 

Au fait, j'ai demandé à mon travail, une formation sur le lisp.

Mes chefs se sont aperçu qu'il y avait du potentiel, et d'énorme possibilité avec ces bouts de code.

Je serai donc formé au cours de l'année 2011.

C'est pas une bonne nouvelle ça ?

Je ne devrais plus t'embêter Gile.

 

A bientôt et encore merci. ;)

Lien vers le commentaire
Partager sur d’autres sites

  • 7 ans après...

Bonjour,

 

La routine que vous avez créé me conviendrait parfaitement si j'arrivais à la faire fonctionner .

Cependant j'ai un problème, lorsque je charge la routine et que je l'exécute,

Voila l'erreur qu'il me trouve

 

; erreur: no function definition: GC:ATTTODYNPROP

 

Pourtant j'ai bien copié le code et remplacé ce qu'il fallait.

 

 

J'espère que vous pourrez m'aider.

 

Merci

 

;; gc:GetDynProps

;; Retourne la liste des propriétés dynamiques de la référence de bloc

;; sous la forme d'une liste de paire pointées (PropertyName . DynamicBlockProperty)

;;

;; Argument

;; bref : référence de bloc (vla-object)

(defun gc:GetDynProps (bref / lst)

(foreach p (vlax-invoke bref 'getDynamicBlockProperties)

(setq lst (cons (cons (vla-get-PropertyName p) p) lst))

)

(reverse lst)

)

 

;; gc:GetAttributes

;; Retourne la liste des attributs de la référence de bloc

;; sous la forme d'une liste de paire pointées (TagString . AttributeReference)

;;

;; Argument

;; bref : référence de bloc (vla-object)

(defun gc:GetAttributes (bref / lst)

(foreach att (vlax-invoke bref 'GetAttributes)

(setq lst (cons (cons (vla-get-TagString att) att) lst))

)

(reverse lst)

)

 

;; gc:AttToDynProp

;; Attribut à chaque propriété dynamique de la liste la valeur de l'attribut correspondante

;;

;; Arguments

;; bref : référence de bloc (vla-object)

;; lst : une liste de paires pointées (TagString . PropertyName)

(defun :gc:AttToDynProp (bref lst / atts props att prop)

(setq atts (gc:GetAttributes bref)

props (gc:GetDynProps bref)

)

(foreach p lst

(if

(and

(setq att (assoc (car p) atts))

(setq prop (assoc (cdr p) props))

)

(vl-catch-all-apply

'(lambda (/ typ)

(setq typ (vlax-variant-type (vla-get-Value (cdr prop))))

(cond

((< 1 typ 4)

(vla-put-Value (cdr prop) (atoi (vla-get-TextString (cdr att))))

)

((< 3 typ 6)

(vla-put-Value (cdr prop) (atof (vla-get-TextString (cdr att))))

)

((= 8 typ)

(vla-put-Value (cdr prop) (vla-get-TextString (cdr att)))

)

)

)

)

)

)

)

 

(defun c:test (/ lst ss)

(vl-load-com)

(or *acad* (setq *acad* (vlax-get-acad-object)))

(or *acdoc* (setq *acdoc* (vla-get-ActiveDocument *acad*)))

 

(setq lst '(

("LONGUEUR" . "Longueur")

 

)

)

 

 

(if (ssget '((0 . "INSERT") (66 . 1)))

(progn

(vlax-for bref (setq ss (vla-get-ActiveSelectionSet *acdoc*))

(gc:AttToDynProp bref lst)

)

(vla-Delete ss)

)

)

(princ)

)

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é