"""Top-view layout guide using the STEP geometry and actual connector layout.""" from pathlib import Path import math import FreeCAD as App import Part, MeshPart from PIL import Image,ImageDraw,ImageFont R=Path(__file__).resolve().parent.parent O=R/'models'/'washer_grid_4x4' V=App.Vector image=Image.new('RGB',(1120,1250),'#f4f7fb'); d=ImageDraw.Draw(image) font='C:/Windows/Fonts/msyh.ttc' heading=ImageFont.truetype(font,38); text=ImageFont.truetype(font,27); small=ImageFont.truetype(font,21) d.text((55,40),'4 × 4 垫片拼件:16 片',font=heading,fill='#173451') d.text((55,104),'上两行 0.5 mm,下两行 1.0 mm',font=text,fill='#425e78') scale=14 def xy(x,y): return (130+(x+6)*scale,180+(y+6)*scale) off=1.5; edge=math.sqrt(36-off**2); pitch=2*edge+2; start=edge-.8; length=pitch-2*start for row in range(4): for col in range(3): x=col*pitch+start;y=row*pitch-off-1 d.rectangle((xy(x,y),xy(x+length,y+2)),fill='#75889c') for row in range(3): for col in range(4): x=col*pitch-off-1;y=row*pitch+start d.rectangle((xy(x,y),xy(x+2,y+length)),fill='#75889c') for row in range(4): shape=Part.read(str(R/'models'/'pcd50_open_pillar_v1'/('Shim05.step' if row<2 else 'Shim10.step'))) shape.translate(V(-10,-10,0));shape.rotate(V(),V(0,0,1),22.5) m=MeshPart.meshFromShape(Shape=shape,LinearDeflection=.04,AngularDeflection=.2,Relative=False) points,faces=m.Topology for col in range(4): x=col*pitch;y=row*pitch for triangle in faces: poly=[xy(points[i].x+x,points[i].y+y) for i in triangle] d.polygon(poly,fill='#dc9b40' if row<2 else '#319b91') d.text((70,975),'连接杆截面 2 × 2 mm;中心线净跨度约 2 mm',font=text,fill='#294660') d.text((70,1025),'颜色仅表示厚度;建议拆除前分开标记。',font=text,fill='#294660') d.text((70,1085),'16 片超过商家单个拼件少于 10 件的规则,',font=small,fill='#a34c1c') d.text((70,1120),'请先确认能否接单;杆与薄片接合处需商家评估。',font=small,fill='#a34c1c') image.save(str(O/'拼件预览.png'))