Technical Documentation for fxBladeEdgeFeatures.ovm
Version 2026Q1 | Last Updated: January 22, 2026 | SolidCut CAD 2025
The Blade Edge Feature Recognition System analyzes fixture blade geometry to identify and classify faces for gripper placement, plunger positioning, and other manufacturing operations. It uses a topology-based walk algorithm to traverse blade faces starting from the pocket floor.
The system handles compound-angle blades using a transform-first methodology:
Left pocket wall faces only. Walls that face left (NormX < -0.7) on the interior of the pocket.
Right pocket wall faces only. Walls that face right (NormX > 0.7) on the interior of the pocket.
Pocket floor faces only. Downward-facing faces (NormZ < -0.7) at the bottom of the pocket.
All interior pocket surfaces - left walls, right walls, floor, and interior fillets/steps.
Left exterior wall only. The outside face on the left edge of the blade.
Right exterior wall only. The outside face on the right edge of the blade.
Blade base (bottom) only. The upward-facing face at the base of the blade.
Top face on left arm only. The downward-facing top face on the left side.
Top face on right arm only. The downward-facing top face on the right side.
All exterior surfaces including base, exterior walls, and top faces.
Exterior walls and tops, but NOT the blade base. Useful for side-access operations.
Everything except top and thickness faces. Interior + exterior walls + base + floors.
ALL faces including thickness faces. Complete blade surface selection.
Everything EXCEPT upward-facing base faces. All walls, floors, fillets, tops.
| Color | RGB | Meaning |
|---|---|---|
| GREEN | (0, 255, 0) | Selected face - included in results |
| RED | (255, 0, 0) | Pocket floor (reference face) - always stays red for visual distinction |
| YELLOW | (255, 255, 0) | Top faces - reference, usually excluded |
| BLUE | (0, 0, 255) | Thickness faces - usually excluded |
| MAGENTA | (255, 0, 255) | Not selected for current mode |
| CYAN | (0, 128, 255) | Base faces - for all-everything mode |
| ORANGE | (255, 128, 0) | Wrong orientation - skipped |
| BROWN | (128, 64, 0) | Traversed but not selected |
call fxBladeEdgeFeatures i_mode i_bladeBody w_radius w_interval w_clearance w_depthOffset $_zone
| Parameter | Type | Description |
|---|---|---|
i_mode |
Integer | Operation mode: i_EDGE_FEAT_GRIPPERS (1) or i_EDGE_FEAT_PLUNGERS (2) |
i_bladeBody |
Integer | Body number of the blade to analyze |
w_radius |
Float | Tool radius for gripper/plunger placement |
w_interval |
Float | Spacing interval between placements |
w_clearance |
Float | Clearance distance from blade edge |
w_depthOffset |
Float | Depth offset for tool positioning |
$_zone |
String | Zone selector (see modes above) |
Results are stored in VDM set i_VDM_BLADE_EDGE_FACES containing selected face IDs.
Zone configuration is used for per-blade customization. For full JSON API documentation including blade creation parameters, see π JSON Schema Configuration.
{
"$schema": "http://json-schema.org/draft-07/schema#",
"title": "BladeEdgeZoneConfig",
"type": "object",
"properties": {
"bladeId": {
"type": "integer",
"description": "Body number of the blade"
},
"zones": {
"type": "array",
"items": {
"type": "object",
"properties": {
"name": {
"type": "string",
"enum": [
"left-inside", "right-inside", "bottom-inside", "all-inside",
"left-outside", "right-outside", "bottom-outside",
"top-left", "top-right", "all-outside", "all-outside-except-base",
"all-no-topZFaces", "all-everything", "all-everything-except-base"
]
},
"enabled": {
"type": "boolean",
"default": true
},
"toolType": {
"type": "string",
"enum": ["gripper", "plunger", "clamp"]
},
"parameters": {
"type": "object",
"properties": {
"radius": { "type": "number" },
"interval": { "type": "number" },
"clearance": { "type": "number" },
"depthOffset": { "type": "number" }
}
}
},
"required": ["name"]
}
}
},
"required": ["bladeId", "zones"]
}
{
"bladeId": 80,
"zones": [
{
"name": "left-inside",
"enabled": true,
"toolType": "gripper",
"parameters": {
"radius": 5.0,
"interval": 50.0,
"clearance": 2.0,
"depthOffset": 0
}
},
{
"name": "right-inside",
"enabled": true,
"toolType": "gripper",
"parameters": {
"radius": 5.0,
"interval": 50.0,
"clearance": 2.0,
"depthOffset": 0
}
},
{
"name": "bottom-inside",
"enabled": false
}
]
}
Internal flags control face selection behavior for each mode:
| Mode | wantLeft | wantRight | wantBottom | wantLeftOut | wantRightOut | wantBottomOut | includeTop | includeOut |
|---|---|---|---|---|---|---|---|---|
| left-inside | β | |||||||
| right-inside | β | |||||||
| bottom-inside | β | |||||||
| all-inside | β | β | β | |||||
| left-outside | β | β | ||||||
| right-outside | β | β | ||||||
| bottom-outside | β | β | ||||||
| all-outside | β | β | β | β | β | |||
| all-outside-except-base | β | β | β | β | ||||
| all-no-topZFaces | β | β | β | β | β | β | β | |
| all-everything | β | β | β | β | β | β | β | β |
| all-everything-except-base | β | β | β | β | β | β | β |
When walking from one face to the next, the algorithm uses priority selection:
'*** Face Classification by Normal Direction
if abs( w_faceNormX ) > 0.7 then
'*** Wall face (left or right facing)
if w_faceNormX < -0.7 then
'*** Left-facing wall
else
'*** Right-facing wall
end if
else if w_faceNormZ < -0.7 then
'*** Downward-facing = Floor or Top surface
if w_faceZ < w_midZ then
'*** Interior floor
else
'*** Top face
end if
else if w_faceNormZ > 0.7 then
'*** Upward-facing = Base face
else if abs( w_faceNormY ) > 0.7 then
'*** Thickness face (front/back of blade)
end if
Due to the topology walk algorithm, when i_includeTop=FALSE, the walk stops at top-area fillets. Faces geometrically "beyond" those fillets may not be reached. This is expected behavior based on the blade's specific topology.
Workaround: Use all-everything-except-base instead, which includes top faces and thus can traverse to all areas.
L-shaped blades (open on one side) are automatically detected. The walk starts only from the side that has an interior wall.
| Issue | Possible Cause | Solution |
|---|---|---|
| No faces selected | Blade not properly oriented | Check blade normal calculation |
| Missing interior walls | Pocket floor not detected | Verify blade has interior pocket geometry |
| Wrong faces selected | Incorrect mode specified | Review mode flag settings |
| Walk stops early | Thickness face encountered | Expected behavior - check blade geometry |
call fxTestBladeEdgeModes i_bladeBody
Runs all 14 modes sequentially with visual verification pauses.
Use a U-channel blade with compound angle for comprehensive testing. Key faces to verify: