pingoo666 Posté(e) le 27 avril 2008 Posté(e) le 27 avril 2008 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 !
(gile) Posté(e) le 27 avril 2008 Posté(e) le 27 avril 2008 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
pingoo666 Posté(e) le 27 avril 2008 Auteur Posté(e) le 27 avril 2008 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 !
(gile) Posté(e) le 27 avril 2008 Posté(e) le 27 avril 2008 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
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