Files
Atomizer/tools/adaptive-isogrid
Antoine ecba40f189 feat(import_profile): auto-extrude after sketch creation
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.
2026-02-17 00:40:00 +00:00
..

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

  1. Python Brain standalone (1-2 weeks) — geometry generator with matplotlib viz
  2. NX extraction + AFEM setup (1-2 weeks) — one-time project setup scripts
  3. NX iteration script (1-2 weeks) — per-trial mesh/solve/extract loop
  4. Atomizer integration (1 week) — wire objective function + study management
  5. 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.