Transitioning from Model Override Surfaces to Machine Avoid Surface Groups

This guide helps CAM API developers move from the legacy Model Override surface selector to the Machine Avoid Surface Groups table introduced in Fusion 360 CAM (October 2022, CAM-39723).

Model override (overrideModel, model, includeSetupModel) is scheduled for deprecation. Surface assignment for 3D toolpaths is consolidating into the machine avoid geometry table (checkSurfaceSelectionSets).


Summary

Legacy (Model Override) Current (Machine Avoid Surface Groups)
Parameter model checkSurfaceSelectionSets
API value type CadObjectParameterValue CadMachineAvoidGroupsParameterValue
UI Flat face/body picker Geometry table with groups, modes, and clearances
Introduced August 2014 October 2022
Status Deprecated (forthcoming release) Supported

Why transition?

Fusion displays a deprecation notice for model override: "Model override to be deprecated in forthcoming release" (MFG-DEPRECATE-MODEL-OVERRIDE).

The machine avoid surface groups API provides:

If your automation sets overrideModel, includeSetupModel, or model, plan to migrate to checkSurfaceSelectionSets before model override is removed.


Understand the difference

These selectors answer different questions, but model override geometry now feeds the Model default group in the machine avoid table.

Question Legacy answer New answer
Which geometry is the machinable model? overrideModel + model + includeSetupModel Model default group (DefaultGroupType.Model_GroupType)
Which surfaces should the tool avoid? Not supported (or legacy checkSurfaceSelection in Avoid mode) User Avoid group or Model/Fixture default group in Avoid mode
Which surfaces must the tool machine? Not supported User Machine group
How much clearance / stock to leave? Global check surface clearance only Per-group radialOffset, axialOffset, or combinedOffset

The Model default group contains "surfaces belonging to the model. These have been defined in the setup or using the model override selector" (API: DefaultGroupType.Model_GroupType).

When you change model override selections today, the Model group in checkSurfaceSelectionSets updates automatically. Your API code should eventually target the machine avoid table directly rather than the legacy model parameter.


API type reference

Legacy — Model Override

# Enable model override
operation.parameters.itemByName('overrideModel').value.value = True

# Include setup model geometry alongside override surfaces
operation.parameters.itemByName('includeSetupModel').value.value = True

# Set override surfaces (flat list of faces, bodies, or occurrences)
model_param: adsk.cam.CadObjectParameterValue = operation.parameters.itemByName('model').value
model_param.value = [face1, face2, body1]

Current — Machine Avoid Surface Groups

surface_groups_param: adsk.cam.CadMachineAvoidGroupsParameterValue = \
    operation.parameters.itemByName('checkSurfaceSelectionSets').value

groups: adsk.cam.MachineAvoidGroups = surface_groups_param.getMachineAvoidGroups()

# User-defined group (read/write geometry)
user_group: adsk.cam.MachineAvoidDirectSelection = \
    groups.createNewMachineAvoidDirectSelectionGroup()
user_group.machineMode = adsk.cam.MachiningMode.Avoid_MachiningMode
user_group.radialOffset = 0.2
user_group.axialOffset = 0.3
user_group.inputGeometry = [face1, face2]

# Default group (read-only geometry, read/write mode and offsets)
model_group = groups.defaultGroup(adsk.cam.DefaultGroupType.Model_GroupType)
if model_group:
    model_group.machineMode = adsk.cam.MachiningMode.Machine_MachiningMode
    model_group.radialOffset = 0.1

# Required — persist all changes
surface_groups_param.applyMachineAvoidGroups(groups)

Critical rule: Changes to MachineAvoidGroups are in-memory until you call applyMachineAvoidGroups(). Skipping this call silently discards your edits.


Migration scenarios

Scenario 1: Add capping surfaces to the setup model

Before (model override): Include setup model and add extra faces (e.g. surfaces over holes to be drilled later).

params = operation.parameters
params.itemByName('overrideModel').value.value = True
params.itemByName('includeSetupModel').value.value = True
params.itemByName('model').value.value = capping_faces

After (machine avoid groups): Create a Machine user group for the capping surfaces. Leave the Model default group to represent setup model geometry.

surface_groups_param = operation.parameters.itemByName('checkSurfaceSelectionSets').value
groups = surface_groups_param.getMachineAvoidGroups()

capping_group = groups.createNewMachineAvoidDirectSelectionGroup()
capping_group.machineMode = adsk.cam.MachiningMode.Machine_MachiningMode
capping_group.radialOffset = 0.0   # stock to leave on capped surfaces
capping_group.axialOffset = 0.0
capping_group.inputGeometry = capping_faces
capping_group.machineOverHoles = True

surface_groups_param.applyMachineAvoidGroups(groups)

Scenario 2: Replace setup model with different geometry

Before: Disable include-setup-model and set override surfaces only.

params.itemByName('overrideModel').value.value = True
params.itemByName('includeSetupModel').value.value = False
params.itemByName('model').value.value = replacement_faces_or_bodies

After: Assign replacement geometry to a Machine user group. Set the Model default group mode to Gouge (Ignore) so setup model surfaces are not actively machined or avoided, or remove them from consideration depending on strategy.

groups = surface_groups_param.getMachineAvoidGroups()

replacement_group = groups.createNewMachineAvoidDirectSelectionGroup()
replacement_group.machineMode = adsk.cam.MachiningMode.Machine_MachiningMode
replacement_group.inputGeometry = replacement_faces_or_bodies

model_group = groups.defaultGroup(adsk.cam.DefaultGroupType.Model_GroupType)
if model_group:
    model_group.machineMode = adsk.cam.MachiningMode.Gouge_MachiningMode

surface_groups_param.applyMachineAvoidGroups(groups)

Strategy-specific behavior varies. Validate toolpaths after migration — some strategies treat the Model group differently (e.g. Flow uses Model-Avoid and Drive-Machine by default).


Scenario 3: Read model geometry using the API

After Model Override is deprecated, model selection should be treated as equivalent whether you read it from:

  1. The setup model selection, or
  2. The Machine/Avoid Model default group from checkSurfaceSelectionSets.

Source A: Setup model selection

setup_models = setup.models

Source B: Machine/Avoid Model default group

groups = operation.parameters.itemByName('checkSurfaceSelectionSets').value.getMachineAvoidGroups()
model_group = groups.defaultGroup(adsk.cam.DefaultGroupType.Model_GroupType)
if model_group:
    model_faces = model_group.inputGeometry   # read-only

Migration note: Use setup model selection or the checkSurfaceSelectionSets Model group interchangeably as the operation model source. For migrated scripts, these should represent the same intended model geometry after Model Override deprecation.

Before the migration, the model selection could have been overridden by manually setting the model selection using:

legacy_model_faces = operation.parameters.itemByName('model').value.value

Step-by-step migration checklist

  1. Identify affected operations — Surface-based 3D strategies (Parallel, Scallop, Pocket, Adaptive, Steep and Shallow, etc.) that use overrideModel or model.

  2. Check strategy support — Confirm the operation exposes checkSurfaceSelectionSets. Not all strategies support every group type or machining mode combination; applyMachineAvoidGroups() may throw if a mode is disallowed.

  3. Map each model override use case to a machine avoid group (see scenarios above).

  4. Replace flat selection writes — Stop setting model.value; use MachineAvoidDirectSelection.inputGeometry instead.

  5. Configure default groups — Use defaultGroup(DefaultGroupType.Model_GroupType) and defaultGroup(DefaultGroupType.Fixture_GroupType) for setup-driven geometry. Adjust machineMode and offsets as needed.

  6. Call applyMachineAvoidGroups() after every modification batch.

  7. Call sync() when setup changes — If setup model or fixture selections change, call groups.sync() after applyMachineAvoidGroups() to refresh default groups on the API side.

  8. Regenerate and validate toolpaths — Compare results against the legacy configuration before deploying automation changes.

  9. Remove legacy parameter access — Once validated, delete code that references overrideModel, includeSetupModel, and model.


API gotchas

Default group geometry is read-only

MachineAvoidDefaultSelection.inputGeometry is read-only. You cannot assign faces to the Model or Fixture default groups directly through the API. Geometry comes from setup parameters and (during the transition) model override.

Assign additional surfaces through user groups (createNewMachineAvoidDirectSelectionGroup).

Offset meaning depends on mode

Mode radialOffset / axialOffset meaning
Avoid Clearance — tool stays this distance away
Machine Stock to leave — material remaining on the surface
Fixture Fixture clearance
Gouge Offsets typically not used

Some strategies use combinedOffset instead of separate radial/axial values (Deburr, Geodesic, Advanced Swarf, Multi-Axis Clearing/Finishing).

Mutual exclusivity

Surface groups are mutually exclusive — a face belongs to one group at a time. Adding a face to a new group removes it from any previous group.

Transitional coexistence

During the deprecation period, model override and machine avoid groups coexist. Changing model updates the Model default group in the table. New automation should write to checkSurfaceSelectionSets only.

Error handling

Check group.hasWarning before applying groups. Invalid geometry (e.g. edges instead of faces) may produce warnings. Wrap applyMachineAvoidGroups() in try/except — disallowed mode/strategy combinations raise exceptions.


Which strategies support machine avoid groups?

The checkSurfaceSelectionSets parameter is available on 3D strategies that support check surfaces, including:

Model override (model) applies to all surface-based strategies. When migrating, verify your target strategy exposes both parameters during the transition, then target checkSurfaceSelectionSets only.


Complete before/after example

Before — legacy model override script

import adsk.core, adsk.cam

def configure_legacy_model_override(operation, capping_faces):
    params = operation.parameters
    params.itemByName('overrideModel').value.value = True
    params.itemByName('includeSetupModel').value.value = True
    params.itemByName('model').value.value = capping_faces

After — machine avoid surface groups script

import adsk.core, adsk.cam

def configure_machine_avoid_groups(operation, capping_faces, surfaces_to_avoid):
    surface_groups_param = operation.parameters.itemByName('checkSurfaceSelectionSets').value
    groups = surface_groups_param.getMachineAvoidGroups()

    # Capping surfaces → Machine user group
    capping_group = groups.createNewMachineAvoidDirectSelectionGroup()
    capping_group.machineMode = adsk.cam.MachiningMode.Machine_MachiningMode
    capping_group.inputGeometry = capping_faces
    capping_group.machineOverHoles = True

    # Surfaces to keep clear of → Avoid user group
    avoid_group = groups.createNewMachineAvoidDirectSelectionGroup()
    avoid_group.machineMode = adsk.cam.MachiningMode.Avoid_MachiningMode
    avoid_group.radialOffset = 0.2
    avoid_group.axialOffset = 0.3
    avoid_group.inputGeometry = surfaces_to_avoid

    # Model default group — setup model, mode configurable
    model_group = groups.defaultGroup(adsk.cam.DefaultGroupType.Model_GroupType)
    if model_group:
        model_group.machineMode = adsk.cam.MachiningMode.Machine_MachiningMode

    surface_groups_param.applyMachineAvoidGroups(groups)