Full cycle now automated: 1. Delete old extrude (if exists) 2. Delete old sketch (try ReplaceFeatureBuilder first, fallback to delete) 3. Create new sketch with rib geometry 4. Extrude new sketch by rib thickness along face normal 5. Name both features for identification on next iteration Rib thickness read from profile JSON (parameters_used.thickness) with fallback to geometry JSON or default 10mm. No more manual extrude step needed between iterations.
Adaptive Isogrid — Plate Lightweighting Tool
Status: Foundation / Pre-Implementation
Architecture: Python Brain + NX Hands + Atomizer Manager
What It Does
Takes a plate with holes → generates an optimally lightweighted isogrid pattern → produces manufacturing-ready geometry. Isogrid density varies across the plate based on hole importance, edge proximity, and optimization-driven meta-parameters.
Architecture
| Component | Role | Runtime |
|---|---|---|
| Python Brain | Density field → Constrained Delaunay → rib profile | ~1-3 sec |
| NX Hands | Import profile → mesh → AFEM merge → Nastran solve → extract results | ~60-90 sec |
| Atomizer Manager | Optuna TPE sampling → objective evaluation → convergence | 500-2000 trials |
Key Insight: Assembly FEM with Superposed Models
- Model A (permanent): Spider elements at holes + edge BC nodes. All loads/BCs applied here.
- Model B (variable): 2D shell mesh of ribbed plate. Rebuilt each iteration.
- Node merge at fixed interface locations connects them reliably every time.
Loads and BCs never need re-association. Only the rib pattern changes.
Directory Structure
adaptive-isogrid/
├── README.md
├── requirements.txt
├── docs/
│ └── technical-spec.md # Full architecture spec
├── src/
│ ├── brain/ # Python geometry generator
│ │ ├── __init__.py
│ │ ├── density_field.py # η(x) evaluation
│ │ ├── triangulation.py # Constrained Delaunay + refinement
│ │ ├── pocket_profiles.py # Pocket inset + filleting
│ │ ├── profile_assembly.py # Final plate - pockets - holes
│ │ └── validation.py # Manufacturing constraint checks
│ ├── nx/ # NXOpen journal scripts
│ │ ├── extract_geometry.py # One-time: face → geometry.json
│ │ ├── build_interface_model.py # One-time: Model A + spiders
│ │ └── iteration_solve.py # Per-trial: rebuild Model B + solve
│ └── atomizer_study.py # Atomizer/Optuna integration
└── tests/
└── test_geometries/ # Sample geometry.json files
Implementation Phases
- Python Brain standalone (1-2 weeks) — geometry generator with matplotlib viz
- NX extraction + AFEM setup (1-2 weeks) — one-time project setup scripts
- NX iteration script (1-2 weeks) — per-trial mesh/solve/extract loop
- Atomizer integration (1 week) — wire objective function + study management
- Validation + first real project (1-2 weeks) — production run on client plate
Quick Start (Phase 1)
cd tools/adaptive-isogrid
pip install -r requirements.txt
python -m src.brain --geometry tests/test_geometries/sample_bracket.json --params default
Parameter Space
15 continuous parameters optimized by Atomizer (Optuna TPE):
- Density field: η₀, α, R₀, κ, p, β, R_edge
- Spacing: s_min, s_max
- Rib thickness: t_min, t₀, γ
- Manufacturing: w_frame, r_f, d_keep
See docs/technical-spec.md for full formulation.