feat(isogrid): Add update-in-place NX import + 3 density field variations
Major improvements to NX import workflow and rib pattern generation:
**NX Import (import_profile.py)**
- Smart sketch management: detects existing sketches and updates in-place
- Preserves extrude references (no manual re-reference needed!)
- First run: creates new sketch + auto-extrude
- Subsequent runs: clears geometry, redraws, extrude regenerates automatically
- Added _find_sketch_by_name() and _clear_sketch_geometry() functions
**Rib Pattern Variations**
Generated 3 different density field strategies for testing NX updates:
- Balanced (α=1.0, β=0.3): Original moderate density - 86 pockets, 2,499g
- Edge-focused (α=0.3, β=1.5): Dense ribs near boundaries - 167 pockets, 2,328g
- Hole-focused (α=1.8, β=0.15): Dense around holes - 62 pockets, 3,025g
**New Files**
- import_profile_update_test.py: Standalone update-only test script
- params_large_triangles.json: s_min=30mm, s_max=100mm (larger triangles)
- params_edge_focused.json: β=1.5 (boundary reinforcement)
- params_hole_focused.json: α=1.8 (hole reinforcement)
- sandbox_results/{edge_focused,hole_focused}/: Complete rib profile sets
**Test Results (Sandbox 1)**
- 833 triangles with large triangle params (vs 1,501 with previous params)
- Edge-focused: 1,155 triangles, 167 pockets (2x denser)
- Hole-focused: 523 triangles, 62 pockets (sparse pattern)
This enables rapid rib pattern iteration in NX without losing extrude references!
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
@@ -1,13 +1,17 @@
|
|||||||
"""
|
"""
|
||||||
NXOpen script — Import rib profile into NX as a sketch.
|
NXOpen script — Import/Update rib profile into NX as a sketch.
|
||||||
|
|
||||||
Reads `rib_profile_<sandbox_id>.json` (output from Python Brain) and creates
|
Reads `rib_profile_<sandbox_id>.json` (output from Python Brain) and creates
|
||||||
an NX sketch on the sandbox plane containing:
|
or updates an NX sketch on the sandbox plane containing:
|
||||||
- Outer boundary polyline
|
- Outer boundary polyline
|
||||||
- Structured pocket geometry (3 lines + 3 arcs per triangular pocket)
|
- Structured pocket geometry (3 lines + 3 arcs per triangular pocket)
|
||||||
|
- Hole circles (bolt holes)
|
||||||
|
|
||||||
The sketch is placed in the idealized part. Antoine extrudes manually the first
|
Smart sketch management:
|
||||||
time; subsequent iterations only update the sketch and the extrude regenerates.
|
- FIRST RUN: Creates new sketch + auto-generates extrude
|
||||||
|
- SUBSEQUENT RUNS: Updates existing sketch IN-PLACE (preserves extrude reference!)
|
||||||
|
|
||||||
|
This means you can iterate on rib patterns without manually re-referencing the extrude!
|
||||||
|
|
||||||
Usage (NX Journal):
|
Usage (NX Journal):
|
||||||
File > Execute > NX Journal > import_profile.py
|
File > Execute > NX Journal > import_profile.py
|
||||||
@@ -17,6 +21,7 @@ created by extract_sandbox.py (next to the idealized part).
|
|||||||
|
|
||||||
Author: Atomizer / Adaptive Isogrid
|
Author: Atomizer / Adaptive Isogrid
|
||||||
Created: 2026-02-16
|
Created: 2026-02-16
|
||||||
|
Updated: 2026-02-17 (Update-in-place mode added)
|
||||||
"""
|
"""
|
||||||
|
|
||||||
from __future__ import annotations
|
from __future__ import annotations
|
||||||
@@ -74,20 +79,21 @@ def unproject_point_to_3d(
|
|||||||
|
|
||||||
|
|
||||||
# ---------------------------------------------------------------------------
|
# ---------------------------------------------------------------------------
|
||||||
# NX sketch creation
|
# NX sketch creation and update
|
||||||
# ---------------------------------------------------------------------------
|
# ---------------------------------------------------------------------------
|
||||||
|
|
||||||
def _find_old_sketch_feature(part: Any, sketch_name: str, lister: Any):
|
def _find_sketch_by_name(part: Any, sketch_name: str, lister: Any):
|
||||||
"""
|
"""
|
||||||
Find an existing sketch feature by Name attribute.
|
Find an existing sketch by name.
|
||||||
Returns the Feature object (not Sketch), or None.
|
Returns the Sketch object (not Feature), or None.
|
||||||
"""
|
"""
|
||||||
try:
|
try:
|
||||||
for feat in part.Features:
|
for sketch in part.Sketches:
|
||||||
try:
|
try:
|
||||||
if feat.Name == sketch_name:
|
# Check if the sketch's feature has the matching name
|
||||||
lister.WriteLine(f"[import] Found existing sketch feature: {sketch_name} ({feat.JournalIdentifier})")
|
if sketch.Feature and sketch.Feature.Name == sketch_name:
|
||||||
return feat
|
lister.WriteLine(f"[import] Found existing sketch: {sketch_name}")
|
||||||
|
return sketch
|
||||||
except Exception:
|
except Exception:
|
||||||
continue
|
continue
|
||||||
except Exception:
|
except Exception:
|
||||||
@@ -95,67 +101,36 @@ def _find_old_sketch_feature(part: Any, sketch_name: str, lister: Any):
|
|||||||
return None
|
return None
|
||||||
|
|
||||||
|
|
||||||
def _replace_and_delete_old_sketch(part: Any, old_feature: Any, new_feature: Any, lister: Any):
|
def _clear_sketch_geometry(sketch: Any, lister: Any):
|
||||||
"""
|
"""
|
||||||
Replace old sketch with new one using NX's ReplaceFeatureBuilder.
|
Delete all geometry (curves and points) from an active sketch.
|
||||||
|
Sketch must be activated before calling this.
|
||||||
"""
|
"""
|
||||||
import NXOpen
|
import NXOpen
|
||||||
import NXOpen.Features
|
|
||||||
|
|
||||||
session = NXOpen.Session.GetSession()
|
session = NXOpen.Session.GetSession()
|
||||||
mark = session.SetUndoMark(NXOpen.Session.MarkVisibility.Visible,
|
|
||||||
"Replace isogrid sketch")
|
|
||||||
|
|
||||||
try:
|
try:
|
||||||
# Create the ReplaceFeatureBuilder (takes no args)
|
# Get all curves and points in the sketch
|
||||||
builder = part.Features.CreateReplaceFeatureBuilder()
|
geom_objects = sketch.GetAllGeometry()
|
||||||
|
|
||||||
# Set the original feature (old sketch) to be replaced
|
if len(geom_objects) == 0:
|
||||||
added_old = builder.SelectFeature.Add(old_feature)
|
lister.WriteLine("[import] Sketch is already empty")
|
||||||
lister.WriteLine(f"[import] Set original feature: {old_feature.JournalIdentifier}")
|
return
|
||||||
|
|
||||||
# Set the replacement feature (new sketch)
|
lister.WriteLine(f"[import] Clearing {len(geom_objects)} existing curves/points...")
|
||||||
added_new = builder.ReplacementFeature.Add(new_feature)
|
|
||||||
lister.WriteLine(f"[import] Set replacement feature: {new_feature.JournalIdentifier}")
|
|
||||||
|
|
||||||
# Configuration
|
# Add all geometry to delete list
|
||||||
builder.DeleteOriginalFeature = True
|
session.UpdateManager.AddObjectsToDeleteList(geom_objects)
|
||||||
builder.DoAutomaticGeomMatch = True
|
|
||||||
|
|
||||||
# Run automatic geometry matching (maps old curves → new curves)
|
# Execute the deletion
|
||||||
try:
|
mark = session.SetUndoMark(NXOpen.Session.MarkVisibility.Visible, "Clear sketch geometry")
|
||||||
builder.AutomatchMap()
|
nErrs = session.UpdateManager.DoUpdate(mark)
|
||||||
lister.WriteLine("[import] Auto-match mapping completed")
|
|
||||||
except Exception as exc:
|
|
||||||
lister.WriteLine(f"[import] Auto-match warning (may still work): {exc}")
|
|
||||||
|
|
||||||
# Update the mapping
|
lister.WriteLine(f"[import] Cleared sketch geometry ({nErrs} warnings)")
|
||||||
try:
|
|
||||||
builder.UpdateMap()
|
|
||||||
except Exception as exc:
|
|
||||||
lister.WriteLine(f"[import] UpdateMap note: {exc}")
|
|
||||||
|
|
||||||
# Commit the replacement
|
|
||||||
builder.Commit()
|
|
||||||
lister.WriteLine("[import] ReplaceFeature committed — all references updated")
|
|
||||||
|
|
||||||
builder.Destroy()
|
|
||||||
|
|
||||||
except Exception as exc:
|
except Exception as exc:
|
||||||
lister.WriteLine(f"[import] ReplaceFeatureBuilder failed: {exc}")
|
lister.WriteLine(f"[import] Warning during geometry clear: {exc}")
|
||||||
lister.WriteLine("[import] Falling back to manual delete + re-reference...")
|
|
||||||
|
|
||||||
# Fallback: just delete the old sketch
|
|
||||||
# Downstream features (extrude) will go into "out of date" state
|
|
||||||
# and need manual re-selection of the new sketch section
|
|
||||||
try:
|
|
||||||
nErrs = session.UpdateManager.AddToDeleteList(old_feature)
|
|
||||||
nErrs2 = session.UpdateManager.DoUpdate(mark)
|
|
||||||
lister.WriteLine(f"[import] Deleted old sketch ({nErrs + nErrs2} warnings)")
|
|
||||||
lister.WriteLine("[import] ⚠ Extrude may need manual sketch re-selection")
|
|
||||||
except Exception as exc2:
|
|
||||||
lister.WriteLine(f"[import] Delete also failed: {exc2}")
|
|
||||||
lister.WriteLine("[import] ⚠ Manually delete old sketch and fix extrude")
|
|
||||||
|
|
||||||
|
|
||||||
def _find_or_create_sketch(
|
def _find_or_create_sketch(
|
||||||
@@ -165,17 +140,23 @@ def _find_or_create_sketch(
|
|||||||
lister: Any,
|
lister: Any,
|
||||||
) -> Any:
|
) -> Any:
|
||||||
"""
|
"""
|
||||||
Always create a new sketch on the sandbox plane.
|
Smart sketch management: updates existing sketch in-place if found,
|
||||||
After creation, rename the sketch feature to sketch_name.
|
otherwise creates new sketch. This preserves downstream references (extrudes).
|
||||||
If an old sketch with the same name exists, replace references and delete it.
|
Returns the Sketch object.
|
||||||
Returns the (new) Sketch object.
|
|
||||||
"""
|
"""
|
||||||
import NXOpen
|
import NXOpen
|
||||||
|
|
||||||
# Check for existing sketch with this name (will be replaced later)
|
# Check if sketch already exists
|
||||||
old_feature = _find_old_sketch_feature(part, sketch_name, lister)
|
existing_sketch = _find_sketch_by_name(part, sketch_name, lister)
|
||||||
|
|
||||||
lister.WriteLine(f"[import] Creating new sketch: {sketch_name}")
|
if existing_sketch is not None:
|
||||||
|
# UPDATE MODE: Sketch exists, we'll update it in-place
|
||||||
|
lister.WriteLine(f"[import] UPDATE mode: Sketch exists, will update in-place")
|
||||||
|
lister.WriteLine(f"[import] This preserves extrude references ✓")
|
||||||
|
return existing_sketch
|
||||||
|
|
||||||
|
# CREATE MODE: Sketch doesn't exist, create new one
|
||||||
|
lister.WriteLine(f"[import] CREATE mode: Creating new sketch: {sketch_name}")
|
||||||
|
|
||||||
origin = transform["origin"]
|
origin = transform["origin"]
|
||||||
normal = transform["normal"]
|
normal = transform["normal"]
|
||||||
@@ -266,28 +247,7 @@ def _find_or_create_sketch(
|
|||||||
except Exception:
|
except Exception:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
lister.WriteLine(f"[import] Created sketch: {sketch_name}")
|
lister.WriteLine(f"[import] Created new sketch: {sketch_name}")
|
||||||
|
|
||||||
# If old sketch existed, delete it (extrude will be recreated by _extrude_sketch)
|
|
||||||
if old_feature is not None:
|
|
||||||
import NXOpen as _NXOpen
|
|
||||||
_session = _NXOpen.Session.GetSession()
|
|
||||||
|
|
||||||
# First try ReplaceFeatureBuilder to preserve downstream references
|
|
||||||
replaced = False
|
|
||||||
if new_feature is not None:
|
|
||||||
lister.WriteLine(f"[import] Attempting ReplaceFeatureBuilder (old → new)...")
|
|
||||||
try:
|
|
||||||
_replace_and_delete_old_sketch(part, old_feature, new_feature, lister)
|
|
||||||
replaced = True
|
|
||||||
except Exception as exc:
|
|
||||||
lister.WriteLine(f"[import] ReplaceFeatureBuilder failed: {exc}")
|
|
||||||
|
|
||||||
# Fallback: just delete old sketch (extrude will be re-created)
|
|
||||||
if not replaced:
|
|
||||||
lister.WriteLine(f"[import] Deleting old sketch (extrude will be re-created)...")
|
|
||||||
_delete_feature(_session, old_feature, lister, f"old sketch {sketch_name}")
|
|
||||||
|
|
||||||
return sketch
|
return sketch
|
||||||
|
|
||||||
|
|
||||||
@@ -876,6 +836,10 @@ def main():
|
|||||||
lister.WriteLine(f"[import] ERROR activating sketch: {exc}")
|
lister.WriteLine(f"[import] ERROR activating sketch: {exc}")
|
||||||
continue
|
continue
|
||||||
|
|
||||||
|
# If updating existing sketch, clear old geometry first
|
||||||
|
# (This preserves the sketch object → extrude reference stays valid!)
|
||||||
|
_clear_sketch_geometry(sketch, lister)
|
||||||
|
|
||||||
# --- Draw geometry ---
|
# --- Draw geometry ---
|
||||||
# Strategy: draw outer boundary + pocket outlines (lines+arcs) + holes
|
# Strategy: draw outer boundary + pocket outlines (lines+arcs) + holes
|
||||||
# NX sketch regions: the rib web is the area BETWEEN outer boundary
|
# NX sketch regions: the rib web is the area BETWEEN outer boundary
|
||||||
|
|||||||
539
tools/adaptive-isogrid/src/nx/import_profile_update_test.py
Normal file
539
tools/adaptive-isogrid/src/nx/import_profile_update_test.py
Normal file
@@ -0,0 +1,539 @@
|
|||||||
|
"""
|
||||||
|
NXOpen script — UPDATE existing isogrid rib sketch (preserves extrude references).
|
||||||
|
|
||||||
|
This test script updates an existing sketch in-place instead of creating a new one.
|
||||||
|
This preserves downstream feature references (extrudes, patterns, etc.).
|
||||||
|
|
||||||
|
Usage:
|
||||||
|
1. Ensure your sketch exists with name: ISOGRID_RIB_sandbox_1
|
||||||
|
2. Copy rib_profile_sandbox_1.json + geometry_sandbox_1.json to adaptive_isogrid_data/
|
||||||
|
3. Run this script: File > Execute > NX Journal
|
||||||
|
4. Extrude should update automatically (no re-reference needed!)
|
||||||
|
|
||||||
|
Workflow:
|
||||||
|
- Find existing sketch by name
|
||||||
|
- Activate sketch
|
||||||
|
- Delete all existing geometry
|
||||||
|
- Draw new geometry from JSON
|
||||||
|
- Deactivate sketch
|
||||||
|
- Sketch object stays the same → extrude reference preserved ✓
|
||||||
|
|
||||||
|
Author: Atomizer / Adaptive Isogrid
|
||||||
|
Created: 2026-02-17
|
||||||
|
"""
|
||||||
|
|
||||||
|
from __future__ import annotations
|
||||||
|
|
||||||
|
import json
|
||||||
|
import math
|
||||||
|
import os
|
||||||
|
from typing import Any, Dict, List, Tuple
|
||||||
|
|
||||||
|
# ---------------------------------------------------------------------------
|
||||||
|
# Config
|
||||||
|
# ---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
SKETCH_NAME_PREFIX = "ISOGRID_RIB_" # e.g., ISOGRID_RIB_sandbox_1
|
||||||
|
|
||||||
|
# ---------------------------------------------------------------------------
|
||||||
|
# Geometry helpers (same as import_profile.py)
|
||||||
|
# ---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
def unproject_to_3d(
|
||||||
|
points2d: List[List[float]],
|
||||||
|
transform: Dict[str, List[float]],
|
||||||
|
) -> List[Tuple[float, float, float]]:
|
||||||
|
"""Convert 2D profile points back to 3D using the extraction transform."""
|
||||||
|
ox, oy, oz = transform["origin"]
|
||||||
|
xx, xy, xz = transform["x_axis"]
|
||||||
|
yx, yy, yz = transform["y_axis"]
|
||||||
|
|
||||||
|
pts3d = []
|
||||||
|
for x, y in points2d:
|
||||||
|
px = ox + x * xx + y * yx
|
||||||
|
py = oy + x * xy + y * yy
|
||||||
|
pz = oz + x * xz + y * yz
|
||||||
|
pts3d.append((px, py, pz))
|
||||||
|
return pts3d
|
||||||
|
|
||||||
|
|
||||||
|
def unproject_point_to_3d(
|
||||||
|
pt2d: List[float],
|
||||||
|
transform: Dict[str, List[float]],
|
||||||
|
) -> Tuple[float, float, float]:
|
||||||
|
"""Convert a single 2D point to 3D."""
|
||||||
|
ox, oy, oz = transform["origin"]
|
||||||
|
xx, xy, xz = transform["x_axis"]
|
||||||
|
yx, yy, yz = transform["y_axis"]
|
||||||
|
x, y = pt2d[0], pt2d[1]
|
||||||
|
return (
|
||||||
|
ox + x * xx + y * yx,
|
||||||
|
oy + x * xy + y * yy,
|
||||||
|
oz + x * xz + y * yz,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
# ---------------------------------------------------------------------------
|
||||||
|
# Sketch finding and clearing
|
||||||
|
# ---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
def _find_sketch_by_name(part: Any, sketch_name: str, lister: Any):
|
||||||
|
"""
|
||||||
|
Find an existing sketch by name.
|
||||||
|
Returns the Sketch object (not Feature), or None.
|
||||||
|
"""
|
||||||
|
try:
|
||||||
|
for sketch in part.Sketches:
|
||||||
|
try:
|
||||||
|
# Check if the sketch's feature has the matching name
|
||||||
|
if sketch.Feature and sketch.Feature.Name == sketch_name:
|
||||||
|
lister.WriteLine(f"[update] Found existing sketch: {sketch_name}")
|
||||||
|
return sketch
|
||||||
|
except Exception:
|
||||||
|
continue
|
||||||
|
except Exception:
|
||||||
|
pass
|
||||||
|
return None
|
||||||
|
|
||||||
|
|
||||||
|
def _clear_sketch_geometry(sketch: Any, lister: Any):
|
||||||
|
"""
|
||||||
|
Delete all geometry (curves and points) from an active sketch.
|
||||||
|
Sketch must be activated before calling this.
|
||||||
|
"""
|
||||||
|
import NXOpen
|
||||||
|
|
||||||
|
session = NXOpen.Session.GetSession()
|
||||||
|
work_part = session.Parts.Work
|
||||||
|
|
||||||
|
try:
|
||||||
|
# Get all curves and points in the sketch
|
||||||
|
geom_objects = sketch.GetAllGeometry()
|
||||||
|
|
||||||
|
if len(geom_objects) == 0:
|
||||||
|
lister.WriteLine("[update] Sketch is already empty")
|
||||||
|
return
|
||||||
|
|
||||||
|
lister.WriteLine(f"[update] Deleting {len(geom_objects)} existing curves/points...")
|
||||||
|
|
||||||
|
# Add all geometry to delete list
|
||||||
|
session.UpdateManager.AddObjectsToDeleteList(geom_objects)
|
||||||
|
|
||||||
|
# Execute the deletion
|
||||||
|
mark = session.SetUndoMark(NXOpen.Session.MarkVisibility.Visible, "Clear sketch geometry")
|
||||||
|
nErrs = session.UpdateManager.DoUpdate(mark)
|
||||||
|
|
||||||
|
lister.WriteLine(f"[update] Cleared sketch geometry ({nErrs} warnings)")
|
||||||
|
|
||||||
|
except Exception as exc:
|
||||||
|
lister.WriteLine(f"[update] Warning during geometry clear: {exc}")
|
||||||
|
|
||||||
|
|
||||||
|
# ---------------------------------------------------------------------------
|
||||||
|
# Sketch drawing: lines and arcs (same as import_profile.py)
|
||||||
|
# ---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
def _draw_line(part, p1_3d, p2_3d):
|
||||||
|
"""Draw a single line in the active sketch. Returns True on success."""
|
||||||
|
import NXOpen
|
||||||
|
lb = part.Sketches.CreateLineBuilder()
|
||||||
|
lb.SetStartPoint(NXOpen.Point3d(p1_3d[0], p1_3d[1], p1_3d[2]))
|
||||||
|
lb.SetEndPoint(NXOpen.Point3d(p2_3d[0], p2_3d[1], p2_3d[2]))
|
||||||
|
lb.Commit()
|
||||||
|
lb.Destroy()
|
||||||
|
return True
|
||||||
|
|
||||||
|
|
||||||
|
def _draw_arc_3pt(part, start_3d, mid_3d, end_3d):
|
||||||
|
"""
|
||||||
|
Draw a 3-point arc in the active sketch.
|
||||||
|
SketchArcBuilder: SetStartPoint, SetEndPoint, SetThirdPoint, Commit.
|
||||||
|
"""
|
||||||
|
import NXOpen
|
||||||
|
ab = part.Sketches.CreateArcBuilder()
|
||||||
|
ab.SetStartPoint(NXOpen.Point3d(start_3d[0], start_3d[1], start_3d[2]))
|
||||||
|
ab.SetEndPoint(NXOpen.Point3d(end_3d[0], end_3d[1], end_3d[2]))
|
||||||
|
ab.SetThirdPoint(NXOpen.Point3d(mid_3d[0], mid_3d[1], mid_3d[2]))
|
||||||
|
ab.Commit()
|
||||||
|
ab.Destroy()
|
||||||
|
return True
|
||||||
|
|
||||||
|
|
||||||
|
def _arc_midpoint_2d(arc):
|
||||||
|
"""Compute the midpoint of a fillet arc in 2D (for 3-point arc creation)."""
|
||||||
|
cx, cy = arc['center']
|
||||||
|
r = arc['radius']
|
||||||
|
sa = arc['start_angle']
|
||||||
|
ea = arc['end_angle']
|
||||||
|
# Go the short way around
|
||||||
|
da = ea - sa
|
||||||
|
if da > math.pi:
|
||||||
|
da -= 2 * math.pi
|
||||||
|
elif da < -math.pi:
|
||||||
|
da += 2 * math.pi
|
||||||
|
mid_angle = sa + da / 2.0
|
||||||
|
return [cx + r * math.cos(mid_angle), cy + r * math.sin(mid_angle)]
|
||||||
|
|
||||||
|
|
||||||
|
def _draw_segment(part, seg, transform, lister):
|
||||||
|
"""
|
||||||
|
Draw a single typed segment (line or arc) in the active sketch.
|
||||||
|
Supports schema v2.0 segment dicts with "type", "start", "end", "center", "radius".
|
||||||
|
Returns ("line"|"arc", success_bool).
|
||||||
|
"""
|
||||||
|
seg_type = seg.get("type", "line")
|
||||||
|
start_3d = unproject_point_to_3d(seg["start"], transform)
|
||||||
|
end_3d = unproject_point_to_3d(seg["end"], transform)
|
||||||
|
|
||||||
|
if seg_type == "arc" and "center" in seg:
|
||||||
|
center_3d = unproject_point_to_3d(seg["center"], transform)
|
||||||
|
radius = seg["radius"]
|
||||||
|
|
||||||
|
# Prefer the sampled midpoint from NX (avoids direction ambiguity)
|
||||||
|
if "mid" in seg:
|
||||||
|
mid_2d = seg["mid"]
|
||||||
|
else:
|
||||||
|
# Fallback: compute from clockwise flag
|
||||||
|
cx, cy = seg["center"]
|
||||||
|
sx, sy = seg["start"]
|
||||||
|
ex, ey = seg["end"]
|
||||||
|
sa = math.atan2(sy - cy, sx - cx)
|
||||||
|
ea = math.atan2(ey - cy, ex - cx)
|
||||||
|
clockwise = seg.get("clockwise", False)
|
||||||
|
if clockwise:
|
||||||
|
da = sa - ea
|
||||||
|
if da <= 0:
|
||||||
|
da += 2 * math.pi
|
||||||
|
mid_angle = sa - da / 2.0
|
||||||
|
else:
|
||||||
|
da = ea - sa
|
||||||
|
if da <= 0:
|
||||||
|
da += 2 * math.pi
|
||||||
|
mid_angle = sa + da / 2.0
|
||||||
|
mid_2d = [cx + radius * math.cos(mid_angle), cy + radius * math.sin(mid_angle)]
|
||||||
|
mid_3d = unproject_point_to_3d(mid_2d, transform)
|
||||||
|
try:
|
||||||
|
_draw_arc_3pt(part, start_3d, mid_3d, end_3d)
|
||||||
|
return ("arc", True)
|
||||||
|
except Exception as exc:
|
||||||
|
lister.WriteLine(f"[update] Arc failed, fallback to line: {exc}")
|
||||||
|
# Fallback: draw as line
|
||||||
|
try:
|
||||||
|
_draw_line(part, start_3d, end_3d)
|
||||||
|
return ("line", True)
|
||||||
|
except Exception:
|
||||||
|
return ("line", False)
|
||||||
|
else:
|
||||||
|
try:
|
||||||
|
_draw_line(part, start_3d, end_3d)
|
||||||
|
return ("line", True)
|
||||||
|
except Exception:
|
||||||
|
return ("line", False)
|
||||||
|
|
||||||
|
|
||||||
|
def _draw_outer_boundary(part, outer_boundary, transform, lister):
|
||||||
|
"""
|
||||||
|
Draw the outer boundary. Handles both:
|
||||||
|
- Schema v2.0: list of typed segment dicts
|
||||||
|
- Schema v1.0: list of [x,y] points (polyline)
|
||||||
|
Returns (num_lines, num_arcs).
|
||||||
|
"""
|
||||||
|
if not outer_boundary:
|
||||||
|
return 0, 0
|
||||||
|
|
||||||
|
# Detect schema version: v2.0 segments are dicts with "type" key
|
||||||
|
if isinstance(outer_boundary[0], dict) and "type" in outer_boundary[0]:
|
||||||
|
# Schema v2.0 — typed segments
|
||||||
|
n_lines = 0
|
||||||
|
n_arcs = 0
|
||||||
|
for seg in outer_boundary:
|
||||||
|
kind, ok = _draw_segment(part, seg, transform, lister)
|
||||||
|
if ok:
|
||||||
|
if kind == "arc":
|
||||||
|
n_arcs += 1
|
||||||
|
else:
|
||||||
|
n_lines += 1
|
||||||
|
return n_lines, n_arcs
|
||||||
|
else:
|
||||||
|
# Schema v1.0 — flat polyline points
|
||||||
|
outer_3d = unproject_to_3d(outer_boundary, transform)
|
||||||
|
n = len(outer_3d)
|
||||||
|
if n < 2:
|
||||||
|
return 0, 0
|
||||||
|
# Strip closing duplicate
|
||||||
|
if n >= 3:
|
||||||
|
d = math.sqrt(sum((a - b) ** 2 for a, b in zip(outer_3d[0], outer_3d[-1])))
|
||||||
|
if d < 0.001:
|
||||||
|
n -= 1
|
||||||
|
count = 0
|
||||||
|
for i in range(n):
|
||||||
|
try:
|
||||||
|
_draw_line(part, outer_3d[i], outer_3d[(i + 1) % n])
|
||||||
|
count += 1
|
||||||
|
except Exception as exc:
|
||||||
|
if count == 0:
|
||||||
|
lister.WriteLine(f"[update] ERROR: First line failed: {exc}")
|
||||||
|
return 0, 0
|
||||||
|
return count, 0
|
||||||
|
|
||||||
|
|
||||||
|
def _draw_structured_pocket(part, pocket, transform, lister):
|
||||||
|
"""
|
||||||
|
Draw a structured pocket (lines + arcs) in the active sketch.
|
||||||
|
Returns (num_lines, num_arcs) created.
|
||||||
|
"""
|
||||||
|
lines_drawn = 0
|
||||||
|
arcs_drawn = 0
|
||||||
|
|
||||||
|
# Draw straight edges
|
||||||
|
for line in pocket.get('lines', []):
|
||||||
|
start_3d = unproject_point_to_3d(line[0], transform)
|
||||||
|
end_3d = unproject_point_to_3d(line[1], transform)
|
||||||
|
try:
|
||||||
|
_draw_line(part, start_3d, end_3d)
|
||||||
|
lines_drawn += 1
|
||||||
|
except Exception:
|
||||||
|
pass
|
||||||
|
|
||||||
|
# Draw fillet arcs (3-point: start, midpoint, end)
|
||||||
|
for arc in pocket.get('arcs', []):
|
||||||
|
start_3d = unproject_point_to_3d(arc['tangent_start'], transform)
|
||||||
|
end_3d = unproject_point_to_3d(arc['tangent_end'], transform)
|
||||||
|
mid_2d = _arc_midpoint_2d(arc)
|
||||||
|
mid_3d = unproject_point_to_3d(mid_2d, transform)
|
||||||
|
try:
|
||||||
|
_draw_arc_3pt(part, start_3d, mid_3d, end_3d)
|
||||||
|
arcs_drawn += 1
|
||||||
|
except Exception as exc:
|
||||||
|
if arcs_drawn == 0:
|
||||||
|
lister.WriteLine(f"[update] Arc creation failed: {exc}")
|
||||||
|
# Fallback: draw as 2 line segments through midpoint
|
||||||
|
try:
|
||||||
|
_draw_line(part, start_3d, mid_3d)
|
||||||
|
_draw_line(part, mid_3d, end_3d)
|
||||||
|
lines_drawn += 2
|
||||||
|
lister.WriteLine("[update] Arc fallback: 2 lines")
|
||||||
|
except Exception:
|
||||||
|
pass
|
||||||
|
|
||||||
|
return lines_drawn, arcs_drawn
|
||||||
|
|
||||||
|
|
||||||
|
def _resolve_enum(paths):
|
||||||
|
"""Try multiple dotted paths to resolve an NXOpen enum value."""
|
||||||
|
for path in paths:
|
||||||
|
try:
|
||||||
|
parts_p = path.split(".")
|
||||||
|
obj = __import__(parts_p[0])
|
||||||
|
for attr in parts_p[1:]:
|
||||||
|
obj = getattr(obj, attr)
|
||||||
|
return obj, path
|
||||||
|
except (AttributeError, ImportError):
|
||||||
|
continue
|
||||||
|
return None, None
|
||||||
|
|
||||||
|
|
||||||
|
# ---------------------------------------------------------------------------
|
||||||
|
# Main update logic
|
||||||
|
# ---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
def main():
|
||||||
|
import NXOpen
|
||||||
|
|
||||||
|
session = NXOpen.Session.GetSession()
|
||||||
|
lister = session.ListingWindow
|
||||||
|
lister.Open()
|
||||||
|
|
||||||
|
lister.WriteLine("=" * 60)
|
||||||
|
lister.WriteLine(" Adaptive Isogrid — UPDATE Existing Sketch Test")
|
||||||
|
lister.WriteLine("=" * 60)
|
||||||
|
|
||||||
|
# Navigate to idealized part
|
||||||
|
work_part = session.Parts.Work
|
||||||
|
part_name = work_part.Name if hasattr(work_part, "Name") else ""
|
||||||
|
lister.WriteLine(f"[update] Work part: {part_name}")
|
||||||
|
|
||||||
|
if not part_name.endswith("_i"):
|
||||||
|
for part in session.Parts:
|
||||||
|
pname = part.Name if hasattr(part, "Name") else ""
|
||||||
|
if pname.endswith("_i"):
|
||||||
|
session.Parts.SetWork(part)
|
||||||
|
work_part = part
|
||||||
|
lister.WriteLine(f"[update] Switched to idealized part: {pname}")
|
||||||
|
break
|
||||||
|
|
||||||
|
try:
|
||||||
|
part_dir = os.path.dirname(work_part.FullPath)
|
||||||
|
except Exception:
|
||||||
|
part_dir = os.getcwd()
|
||||||
|
|
||||||
|
data_dir = os.path.join(part_dir, "adaptive_isogrid_data")
|
||||||
|
|
||||||
|
if not os.path.isdir(data_dir):
|
||||||
|
lister.WriteLine(f"[update] ERROR: Data directory not found: {data_dir}")
|
||||||
|
return
|
||||||
|
|
||||||
|
# Find rib profile JSONs
|
||||||
|
profile_files = sorted([
|
||||||
|
f for f in os.listdir(data_dir)
|
||||||
|
if f.startswith("rib_profile_") and f.endswith(".json")
|
||||||
|
])
|
||||||
|
if not profile_files:
|
||||||
|
lister.WriteLine(f"[update] ERROR: No rib_profile*.json in {data_dir}")
|
||||||
|
return
|
||||||
|
|
||||||
|
lister.WriteLine(f"[update] Found {len(profile_files)} profile(s) to update")
|
||||||
|
|
||||||
|
for profile_file in profile_files:
|
||||||
|
profile_path = os.path.join(data_dir, profile_file)
|
||||||
|
|
||||||
|
sandbox_id = profile_file.replace("rib_profile_", "").replace(".json", "")
|
||||||
|
if not sandbox_id.startswith("sandbox"):
|
||||||
|
sandbox_id = "sandbox_1"
|
||||||
|
|
||||||
|
geom_path = os.path.join(data_dir, f"geometry_{sandbox_id}.json")
|
||||||
|
if not os.path.exists(geom_path):
|
||||||
|
candidates = [f for f in os.listdir(data_dir) if f.startswith("geometry_") and f.endswith(".json")]
|
||||||
|
if candidates:
|
||||||
|
geom_path = os.path.join(data_dir, candidates[0])
|
||||||
|
else:
|
||||||
|
lister.WriteLine("[update] ERROR: No geometry JSON for transform")
|
||||||
|
continue
|
||||||
|
|
||||||
|
lister.WriteLine(f"\n--- Updating {profile_file} ---")
|
||||||
|
lister.WriteLine(f"[update] Geometry (transform): {geom_path}")
|
||||||
|
|
||||||
|
try:
|
||||||
|
with open(profile_path, "r") as f:
|
||||||
|
profile = json.load(f)
|
||||||
|
with open(geom_path, "r") as f:
|
||||||
|
geometry = json.load(f)
|
||||||
|
except Exception as exc:
|
||||||
|
lister.WriteLine(f"[update] ERROR reading JSON: {exc}")
|
||||||
|
continue
|
||||||
|
|
||||||
|
transform = geometry["transform"]
|
||||||
|
sketch_name = SKETCH_NAME_PREFIX + sandbox_id
|
||||||
|
|
||||||
|
# CRITICAL: Find existing sketch (don't create new)
|
||||||
|
sketch = _find_sketch_by_name(work_part, sketch_name, lister)
|
||||||
|
if sketch is None:
|
||||||
|
lister.WriteLine(f"[update] ERROR: Sketch not found: {sketch_name}")
|
||||||
|
lister.WriteLine("[update] Create the sketch first using import_profile.py")
|
||||||
|
continue
|
||||||
|
|
||||||
|
lister.WriteLine(f"[update] Updating existing sketch: {sketch_name}")
|
||||||
|
|
||||||
|
# Activate sketch
|
||||||
|
try:
|
||||||
|
view_false, path = _resolve_enum([
|
||||||
|
"NXOpen.Sketch.ViewReorient.FalseValue",
|
||||||
|
"NXOpen.ViewReorient.FalseValue",
|
||||||
|
])
|
||||||
|
if view_false is None:
|
||||||
|
view_false = False
|
||||||
|
sketch.Activate(view_false)
|
||||||
|
lister.WriteLine("[update] Sketch activated")
|
||||||
|
except Exception as exc:
|
||||||
|
lister.WriteLine(f"[update] ERROR activating sketch: {exc}")
|
||||||
|
continue
|
||||||
|
|
||||||
|
# Clear existing geometry
|
||||||
|
_clear_sketch_geometry(sketch, lister)
|
||||||
|
|
||||||
|
# --- Draw new geometry (same as import_profile.py) ---
|
||||||
|
pockets = profile.get("pockets", [])
|
||||||
|
outer_2d = profile.get("outer_boundary", [])
|
||||||
|
|
||||||
|
# Check if pockets are structured (lines+arcs) or legacy (point lists)
|
||||||
|
is_structured = (len(pockets) > 0 and isinstance(pockets[0], dict)
|
||||||
|
and 'lines' in pockets[0])
|
||||||
|
|
||||||
|
if is_structured:
|
||||||
|
lister.WriteLine(f"[update] Drawing {len(pockets)} structured pockets + outer boundary")
|
||||||
|
|
||||||
|
# Outer boundary
|
||||||
|
outer_lines, outer_arcs = _draw_outer_boundary(work_part, outer_2d, transform, lister)
|
||||||
|
lister.WriteLine(f"[update] Outer boundary: {outer_lines} lines + {outer_arcs} arcs")
|
||||||
|
|
||||||
|
# Pocket outlines
|
||||||
|
total_lines = outer_lines
|
||||||
|
total_arcs = outer_arcs
|
||||||
|
for idx, pocket in enumerate(pockets):
|
||||||
|
nl, na = _draw_structured_pocket(work_part, pocket, transform, lister)
|
||||||
|
total_lines += nl
|
||||||
|
total_arcs += na
|
||||||
|
if (idx + 1) % 50 == 0:
|
||||||
|
lister.WriteLine(f"[update] ... {idx+1}/{len(pockets)} pockets drawn")
|
||||||
|
|
||||||
|
lister.WriteLine(f"[update] Pockets done: {total_lines} lines + {total_arcs} arcs")
|
||||||
|
|
||||||
|
# Holes (bolt circles)
|
||||||
|
holes = profile.get("holes", [])
|
||||||
|
if holes:
|
||||||
|
holes_drawn = 0
|
||||||
|
for hole in holes:
|
||||||
|
try:
|
||||||
|
cx, cy = hole["center"]
|
||||||
|
r = hole.get("radius", hole.get("diameter", 0) / 2.0)
|
||||||
|
p1 = [cx + r, cy]
|
||||||
|
p2 = [cx, cy + r]
|
||||||
|
p3 = [cx - r, cy]
|
||||||
|
p4 = [cx, cy - r]
|
||||||
|
p1_3d = unproject_point_to_3d(p1, transform)
|
||||||
|
p2_3d = unproject_point_to_3d(p2, transform)
|
||||||
|
p3_3d = unproject_point_to_3d(p3, transform)
|
||||||
|
p4_3d = unproject_point_to_3d(p4, transform)
|
||||||
|
_draw_arc_3pt(work_part, p1_3d, p2_3d, p3_3d)
|
||||||
|
_draw_arc_3pt(work_part, p3_3d, p4_3d, p1_3d)
|
||||||
|
holes_drawn += 1
|
||||||
|
total_arcs += 2
|
||||||
|
except Exception as exc:
|
||||||
|
lister.WriteLine(f"[update] WARN: hole failed: {exc}")
|
||||||
|
lister.WriteLine(f"[update] Holes: {holes_drawn}/{len(holes)} drawn ({holes_drawn*2} arcs)")
|
||||||
|
|
||||||
|
lister.WriteLine(f"[update] Total: {total_lines} lines + {total_arcs} arcs")
|
||||||
|
|
||||||
|
else:
|
||||||
|
# Legacy format
|
||||||
|
lister.WriteLine(f"[update] Legacy format: {len(pockets)} pocket polylines")
|
||||||
|
outer_lines, outer_arcs = _draw_outer_boundary(work_part, outer_2d, transform, lister)
|
||||||
|
total_lines = outer_lines
|
||||||
|
for pocket_pts in pockets:
|
||||||
|
if len(pocket_pts) < 3:
|
||||||
|
continue
|
||||||
|
pocket_3d = unproject_to_3d(pocket_pts, transform)
|
||||||
|
n = len(pocket_3d)
|
||||||
|
d = math.sqrt(sum((a - b)**2 for a, b in zip(pocket_3d[0], pocket_3d[-1])))
|
||||||
|
if d < 0.001:
|
||||||
|
n -= 1
|
||||||
|
for i in range(n):
|
||||||
|
try:
|
||||||
|
_draw_line(work_part, pocket_3d[i], pocket_3d[(i+1) % n])
|
||||||
|
total_lines += 1
|
||||||
|
except Exception:
|
||||||
|
pass
|
||||||
|
lister.WriteLine(f"[update] Done: {total_lines} lines in sketch")
|
||||||
|
|
||||||
|
# Deactivate sketch
|
||||||
|
try:
|
||||||
|
update_model, _ = _resolve_enum([
|
||||||
|
"NXOpen.Sketch.UpdateLevel.Model",
|
||||||
|
"NXOpen.UpdateLevel.Model",
|
||||||
|
])
|
||||||
|
if update_model is None:
|
||||||
|
update_model = 1
|
||||||
|
sketch.Deactivate(view_false, update_model)
|
||||||
|
lister.WriteLine("[update] Sketch deactivated and updated")
|
||||||
|
except Exception as exc:
|
||||||
|
lister.WriteLine(f"[update] Warning deactivating: {exc}")
|
||||||
|
|
||||||
|
lister.WriteLine(f"[update] ✓ Sketch updated: {sketch_name}")
|
||||||
|
lister.WriteLine(f"[update] Extrude should update automatically!")
|
||||||
|
|
||||||
|
lister.WriteLine("\n" + "=" * 60)
|
||||||
|
lister.WriteLine(" Update complete")
|
||||||
|
lister.WriteLine("=" * 60)
|
||||||
|
|
||||||
|
|
||||||
|
main()
|
||||||
19
tools/adaptive-isogrid/tests/params_edge_focused.json
Normal file
19
tools/adaptive-isogrid/tests/params_edge_focused.json
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
{
|
||||||
|
"eta_0": 0.05,
|
||||||
|
"alpha": 0.3,
|
||||||
|
"R_0": 40.0,
|
||||||
|
"kappa": 1.0,
|
||||||
|
"p": 2.0,
|
||||||
|
"beta": 1.5,
|
||||||
|
"R_edge": 25.0,
|
||||||
|
"s_min": 25.0,
|
||||||
|
"s_max": 80.0,
|
||||||
|
"t_min": 2.5,
|
||||||
|
"t_0": 3.5,
|
||||||
|
"gamma": 1.0,
|
||||||
|
"w_frame": 3.0,
|
||||||
|
"r_f": 1.5,
|
||||||
|
"d_keep": 0.8,
|
||||||
|
"min_pocket_radius": 8.0,
|
||||||
|
"min_triangle_area": 30.0
|
||||||
|
}
|
||||||
19
tools/adaptive-isogrid/tests/params_hole_focused.json
Normal file
19
tools/adaptive-isogrid/tests/params_hole_focused.json
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
{
|
||||||
|
"eta_0": 0.05,
|
||||||
|
"alpha": 1.8,
|
||||||
|
"R_0": 50.0,
|
||||||
|
"kappa": 1.0,
|
||||||
|
"p": 2.0,
|
||||||
|
"beta": 0.15,
|
||||||
|
"R_edge": 10.0,
|
||||||
|
"s_min": 20.0,
|
||||||
|
"s_max": 90.0,
|
||||||
|
"t_min": 2.5,
|
||||||
|
"t_0": 3.5,
|
||||||
|
"gamma": 1.0,
|
||||||
|
"w_frame": 3.0,
|
||||||
|
"r_f": 1.5,
|
||||||
|
"d_keep": 0.8,
|
||||||
|
"min_pocket_radius": 8.0,
|
||||||
|
"min_triangle_area": 30.0
|
||||||
|
}
|
||||||
19
tools/adaptive-isogrid/tests/params_large_triangles.json
Normal file
19
tools/adaptive-isogrid/tests/params_large_triangles.json
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
{
|
||||||
|
"eta_0": 0.1,
|
||||||
|
"alpha": 1.0,
|
||||||
|
"R_0": 40.0,
|
||||||
|
"kappa": 1.0,
|
||||||
|
"p": 2.0,
|
||||||
|
"beta": 0.3,
|
||||||
|
"R_edge": 15.0,
|
||||||
|
"s_min": 30.0,
|
||||||
|
"s_max": 100.0,
|
||||||
|
"t_min": 2.5,
|
||||||
|
"t_0": 3.5,
|
||||||
|
"gamma": 1.0,
|
||||||
|
"w_frame": 3.0,
|
||||||
|
"r_f": 1.5,
|
||||||
|
"d_keep": 0.8,
|
||||||
|
"min_pocket_radius": 8.0,
|
||||||
|
"min_triangle_area": 30.0
|
||||||
|
}
|
||||||
@@ -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
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -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
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
18187
tools/adaptive-isogrid/tests/sandbox_results/rib_profile_sandbox_1.json
Normal file
18187
tools/adaptive-isogrid/tests/sandbox_results/rib_profile_sandbox_1.json
Normal file
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user