Back to blog
Assemblies beheren met C# in Inventor

Assemblies beheren met C# in Inventor

David De Lombaerde David De Lombaerde · juli 10, 2026 · 16 min read

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-levelasmDef.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().

Share this article

LinkedIn WhatsApp X

Comments

No comments yet — be the first!

Leave a comment

Sign in to skip moderation — anonymous comments are reviewed before appearing.