master
John Lauer LED colour pass: coloured STEP is the default (lens colour from the datasheet dominant wavelength, softened), plain STE… c7192f0 20d ago
#!/usr/bin/env python3
"""Dump every face of a STEP: index, colour (surf/gen), surface type, bbox, area. For picking lens faces."""
import sys
from OCP.STEPCAFControl import STEPCAFControl_Reader
from OCP.TDocStd import TDocStd_Document
from OCP.TCollection import TCollection_ExtendedString
from OCP.XCAFDoc import XCAFDoc_DocumentTool, XCAFDoc_ColorType
from OCP.TDF import TDF_ChildIterator
from OCP.Quantity import Quantity_Color
from OCP.Bnd import Bnd_Box
from OCP.BRepBndLib import BRepBndLib
from OCP.TopExp import TopExp_Explorer
from OCP.TopAbs import TopAbs_FACE, TopAbs_SOLID
from OCP.BRepAdaptor import BRepAdaptor_Surface
from OCP.GProp import GProp_GProps
from OCP.TopoDS import TopoDS
from OCP.BRepGProp import BRepGProp
doc = TDocStd_Document(TCollection_ExtendedString("d"))
r = STEPCAFControl_Reader(); r.SetColorMode(True); r.SetNameMode(True); r.ReadFile(sys.argv[1]); r.Transfer(doc)
st = XCAFDoc_DocumentTool.ShapeTool_s(doc.Main()); ct = XCAFDoc_DocumentTool.ColorTool_s(doc.Main())
free=[]
it=TDF_ChildIterator(st.Label(),False)
while it.More():
    l=it.Value(); it.Next()
    if st.IsFree_s(l) and st.IsTopLevel(l): free.append(l)
for i,l in enumerate(free,1):
    s = st.GetShape_s(l)
    ex = TopExp_Explorer(s, TopAbs_SOLID); ns=0
    while ex.More(): ns+=1; ex.Next()
    print('free shape', i, 'solids', ns)
    ex = TopExp_Explorer(s, TopAbs_SOLID); si=0
    while ex.More():
        sol = ex.Current(); ex.Next(); si+=1
        b = Bnd_Box(); BRepBndLib.Add_s(sol, b); mn, mx = b.CornerMin(), b.CornerMax()
        c = Quantity_Color(); sc = ''
        for t in (XCAFDoc_ColorType.XCAFDoc_ColorSurf, XCAFDoc_ColorType.XCAFDoc_ColorGen):
            if ct.GetColor(sol, t, c): sc = f"{c.Red():.2f},{c.Green():.2f},{c.Blue():.2f}"; break
        print(f' solid {si} col={sc} x {mn.X():.3f}..{mx.X():.3f} y {mn.Y():.3f}..{mx.Y():.3f} z {mn.Z():.3f}..{mx.Z():.3f}')
        fx = TopExp_Explorer(sol, TopAbs_FACE); fi=0
        while fx.More():
            f = fx.Current(); fx.Next(); fi+=1
            col = ''
            for t in (XCAFDoc_ColorType.XCAFDoc_ColorSurf, XCAFDoc_ColorType.XCAFDoc_ColorGen):
                if ct.GetColor(f, t, c): col = f"{c.Red():.2f},{c.Green():.2f},{c.Blue():.2f}"; break
            b = Bnd_Box(); BRepBndLib.Add_s(f, b); mn, mx = b.CornerMin(), b.CornerMax()
            g = GProp_GProps(); BRepGProp.SurfaceProperties_s(f, g)
            ty = BRepAdaptor_Surface(TopoDS.Face(f)).GetType()
            print(f'   f{fi:3d} {str(ty).split(".")[-1]:22s} col={col:15s} area={g.Mass():.4f} x {mn.X():.3f}..{mx.X():.3f} y {mn.Y():.3f}..{mx.Y():.3f} z {mn.Z():.3f}..{mx.Z():.3f}')