-
Compteur de contenus
1 113 -
Inscription
-
Dernière visite
-
Jours gagnés
42
Type de contenu
Profils
Forums
Calendrier
Blogs
Tout ce qui a été posté par Luna
-
Coucou, Pour commencer je te conseille de limiter au maximum le nombre de variables globales (surtout lors de l'utilisation de boucles) et pour chat, de favoriser l'utilisation d'arguments pour tes fonctions. Typiquement, rien ne t'empêche d'ajouter l'argument "propdynnom" à ta fonction boitepropdyn3 pour éviter de devoir l'utiliser comme variable globale. Et d'utiliser également les fonctions pour créer un retour permettant l'utilisation d'un (setq var (function arg1 ar2)). Ensuite, que te renvoie l'historique de commande après le lancement de ton programme ? Ou bien sais-tu à quel endroit cela bug-t-il ? Bisous, Luna
-
Rotation de N Blocs en fonction d une Valeur d Attribut
Luna a répondu à un(e) sujet de lecrabe dans Routines LISP
Vouih je n'ai rien modifié d'autre :3 Bisous, Luna -
Rotation de N Blocs en fonction d une Valeur d Attribut
Luna a répondu à un(e) sujet de lecrabe dans Routines LISP
Coucou, Petite mise à jour par rapport à ton point n°1, ce qui permet de prendre en compte la pré-sélection et la sélection manuelle (en cas de sélection vide pour la pré-sélection ou la sélection manuelle, l'effectue sur l'ensemble des blocs du dessin). Après s'il faut supprimer le (ssget "_X") c'est tout à fait possible aussi. Normalement, il ne devrait pas y avoir de soucis pour les blocs dynamiques puisqu'on ne s'intéresse qu'à leur attribut donc il n'y a pas de filtre statique/dynamique. Faudra juste faire attention à la version de l'AutoCAD en raison de la fonction (getpropertyvalue) qui a été ajoutée assez récemment :3 Bisous, Luna -
Rotation de N Blocs en fonction d une Valeur d Attribut
Luna a répondu à un(e) sujet de lecrabe dans Routines LISP
Coucou, Cela te convient-il ? (defun c:ATTROT (/ ang-conv remove-double jsel i e name tag rot n lst) ; Supprime les doublons au sein d'une liste spécifiée en argument : ;--- La fonction (Remove-Double) possède 1 argument ;--- lst1 correspond à la liste devant être évaluée pour la suppression des doublons ;--- Renvoie la liste modifiée sans ses doublons (defun Remove-Double (lst1 / lst2) (while (car lst1) (setq Lst2 (cons (car lst1) lst2) Lst1 (vl-remove (car lst1) lst1) ) ) (reverse lst2) ) ; Permet de convertir les unités angulaires : ;--- La fonction (ang-conv) possède 3 arguments ;--- a correspond à l'angle que l'on souhaite convertir ;--- from correspond à l'unité angulaire de départ ; 0 - Degree ; 3 - Radian ; 2 - Grade ;--- to correspond à l'unité angulaire d'arrivée ; 0 - Degree ; 3 - Radian ; 2 - Grade ;--- Renvoie l'angle converti sous format numérique (defun ang-conv (a from to /) (cond ((and (= from 0) (= to 0)) (/ (* a 180.0) 180.0) ) ((and (= from 0) (= to 3)) (/ (* a pi) 180.0) ) ((and (= from 0) (= to 2)) (/ (* a 200.0) 180.0) ) ((and (= from 3) (= to 0)) (/ (* a 180.0) pi) ) ((and (= from 3) (= to 3)) (/ (* a pi) pi) ) ((and (= from 3) (= to 2)) (/ (* a 200.0) pi) ) ((and (= from 2) (= to 0)) (/ (* a 180.0) 200.0) ) ((and (= from 2) (= to 3)) (/ (* a pi) 200.0) ) ((and (= from 2) (= to 2)) (/ (* a 200.0) 200.0) ) ) ) (if (or (setq jsel (ssget '((0 . "INSERT")))) ; si pré-sélection ou sélection manuelle (setq jsel (ssget "_X" '((0 . "INSERT")))) ; si pas de sélection manuelle, alors prise en compte de la totalité des blocs ) (progn (setq n 0 i (sslength jsel) e i ) (if (= (setq tag (getstring "Veuillez spécifier le nom d'attribut pour la rotation <\"ROTATION\"> : ")) "") (setq tag "ROTATION") ) (repeat i (setq name (ssname jsel (setq i (1- i)))) (if (and (null (vl-catch-all-error-p (setq rot (vl-catch-all-apply 'getpropertyvalue (list name tag))))) (setq rot (ang-conv (atof rot) (getvar "AUNITS") 3)) (entmod (subst (cons 50 rot) (assoc 50 (entget name)) (entget name))) ) (setq n (1+ n) lst (cons (getpropertyvalue name "BlockTableRecord/Name") lst) ) (ssdel name jsel) ) ) (sssetfirst nil jsel) (foreach name (setq lst (vl-sort (remove-double lst) '<)) (command "_ATTSYNC" "N" name) ) (setq lst (apply 'strcat (mapcar '(lambda (str) (strcat "\n - " str)) lst))) (alert (strcat "\nUn total de " (itoa n) " / " (itoa e) " bloc(s) ont été redéfinis." "\nVoici la liste des blocs ayant un attribut nommé \"" tag "\" : " lst ) ) (prompt (strcat "\nUn total de " (itoa n) " / " (itoa e) " bloc(s) ont été redéfinis." "\nVoici la liste des blocs ayant un attribut nommé \"" tag "\" : " lst ) ) ) (prompt (strcat "\nAucun bloc présent dans ce fichier...")) ) (princ) ) Bisous, Luna -
Rotation de N Blocs en fonction d une Valeur d Attribut
Luna a répondu à un(e) sujet de lecrabe dans Routines LISP
Coucou, Juste une précision, lorsque tu demandes cela signifie-t-il que le programme ne doit boucler que sur des blocs statiques ou bien que sur les blocs dynamiques en fonction d'un choix utilisateur ou bien c'est uniquement pour dire que l'ensemble des références de blocs doivent être prises en compte (dynamique et statique pris en compte ensemble) ? Autrement, je pourrais te fournir une solution dans la journée :3 Bisous, Luna -
(Résolu) - Liste des matériaux du document
Luna a répondu à un(e) sujet de LElemurien dans Débuter en LISP
Coucou, Le visual LISP me paraît être le plus approprié pour répondre à cette demande (car le plus rapide) avec la collection AcadMaterials. Après je n'ai jamais utilisé les matériaux ou le Visual donc je ne vais pas t'être d'une grande utilité... Je peux te proposer ceci, mais je ne sais pas si cela correspond à la liste que tu souhaites : (defun tmplist (vla-obj / item lst name) (vl-load-com) (vlax-for item vla-obj (setq name (vlax-get-property item 'Name) lst (cons name lst) ) ) (reverse lst) ) Commande: (tmplist (vla-get-materials (vla-get-activedocument (vlax-get-acad-object)))) ("ByBlock" "ByLayer" "Global") Bisous, Luna -
Coucou, Au besoin, j'ai pu me pencher un peu plus sur ton problème donc j'ai une solution (qui pourrait être améliorable) mais il me semble qu'elle fonctionne dans l'ensemble. Si tu désires avancer de ton côté, je ne la posterai pas mais si tu le souhaites je peux la poster. J'ai en effet oublié que les segments pouvait également être issus de "LINE" simple mais il suffit de mettre à jour la fonction (SegSel) pour prendre en compte les lignes (un simple (if) sera suffisant pour passer outre la boucle). Bisous, Luna
-
Coucou, As-tu réussi à avancer sur ton problème du coup ? Si tu pourras poster ton code une fois terminé, cela pourrait servir pour d'autres personnes :3 Bisous, Luna
-
Validé et conservé la valeur précedente
Luna a répondu à un(e) sujet de willy95 dans Débuter en LISP
Je ne comprend pas bien ce qui n'allait pas dans le code que tu as écrit... Cela fonctionne nan ? Si le but est de conserver la valeur dans la même exécution de commande, alors je trouve que chat fonctionne très bien, mais si le but est de conserver la valeur entre deux lancements de commandes distincts alors il suffit de ne pas déclarer ta variable Zsol dans tes variables au niveau du (defun) afin de l'utiliser comme variable globale (et ainsi conserver sa valeur entre différentes commandes). Sumimasen je viens de comprendre ^^" Le but n'est pas de conserver une valeur mais de définir une valeur par défaut :3 Bisous, Luna -
Coucou, Si l'idée est de conserver des valeurs de variables en dur dans un fichier ou dans la session, je pense que la meilleure idée c'est la gestion des dictionnaries, ce sujet ouvert par (gile) est très intéressant ainsi que le site de didier qui en parle également. Tu peux également créer des variables globales que tu déclares à chaque démarrage de session et tu peux les gérer via des commandes rapides pour une fonctionnalité similaires à des variables systèmes. En revanche, là au Covadis permet d'avoir des barres d'outils non modales (similaires aux palettes d'AutoCAD où l'on peut travailler sur AutoCAD tout en ayant la palette ouverte), le langage LISP/DCL ne permet pas ce genre de programme. Les barres d'outils ne peuvent pas non plus contenir autre chose que des icônes pour des raccourcis de commande (ou du moins je n'ai pas trouvé de solution pour insérer une liste déroulante) à l'aide des fichiers CUIX personnalisés. Donc la question (bien que l'auteur du message l'a posté en 2013), c'est dans quel but et comment souhaite l'utiliser ? Si c'est uniquement un reminder, il existe au pire la variable MODEMACRO qui affiche du texte en bas à droite de l'écran (se définit via le langage DIESEL il me semble)... Donc l'explication actuelle est assez flou pour pouvoir réellement proposer une solution :3 Bisous, Luna
-
Modifier la valeur de plusieurs attributs
Luna a répondu à un(e) sujet de nen dans LISP et Visual LISP
Coucou, J'ai remarqué ce défaut de la fonction (nentsel) qui n'arrive pas à sélectionner l'attribut lorsqu'une hachure SOLID se trouve juste derrière... Il faut donc parfaitement bien viser l'attribut (il y a un léger décalage vers la droite du curseur donc il ne faut pas le mettre parfaitement sur l'attribut mais légèrement sur la gauche de celui-ci)... J'ai essayé et chat a fonctionné après 3 essais. Je peux te trouver une solution alternative sinon que j'ai faite pour un de mes programme. Je modifie le programme et je reviens vers toi. Sinon tu peux tenter de changer la hachure SOLID vers un autre motif plus sobre :3 Bisous, Luna -
Modifier la valeur de plusieurs attributs
Luna a répondu à un(e) sujet de nen dans LISP et Visual LISP
Coucou, LeCrabe je peux te proposer ceci si tu veux : ;; ;; Commande: ATT_ADD ;; par GC (Anciennement ADDATT) ;; Pour ajouter/soustraire une valeur numerique SIMPLE ;; a un Attribut SIMPLE sur un Bloc SIMPLE ;; Modifiée le 15/10/2020 - Luna ;; -> Ajout de la prise en compte de blocs dynamiques et modification de l'application des fonctions ;; -> Utilisation des fonctions (setpropertyvalue) et (getpropertyvalue) apparues depuis 2014 (?) (defun c:ATT_ADD (/ Get-att-list att lst tag blc name add ss n val txt) (defun Get-att-list (ename / Att Att_List) (setq Att_List (mapcar '(lambda (att) (cons (vla-get-tagstring att) (vla-get-textstring att))) (vlax-invoke (vlax-ename->vla-object ename) 'getattributes))) ) (if (and (setq att (car (nentsel "\nSelectionnez UN Attribut a modifier: "))) (setq lst (entget att)) (= (cdr (assoc 0 lst)) "ATTRIB") (numberp (read (cdr (assoc 1 lst)))) ;; Uniquement si le nombre correspond au premier caractère de l'attribut ! (setq tag (cdr (assoc 2 lst))) (setq blc (entget (cdr (assoc 330 lst)))) (setq name (getpropertyvalue (cdr (assoc -1 blc)) "BlockTableRecord/Name")) (princ "\nSelectionnez les Blocs a modifier ") (if (setq ss (ssget (list '(0 . "INSERT") (cons 2 (strcat name ",`*U*"))))) (repeat (setq n (sslength ss)) (if (and (wcmatch (getpropertyvalue (ssname ss (setq n (1- n))) "ClassName") "AcDbAssociative*Array") (/= (getpropertyvalue (ssname ss n) "BlockTableRecord/Name") name) ) (ssdel (ssname ss n) ss) (sssetfirst nil ss) ) ) (princ "\nAucun jeu de sélection valide...") ) (setq add (getreal "\nEntrez la valeur a ajouter ou soustraire : ")) ) (while (setq blc (ssname ss n)) (if (and (assoc tag (setq att-list (get-att-list blc))) (numberp (read (setq val (getpropertyvalue blc tag)))) (cond ((or (= (type (read val)) 'REAL) (= (type add) 'REAL)) (setq txt (rtos (+ (read val) add))) ) ((and (= (type (read val)) 'INT) (= (type add) 'INT)) (setq txt (itoa (+ (read val) add))) ) ) ) (setpropertyvalue blc tag (strcat txt (vl-string-left-trim "0123456789." val))) ) (setq n (1+ n)) ) (princ "\nL Objet selectionne n'est pas un attribut ! ") ) (princ) ) j'ai modifié l'écriture pour éviter une boucle (while) que je n'estime pas être en trop (sumimasen O grand (gile)-sensei !), pour modifier les attributs en passant par (getpropertyvalue) et (setpropertyvalue) donc à vérifier selon les versions d'AutoCAD (je n'ai plus la date de parution de ces fonctions en tête), les blocs dynamiques sont pris en compte et les réseaux sont éjectés et désormais cela permet de modifier des attributs qui ne sont pas uniquement composés de nombres. En clair, je me suis basé sur la fonction (read) qui renvoie un nombre si ce nombre est en début de chaîne, donc si j'ai un attribut ayant pour valeur "78.28 m²" contrairement à la commande précédente, elle renvoie "79.78 m²" (au lieu de "79.78" et donc perte des unités ou textes informatifs associés). Cependant, si l'attribut possède la valeur "N°101", au même titre qu'avant, l'addition ne pourra s'effectuer.. Tu as également la possibilité de pré-sélectionner les objets avant le lancement de la commande et tu pourras voir la sélection après filtrage. Bisous, Luna -
Si cela est trop "mathématique", il reste toujours la solution de créer deux lignes temporaires (par (command) ou par (entmake)) est d'utiliser ces lignes temporaires comme argument pour la commande _DIMANGULAR et ensuite de supprimer les lignes ni vu ni connu :3 C'est un moyen détourner mais il n'existe jamais qu'une seule solution à un problème :3 Moi j'ai plutôt tendance à chercher une solution mathématique (résolution d'équation cartésienne, produits scalaires, etc) mais chat n'est pas la méthode de tout le monde, donc le plus simple est de trouver ta propre méthode ^^ Bon courage, Luna
-
Oki donc si je comprend bien, la commande _DIMANGULAR retourne l'angle en noir 67,7° et tu cherches toi à afficher la cotation rouge, n'est-ce pas ? En ce cas, les coordonnées suffiront pour l'exercice mais comment détermines-tu si l'angle à compléter est un angle à 90°, 180° ou 270° ? Tu peux regarder du côté de la fonction (angle) et l'utilisation des coordonnées des segments (issues du programme ci-dessus) pour calculer tes angles, après tu fais les calculs dont tu as besoin, mais chat me paraît parfaitement réalisable en coordonnées pures et en soustraction / addition d'angle (attention car les angles retournés sont en radian donc prévoir les conversions nécessaires au besoin) :3 Bisous, Luna
-
Par exemple cette fonction retourne les coordonnées du premier sommet du segment et du second sommet du segment (selon le sens de la polyligne). Il s'agit des coordonnées SCG et tu peux sélectionner ta polyligne aussi bien en SCG qu'en SCU. La fonction à un argument pour choisir le message à afficher lors de la sélection de l'objet. (defun SegSel (msg / pt dist entlist name) (if (and (setq entlist (entsel msg)) (= (cdr (assoc 0 (entget (setq name (car entlist))))) "LWPOLYLINE") (setq pt (vlax-curve-getclosestpointto name (trans (cadr entlist) 1 0))) (setq dist (vlax-curve-getdistatpoint name pt)) (setq entlist (entget name)) ) (progn (while (< (vlax-curve-getdistatpoint name (cdr (assoc 10 entlist))) dist) (setq pt (cdr (assoc 10 entlist)) entlist (cdr (member (assoc 10 entlist) entlist)) ) ) (list pt (cdr (assoc 10 entlist))) ) (princ) ) ) Je ne sais pas si ça répond à ta demande, ni même si cela est exploitable dans la suite de ton programme (prise en compte de segments courbes, utilisation de polylignes 2D/3D, ...) Bisous, Luna
-
Coucou, Cela dépend un peu de ce que tu souhaites faire... Les segments ne sont pas des entités à proprement parlé donc tu ne pourras pas par exemple créer un (ssget) avec les segments sélectionnés. En revanche, si la liste des segments (chacun représenté par deux sommets qui se suivent) alors chat ne devrait pas poser de soucis :3 Que dois-tu faire de ces segments ? Une liste de coordonnées de points est-elle suffisante pour la suite de ton programme ? Bisous, Luna
-
Coucou, Ton programme sert uniquement à décomposer tous les blocs présents dans l'espace objet d'un fichier ? (si c'est le cas, je ne comprend pas l'utilité d'une double boucle... la première c'est par rapport aux blocs imbriqués si je comprend bien, mais la commande DECOMPOSE peut parfaitement fonctionner avec des jeux de sélection et pas bloc par bloc il me semble) Ce script est supposé se lancer de quelle manière, en clair, qu'elle différence entre l'utilisation d'une commande et l'utilisation d'un script ? (sumimasen, je ne maîtrise pas les scripts donc je ne sais pas en quoi un script est préférable à une commande) Tout ce que je sais à propos des scripts, c'est que les versions "light" d'AutoCAD supportent les scripts mais pas les lisps, donc pour les versions "light" on ne peut utiliser que des scripts... Donc potentiellement que les programmes LISP ne sont pas correctement exécutés par un script en ce sens... (je rappelle que je ne maîtrise pas les scripts, j'ai juste jeté un coup d'œil vite fait ^^") Bisous, Luna
-
Problème sur un Lisp de tableau de surface
Luna a répondu à un(e) sujet de Maxime063 dans Débuter en LISP
Après je me permet juste en terme de programmation, tu pourrais supprimer la moitié de tes variables dans tes programmes ce qui les allègerait beaucoup :3 Cela te permettra de réduire le nombre de lignes, cela pourrait également réduire le temps d'exécution du programme (enfin là c'est plus les utilisation des (command) qui le ralentit un peu) et de faciliter la lecture De plus, pense à bien déclarer la totalité de tes variables comme variables locales (tu n'as aucunement besoin de créer des variables globales dans tes programmes) dans tes fonctions (defun), d'où l'intérêt aussi d'en avoir moins pour ne pas avoir une liste de 150 variables à déclarer ^^" Bisous, Luna -
Problème sur un Lisp de tableau de surface
Luna a répondu à un(e) sujet de Maxime063 dans Débuter en LISP
Le soucis est que la fonction (read) va retourner une erreur lorsqu'il va essayer de lire le texte ".41 m2" (c'est d'ailleurs ce qui me posait problème sur ton programme, car il n'avait pas d'erreur sur ces textes) donc le plus simple serait d'ajouter le 0 devant le "." pour qu'il renvoie 0.41 :3 Soit tu modifies le premier programme pour qu'il ajoute ce 0, soit il faut modifier le (if (ascii ...)) à la ligne 21 du second programme pour qu'il s'adapte à cette écriture (un (cond) devrait faire le travail à la place du (if) pour ajouter une spécification dans le cas d'un ".") Du coup après vérification, LeCrabe a raison (une fois de plus), il s'agit bien d'un problème en lien avec ta variable DIMZIN (je suppose qu'elle est à 4 ou à 12 ?) qui supprime automatiquement les 0 de début (donc (getvar "AREA") retourne .41 au lieu de 0.41). Je te conseille de forcer cette variable de manière temporaire à 0 dans tes DEUX programmes histoire de ne plus avoir ce soucis :3 Relance les deux programmes avec la bonne valeur et dis-nous si chat fonctionne du coup ^^ PS : Une erreur est survenue lorsque j'ai lancé ta commande par rapport à la commande SCU (en début de programme) car l'option "GE" n'était pas reconnue (merci AutoCAD français qui ajoute les accents mais ne sait pas les lire :angry: ) donc peut-être qu'un simple "" pourrait limiter les erreurs (selon la version et la langue d'AutoCAD) puisque l'option "Général" est la valeur par défaut. Bisous, Luna -
Problème sur un Lisp de tableau de surface
Luna a répondu à un(e) sujet de Maxime063 dans Débuter en LISP
Je pense avoir trouvé l'erreur de ton programme : Dans ton (repeat (sslength ss1)), tu fais une vérification ascii de ton texte pour déterminer si tu à bien un chiffre compris entre 0 et 9. Or la fonction (ascii) ne permet de tester que le premier caractère d'une chaîne, donc ton programme précédent écrit une surface inférieure à 1 sans le 0 initial (".41 m2" au lieu de "0.41 m2"), donc comme le premier caractère n'est pas "0" mais ".", la fonction ascii retourne 46 (et non 48) donc toutes ces surfaces ne sont pas égale à 0, elles sont filtrées et éjectées. Il faut donc corriger le premier programme pour écrire le 0, ou bien modifier le second pour ne pas filtrer selon le tout premier caractère. Bisous, Luna -
Problème sur un Lisp de tableau de surface
Luna a répondu à un(e) sujet de Maxime063 dans Débuter en LISP
Pourrions-nous avoir ton .dwg d'exemple pour regarder de plus près d'où vient le soucis ? Je pense que le soucis vient essentiellement du fait que tes surfaces inférieures à 1 ne sont pas écrites avec "0" devant la virgule donc potentiellement que ça gêne la lecture (bien que numériquement parlant, 0.41 = .41 mais avec la conversion du texte, je ne saurais dire) Merci -
Problème sur un Lisp de tableau de surface
Luna a répondu à un(e) sujet de Maxime063 dans Débuter en LISP
Si je comprend bien, l'addition des surfaces inférieures à 1 ne compte pas. En clair même si l'ensemble des surfaces bleues une fois additionnées font bien une surface supérieure à 1, la surface totale bleue est comptée comme nulle car toutes les surfaces bleues sont individuellement égales à 1. C'est bien chat ? -
Problème sur un Lisp de tableau de surface
Luna a répondu à un(e) sujet de Maxime063 dans Débuter en LISP
Coucou, L'autre solution serait de demander de modifier (rtos total) par (rtos total 2 2) pour afficher 2 chiffres après la virgule (équivalent à l'initialisation de (setvar "LUPREC" 2)) mais sans modifier tes variables systèmes et donc ton espace de travail) :) En effet le problème vient probablement des arrondis automatiques d'AutoCAD à l'affichage. De manière général, il est préférable de toujours écrire (rtos r 2 1) à minima pour être sûre que les valeurs inférieures à 1 n'affichent pas 0. Le nombre de décimales est défini par le dernier nombre entre parenthèse (donc si tu veux une précision au dixième c'est 1, au centième c'est 2, etc) et le premier 2 correspond à l'expression des unités de longueurs (ici, 2 correspond aux nombres décimaux). Je doute que ta variable total soit faussée par ta variable LUPREC mais si le soucis persiste, il faudra en effet modifier cette variable pour s'assurer du bon fonctionnement de ta commande. Bisous, Luna -
Coucou, Dans un premier temps, je remarque que tu utilises le "!" devant le nom de tes variables dans ta fonction (command), ce qui est inutile car tu es dans une fonction :3 Si je comprend bien ta demande, tu veux simplement t'éviter de saisir les keyword "R" (pour "Référence") et "C" (pour "Copy"). Cela est un peu étrange étant donné que tu ne t'épargnes qu'une saisie clavier simple à l'instar des points p1, p2, p3 et p4 que tu dois spécifier à chaque fois mais bon ^^" En simplifiant l'écriture (pour s'éviter 150 variables), j'aurais ceci : (defun c:rotobj (/ jsel p1) (if (or (setq jsel (ssget "_I")) (setq jsel (ssget)) ) (command "_ROTATE" jsel "" (setq p1 (getpoint "\nSaisir le point de référence : ")) "C" "R" p1 (getpoint "\nSaisir l'angle de référence : ") (getpoint "\nSpécifier le nouveau point de rotation : " ) ) ) (princ) ) Si cela ne correspond pas à ta demande, alors c'est que je n'ai pas compris la demande :3 Bisous, Luna
-
Premier LISP : Rayon de l'arc reliant trois points
Luna a répondu à un(e) sujet de crashray dans Débuter en LISP
Coucou, Attention à la fonction (entsel), elle ne retourne pas uniquement le nom de l'entité sélectionnée. Elle retourne une liste dont le premier élément correspond au nom de l'entité sélectionnée et dont le second élément correspond au point (dans le SCU courant) que l'on a spécifié. Donc la plupart du temps on utilise (car (entsel)) sans se soucier du point. Tout dépend du type d'objet que tu utilises habituellement. Cette méthode est propre à une polyligne 3D, mais ne fonctionnera pas pour les objets "LWPOLYLINE" (les plus courantes) par exemple. La récupération des sommets peut s'effectuer directement à partir de la liste obtenue avec (entget) pour une "LWPOLYLINE". Etant donné que tu cherches à apprendre par toi-même, je te conseille de regarder la composition d'une liste (entget) pour l'objet que tu sélectionnes pour ton programme. S'il s'agit bien de polyligne 3D, alors la méthode ci-dessus devrait t'aider, autrement je te suggère de regarder du côté des fonctions (member), (assoc), (cdr) qui permettent déjà de manipuler correctement les listes comme on le souhaite. Il n'existe pas une seule méthode pour parvenir à un résultat, donc le plus simple est que tu trouves ta méthode qui te correspond, et tu l'amélioreras au fur et à mesure :3 PS : je te suggère également ce lien (un peu vieu mais complet) et celui ci pour une meilleure compréhension des codes DXF et il ne faut surtout pas hésiter à consulter l'aide AutoCAD sur les types d'objets que tu rencontres (par exemple l'aide sur les "LWPOLYLINE (DXF)" va beaucoup t'aider à progresser sur les listes DXF). Bisous, Luna
