Occurrences et transformations
Mise à jour : 03 décembre 2024
Aperçu
Un document d'assemblage peut comporter une ou plusieurs inclusions, qui peuvent provenir de différents documents. Chaque inclusion peut être positionnée différemment en fonction des opérations qu'elle a subies.
Note
Il est possible de récupérer le document de définition d'une occurrence présente dans un document d'assemblage à partir de son opération d'inclusion :
DocumentId inclusionDefDocument = TopSolidDesignHost.Assemblies.GetInclusionDefinitionDocument(operation);
Ce diagramme illustre la logique relationnelle entre les occurrences "source" et "définition" :
La "source" représente l'occurrence précédente, tandis que la "définition" représente la première occurrence.
Il est également possible d'accéder aux transformations associées au positionnement final de l'entité résultante à partir d'une opération d'inclusion dans le document courant, à la fois à partir des occurrences "source" et "définition" :
ElementId child = TopSolidDesignHost.Assemblies.GetInclusionChildOccurrence(operation); Transform3D transformDefinition = TopSolidHost.Geometries3D.GetOccurrenceDefinitionTransform(child); Transform3D transformSource = TopSolidHost.Geometries3D.GetOccurrenceSourceTransform(child);
Cette transformation peut ensuite être utilisée à des fins telles que l'identification d'éléments géométriques remarquables.
Exemple de code avec commentaires :
La méthode suivante recherche les croquis présents dans les inclusions d'un document d'assemblage et génère les points associés dans ledit document en utilisant la transformation associée. Deux comportements sont mis en évidence : l'inclusion d'un document de type pièce et l'inclusion d'un document de type assemblage. Dans ce dernier cas, deux transformations sont appliquées successivement. Naturellement, dans un scénario similaire, une méthode récursive devrait être codée pour traiter tous les niveaux d'assemblage potentiels.
Cet exemple a été construit sur la base d'un tel scénario :
Dans ce cas, il est nécessaire de naviguer vers le document de pièce contenant l'esquisse et d'appliquer les transformations nécessaires pour la récupérer et l'intégrer avec précision dans le document d'assemblage de premier niveau.
Vérifiez si un document est ouvert et confirmez qu'il s'agit du type d'assemblage: :
DocumentId currentDoc = TopSolidHost.Documents.EditedDocument; if (currentDoc.IsEmpty) return; if (!TopSolidHost.Documents.GetTypeFullName(currentDoc).Contains("AssemblyDocument")) return;
Récupérer toutes les opérations du document et filtrer par type d'inclusion :
List<ElementId> operations = TopSolidHost.Operations.GetOperations(currentDoc); foreach (ElementId operation in operations) { if (!TopSolidHost.Elements.GetTypeFullName(operation).Contains("InclusionOperation")) continue;
Extraire l'occurrence enfant, le document de définition et la transformation associée :
ElementId child = TopSolidDesignHost.Assemblies.GetInclusionChildOccurrence(operation); Transform3D transform = TopSolidHost.Geometries3D.GetOccurrenceDefinitionTransform(child); DocumentId inclusionDefDocument = TopSolidDesignHost.Assemblies.GetInclusionDefinitionDocument(operation);
Si l'inclusion est une occurrence d'un autre assemblage, extraire la transformation additionnelle :
Transform3D transformAdditional = Transform3D.Identity; if (TopSolidDesignHost.Assemblies.IsAssemblyOccurrence(child)) { List<ElementId> parts = TopSolidDesignHost.Assemblies.GetParts(inclusionDefDocument); foreach (ElementId part in parts) { ElementId parentOpe = TopSolidHost.Elements.GetParent(part); if (TopSolidHost.Elements.GetParent(part) != ElementId.Empty) { if (TopSolidDesignHost.Assemblies.IsInclusion(parentOpe)) { inclusionDefDocument = TopSolidDesignHost.Assemblies.GetInclusionDefinitionDocument(parentOpe); transformAdditional = TopSolidHost.Geometries3D.GetOccurrenceDefinitionTransform(part); } } } }
Initier les modifications du document actuel :
try { TopSolidHost.Application.StartModification("sketch to points", false); TopSolidHost.Documents.EnsureIsDirty(ref currentDoc);
Récupérer les points d'esquisse du document de définition de l'inclusion :
//gets sketch points from inclusion definition document ElementId sketch = TopSolidHost.Sketches2D.GetSketches(inclusionDefDocument).FirstOrDefault(); if (!sketch.IsEmpty) { List<ElementItemId> vertices = TopSolidHost.Sketches2D.GetVertices(sketch); int indexPoint = 0; foreach (ElementItemId vertex in vertices) { Point2D point2D = TopSolidHost.Sketches2D.GetVertexPoint(vertex); Point3D point3D = new Point3D(point2D.X, point2D.Y, 0); SmartDirection3D dirX = new SmartDirection3D(Direction3D.DX, point3D); SmartDirection3D dirY = new SmartDirection3D(Direction3D.DY, point3D);
Pour chaque point d'esquisse, créer le point correspondant dans le document courant et lui attribuer un nom :
ElementId pointCreated = TopSolidHost.Geometries3D.CreatePoint(currentDoc, point3D); if (pointCreated.IsEmpty) continue; TopSolidHost.Elements.SetName(pointCreated, "Point_" + indexPoint);
Créer un point de décalage correspondant (avec une valeur de zéro) pour générer une opération de transformation réelle :
ElementId pointCreated = TopSolidHost.Geometries3D.CreatePoint(currentDoc, point3D); if (pointCreated.IsEmpty) continue; TopSolidHost.Elements.SetName(pointCreated, "Point_" + indexPoint);
Appliquer la transformation au point de résultat, en distinguant deux cas :
- L'occurrence de l'assemblage
if (TopSolidDesignHost.Assemblies.IsAssemblyOccurrence(child)) { ElementId pointCreatedTransformed1 = TopSolidHost.Entities.Transform(offsetPoint, transformAdditional); if (pointCreatedTransformed1.IsEmpty) continue; TopSolidHost.Elements.SetName(pointCreatedTransformed1, "SketchPointTransformed1_" + indexPoint); ElementId pointCreatedTransformed = TopSolidHost.Entities.Transform(offsetPoint, transform); TopSolidHost.Elements.SetName(offsetPoint, "SketchPointTransformed2_" + indexPoint); }
- Occurrence de la pièce
else { ElementId pointCreatedTransformed1 = TopSolidHost.Entities.Transform(offsetPoint, transform); if (pointCreatedTransformed1.IsEmpty) continue; TopSolidHost.Elements.SetName(pointCreatedTransformed1, "SketchPointTransformed1_" + indexPoint); }
Finalisez la modification et terminez l'itération sur la boucle :
indexPoint++; } } TopSolidHost.Application.EndModification(true, true); } catch (Exception ee) { TopSolidHost.Application.EndModification(false, false); } }