som Posté(e) le 20 décembre 2006 Posté(e) le 20 décembre 2006 salut à tous et bonne fête,je cherche une fonction ou des lignes de code en VB qui me permet de calculer la distance minimale entre deux polylines. a partir d'un programme en VB je dessine deux polyLines : polyLine1 et polyline2 (poly2 est à l'interieur du poly1) et je veux que mon programme VB me calcule la distance min entre les deux countours. merci pour l'aide et encore une fois bonne fête. :)
(gile) Posté(e) le 20 décembre 2006 Posté(e) le 20 décembre 2006 Salut, Je ne connais pas le VBA, mais si les deux polylignes sont parallèles ce petit LISP devrait faire l'affaire. (defun c:pl_dist (/ pl1 pl2) (vl-load-com) (if (and (setq pl1 (car (entsel "\nSélectionnez la permière polyligne: ")) ) (= (cdr (assoc 0 (entget pl1))) "LWPOLYLINE") (setq pl2 (car (entsel "\nSélectionnez la deuxième polyligne: ")) ) (= (cdr (assoc 0 (entget pl2))) "LWPOLYLINE") ) (print (off_dist pl1 pl2)) ) (princ) ) (defun off_dist (pl1 pl2) (foreach pl '(pl1 pl2) (set pl (vlax-ename->vla-object (eval pl))) ) (distance (vlax-curve-getPointAtParam pl1 0.5) (vlax-curve-getClosestPointTo pl2 (vlax-curve-getPointAtParam pl1 0.5) ) ) ) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
som Posté(e) le 20 décembre 2006 Auteur Posté(e) le 20 décembre 2006 salut,merci gil pour ta reponse, je vais essayer le code, mais si ca marche je ne sais pas comment recuperer la valeur retournée par lisp pour l'utiliser dans le code vb ? :)
Patrick_35 Posté(e) le 20 décembre 2006 Posté(e) le 20 décembre 2006 Par le biais des variables USERS1 à 5, USERI1 à 5 et USERR1 à 5Sans être un pro du vba, je crois avoir lu quelque chose du style ThisDrawing.Getvariable(USER..) @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
didier Posté(e) le 21 décembre 2006 Posté(e) le 21 décembre 2006 hello, à (Gile) :Si les polylignes sont parallèles !!!la distance mini, c'est quoi ? à Som :est ce que tes deux polylignes de contour ont le même nombre de sommets ?ou bien, sont-ce deux tracés radicalement différents ? et la distance mini, est ce celle de sommet à sommetou bien vraiment le plus petit passage entre les deux Polylignes ? amicalement. Éternel débutant... Mon site perso : Programmer dans AutoCAD
(gile) Posté(e) le 21 décembre 2006 Posté(e) le 21 décembre 2006 à (Gile) :Si les polylignes sont parallèles !!!la distance mini, c'est quoi ? J'ai eu les mêmes interrogations que toi, et si les ploylignes sont parallèles, c'est plus simple évidemment. La distance mini c'est celle mesurée perpendiculairement aux ploylignes, la distance de décalge, ou distance entre les ploylignes.Si les ploylignes ne sont pas parallèles ça se corse sérieusement. :casstet: Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
(gile) Posté(e) le 21 décembre 2006 Posté(e) le 21 décembre 2006 Devant la remarque pertinente de Didier, je propose un autre code. La distance retourné est la plus petite des distance entre chaque sommet d'une polyligne et l'autre polyligne.Donc si les polylignes n'ont que des segments droits le résultat devrait correspondre à la distance mini entre deux polyligne non parallèles.Si les polylignes contiennent des arcs, je ne suis pas sûr d'arriver à faire quelque chose. Edit : J'ai ajouté un contrôle sur les polylignes (pas d'arcs). La valeur trouvée est attribuée à la variable système USERR1 et affichée à la ligne de commande, donc en VBA on doit pouvoir faire un SendCommand min_dist et récupérer la valeur de USERR1. ;;; MIN_DIST Demande à l'utilisateur de sélectionner 2 polylignes et affiche ;;; la plus petite distance entre ces polylignes sur la ligne de commande (USERR1) (defun c:min_dist (/ pl1 pl2) (while (not (and (setq pl1 (car (entsel "\nSélectionnez la permière polyligne: ")) ) (straightplinep pl1) ) ) ) (while (not (and (setq pl2 (car (entsel "\nSélectionnez la deuxième polyligne: ")) ) (straightplinep pl2) ) ) ) (setvar "USERR1" (min_vtx_dist pl1 pl2)) (print (getvar "USERR1")) (princ) ) ;;; STRAIGHTPLINEP Evalue si une polyligne est composée uniquement de segments droits (defun straightplinep (pl) (and (= (cdr (assoc 0 (entget pl))) "LWPOLYLINE") (vl-every 'zerop (mapcar 'cdr (vl-remove-if-not '(lambda (x) (= (car x) 42)) (entget pl) ) ) ) ) ) ;;; MIN_VTX Retourne la plus petite distance entre deux polylignes (defun min_vtx_dist (pl1 pl2) (vl-load-com) (foreach pl '(pl1 pl2) (set pl (vlax-ename->vla-object (eval pl))) ) (apply 'min (append (mapcar '(lambda (x) (distance x (vlax-curve-getClosestPointTo pl2 x)) ) (2d-coord->pt-lst (vlax-get pl1 'Coordinates)) ) (mapcar '(lambda (x) (distance x (vlax-curve-getClosestPointTo pl1 x)) ) (2d-coord->pt-lst (vlax-get pl2 'Coordinates)) ) ) ) ) ;;; 2D-COORD->PT-LST Convertit une liste de coordonnées 2D en liste de points (defun 2d-coord->pt-lst (lst) (if lst (cons (list (car lst) (cadr lst) 0.0) (2d-coord->pt-lst (cddr lst)) ) ) ) [Edité le 21/12/2006 par (gile)] Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
som Posté(e) le 22 décembre 2006 Auteur Posté(e) le 22 décembre 2006 salut tous lemonde, et merci pour les reponses à didier :{ 1- les deux polylignes sont deux tracés radicalement différents, 2- la distance que je cherche est vraiment le plus petit passage entre les deux Polylignes.} j aimerai bien avoir un code en vb, je developpe en vb et je dessine sur autocad via le vb. PS : je cherche quelque chose comme la fonction qui calcule l'intersection entre deux poly : IntersectWith(poly,..),aulieu de intersect je veux distance entre deux poly :) et merci pour votre aide
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