zebulon_ Posté(e) le 19 mars 2010 Posté(e) le 19 mars 2010 Bonjour, à partir du lisp MAT de Patrick_35, j'ai étudié la possibilité de modifier des valeurs d'attributs pour un ensemble de blocs avec attributs.J'ai appelé ce lisp battval. Ce que j'aimerai rajouter, c'est la possibilité de saisir un champ. Y a-t-il en lisp une fonction qui permet d'avoir la boite de dialogue de la commande CHAMP et qui renvoie le texte formaté correspondant ? Un peu comme (acad_colordlg ...) ou (acad_truecolordlg ...) qui renvoient la couleur choisie par l'utilisateur. AmicalementVincent C'est au pied du mur que l'on reconnaît le maçon ! (Anonyme) C’est en restant au pied du mur qu’on ne voit que le mur (Anonyme aussi)
(gile) Posté(e) le 19 mars 2010 Posté(e) le 19 mars 2010 Salut, Super ! Je crains que pour les champs il ne faille se le faire "à la main". Ce qui veut dire récupérer toutes les différentes expressions de champ... Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Tramber Posté(e) le 19 mars 2010 Posté(e) le 19 mars 2010 http://www.cadforum.cz/cadforum_en/qaID.asp?tip=3676 J'ai trouvé un mini listing. Difficile d'en trouver un complet mais peut-être seras-tu le premier. http://www.bestshareware.net/download/autofield-for-autocad.htmà craquer :cool: Autant essayer d'ouvrir les ARX et DLL d'AutoCAD. Reflexion faite, ca ira plus vite à la main. (gile) nous le confirmera :P Bureau d'études dessin. Spécialiste Escaliers Développement - Formation ./__\. (.°=°.)
Patrick_35 Posté(e) le 19 mars 2010 Posté(e) le 19 mars 2010 Bonjour Super boulot zeb :D J'aurai juste une remarqueC'est dommage que tu n'utilises pas activeselectionset, cela éviterai des bascules ename->vla Pour les champs, pas de solution miracle @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
zebulon_ Posté(e) le 19 mars 2010 Auteur Posté(e) le 19 mars 2010 J'aurai juste une remarqueC'est dommage que tu n'utilises pas activeselectionset, cela éviterai des bascules ename->vla Ce n'est pas parce que je n'aime pas : on ne peut pas ne pas aimer ce qu'on ne connait pas (hou là, c'est un peu lourd comme phrase). Donc, comme je ne suis pas réactionnaire, je m'y suis intéressé et, quand on utilise vlisp, c'est effectivement bien mieux d'éviter les vlax-ename->vla-object à tout bout de champ. Merci pour le tuyau. Pour les champs, c'est dommage qu'il n'y ait pas une combine ... C'était un exercice intéressant pour voir que les possibilités en DCL (Désuet Comme Langage) sont, malgré tout, importantes : tabulation dans une list_box (tabs et tabs_truncate), possibilité de double-cliquer dans la list_box (allow_accept = true qui renvoie directement sur le bouton is_default : c'est pour cette raison que mon bouton ok n'est pas is_default et que je n'ai pas pu me servir du ok_cancel; prédéfini)Cela reste ringard, quand même... et ce n'est pas Tramber qui va nous dire le contraire AmicalementVincent [Edité le 19/3/2010 par zebulon_] C'est au pied du mur que l'on reconnaît le maçon ! (Anonyme) C’est en restant au pied du mur qu’on ne voit que le mur (Anonyme aussi)
lili2006 Posté(e) le 19 mars 2010 Posté(e) le 19 mars 2010 Bonsoir à toutes et tous, Après quelques tests rapides, je pense ne pas avoir bien compris la différence entre MAT de Patrick_35 et battval de zebulon_,... battval permet de changer depuis n'importe quel blocs de types différents la valeurs d'un attribut de même nature ? Merci d'avance de vos éclaircissements,... ;) Civil 3D 2025 - COVADIS_18.3b https://www.linkedin...3%ABt-95313341/
zebulon_ Posté(e) le 21 mars 2010 Auteur Posté(e) le 21 mars 2010 Après quelques tests rapides, je pense ne pas avoir bien compris la différence entre MAT de Patrick_35 et battval de zebulon_,... En fait, il n'y en a pas sur le fond. Seule la forme change. Battval est présenté comme Battman et présente plus d'informations à l'écran que MAT et fait suite à cette discussion.MAT et Battval permettent de "propager" une valeur d'attribut à l'ensemble des attributs de tous les blocs de même nom. AmicalementVincent C'est au pied du mur que l'on reconnaît le maçon ! (Anonyme) C’est en restant au pied du mur qu’on ne voit que le mur (Anonyme aussi)
lili2006 Posté(e) le 21 mars 2010 Posté(e) le 21 mars 2010 Bonjour à toutes et tous, Ok ! Merci de ta réponse zebulon_, Comme j'ai l'habitude de rater des trucs essentiels,... ;) Adopté, Merci encore, :P Civil 3D 2025 - COVADIS_18.3b https://www.linkedin...3%ABt-95313341/
Patrick_35 Posté(e) le 21 mars 2010 Posté(e) le 21 mars 2010 Bonjour ZebJe pensais que pour l'idée des champs, tu pouvais récupérer la valeur via le choix d'un attribut.Et tant que tu y est, la possibilité de récupérer toutes les valeurs sur un bloc choisis.ET pour terminer, la possibilité de choisir un répertoire pour modifier tous les dessins de ce répertoire, comme avec PAT @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
zebulon_ Posté(e) le 22 mars 2010 Auteur Posté(e) le 22 mars 2010 Je pensais que pour l'idée des champs, tu pouvais récupérer la valeur via le choix d'un attribut. En fait, pour ce qui concerne les champs, je pensais faire lancer la commande champ par le lisp, faire écrire le champ dans un coin du fichier, en récupérer sa définition et la coller dans l'attribut.Voilà mon idée générale. Je ne sais pas si c'est possible ... AmicalementVincent C'est au pied du mur que l'on reconnaît le maçon ! (Anonyme) C’est en restant au pied du mur qu’on ne voit que le mur (Anonyme aussi)
(gile) Posté(e) le 22 mars 2010 Posté(e) le 22 mars 2010 Salut, J'ai peut-être une piste.La routine ci-dessous retourne l'expression du champ spécifié dans la boite de dialogue de la commande native ou nil si l'utilisateur a annulé. (defun GetFieldCode (/ txt code) (vl-cmdf "_.field") (and (while ( (while ( (vl-cmdf pause) ) (vl-cmdf '(0. 0. 0.)) ) (setq txt (vlax-ename->vla-object (entlast))) (setq code (vla-FieldCode txt)) (vla-delete txt) ) code ) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
zebulon_ Posté(e) le 22 mars 2010 Auteur Posté(e) le 22 mars 2010 Bonjour, C'est exactement vers quoi je voulais aller.Les soucis avec (getfieldcode) sont :- le fait que pour certains champs, il est possible de sélectionner un objet. La boite de dialogue devrait se fermer pour cliquer sur un objet. Il n'en est rien et je pense qu'une des boucle while n'a plus de condition d'arrêt- il faut que les boites de dialogue DCL soient fermées quand on exécute (getfieldcode), sinon ça part en vrille et on se retrouve gravement planté. Un autre soucis, concernant les attributs. Une fois que j'ai mis à jour l'attribut avec le code de champ, cela m'affiche une série de ####. C'est à dire que l'attribut nécessite une mise à jour préalable avant de s'afficher correctement. J'ai essayé avec un (vla-regen AcDoc acAllViewports), mais cela ne marche que sur la présentation courante. Les éventuels attributs qui ont été modifiés sur d'autres présentations ne sont pas mis à jour.J'ai déposé battval modifié au même endroit. AmicalementVincent C'est au pied du mur que l'on reconnaît le maçon ! (Anonyme) C’est en restant au pied du mur qu’on ne voit que le mur (Anonyme aussi)
Tramber Posté(e) le 23 mars 2010 Posté(e) le 23 mars 2010 (gile) : super l'astuce du cmdactive, que je n'avais que vaguement vu quelque part il y a longtemps je ne sais plus où (pour être précis !) Vincent : une énormité mais fieldeval a bien le bit 16 ? Je crois que le AllViewports ne décrit que les fenêtres de l'espace en cours (objet en l'occurence, on sait qu'il peut contenir plusieurs fenetres). Bureau d'études dessin. Spécialiste Escaliers Développement - Formation ./__\. (.°=°.)
zebulon_ Posté(e) le 23 mars 2010 Auteur Posté(e) le 23 mars 2010 (gile) : super l'astuce du cmdactive, que je n'avais que vaguement vu quelque part il y a longtemps je ne sais plus où (pour être précis !) une solution que nous devons à bonuscad. J'y suis un tout petit peu pour quelque chose, c'est pour ça que je m'en souviens ;) Concernant les champs dans les attributs, je cherche l'équivalent de "Mettre à jour le champ" pour que la bonne valeur s'affiche et non pas ####. Pour ce qui est de FIELDEVAL, je ne connaissais pas, mais il est à la valeur 31 donc tous les bits à 1. AmicalementVincent [Edité le 23/3/2010 par zebulon_] C'est au pied du mur que l'on reconnaît le maçon ! (Anonyme) C’est en restant au pied du mur qu’on ne voit que le mur (Anonyme aussi)
Tramber Posté(e) le 23 mars 2010 Posté(e) le 23 mars 2010 Je trouve que l'usage de cmdactive va incontestablement plus loin ici. Mais tant mieux. Pour les champs, je prendrais bien 1 h pour passer voir comment ca marcherait en Vlisp. Mais :(command "mettreajourchamp" "tout" "")ne donne rien ? [Edité le 23/3/2010 par Tramber] Bureau d'études dessin. Spécialiste Escaliers Développement - Formation ./__\. (.°=°.)
zebulon_ Posté(e) le 23 mars 2010 Auteur Posté(e) le 23 mars 2010 Mais :(command "mettreajourchamp" "tout" "")ne donne rien ? Uniquement pour la présentation courante... Pas mieux que le (vla-regen AcDoc acAllViewports), donc. 2 remarques :- quand les attributs sont de type "multilignes", la mise à jour se fait toute seule- j'ai essayé la chose suivant, en sélectionnant un attribut simple (setq e (vlax-ename->vla-object (car (nentsel))))(vla-put-textstring e "%<\\AcVar Filename \\f \"%tc3%fn2\">%") et j'ai droit à ####. Il y a bien une méthode update applicable à un attribut mais (vla-update e), contrairement à ce que j'espérais, ne fait rien. AmicalementVincent C'est au pied du mur que l'on reconnaît le maçon ! (Anonyme) C’est en restant au pied du mur qu’on ne voit que le mur (Anonyme aussi)
Tramber Posté(e) le 23 mars 2010 Posté(e) le 23 mars 2010 Je sais. Figures-toi que j'ai regardé vite fait.Tu remarqueras que e a une extension dictionnary.En fouillant à fond : (setq alors(vla-item(vla-item (vla-getextensiondictionary obj) 0)0)) je tombe sur acdbField :D Super utile :cool: Pas évident de trouver des infos ou des idées, faute de temps réel pour moi... Bureau d'études dessin. Spécialiste Escaliers Développement - Formation ./__\. (.°=°.)
(gile) Posté(e) le 23 mars 2010 Posté(e) le 23 mars 2010 Merci Tramber,Je dois dire que j'étais assez content d'avoir trouvé ce truc avec 2 (getvar 'cmdactive) imbriqués combinés avec vl-cmdf qui retourne T ou nil suivant que l'utilisateur achève la commande dans la boite de dialogue ou fasse Annuler. Dommage qu'AutoCAD ne supporte pas les imbrications de fermetures temporaires de boites dialogues. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Patrick_35 Posté(e) le 26 mars 2010 Posté(e) le 26 mars 2010 Eureka J'avais besoins de remplacer une valeur dans champs dans mes attributs (ctab au lieu de clayer en expression diesel et variable autocad) Un extrait du lisp (vlax-for blo (setq sel (vla-get-activeselectionset doc)) (foreach att (vlax-invoke blo 'getattributes) (and (eq (vla-get-hasextensiondictionary att) :vlax-true) (setq old (entget (cdr (assoc 360 (entget (vlax-vla-object->ename att)))))) (eq (cdr (assoc 3 old)) "ACAD_FIELD") (setq ent (entget (cdr (last (vl-remove-if-not '(lambda(x)(eq (car x) 360)) (entget (cdr (assoc 360 (entget (cdr (assoc 360 old))) ))) ) ))) ) (progn (foreach ele (vl-remove-if-not '(lambda(x)(member (car x) '(1 2))) ent) (setq old ele) (while (vl-string-search "CLAYER" (strcase (cdr ele))) (setq ele (cons (car ele) (vl-string-subst "ctab" "clayer" (cdr ele)))) ) (setq ent (subst ele old ent)) ) (entmod ent) ) ) ) ) (vla-delete sel) Après quelques tests, cela à l'air de tenir la routeIls auraient pu faire quelque chose de plus simple chez totodesk :casstet: @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
zebulon_ Posté(e) le 26 mars 2010 Auteur Posté(e) le 26 mars 2010 Au fin fond... J'ai un peu du mal à suivre tant le cheminement est complexe. J'ai toutefois une question concernant la ligne(vl-remove-if-not '(lambda(x)(member (car x) '(1 2))) ent) Si j'ai bien suivi, ent contient des codes de ce style((330 . ) (102 . "}") (330 . ) (100 . "AcDbField") (1 . "_text") (2 . "%<\\_FldIdx 0>%") (90 . 1) (360 . d'entité: 7eedcea0>) (97 . 0) (91 . 63) (92 . 0) (94 . 5) (95 . 1) (96 . 0) (300 . "") (93 . 1) (6 . "ACFD_FIELDTEXT_CHECKSUM") (93 . 2) (90 . 2) (140 . 350.0) (94 . 0) (300 . "") (302 . "") (304 . "ACVALUE_END") (7 . "ACFD_FIELD_VALUE") (93 . 3) (90 . 0) (94 . 0) (300 . "") (302 . "") (304 . "ACVALUE_END") (301 . "") (98 . 0)) En quoi c'est intéressant d'analyser la paire (1 . "_text") ? Si on peut se contenter d'analyser la paire de code 2, on pourrait éviter les boucles foreach et while et ne faire qu'un(setq ent (subst (cons 2 (vl-string-subst ...)) (assoc 2 ent) ent))) Dernière question : la valeur se met-elle à jour toute seule ou bien cela nécessite un regen ? AmicalementVincent [Edité le 26/3/2010 par zebulon_] C'est au pied du mur que l'on reconnaît le maçon ! (Anonyme) C’est en restant au pied du mur qu’on ne voit que le mur (Anonyme aussi)
Patrick_35 Posté(e) le 29 mars 2010 Posté(e) le 29 mars 2010 Salut Voici ce que je trouve en sélectionnant un attribut qui a pour champ une variable autocad (setq old (entget (cdr (assoc 360 (entget (car (nentsel))))))) (setq ent (entget (cdr (last (vl-remove-if-not '(lambda(x)(eq (car x) 360)) (entget (cdr (assoc 360 (entget (cdr (assoc 360 old)))))) ) ))) )((-1 . ) (0 . "FIELD") (330 . ) (5 . "1003F") (100 . "AcDbField") (1 . "AcVar") (2 . "\\AcVar clayer") (90 . 0) (97 . 0) (91 . 63) (92 . 0) (94 . 59) (95 . 2) (96 . 0) (300 . "") (93 . 1) (6 . "Variable") (93 . 0) (90 . 4) (1 . "clayer") (94 . 0) (300 . "") (302 . "") (304 . "ACVALUE_END") (7 . "ACFD_FIELD_VALUE") (93 . 4) (90 . 4) (1 . "05") (94 . 0) (300 . "") (302 . "05") (304 . "ACVALUE_END") (301 . "05") (98 . 2)) (vl-remove-if-not '(lambda(x)(member (car x) '(1 2))) ent) ((1 . "AcVar") (2 . "\\AcVar clayer") (1 . "clayer") (1 . "05"))Maintenant, un autre attribut mais cette fois-ci, avec une expression diesel comme champ((-1 . ) (0 . "FIELD") (330 . ) (5 . "133E5") (100 . "AcDbField") (1 . "AcDiesel") (2 . "\\AcDiesel $(if,$(<=,$(getvar,clayer),8),0$(+,1,$(getvar,clayer)),$(+,1,$(getvar,clayer)))") (90 . 0) (97 . 0) (91 . 63) (92 . 0) (94 . 59) (95 . 2) (96 . 0) (300 . "") (93 . 1) (6 . "DieselExpression") (93 . 0) (90 . 4) (1 . "$(if,$(<=,$(getvar,clayer),8),0$(+,1,$(getvar,clayer)),$(+,1,$(getvar,clayer)))") (94 . 0) (300 . "") (302 . "") (304 . "ACVALUE_END") (7 . "ACFD_FIELD_VALUE") (93 . 4) (90 . 4) (1 . "06") (94 . 0) (300 . "") (302 . "06") (304 . "ACVALUE_END") (301 . "06") (98 . 2))((1 . "AcDiesel") (2 . "\\AcDiesel $(if,$(<=,$(getvar,clayer),8),0$(+,1,$(getvar,clayer)),$(+,1,$(getvar,clayer)))") (1 . "$(if,$(<=,$(getvar,clayer),8),0$(+,1,$(getvar,clayer)),$(+,1,$(getvar,clayer)))") (1 . "06")) Dernière question : la valeur se met-elle à jour toute seule ou bien cela nécessite un regen ?Toujours un regen :( Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
zebulon_ Posté(e) le 29 mars 2010 Auteur Posté(e) le 29 mars 2010 Merci pour les éclaircissements Toujours un regenc'est bien ce qui m'embête dans mon cas. J'ai remarqué que les attributs de type "multiligne" se mettent à jour tout seuls, contrairement aux attributs classiques.Je suppose donc que pour les premiers il y a un réacteur qui se met en route pour modifier l'affichage de l'attribut en fonction de l'expression de champ et que pour les deuxièmes il n'y en a pas.Et comme je ne sais pas de quel réacteur il s'agit, ni quelle méthode il met en branle je me retrouve le bec dans l'eau. AmicalementVincent C'est au pied du mur que l'on reconnaît le maçon ! (Anonyme) C’est en restant au pied du mur qu’on ne voit que le mur (Anonyme aussi)
Patrick_35 Posté(e) le 29 mars 2010 Posté(e) le 29 mars 2010 Je suis comme toi, je ne trouve pas.J'avais trouvé une indication intéressante avec le code dxf 6(6 . "Variable")(6 . "DieselExpression")(6 . "SheetSetCompName")(6 . "ObjectPropertyName")et donc la possibilité d'évaluer les différentes formules (ex : Diesel --> (menucmd (strcat "M=" + "code dxf 2")))J'ai aussi changé les dxf 1,301 et 302 avec un entupd à chaque fois, que nenni @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
usegomme Posté(e) le 24 mai 2010 Posté(e) le 24 mai 2010 Merci Zebulon_ , battval est un bel outil qui m'est devenu trés utile depuis peu et pour longtemps je pense.
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