"""Validate registration and selected face subsets; no board writes.""" import hashlib import json from pathlib import Path import xml.etree.ElementTree as ET HERE = Path(__file__).resolve().parent D = json.loads((HERE / 'geometry.json').read_text()) assert len(D) == 15 and all(s['valid'] for s in D) for source in json.loads((HERE / 'sources.json').read_text()): assert hashlib.sha256((HERE / source['file']).read_bytes()).hexdigest() == source['sha256'] board = HERE.parent / 'Adafruit RS-232 Full Pinout Level-Shifter Breakout.brd' assert hashlib.sha256(board.read_bytes()).hexdigest() == '6a7b35ef909f5a2d243c326c34db3957aaa01275bf2aac8e0c749ff18162e870' root = ET.parse(board).getroot() b = root.find('drawing/board') jp = b.find("elements/element[@name='JP2']") pkg = b.find("libraries/library[@name='microbuilder']/packages/package[@name='1X12_ROUND_76MIL']") for pad in pkg.findall('pad'): x, y = float(jp.get('x')) + float(pad.get('x')), float(jp.get('y')) + float(pad.get('y')) assert any(abs(f.get('radius', 0)-0.5)<1e-8 and abs(f['location'][0]-x)<1e-8 and abs(f['location'][1]-y)<1e-8 for f in D[0]['faces']) for x in [3.81, 27.94]: assert any(abs(f.get('radius',0)-1.5)<1e-8 and abs(f['location'][0]-x)<1e-8 and abs(f['location'][1]-11.43)<1e-8 for f in D[0]['faces']) assert all(abs(a-b)<1e-8 for a,b in zip(D[0]['bounds'], [0,0,0,31.75,29.337,1.57])) subsets = { 'front_flange_exposed_faces': [8,11,12,13,14], 'shell_straight_outer_surface': list(range(18,26)), 'shell_outer_including_root_and_lip': list(range(18,26))+list(range(81,89))+list(range(103,111)), 'left_front_hex_post': list(range(53,62))+[89], 'right_front_hex_post': list(range(62,71))+[90], } result = {} for name, ids in subsets.items(): faces = [D[11]['faces'][i-1] for i in ids] assert all(any('Opaque(245,245,246)' in c for c in f['colors']) for f in faces) bounds = [min(f['bounds'][i] for f in faces) for i in range(3)] + [max(f['bounds'][i] for f in faces) for i in range(3,6)] result[name] = dict(solid=12, faces=ids, bounds=bounds, dimensions=[bounds[i+3]-bounds[i] for i in range(3)]) left, right = [D[11]['faces'][i-1] for i in [60,69]] assert abs(right['location'][0]-left['location'][0]-25)<1e-8 assert left['radius'] == right['radius'] == 1.5 result['front_lock_axes'] = [left, right] (HERE / 'measurements.json').write_text(json.dumps(result,indent=2)+'\n') print('PASS: source hashes, 15 valid solids, all 12 Eagle header centres, PCB bounds, mounting holes, metal-appearance subsets and front lock cylinders.') for name, row in result.items(): if isinstance(row,dict): print(name, [round(v,6) for v in row['bounds']], 'size', [round(v,6) for v in row['dimensions']])