diff --git a/tools/adaptive-isogrid/docs/technical-spec.md b/tools/adaptive-isogrid/docs/technical-spec.md index 0e36a24e..9c0f1e79 100644 --- a/tools/adaptive-isogrid/docs/technical-spec.md +++ b/tools/adaptive-isogrid/docs/technical-spec.md @@ -18,15 +18,15 @@ A semi-automated tool that takes a plate with holes, generates an optimally ligh After extensive brainstorming, the following decisions are locked: -| Decision | Choice | Rationale | -|---|---|---| -| Geometry generation | External Python (Constrained Delaunay) | Full access to scipy/triangle/gmsh, debuggable, fast | -| FEA strategy | Reserved-region monolithic remesh | Keep load/BC topology stable while allowing local rib updates | -| FEA solver | NX Simcenter + Nastran (2D shell) | Existing expertise, handles complex BCs, extensible to modal/buckling | -| NX role | Extract sandbox faces, reimport profile, remesh + solve | Reserved regions preserve associations; no assembly merge pipeline needed | -| Optimization | Atomizer (Optuna TPE), pure parametric v1 | One FEA per trial, ~2 min/iteration, stress feedback deferred to v2 | -| Geometry transfer | JSON-only round trip | Deterministic, scriptable, no DXF/STEP conversion drift | -| Plate type | Flat, 200–600 mm scale, 6–15 mm thick, 16–30 holes | Shell elements appropriate, fast solves | +| Decision | Choice | Rationale | +| ------------------- | ------------------------------------------------------- | ------------------------------------------------------------------------- | +| Geometry generation | External Python (Constrained Delaunay) | Full access to scipy/triangle/gmsh, debuggable, fast | +| FEA strategy | Reserved-region monolithic remesh | Keep load/BC topology stable while allowing local rib updates | +| FEA solver | NX Simcenter + Nastran (2D shell) | Existing expertise, handles complex BCs, extensible to modal/buckling | +| NX role | Extract sandbox faces, reimport profile, remesh + solve | Reserved regions preserve associations; no assembly merge pipeline needed | +| Optimization | Atomizer (Optuna TPE), pure parametric v1 | One FEA per trial, ~2 min/iteration, stress feedback deferred to v2 | +| Geometry transfer | JSON-only round trip | Deterministic, scriptable, no DXF/STEP conversion drift | +| Plate type | Flat, 200–600 mm scale, 6–15 mm thick, 16–30 holes | Shell elements appropriate, fast solves | ### System Diagram diff --git a/tools/adaptive-isogrid/tests/geometry_sandbox_1.json b/tools/adaptive-isogrid/tests/geometry_sandbox_1.json new file mode 100644 index 00000000..1ebf1fab --- /dev/null +++ b/tools/adaptive-isogrid/tests/geometry_sandbox_1.json @@ -0,0 +1,795 @@ +{ + "schema_version": "2.0", + "units": "mm", + "sandbox_id": "sandbox_1", + "outer_boundary": [ + { + "type": "line", + "start": [ + 381.787159, + 14.92177 + ], + "end": [ + 132.687159, + 14.92177 + ] + }, + { + "type": "line", + "start": [ + 132.687159, + 14.92177 + ], + "end": [ + 132.687159, + -13.57823 + ] + }, + { + "type": "line", + "start": [ + 132.687159, + -13.57823 + ], + "end": [ + 88.687159, + -13.57823 + ] + }, + { + "type": "line", + "start": [ + 88.687159, + -13.57823 + ], + "end": [ + 88.687159, + 14.92177 + ] + }, + { + "type": "line", + "start": [ + 88.687159, + 14.92177 + ], + "end": [ + -13.412841, + 14.92177 + ] + }, + { + "type": "line", + "start": [ + -13.412841, + 14.92177 + ], + "end": [ + -13.412841, + 0.02177 + ] + }, + { + "type": "line", + "start": [ + -13.412841, + 0.02177 + ], + "end": [ + -30.812841, + 0.02177 + ] + }, + { + "type": "line", + "start": [ + -30.812841, + 0.02177 + ], + "end": [ + -30.812841, + -254.17823 + ] + }, + { + "type": "line", + "start": [ + -30.812841, + -254.17823 + ], + "end": [ + 169.435852, + -254.17823 + ] + }, + { + "type": "line", + "start": [ + 169.435852, + -254.17823 + ], + "end": [ + 169.435852, + -417.57823 + ] + }, + { + "type": "line", + "start": [ + 169.435852, + -417.57823 + ], + "end": [ + 197.121675, + -417.57823 + ] + }, + { + "type": "line", + "start": [ + 197.121675, + -417.57823 + ], + "end": [ + 197.121675, + -401.57823 + ] + }, + { + "type": "line", + "start": [ + 197.121675, + -401.57823 + ], + "end": [ + 212.121675, + -401.57823 + ] + }, + { + "type": "line", + "start": [ + 212.121675, + -401.57823 + ], + "end": [ + 212.121675, + -417.57823 + ] + }, + { + "type": "line", + "start": [ + 212.121675, + -417.57823 + ], + "end": [ + 289.687159, + -417.57823 + ] + }, + { + "type": "line", + "start": [ + 289.687159, + -417.57823 + ], + "end": [ + 304.687159, + -406.57823 + ] + }, + { + "type": "line", + "start": [ + 304.687159, + -406.57823 + ], + "end": [ + 317.687159, + -406.57823 + ] + }, + { + "type": "line", + "start": [ + 317.687159, + -406.57823 + ], + "end": [ + 332.687159, + -417.57823 + ] + }, + { + "type": "line", + "start": [ + 332.687159, + -417.57823 + ], + "end": [ + 381.787159, + -417.57823 + ] + }, + { + "type": "line", + "start": [ + 381.787159, + -417.57823 + ], + "end": [ + 381.787159, + -395.17823 + ] + }, + { + "type": "line", + "start": [ + 381.787159, + -395.17823 + ], + "end": [ + 404.187159, + -395.17823 + ] + }, + { + "type": "line", + "start": [ + 404.187159, + -395.17823 + ], + "end": [ + 404.187159, + -322.57823 + ] + }, + { + "type": "line", + "start": [ + 404.187159, + -322.57823 + ], + "end": [ + 352.787159, + -322.57823 + ] + }, + { + "type": "line", + "start": [ + 352.787159, + -322.57823 + ], + "end": [ + 352.787159, + -304.17823 + ] + }, + { + "type": "line", + "start": [ + 352.787159, + -304.17823 + ], + "end": [ + 361.187159, + -304.17823 + ] + }, + { + "type": "line", + "start": [ + 361.187159, + -304.17823 + ], + "end": [ + 361.187159, + -24.57823 + ] + }, + { + "type": "line", + "start": [ + 361.187159, + -24.57823 + ], + "end": [ + 404.187159, + -24.57823 + ] + }, + { + "type": "line", + "start": [ + 404.187159, + -24.57823 + ], + "end": [ + 404.187159, + 0.02177 + ] + }, + { + "type": "line", + "start": [ + 404.187159, + 0.02177 + ], + "end": [ + 381.787159, + 0.02177 + ] + }, + { + "type": "line", + "start": [ + 381.787159, + 0.02177 + ], + "end": [ + 381.787159, + 14.92177 + ] + } + ], + "inner_boundaries": [ + { + "index": 0, + "segments": [ + { + "type": "arc", + "start": [ + 0.0, + 0.0 + ], + "end": [ + 0.0, + 0.0 + ], + "center": [ + 0.0, + -3.07823 + ], + "radius": 3.07823, + "mid": [ + 0.0, + -6.15646 + ], + "clockwise": false + } + ], + "num_segments": 1 + }, + { + "index": 1, + "segments": [ + { + "type": "arc", + "start": [ + 366.187159, + 1.02177 + ], + "end": [ + 366.187159, + 1.02177 + ], + "center": [ + 366.187159, + -3.07823 + ], + "radius": 4.1, + "mid": [ + 366.187159, + -7.17823 + ], + "clockwise": false + } + ], + "num_segments": 1 + }, + { + "index": 2, + "segments": [ + { + "type": "arc", + "start": [ + 44.987159, + 0.0 + ], + "end": [ + 44.987159, + 0.0 + ], + "center": [ + 44.987159, + -3.07823 + ], + "radius": 3.07823, + "mid": [ + 44.987159, + -6.15646 + ], + "clockwise": false + } + ], + "num_segments": 1 + }, + { + "index": 3, + "segments": [ + { + "type": "arc", + "start": [ + 250.707159, + -272.32823 + ], + "end": [ + 250.707159, + -272.32823 + ], + "center": [ + 250.707159, + -275.57823 + ], + "radius": 3.25, + "mid": [ + 250.707159, + -278.82823 + ], + "clockwise": false + } + ], + "num_segments": 1 + }, + { + "index": 4, + "segments": [ + { + "type": "arc", + "start": [ + 44.987159, + -155.5 + ], + "end": [ + 44.987159, + -155.5 + ], + "center": [ + 44.987159, + -158.57823 + ], + "radius": 3.07823, + "mid": [ + 44.987159, + -161.65646 + ], + "clockwise": false + } + ], + "num_segments": 1 + }, + { + "index": 5, + "segments": [ + { + "type": "arc", + "start": [ + 125.187159, + -232.47823 + ], + "end": [ + 125.187159, + -232.47823 + ], + "center": [ + 125.187159, + -236.57823 + ], + "radius": 4.1, + "mid": [ + 125.187159, + -240.67823 + ], + "clockwise": false + } + ], + "num_segments": 1 + }, + { + "index": 6, + "segments": [ + { + "type": "arc", + "start": [ + -9.812841, + -67.82823 + ], + "end": [ + -9.812841, + -67.82823 + ], + "center": [ + -9.812841, + -71.07823 + ], + "radius": 3.25, + "mid": [ + -9.812841, + -74.32823 + ], + "clockwise": false + } + ], + "num_segments": 1 + }, + { + "index": 7, + "segments": [ + { + "type": "arc", + "start": [ + 362.787159, + -372.9 + ], + "end": [ + 362.787159, + -372.9 + ], + "center": [ + 362.787159, + -375.97823 + ], + "radius": 3.07823, + "mid": [ + 362.787159, + -379.05646 + ], + "clockwise": false + } + ], + "num_segments": 1 + }, + { + "index": 8, + "segments": [ + { + "type": "arc", + "start": [ + 250.707159, + -372.72823 + ], + "end": [ + 250.707159, + -372.72823 + ], + "center": [ + 250.707159, + -375.97823 + ], + "radius": 3.25, + "mid": [ + 250.707159, + -379.22823 + ], + "clockwise": false + } + ], + "num_segments": 1 + }, + { + "index": 9, + "segments": [ + { + "type": "arc", + "start": [ + 291.457159, + -311.1 + ], + "end": [ + 291.457159, + -311.1 + ], + "center": [ + 291.457159, + -314.17823 + ], + "radius": 3.07823, + "mid": [ + 291.457159, + -317.25646 + ], + "clockwise": false + } + ], + "num_segments": 1 + }, + { + "index": 10, + "segments": [ + { + "type": "arc", + "start": [ + 44.987159, + -68.0 + ], + "end": [ + 44.987159, + -68.0 + ], + "center": [ + 44.987159, + -71.07823 + ], + "radius": 3.07823, + "mid": [ + 44.987159, + -74.15646 + ], + "clockwise": false + } + ], + "num_segments": 1 + }, + { + "index": 11, + "segments": [ + { + "type": "arc", + "start": [ + 194.447159, + -372.72823 + ], + "end": [ + 194.447159, + -372.72823 + ], + "center": [ + 194.447159, + -375.97823 + ], + "radius": 3.25, + "mid": [ + 194.447159, + -379.22823 + ], + "clockwise": false + } + ], + "num_segments": 1 + }, + { + "index": 12, + "segments": [ + { + "type": "arc", + "start": [ + 291.457159, + -372.9 + ], + "end": [ + 291.457159, + -372.9 + ], + "center": [ + 291.457159, + -375.97823 + ], + "radius": 3.07823, + "mid": [ + 291.457159, + -379.05646 + ], + "clockwise": false + } + ], + "num_segments": 1 + }, + { + "index": 13, + "segments": [ + { + "type": "arc", + "start": [ + 125.187159, + -154.47823 + ], + "end": [ + 125.187159, + -154.47823 + ], + "center": [ + 125.187159, + -158.57823 + ], + "radius": 4.1, + "mid": [ + 125.187159, + -162.67823 + ], + "clockwise": false + } + ], + "num_segments": 1 + }, + { + "index": 14, + "segments": [ + { + "type": "arc", + "start": [ + 125.187159, + -66.97823 + ], + "end": [ + 125.187159, + -66.97823 + ], + "center": [ + 125.187159, + -71.07823 + ], + "radius": 4.1, + "mid": [ + 125.187159, + -75.17823 + ], + "clockwise": false + } + ], + "num_segments": 1 + }, + { + "index": 15, + "segments": [ + { + "type": "arc", + "start": [ + 194.447159, + -272.32823 + ], + "end": [ + 194.447159, + -272.32823 + ], + "center": [ + 194.447159, + -275.57823 + ], + "radius": 3.25, + "mid": [ + 194.447159, + -278.82823 + ], + "clockwise": false + } + ], + "num_segments": 1 + } + ], + "num_inner_boundaries": 16, + "thickness": null, + "transform": { + "origin": [ + 197.57823, + 184.187159, + 6.35 + ], + "x_axis": [ + 0.0, + -1.0, + 0.0 + ], + "y_axis": [ + 1.0, + 0.0, + -0.0 + ], + "normal": [ + 0.0, + 0.0, + 1.0 + ] + } +} \ No newline at end of file diff --git a/tools/adaptive-isogrid/tests/geometry_sandbox_2.json b/tools/adaptive-isogrid/tests/geometry_sandbox_2.json new file mode 100644 index 00000000..55e7d827 --- /dev/null +++ b/tools/adaptive-isogrid/tests/geometry_sandbox_2.json @@ -0,0 +1,314 @@ +{ + "schema_version": "2.0", + "units": "mm", + "sandbox_id": "sandbox_2", + "outer_boundary": [ + { + "type": "arc", + "start": [ + 0.0, + 0.0 + ], + "end": [ + 7.5, + -7.5 + ], + "center": [ + 0.0, + -7.5 + ], + "radius": 7.5, + "mid": [ + 5.303301, + -2.196699 + ], + "clockwise": true + }, + { + "type": "line", + "start": [ + 7.5, + -7.5 + ], + "end": [ + 7.5, + -22.6 + ] + }, + { + "type": "line", + "start": [ + 7.5, + -22.6 + ], + "end": [ + 22.5, + -22.6 + ] + }, + { + "type": "line", + "start": [ + 22.5, + -22.6 + ], + "end": [ + 22.5, + -13.496098 + ] + }, + { + "type": "line", + "start": [ + 22.5, + -13.496098 + ], + "end": [ + 74.5, + -13.496098 + ] + }, + { + "type": "line", + "start": [ + 74.5, + -13.496098 + ], + "end": [ + 74.5, + -22.6 + ] + }, + { + "type": "line", + "start": [ + 74.5, + -22.6 + ], + "end": [ + 102.5, + -22.6 + ] + }, + { + "type": "line", + "start": [ + 102.5, + -22.6 + ], + "end": [ + 102.5, + -7.5 + ] + }, + { + "type": "arc", + "start": [ + 102.5, + -7.5 + ], + "end": [ + 117.5, + -7.5 + ], + "center": [ + 110.0, + -7.5 + ], + "radius": 7.5, + "mid": [ + 110.0, + 0.0 + ], + "clockwise": false + }, + { + "type": "line", + "start": [ + 117.5, + -7.5 + ], + "end": [ + 117.5, + -22.6 + ] + }, + { + "type": "line", + "start": [ + 117.5, + -22.6 + ], + "end": [ + 140.748693, + -22.6 + ] + }, + { + "type": "line", + "start": [ + 140.748693, + -22.6 + ], + "end": [ + 140.748693, + 124.4 + ] + }, + { + "type": "line", + "start": [ + 140.748693, + 124.4 + ], + "end": [ + 117.5, + 124.4 + ] + }, + { + "type": "line", + "start": [ + 117.5, + 124.4 + ], + "end": [ + 117.5, + 102.5 + ] + }, + { + "type": "arc", + "start": [ + 117.5, + 102.5 + ], + "end": [ + 102.5, + 102.5 + ], + "center": [ + 110.0, + 102.5 + ], + "radius": 7.5, + "mid": [ + 110.0, + 95.0 + ], + "clockwise": true + }, + { + "type": "line", + "start": [ + 102.5, + 102.5 + ], + "end": [ + 102.5, + 124.4 + ] + }, + { + "type": "line", + "start": [ + 102.5, + 124.4 + ], + "end": [ + 7.5, + 124.4 + ] + }, + { + "type": "line", + "start": [ + 7.5, + 124.4 + ], + "end": [ + 7.5, + 102.5 + ] + }, + { + "type": "arc", + "start": [ + 7.5, + 102.5 + ], + "end": [ + 0.0, + 95.0 + ], + "center": [ + 0.0, + 102.5 + ], + "radius": 7.5, + "mid": [ + 5.303301, + 97.196699 + ], + "clockwise": true + }, + { + "type": "line", + "start": [ + 0.0, + 95.0 + ], + "end": [ + -13.5, + 95.0 + ] + }, + { + "type": "line", + "start": [ + -13.5, + 95.0 + ], + "end": [ + -13.5, + 0.0 + ] + }, + { + "type": "line", + "start": [ + -13.5, + 0.0 + ], + "end": [ + 0.0, + 0.0 + ] + } + ], + "inner_boundaries": [], + "num_inner_boundaries": 0, + "thickness": null, + "transform": { + "origin": [ + -196.0, + 175.5, + 4.35 + ], + "x_axis": [ + 0.0, + -1.0, + 0.0 + ], + "y_axis": [ + 1.0, + 0.0, + -0.0 + ], + "normal": [ + 0.0, + 0.0, + 1.0 + ] + } +} \ No newline at end of file