Siemens NX CAM Blank Stock Expressions: Template and UFUNC Setup

David Krause12 min read
Other TopicSiemensTechnical Reference
Licensed PE Working through this on a live machine? A Maine-licensed engineer can take it from here — included with IMD hardware, by the hour for everything else. Book an engineer

Overview: NX CAM Blank Stock Fundamentals

In Siemens NX (formerly Unigraphics NX) CAM, the term Blank Stock refers to the modeled workpiece geometry that represents the material available for a machining operation. Blank stock is fundamental to toolpath simulation, material-removal verification, and IPW (In-Process Workpiece) generation. NX evaluates the stock against the tool geometry to compute material that still has to be removed, to detect gouges, and to simulate the resulting workpiece state after each CUT level.

Two distinct methods exist for placing blank stock inside an NX CAM operation tree:

  1. A template that contains a geometry group with the blank body, under which subsequent operations are organized.
  2. A User Function (UFUNC), a programmatic routine—typically written in C++, TCL, or another NX-supported language—that generates the blank, the drawing, and the NC program automatically.

The first method is procedural and configuration-driven; the second is programmatic and rules-driven. The choice between them is governed by part variety, change frequency, engineering throughput targets, and integration depth with PLM.

Terminology note. "Blank Stock" in NX CAM corresponds to "Restmaterial" in German-language documentation and "Stock" or "Workpiece" in the English NX UI. The expressions-driven blank model is the mechanism that lets you parameterize geometry against tool diameter, tool radius, modeling parameters, or boundary stock offsets.

Method 1: Template-Based Blank Stock Definition

The template approach builds a reusable CAM setup in which a geometry group carries the blank body. Operations underneath the geometry group inherit the blank definition. To build a template-based blank stock:

  1. Open Manufacturing → Create Operation and select the parent geometry group.
  2. From Geometry, choose Workpiece and select the blank body—either an explicit solid or a parameter-driven expression.
  3. Set Stock parameters: Initial Stock, Final Stock, and any per-side allowances.
  4. Define the Part Geometry and Check Geometry for collision verification.
  5. Save the operation tree as a Template Part (*.prt) for reuse across new parts.

When the template is instantiated on a new part, the expression-driven blank body evaluates against the new part parameters. This approach is best when:

  • The part family is small and well-defined.
  • The blank geometry can be expressed with simple expressions (length, width, height, offsets).
  • Fewer than ~50 unique parts per year require new CAM programs.
  • Tool selection and stock allowances vary modestly between parts.
Parameter Path in UI Typical Expression
Blank Length Workpiece → Geometry length = part_length + 2 * stock_allowance
Blank Width Workpiece → Geometry width = part_width + 2 * stock_allowance
Blank Height Workpiece → Geometry height = part_height + 1 * stock_allowance
Boundary Offset MILL_BOUND → Stock offset = tool_diameter * 0.1
Part Geometry Reference Part Geometry Linked solid body
Check Geometry Check Geometry Linked fixtures, clamps, clamps

Method 2: UFUNC Programmed User Function

NX is a highly open system. User Functions (UFUNC) expose the NX Open API for C++, Java, TCL, and Python (depending on NX release). A UFUNC for blank stock can automate the entire chain:

  1. Read the part dimensions from the model.
  2. Compute blank geometry from the part + stock allowance + tool-dependent rules.
  3. Generate the drawing automatically.
  4. Post-process the toolpath to NC code.

An illustrative UFUNC skeleton for blank creation in NX Open (C++):

// Illustrative NX Open C++ UFUNC skeleton: parameterized blank stock.
// Verify exact class names against your NX Open API reference.
#include <NXOpen/Part.hxx>

Tag_t CreateBlankStock(Part *part,
                       double partLength,
                       double partWidth,
                       double partHeight,
                       double allowance)
{
    // Compute blank envelope from part + per-side allowance
    double blockLength = partLength + 2.0 * allowance;
    double blockWidth  = partWidth  + 2.0 * allowance;
    double blockHeight = partHeight + allowance;

    // Construct block feature using NX Open builders
    // ... API call(s) here, e.g. block-feature builder equivalent ...

    // Attach the resulting body as the operation Workpiece
    // ... API call to set Workpiece geometry ...

    return tag;
}

For TCL scripting inside NX, a lighter version is appropriate:

# NX Open TCL UFUNC: parameter-driven blank envelope
proc create_blank { part_length part_width part_height allowance } {
    set bl [expr {$part_length + 2 * $allowance}]
    set bw [expr {$part_width  + 2 * $allowance}]
    set bh [expr {$part_height + $allowance}]
    return [list $bl $bw $bh]
}

UFUNC programs can also wrap the entire CAM operation creation chain, including tool selection, level sequencing, and post-processing. This is the route chosen by automotive and aerospace suppliers that must sustain hundreds of unique part numbers per year.

Cost-Benefit Analysis: Template vs UFUNC

Field experience shows that a full UFUNC—covering part generation, drawing, blank creation, toolpath, and NC code—can cost on the order of €50,000 to develop, test, and commission. This includes API integration, rule validation, and exception handling.

Compare that against the engineering hours required to maintain equivalent capability via templates and setups. If a template-driven workflow requires ~5 hours per new part and the engineer burdened cost is ~€80/hour, then approximately 125 parts consume €50,000 in labor. Beyond that breakeven, the UFUNC has lower total cost over its lifetime.

Metric Template Approach UFUNC Approach
Initial development Hours Months (≈ €50,000)
Per-part effort Hours (template instantiation) Seconds (one call)
Maintenance load Per part family Centralized in code
Tool-dependent parameters Manual re-entry per tool Driven by tool table rules
Drawings auto-generated Optional Yes (UFUNC chain)
Breakeven (typical) n/a ~125 parts (rough field estimate)
Time-to-equivalent spend ~10 years of templates Front-loaded
Best fit Small part variety High variety, repeat orders

The breakeven is a rough field-derived indicator. Actual breakeven depends on:

  • Number of distinct part numbers per year.
  • Frequency of engineering change orders.
  • Complexity of stock rules (multi-axis, multi-setup, multi-fixture).
  • Integration depth with PLM (Teamcenter), ERP, and shop-floor MES.

The original decision rule in shop-floor practice is straightforward: "Does it pay to invest €50,000 in a UFUNC for automatic part generation including drawing and NC program, or can I work for ~10 years with templates and setups before reaching the same cost?" This frames the question in workload terms rather than abstract ROI, and it forces the team to compare development effort against multi-year labor cost.

Tool-Dependent Parameters (NX5 and Later)

Prior to NX5, blank stock geometry and many CAM operation parameters were defined as fixed values per operation. Starting in NX5, several parameters became tool-dependent, meaning the operation can evaluate expressions that reference the active cutting tool.

This opened three practical use cases that previously required manual rework on each tool change:

  1. Cut depths based on tool diameter.
    // Expression: cut depth as function of tool diameter
    cut_depth_rough  = tool_diameter * 0.5
    cut_depth_finish = tool_diameter * 0.2
  2. Boundary Stock based on tool radius.
    // Expression: boundary stock offset, leaving finishing allowance
    boundary_stock = tool_radius + 0.1   // mm
  3. Stock driven by a modeling parameter.
    // Expression: blank thickness from a model attribute
    blank_height = model_param("raw_stock_mm")

By expressing the blank stock and related operation values as functions of the tool table, the CAM programmer ensures that changing a tool in the library propagates automatically to all dependent values—no manual re-entry required.

Compatibility note. Tool-dependent expressions were introduced in NX5. Earlier NX versions (NX4 and earlier) require either precomputed values or a UFUNC wrapper to achieve equivalent behavior. Always confirm release-specific syntax in the official documentation before production deployment.

Expression Examples for Blank Stock

The expressions that drive blank stock typically combine part dimensions, allowances, and tool geometry. The examples below show how a single stock model can be reused across multiple operations.

Use Case Expression Description
Cut depth by tool diameter cut_depth = tool_diameter * 0.5 50% of tool diameter for roughing passes
Stock by modeling parameter blank_thickness = model_param("rough_stock_allowance") Drives blank from a model attribute
Boundary stock offset boundary_stock = tool_radius + 0.1 Finishing allowance around part boundary
Multi-axis approach stock approach_stock = tool_length - holder_length + 5 Collision-aware approach clearance
Side allowance (per face) side_allowance = lookup("allowance_table", material) Material-specific lookup
Floor stock for finishing floor_stock = model_param("finish_floor_mm") Stock left for floor finishing pass
Per-side offset (XY) xy_allowance = side_allowance + tool_radius * 0.05 Combined allowance plus tool effect

Expressions are evaluated by the NX Expression Engine at operation creation, at regeneration, and—when marked as live—at toolpath generation. Always mark blank stock expressions as live if the operation should react to tool changes.

Decision Flow: Template vs UFUNC

The decision logic is short enough to map visually:

START: New CAM part family Variety > 50 unique parts / year AND tool-dependent rules required? YES → Build UFUNC ≈ €50,000 development cost C++ / TCL / Python via NX Open Breakeven ≈ 125 parts Auto drawings + NC output NO → Template + Setups ~5 h/part instantiation effort No programming required ~10 years before cost parity Suitable for low-variety parts

Implementing UFUNC for Blank Stock Automation

UFUNC implementation steps:

  1. Scope definition. List which part attributes the UFUNC reads (length, width, height, material, tolerance class).
  2. API selection. Choose NX Open (C++/Java) for compiled performance, or TCL/Python for rapid prototyping.
  3. Blank builder. Wrap the NX block-feature builder or generic curve/body construction.
  4. Tool library hook. Read tool geometry from the active tool library; pass it into the expression engine.
  5. Validation harness. Run against a sample of 10–20 parts; verify stock sizes, operation counts, and post output.
  6. Exception handling. Handle missing tool, missing material, undersized stock, oversized blank.
  7. PLM hook (optional). Release revision and metadata to Teamcenter for traceable history.

Beyond the blank builder itself, the UFUNC should expose hooks for:

  • Tool selection—read tool diameter, length, number of flutes from the library.
  • Level sequencing—emit ordered CUT levels with the corresponding expressions.
  • Post-processing—output NC code via the active post-builder.
  • Drawing generation—emit a fully dimensioned drawing automatically.

Verification and Commissioning

After the blank stock is created—either by template or UFUNC—verify with these checks:

  1. Geometric containment. Confirm the part geometry lies fully inside the blank body. NX provides this via the Verify Geometry dialog under Machining → Verify.
  2. Stock allowance on all sides. Toggle the display of the IPW after the first CUT level; confirm the visible allowance equals the expression value.
  3. Tool-dependent evaluation. Swap the tool in the tool library; regenerate the operation. The boundary stock and cut depth expressions should re-evaluate to the new values.
  4. Simulation. Run Tool Path Visualization with the 3D dynamic IPW enabled. Material removal should match the expected per-pass volume.
  5. Post output sanity check. Generate the NC code; verify that the Z-approach and Z-retract points respect the blank top surface.
  6. Cross-setup verification. For multi-setup parts, confirm that the blank defined in setup A correctly represents the as-machined state when setup B begins.
Commissioning tip. When migrating legacy templates to a UFUNC-driven workflow, keep the old templates active for one production cycle. Run both in parallel and diff the resulting IPW state at each CUT level. Any divergence indicates a missing rule in the UFUNC.

Common Pitfalls and Field-Proven Caveats

Symptom Likely Cause Fix
Boundary stock evaluates to zero Operation has no tool assigned; tool_radius reference unresolved Always validate expressions with the final tool selected before regenerate
NX warns about cutting past the blank Allowance smaller than roughing cut depth UFUNC should reject allowances below the minimum roughing step
Setup B blank misalignment Stock not regenerated after WCS rotation Force regenerate stock body after each WCS transformation
Same expression, two values Scope collision between operations Use unique names like rough_stock_op10, finish_stock_op20
Expressions stale after library sync Tool table edited outside NX (e.g. Teamcenter) Force regenerate after library synchronization
Tool diameter referenced as 0 Tool created without diameter parameter Validate tool library completeness before building UFUNC rules
Drawing misses blank dimension Drawing template predates UFUNC; drawing auto-gen not enabled Enable drawing auto-generation in the UFUNC chain

Integration with PLM and Shop Floor

Once the blank stock method is decided and validated, integrate it with the surrounding toolchain:

  1. Teamcenter. Release the template or UFUNC artifacts as controlled revisions; track who changed the stock allowance rules and why.
  2. CAM workflow. Bind template instantiation to a release state; UFUNCs to a build state.
  3. DNC distribution. Verify the post-processed NC code references the same blank envelope as the simulation; any mismatch indicates a stale post-builder configuration.
  4. MES feedback. Capture actual material removed at each setup; reconcile with the predicted IPW to refine allowance tables.

Best Practices and Field Notes

  • Prefer live expressions for any value tied to a tool. Static values defeat the purpose of the NX5 tool-dependent machinery.
  • Centralize allowance tables. A single CSV or part-attribute table should drive material-specific stock values; avoid hard-coding them inside operation parameters.
  • Document the cost decision. When choosing template over UFUNC, document the expected part volume. Review the decision annually against actual throughput.
  • Test on representative geometry. A UFUNC validated only on prismatic parts may fail on turned, 5-axis, or freeform parts. Cover the full geometry envelope before release.
  • Keep UFUNC source under version control. Git or Teamcenter revision control for the C++/TCL/Python sources is mandatory once the UFUNC is the production path.
  • Train CAM programmers on the expression syntax. Templates are forgiving; UFUNC-driven CAM requires precise understanding of model_param(), lookup(), and tool reference syntax.
  • Lock the tool library. Disallow direct edits to the library outside the controlled release process; otherwise expressions silently drift.
  • Audit regenerate time. If UFUNC-driven regeneration exceeds the project time budget, profile the expression engine and cache non-dependent values.

For teams standardized on Siemens tooling, the official documentation is the primary reference for current UFUNC syntax and operation semantics. Confirm behavior against the specific NX release in use before commissioning any of the patterns described above. See Siemens Software Support and Siemens Xcelerator documentation for the latest API references.

FAQ

What is the simplest way to add blank stock to a new NX CAM operation?

Create a template containing a geometry group with the blank body, then drop operations underneath that geometry group. This requires no programming and works on every NX version from NX4 onward.

When does a UFUNC for blank stock become more cost-effective than a template?

Field-derived rule of thumb: a €50,000 UFUNC breaks even against a 5-hour-per-part template workflow at roughly 125 unique parts per year, or roughly 10 years of template-driven labor. Below that volume, templates are usually cheaper; above it, the UFUNC pays back.

Which NX release introduced tool-dependent blank stock expressions?

NX5 introduced tool-dependent parameters, allowing expressions such as boundary_stock = tool_radius + 0.1 to re-evaluate automatically when the active tool changes. NX4 and earlier require manual re-entry or a UFUNC wrapper to achieve equivalent behavior.

Which programming languages are supported for NX UFUNC development?

NX Open supports C++, Java, TCL, and Python depending on the release. C++ and Java are preferred for compiled performance; TCL and Python are useful for prototyping and lighter integration scripts.

How do I verify that a template-driven blank stock is correct?

Use Machining → Verify → Geometry to confirm the part fits inside the blank, enable 3D dynamic IPW during tool path visualization to inspect stock per CUT level, and swap a tool in the library to verify expression re-evaluation.

Back to blog