{
  "schema": "vextcad.vxl.v1",
  "id": "gyroid_lattice_cube",
  "units": {"angle": "deg", "length": "mm"},
  "needs": [
    {"id": "closed_surface", "source": "user", "text": "The lattice cube has a closed, consistently oriented manifold surface."},
    {"id": "single_piece", "source": "user", "text": "The gyroid network is one connected piece without floating fragments."},
    {"id": "clean_surface", "source": "user", "text": "The delivered surface has no triangle self intersections."},
    {"id": "cube_size", "source": "user", "text": "The lattice fills a 48 mm cube standing on the desk plane."},
    {"id": "light_lattice", "source": "user", "text": "The lattice uses about half the material of a solid cube."}
  ],
  "params": [
    {"id": "side", "type": "length", "value": "48"},
    {"id": "cell_size", "type": "length", "value": "16"},
    {"id": "voxel_size", "type": "length", "value": "0.4"}
  ],
  "lets": [
    {"id": "half", "expr": "side / 2", "type": "length"},
    {"id": "cube_volume", "expr": "side * side * side"}
  ],
  "parts": [
    {
      "id": "cube",
      "deliver": "body",
      "rep": "mesh",
      "role": "deliverable",
      "steps": [
        {"id": "lattice_field", "op": "field", "bind": "shape", "expr": {"kind": "intersect", "nodes": [{"center": ["0", "0", "half"], "size": ["2 * (half)", "2 * (half)", "2 * (half)"], "kind": "box"}, {"kind": "transform", "matrix": [["1", "0", "0", "0"], ["0", "1", "0", "0"], ["0", "0", "1", "half"]], "node": {"cell": "cell_size", "kind": "tpms", "lattice": "gyroid", "mode": "solid", "phase": ["0", "0", "0"]}}]}},
        {"id": "surface", "op": "extract", "bind": "body", "source": "shape", "grid": {"dims": ["128", "128", "128"], "origin": ["-25.400", "-25.400", "-1.400"], "voxel": ["voxel_size", "voxel_size", "voxel_size"]}, "mode": "dense"}
      ]
    }
  ],
  "requirements": [
    {"id": "closed", "kind": "closed_delivered_mesh", "subject": "cube", "covers": ["closed_surface"], "required": true},
    {"id": "connected", "kind": "component_count", "subject": "cube", "count": "1", "covers": ["single_piece"], "required": true},
    {"id": "intersection_free", "kind": "self_intersection_free", "subject": "cube", "covers": ["clean_surface"], "required": true},
    {"id": "size", "kind": "envelope", "subject": "cube", "bounds": {"max": ["half", "half", "side"], "min": ["-half", "-half", "0"]}, "tol": "0.5", "covers": ["cube_size"], "required": true},
    {"id": "lightweight", "kind": "volume_range", "subject": "cube", "max": "0.60 * cube_volume", "min": "0.40 * cube_volume", "covers": ["light_lattice"], "required": true}
  ]
}
