from pathlib import Path import os, json, traceback import FreeCAD as A, Part root=Path(r'C:\projects\wheel\models\fan_direct_145') try: d=A.openDocument(str(root/'Assembly.FCStd'));d.recompute() fan=d.getObject('DirectFan');v=[] screws=[d.getObject('FanBolt0'),d.getObject('FanBolt1')] for s in screws: for o in d.Objects: if o==s or o in screws or not hasattr(o,'Shape') or o.Shape.isNull() or not o.ViewObject.Visibility:continue if s.Shape.BoundBox.intersect(o.Shape.BoundBox): n=s.Shape.common(o.Shape).Volume if n>1e-4:v.append([s.Name,o.Name,n]) distances={} for n in ('MotorBaseCorner0','MotorBaseCorner1','NewRail0','NewRail1','OpenPillarBracket','PCB','Chip','Holder','Magnet'): o=d.getObject(n) if o and hasattr(o,'Shape') and not o.Shape.isNull():distances[n]=fan.Shape.distToShape(o.Shape)[0] result={'fastener_hits':v,'fan_distances_mm':distances,'warning':'Screws only modeled above rail surface; fan blades, electric hub, T slot nuts and wiring are not modeled.'} (root/'verify_screws.json').write_text(json.dumps(result,indent=2),encoding='utf8') A.closeDocument(d.Name);os._exit(0) except Exception: (root/'verify_screws_error.txt').write_text(traceback.format_exc(),encoding='utf8');os._exit(1)