feat(extrude): symmetric extrude using part expression

- Uses ISOGRID_RIB_sandbox_N_thk expression for thickness
- Creates expression if missing, uses existing if present
- Symmetric extrude: ±thk/2 from sketch plane
- Fallback to literal value if expression fails
This commit is contained in:
2026-02-17 01:12:16 +00:00
parent 9a5f086684
commit e6f98ac921

View File

@@ -455,7 +455,8 @@ def _delete_feature(session: Any, feature: Any, lister: Any, label: str = "featu
def _extrude_sketch(part: Any, sketch: Any, thickness: float,
normal: List[float], extrude_name: str, lister: Any):
normal: List[float], extrude_name: str,
sandbox_id: str, lister: Any):
"""
Extrude a sketch using the standard NXOpen pattern:
- Create ExtrudeBuilder with null feature
@@ -615,11 +616,33 @@ def _extrude_sketch(part: Any, sketch: Any, thickness: float,
builder.Direction = direction
lister.WriteLine("[extrude] Step 4: Direction set")
# Step 5: Set limits
builder.Limits.StartExtend.Value.RightHandSide = "0.0"
builder.Limits.EndExtend.Value.RightHandSide = str(float(thickness))
# Step 5: Set limits — symmetric extrude using part expression
# Use the pre-defined expression ISOGRID_RIB_sandbox_N_thk
thk_expr_name = f"ISOGRID_RIB_{sandbox_id}_thk"
half_expr = f"{thk_expr_name}/2"
# Ensure the expression exists (create if missing)
try:
expr = None
for e in part.Expressions:
if e.Name == thk_expr_name:
expr = e
break
if expr is None:
part.Expressions.CreateExpression("Number", f"{thk_expr_name}={thickness}")
lister.WriteLine(f"[extrude] Created expression: {thk_expr_name}={thickness}")
else:
lister.WriteLine(f"[extrude] Using existing expression: {thk_expr_name}={expr.Value}")
except Exception as exc:
lister.WriteLine(f"[extrude] Expression warning: {exc}")
half_expr = str(float(thickness) / 2.0)
# Symmetric extrude: ±thk/2 from sketch plane
builder.Limits.StartExtend.Value.RightHandSide = half_expr
builder.Limits.EndExtend.Value.RightHandSide = half_expr
builder.BooleanOperation.Type = NXOpen.GeometricUtilities.BooleanOperation.BooleanType.Create
lister.WriteLine("[extrude] Step 5: Limits set (0 → {})".format(thickness))
lister.WriteLine(f"[extrude] Step 5: Symmetric limits ±{half_expr}")
# Step 6: Commit
extrude_obj = builder.Commit()
@@ -849,7 +872,8 @@ def main():
extrude_name = EXTRUDE_NAME_PREFIX + sandbox_id
extrude_feat = _extrude_sketch(
work_part, sketch, rib_thickness, normal, extrude_name, lister
work_part, sketch, rib_thickness, normal, extrude_name,
sandbox_id, lister
)
if extrude_feat is not None:
lister.WriteLine(f"[import] ✓ Sketch + Extrude complete for {sandbox_id}")