chris_mtp Posté(e) le 12 février 2010 Posté(e) le 12 février 2010 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]
bseb67 Posté(e) le 12 février 2010 Posté(e) le 12 février 2010 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 partantde 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 pointset 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...
chris_mtp Posté(e) le 12 février 2010 Auteur Posté(e) le 12 février 2010 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
(gile) Posté(e) le 12 février 2010 Posté(e) le 12 février 2010 Salut, ;;; MEMBER-FUZZ Comme MEMBER avec une tolérance dans la comparaison (defun member-fuzz (expr lst fuzz) (while (and lst (not (equal expr (car lst) fuzz))) (setq lst (cdr lst)) ) ) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
bseb67 Posté(e) le 12 février 2010 Posté(e) le 12 février 2010 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_listil 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...
(gile) Posté(e) le 12 février 2010 Posté(e) le 12 février 2010 Pour la fonction à (gile), euh chez moi ca me renvoie nil... :casstet: _$ (member-fuzz '(1.00005 1.99999 3.00009) '((0 0 0) (1 2 3) (4 5 6)) 0.0001)((1 2 3) (4 5 6)) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
chris_mtp Posté(e) le 12 février 2010 Auteur Posté(e) le 12 février 2010 Merci bseb67 et Gile mais j'ai pu m'en sortir avec les fonctions de gile un peu plus simple à gérer.J'ai essayé tout de même les fonctions de bseb qui marchent très bien mais plus diffcile à adapter. Merci encore.John.
bseb67 Posté(e) le 12 février 2010 Posté(e) le 12 février 2010 Oups, désolé (gile), me suis trompé dans l'appel de la fonction lors de mon test ;) Elle fonctionne. chris_mtp : je ne vais pas faire le jaloux ;) Tous pour lisp, Lisp pour tous!Avec Revit, cela ne vas trop vite...
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