lolobala Posté(e) le 27 décembre 2010 Posté(e) le 27 décembre 2010 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
(gile) Posté(e) le 28 décembre 2010 Posté(e) le 28 décembre 2010 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 - GitHub Développements sur mesure pour AutoCAD
lolobala Posté(e) le 28 décembre 2010 Auteur Posté(e) le 28 décembre 2010 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.
lili2006 Posté(e) le 28 décembre 2010 Posté(e) le 28 décembre 2010 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 2025 - COVADIS_18.3b https://www.linkedin...3%ABt-95313341/
(gile) Posté(e) le 28 décembre 2010 Posté(e) le 28 décembre 2010 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 - GitHub Développements sur mesure pour AutoCAD
lolobala Posté(e) le 28 décembre 2010 Auteur Posté(e) le 28 décembre 2010 Bonjour lili2006voilà 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.
(gile) Posté(e) le 28 décembre 2010 Posté(e) le 28 décembre 2010 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 - GitHub Développements sur mesure pour AutoCAD
lolobala Posté(e) le 29 décembre 2010 Auteur Posté(e) le 29 décembre 2010 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é.
(gile) Posté(e) le 29 décembre 2010 Posté(e) le 29 décembre 2010 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 - GitHub Développements sur mesure pour AutoCAD
lolobala Posté(e) le 29 décembre 2010 Auteur Posté(e) le 29 décembre 2010 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
lolobala Posté(e) le 10 janvier 2011 Auteur Posté(e) le 10 janvier 2011 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. ;)
kentin789 Posté(e) le 18 décembre 2018 Posté(e) le 18 décembre 2018 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))
Patrick_35 Posté(e) le 18 décembre 2018 Posté(e) le 18 décembre 2018 ; erreur: no function definition: GC:ATTTODYNPROPSalut Cela indique que le lisp n'a pas trouvé la fonction GC:ATTTODYNPROP Surement, un problème de copier/coller. @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
Messages recommandés
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 compteSe connecter
Vous avez déjà un compte ? Connectez-vous ici.
Connectez-vous maintenant