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>
76 lines
2.8 KiB
Python
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:]) |