Aller au contenu

Intersection ligne / polyligne


Messages recommandés

Posté(e)

Bonjour,

 

Je suis a la recherche d'une fonction permettant de calculer l'intersection d'une ligne (en fait d'un point et d'un gisement) et d'une polyligne

 

Merci d'avance !

Posté(e)

Salut,

 

Si ta polyligne n'est constituée que de segments droits (pas d'arcs), tu peux utiliser la fonction inters.

Cette fonction requiert 5 arguments : 4 points et T ou nil pour spécifier si l'intersection est recherchée sur les segments ou sur les droites définies par les segments.

 

Il faut donc boucler avec inters pour chercher une intersection entre le segment défini par ton point (pt) et un point défini avec le gisement (en radians) : (polar pt gisement 1e+99) et chacun des segments de la polyligne.

 

Une autre méthode, en Visual LISP, qui fonctionne avec tous les objets graphiques (sauf les mailles polygonales et les fenêtres de présentation), consisterait à créer une demi droite à partir de ton point et du gisement et de rechercher les intersections avec la fonction vla-IntersectWith.

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

Posté(e)

Merci gile pour ta réponse.

 

en fait j'utilise déjà inters de cette manière mais parfois la polyligne contient des arcs et ça foire.

 

Je viens de me renseigner sur vla-IntersectWith ça a l'aire d'être exactement ce que je cherche.

 

Merci !

Posté(e)

Petites astuces avec vla-IntersectWith.

 

Certaines fonctions vla- retournent (ou requièrent comme argument) un variant (ou un safearray) qu'il faut souvent transformer en liste avec les fonctions vlax-variant-value et vlax-safearray->list (ou l'inverse avec vlax-make-variant, vlax-SafeArray-fill, vlax-make-SafeArray).

On peut parfois éviter ceci avec les fonctions vlax- équivalentes (voir ce sujet).

Par exemple :

(vlax-invoke obj1 'IntersectWith obj2 acExtendNone)

est équvalent à :

(vlax-safearray->list (vlax-variant-value (vla-intersectWith obj1 obj2 acExtendNone)))

 

Dans les deux cas la liste retournée n'est pas directement une liste de points mais une liste contenant toutes les coordonnées à la suite (x1 y1 z1 x2 y2 z2 ... xn yn zn)

 

Pour transformer ce type de liste en liste de points, j'utilise la routine suivante :

 

;;; 3d-coord->pt-lst Convertit une liste de coordonnées 3D en liste de points
;;; (3d-coord->pt-lst '(1.0 2.0 3.0 4.0 5.0 6.0)) -> ((1.0 2.0 3.0) (4.0 5.0 6.0))

(defun 3d-coord->pt-lst	(lst)
 (if lst
   (cons (list (car lst) (cadr lst) (caddr lst))
  (3d-coord->pt-lst (cdddr lst))
   )
 )
) 

 

Pour ce qui t'intéresse, quelques lignes en exemple :

 

;; Sélection de la polyligne
 (setq	obj (car (entsel "\Sélectionnez la polyligne: ")))

;; Transformation en vla-object
(setq	obj (vlax-ename->vla-object  obj))

;; Création d'une demi droite à partir du point (pt) et du gisement (gis)
(setq	line  (vla-addRay
      (vla-get-ModelSpace
	(vla-get-ActiveDocument
	  (vlax-get-acad-object)
	)
      )
      (vlax-3d-point pt)
      (vlax-3d-point (polar pt gis 1.0))
    )
)

;; Supprimer la ligne
(vla-delete line)

;; Liste des points d'intersections
(setq int (3d-coord->pt-list (vlax-invoke obj 'IntersectWith line acExtendNone))) 

 

[Edité le 27/4/2008 par (gile)]

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é