main
John Lauer Orient optional MPN along the long top-face axis and refresh cached provenance aac6247
# Compatibility entrypoint: corrected independent geometry; see generate-models.py and PROVENANCE.md.
"""Independent nominal package visualizations from dimensional specifications.
No imported CAD geometry is used to build the output. Reference comparison is separate.
Units mm; Z=seating plane. Plain models retain no invented manufacturer logo/marking.
"""
import pathlib,json
import cadquery as cq
out=pathlib.Path(__file__).parent/'generated';out.mkdir(exist_ok=True)
black=(.10,.105,.115);metal=(.68,.70,.73)
def box(w,d,h,x=0,y=0,z=0):return cq.Workplane('XY').box(w,d,h,centered=(True,True,False)).translate((x,y,z))
def save(name,parts):
 a=cq.Assembly(name=name)
 for label,shape,color in parts:a.add(shape,name=label,color=cq.Color(*color))
 a.export(str(out/(name+'.step')))
# Infineon PG-TDSON-8 package group U04 dimensions from BSC016N06NS datasheet.
# Body and contact detail deliberately simplified; exact terminal mapping must be reviewed separately.
body=cq.Workplane('XY').workplane(offset=.15).rect(5.9,5.0).workplane(offset=.9).rect(5.58,4.68).loft()
parts=[('EpoxyBody',body,black)]
for side in [-1,1]:
 for i,y in enumerate([-1.905,-.635,.635,1.905]):parts.append((f'Terminal_{side}_{i}',box(.65,.45,.20,side*2.725,y),metal))
parts.append(('ExposedDrainTab',box(3.55,4.05,.15,.6,0),metal))
save('BSC016N06NS-ai-nominal',parts)
# HoLR2512D 0.5mR, 3W: L6.4 W3.2 T0.8 C1.72 mm per Ho-A1 datasheet.
parts=[('ResistiveBody',box(2.96,3.2,.8).edges('|Z').fillet(.04),black)]
for sign in [-1,1]:parts.append((f'Termination_{sign}',box(1.72,3.2,.8,sign*2.34).edges('|Z').fillet(.04),metal))
save('HoLR2512D-ai-nominal',parts)
# RDN0011A 3.5x4.5x2.0 nominal; actual lead widths and coordinates from drawing.
body=box(3.5,4.5,1.975,z=.025).edges('|Z').fillet(.025)
parts=[('EpoxyModule',body,black)]
for side in [-1,1]:
 for i,(y,w,h) in enumerate([(1.9625,.9,.375),(1.15,.9,.25),(.65,.9,.25)]):
  parts.append((f'Signal_{side}_{i}',box(w,h,.025,side*1.3,y),metal))
 power=box(1.1,2.05,.025,side*1.,-1.)
 for y in [-.3,-.8,-1.3,-1.8]:power=power.union(box(.2,.25,.025,side*1.65,y))
 # Join each finger to its power paddle, preserving 0.2mm edge recess between fingers.
 for y in [-.3,-.8,-1.3,-1.8]:power=power.union(box(.2,.25,.025,side*1.5,y))
 parts.append((f'Power_{side}',power,metal))
for i,x in enumerate([-.5,.5]):parts.append((f'EndSignal_{i}',box(.25,.6,.025,x,1.95),metal))
parts.append(('Ground10',box(.3,1.35,.025,0,1.575),metal))
save('TPSM365R6V5RDNR-ai-nominal',parts)
print('Generated three independently authored nominal package models.')