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

  1. Open an Assembly document in SOLIDWORKS
  2. Click the CADshift tab in the Command Manager ribbon
  3. 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

ConceptSyntaxExample
Start a formula= prefix=[Quantity] * 2
Reference a column[ColumnName]=[Mass], =[Material]
String literalSingle or double quotes'text' or "text"
Number literalInteger or decimal42, 3.14
ParenthesesGroup expressions([Mass] + 10) * [Quantity]

Column references are case-insensitive and always refer to the current row.

Arithmetic Operators

OperatorDescriptionExample
+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.

OperatorDescriptionExample
= 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

FunctionArgumentsDescriptionExample
IF(condition, true_val [, false_val])2–3Returns 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 trueAND([Qty] > 0, [Mass] > 5)
OR(cond1, cond2, ...)1+True if any condition is trueOR([Material] = "Steel", [Material] = "Aluminum")
NOT(condition)1Inverts a boolean valueNOT([Quantity] = 0)
IFERROR(value, fallback)2Returns value normally; returns fallback if the expression produces an errorIFERROR([Total] / [Count], 0)

Nesting IF statements

You can nest 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.

FunctionArgumentsDescription
VLOOKUP(value, lookup_col, return_col [, exact])3–4Search 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–4Search 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–5Flexible lookup with configurable match mode and custom not-found value.

XLOOKUP match modes:

ModeDescription
0Exact match (default)
-1Exact match or next smaller value
1Exact match or next larger value
2Wildcard 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.

FunctionArgumentsDescriptionExample
COUNTIF(column, criteria)2Count rows where column matches criteriaCOUNTIF("Material", "Steel")
SUMIF(column, criteria, sum_column)3Sum values from sum_column for rows where column matches criteriaSUMIF("Material", [Material], "Mass")

Criteria syntax — criteria can use comparison operators as a prefix string:

CriteriaMatches
"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

FunctionArgumentsDescription
FOR(variable, start, end, expression)4Iterate 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

FunctionArgumentsDescriptionExample
abs(x)1Absolute valueabs(-5) → 5
round(x [, decimals])1–2Round to N decimal places (default: 0)round(3.146, 2) → 3.15
floor(x)1Round down to integerfloor(3.9) → 3
ceil(x)1Round up to integerceil(3.1) → 4
min(a, b, ...)1+Smallest valuemin([L], [W], [H])
max(a, b, ...)1+Largest valuemax([L], [W])

Trigonometric Functions

FunctionArgumentsDescriptionExample
sin(x)1Sine (input in radians)sin(1.5708) → 1
cos(x)1Cosine (input in radians)cos(0) → 1
tan(x)1Tangent (input in radians)tan(0.7854) → 1

String Functions

FunctionArgumentsDescriptionExample
concat(a, b, ...)1+Join values as textconcat([Name], ' - ', [Material])
upper(text)1Convert to UPPERCASEupper([Material])
lower(text)1Convert to lowercaselower([Name])
replace(text, old, new)3Replace all occurrencesreplace([Name], ' ', '_')
truncate(text [, length])1–2Limit text to N characterstruncate([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 0 in math, empty string in text operations
  • Boolean values: true and false from comparisons can be used in IF(), AND(), OR(), and NOT()

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

ColumnDescriptionExample
ProfileKeyProfile 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
StockLengthAvailable 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

In the Cut Optimization report, each group header shows a clickable ID value. Click it to copy the exact ProfileKey to your clipboard, then paste it into your inventory file.

Optional Columns

ColumnDescriptionDefault
MaterialMaterial 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
QuantityNumber 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 ProfileKey can 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:

  1. Inventory file (if enabled and profile found)
  2. Per-profile override (set in Stock Settings)
  3. Global default length (set in Stock Settings)
  4. Fallback: 6000 mm

Template File

Click Open Stock Inventory Template in the Help dialog or Stock Settings to generate a fresh CSV template with sample rows. Replace the sample data with your own stock, save the file anywhere, then point Stock Settings to it.

Exporting the BOM

From the Assembly or BOM tab you can export data in three formats:

FormatDescription
PDFFormatted table suitable for printing or sharing
HTMLWeb-ready table you can open in a browser
CSVComma-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
CADshift

Start typing to search the documentation

↑↓ to navigate Enter to select