De stuklijst (BOM — Bill of Materials) is het hart van elk Inventor-assembly. Via C# kun je de BOM volledig automatisch uitlezen, exporteren naar Excel of CSV, en er rapportages mee genereren. Dit artikel toont alles wat je nodig hebt voor professionele BOM-automatisering.
Hoe de BOM werkt in Inventor
Inventor heeft twee soorten BOM-weergaven: Structured (hiërarchisch, toont sub-assembly-niveaus) en Parts Only (enkel de bladonderdelen, geen sub-assemblies). Elke weergave heeft rijen (BOMRows) met kolommen die eigenschappen tonen zoals onderdeelnummer, beschrijving, aantal en massa.
BOM openen en rijen uitlezen
using Inventor;
using System.Runtime.InteropServices;
public void LeesStuklijst(AssemblyDocument asmDoc)
{
var bom = asmDoc.ComponentDefinition.BOM;
// Activeer de Parts Only weergave
bom.PartsOnlyViewEnabled = true;
bom.StructuredViewEnabled = true;
bom.StructuredViewFirstLevel = false; // toon alle niveaus
// Werk met Parts Only View
var bomView = bom.BOMViews["Parts Only"];
foreach (BOMRow rij in bomView.BOMRows)
{
LeesBomRij(rij);
}
}
private void LeesBomRij(BOMRow rij)
{
string ondNr = rij["Part Number"]?.ToString() ?? "";
string beschr = rij["Description"]?.ToString() ?? "";
string aantal = rij["Quantity"]?.ToString() ?? "";
string massa = rij["Mass"]?.ToString() ?? "";
string mat = rij["Material"]?.ToString() ?? "";
Console.WriteLine($"{ondNr,-20} {beschr,-30} Qty={aantal,-5} M={massa,-10} Mat={mat}");
// Geneste rijen (sub-assembly-onderdelen)
if (rij.ChildRows.Count > 0)
foreach (BOMRow kind in rij.ChildRows)
LeesBomRij(kind);
}
Eigen kolommen toevoegen aan de BOM
Via BOMView.AddCustomColumn voeg je eigen kolommen toe die je daarna kunt vullen:
// Voeg "Leverancier"-kolom toe
bomView.AddCustomColumn("Leverancier", "");
// Waarde instellen per rij
foreach (BOMRow rij in bomView.BOMRows)
{
// Zoek de occurrence op om iProperties te lezen
if (rij.ComponentOccurrences.Count > 0)
{
var occ = (ComponentOccurrence)rij.ComponentOccurrences[1];
var doc = (Document)occ.Definition.Document;
string leverancier = LeesProperty(doc, "Custom", "Leverancier");
rij["Leverancier"] = leverancier;
}
}
BOM exporteren naar CSV
public void ExporteerBomNaarCsv(AssemblyDocument asmDoc, string uitvoerPad)
{
var bomView = asmDoc.ComponentDefinition.BOM.BOMViews["Parts Only"];
var regels = new List();
// Koptekst
regels.Add("Onderdeelnummer,Beschrijving,Aantal,Massa (kg),Materiaal");
// Data
foreach (BOMRow rij in bomView.BOMRows)
{
string nr = rij["Part Number"]?.ToString() ?? "";
string desc = rij["Description"]?.ToString() ?? "";
string qty = rij["Quantity"]?.ToString() ?? "";
string mass = rij["Mass"]?.ToString() ?? "";
string mat = rij["Material"]?.ToString() ?? "";
// Escape voor CSV (aanhalingstekens als er komma's in zitten)
regels.Add($""{nr}","{desc}",{qty},{mass},"{mat}"");
}
File.WriteAllLines(uitvoerPad, regels, System.Text.Encoding.UTF8);
Console.WriteLine($"BOM CSV opgeslagen: {uitvoerPad}");
}
BOM exporteren naar Excel via interop
public void ExporteerBomNaarExcel(AssemblyDocument asmDoc, string uitvoerPad)
{
var bomView = asmDoc.ComponentDefinition.BOM.BOMViews["Parts Only"];
var excel = new Microsoft.Office.Interop.Excel.Application();
var wb = excel.Workbooks.Add();
var ws = (Microsoft.Office.Interop.Excel.Worksheet)wb.Worksheets[1];
// Koptekst
ws.Cells[1, 1] = "Onderdeelnummer";
ws.Cells[1, 2] = "Beschrijving";
ws.Cells[1, 3] = "Aantal";
ws.Cells[1, 4] = "Massa (kg)";
ws.Cells[1, 5] = "Materiaal";
int rij = 2;
foreach (BOMRow bomRij in bomView.BOMRows)
{
ws.Cells[rij, 1] = bomRij["Part Number"]?.ToString() ?? "";
ws.Cells[rij, 2] = bomRij["Description"]?.ToString() ?? "";
ws.Cells[rij, 3] = bomRij["Quantity"]?.ToString() ?? "";
ws.Cells[rij, 4] = bomRij["Mass"]?.ToString() ?? "";
ws.Cells[rij, 5] = bomRij["Material"]?.ToString() ?? "";
rij++;
}
wb.SaveAs(uitvoerPad);
wb.Close();
excel.Quit();
Marshal.ReleaseComObject(excel);
Console.WriteLine($"BOM Excel opgeslagen: {uitvoerPad}");
}
Structured vs Parts Only weergave
Gebruik Structured als je de assemblagehiërarchie wil bewaren (sub-assemblies als groepen). Gebruik Parts Only voor een vlakke inkoop- of fabricagelijst. In code schakel je tussen de weergaven via bom.BOMViews["Structured"] respectievelijk bom.BOMViews["Parts Only"].
Aantal per niveau berekenen
In een geneste assembly is het totale aantal van een onderdeel het product van het aantal op elk niveau. Inventor rekent dit voor je uit in de Parts Only-weergave — het Quantity-veld geeft al het gecombineerde totaal.
Onderdelen filteren op categorie
// Alleen metalen onderdelen tonen
foreach (BOMRow rij in bomView.BOMRows)
{
string mat = rij["Material"]?.ToString() ?? "";
if (mat.Contains("Steel") || mat.Contains("Aluminium") || mat.Contains("Staal"))
Console.WriteLine($"{rij["Part Number"]} — {mat}");
}
Veelgemaakte fouten
BOMView["Parts Only"] geeft een fout — de weergave moet eerst geactiveerd worden: stel bom.PartsOnlyViewEnabled = true in voor je de weergave opent.
Massa is 0 of leeg — massa wordt pas ingevuld als het materiaal correct is ingesteld in Inventor. Controleer de materiaalinstellingen van het onderdeel.
Kolomnamen zijn gelokaliseerd — de namen van BOM-kolommen (Part Number, Quantity) zijn afhankelijk van de taalinstelling van Inventor. Test je code op de doelinstallatie.
Samenvatting
Stuklijst-automatisering bespaart enorm veel tijd bij het aanmaken van inkoop- en fabricageoverzichten. Met de Inventor BOM-API lees je in een paar regels code alle onderdelen, aantallen, massa's en materialen uit en exporteer je ze naar CSV of Excel. Combineer dit met iProperty-uitlezing voor maximale flexibiliteit.
Comments
No comments yet — be the first!
Leave a comment
Sign in to skip moderation — anonymous comments are reviewed before appearing.