Aller au contenu

Accéder aux données des solides 3d (+ fonction LISP)


(gile)

Messages recommandés

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

Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

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

 

./__\.
(.°=°.)
Lien vers le commentaire
Partager sur d’autres sites

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

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é