rushabhcodes/fidget-counter

A tscircuit package created by rushabhcodes.

Version
1.0.31
License
unset
Stars
0

mechanical/variants/V2_discrete_magnets/check_assembly_steps.py

"""Verify delivered exact STEP assemblies, including imported component poses."""
from pathlib import Path
import hashlib,json
import cadquery as cq

H=Path(__file__).resolve().parent;R=H.parents[2];G=H/'generated';results=[]
for state in ['Assembled','Exploded']:
    path=G/'Assemblies'/('V2_'+state+'.step')
    assembly=cq.Assembly.load(str(path))
    objects={obj.name:obj.toCompound() for obj in assembly.children}
    assert len(objects)==72 and len([name for name in objects if name.startswith('Electronic_')])==27
    for name,source in [('Base_V2_Discrete',G/'STEP/Base_V2_Discrete.step'),('Magnet_Carrier_V2',G/'STEP/Magnet_Carrier_V2.step'),('Cap_circular',R/'mechanical/STEP_Parts/Cap_circular.step')]:
        original=cq.importers.importStep(str(source)).val()
        offset=(-22 if name=='Magnet_Carrier_V2' else (42 if name=='Cap_circular' else 0)) if state=='Exploded' else 0
        delivered=objects[name].translate((0,0,-offset))
        assert original.cut(delivered).Volume()+delivered.cut(original).Volume()<.002,(state,name)
        assert max(abs(getattr(original.BoundingBox(),k)-getattr(delivered.BoundingBox(),k)) for k in ['xmin','xmax','ymin','ymax','zmin','zmax'])<1e-5
    assert abs(objects['Steel_Backing_V2'].BoundingBox().zmin-(1.55 if state=='Assembled' else -5.45))<1e-5
    assert abs(objects['Bearing_6808'].BoundingBox().zmin-(6.1 if state=='Assembled' else 21.1))<1e-5
    results.append({'state':state,'objects':len(objects),'supplier_bodies':27,'sha256':hashlib.sha256(path.read_bytes()).hexdigest(),'critical_poses_and_printed_solids_match':True})
(G/'assembly-step-audit.json').write_text(json.dumps({'passed':True,'physical_tested':False,'assemblies':results},indent=2)+'\n')
print('PASS: both exact V2 STEP assemblies;72 objects each; base/carrier/cap geometry and critical poses retained')