{
  "presentation": {
    "unit": "mm; render meshes scaled once by .001",
    "installed": "all source solids in preserved PCB datum",
    "poses": {
      "closed-front": {
        "translation_offsets_mm": {},
        "hatch_rotation_x_deg": 0,
        "hatch_pivot_mm": [
          -8,
          55,
          108
        ]
      },
      "hatch-open": {
        "translation_offsets_mm": {},
        "hatch_rotation_x_deg": -105,
        "hatch_pivot_mm": [
          -8,
          55,
          108
        ]
      },
      "exploded": {
        "translation_offsets_mm": {
          "left": [
            -48,
            0,
            0
          ],
          "right": [
            60,
            0,
            0
          ],
          "roof": [
            0,
            0,
            85
          ],
          "chamber": [
            -82,
            48,
            25
          ],
          "guard": [
            -82,
            48,
            45
          ],
          "service": [
            0,
            24,
            0
          ],
          "frontstrip": [
            0,
            -24,
            0
          ]
        },
        "hatch_rotation_x_deg": -105,
        "hatch_pivot_mm": [
          -8,
          55,
          108
        ]
      },
      "rear": {
        "translation_offsets_mm": {},
        "hatch_rotation_x_deg": 0,
        "hatch_pivot_mm": [
          -8,
          55,
          108
        ]
      }
    },
    "cameras": {
      "closed-front": {
        "position_mm": [
          216.49838256835938,
          -356.654296875,
          285.9432678222656
        ],
        "target_mm": [
          0.0,
          0.5679912567138672,
          52.125003814697266
        ],
        "lens_mm": 52,
        "resolution": [
          1500,
          1200
        ]
      },
      "hatch-open": {
        "position_mm": [
          133.05641174316406,
          -309.89691162109375,
          444.1450500488281
        ],
        "target_mm": [
          0.0,
          0.5679912567138672,
          78.23994445800781
        ],
        "lens_mm": 52,
        "resolution": [
          1500,
          1200
        ]
      },
      "exploded": {
        "position_mm": [
          298.1518859863281,
          -480.4505310058594,
          402.32403564453125
        ],
        "target_mm": [
          6.000004768371582,
          1.5999972820281982,
          86.79999542236328
        ],
        "lens_mm": 52,
        "resolution": [
          1500,
          1200
        ]
      },
      "rear": {
        "position_mm": [
          237.25938415527344,
          371.9305114746094,
          258.4375
        ],
        "target_mm": [
          0.0,
          0.5679912567138672,
          52.125003814697266
        ],
        "lens_mm": 52,
        "resolution": [
          1500,
          1200
        ]
      }
    },
    "projected_points": {
      "closed-front": {
        "cap": [
          776.7354547977448,
          307.89828300476074
        ],
        "guide": [
          808.5522651672363,
          374.7685432434082
        ],
        "insert_top": [
          777.710884809494,
          156.02052211761475
        ],
        "socket": [
          752.4119317531586,
          516.605544090271
        ],
        "service": [
          1040.7077372074127,
          616.9371843338013
        ],
        "warning": [
          774.5901346206665,
          275.86348056793213
        ]
      },
      "hatch-open": {
        "cap": [
          760.0162625312805,
          419.0124034881592
        ],
        "guide": [
          800.5516827106476,
          496.6557025909424
        ],
        "insert_top": [
          760.5528831481934,
          302.1547794342041
        ],
        "socket": [
          705.0999999046326,
          484.0869426727295
        ],
        "service": [
          991.643875837326,
          589.6605491638184
        ],
        "warning": [
          758.3861947059631,
          396.3526725769043
        ]
      },
      "exploded": {
        "cap": [
          750.5122125148773,
          486.6011381149292
        ],
        "guide": [
          772.6818323135376,
          537.4772071838379
        ],
        "insert_top": [
          750.5254447460175,
          383.4352970123291
        ],
        "socket": [
          735.6641739606857,
          620.2133417129517
        ],
        "service": [
          948.6355483531952,
          700.2082228660583
        ],
        "warning": [
          748.7971633672714,
          464.92531299591064
        ]
      },
      "rear": {
        "cap": [
          846.4622497558594,
          374.9472141265869
        ],
        "guide": [
          753.806859254837,
          408.1373691558838
        ],
        "insert_top": [
          849.6777713298798,
          213.17245960235596
        ],
        "socket": [
          1144.3974673748016,
          799.4158029556274
        ],
        "service": [
          803.8724362850189,
          929.637336730957
        ],
        "warning": [
          844.3802297115326,
          337.93673515319824
        ]
      }
    }
  },
  "validation": {
    "scope": "PROVISIONAL geometry-only concept check. NOT safe-touch, thermal or physical-fit qualification.",
    "valid_solids": true,
    "solid_count": 114,
    "installed_bounds_mm": [
      [
        -80.0,
        -79.86401475093712,
        -14.4
      ],
      [
        80.0,
        81.0,
        118.5
      ]
    ],
    "pcb_bounds_mm": [
      [
        -50.0,
        -50.0,
        -1.29936
      ],
      [
        50.0,
        50.0,
        0.0
      ]
    ],
    "tube_body_z_mm": [
      85,
      106
    ],
    "cap_diameter_height_mm": [
      11,
      5
    ],
    "cap_z_mm": [
      106,
      111
    ],
    "guide_top_mm": 103,
    "cap_lower_edge_above_guide_mm": 3,
    "cap_top_above_guide_mm": 8,
    "exposed_cap_grip_band_mm": 5,
    "guide_inner_diameter_mm": 8.5,
    "tube_diameter_mm": 7.5,
    "nominal_guide_radial_clearance_mm": 0.5,
    "closed_hatch_inside_roof_z_mm": 115.5,
    "cap_to_closed_hatch_vertical_clearance_mm": 4.5,
    "guard_projection_overhang_past_hot_block_each_side_mm": 9.5,
    "deck_to_block_top_air_gap_mm": 2,
    "guide_sleeve_to_block_top_air_gap_mm": 0.5,
    "unshielded_top_projection_outside_bore_mm3": 0,
    "guard_vs_heater_intersection_mm3": 0.0,
    "guard_vs_sensor_intersection_mm3": 0.0,
    "guard_vs_illumination_intersection_mm3": 0.0,
    "optical_axis_z_mm": 87,
    "optical_proxy_top_mm": 92,
    "deck_underside_minus_optical_top_mm": 8,
    "optical_passage_diameter_mm": 3,
    "hatch_sweep_5deg_samples": [
      {
        "deg": 0,
        "cap_mm3": 0.0,
        "tube_mm3": 0.0,
        "guard_mm3": 0.0,
        "roof_mm3": 0.0,
        "chamber_mm3": 0.0
      },
      {
        "deg": 5,
        "cap_mm3": 0.0,
        "tube_mm3": 0.0,
        "guard_mm3": 0.0,
        "roof_mm3": 0.0,
        "chamber_mm3": 0.0
      },
      {
        "deg": 10,
        "cap_mm3": 0.0,
        "tube_mm3": 0.0,
        "guard_mm3": 0.0,
        "roof_mm3": 0.0,
        "chamber_mm3": 0.0
      },
      {
        "deg": 15,
        "cap_mm3": 0.0,
        "tube_mm3": 0.0,
        "guard_mm3": 0.0,
        "roof_mm3": 0.0,
        "chamber_mm3": 0.0
      },
      {
        "deg": 20,
        "cap_mm3": 0.0,
        "tube_mm3": 0.0,
        "guard_mm3": 0.0,
        "roof_mm3": 0.0,
        "chamber_mm3": 0.0
      },
      {
        "deg": 25,
        "cap_mm3": 0.0,
        "tube_mm3": 0.0,
        "guard_mm3": 0.0,
        "roof_mm3": 0.0,
        "chamber_mm3": 0.0
      },
      {
        "deg": 30,
        "cap_mm3": 0.0,
        "tube_mm3": 0.0,
        "guard_mm3": 0.0,
        "roof_mm3": 0.0,
        "chamber_mm3": 0.0
      },
      {
        "deg": 35,
        "cap_mm3": 0.0,
        "tube_mm3": 0.0,
        "guard_mm3": 0.0,
        "roof_mm3": 0.0,
        "chamber_mm3": 0.0
      },
      {
        "deg": 40,
        "cap_mm3": 0.0,
        "tube_mm3": 0.0,
        "guard_mm3": 0.0,
        "roof_mm3": 0.0,
        "chamber_mm3": 0.0
      },
      {
        "deg": 45,
        "cap_mm3": 0.0,
        "tube_mm3": 0.0,
        "guard_mm3": 0.0,
        "roof_mm3": 0.0,
        "chamber_mm3": 0.0
      },
      {
        "deg": 50,
        "cap_mm3": 0.0,
        "tube_mm3": 0.0,
        "guard_mm3": 0.0,
        "roof_mm3": 0.0,
        "chamber_mm3": 0.0
      },
      {
        "deg": 55,
        "cap_mm3": 0.0,
        "tube_mm3": 0.0,
        "guard_mm3": 0.0,
        "roof_mm3": 0.0,
        "chamber_mm3": 0.0
      },
      {
        "deg": 60,
        "cap_mm3": 0.0,
        "tube_mm3": 0.0,
        "guard_mm3": 0.0,
        "roof_mm3": 0.0,
        "chamber_mm3": 0.0
      },
      {
        "deg": 65,
        "cap_mm3": 0.0,
        "tube_mm3": 0.0,
        "guard_mm3": 0.0,
        "roof_mm3": 0.0,
        "chamber_mm3": 0.0
      },
      {
        "deg": 70,
        "cap_mm3": 0.0,
        "tube_mm3": 0.0,
        "guard_mm3": 0.0,
        "roof_mm3": 0.0,
        "chamber_mm3": 0.0
      },
      {
        "deg": 75,
        "cap_mm3": 0.0,
        "tube_mm3": 0.0,
        "guard_mm3": 0.0,
        "roof_mm3": 0.0,
        "chamber_mm3": 0.0
      },
      {
        "deg": 80,
        "cap_mm3": 0.0,
        "tube_mm3": 0.0,
        "guard_mm3": 0.0,
        "roof_mm3": 0.0,
        "chamber_mm3": 0.0
      },
      {
        "deg": 85,
        "cap_mm3": 0.0,
        "tube_mm3": 0.0,
        "guard_mm3": 0.0,
        "roof_mm3": 0.0,
        "chamber_mm3": 0.0
      },
      {
        "deg": 90,
        "cap_mm3": 0.0,
        "tube_mm3": 0.0,
        "guard_mm3": 0.0,
        "roof_mm3": 0.0,
        "chamber_mm3": 0.0
      },
      {
        "deg": 95,
        "cap_mm3": 0.0,
        "tube_mm3": 0.0,
        "guard_mm3": 0.0,
        "roof_mm3": 0.0,
        "chamber_mm3": 0.0
      },
      {
        "deg": 100,
        "cap_mm3": 0.0,
        "tube_mm3": 0.0,
        "guard_mm3": 0.0,
        "roof_mm3": 0.0,
        "chamber_mm3": 0.0
      },
      {
        "deg": 105,
        "cap_mm3": 0.0,
        "tube_mm3": 0.0,
        "guard_mm3": 0.0,
        "roof_mm3": 0.0,
        "chamber_mm3": 0.0
      }
    ],
    "axial_insertion_1mm_samples": [
      {
        "lift_mm": 0,
        "guard_mm3": 0.0,
        "hatch_mm3": 0.0,
        "block_mm3": 0.0
      },
      {
        "lift_mm": 1,
        "guard_mm3": 0.0,
        "hatch_mm3": 0.0,
        "block_mm3": 0.0
      },
      {
        "lift_mm": 2,
        "guard_mm3": 0.0,
        "hatch_mm3": 0.0,
        "block_mm3": 0.0
      },
      {
        "lift_mm": 3,
        "guard_mm3": 0.0,
        "hatch_mm3": 0.0,
        "block_mm3": 0.0
      },
      {
        "lift_mm": 4,
        "guard_mm3": 0.0,
        "hatch_mm3": 0.0,
        "block_mm3": 0.0
      },
      {
        "lift_mm": 5,
        "guard_mm3": 0.0,
        "hatch_mm3": 0.0,
        "block_mm3": 0.0
      },
      {
        "lift_mm": 6,
        "guard_mm3": 0.0,
        "hatch_mm3": 0.0,
        "block_mm3": 0.0
      },
      {
        "lift_mm": 7,
        "guard_mm3": 0.0,
        "hatch_mm3": 0.0,
        "block_mm3": 0.0
      },
      {
        "lift_mm": 8,
        "guard_mm3": 0.0,
        "hatch_mm3": 0.0,
        "block_mm3": 0.0
      },
      {
        "lift_mm": 9,
        "guard_mm3": 0.0,
        "hatch_mm3": 0.0,
        "block_mm3": 0.0
      },
      {
        "lift_mm": 10,
        "guard_mm3": 0.0,
        "hatch_mm3": 0.0,
        "block_mm3": 0.0
      },
      {
        "lift_mm": 11,
        "guard_mm3": 0.0,
        "hatch_mm3": 0.0,
        "block_mm3": 0.0
      },
      {
        "lift_mm": 12,
        "guard_mm3": 0.0,
        "hatch_mm3": 0.0,
        "block_mm3": 0.0
      },
      {
        "lift_mm": 13,
        "guard_mm3": 0.0,
        "hatch_mm3": 0.0,
        "block_mm3": 0.0
      },
      {
        "lift_mm": 14,
        "guard_mm3": 0.0,
        "hatch_mm3": 0.0,
        "block_mm3": 0.0
      },
      {
        "lift_mm": 15,
        "guard_mm3": 0.0,
        "hatch_mm3": 0.0,
        "block_mm3": 0.0
      },
      {
        "lift_mm": 16,
        "guard_mm3": 0.0,
        "hatch_mm3": 0.0,
        "block_mm3": 0.0
      },
      {
        "lift_mm": 17,
        "guard_mm3": 0.0,
        "hatch_mm3": 0.0,
        "block_mm3": 0.0
      },
      {
        "lift_mm": 18,
        "guard_mm3": 0.0,
        "hatch_mm3": 0.0,
        "block_mm3": 0.0
      },
      {
        "lift_mm": 19,
        "guard_mm3": 0.0,
        "hatch_mm3": 0.0,
        "block_mm3": 0.0
      },
      {
        "lift_mm": 20,
        "guard_mm3": 0.0,
        "hatch_mm3": 0.0,
        "block_mm3": 0.0
      },
      {
        "lift_mm": 21,
        "guard_mm3": 0.0,
        "hatch_mm3": 0.0,
        "block_mm3": 0.0
      },
      {
        "lift_mm": 22,
        "guard_mm3": 0.0,
        "hatch_mm3": 0.0,
        "block_mm3": 0.0
      },
      {
        "lift_mm": 23,
        "guard_mm3": 0.0,
        "hatch_mm3": 0.0,
        "block_mm3": 0.0
      },
      {
        "lift_mm": 24,
        "guard_mm3": 0.0,
        "hatch_mm3": 0.0,
        "block_mm3": 0.0
      },
      {
        "lift_mm": 25,
        "guard_mm3": 0.0,
        "hatch_mm3": 0.0,
        "block_mm3": 0.0
      },
      {
        "lift_mm": 26,
        "guard_mm3": 0.0,
        "hatch_mm3": 0.0,
        "block_mm3": 0.0
      },
      {
        "lift_mm": 27,
        "guard_mm3": 0.0,
        "hatch_mm3": 0.0,
        "block_mm3": 0.0
      },
      {
        "lift_mm": 28,
        "guard_mm3": 0.0,
        "hatch_mm3": 0.0,
        "block_mm3": 0.0
      },
      {
        "lift_mm": 29,
        "guard_mm3": 0.0,
        "hatch_mm3": 0.0,
        "block_mm3": 0.0
      },
      {
        "lift_mm": 30,
        "guard_mm3": 0.0,
        "hatch_mm3": 0.0,
        "block_mm3": 0.0
      },
      {
        "lift_mm": 31,
        "guard_mm3": 0.0,
        "hatch_mm3": 0.0,
        "block_mm3": 0.0
      },
      {
        "lift_mm": 32,
        "guard_mm3": 0.0,
        "hatch_mm3": 0.0,
        "block_mm3": 0.0
      },
      {
        "lift_mm": 33,
        "guard_mm3": 0.0,
        "hatch_mm3": 0.0,
        "block_mm3": 0.0
      },
      {
        "lift_mm": 34,
        "guard_mm3": 0.0,
        "hatch_mm3": 0.0,
        "block_mm3": 0.0
      },
      {
        "lift_mm": 35,
        "guard_mm3": 0.0,
        "hatch_mm3": 0.0,
        "block_mm3": 0.0
      },
      {
        "lift_mm": 36,
        "guard_mm3": 0.0,
        "hatch_mm3": 0.0,
        "block_mm3": 0.0
      },
      {
        "lift_mm": 37,
        "guard_mm3": 0.0,
        "hatch_mm3": 0.0,
        "block_mm3": 0.0
      },
      {
        "lift_mm": 38,
        "guard_mm3": 0.0,
        "hatch_mm3": 0.0,
        "block_mm3": 0.0
      },
      {
        "lift_mm": 39,
        "guard_mm3": 0.0,
        "hatch_mm3": 0.0,
        "block_mm3": 0.0
      },
      {
        "lift_mm": 40,
        "guard_mm3": 0.0,
        "hatch_mm3": 0.0,
        "block_mm3": 0.0
      }
    ],
    "grip_corridor_diameter_height_mm": [
      26,
      40
    ],
    "grip_corridor_vs_open_hatch_mm3": 0.0,
    "grip_corridor_vs_roof_mm3": 0.0,
    "structure_pcb_intersection_mm3": 0.0,
    "conditional_connector_headroom_mm": 30,
    "warnings": [
      "Cap is a selected D11x5 envelope, not a sourced sealed tube specification",
      "Protective guide intended cold-touch but temperature unverified; no PETG thermal safety claim",
      "Finger/gripper envelope provisional; intended aids and actual cap need ergonomic testing",
      "Optical slots prove only a proxy passage, not spectral, stray-light, assay or real-part performance",
      "Hatch seam hinge latch and interlock not qualified",
      "Insertion and hinge checks are discrete samples, not certified continuous-motion clearance",
      "Exact mated harnesses, underside solder and final panel fastening remain open"
    ]
  },
  "pixels": {
    "closed-front": {
      "mean": 78.43427356484763,
      "std": 22.30028888033251,
      "cut_off": false
    },
    "hatch-open": {
      "mean": 82.04020995747696,
      "std": 31.733487657920065,
      "cut_off": false
    },
    "exploded": {
      "mean": 75.88280474840539,
      "std": 22.444574189768765,
      "cut_off": false
    },
    "rear": {
      "mean": 76.0866300496102,
      "std": 20.554427100784146,
      "cut_off": false
    }
  },
  "blender_source": "import bpy, json, math, os\nfrom mathutils import Vector, Matrix\nos.chdir('/root/work/concept-v2b')\nbpy.ops.wm.read_factory_settings(use_empty=True)\nscene=bpy.context.scene; scene.render.engine='BLENDER_EEVEE'\nscene.eevee.use_gtao=True; scene.eevee.gtao_distance=.015; scene.eevee.gtao_factor=1.15\nscene.eevee.taa_render_samples=96\nscene.render.resolution_x=1500;scene.render.resolution_y=1200;scene.render.resolution_percentage=100\nscene.world=bpy.data.worlds.new('World');scene.world.use_nodes=True\nscene.world.node_tree.nodes['Background'].inputs[0].default_value=(.075,.09,.11,1)\nscene.world.node_tree.nodes['Background'].inputs[1].default_value=.8\nscene.view_settings.view_transform='Standard';scene.view_settings.look='Medium High Contrast'\nscene.render.image_settings.file_format='PNG'\ncolors={'panel':(.23,.48,.58),'rail':(.17,.28,.32),'black':(.025,.032,.04),'metal':(.52,.57,.6),'pcb':(.035,.25,.12),'white':(.8,.8,.72),'blue':(.04,.23,.55),'red':(.65,.07,.04),'amber':(.83,.45,.035),'screen':(.005,.025,.035),'isolation':(.65,.58,.4)}\nmats={}\nfor name,c in colors.items():\n mat=bpy.data.materials.new(name);mat.use_nodes=True;p=mat.node_tree.nodes.get('Principled BSDF')\n p.inputs['Base Color'].default_value=(*c,1);p.inputs['Roughness'].default_value=.42\n p.inputs['Metallic'].default_value=.7 if name=='metal' else 0\n if name=='panel':\n  p.inputs['Alpha'].default_value=.18;mat.blend_method='BLEND';mat.use_screen_refraction=False;mat.show_transparent_back=False;mat.shadow_method='NONE'\n mats[name]=mat\nobjects=[]; data=json.load(open('geometry.json'))\nfor r in data:\n mesh=bpy.data.meshes.new(r['name']);mesh.from_pydata([[v*.001 for v in p] for p in r['vertices']],[],r['triangles']);mesh.update()\n ob=bpy.data.objects.new(r['name'],mesh);scene.collection.objects.link(ob);ob.data.materials.append(mats[r['material']]);ob['group']=r['group'];objects.append(ob)\n# Display characters are annotation, not geometry used for fit.\na=math.radians(math.degrees(math.atan2(83,35)))\ndef ui_text(txt,x,y,z,size):\n cu=bpy.data.curves.new(txt,'FONT');cu.body=txt;cu.size=size*.001;cu.extrude=0\n ob=bpy.data.objects.new(txt,cu);scene.collection.objects.link(ob)\n ob.location=Vector((x,-57.5+y*math.cos(a)-z*math.sin(a),61.5+y*math.sin(a)+z*math.cos(a)))*.001\n ob.rotation_euler=(a,0,0);ob.data.materials.append(mats['white']);ob['group']='ui';objects.append(ob)\nui_text('PREHEAT',-39,4,3.55,3.2);ui_text('62.0 C',-39,-2,3.55,4.2);ui_text('HEATING',-39,-7,3.55,1.9)\nui_text('RESEARCH USE ONLY',-38,-31,2,3);ui_text('NOT FOR DIAGNOSTIC USE',-38,-36,2,2)\nfor name,d,e in [('Key',(1,-1,2),2.5),('Fill',(-1,-.2,1),1.1),('Rim',(0,1,1),1.8)]:\n li=bpy.data.lights.new(name,'SUN');li.energy=e;ob=bpy.data.objects.new(name,li);scene.collection.objects.link(ob);ob.rotation_euler=(-Vector(d)).to_track_quat('-Z','Y').to_euler()\ncam=bpy.data.cameras.new('Review camera');co=bpy.data.objects.new('Review camera',cam);scene.collection.objects.link(co);scene.camera=co;cam.lens=52;cam.clip_start=.001;cam.clip_end=10\ncam.dof.use_dof=False\n\n# Warning text on the actual hatch surface; fonts are non-fit presentation annotations.\ndef surface_text(text,loc,rot,size,group,mat='white'):\n cu=bpy.data.curves.new(text,'FONT');cu.body=text;cu.size=size*.001\n ob=bpy.data.objects.new(text,cu);scene.collection.objects.link(ob)\n ob.location=Vector(loc)*.001;ob.rotation_euler=rot;ob.data.materials.append(mats[mat]);ob['group']=group;objects.append(ob)\nsurface_text('HOT BLOCK BELOW',(-32,24,118.65),(0,0,0),3.1,'hatch','amber')\nsurface_text('WAIT FOR COOLDOWN',(-32,17,118.65),(0,0,0),2.8,'hatch','amber')\nsurface_text('DC IN - PROVISIONAL',(-29,75.2,40),(math.pi/2,0,math.pi),2.8,'rear')\nsurface_text('SERVICE EXTENSION',(63,78.2,21),(math.pi/2,0,math.pi),3,'service')\nbpy.context.view_layer.update();installed={ob.name:ob.matrix_world.copy() for ob in objects}\nmanifest={'unit':'mm; render meshes scaled once by .001','installed':'all source solids in preserved PCB datum','poses':{},'cameras':{},'projected_points':{}}\nfrom bpy_extras.object_utils import world_to_camera_view\ndef render(pose):\n for ob in objects: ob.matrix_world=installed[ob.name].copy()\n offsets={}\n if pose=='exploded':\n  offsets={'left':(-48,0,0),'right':(60,0,0),'roof':(0,0,85),'chamber':(-82,48,25),'guard':(-82,48,45),'service':(0,24,0),'frontstrip':(0,-24,0)}\n if pose in ['hatch-open','exploded']:\n  pivot=Vector((-8,55,108))*.001\n  turn=Matrix.Translation(pivot)@Matrix.Rotation(math.radians(-105),4,'X')@Matrix.Translation(-pivot)\n  for ob in objects:\n   if ob['group']=='hatch': ob.matrix_world=turn@installed[ob.name]\n for ob in objects:\n  if ob['group'] in offsets: ob.location+=Vector(offsets[ob['group']])*.001\n # One consistent workflow state per pose; no simultaneous PREHEAT and READY.\n bpy.data.objects['PREHEAT'].data.body='INSERT TUBE' if pose=='hatch-open' else 'PREHEAT'\n bpy.data.objects['62.0 C'].data.body='HEAT PAUSED' if pose=='hatch-open' else '62.0 C'\n bpy.data.objects['62.0 C'].data.size=(2.5 if pose=='hatch-open' else 4.2)*.001\n bpy.data.objects['HEATING'].data.body='SEALED TUBE ONLY' if pose=='hatch-open' else 'HEATING'\n bpy.context.view_layer.update()\n pts=[ob.matrix_world@Vector(c) for ob in objects for c in ob.bound_box]\n lo=Vector([min(p[i] for p in pts) for i in range(3)]);hi=Vector([max(p[i] for p in pts) for i in range(3)])\n center=(lo+hi)/2;diag=(hi-lo).length\n direction=Vector((1,-1.65,1.08)).normalized(); factor=1.82\n if pose=='hatch-open':direction=Vector((.6,-1.4,1.65)).normalized();factor=1.70\n if pose=='exploded':factor=1.65\n if pose=='rear':direction=Vector((1.15,1.8,1.0)).normalized();factor=1.85\n co.location=center+direction*diag*factor;co.rotation_euler=(center-co.location).to_track_quat('-Z','Y').to_euler()\n bpy.context.view_layer.update()\n # Numeric arrow endpoints come from projection of exact CAD-datum positions, not guessed pixels.\n manifest['projected_points'][pose]={}\n for name,xyz in {'cap':(-8,25,111),'guide':(7,13,103),'insert_top':(-8,25,145),'socket':(-48,81,25),'service':(37,78,21),'warning':(-8,24,118.7)}.items():\n  q=world_to_camera_view(scene,co,Vector(xyz)*.001)\n  manifest['projected_points'][pose][name]=[q.x*1500,(1-q.y)*1200]\n scene.render.filepath=pose+'-raw.png';bpy.ops.render.render(write_still=True)\n manifest['poses'][pose]={'translation_offsets_mm':offsets,'hatch_rotation_x_deg':-105 if pose in ['hatch-open','exploded'] else 0,'hatch_pivot_mm':[-8,55,108]}\n manifest['cameras'][pose]={'position_mm':list(co.location*1000),'target_mm':list(center*1000),'lens_mm':52,'resolution':[1500,1200]}\nfor pose in ['closed-front','hatch-open','exploded','rear']:render(pose)\njson.dump(manifest,open('presentation-manifest.json','w'),indent=2)\n",
  "tessellation_source": "import runpy,json,os\nos.chdir('/root/work/concept-v2b')\nm=runpy.run_path('reader-concept-v2b.build123d'); rows=[]\nfor p in m['review']:\n s=p.pop('shape'); v,t=s.tessellate(0.2,0.15); b=s.bounding_box()\n rows.append(dict(**p,vertices=[list(q) for q in v],triangles=t,bounds=[list(b.min),list(b.max)],volume=s.volume,valid=s.is_valid))\njson.dump(rows,open('geometry.json','w'))\nprint('PARTS',len(rows),'VALID',all(r['valid'] for r in rows))\nprint('BOUNDS',m['result'].bounding_box())\nprint('PCB',next(r['bounds'] for r in rows if r['name'].startswith('PCB proxy')))\n",
  "validation_source": "import os,runpy,json,math\nfrom build123d import *\nos.chdir('/root/work/concept-v2b');m=runpy.run_path('reader-concept-v2b.build123d');p={r['name']:r['shape'] for r in m['review']}\ndef vol(a,b):\n q=a&b;return float(q.volume) if q else 0.0\nh=p['Independent small opaque hinged hatch with cap relief'];cap=p['Sealed cap proxy GRASP BAND D11 H5'];tube=p['Sealed tube BODY proxy D7.5 H21'];guard=p['Full perimeter protective deck and narrow tube guide'];block=p['Aluminum heater block proxy'];roof=p['Removable top flat panel'];wall=p['Opaque chamber removable wall cassette'];pcb=p['PCB proxy 100x100 live datum']\naxis=Axis((-8,55,108),(1,0,0));sweep=[]\nfor a in range(0,106,5):\n hh=h.rotate(axis,-a);sweep.append(dict(deg=a,cap_mm3=vol(hh,cap),tube_mm3=vol(hh,tube),guard_mm3=vol(hh,guard),roof_mm3=vol(hh,roof),chamber_mm3=vol(hh,wall)))\nhopen=h.rotate(axis,-105)\ninsertion=[]\nfor dz in range(41):\n t=Pos(0,0,dz)*(tube+cap)\n insertion.append(dict(lift_mm=dz,guard_mm3=vol(t,guard),hatch_mm3=vol(t,hopen),block_mm3=vol(t,block)))\n# The projected hot-block top outside the insertion bore is entirely under the protective deck.\nprojection=m['box'](30,30,.2,-8,25,101)-m['cyl'](4.25,.4,-8,25,100.9)\nq=projection-guard\ncoverage_gap=q.volume if q else 0\ncorridor=m['cyl'](13,40,-8,25,103)\nstruct=[r for r in m['review'] if r['name'].startswith(('Elevated gantry','Gantry crossbeam','Opaque chamber','Removable opaque spill'))]\nreport={'scope':'PROVISIONAL geometry-only concept check. NOT safe-touch, thermal or physical-fit qualification.','valid_solids':all(r['shape'].is_valid for r in m['review']),'solid_count':len(m['review']),'installed_bounds_mm':[list(m['result'].bounding_box().min),list(m['result'].bounding_box().max)],'pcb_bounds_mm':[list(pcb.bounding_box().min),list(pcb.bounding_box().max)],'tube_body_z_mm':[85,106],'cap_diameter_height_mm':[11,5],'cap_z_mm':[106,111],'guide_top_mm':103,'cap_lower_edge_above_guide_mm':3,'cap_top_above_guide_mm':8,'exposed_cap_grip_band_mm':5,'guide_inner_diameter_mm':8.5,'tube_diameter_mm':7.5,'nominal_guide_radial_clearance_mm':.5,'closed_hatch_inside_roof_z_mm':115.5,'cap_to_closed_hatch_vertical_clearance_mm':4.5,'guard_projection_overhang_past_hot_block_each_side_mm':9.5,'deck_to_block_top_air_gap_mm':2,'guide_sleeve_to_block_top_air_gap_mm':.5,'unshielded_top_projection_outside_bore_mm3':coverage_gap,'guard_vs_heater_intersection_mm3':vol(guard,block),'guard_vs_sensor_intersection_mm3':vol(guard,p['Optical sensor proxy']),'guard_vs_illumination_intersection_mm3':vol(guard,p['Illumination proxy']),'optical_axis_z_mm':87,'optical_proxy_top_mm':92,'deck_underside_minus_optical_top_mm':8,'optical_passage_diameter_mm':3,'hatch_sweep_5deg_samples':sweep,'axial_insertion_1mm_samples':insertion,'grip_corridor_diameter_height_mm':[26,40],'grip_corridor_vs_open_hatch_mm3':vol(corridor,hopen),'grip_corridor_vs_roof_mm3':vol(corridor,roof),'structure_pcb_intersection_mm3':max(vol(pcb,r['shape']) for r in struct),'conditional_connector_headroom_mm':42-12,'warnings':['Cap is a selected D11x5 envelope, not a sourced sealed tube specification','Protective guide intended cold-touch but temperature unverified; no PETG thermal safety claim','Finger/gripper envelope provisional; intended aids and actual cap need ergonomic testing','Optical slots prove only a proxy passage, not spectral, stray-light, assay or real-part performance','Hatch seam hinge latch and interlock not qualified','Insertion and hinge checks are discrete samples, not certified continuous-motion clearance','Exact mated harnesses, underside solder and final panel fastening remain open']}\njson.dump(report,open('geometry-validation.json','w'),indent=2)\nprint('max swept interference',max(v for x in sweep for k,v in x.items() if k!='deg'))\nprint('max insertion interference',max(v for x in insertion for k,v in x.items() if k!='lift_mm'))\nprint('guard projection gap',coverage_gap,'cap gap4.5; grip5; protrusion8; conditionalheadroom30')\nprint('grip corridor hatch',report['grip_corridor_vs_open_hatch_mm3'])\n",
  "annotation_source": "import os,json,math\nfrom PIL import Image,ImageDraw,ImageFont,ImageStat,ImageOps\nos.chdir('/root/work/concept-v2b')\nf='/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf';manifest=json.load(open('presentation-manifest.json'));checks={}\ndef arrow(d,a,b,color='#67e9e1',width=3):\n d.line([tuple(a),tuple(b)],fill=color,width=width);ang=math.atan2(b[1]-a[1],b[0]-a[0]);n=13\n d.polygon([tuple(b),(b[0]-n*math.cos(ang-.45),b[1]-n*math.sin(ang-.45)),(b[0]-n*math.cos(ang+.45),b[1]-n*math.sin(ang+.45))],fill=color)\ndef text(d,p,s,size=22,col='#e9f2f5'):d.text(p,s,font=ImageFont.truetype(f,size),fill=col)\nfor pose,title in [('closed-front','CLOSED FRONT'),('hatch-open','HATCH ONLY OPEN - all panels installed'),('exploded','EXPLODED ASSEMBLY'),('rear','REAR INPUT / SERVICE')]:\n im=Image.open(pose+'-raw.png').convert('RGB');d=ImageDraw.Draw(im);pt=manifest['projected_points'][pose]\n text(d,(50,28),'CONCEPT v2b  /  '+title,29)\n text(d,(50,75),'PRELIMINARY VISUAL REVIEW  |  PROXY PARTS  |  AWAITING APPROVAL',20,'#83d5df')\n if pose=='hatch-open':\n  arrow(d,pt['insert_top'],pt['cap']);text(d,(55,132),'Vertical insertion / removal of SEALED tube',23,'#67e9e1')\n  text(d,(55,164),'Blue cap: 5 mm grip band, 8 mm above protective deck',21)\n  text(d,(55,197),'Guide intended cold-touch; temperature NOT VERIFIED',20,'#edc477')\n  text(d,(55,1095),'105 degree hatch pose only. Opaque full-perimeter shield covers hot block top and edges.',21)\n elif pose=='rear':\n  text(d,(55,1024),'provisional panel DC input \u2192 J1 internal',24,'#67e9e1');arrow(d,(390,1015),pt['socket'])\n  text(d,(55,1070),'extension harness, not native Pico USB port',24,'#67e9e1');arrow(d,(665,1060),pt['service'])\n elif pose=='closed-front':\n  text(d,(55,1093),'Hatch warning: HOT BLOCK BELOW / WAIT FOR COOLDOWN',23,'#edc477')\n else:text(d,(55,1093),'Guard deck and chamber removed for inspection; PCB stays fixed at actual 100 x 100 mm.',21)\n text(d,(55,1140),'Cap / guide / hinge / optics provisional. No safe-touch, exact-fit or print qualification.',21)\n text(d,(55,1170),'Same source geometry in every view; electronics unchanged.',19,'#a9c4cc')\n im=ImageOps.expand(im,border=80,fill=im.getpixel((1,1)))\n fn='reader-concept-v2b-'+pose+'.png';im.save(fn)\n gray=im.convert('L');st=ImageStat.Stat(gray);w,h=im.size;bg=gray.getpixel((1,1));edges=[gray.crop(b) for b in [(0,0,w,2),(0,h-2,w,h),(0,0,2,h),(w-2,0,w,h)]]\n cut=any(abs(p-bg)>24 for e in edges for p in e.getdata());checks[pose]={'mean':st.mean[0],'std':st.stddev[0],'cut_off':cut};print(pose,checks[pose])\nevidence={'presentation':manifest,'validation':json.load(open('geometry-validation.json')),'pixels':checks,'blender_source':open('render.py').read(),'tessellation_source':open('mesh_review.py').read(),'validation_source':open('validate.py').read(),'annotation_source':open('finalize.py').read(),'post_composition_padding_px':80,'delivered_resolution_px':[1660,1360],'geometry_revision':'v2b derived by editing existing v2 Build123d source; one hinge sweep clearance repair'}\njson.dump(evidence,open('review-evidence.json','w'),indent=2)\n",
  "post_composition_padding_px": 80,
  "delivered_resolution_px": [
    1660,
    1360
  ],
  "geometry_revision": "v2b derived by editing existing v2 Build123d source; one hinge sweep clearance repair"
}