Aller au contenu

distance min entre deux polylines


som

Messages recommandés

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

Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

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 à sommet

ou bien vraiment le plus petit passage entre les deux Polylignes ?

 

amicalement.

Lien vers le commentaire
Partager sur d’autres sites

à (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

Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

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

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é