famaice Posté(e) le 9 janvier 2018 Posté(e) le 9 janvier 2018 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
(gile) Posté(e) le 9 janvier 2018 Posté(e) le 9 janvier 2018 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
cafougnette Posté(e) le 9 janvier 2018 Posté(e) le 9 janvier 2018 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 centrefin = depart + 2*ecart
famaice Posté(e) le 9 janvier 2018 Auteur Posté(e) le 9 janvier 2018 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
lecrabe Posté(e) le 9 janvier 2018 Posté(e) le 9 janvier 2018 Hello Gilles YES Autodesk ne communique pas sur le module 3D SOLID ! Et y a t-il la même limitation en DotNet ou en ARX ?? Bye, lecrabe Autodesk Expert Elite Team
(gile) Posté(e) le 9 janvier 2018 Posté(e) le 9 janvier 2018 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
(gile) Posté(e) le 9 janvier 2018 Posté(e) le 9 janvier 2018 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). 1 Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
famaice Posté(e) le 10 janvier 2018 Auteur Posté(e) le 10 janvier 2018 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
famaice Posté(e) le 11 janvier 2018 Auteur Posté(e) le 11 janvier 2018 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
(gile) Posté(e) le 11 janvier 2018 Posté(e) le 11 janvier 2018 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... 1 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