Files
Atomizer/tests/journal_apply_expression.py
Anto01 96e88fe714 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>
2025-11-15 12:47:55 -05:00

76 lines
2.8 KiB
Python

# NX 2412
# Journal created by antoi on Sat Nov 15 12:43:19 2025 Eastern Standard Time
#
import math
import NXOpen
def main(args) :
theSession = NXOpen.Session.GetSession() #type: NXOpen.Session
workPart = theSession.Parts.Work
displayPart = theSession.Parts.Display
# ----------------------------------------------
# Menu: Tools->Utilities->Expressions...
# ----------------------------------------------
markId1 = theSession.SetUndoMark(NXOpen.Session.MarkVisibility.Visible, "Start")
theSession.SetUndoMarkName(markId1, "Expressions Dialog")
markId2 = theSession.SetUndoMark(NXOpen.Session.MarkVisibility.Invisible, "Edit Expression")
expression1 = workPart.Expressions.FindObject("support_angle")
unit1 = workPart.UnitCollection.FindObject("Degrees")
workPart.Expressions.EditExpressionWithUnits(expression1, unit1, "20")
markId3 = theSession.SetUndoMark(NXOpen.Session.MarkVisibility.Invisible, "Expressions")
markId4 = theSession.SetUndoMark(NXOpen.Session.MarkVisibility.Invisible, "Make Up to Date")
objects1 = [NXOpen.NXObject.Null] * 1
objects1[0] = expression1
theSession.UpdateManager.MakeUpToDate(objects1, markId4)
markId5 = theSession.SetUndoMark(NXOpen.Session.MarkVisibility.Invisible, "NX update")
nErrs1 = theSession.UpdateManager.DoUpdate(markId5)
theSession.DeleteUndoMark(markId5, "NX update")
theSession.DeleteUndoMark(markId4, None)
theSession.DeleteUndoMark(markId3, None)
theSession.SetUndoMarkName(markId1, "Expressions")
markId6 = theSession.SetUndoMark(NXOpen.Session.MarkVisibility.Visible, "Start")
theSession.SetUndoMarkName(markId6, "Expressions Dialog")
# ----------------------------------------------
# Dialog Begin Expressions
# ----------------------------------------------
markId7 = theSession.SetUndoMark(NXOpen.Session.MarkVisibility.Invisible, "Expressions")
theSession.DeleteUndoMark(markId7, None)
markId8 = theSession.SetUndoMark(NXOpen.Session.MarkVisibility.Invisible, "Expressions")
markId9 = theSession.SetUndoMark(NXOpen.Session.MarkVisibility.Invisible, "Make Up to Date")
markId10 = theSession.SetUndoMark(NXOpen.Session.MarkVisibility.Invisible, "NX update")
nErrs2 = theSession.UpdateManager.DoUpdate(markId10)
theSession.DeleteUndoMark(markId10, "NX update")
theSession.DeleteUndoMark(markId9, None)
theSession.DeleteUndoMark(markId8, None)
theSession.SetUndoMarkName(markId6, "Expressions")
# ----------------------------------------------
# Menu: Tools->Automation->Journal->Stop Recording
# ----------------------------------------------
if __name__ == '__main__':
main(sys.argv[1:])