main
John Lauer Add completed marking geometry checks and shared tool fixes ecb0617 21d ago
import sys,pathlib,json
B=pathlib.Path(__file__).resolve().parent;sys.path.insert(0,str(B.parent.parent/'cad-python'));import cadquery as cq
rows=json.load(open(B/'results.json'));proof=[]
from OCP.TDocStd import TDocStd_Document
from OCP.TCollection import TCollection_ExtendedString
from OCP.STEPCAFControl import STEPCAFControl_Reader,STEPCAFControl_Writer
from OCP.STEPControl import STEPControl_AsIs
def baseline(src,dest):
 doc=TDocStd_Document(TCollection_ExtendedString('BinXCAF'));rd=STEPCAFControl_Reader();rd.SetColorMode(True);rd.SetNameMode(True);rd.ReadFile(str(src));assert rd.Transfer(doc);wr=STEPCAFControl_Writer();wr.SetColorMode(True);wr.SetNameMode(True);assert wr.Transfer(doc,STEPControl_AsIs);wr.Write(str(dest))
from OCP.BRepGProp import BRepGProp
from OCP.GProp import GProp_GProps
def volume(s):
 total=0
 for solid in s.Solids():
  props=GProp_GProps();BRepGProp.VolumeProperties_s(solid.wrapped,props,1e-9,False,False);total+=props.Mass()
 return total
def shape(p):return cq.Compound.makeCompound(cq.importers.importStep(str(p)).vals())
for r in rows:
 p=pathlib.Path(r['step']);plain=shape(r['source']);marked=shape(p);overlay=shape(p.with_name(p.stem+'-overlay.step'));pv=volume(plain);bp=p.with_name('unmarked-roundtrip.step');baseline(r['source'],bp);bv=volume(shape(bp));delta=abs(volume(marked)-volume(overlay)-bv);assert delta<max(1e-5,abs(bv)*1e-6),(r['mpn'],delta)
 b=plain.BoundingBox();m=marked.BoundingBox();assert m.xmin>=b.xmin-1e-4 and m.xmax<=b.xmax+1e-4 and m.ymin>=b.ymin-1e-4 and m.ymax<=b.ymax+1e-4,r['mpn']
 proof.append({'mpn':r['mpn'],'originalVolumeMm3':pv,'unmarkedRoundtripVolumeMm3':bv,'sourceRoundtripVolumeDeltaMm3':bv-pv,'markingOnlyVolumeDeltaMm3':delta,'withinOriginalXYBounds':True,'overlayVolumeMm3':volume(overlay)})
(B/'geometry-proof.json').write_text(json.dumps(proof,indent=2));print('PASS',len(proof),'models: no volume change beyond same-writer roundtrip and no XY overflow')