mateus Posté(e) le 30 juin 2013 Posté(e) le 30 juin 2013 Bonjour à tous voilà j'ai un soucis pour récupérer les sommets d'une polyligne. Je m'explique ma polyligne est composée de deux sommets , j'arrive à récupérer le premier mais lorsque je mets un espion sur mon deuxième sommet "s2" ça me renvoit "nil". je vous mets ci-dessous mon bout de code : (defun c:ESSAI() (setq pt1 (getpoint"\n cliquer sur le premier point:")) (setq pt2 (getpoint"\n cliquer sur le 2eme point:")) (command "polylign" pt1 pt2 "") (setq poly1 (entlast)) (command "décaler" (getdist"\nvaleur de décalage du réseau") poly1 (getpoint "\nCliquer sur le côté du réseau") "") (setq nomEntité(cdar(entget(entlast)))) (setq s1(cdr (assoc 10(entget nomEntité)))) (setq s2(cdr (assoc 10(entget(entnext nomEntité))))) ) Merci par avance
(gile) Posté(e) le 30 juin 2013 Posté(e) le 30 juin 2013 Salut, Plusieurs choses:1. entlast retourne le nom d'entité (ENAME) de la dernière entité, donc pas besoin de faire :(setq nomEntité(cdar(entget(entlast))))2. entnext retourne le nom d'entité (ENAME) de l'entité suivant celle passée en argument.(entnext (entlast)) retournera toujours nil (pas d'entité suivant la dernière) sauf si entlast est une entité complexe (référence de bloc avec attribut, polyligne 2d ou 3d, maillage). La commande POLYLIGN (_PLINE) crée des entité de type LWPOLYLINE (polylignes optimisées) qui ne sont pas des entités complexes et contiennent tous leurs sommets dans liste DXF de l'entité.3. Plutôt que de faire 3 appels de la fonction entget, n'en faire qu'un et attribuer la liste résultante dans une variable. (setq nomEntité (entlast)) (setq listeDXF (entget nomEntité)) (setq s1 (cdr (assoc 10 listeDXF))) (setq s2 (cdr (assoc 10 (cdr (member (assoc 10 listeDXF) listeDXF))))) Ou encore, pour avoir tous les sommets (groupe DXF 10) d'une polyligne, tu peux utiliser une des nombreuses variantes de la fonction souvent appelée massoc (MultipleASSOC) en faisant :(setq sommets (massoc 10 listeDXF) avec foreach(defun massoc (key alst / ret) (foreach p alst (if (= (car p) key) (setq ret (cons p ret)) ) ) (reverse ret) ) avec while(defun massoc (key alst / ret) (while alst (if (= (caar alst) key) (setq ret (cons (car alst) ret)) ) (setq alst (cdr alst)) ) (reverse ret) ) avec vl-remove-if-not(defun massoc (key alst) (vl-remove-if-not '(lambda (x) (= (car x) key) ) alst ) ) avec append + mapcar(defun massoc (key alst) (apply 'append (mapcar '(lambda (x) (if (= (car x) key) (list x) ) ) alst ) ) ) avec repeat(defun massoc (key alst / ret) (repeat (length alst) (if (= (caar alst) key) (setq ret (cons (car alst) ret)) ) (setq alst (cdr alst)) ) (reverse ret) ) récursive(defun massoc (key alst) (if (setq alst (member (assoc key alst) alst)) (cons (car alst) (massoc key (cdr alst))) ) ) 1 Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
mateus Posté(e) le 30 juin 2013 Auteur Posté(e) le 30 juin 2013 Merci beaucoup Gile !! ça marche nettement mieux :)
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