Flobott Posté(e) le 4 novembre 2021 Posté(e) le 4 novembre 2021 Bonjour, n'étant pas habitué au VLISP je viens demander un peu d'aide. (Manuellement je mets en champs objet -> index un texte dans une autre zone de texte grâce au champ et je copie celui-ci autant de fois que j'en ai besoin dans mon folio. Je fais cela lorsque je sais que je vais devoir refaire X fois le folio avec la première valeur texte à modifier dans le folio d'après) Mais c'est plutôt rébarbatif à faire tout le temps à la main et je voulais automatiser cette manipulation. J'ai donc voulu me faire un lisp pour réaliser cette manipulation mais je bloque sur la partie où je sélection ma zone de texte à éditer pour en crée mon champ d'objet -> index en VLISP ou LISP, si possible... 1er question : Peut-on éditer un texte en VLISP ? 2e question : comment fait-on pour crée un champ dans un texte en VLISP ? ou puis-je réaliser les créations de champ en lisp classique ou je serais plus a l'aise ? (j'ai bien compris que je devais reprendre l'expression de mon champ et la concaténer avec l'ename en VLA-object mais il me manque quelque chose.) J'ai donc commencé ce bout de code, j'ai trouvais comment le fait en créant un texte avec vla-AddText mais pas en éditant le texte. (defun c:toto (/ doc txt) (vl-load-com) ;charge le support ActiveX complet (setq doc (vla-get-Activedocument (vlax-get-acad-object))) ;; Accès au dessin courant d'AutoCAD. ;; ;"vla-get-Activedocument" : Accéder au document actif / "vlax-get-acad-object" : Accéder à "l'objet" AutoCAD (if (and (setq txt (car (nentsel "\nSéléctionnez un texte ou un attribut: "))) ;Le "setq" crée la valeur "txt" qui recuperera le nom d'entité du texte selectionné en premant la premiere liste "ename" avec "car" (member (vla-get-ObjectName (setq txt (vlax-ename->vla-object txt))) ;"member" renvoie la liste tromqué a partir de vla-get-ObjectName ;"vlax-ename->vla-object txt" : Conversion d'une entité (ename) en VLA-OBJECT pour le texte. '("AcDbAttribute" "AcDbMText" "AcDbText") ;dans les sous classe attributs, multi-texte et texte ) ) (command "_textedit" ;----------------------------------------------------------------------------------- (strcat ;Concaténation de plusieurs chaînes de caractères "%<\\AcObjProp Object(%<\\_ObjId " (vla-GetObjectIdString (vla-get-Utility doc) txt :vlax-false) ">%).TextString \\f \"%tc1\">%" ) ;----------------------------------------------------------------------------------- ) ) (princ) ) AutoCad c'est comme mon cerveau, je ne l'utilise qu'à 10% Oo
Vincent P. Posté(e) le 22 novembre 2021 Posté(e) le 22 novembre 2021 Bonjour bonjour, Je ne suis pas sur d'avoir bien compris ce que tu cherche à faire. Du coup je formule comme je l'ai compris : Tu prend un texte d'une présentations, et tu souhaite le copier dans toutes tes autres présentations. De prime abord, je dirais : GATTE GATTE te permet de modifier l'attribut d'un bloc, et d'appliquer cette modification à toutes les occurrences du bloc dans ton dessin. Je l'utilise beaucoup sur mes blocs cartouche quand j'ai plein de présentations à modifier ... Présentement Vincent P. PS : je n'ai pas réussit à faire fonctionner ta commande, ce qui me fait dire que j'ai pas compris où tu nous emmène 😅 Lispeur éternel débutant! Autocad Map3D 2023 Covadis-Autopist 18.2
Flobott Posté(e) le 22 novembre 2021 Auteur Posté(e) le 22 novembre 2021 Merci pour ta réponse Vincent mais ce n'est pas ce que je cherche à faire en faite. Je souhaite en faisant un clic sur un premier texte ou attribut éditer le/les prochain(s) texte(s) en champs -> Objet -> Objet -> index du premier texte. Et je ne comprends pas comment éditer un texte en LISP, avec : "_textedit" ; je pensais pouvoir mais malgré plusieurs testes, je n'arrive pas à automatiser une édition de texte et je me demandais si cela était faisable en VLISP. Le LISP au-dessus n'est fonctionnel que pour la première partie avant " (commande "_textedit" ... " car je récupère bien la valeur du texte dans la première partie du LISP. AutoCad c'est comme mon cerveau, je ne l'utilise qu'à 10% Oo
Luna Posté(e) le 22 novembre 2021 Posté(e) le 22 novembre 2021 Coucou, Dans mes souvenirs, il suffisait de copier le texte du champs dynamique directement dans le code DXF 1 du texte (correspondant à l'index du texte en AutoLISP) mais j'ai testé rapidement et j'ai comme l'impression qu'il manque un truc donc mes souvenirs sont faux à priori...Cela revient au même que la fonction (vla-put-textstring) mais vu que mes souvenirs ne sont pas bons je ne peux pas vraiment t'aider plus que cela. Si j'ai un peu de temps je regarderais pour me rafraîchir la mémoire sur la méthodo. Bisous, Luna 1
didier Posté(e) le 22 novembre 2021 Posté(e) le 22 novembre 2021 Bonjour @Flobott Je ne suis pas certain que les explications textuelles formulées suffisent à expliquer clairement le problème, aussi je préconise de déposer un dessin DWG dans lequel avec des flèches, afin qu'on puisse se rendre compte de ce qu'il y a à faire. Exemple : Entouré en rouge le texte à changer et des flèches vers les autres textes qui doivent changer... Perso je n'ai pas compris, mais j'aimerais aider, car ça n'a pas l'air compliqué dans le fond. Amicalement Éternel débutant... Mon site perso : Programmer dans AutoCAD
bonuscad Posté(e) le 22 novembre 2021 Posté(e) le 22 novembre 2021 L'énoncé et le code ne sont pas très clair sur le but à atteindre... Mais pour le peu que j'ai compris, je modifierais le code comme suit, si c'est pas vraiment le but, cela te donnera peut être des pistes? (defun c:toto ( / doc txt nw_txt) (vl-load-com) ;charge le support ActiveX complet (setq doc (vla-get-Activedocument (vlax-get-acad-object))) ;; Accès au dessin courant d'AutoCAD. ;; ;"vla-get-Activedocument" : Accéder au document actif / "vlax-get-acad-object" : Accéder à "l'objet" AutoCAD (if (and (setq txt (car (nentsel "\nSéléctionnez un texte ou un attribut source: "))) ;Le "setq" crée la valeur "txt" qui recuperera le nom d'entité du texte selectionné en premant la premiere liste "ename" avec "car" (member (vla-get-ObjectName (setq txt (vlax-ename->vla-object txt))) ;"member" renvoie la liste tromqué a partir de vla-get-ObjectName ;"vlax-ename->vla-object txt" : Conversion d'une entité (ename) en VLA-OBJECT pour le texte. '("AcDbAttribute" "AcDbMText" "AcDbText") ;dans les sous classe attributs, multi-texte et texte ) ) (while (setq nw_txt (nentsel "\nSéléctionnez un texte ou un attribut cible: ")) (cond ((member (vla-get-ObjectName (setq nw_txt (vlax-ename->vla-object (car nw_txt)))) '("AcDbAttribute" "AcDbMText" "AcDbText")) (vla-put-textstring nw_txt ;----------------------------------------------------------------------------------- (strcat ;Concaténation de plusieurs chaînes de caractères "%<\\AcObjProp Object(%<\\_ObjId " (vla-GetObjectIdString (vla-get-Utility doc) txt :vlax-false) ">%).TextString \\f \"%tc1\">%" ) ;----------------------------------------------------------------------------------- ) (vla-regen Doc acactiveviewport) ) ) ) ) (prin1) ) 1 Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
Flobott Posté(e) le 23 novembre 2021 Auteur Posté(e) le 23 novembre 2021 C'est exactement ce que je voulais faire bonuscad 😄 Merci beaucoup ^^ Maintenant, il faut que je comprenne ce bout de VLISP : ((member (vla-get-ObjectName (setq nw_txt (vlax-ename->vla-object (car nw_txt)))) '("AcDbAttribute" "AcDbMText" "AcDbText")) (vla-put-textstring nw_txt Si je déchiffre ton ajout de code : (while (setq nw_txt (nentsel "\nSéléctionnez un texte ou un attribut cible: ")) ;Tant qu'une entité texte ou attribut est selectionné. (cond ;Début de la condition. ((member (vla-get-ObjectName (setq nw_txt (vlax-ename->vla-object (car nw_txt)))) '("AcDbAttribute" "AcDbMText" "AcDbText")) ;Je récupère l'entée utilisateur tronqué à partir de "l'ename" dans la liste -> "member (vla-get-ObjectName" ;pour la valeur "nw_txt" -> "setq nw_txt" ;Je transforme l'ename en object VLA -> "vlax-ename->vla-object" ;et recupère la premiere partie de celle-ci. -> "car nw_txt" ;pour les attributs, textes et Multi-textes -> "AcDbAttribute" "AcDbMText" "AcDbText" (vla-put-textstring nw_txt ;Renvoie le contenu textuel de nw_txt ;----------------------------------------------------------------------------------- (strcat ;Concaténation de plusieurs chaînes de caractères "%<\\AcObjProp Object(%<\\_ObjId " (vla-GetObjectIdString (vla-get-Utility doc) txt :vlax-false) ;je recupère le texte ">%).TextString \\f \"%tc1\">%" ) ;----------------------------------------------------------------------------------- ) (vla-regen Doc acactiveviewport) ; regen du document pour la mise a jours des champs ) ) ;Fin de la condition. ) Le VLISP est quand même bien particulier, j'ai vraiment du mal à le manipuler contrairement au LISP classique mais à force je finirais bien par réussir à en faire comme du LISP. Ou puis-je trouver des descriptions des VLA propriété comme "vla-put-textstring" pour mieux approfondir le sujet ? J'aimerais bien apprendre à les manipuler. Encore merci 😉 AutoCad c'est comme mon cerveau, je ne l'utilise qu'à 10% Oo
Luna Posté(e) le 23 novembre 2021 Posté(e) le 23 novembre 2021 Le Visual LISP est proche du VBA, donc il est basé sur des méthodes. En clair la véritable écriture serait (vlax-put nw_txt (strcat ...) 'TextString) Mais il y a une simplification d'écriture qui consiste à mettre directement le nom de la méthode dans le nom de la fonction (tu as du coup un grand nombre de fonction Visual LISP au final). Par exemple la fonction (vla-get-ActiveDocument (vlax-get-acad-object)) est un raccourci de (vlax-get (vlax-get-acad-object) 'ActiveDocument) Donc si tu veux l'aide d'AutoCAD va fournir de l'aide sur les méthodes (donc 'TextString, 'ActiveDocument, etc) mais il ne me semble pas que tu auras des fiches d'aides directement sur les fonctions composées comme (vla-put-TextString). En revanche il me semblait que c'était tout aussi simple en LISP vanilla qu'en Visual LISP mais j'obtiens un résultat différent...(cf. .dwg joint) Bisous, Luna Création Champ dynamique.dwg 1
Flobott Posté(e) le 23 novembre 2021 Auteur Posté(e) le 23 novembre 2021 Citation Luna : Mais il y a une simplification d'écriture Ah ouais, d'un coup c'est beaucoup plus clair sur le principe. Je comprends mieux, essayer de comprendre de l'abrégé pour en apprendre la langue n'est pas le plus adéquat 😅 Merci Luna, cela m'explique déjà où reprendre mes bases, et comment comprendre les VLISP ^^ Edit : Quand j'aurais un peut de temps, je referais se code en développé pour bien comprendre les méthodes utilisé. AutoCad c'est comme mon cerveau, je ne l'utilise qu'à 10% Oo
(gile) Posté(e) le 23 novembre 2021 Posté(e) le 23 novembre 2021 @Flobott, tu peux voir ce sujet à propos de la syntaxe "VLISP". 1 Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Flobott Posté(e) le 24 novembre 2021 Auteur Posté(e) le 24 novembre 2021 Merci Gile, les références ActiveX dans l'aide vont bien m'aider et le liens pour le sujet de la syntaxe "VLISP" est bien faite. 🙂 AutoCad c'est comme mon cerveau, je ne l'utilise qu'à 10% Oo
bonuscad Posté(e) le 24 novembre 2021 Posté(e) le 24 novembre 2021 Tu as aussi simplement l'aide d'autocad. Les exemples sont en VBA et lisp pour la plupart des fonctions, cela aide beaucoup... https://help.autodesk.com/view/OARX/2020/ENU/?guid=GUID-5D302758-ED3F-4062-A254-FB57BAB01C44 1 Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
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