Aller au contenu

Fonctions tri liste de points


chris_mtp

Messages recommandés

Bonjour à tous,

 

J'ai un dessin avec des blocs qui contiennent un attribut et de nombreuses polylignes 2D.

J'ai fait un lisp qui m'extrait la liste des sommets d'une polyligne en cliquant avec la liste de tous les blocs de mon dessin.

J'aimerais contrôler que sur chaque sommet de ma polyligne cliqué, il y ait un bloc.

Par conséquent, je souhaiterais une fonction qui me dise si

un point de coordonnées (x y z) est bien ou non présent dans la liste de tous mes blocs, liste du type ((x1 y1 z1) (x2 y2 z2) (x3 y3 z3) .... (xn yn zn) .....)

 

J'arrive à faire un contrôle tout simple avec la fonction member mais j'ai l'impression qu'Autocad tient compte de nombreux chiffres après virgule à 0.000000000001 de la position de mes blocs alors que je voudrais faire un contrôle au décimillimètres, soit à 0.0001 pas plus.

 

Je suis bloqué à cet endroit pour finir mon lisp.

 

Merci par avance de votre aide.

John

 

[Edité le 12/2/2010 par chris_mtp]

Lien vers le commentaire
Partager sur d’autres sites

salut chris_mtp,

 

ton problème est un problème inhérent à l'informatique en générale :

le codage des réels.

 

Exemple tout simple de différence des coordonnées alors qu'il ne devrait pas y en avoir :

trace une ligne, et avec le mode accrochage aux extrémités trace une autre allant ou partant

de la première ligne.

Récupère les 4 points, deux sont normalement égaux, et bien dans la majorité des cas non ...

 

Il faut faire une comparaison avec un mapcar et equal et un epsilon.

la mapcar pour parcourir une liste de points 3D, equal pour comparer deux points

et l'epsilon pour la marge d'erreur :

(setq p_test '(Xp Yp Zp)
         p_list '((X1 Y1 Z1) ... (Xn Yn Zn))
) 
(mapcar '(lambda (p_tmp)
                        (equal p_test p_tmp 1e-4)
              )
              p_list
)

 

un truc dans ce genre.

 

Voilà, à toi de coder ta fonction

Tous pour lisp, Lisp pour tous!

Avec Revit, cela ne vas trop vite...

Lien vers le commentaire
Partager sur d’autres sites

Bonjour bseb67

 

Merci tout d'abord pour ta réponse.

Mais j'au du mal a comprendre ta fonction.

Elel me retourne une liste composé de nil alors que mon but est d'avoir une fonction qui me retourne nil ou T.

j'ai du mal a coder une telle fonction

 

Si tu étayer un peu , merci encore.

 

John

 

 

Lien vers le commentaire
Partager sur d’autres sites

Pour mon exemple, un mapcar renvoie une liste de résultats.

 

Comme mon résultat et t ou nil car j'effectue un simple test avec equal,

donc on peut avoir ce genre de résultat :

'(nil nil nil ... nil nil)

ou

'(nil nil t ... t nil nil t) => dans ce cas, le point est présent plusieurs fois

 

pour savoir si tu as eu au moins une fois un t, donc que le point p_test est contenu dans p_list

il suffit d'ajouter un (apply 'or )

 

(apply 'or (mapcar '(lambda (p_tmp)
		(equal p_test p_tmp 1e-4)
	   ) ; lambda
	   p_list
) ; mapcar
) ; apply

 

Pour la fonction à (gile), euh chez moi ca me renvoie nil...

 

Mais tu peux faire une version récursive, qui elle sera plus lente

 

(defun member-fuzz-67 (expr lst fuzz)
(or (equal expr (car lst) fuzz) (and lst (member-fuzz-67 expr (cdr lst) fuzz)))
)

 

 

 

 

Tous pour lisp, Lisp pour tous!

Avec Revit, cela ne vas trop vite...

Lien vers le commentaire
Partager sur d’autres sites

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é