Aller au contenu

Messages recommandés

Posté(e)

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

Posté(e)

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)))
 )
)

  • Upvote 1

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

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 compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.

Connectez-vous maintenant
×
×
  • Créer...

Information importante

Nous avons placé des cookies sur votre appareil pour aider à améliorer ce site. Vous pouvez choisir d’ajuster vos paramètres de cookie, sinon nous supposerons que vous êtes d’accord pour continuer. Politique de confidentialité