Skip to main content
View as Markdown

Working with bills of materials

The BOM engine creates and manages the bill of materials (BOM) of a project or document and its parameters. Its entry point is the IBomManagerFactory, returned by EDP.Utils.GetBomManagerFactory().

Getting a BOM​

The BOM is an IBomManager, or an IActiveBomManager for an ActiveBOM document. The factory creates it:

Source of componentsCall
A document (schematic, PCB or BomDoc)factory.GetManagerForDocument(document)
A schematic or BomDoc, with a PCB document as an additional source of PCB parametersfactory.GetManagerForDocumentPcb(document, pcbDocument)
A whole projectfactory.GetManagerForProject(project)
A whole project, with a PCB document as an additional source of PCB parametersfactory.GetManagerForProjectPcb(project, pcbDocument)

To find out which kind of manager you have, cast it:

IBomManagerFactory factory = EDP.Utils.GetBomManagerFactory();
IBomManager bomManager = factory.GetManagerForProject(project);
var activeBomManager = bomManager as IActiveBomManager; // null unless the source is an ActiveBOM document

Reading the BOM​

The rows of the BOM are the components of its schema:

IBomComponentList rows = bomManager.GetSchema().GetComponents();

A row can be a group of several components. Check with IsGroup() and get the group's components with AsGroup().GetComponents().

The column values of a row are in its parameter dictionary, an IBomParameterDictionary:

IBomParameterDictionary parameters = row.GetParameters();
if (parameters.TryGetParameter("Comment", out IBomParameter comment))
{
// ...
}

The dictionary also reads values directly, with GetStrValue and GetIntValue.

All columns (parameters) of the BOM are in its schema:

IBomParameterDefinitionList columns = bomManager.GetSchema().GetParameterDefinitions();

An ActiveBOM document can define column aliases (custom column names) and custom columns. Custom columns are in the same parameter definition list as the generated columns; to get them separately, and to read the aliases, use the ActiveBOM options:

string aliases = activeBomManager.GetOptions().GetColumnsAliases();
var customColumns = activeBomManager.GetOptions().GetCustomColumns();

The aliases are one string: |-separated pairs, each pair =-separated.

Configuring the BOM​

The BOM is configured through its options, IBomManagerOptions, or IActiveBomManagerOptions for ActiveBOM:

IBomManagerOptions options = bomManager.GetOptions();
ViewSettings
Flat (one row per component)options.SetAutoGroup(false); options.SetGroupOrder(""); and, for ActiveBOM, SetMultiVariant(false)
Consolidatedoptions.SetAutoGroup(true); options.SetGroupOrder(""); and, for ActiveBOM, SetMultiVariant(true)

Sorting is set with SetSortOrder and SetAutoSort.

The options are shared with the rest of Altium Designer. Save them before changing them and restore them when you are done, so other BOMs are not affected:

object savedState = options.GetState();
try
{
// configure the options and read the BOM
}
finally
{
options.RestoreState(savedState);
}

Changing an ActiveBOM document​

Line numbers can be set for ActiveBOM only, on the catalog item of a row:

string catalogId = row.GetParameters().GetStrValue("%CATALOGID%");
IActiveBomCatalog catalog = activeBomManager.GetCatalog();
IActiveBomCatalogItem catalogItem = catalog.FindItem(catalogId);
catalogItem.SetLineNumber("10");

A custom row is added to the catalog:

IActiveBomCatalogItem customRow = activeBomManager.GetCatalog().AddCustomRow();
customRow.SetComment("...");
customRow.SetDescription("...");
customRow.SetLineNumber("...");

After changing line numbers or adding rows, call bomManager.UpdateSchema(...) to rebuild the BOM schema (this recreates the whole schema).

To save the ActiveBOM document (*.BomDoc) after a change, save its server document:

IServerDocument serverDocument = document.DM_ServerDocument();
serverDocument.DoFileSave(document.DM_DocumentKind());