master
John Lauer Add independent drawing-based switch model, marked variants and reproducible provenance 12a469d 20d ago
"""Independent SKRPACE010 visual model, millimetres, Z-up.
Dimensional authority: Alps SKRP drawing d_1 (4.2 x 3.2, 4.6 terminal span,
2.2 contact row spacing, 1.6 body, 1.8 shoulders, 2.5 total, stem R1.1).
Undimensioned cosmetic radii, metal thickness and colors are visualization assumptions.
No manufacturer CAD is imported into this generator. SPDX-License-Identifier: MIT
"""
import sys,pathlib,json,hashlib
B=pathlib.Path(__file__).resolve().parent;sys.path.insert(0,str(B.parents[2]/'cad-python'));import cadquery as cq
ivory=(.78,.77,.62);metal=(.65,.66,.63)
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))
a=cq.Assembly(name='SKRPACE010-AI-drawing-model')
body=box(4.2,3.2,1.55,z=.05).edges('|Z').fillet(.08)
for sx in [-1,1]:
 for sy in [-1,1]:body=body.cut(box(.22,.52,.52,sx*2.08,sy*1.1))
a.add(body,name='InsulatingHousing',color=cq.Color(*ivory))
plate=box(4.0,3.0,.08,z=1.6).cut(cq.Workplane('XY').circle(1.17).extrude(3))
a.add(plate,name='RetainingPlate',color=cq.Color(*metal))
for sx in [-1,1]:
 for sy in [-1,1]:
  a.add(box(.58,.52,.2,sx*1.78,sy*1.28,1.6).edges('|Z').fillet(.06),name=f'Retainer_{sx}_{sy}',color=cq.Color(*ivory))
  term=box(.6,.5,.10,sx*2.,sy*1.1).union(box(.10,.5,.5,sx*2.05,sy*1.1))
  a.add(term,name=f'Terminal_{sx}_{sy}',color=cq.Color(*metal))
stem=cq.Workplane('XY').workplane(offset=1.6).circle(1.1).extrude(.9).edges('>Z').fillet(.045)
a.add(stem,name='Actuator',color=cq.Color(.86,.85,.68));a.export(str(B/'skrpace010-ai.step'))
# Mark is independent virtual artwork on the actuator, intentionally darker for contrast.
mark=cq.Workplane('XY').text('SKRPACE010',.30,.001,font='DejaVu Sans',combine=False).translate((0,0,2.501))
a.add(mark,name='Adom.LaserEtch.MPN',color=cq.Color(.15,.15,.13));a.export(str(B/'skrpace010-ai-mpn.step'))
report={'classification':'AI-authored dimensional visualization; not manufacturer CAD','source':'https://tech.alpsalpine.com/cms.media/product_detail_fig_skrp_d_1_en_c547e1f3b9.gif','sourceSha256':hashlib.sha256((B/'dimensions.gif').read_bytes()).hexdigest(),'dimensionedMm':{'body':[4.2,3.2,1.6],'terminalSpanX':4.6,'contactRowSpacingY':2.2,'retainerHeight':1.8,'overallHeight':2.5,'stemRadius':1.1},'assumptions':'Undimensioned radii, metal thickness, retainer detail and colors approximate the product photograph. Internal switch mechanism omitted. Terminal naming is geometric, not a qualified electrical mapping.','mark':'AI virtual identifier; not factory marking; 0.30 mm text on actuator, .001 mm thick','license':'MIT for this independent generator and its generated geometry; no license grant for manufacturer source documents'}
for name in ['skrpace010-ai.step','skrpace010-ai-mpn.step']:report[name]={'sha256':hashlib.sha256((B/name).read_bytes()).hexdigest()}
(B/'generated-provenance.json').write_text(json.dumps(report,indent=2))
print('Created independent plain and marked STEP')