(gile) Posté(e) le 25 août 2011 Posté(e) le 25 août 2011 Salut, Accéder aux données des Solides 3d (mais aussi des Régions et des Surfaces) est quelque chose qui est souvent demandé, mais qui restait (très) difficile à faire en programmation (hors ObjectARX, bien sûr). Avec le SDK de la version 2009 (je sais, je suis en retard...), un nouvel espace de nom a été ajouté : Autodesk.AutoCAD.BoundaryRepresentation dans lequel on trouve des classes qui permettent d'accéder à certaines données des solides, régions, surfaces, corps. Ces données sont organisées en arborescence pour une entité. La classe Brep est le plus haut niveau permettant d'accéder aux niveaux inférieurs. On initialise une instance de Brep avec une entité (un solide 3d par exemple). Un objet Brep peut contenir un ou plusieurs objets Complex (un solide ou une région peut être constitué de plusieurs solides ou régions séparés). Chaque Complex peut contenir un ou plusieurs objets Shell (coquille, enveloppe en français). Ces objets peuvent être de différents types (ShellExterior, ShellInterior ou ShellUnclassified) et peuvent contenir un ou plusieurs objets Face. Chaque objet Face peut contenir un ou plusieurs objets Loop (boucle) qui peuvent être de types différents (LoopExterior (périphérique), LoopInterior ('trou' dans une face), LoopWinding (surface conique) ou LoopUnclassified) Chaque Loop contient à son tour un ou plusieurs objets Edge (arrêtes). Ces objets Edge peuvent être convertis en Curve3d et nous révéler des informations géométriques intéressantes. Il reste des manques, les sphères et les tores ne révèlent rien au delà du niveau Face et les arrêtes ne révèlent leur secrets que si ce sont des lignes ou des arcs circulaires ou elliptiques, rien (encore) pour les splines. Le petit programme suivant définit : - une commande : DUMPBREP qui affiche dans la fenêtre de texte cette arborescence pour l'entité sélectionnée - une fonction LISP (gc-brep) qui retourne une liste de liste imbriquées avec pour chaque Edge une liste type DXF suffisante pour reconstruire l'arrête Un exemple de retour simple avec une région : rectangle de 0,0 à 80,50 avec un trou circulaire de centre 20,30 et de rayon 10. Nouvelle version : fonctionne désormais avec les arrêtes de type Spline. Retour de la commande DUMPBREP Complex N°1 |_ Shell N°1 Type : ShellExterior |_ Face N°1 |_ Loop N°1 Type : LoopInterior |_ Edge N°1 Type : CircularArc |_ StartPoint : (30,30,0) |_ EndPoint : (30,30,0) |_ StartAngle : 0 |_ EndtAngle : 6.28318530717959 |_ Center : (20,30,0) |_ Radius : 10 |_ Loop N°2 Type : LoopExterior |_ Edge N°1 Type : LineSegment |_ StartPoint : (0,0,0) |_ EndPoint : (80,0,0) |_ Edge N°2 Type : LineSegment |_ StartPoint : (80,0,0) |_ EndPoint : (80,50,0) |_ Edge N°3 Type : LineSegment |_ StartPoint : (80,50,0) |_ EndPoint : (0,50,0) |_ Edge N°4 Type : LineSegment |_ StartPoint : (0,50,0) |_ EndPoint : (0,0,0) Retour de la fonction LISP (gc-brep (entlast)) : ("COMPLEX" ("SHELLEXTERIOR" ("FACE" ("LOOPINTERIOR" ((0 . "CIRCLE") (10 -20.0 30.0 0.0) (40 . 10.0) (210 0.0 0.0 -1.0))) ("LOOPEXTERIOR" ((0 . "LINE") (10 0.0 0.0 0.0) (11 80.0 0.0 0.0)) ((0 . "LINE") (10 80.0 0.0 0.0) (11 80.0 50.0 0.0)) ((0 . "LINE") (10 80.0 50.0 0.0) (11 0.0 50.0 0.0)) ((0 . "LINE") (10 0.0 50.0 0.0) (11 0.0 0.0 0.0)) ) ) ) ) Un petit LISP pour tester gc-brep qui redessine les arrêtes à partir des données récupérées. (defun drawBrep (lst / foo) (defun foo (lst) (foreach shell (cdr lst) (foreach face (cdr shell) (foreach loop (cdr face) (foreach edge (cdr loop) (entmake edge) ) ) ) ) ) (if (listp (car lst)) (foreach complex lst (foo complex) ) (foo lst) ) ) (defun c:brep () (drawBrep (gc-brep (car (entsel)))) (princ) ) gc-Brep est dans LispExtension téléchargeable sur cette page. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
(gile) Posté(e) le 26 août 2011 Auteur Posté(e) le 26 août 2011 J'ai apporté quelques modifications :- Meilleur test pour évaluer si l'objet CircularArc3d décrit un cercle (gc-brep).- Suppression de la clé "EDGE" (superflue) dans les sous listes les plus imbriquées (gc-brep).- Modification de la routine drawBrep en conséquence. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Tramber Posté(e) le 26 août 2011 Posté(e) le 26 août 2011 Drôlement intéressant !Et l'on voit qu'il y a un paquet de niveaux de constrution.... Du temps du modeleur ACIS, Eric nous avait dégoté la routine qui éclaircissait un peu les infos géométriques d'un solide. C'était un peu intelligible, mais là, il y a toute une logique expliquée. Pour tes routines, ca fait un vrai bilan par face. Elles marchent bien sur 2010. Bureau d'études dessin. Spécialiste Escaliers Développement - Formation ./__\. (.°=°.)
(gile) Posté(e) le 26 août 2011 Auteur Posté(e) le 26 août 2011 Salut, Je me doutais que ça t'intéresserait. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
(gile) Posté(e) le 27 août 2011 Auteur Posté(e) le 27 août 2011 Re, Après quelques tests sur des solides complexes, j'ai eu des "erreurs fatales".Ceci est dû à un oubli de ma part je ne libérais pas les ressources de l'objet Brep.C'est réparé dans le nouveau téléchargement. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
(gile) Posté(e) le 29 août 2011 Auteur Posté(e) le 29 août 2011 J'ai ajouté quelques améliorations : - Fonctionne désormais avec les arrêtes de type Spline. - Ajout d'une méthode (WriteBrepToXml) pour écrire les données dans un fichier Xml, et d'une commande (XMLBREP) qui appelle cette méthode. Exemple de fichier Xml généré par WriteBrepToXml avec la même région que ci-dessus : <?xml version="1.0"?> <Brep> <Region Handle="2747"> <Complex> <Shell Type="ShellExterior"> <Face> <Loop Type="LoopInterior"> <CircularArc3d StartPoint="(30,30,0)" EndPoint="(30,30,0)" Center="(20,30,0)" Radius="10" StartAngle="3.14159265358979" EndAngle="9.42477796076938" Normal="(0,0,-1)" /> </Loop> <Loop Type="LoopExterior"> <LineSegment3d StartPoint="(0,0,0)" EndPoint="(80,0,0)" Direction="(1,0,0)" /> <LineSegment3d StartPoint="(80,0,0)" EndPoint="(80,50,0)" Direction="(0,1,0)" /> <LineSegment3d StartPoint="(80,50,0)" EndPoint="(0,50,0)" Direction="(-1,0,0)" /> <LineSegment3d StartPoint="(0,50,0)" EndPoint="(0,0,0)" Direction="(0,-1,0)" /> </Loop> </Face> </Shell> </Complex> </Region> </Brep> Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Tramber Posté(e) le 29 août 2011 Posté(e) le 29 août 2011 groovy avec les splines ! :cool: Bon "décortiquage" Bureau d'études dessin. Spécialiste Escaliers Développement - Formation ./__\. (.°=°.)
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