BOM Manager
The BOM Manager lets you view, edit, and export your assembly’s Bill of Materials directly from the CADshift panel. It combines a navigable assembly tree, a fully editable BOM grid with formula columns, and a weldment cut optimization tool.
Opening the BOM Manager
- Open an Assembly document in SOLIDWORKS
- Click the CADshift tab in the Command Manager ribbon
- Click the BOM Manager
button
The BOM Manager window opens with three tabs: Assembly, BOM, and Weldment Cutlist.
Assembly Tab
The Assembly tab shows your assembly structure as a searchable tree.
Features
- Search — Type in the search bar to filter nodes by name
- Node selection — Click any node to sync selection to the BOM tab
- Export — Save the assembly tree as PDF, HTML, or CSV using the export buttons
BOM Tab
The BOM tab is a fully editable grid showing all components and their properties.
Manage Columns
Click Manage Columns to choose which columns are visible and reorder them by dragging. Built-in columns include:
- Type — Component icon (Assembly, Part, Sheet Metal, Weldment, or Toolbox)
- Thumbnail — Component preview image
- Name — Component file name
- Quantity
— Number of instances - Material, Description, and any custom SOLIDWORKS properties
Add Custom Column
Adds a static text column with a default value you specify. You can then edit individual cells.
Add Formula Column
Adds a calculated column where each cell is computed from other columns in the same row. See Formula Reference below for full details.
Drag-Fill
Select a cell, then drag the small square at the bottom-right corner of the selection downward to copy the value to rows below.
Formula Reference
Formula columns let you compute values per row using data from other columns. Click the
fx button or press F2 to open the formula editor with syntax highlighting.
Basics
| Concept | Syntax | Example |
|---|---|---|
| Start a formula | = prefix | =[Quantity] * 2 |
| Reference a column | [ColumnName] | =[Mass], =[Material] |
| String literal | Single or double quotes | 'text' or "text" |
| Number literal | Integer or decimal | 42, 3.14 |
| Parentheses | Group expressions | ([Mass] + 10) * [Quantity] |
Column references are case-insensitive and always refer to the current row.
Arithmetic Operators
| Operator | Description | Example |
|---|---|---|
+ | Add (or concatenate if either side is text) | =[Quantity] + 5 |
- | Subtract | =[Length] - 10 |
* | Multiply | =[Mass] * [Quantity] |
/ | Divide (division by zero returns 0) | =[Total] / [Count] |
- (unary) | Negate a value | =-[Offset] |
Standard math precedence applies: * and / are evaluated before + and -. Use parentheses to override.
Comparison Operators
Use comparison operators to test values. They return true or false and are commonly used inside
IF() conditions.
| Operator | Description | Example |
|---|---|---|
= or == | Equal to | [Material] = "Steel" |
<> or != | Not equal to | [Quantity] <> 0 |
< | Less than | [Mass] < 10 |
> | Greater than | [Length] > 1000 |
<= | Less than or equal | [Quantity] <= 5 |
>= | Greater than or equal | [Mass] >= 100 |
Functions
All function names are case-insensitive. Arguments are separated by commas.
Logical Functions 
| Function | Arguments | Description | Example |
|---|---|---|---|
IF(condition, true_val [, false_val]) | 2–3 | Returns true_val when condition is true, otherwise false_val (or false if omitted) | IF([Quantity] > 0, "Active", "None") |
AND(cond1, cond2, ...) | 1+ | True only if all conditions are true | AND([Qty] > 0, [Mass] > 5) |
OR(cond1, cond2, ...) | 1+ | True if any condition is true | OR([Material] = "Steel", [Material] = "Aluminum") |
NOT(condition) | 1 | Inverts a boolean value | NOT([Quantity] = 0) |
IFERROR(value, fallback) | 2 | Returns value normally; returns fallback if the expression produces an error | IFERROR([Total] / [Count], 0) |
Nesting IF statements
IF inside IF for multi-branch logic:
=IF([Qty] > 10, "Bulk", IF([Qty] > 0, "Standard", "None"))Lookup Functions 
Lookup functions search across rows in the BOM to find and return values from other rows. Unlike most formulas that only see the current row, lookups can access the entire table.
| Function | Arguments | Description |
|---|---|---|
VLOOKUP(value, lookup_col, return_col [, exact]) | 3–4 | Search lookup_col for value, return the matching cell from return_col. Set exact to false for approximate match (nearest ≤). Default: exact. |
HLOOKUP(value, lookup_row, return_row [, exact]) | 3–4 | Search across columns in lookup_row (1-based index) for value, return the cell at return_row. |
XLOOKUP(value, lookup_col, return_col [, not_found] [, match_mode]) | 3–5 | Flexible lookup with configurable match mode and custom not-found value. |
XLOOKUP match modes:
| Mode | Description |
|---|---|
0 | Exact match (default) |
-1 | Exact match or next smaller value |
1 | Exact match or next larger value |
2 | Wildcard match (* and ? patterns) |
Examples:
=VLOOKUP([Material], "Material", "Cost Per Kg")
Find the current row’s material in the “Material” column and return the corresponding “Cost Per Kg”.
=XLOOKUP([Part Number], "Part Number", "Description", "Not found")
Look up a part number and return its description, or “Not found” if no match.
=XLOOKUP("Steel*", "Material", "Name", "", 2)
Wildcard search for materials starting with “Steel”.
Aggregate Functions
These functions scan across all rows to compute totals or counts based on criteria.
| Function | Arguments | Description | Example |
|---|---|---|---|
COUNTIF(column, criteria) | 2 | Count rows where column matches criteria | COUNTIF("Material", "Steel") |
SUMIF(column, criteria, sum_column) | 3 | Sum values from sum_column for rows where column matches criteria | SUMIF("Material", [Material], "Mass") |
Criteria syntax — criteria can use comparison operators as a prefix string:
| Criteria | Matches |
|---|---|
"Steel" | Exact match |
">100" | Greater than 100 |
"<=50" | Less than or equal to 50 |
"<>0" | Not equal to zero |
=SUMIF("Material", [Material], "Mass")
Sum of Mass for all rows that share the same Material as the current row.
FOR Loop
| Function | Arguments | Description |
|---|---|---|
FOR(variable, start, end, expression) | 4 | Iterate variable from start to end (inclusive), evaluating expression each time. Returns the sum of all iterations when all results are numeric. |
=FOR("i", 1, 5, [Quantity] * i)
Evaluates [Quantity] * i for i = 1 through 5 and returns the sum.
Math Functions
| Function | Arguments | Description | Example |
|---|---|---|---|
abs(x) | 1 | Absolute value | abs(-5) → 5 |
round(x [, decimals]) | 1–2 | Round to N decimal places (default: 0) | round(3.146, 2) → 3.15 |
floor(x) | 1 | Round down to integer | floor(3.9) → 3 |
ceil(x) | 1 | Round up to integer | ceil(3.1) → 4 |
min(a, b, ...) | 1+ | Smallest value | min([L], [W], [H]) |
max(a, b, ...) | 1+ | Largest value | max([L], [W]) |
Trigonometric Functions
| Function | Arguments | Description | Example |
|---|---|---|---|
sin(x) | 1 | Sine (input in radians) | sin(1.5708) → 1 |
cos(x) | 1 | Cosine (input in radians) | cos(0) → 1 |
tan(x) | 1 | Tangent (input in radians) | tan(0.7854) → 1 |
String Functions
| Function | Arguments | Description | Example |
|---|---|---|---|
concat(a, b, ...) | 1+ | Join values as text | concat([Name], ' - ', [Material]) |
upper(text) | 1 | Convert to UPPERCASE | upper([Material]) |
lower(text) | 1 | Convert to lowercase | lower([Name]) |
replace(text, old, new) | 3 | Replace all occurrences | replace([Name], ' ', '_') |
truncate(text [, length]) | 1–2 | Limit text to N characters | truncate([Description], 50) |
Type Handling
- Numeric operations: non-numeric text is treated as
0 - String concatenation:
+joins as text when either side is a string value that cannot be parsed as a number - Null / empty values: treated as
0in math, empty string in text operations - Boolean values:
trueandfalsefrom comparisons can be used inIF(),AND(),OR(), andNOT()
Formula Examples
=[Mass] * [Quantity]
Total mass for the row.
=IF([Quantity] > 10, "Bulk", "Standard")
Label rows as “Bulk” or “Standard” based on quantity.
=IF(AND([Mass] > 5, [Material] = "Steel"), "Heavy Steel", "Other")
Combine conditions to classify components.
=VLOOKUP([Material], "Material", "Cost Per Kg") * [Mass]
Look up material cost and calculate total cost for the row.
=XLOOKUP([Part Number], "Part Number", "Supplier", "Unknown")
Find the supplier for a part number, with a fallback if not found.
=COUNTIF("Material", [Material])
Count how many rows share the same material.
=SUMIF("Material", [Material], "Mass")
Total mass of all rows with the same material.
=IFERROR([Total] / [Count], 0)
Safe division that returns 0 instead of an error.
=concat([Part Number], ' - ', [Description])
Combine part number and description with a separator.
=round([Mass], 2)
Round mass to two decimal places.
=([Length] * [Width]) / 1000000
Area in square meters (if dimensions are in mm).
Limitations
- No date/time functions
- A formula column cannot reference itself or other formula columns
Weldment Cutlist Tab
The Weldment Cutlist tab appears when your assembly contains weldment components.
Cut Optimization
Click Run Cut Optimization to group cutlist items by profile and material, then calculate optimal bar usage:
- Groups pieces by matching profile key and material
- Fits pieces into stock bar lengths using a bin-packing algorithm
- Shows waste per stock piece so you can minimize material cost
Stock Data (Inventory File)
You can load custom stock lengths from an Excel (.xlsx / .xls) or CSV file via the Stock Settings dialog. This tells the cut optimizer what bar lengths you have available.
Required Columns
| Column | Description | Example |
|---|---|---|
ProfileKey | Profile identifier matching your cutlist items. Built from SOLIDWORKS cutlist properties joined with a pipe | character (see below). | ANSI|L PROFILE|L 2 x 2 x 0.25 |
StockLength | Available bar length in millimeters. Must be a positive number. | 6000 |
How ProfileKey is built: Only non-empty SOLIDWORKS properties are included, so the number of segments varies:
- 3 segments (Standard + Type + Size):
ANSI|L PROFILE|L 2 x 2 x 0.25 - 2 segments (Type + Size, when Standard is empty):
C|4x2.5 - 1 segment (Size only, when Standard and Type are empty):
50 x 50 x 3
Matching is case-insensitive and ignores extra whitespace, so ISO|SHS|50 x 50 x 3 and iso|shs|50x50x3 are treated the same.
Copy the ProfileKey from the report
Optional Columns
| Column | Description | Default |
|---|---|---|
Material | Material name. When present, stock is matched by both profile and material, so you can set different lengths for the same profile in different materials. | Ignored if omitted |
Quantity | Number of bars in stock. | Unlimited if omitted |
File Format Rules
- Columns can appear in any order
- The header row is auto-detected in the first 5 rows
- Column names are case-insensitive
- The same
ProfileKeycan appear on multiple rows with different stock lengths
CSV Example
ProfileKey,Material,StockLength,Quantity
ANSI|L PROFILE|L 2 x 2 x 0.25,Steel,6000,10
ANSI|L PROFILE|L 2 x 2 x 0.25,Aluminum,6000,5
C|4x2.5,Clear PVC,6000,25
ISO|SHS|50 x 50 x 3,,6000,25
ISO|SHS|50 x 50 x 3,,3000,5
DIN|IPE|IPE 200,,12000,8
ISO|RHS|100 x 50 x 4,,6000,
Resolution Priority
When resolving stock length for a profile, the system checks in this order:
- Inventory file (if enabled and profile found)
- Per-profile override (set in Stock Settings)
- Global default length (set in Stock Settings)
- Fallback: 6000 mm
Template File
Exporting the BOM
From the Assembly or BOM tab you can export data in three formats:
| Format | Description |
|---|---|
| Formatted table suitable for printing or sharing | |
| HTML | Web-ready table you can open in a browser |
| CSV | Comma-separated values for Excel or ERP import |
Tips
- Drag column headers to reorder columns in the grid
- Double-click a cell to edit its value inline
- Use Manage Columns to hide properties you do not need
- Formula columns update automatically when source values change
- The component Type icon column helps you quickly identify assemblies, parts, sheet metal, weldments, and toolbox items at a glance
- Previous
- Equation Driven Points