Assembly-automatisering is een van de meest complexe maar ook meest waardevolle toepassingen van Inventor-programmering. Je kunt onderdelen toevoegen, verplaatsen, constraints instellen, supprimeren en vervangen — allemaal via C#. Dit artikel geeft je een volledig overzicht van de mogelijkheden.
AssemblyDocument en ComponentDefinition
Een assembly (AssemblyDocument) heeft een AssemblyComponentDefinition die alle ComponentOccurrences bevat. Elke occurrence is een verwijzing naar een onderdeel of sub-assembly, inclusief transformatiematrix en constraints.
Een assembly openen en onderdelen ophalen
using Inventor;
var app = (Application)Marshal.GetActiveObject("Inventor.Application");
var asmDoc = (AssemblyDocument)app.ActiveDocument;
var asmDef = asmDoc.ComponentDefinition;
// Alle top-level occurrences
foreach (ComponentOccurrence occ in asmDef.Occurrences)
{
Console.WriteLine($" {occ.Name} | {occ.DefinitionDocumentType}");
Console.WriteLine($" Bestand: {occ.ReferencedDocumentDescriptor.FullDocumentName}");
Console.WriteLine($" Gesupprimeerd: {occ.Suppressed}");
}
Een onderdeel toevoegen aan de assembly
public ComponentOccurrence VoegOnderdeelToe(
AssemblyDocument asmDoc, string iamPad, Matrix transform)
{
var asmDef = asmDoc.ComponentDefinition;
// Gebruik de identity-matrix als startpositie
if (transform == null)
{
transform = app.TransientGeometry.CreateMatrix();
// Identity: geen rotatie, geen translatie
}
var occurrence = asmDef.Occurrences.Add(iamPad, transform);
asmDoc.Update();
return occurrence;
}
// Oproep:
var t = app.TransientGeometry.CreateMatrix();
var occ = VoegOnderdeelToe(asmDoc, @"C:\Onderdelen\steun.ipt", t);
Occurrence verplaatsen en roteren
public void VerplaatsOccurrence(ComponentOccurrence occ, double x, double y, double z)
{
var tg = Application.TransientGeometry;
// Nieuwe transformatiematrix opbouwen
var matrix = tg.CreateMatrix();
// Translatie instellen
matrix.SetTranslation(tg.CreateVector(x, y, z), false);
occ.SetTransformation(matrix);
}
public void RoteerOccurrence(ComponentOccurrence occ, double hoekRad, Vector as_)
{
var tg = Application.TransientGeometry;
var matrix = occ.Transformation;
matrix.SetRotation(hoekRad, as_, tg.CreatePoint(0, 0, 0));
occ.SetTransformation(matrix);
}
Occurrence zoeken op naam
public ComponentOccurrence ZoekOccurrence(AssemblyComponentDefinition def, string naam)
{
foreach (ComponentOccurrence occ in def.Occurrences)
{
if (occ.Name == naam) return occ;
// Recursief door sub-assemblies
if (occ.DefinitionDocumentType == DocumentTypeEnum.kAssemblyDocumentObject)
{
var sub = ((AssemblyDocument)occ.Definition.Document).ComponentDefinition;
var gevonden = ZoekOccurrence(sub, naam);
if (gevonden != null) return gevonden;
}
}
return null;
}
Occurrence supprimeren en hersupprimeren
public void SupprimeerOccurrence(ComponentOccurrence occ, bool supprimeer)
{
occ.Suppressed = supprimeer;
((AssemblyDocument)occ.Parent.Document).Update();
}
// Alle occurrences van een bepaald onderdeel supprimeren:
foreach (ComponentOccurrence occ in asmDef.Occurrences)
{
if (Path.GetFileName(occ.ReferencedDocumentDescriptor.FullDocumentName) == "bout_m8.ipt")
occ.Suppressed = true;
}
asmDoc.Update();
Occurrence vervangen door een ander onderdeel
public void VervangOccurrence(ComponentOccurrence occ, string nieuwBestand)
{
occ.Replace(nieuwBestand, true); // true = sla op
((AssemblyDocument)occ.Parent.Document).Update();
}
Constraints toevoegen (mate/flush)
public void VoegMateConstraintToe(
AssemblyDocument asmDoc,
Face vlak1, Face vlak2,
double offset = 0.0)
{
var asmDef = asmDoc.ComponentDefinition;
asmDef.Constraints.AddMateConstraint(
vlak1, vlak2,
offset,
MateConstraintTypeEnum.kMateConstraint);
asmDoc.Update();
}
Alle occurrences met hun transformatie exporteren
Handig voor fabricagelijsten of positioneringsrapporten:
public void ExporteerPosities(AssemblyComponentDefinition def, string csvPad)
{
var regels = new List { "Naam,X,Y,Z,Bestand" };
foreach (ComponentOccurrence occ in def.Occurrences)
{
var t = occ.Transformation;
double x = t.Translation.X * 10; // cm → mm
double y = t.Translation.Y * 10;
double z = t.Translation.Z * 10;
regels.Add($"{occ.Name},{x:F2},{y:F2},{z:F2},{occ.ReferencedDocumentDescriptor.FullDocumentName}");
}
File.WriteAllLines(csvPad, regels, System.Text.Encoding.UTF8);
}
Veelgemaakte fouten
Occurrence.Name bevat soms een index — Inventor voegt automatisch een ":1", ":2" toe als hetzelfde onderdeel meerdere keren voorkomt. Zoek ook zonder suffix als je op naam zoekt.
Transformatiematrix in centimeters — net als parameters werkt Inventor intern in centimeters. Deel millimeterwaarden door 10 bij het instellen van translaties.
Update() vergeten na toevoegen/verplaatsen — roep altijd asmDoc.Update() aan na het toevoegen of wijzigen van occurrences.
Sub-assembly vs top-level — asmDef.Occurrences geeft alleen de top-level. Gebruik recursie voor diep geneste sub-assemblies.
Samenvatting
Assembly-automatisering in Inventor geeft je de mogelijkheid om complete productvarianten programmatisch te configureren: voeg onderdelen toe, positioneer ze, stel constraints in en exporteer de resultaten. De sleutelbouwstenen zijn ComponentOccurrences, de Matrix-klasse en AssemblyDocument.Update().
Comments
No comments yet — be the first!
Leave a comment
Sign in to skip moderation — anonymous comments are reviewed before appearing.