benikigai/ec-1Public

EC-1 Wireless Controller

geometry.json · 23 KB · commit #1 · Nov 1, 2026

SHA-256 762e5f5ed9c46913c5ba254d0914fa47f36e933ad7c70f7256a2b4c332aa7769

{
  "generator": "tools/make_cad.py",
  "synthetic": true,
  "units": {
    "length": "mm",
    "volume": "mm3",
    "area": "mm2"
  },
  "frame": "origin at footprint centre, z = 0 at the underside of the bottom shell, +x face-button side, +y away from the player, +z up",
  "tessellation": {
    "linear_deflection_mm": 0.05,
    "angular_deflection_rad": 0.15
  },
  "parts": {
    "part:top-shell": {
      "title": "Top shell",
      "step": "parts/top-shell.step",
      "glb": "parts/top-shell.glb",
      "quantity_per_unit": 1,
      "frame": "product",
      "volume_mm3": 14731.544,
      "surface_area_mm2": 19694.063,
      "bbox_mm": {
        "min": [
          -60.0,
          -28.0,
          2.0
        ],
        "max": [
          60.0,
          28.0,
          22.0
        ],
        "size": [
          120.0,
          56.0,
          20.0
        ]
      },
      "centroid_mm": [
        1.302,
        -0.942,
        18.884
      ],
      "materials": [
        "shell-charcoal"
      ],
      "mesh_triangles": 20996
    },
    "part:bottom-shell": {
      "title": "Bottom shell",
      "step": "parts/bottom-shell.step",
      "glb": "parts/bottom-shell.glb",
      "quantity_per_unit": 1,
      "frame": "product",
      "volume_mm3": 15702.44,
      "surface_area_mm2": 20655.576,
      "bbox_mm": {
        "min": [
          -60.0,
          -28.0,
          -0.0
        ],
        "max": [
          60.0,
          28.0,
          12.0
        ],
        "size": [
          120.0,
          56.0,
          12.0
        ]
      },
      "centroid_mm": [
        0.011,
        -0.098,
        2.95
      ],
      "materials": [
        "shell-charcoal"
      ],
      "mesh_triangles": 14504
    },
    "part:button-cap": {
      "title": "Face button cap",
      "step": "parts/button-cap.step",
      "glb": "parts/button-cap.glb",
      "quantity_per_unit": 4,
      "frame": "instance-local (own axis at x = y = 0, product z)",
      "volume_mm3": 326.511,
      "surface_area_mm2": 335.315,
      "bbox_mm": {
        "min": [
          -4.7,
          -4.7,
          12.5
        ],
        "max": [
          4.7,
          4.7,
          25.5
        ],
        "size": [
          9.4,
          9.4,
          13.0
        ]
      },
      "centroid_mm": [
        -0.0,
        0.0,
        21.255
      ],
      "materials": [
        "button-offwhite"
      ],
      "mesh_triangles": 4890
    },
    "part:shoulder-button": {
      "title": "Shoulder button",
      "step": "parts/shoulder-button.step",
      "glb": "parts/shoulder-button.glb",
      "quantity_per_unit": 2,
      "frame": "instance-local (own axis at x = y = 0, product z)",
      "volume_mm3": 621.245,
      "surface_area_mm2": 588.414,
      "bbox_mm": {
        "min": [
          -12.0,
          20.0,
          14.3
        ],
        "max": [
          12.0,
          29.5,
          19.7
        ],
        "size": [
          24.0,
          9.5,
          5.4
        ]
      },
      "centroid_mm": [
        -0.0,
        26.536,
        17.0
      ],
      "materials": [
        "button-offwhite"
      ],
      "mesh_triangles": 2274
    },
    "part:dome-sheet": {
      "title": "Silicone dome sheet",
      "step": "parts/dome-sheet.step",
      "glb": "parts/dome-sheet.glb",
      "quantity_per_unit": 1,
      "frame": "product",
      "volume_mm3": 574.395,
      "surface_area_mm2": 1421.786,
      "bbox_mm": {
        "min": [
          19.0,
          -9.0,
          11.0
        ],
        "max": [
          45.0,
          17.0,
          12.5
        ],
        "size": [
          26.0,
          26.0,
          1.5
        ]
      },
      "centroid_mm": [
        32.0,
        4.0,
        11.444
      ],
      "materials": [
        "dome-silicone"
      ],
      "mesh_triangles": 2956
    },
    "part:stick-module": {
      "title": "Analog stick module",
      "step": "parts/stick-module.step",
      "glb": "parts/stick-module.glb",
      "quantity_per_unit": 1,
      "frame": "product",
      "volume_mm3": 3886.431,
      "surface_area_mm2": 2316.272,
      "bbox_mm": {
        "min": [
          -45.0,
          -9.0,
          11.0
        ],
        "max": [
          -19.0,
          17.0,
          28.0
        ],
        "size": [
          26.0,
          26.0,
          17.0
        ]
      },
      "centroid_mm": [
        -32.0,
        4.0,
        17.736
      ],
      "materials": [
        "stick-body-grey",
        "stick-cap-black"
      ],
      "mesh_triangles": 10386
    },
    "part:main-pcba": {
      "title": "Main PCBA",
      "step": "parts/main-pcba.step",
      "glb": "parts/main-pcba.glb",
      "quantity_per_unit": 1,
      "frame": "product",
      "volume_mm3": 5513.225,
      "surface_area_mm2": 11196.3,
      "bbox_mm": {
        "min": [
          -56.0,
          -24.0,
          6.4
        ],
        "max": [
          56.0,
          26.0,
          13.5
        ],
        "size": [
          112.0,
          50.0,
          7.1
        ]
      },
      "centroid_mm": [
        0.083,
        0.299,
        10.471
      ],
      "materials": [
        "pcb-green",
        "ic-black",
        "antenna-white",
        "led-white",
        "connector-silver"
      ],
      "mesh_triangles": 2628
    },
    "part:battery": {
      "title": "Li-ion pouch battery",
      "step": "parts/battery.step",
      "glb": "parts/battery.glb",
      "quantity_per_unit": 1,
      "frame": "product",
      "volume_mm3": 6751.644,
      "surface_area_mm2": 3218.426,
      "bbox_mm": {
        "min": [
          -20.0,
          -25.5,
          2.0
        ],
        "max": [
          20.0,
          7.0,
          11.8
        ],
        "size": [
          40.0,
          32.5,
          9.8
        ]
      },
      "centroid_mm": [
        0.035,
        -7.193,
        4.995
      ],
      "materials": [
        "battery-silver",
        "battery-lead-red"
      ],
      "mesh_triangles": 3112
    },
    "part:haptic-lra": {
      "title": "Haptic LRA",
      "step": "parts/haptic-lra.step",
      "glb": "parts/haptic-lra.glb",
      "quantity_per_unit": 1,
      "frame": "product",
      "volume_mm3": 249.117,
      "surface_area_mm2": 274.161,
      "bbox_mm": {
        "min": [
          -50.0,
          -16.0,
          2.0
        ],
        "max": [
          -37.0,
          -6.0,
          5.2
        ],
        "size": [
          13.0,
          10.0,
          3.2
        ]
      },
      "centroid_mm": [
        -44.95,
        -11.0,
        3.58
      ],
      "materials": [
        "haptic-grey",
        "flex-amber"
      ],
      "mesh_triangles": 1352
    },
    "part:screw-m2x6": {
      "title": "Screw M2 x 6 pan head",
      "step": "parts/screw-m2x6.step",
      "glb": "parts/screw-m2x6.glb",
      "quantity_per_unit": 4,
      "frame": "instance-local (own axis at x = y = 0, product z)",
      "volume_mm3": 31.301,
      "surface_area_mm2": 78.446,
      "bbox_mm": {
        "min": [
          -1.9,
          -1.9,
          0.0
        ],
        "max": [
          1.9,
          1.9,
          7.3
        ],
        "size": [
          3.8,
          3.8,
          7.3
        ]
      },
      "centroid_mm": [
        -0.0,
        0.0,
        2.819
      ],
      "materials": [
        "screw-steel"
      ],
      "mesh_triangles": 4580
    },
    "part:rating-label": {
      "title": "Rating label",
      "step": "parts/rating-label.step",
      "glb": "parts/rating-label.glb",
      "quantity_per_unit": 1,
      "frame": "product",
      "volume_mm3": 35.914,
      "surface_area_mm2": 726.512,
      "bbox_mm": {
        "min": [
          -15.0,
          -16.0,
          -0.1
        ],
        "max": [
          15.0,
          -4.0,
          0.0
        ],
        "size": [
          30.0,
          12.0,
          0.1
        ]
      },
      "centroid_mm": [
        -0.0,
        -10.0,
        -0.05
      ],
      "materials": [
        "label-white"
      ],
      "mesh_triangles": 348
    },
    "part:light-pipe": {
      "title": "LED light pipe",
      "step": "parts/light-pipe.step",
      "glb": "parts/light-pipe.glb",
      "quantity_per_unit": 1,
      "frame": "product",
      "volume_mm3": 26.724,
      "surface_area_mm2": 83.07,
      "bbox_mm": {
        "min": [
          -2.25,
          16.5,
          11.8
        ],
        "max": [
          2.25,
          19.5,
          22.0
        ],
        "size": [
          4.5,
          3.0,
          10.2
        ]
      },
      "centroid_mm": [
        -0.0,
        18.0,
        18.369
      ],
      "materials": [
        "light-pipe-clear"
      ],
      "mesh_triangles": 1036
    }
  },
  "instances": [
    {
      "id": "part:top-shell",
      "part": "part:top-shell",
      "translation": [
        0.0,
        0.0,
        0.0
      ],
      "exploded_offset": [
        0.0,
        0.0,
        112.0
      ],
      "usd_prim": "/Product/TopShell",
      "assembly": "asm:top-sub"
    },
    {
      "id": "part:button-cap#1",
      "part": "part:button-cap",
      "translation": [
        32.0,
        13.0,
        0.0
      ],
      "exploded_offset": [
        0.0,
        0.0,
        72.0
      ],
      "usd_prim": "/Product/ButtonCap_1",
      "assembly": "asm:top-sub"
    },
    {
      "id": "part:button-cap#2",
      "part": "part:button-cap",
      "translation": [
        41.0,
        4.0,
        0.0
      ],
      "exploded_offset": [
        0.0,
        0.0,
        72.0
      ],
      "usd_prim": "/Product/ButtonCap_2",
      "assembly": "asm:top-sub"
    },
    {
      "id": "part:button-cap#3",
      "part": "part:button-cap",
      "translation": [
        32.0,
        -5.0,
        0.0
      ],
      "exploded_offset": [
        0.0,
        0.0,
        72.0
      ],
      "usd_prim": "/Product/ButtonCap_3",
      "assembly": "asm:top-sub"
    },
    {
      "id": "part:button-cap#4",
      "part": "part:button-cap",
      "translation": [
        23.0,
        4.0,
        0.0
      ],
      "exploded_offset": [
        0.0,
        0.0,
        72.0
      ],
      "usd_prim": "/Product/ButtonCap_4",
      "assembly": "asm:top-sub"
    },
    {
      "id": "part:shoulder-button#1",
      "part": "part:shoulder-button",
      "translation": [
        -38.0,
        0.0,
        0.0
      ],
      "exploded_offset": [
        0.0,
        4.0,
        60.0
      ],
      "usd_prim": "/Product/ShoulderButton_L",
      "assembly": "asm:top-sub"
    },
    {
      "id": "part:shoulder-button#2",
      "part": "part:shoulder-button",
      "translation": [
        38.0,
        0.0,
        0.0
      ],
      "exploded_offset": [
        0.0,
        4.0,
        60.0
      ],
      "usd_prim": "/Product/ShoulderButton_R",
      "assembly": "asm:top-sub"
    },
    {
      "id": "part:dome-sheet",
      "part": "part:dome-sheet",
      "translation": [
        0.0,
        0.0,
        0.0
      ],
      "exploded_offset": [
        0.0,
        0.0,
        50.0
      ],
      "usd_prim": "/Product/DomeSheet",
      "assembly": "asm:top-sub"
    },
    {
      "id": "part:light-pipe",
      "part": "part:light-pipe",
      "translation": [
        0.0,
        0.0,
        0.0
      ],
      "exploded_offset": [
        0.0,
        0.0,
        112.0
      ],
      "usd_prim": "/Product/LightPipe",
      "assembly": "asm:top-sub"
    },
    {
      "id": "part:bottom-shell",
      "part": "part:bottom-shell",
      "translation": [
        0.0,
        0.0,
        0.0
      ],
      "exploded_offset": [
        0.0,
        0.0,
        0.0
      ],
      "usd_prim": "/Product/BottomShell",
      "assembly": "asm:core"
    },
    {
      "id": "part:battery",
      "part": "part:battery",
      "translation": [
        0.0,
        0.0,
        0.0
      ],
      "exploded_offset": [
        0.0,
        0.0,
        18.0
      ],
      "usd_prim": "/Product/Battery",
      "assembly": "asm:core"
    },
    {
      "id": "part:haptic-lra",
      "part": "part:haptic-lra",
      "translation": [
        0.0,
        0.0,
        0.0
      ],
      "exploded_offset": [
        0.0,
        0.0,
        18.0
      ],
      "usd_prim": "/Product/HapticLRA",
      "assembly": "asm:core"
    },
    {
      "id": "part:main-pcba",
      "part": "part:main-pcba",
      "translation": [
        0.0,
        0.0,
        0.0
      ],
      "exploded_offset": [
        0.0,
        0.0,
        34.0
      ],
      "usd_prim": "/Product/MainPCBA",
      "assembly": "asm:core"
    },
    {
      "id": "part:stick-module",
      "part": "part:stick-module",
      "translation": [
        0.0,
        0.0,
        0.0
      ],
      "exploded_offset": [
        0.0,
        0.0,
        54.0
      ],
      "usd_prim": "/Product/StickModule",
      "assembly": "asm:core"
    },
    {
      "id": "part:screw-m2x6#1",
      "part": "part:screw-m2x6",
      "translation": [
        -50.0,
        18.0,
        0.0
      ],
      "exploded_offset": [
        0.0,
        0.0,
        -18.0
      ],
      "usd_prim": "/Product/Screw_1",
      "assembly": "asm:ec-1"
    },
    {
      "id": "part:screw-m2x6#2",
      "part": "part:screw-m2x6",
      "translation": [
        50.0,
        18.0,
        0.0
      ],
      "exploded_offset": [
        0.0,
        0.0,
        -18.0
      ],
      "usd_prim": "/Product/Screw_2",
      "assembly": "asm:ec-1"
    },
    {
      "id": "part:screw-m2x6#3",
      "part": "part:screw-m2x6",
      "translation": [
        50.0,
        -18.0,
        0.0
      ],
      "exploded_offset": [
        0.0,
        0.0,
        -18.0
      ],
      "usd_prim": "/Product/Screw_3",
      "assembly": "asm:ec-1"
    },
    {
      "id": "part:screw-m2x6#4",
      "part": "part:screw-m2x6",
      "translation": [
        -50.0,
        -18.0,
        0.0
      ],
      "exploded_offset": [
        0.0,
        0.0,
        -18.0
      ],
      "usd_prim": "/Product/Screw_4",
      "assembly": "asm:ec-1"
    },
    {
      "id": "part:rating-label",
      "part": "part:rating-label",
      "translation": [
        0.0,
        0.0,
        0.0
      ],
      "exploded_offset": [
        0.0,
        0.0,
        -8.0
      ],
      "usd_prim": "/Product/RatingLabel",
      "assembly": "asm:ec-1"
    }
  ],
  "fit_checks": {
    "interferences": [
      {
        "a": "part:top-shell",
        "b": "part:screw-m2x6#1",
        "volume_mm3": 4.423,
        "expected": true,
        "note": "thread engagement: \u00d82 thread-forming screw in the top-shell boss's \u00d81.7 pilot"
      },
      {
        "a": "part:top-shell",
        "b": "part:screw-m2x6#2",
        "volume_mm3": 4.423,
        "expected": true,
        "note": "thread engagement: \u00d82 thread-forming screw in the top-shell boss's \u00d81.7 pilot"
      },
      {
        "a": "part:top-shell",
        "b": "part:screw-m2x6#3",
        "volume_mm3": 4.423,
        "expected": true,
        "note": "thread engagement: \u00d82 thread-forming screw in the top-shell boss's \u00d81.7 pilot"
      },
      {
        "a": "part:top-shell",
        "b": "part:screw-m2x6#4",
        "volume_mm3": 4.423,
        "expected": true,
        "note": "thread engagement: \u00d82 thread-forming screw in the top-shell boss's \u00d81.7 pilot"
      }
    ],
    "clearances": [
      {
        "a": "part:button-cap#1",
        "b": "part:top-shell",
        "min_distance_mm": 0.1,
        "what": "face button in its hole and sleeve"
      },
      {
        "a": "part:button-cap#2",
        "b": "part:top-shell",
        "min_distance_mm": 0.1,
        "what": "face button in its hole and sleeve"
      },
      {
        "a": "part:button-cap#3",
        "b": "part:top-shell",
        "min_distance_mm": 0.1,
        "what": "face button in its hole and sleeve"
      },
      {
        "a": "part:button-cap#4",
        "b": "part:top-shell",
        "min_distance_mm": 0.1,
        "what": "face button in its hole and sleeve"
      },
      {
        "a": "part:shoulder-button#1",
        "b": "part:top-shell",
        "min_distance_mm": 0.19,
        "what": "shoulder button in its slot"
      },
      {
        "a": "part:shoulder-button#2",
        "b": "part:top-shell",
        "min_distance_mm": 0.19,
        "what": "shoulder button in its slot"
      },
      {
        "a": "part:stick-module",
        "b": "part:top-shell",
        "min_distance_mm": 0.6,
        "what": "stick module under the shell / in the \u00d821 hole"
      },
      {
        "a": "part:main-pcba",
        "b": "part:top-shell",
        "min_distance_mm": 0.3,
        "what": "PCBA clearance holes around the top-shell bosses"
      },
      {
        "a": "part:main-pcba",
        "b": "part:bottom-shell",
        "min_distance_mm": 0.0,
        "what": "PCBA to bottom shell (sits on the support ribs)"
      },
      {
        "a": "part:light-pipe",
        "b": "part:top-shell",
        "min_distance_mm": 0.05,
        "what": "light pipe head in the LED window / collar under the skin"
      },
      {
        "a": "part:light-pipe",
        "b": "part:main-pcba",
        "min_distance_mm": 0.2,
        "what": "light pipe to the LED"
      },
      {
        "a": "part:haptic-lra",
        "b": "part:top-shell",
        "min_distance_mm": 1.102,
        "what": "LRA to the top-shell boss at (-50, -18)"
      },
      {
        "a": "part:screw-m2x6#1",
        "b": "part:bottom-shell",
        "min_distance_mm": 0.0,
        "what": "screw head in its counterbore"
      },
      {
        "a": "part:screw-m2x6#2",
        "b": "part:bottom-shell",
        "min_distance_mm": 0.0,
        "what": "screw head in its counterbore"
      },
      {
        "a": "part:screw-m2x6#3",
        "b": "part:bottom-shell",
        "min_distance_mm": 0.0,
        "what": "screw head in its counterbore"
      },
      {
        "a": "part:screw-m2x6#4",
        "b": "part:bottom-shell",
        "min_distance_mm": 0.0,
        "what": "screw head in its counterbore"
      },
      {
        "a": "part:battery",
        "b": "part:bottom-shell",
        "min_distance_mm": 0.4,
        "what": "battery in its pocket"
      },
      {
        "a": "part:battery",
        "b": "part:main-pcba",
        "min_distance_mm": 0.05,
        "what": "battery to PCBA (lead touches the connector)"
      },
      {
        "a": "part:haptic-lra",
        "b": "part:bottom-shell",
        "min_distance_mm": 0.352,
        "what": "LRA to bottom shell and boss collar"
      },
      {
        "a": "part:haptic-lra",
        "b": "part:battery",
        "min_distance_mm": 17.0,
        "what": "LRA to battery"
      },
      {
        "a": "part:dome-sheet",
        "b": "part:top-shell",
        "min_distance_mm": 3.444,
        "what": "dome sheet to top shell"
      },
      {
        "a": "part:button-cap#1",
        "b": "part:dome-sheet",
        "min_distance_mm": 0.0,
        "what": "button stem resting on its dome"
      },
      {
        "a": "part:button-cap#2",
        "b": "part:dome-sheet",
        "min_distance_mm": 0.0,
        "what": "button stem resting on its dome"
      },
      {
        "a": "part:button-cap#3",
        "b": "part:dome-sheet",
        "min_distance_mm": 0.0,
        "what": "button stem resting on its dome"
      },
      {
        "a": "part:button-cap#4",
        "b": "part:dome-sheet",
        "min_distance_mm": 0.0,
        "what": "button stem resting on its dome"
      },
      {
        "a": "top-shell boss (-50, 18)",
        "b": "part:bottom-shell",
        "min_distance_mm": 0.15,
        "what": "boss in its locating collar"
      },
      {
        "a": "top-shell boss (50, 18)",
        "b": "part:bottom-shell",
        "min_distance_mm": 0.15,
        "what": "boss in its locating collar"
      },
      {
        "a": "top-shell boss (50, -18)",
        "b": "part:bottom-shell",
        "min_distance_mm": 0.15,
        "what": "boss in its locating collar"
      },
      {
        "a": "top-shell boss (-50, -18)",
        "b": "part:bottom-shell",
        "min_distance_mm": 0.15,
        "what": "boss in its locating collar"
      },
      {
        "a": "PCBA antenna (52, 0)",
        "b": "part:bottom-shell",
        "min_distance_mm": 0.9,
        "what": "antenna to the nearest snap-hook nub"
      },
      {
        "a": "PCBA antenna",
        "b": "part:haptic-lra",
        "min_distance_mm": 87.361,
        "what": "antenna to LRA (>= 5 required)"
      }
    ],
    "concentricity": [
      {
        "what": "stick cap centre vs hole centre (-32, 4)",
        "offset_mm": 0.0
      },
      {
        "what": "button-cap#1 centre vs hole (32, 13)",
        "offset_mm": 0.0
      },
      {
        "what": "button-cap#2 centre vs hole (41, 4)",
        "offset_mm": 0.0
      },
      {
        "what": "button-cap#3 centre vs hole (32, -5)",
        "offset_mm": 0.0
      },
      {
        "what": "button-cap#4 centre vs hole (23, 4)",
        "offset_mm": 0.0
      },
      {
        "what": "screw thread engagement in the top-shell boss (mm, per screw)",
        "offset_mm": [
          5.3,
          5.3,
          5.3,
          5.3
        ]
      }
    ]
  },
  "notes": [
    "Screw construction (revised): the four OD 5 screw bosses (\u00d81.7 pilot) are on the top shell and hang from the skin down to z 2.0 at (\u00b150, \u00b118). The bottom shell has \u00d84 x 1.3 counterbores, \u00d82.2 through-holes and an ID 5.3 / OD 6.5 locating collar (z 1.6..4.0) around each boss; it has no bosses of its own. The M2 x 6 head sits in the counterbore (z 0..1.3) and the thread engages the top-shell boss from z 2.0 to 7.3, clamping the shells together at the parting line.",
    "Main PCBA has four \u00d85.6 clearance holes for the bosses and rests on four 1.2 mm support ribs on the bottom-shell walls (tops at z 10): +x and -x walls at y = 10, +y wall at x = -25, -y wall at x = 30.",
    "Chip antenna moved from (50, 18) to (52, 0), off the boss path.",
    "New part part:light-pipe (clear PC): \u00d81.4 rod from z 11.8 (0.2 above the LED) to a 4.5 x 3 x 0.6 retention collar under the skin, then a 2.9 x 1.4 head that fills the 3 x 1.5 window and ends flush with the top surface at z 22. Exploded with the top shell (+112).",
    "LRA moved from (-45, -14) to (-45, -11): at the contract position the \u00d810 motor overlaps the \u00d85 screw boss at (-50, -18) by 1.1 mm.",
    "Face-button flange sits at z 19.5..20.3 (contract z 21..21.8 lies inside the 1.6 mm top skin); stem z 12.5..19.5.",
    "Stick module square frame ends at z 19 and a round \u00d817 gimbal housing rises to z 21 inside the \u00d821 hole; an 18 x 18 block to z 21 would cut 0.6 mm into the shell ceiling at z 20.4.",
    "USB-C receptacle hangs under the board edge (z 6.4..9.6) so its mouth lines up with the shell opening centred at z 8.",
    "Dome sheet: 0.8 mm base (z 11..11.8) with \u00d86 domes rising to z 12.5 where the button stems rest.",
    "Battery part includes its lead: a 2.4 x 0.6 ribbon routed past the board edge into the connector at (12, -18), so its bounding box reaches z 11.8."
  ]
}