main
John Lauer Publish 0.1.0 3442c11 9d ago
"""Original nominal TI DBV0005A envelope; shared OCP kernel, not vendor CAD.
Mold taper and polygonal lead bends are illustrative nominal geometry.
"""
import sys
from pathlib import Path
from OCP.gp import gp_Pnt,gp_Vec
from OCP.BRepBuilderAPI import BRepBuilderAPI_MakePolygon,BRepBuilderAPI_MakeFace
from OCP.BRepOffsetAPI import BRepOffsetAPI_ThruSections
from OCP.BRepPrimAPI import BRepPrimAPI_MakePrism,BRepPrimAPI_MakeBox
from OCP.BRepAlgoAPI import BRepAlgoAPI_Cut
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 wire(points):
 p=BRepBuilderAPI_MakePolygon()
 for xyz in points:p.Add(gp_Pnt(*xyz))
 p.Close();return p.Wire()
# Cut taper wedges from a box; keep the top's analytic +Z plane for metadata.
body=BRepPrimAPI_MakeBox(gp_Pnt(-.8,-1.45,.1),1.6,2.9,1.1).Shape()
for axis,outer,inner,span in [('x',.8,.725,4.0),('y',1.45,1.375,3.0)]:
 for side in [-1,1]:
  for triangle in [[(inner,.1),(outer,.1),(outer,.6)],[(outer,.6),(outer,1.2),(inner,1.2)]]:
   points=[(side*v,-span/2,z) if axis=='x' else (-span/2,side*v,z) for v,z in triangle]
   face=BRepBuilderAPI_MakeFace(wire(points)).Face()
   cut=BRepPrimAPI_MakePrism(face,gp_Vec(0,span,0) if axis=='x' else gp_Vec(span,0,0)).Shape()
   body=BRepAlgoAPI_Cut(body,cut).Shape()
parts=[('MoldedBody_AI_Nominal',body,(.07,.075,.08))]
profile=[(.72,.525),(.90,.525),(1.10,0),(1.45,0),(1.45,.15),(1.20,.15),(1.00,.675),(.72,.675)]
for n,side,y in [(1,-1,.95),(2,-1,0),(3,-1,-.95),(4,1,-.95),(5,1,.95)]:
 face=BRepBuilderAPI_MakeFace(wire([(side*x,y-.2,z) for x,z in profile])).Face();shape=BRepPrimAPI_MakePrism(face,gp_Vec(0,.4,0)).Shape();parts.append((f'Lead{n}',shape,(.72,.73,.75)))
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('OPA189IDBVR_AI_Nominal_DBV0005A'))
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/'opa189idbvr-ai-nominal.step'))==IFSelect_RetDone
print('WROTE',out/'opa189idbvr-ai-nominal.step')