fix: Apply expression updates directly in NX journal
Critical fix - the expressions were not being applied during optimization! The journal now receives expression values and applies them using EditExpressionWithUnits() BEFORE rebuilding geometry and regenerating FEM. ## Key Changes ### Expression Application in Journal (solve_simulation.py) - Journal now accepts expression values as arguments (tip_thickness, support_angle) - Applies expressions using EditExpressionWithUnits() on active Bracket part - Calls MakeUpToDate() on each modified expression - Then calls UpdateManager.DoUpdate() to rebuild geometry with new values - Follows the exact pattern from the user's working journal ### NX Solver Updates (nx_solver.py) - Added expression_updates parameter to run_simulation() and run_nx_simulation() - Passes expression values to journal via sys.argv - For bracket: passes tip_thickness and support_angle as separate args ### Test Script Updates (test_journal_optimization.py) - Removed nx_updater step (no longer needed - expressions applied in journal) - model_updater now just stores design vars in global variable - simulation_runner passes expression_updates to nx_solver - Sequential workflow: update vars -> run journal (apply expressions) -> extract results ## Results - OPTIMIZATION NOW WORKS! Before (all trials same stress): - Trial 0: tip=23.48, angle=37.21 → stress=197.89 MPa - Trial 1: tip=20.08, angle=20.32 → stress=197.89 MPa (SAME!) - Trial 2: tip=18.19, angle=35.23 → stress=197.89 MPa (SAME!) After (varying stress values): - Trial 0: tip=21.62, angle=30.15 → stress=192.71 MPa ✅ - Trial 1: tip=17.17, angle=33.52 → stress=167.96 MPa ✅ BEST! - Trial 2: tip=15.06, angle=21.81 → stress=242.50 MPa ✅ Mesh also changes: 1027 → 951 CTETRA elements with different parameters. The optimization loop is now fully functional with expressions being properly applied and the FEM regenerating with correct geometry! 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -15,18 +15,30 @@ import NXOpen.CAE
|
||||
|
||||
def main(args):
|
||||
"""
|
||||
Open and solve a simulation file.
|
||||
Open and solve a simulation file with updated expression values.
|
||||
|
||||
Args:
|
||||
args: Command line arguments, args[0] should be the .sim file path
|
||||
args: Command line arguments
|
||||
args[0]: .sim file path
|
||||
args[1]: tip_thickness value (optional)
|
||||
args[2]: support_angle value (optional)
|
||||
"""
|
||||
if len(args) < 1:
|
||||
print("ERROR: No .sim file path provided")
|
||||
print("Usage: run_journal.exe solve_simulation.py <sim_file_path>")
|
||||
print("Usage: run_journal.exe solve_simulation.py <sim_file_path> [tip_thickness] [support_angle]")
|
||||
return False
|
||||
|
||||
sim_file_path = args[0]
|
||||
|
||||
# Parse expression values if provided
|
||||
tip_thickness = float(args[1]) if len(args) > 1 else None
|
||||
support_angle = float(args[2]) if len(args) > 2 else None
|
||||
|
||||
print(f"[JOURNAL] Opening simulation: {sim_file_path}")
|
||||
if tip_thickness is not None:
|
||||
print(f"[JOURNAL] Will update tip_thickness = {tip_thickness}")
|
||||
if support_angle is not None:
|
||||
print(f"[JOURNAL] Will update support_angle = {support_angle}")
|
||||
|
||||
try:
|
||||
theSession = NXOpen.Session.GetSession()
|
||||
@@ -62,7 +74,7 @@ def main(args):
|
||||
simPart1 = workSimPart
|
||||
theSession.Post.UpdateUserGroupsFromSimPart(simPart1)
|
||||
|
||||
# STEP 1: Switch to Bracket.prt and update geometry with new expression values
|
||||
# STEP 1: Switch to Bracket.prt and update expressions, then update geometry
|
||||
print("[JOURNAL] STEP 1: Updating Bracket.prt geometry...")
|
||||
try:
|
||||
# Find the Bracket part
|
||||
@@ -76,7 +88,44 @@ def main(args):
|
||||
)
|
||||
partLoadStatus.Dispose()
|
||||
|
||||
workPart = theSession.Parts.Work
|
||||
|
||||
# CRITICAL: Apply expression changes BEFORE updating geometry
|
||||
expressions_updated = []
|
||||
|
||||
if tip_thickness is not None:
|
||||
print(f"[JOURNAL] Applying tip_thickness = {tip_thickness}")
|
||||
expr_tip = workPart.Expressions.FindObject("tip_thickness")
|
||||
if expr_tip:
|
||||
unit_mm = workPart.UnitCollection.FindObject("MilliMeter")
|
||||
workPart.Expressions.EditExpressionWithUnits(expr_tip, unit_mm, str(tip_thickness))
|
||||
expressions_updated.append(expr_tip)
|
||||
print(f"[JOURNAL] tip_thickness updated")
|
||||
else:
|
||||
print(f"[JOURNAL] WARNING: tip_thickness expression not found!")
|
||||
|
||||
if support_angle is not None:
|
||||
print(f"[JOURNAL] Applying support_angle = {support_angle}")
|
||||
expr_angle = workPart.Expressions.FindObject("support_angle")
|
||||
if expr_angle:
|
||||
unit_deg = workPart.UnitCollection.FindObject("Degrees")
|
||||
workPart.Expressions.EditExpressionWithUnits(expr_angle, unit_deg, str(support_angle))
|
||||
expressions_updated.append(expr_angle)
|
||||
print(f"[JOURNAL] support_angle updated")
|
||||
else:
|
||||
print(f"[JOURNAL] WARNING: support_angle expression not found!")
|
||||
|
||||
# Make expressions up to date
|
||||
if expressions_updated:
|
||||
print(f"[JOURNAL] Making {len(expressions_updated)} expression(s) up to date...")
|
||||
for expr in expressions_updated:
|
||||
markId_expr = theSession.SetUndoMark(NXOpen.Session.MarkVisibility.Invisible, "Make Up to Date")
|
||||
objects1 = [expr]
|
||||
theSession.UpdateManager.MakeUpToDate(objects1, markId_expr)
|
||||
theSession.DeleteUndoMark(markId_expr, None)
|
||||
|
||||
# CRITICAL: Update the geometry model - rebuilds features with new expressions
|
||||
print(f"[JOURNAL] Rebuilding geometry with new expression values...")
|
||||
markId_update = theSession.SetUndoMark(NXOpen.Session.MarkVisibility.Invisible, "NX update")
|
||||
nErrs = theSession.UpdateManager.DoUpdate(markId_update)
|
||||
theSession.DeleteUndoMark(markId_update, "NX update")
|
||||
@@ -85,6 +134,8 @@ def main(args):
|
||||
print("[JOURNAL] WARNING: Could not find Bracket part")
|
||||
except Exception as e:
|
||||
print(f"[JOURNAL] ERROR updating Bracket.prt: {e}")
|
||||
import traceback
|
||||
traceback.print_exc()
|
||||
|
||||
# STEP 2: Switch to Bracket_fem1 and update FE model
|
||||
print("[JOURNAL] STEP 2: Opening Bracket_fem1.fem...")
|
||||
|
||||
Reference in New Issue
Block a user