fix(nxopen): simplify sketch extrude and correct rule/builder APIs
This commit is contained in:
@@ -107,10 +107,8 @@ def _replace_and_delete_old_sketch(part: Any, old_feature: Any, new_feature: Any
|
|||||||
"Replace isogrid sketch")
|
"Replace isogrid sketch")
|
||||||
|
|
||||||
try:
|
try:
|
||||||
# Create the ReplaceFeatureBuilder
|
# Create the ReplaceFeatureBuilder (takes no args)
|
||||||
builder = part.Features.CreateReplaceFeatureBuilder(
|
builder = part.Features.CreateReplaceFeatureBuilder()
|
||||||
NXOpen.Features.Feature.Null
|
|
||||||
)
|
|
||||||
|
|
||||||
# Set the original feature (old sketch) to be replaced
|
# Set the original feature (old sketch) to be replaced
|
||||||
added_old = builder.SelectFeature.Add(old_feature)
|
added_old = builder.SelectFeature.Add(old_feature)
|
||||||
@@ -459,10 +457,11 @@ def _delete_feature(session: Any, feature: Any, lister: Any, label: str = "featu
|
|||||||
def _extrude_sketch(part: Any, sketch: Any, thickness: float,
|
def _extrude_sketch(part: Any, sketch: Any, thickness: float,
|
||||||
normal: List[float], extrude_name: str, lister: Any):
|
normal: List[float], extrude_name: str, lister: Any):
|
||||||
"""
|
"""
|
||||||
Extrude all curves in the sketch by `thickness` along the face normal.
|
Extrude a sketch using the standard NXOpen pattern:
|
||||||
Creates a new Extrude feature named `extrude_name`.
|
- Create ExtrudeBuilder with null feature
|
||||||
|
- Build a Section from the sketch feature rule
|
||||||
If an old extrude with the same name exists, delete it first.
|
- Set direction + limits
|
||||||
|
- Commit
|
||||||
"""
|
"""
|
||||||
import NXOpen
|
import NXOpen
|
||||||
import NXOpen.Features
|
import NXOpen.Features
|
||||||
@@ -470,149 +469,64 @@ def _extrude_sketch(part: Any, sketch: Any, thickness: float,
|
|||||||
|
|
||||||
session = NXOpen.Session.GetSession()
|
session = NXOpen.Session.GetSession()
|
||||||
|
|
||||||
# Delete old extrude if it exists
|
|
||||||
old_extrude = _find_extrude_feature(part, extrude_name, lister)
|
old_extrude = _find_extrude_feature(part, extrude_name, lister)
|
||||||
if old_extrude is not None:
|
if old_extrude is not None:
|
||||||
_delete_feature(session, old_extrude, lister, f"old extrude {extrude_name}")
|
_delete_feature(session, old_extrude, lister, f"old extrude {extrude_name}")
|
||||||
|
|
||||||
lister.WriteLine(f"[import] Extruding sketch by {thickness} mm along normal")
|
lister.WriteLine(f"[import] Extruding sketch by {thickness} mm along normal")
|
||||||
|
|
||||||
mark = session.SetUndoMark(NXOpen.Session.MarkVisibility.Visible,
|
session.SetUndoMark(NXOpen.Session.MarkVisibility.Visible,
|
||||||
f"Extrude {extrude_name}")
|
f"Extrude {extrude_name}")
|
||||||
|
|
||||||
|
builder = None
|
||||||
|
rule_options = None
|
||||||
try:
|
try:
|
||||||
# Create ExtrudeBuilder (null feature = new extrude)
|
builder = part.Features.CreateExtrudeBuilder(NXOpen.Features.Feature.Null)
|
||||||
builder = part.Features.CreateExtrudeBuilder(
|
|
||||||
NXOpen.Features.Feature.Null
|
# Build section directly from the sketch feature
|
||||||
|
section = builder.Section
|
||||||
|
section.AllowSelfIntersection(True)
|
||||||
|
|
||||||
|
rule_options = part.ScRuleFactory.CreateRuleOptions()
|
||||||
|
curve_rule = part.ScRuleFactory.CreateRuleCurveFeature(
|
||||||
|
[sketch.Feature],
|
||||||
|
NXOpen.DisplayableObject.Null,
|
||||||
|
rule_options,
|
||||||
)
|
)
|
||||||
|
|
||||||
# Set the section: use sketch curves
|
help_pt = NXOpen.Point3d(0.0, 0.0, 0.0)
|
||||||
# Get all curves from the sketch
|
section.AddToSection(
|
||||||
sketch_feature = sketch.Feature
|
[curve_rule],
|
||||||
curves = []
|
NXOpen.NXObject.Null,
|
||||||
try:
|
NXOpen.NXObject.Null,
|
||||||
# Try getting sketch geometry objects
|
NXOpen.NXObject.Null,
|
||||||
geom = sketch.GetAllGeometry()
|
help_pt,
|
||||||
for obj in geom:
|
NXOpen.Section.Mode.Create,
|
||||||
curves.append(obj)
|
False,
|
||||||
except Exception:
|
|
||||||
pass
|
|
||||||
|
|
||||||
if not curves:
|
|
||||||
# Fallback: get curves from feature's entities
|
|
||||||
try:
|
|
||||||
entities = sketch_feature.GetEntities()
|
|
||||||
for ent in entities:
|
|
||||||
if hasattr(ent, 'StartPoint') or hasattr(ent, 'GetLength'):
|
|
||||||
curves.append(ent)
|
|
||||||
except Exception:
|
|
||||||
pass
|
|
||||||
|
|
||||||
lister.WriteLine(f"[import] Found {len(curves)} curves in sketch for extrude")
|
|
||||||
|
|
||||||
# Create section and add curves
|
|
||||||
section = part.Sections.CreateSection(
|
|
||||||
0.0095, # chaining tolerance
|
|
||||||
0.01, # distance tolerance
|
|
||||||
0.5, # angle tolerance
|
|
||||||
)
|
|
||||||
section.SetAllowedEntityTypes(
|
|
||||||
NXOpen.Section.AllowTypes.OnlyCurves
|
|
||||||
)
|
)
|
||||||
|
|
||||||
# Add sketch curves to the section
|
|
||||||
sketch_feature_tag = sketch.Feature
|
|
||||||
curves_added = False
|
|
||||||
|
|
||||||
# Method 1: Add the sketch feature directly as section input
|
|
||||||
try:
|
|
||||||
feature_rule = part.ScRuleFactory.CreateRuleFeatureCurves(
|
|
||||||
[sketch_feature_tag]
|
|
||||||
)
|
|
||||||
section.AllowSelfIntersection(True)
|
|
||||||
help_pt = NXOpen.Point3d(0, 0, 0)
|
|
||||||
section.AddToSection(
|
|
||||||
[feature_rule],
|
|
||||||
NXOpen.NXObject.Null, # seed
|
|
||||||
NXOpen.NXObject.Null, # start connector
|
|
||||||
NXOpen.NXObject.Null, # end connector
|
|
||||||
help_pt,
|
|
||||||
NXOpen.Section.Mode.Create,
|
|
||||||
False, # go to end
|
|
||||||
)
|
|
||||||
curves_added = True
|
|
||||||
lister.WriteLine("[import] Added sketch curves to section via FeatureCurves rule")
|
|
||||||
except Exception as exc:
|
|
||||||
lister.WriteLine(f"[import] FeatureCurves rule failed: {exc}")
|
|
||||||
|
|
||||||
if not curves_added and curves:
|
|
||||||
# Method 2: Add individual curves
|
|
||||||
try:
|
|
||||||
curve_rule = part.ScRuleFactory.CreateRuleCurveDumb(curves)
|
|
||||||
help_pt = NXOpen.Point3d(0, 0, 0)
|
|
||||||
section.AddToSection(
|
|
||||||
[curve_rule],
|
|
||||||
curves[0],
|
|
||||||
NXOpen.NXObject.Null,
|
|
||||||
NXOpen.NXObject.Null,
|
|
||||||
help_pt,
|
|
||||||
NXOpen.Section.Mode.Create,
|
|
||||||
False,
|
|
||||||
)
|
|
||||||
curves_added = True
|
|
||||||
lister.WriteLine("[import] Added curves via CurveDumb rule")
|
|
||||||
except Exception as exc:
|
|
||||||
lister.WriteLine(f"[import] CurveDumb rule failed: {exc}")
|
|
||||||
|
|
||||||
if not curves_added:
|
|
||||||
lister.WriteLine("[import] ERROR: Could not add curves to extrude section")
|
|
||||||
builder.Destroy()
|
|
||||||
return None
|
|
||||||
|
|
||||||
builder.Section = section
|
|
||||||
|
|
||||||
# Set direction (along face normal)
|
|
||||||
direction = part.Directions.CreateDirection(
|
direction = part.Directions.CreateDirection(
|
||||||
NXOpen.Point3d(0, 0, 0),
|
NXOpen.Point3d(0.0, 0.0, 0.0),
|
||||||
NXOpen.Vector3d(normal[0], normal[1], normal[2]),
|
NXOpen.Vector3d(float(normal[0]), float(normal[1]), float(normal[2])),
|
||||||
NXOpen.SmartObject.UpdateOption.WithinModeling,
|
NXOpen.SmartObject.UpdateOption.WithinModeling,
|
||||||
)
|
)
|
||||||
builder.Direction = direction
|
builder.Direction = direction
|
||||||
|
|
||||||
# Set limits: start=0, end=thickness
|
builder.Limits.StartExtend.Value.RightHandSide = "0.0"
|
||||||
builder.Limits.StartExtend.Value.RightHandSide = "0"
|
builder.Limits.EndExtend.Value.RightHandSide = str(float(thickness))
|
||||||
builder.Limits.EndExtend.Value.RightHandSide = str(thickness)
|
|
||||||
|
|
||||||
# Boolean: create (no unite/subtract for now — idealized model)
|
|
||||||
builder.BooleanOperation.Type = NXOpen.GeometricUtilities.BooleanOperation.BooleanType.Create
|
builder.BooleanOperation.Type = NXOpen.GeometricUtilities.BooleanOperation.BooleanType.Create
|
||||||
|
|
||||||
# Commit
|
|
||||||
extrude_obj = builder.Commit()
|
extrude_obj = builder.Commit()
|
||||||
builder.Destroy()
|
|
||||||
|
|
||||||
# Rename the extrude feature
|
|
||||||
committed = builder.GetCommittedObjects() if hasattr(builder, 'GetCommittedObjects') else []
|
|
||||||
extrude_feature = None
|
|
||||||
|
|
||||||
if isinstance(extrude_obj, NXOpen.Features.Feature):
|
|
||||||
extrude_feature = extrude_obj
|
|
||||||
else:
|
|
||||||
# Find the most recently created extrude feature
|
|
||||||
for feat in part.Features:
|
|
||||||
try:
|
|
||||||
if "Extrude" in feat.FeatureType and feat.Name == "":
|
|
||||||
extrude_feature = feat
|
|
||||||
except Exception:
|
|
||||||
continue
|
|
||||||
|
|
||||||
|
extrude_feature = extrude_obj if isinstance(extrude_obj, NXOpen.Features.Feature) else None
|
||||||
if extrude_feature is not None:
|
if extrude_feature is not None:
|
||||||
try:
|
try:
|
||||||
extrude_feature.SetName(extrude_name)
|
extrude_feature.SetName(extrude_name)
|
||||||
lister.WriteLine(f"[import] Extrude created and named: {extrude_name}")
|
lister.WriteLine(f"[import] Extrude created and named: {extrude_name}")
|
||||||
except Exception:
|
except Exception:
|
||||||
lister.WriteLine(f"[import] Extrude created (could not rename)")
|
lister.WriteLine("[import] Extrude created (could not rename)")
|
||||||
else:
|
else:
|
||||||
lister.WriteLine(f"[import] Extrude committed (feature reference unclear)")
|
lister.WriteLine("[import] Extrude committed (feature reference unclear)")
|
||||||
|
|
||||||
return extrude_feature
|
return extrude_feature
|
||||||
|
|
||||||
@@ -621,6 +535,17 @@ def _extrude_sketch(part: Any, sketch: Any, thickness: float,
|
|||||||
import traceback
|
import traceback
|
||||||
lister.WriteLine(traceback.format_exc())
|
lister.WriteLine(traceback.format_exc())
|
||||||
return None
|
return None
|
||||||
|
finally:
|
||||||
|
try:
|
||||||
|
if rule_options is not None:
|
||||||
|
rule_options.Dispose()
|
||||||
|
except Exception:
|
||||||
|
pass
|
||||||
|
try:
|
||||||
|
if builder is not None:
|
||||||
|
builder.Destroy()
|
||||||
|
except Exception:
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
# ---------------------------------------------------------------------------
|
# ---------------------------------------------------------------------------
|
||||||
|
|||||||
Reference in New Issue
Block a user