Aller au contenu

Comment récupérer les coordonnées d'un cylindre 3D en LISP ?


famaice

Messages recommandés

Bonjour et Bonne Année à tous B)

 

Je souhaites développer une petite routine Lisp qui me permettrait de générer la ligne d'axe de chaque entité cylindrique 3D (dans un premier temps) présent dans un dessin. Mon but est de retrouver la fibre neutre d'un cylindre (représentant un tronçon droit de tuyauterie).

 

Ma première question est comment obtenir les coordonnées XYZ des points de départ et d'arrivée d'une entité "cylindre" en LISP ? J'avoue que je patauge un peu avec les codes DXF pour les objets 3D. <_<

 

Cdt,

 

Fabrice

""Nous avons un avenir et il sera fait de nos rêves si nous avons le courage de bousculer les idées reçues" - S. HONDA

Lien vers le commentaire
Partager sur d’autres sites

Salut,

 

Autodesk a toujours été très avare en ce qui concerne les données des solides 3d (surtout en LISP).

En "pur AutoLISP" tu n'auras rien.

Avec "Visual LISP" tu peux récupérer les coordonnées de la Position et du Centroid des cylindres uniquement s'ils ont été créés avec la commande CYLINDRE (ne fonctionne pas avec un cercle extrudé). partant de là, tu peux dessiner l'axe (voir ci-dessous)

Avec la fonction gc-Brep (dans LispExtension sur cette page) tu peux récupérer les contours des solides, surfaces et régions, mais il faudra analyser les résultats (voir ici).

 

;; DrawCylinderAxis
;; Dessine une ligne à l'axe d'un cylindre
;; Fonctionne uniquement avec les solides créés avec la commande CYLINDRE
;; Argument : ename ou vla-object
;; Retour : ename ou vla-object de la ligne (en fonction du type de l'argument) ou nil
(defun DrawCylinderAxis	(cyl / en p1 ce p2 ob)
 (vl-load-com)
 (if (= (type cyl) 'ename)
     (setq en	T
    cyl	(vlax-ename->vla-object cyl)
     )
 )
 (if
   (and
     (= (vla-get-ObjectName cyl) "AcDb3dSolid")
     (= (vla-get-SolidType cyl) "Cylindre")
   )
    (progn
      (setq p1	(vlax-get cyl 'position)
     ce	(vlax-get cyl 'centroid)
     p2	(mapcar '+ ce (mapcar '- ce p1))
     ob
	(vla-Addline
	  (vla-ObjectIdToObject
	    (vla-get-Activedocument (vlax-get-acad-object))
	    (vla-get-OwnerId cyl)
	  )
	  (vlax-3d-point p1)
	  (vlax-3d-point p2)
	)
      )
      (if en
 (vlax-vla-object->ename ob)
 ob
      )
    )
 )
)

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

Lien vers le commentaire
Partager sur d’autres sites

Bonjour,

(gile) a été plus rapide et plus détaillé.

 

(vl-load-com)

(setq Ent (entsel "\nCommand: Select a solid : " ) )

(setq Obj (vlax-ename->vla-Object (car Ent )) )

(vlax-dump-object Obj)

(setq eType (vlax-get Obj "solidType"))

(setq volume (vlax-get Obj "Volume"))

(setq debut (vlax-get Obj "Position"))

(setq centre (vlax-get Obj "Centroid"))

(setq hauteur (* 2 (distance debut centre)))

(setq rayon (sqrt (/ (vla-get-Volume Obj) (* pi hauteur))))

 

Mesurer l'ecart (deltaX deltaY deltaZ) entre debut et centre

fin = depart + 2*ecart

Lien vers le commentaire
Partager sur d’autres sites

Hello Gile et Cafougnette et meilleurs vœux pour 2018,

 

Merci mais J'ai pô d'chance. :huh:

Mes cylindres sont justement des cylindres ou des surfaces cylindriques (générés à partir de nuage de points grâce à ce magnifique plugin gratuit disponible sur Autocad Exchange : "Point Cloud features extraction").

Je continue de creuser et je vous tiens au jus quand j'aurais déterré quelque chose (Vive l'archéologie numérique !!!).

 

Fabrice

""Nous avons un avenir et il sera fait de nos rêves si nous avons le courage de bousculer les idées reçues" - S. HONDA

Lien vers le commentaire
Partager sur d’autres sites

Comme je disais, en .NET il y a l'API BREP (Boundary REPresentation) qui permet d'en savoir un peu plus (voir ce sujet). Mais l'analyse des contours ne permet pas toujours facilement de reconstituer le solide.

Avec des cylindres, c'est relativement facile, on doit trouver deux cercles de même rayon et direction d'extrusion. Les centres de ces cercles définissent l'axe du cylindre.

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

Lien vers le commentaire
Partager sur d’autres sites

Par exemple l'expression :

(gc-brep (car (entsel)))

quand on sélectionne un cylindre (ou un cercle extrudé) de centre (10 20 0) de rayon 50 et de hauteur 50 (sur l'axe Z), retourne a liste :

("COMPLEX"
 ("SHELLEXTERIOR"
   ("FACE"
     ("LOOPEXTERIOR"
((0 . "CIRCLE")
  (100 . "AcDbEntity")
  (100 . "AcDbCircle")
  (10 10.0 20.0 50.0)
  (40 . 5.0)
  (210 0.0 0.0 1.0)
)
     )
     ("LOOPEXTERIOR"
((0 . "CIRCLE")
  (100 . "AcDbEntity")
  (100 . "AcDbCircle")
  (10 10.0 20.0 0.0)
  (40 . 5.0)
  (210 0.0 0.0 1.0)
)
     )
   )
   ("FACE"
     ("LOOPEXTERIOR"
((0 . "CIRCLE")
  (100 . "AcDbEntity")
  (100 . "AcDbCircle")
  (10 10.0 20.0 50.0)
  (40 . 5.0)
  (210 0.0 0.0 1.0)
)
     )
   )
   ("FACE"
     ("LOOPEXTERIOR"
((0 . "CIRCLE")
  (100 . "AcDbEntity")
  (100 . "AcDbCircle")
  (10 10.0 20.0 0.0)
  (40 . 5.0)
  (210 0.0 0.0 1.0)
)
     )
   )
 )
)

On voit 3 faces : la surface de révolution (deux contours) et les deux bases circulaires (un contour par face coïncidant avec un contour de la surface de révolution).

  • Upvote 1

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

Lien vers le commentaire
Partager sur d’autres sites

Hello,

Bon premier retour.

A priori de ce que j'ai lu, ce serait jouable en .NET via C#

(Prévoyez l'aspirine... c'est en English technique ! :P )

 

Je reprends ma pelle et je retourne à la mine ! ;)

 

A plus,

 

Fabrice

""Nous avons un avenir et il sera fait de nos rêves si nous avons le courage de bousculer les idées reçues" - S. HONDA

Lien vers le commentaire
Partager sur d’autres sites

Bien le bonjour,

 

J'ai eu confirmation par Lee Mac que la solution la moins contraignante serait de passer par .NET/ActiveX

 

Hi Fabrice,

 

Thank you for your courriel.

 

Very little information pertaining to 3D Solids is exposed to the LISP API: you can only obtain information using ActiveX properties & methods, as the DXF data for solids simply contains multiple strings of encrypted data, and the ActiveX properties vary depending upon whether the solid is a primitive or not.

 

If a LISP solution is specifically required, in the past I have resorted to exploding a copy of the 3D Solid and iterating over the resulting components to determine the properties, but this is far from ideal.

 

I hope this helps in some way.

 

Kind Regards,

 

Lee

 

Lee Mac Programming

 

lee@lee-mac.com | www.lee-mac.com

 

Je reviens vers vous dés que j'ai qqchose de probant (du moins avec mon niveau d'expertise :blink:)

Cordialement,

""Nous avons un avenir et il sera fait de nos rêves si nous avons le courage de bousculer les idées reçues" - S. HONDA

Lien vers le commentaire
Partager sur d’autres sites

Si on parle bien de solides 3d, j'ai donné par deux fois dans mes réponses précédentes un lien vers un sujet en français sur CADxp qui montre comment récupérer les données de contour en .NET. On trouvera dans ce sujet un lien vers le plugin LsipExtension qui contient, entre autres, la fonction LISP gc-brep qui permet de récupérer ces données (CF réponse #7).

 

Je connais Lee Mac mais là je pense qu'il se trompe en parlant de possibilité avec ActiveX. s'il y en avait, elles auraient été exploitée depuis longtemps en VBA ou Visual LISP...

  • Upvote 1

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

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é