main
John Lauer Publish 0.1.0 9427b49 9d ago
"""Independent nominal LVK12 envelope from Ohmite LVK drawing, not vendor CAD.
Use an existing shared OCP kernel; internal construction is illustrative only.
"""
import sys,json
from pathlib import Path
from OCP.gp import gp_Pnt
from OCP.BRepPrimAPI import BRepPrimAPI_MakeBox
from OCP.BRepAlgoAPI import BRepAlgoAPI_Cut,BRepAlgoAPI_Fuse
from OCP.TopoDS import TopoDS_Compound
from OCP.BRep import BRep_Builder
from OCP.TopLoc import TopLoc_Location
from OCP.TDocStd import TDocStd_Document
from OCP.TCollection import TCollection_ExtendedString
from OCP.XCAFDoc import XCAFDoc_DocumentTool,XCAFDoc_ColorType
from OCP.TDataStd import TDataStd_Name
from OCP.Quantity import Quantity_Color,Quantity_TOC_RGB
from OCP.STEPCAFControl import STEPCAFControl_Writer
from OCP.STEPControl import STEPControl_AsIs
from OCP.IFSelect import IFSelect_RetDone
out=Path(sys.argv[1]);out.mkdir(parents=True,exist_ok=True)
def box(x,y,z,dx,dy,dz):return BRepPrimAPI_MakeBox(gp_Pnt(x,y,z),dx,dy,dz).Shape()
body=box(-1.6,-.8,0,3.2,1.6,.5);coat=box(-1.05,-.8,.42,2.1,1.6,.08);parts=[]
for n,x,y in [(1,-1.6,-.8),(2,-1.6,.25),(3,.6,.25),(4,.6,-.8)]:
 # a/b from bottom-terminal drawing; 50 um wrap thickness is illustrative.
 lower=box(x,y,0,1,.55,.05);upper=box(x,y,.45,1,.55,.05)
 wall=box(-1.6 if x<0 else 1.55,y,0,.05,.55,.5)
 term=BRepAlgoAPI_Fuse(BRepAlgoAPI_Fuse(lower,wall).Shape(),upper).Shape()
 body=BRepAlgoAPI_Cut(body,term).Shape();coat=BRepAlgoAPI_Cut(coat,term).Shape()
 parts.append((f'Terminal{n}',term,(.78,.79,.8)))
body=BRepAlgoAPI_Cut(body,coat).Shape()
parts += [('Substrate_Illustrative',body,(.75,.69,.55)),('Coating_Illustrative',coat,(.12,.13,.14))]
doc=TDocStd_Document(TCollection_ExtendedString('BinXCAF'));st=XCAFDoc_DocumentTool.ShapeTool_s(doc.Main());ct=XCAFDoc_DocumentTool.ColorTool_s(doc.Main())
compound=TopoDS_Compound();builder=BRep_Builder();builder.MakeCompound(compound)
assembly=st.AddShape(compound,True);TDataStd_Name.Set_s(assembly,TCollection_ExtendedString('LVK12R020DER_AI_Nominal'))
for name,shape,color in parts:
 label=st.AddShape(shape,False);TDataStd_Name.Set_s(label,TCollection_ExtendedString(name));ct.SetColor(label,Quantity_Color(*color,Quantity_TOC_RGB),XCAFDoc_ColorType.XCAFDoc_ColorGen);st.AddComponent(assembly,label,TopLoc_Location())
st.UpdateAssemblies();writer=STEPCAFControl_Writer();writer.SetColorMode(True);writer.SetNameMode(True);writer.Transfer(doc,STEPControl_AsIs)
assert writer.Write(str(out/'lvk12r020der.step'))==IFSelect_RetDone
print('WROTE',out/'lvk12r020der.step')