arnaudalp Posté(e) le 2 octobre 2017 Posté(e) le 2 octobre 2017 Bonjour Je cherche à écrire un lisp dans lequel je recherche les intersections d'une polyligne avec des faces 3d. J'essaye déja d'écrire mon programme avec une seule face. Je convertis ma polyligne en objet VLA ainsi que ma face 3d : (setq spol (vlax-ename->vla-object spol) sfac (vlax-ename->vla-object sfac) Je fais l'intersection : (setq rep (vla-IntersectWith spol sfac acExtendNone) Mais ensuite ?? J'obtiens un réseau double... et là, ben je ne sais pas quoi faire pour sortir ma liste.J'ai essayé avec "vlax-safearray->list" et les variantes mais rien n'y fait... Merci
zebulon_ Posté(e) le 2 octobre 2017 Posté(e) le 2 octobre 2017 (vlax-safearray->list (vlax-variant-value rep)) qui doit retourner une liste (x1 y1 z1 x2 y2 z2 ...) à noter que si on écrit la fonction sous cette forme(setq rep (vlax-invoke spol 'IntersectWith sfac acExtendNone)) on obtient directement une liste sans passer par des safearray et variant. Ce n'est pas directement une liste de points, mais une liste de coordonnées du même type que celle ci-dessus. après, il faut encore transformer (x1 y1 z1 x2 y2 z2...) en ((x1 y1 z1) (x2 y2 z2) ...) amicalementVincent C'est au pied du mur que l'on reconnaît le maçon ! (Anonyme) C’est en restant au pied du mur qu’on ne voit que le mur (Anonyme aussi)
(gile) Posté(e) le 2 octobre 2017 Posté(e) le 2 octobre 2017 Salut, Une petite routine extraite de AutomationHelpers.lsp sue cette page (en bas). ;; gc:3dVariantToPointList ;; Convertit un variant de coordonnées 3D en liste de points ;; Polyline dans le SCO (Z = 0) ;; 3DFace, 3DPolyline, Leader, MLine, PolyfaceMesh, ;; PolygonMesh, Solid, Trace dans le SCG ;; ;; Argument ;; var : un variant (array de doubles) tel que retourné par vla-get-Coordinates (defun gc:3dVariantToPointList (var / foo) (defun foo (lst) (if lst (cons (list (car lst) (cadr lst) (caddr lst)) (foo (cdddr lst))) ) ) (foo (vlax-safearray->list (vlax-variant-value var))) ) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
arnaudalp Posté(e) le 3 octobre 2017 Auteur Posté(e) le 3 octobre 2017 RebonjourMerci de vos réponse, or... ((defun c:test2() (setq spol (car(entsel)) sfac (car(entsel)) ) (setq spol (vlax-ename->vla-object spol) sfac (vlax-ename->vla-object sfac) ) (setq rep (vla-IntersectWith spol sfac acExtendNone) rep (vlax-safearray->list (vlax-variant-value rep)) ) ) me renvoit Le serveur ActiveX a renvoyé une erreur: Index non valide Interrogation qui me vient : la courbe croise ma face en 2D mais pas en 3D, ce que je souhaite c'est de connaître ma projection de la courbe à l'intersection XY et surtout Z projeté sur la face.Est-ce déjà la bonne solution de passer par intersectWith ?
zebulon_ Posté(e) le 3 octobre 2017 Posté(e) le 3 octobre 2017 peut être en changeant l'option de acExtend ? AmicalementVincent C'est au pied du mur que l'on reconnaît le maçon ! (Anonyme) C’est en restant au pied du mur qu’on ne voit que le mur (Anonyme aussi)
arnaudalp Posté(e) le 3 octobre 2017 Auteur Posté(e) le 3 octobre 2017 Avant de modifier l' AcExtend il faut déjà que j'enlève mon pb activeX :/
bonuscad Posté(e) le 3 octobre 2017 Posté(e) le 3 octobre 2017 Si j'ai compris le besoin!Peut être ceci ? Construit une 3Dpoly passant par les intersection d'une poly2D et les arrêtes d'une 3Dface. C'est sommaire et pas trop testé en profondeur. ((lambda ( ) (princ "\nChoisir la polyligne 2D") (setq js_lw (ssget "_+.:E:S" '((0 . "LWPOLYLINE")))) (cond (js_lw (setq dxf_lw (entget (ssname js_lw 0)) dxf_10 (mapcar 'cdr (vl-remove-if-not '(lambda (x) (= (car x) 10)) dxf_lw)) all_pt nil ) (while (cdr dxf_10) (setq p1 (car dxf_10) p2 (cadr dxf_10) js (ssget "_F" (list p1 p2) '((0 . "3DFACE"))) p1 (trans p1 1 0) p2 (trans p2 1 0) p1 (list (car p1) (cadr p1)) p2 (list (car p2) (cadr p2)) n -1 lst_px nil ) (cond (js (repeat (sslength js) (setq dxf_ent (entget (ssname js (setq n (1+ n)))) lst_pt (list (cdr (assoc 10 dxf_ent)) (cdr (assoc 11 dxf_ent)) (cdr (assoc 12 dxf_ent)) (cdr (assoc 13 dxf_ent)) ) ) (if (equal (caddr lst_pt) (cadddr lst_pt)) (setq lst_pt (list (car lst_pt) (cadr lst_pt) (caddr lst_pt) (car lst_pt))) (setq lst_pt (append lst_pt (list (car lst_pt)))) ) (while (cdr lst_pt) (setq px (inters p1 p2 (car lst_pt) (cadr lst_pt) T)) (if px (progn (setq px (inters (list (car px) (cadr px) 0.0) (list (car px) (cadr px) 100.0) (car lst_pt) (cadr lst_pt) nil)) (if px (setq lst_px (cons px lst_px)) ) ) ) (setq lst_pt (cdr lst_pt)) ) ) (if lst_px (setq all_pt (append lst_px all_pt)) ) ) ) (setq dxf_10 (cdr dxf_10)) ) (cond (all_pt (command "_.3dpoly") (foreach el all_pt (command "_none" (trans el 0 1))) (command "") ) (T (princ "\nAucune 3DFACE trouvée!")) ) ) ) (prin1) )) Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
arnaudalp Posté(e) le 3 octobre 2017 Auteur Posté(e) le 3 octobre 2017 C'est exactement ma problématique. Je vais tester le code, mais surtout essayer de la comprendre...
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