Aller au contenu

VLA - intersectWith


arnaudalp

Messages recommandés

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

Lien vers le commentaire
Partager sur d’autres sites

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

 

amicalement

Vincent

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)

Lien vers le commentaire
Partager sur d’autres sites

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 -
Développements sur mesure pour AutoCAD
ADSK_Expert_Elite_Icon_S_Color_Blk_125.png

Lien vers le commentaire
Partager sur d’autres sites

Rebonjour

Merci 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 ?

Lien vers le commentaire
Partager sur d’autres sites

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

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é