From 6c76916f935c53c53d7a1134a610d98f2673f247 Mon Sep 17 00:00:00 2001 From: Neil Gershenfeld <gersh@cba.mit.edu> Date: Sun, 14 Oct 2018 07:54:26 -0700 Subject: [PATCH] wip --- python/pcb.py | 191 +++++++++++++++++++++++++++++++++----------------- 1 file changed, 125 insertions(+), 66 deletions(-) diff --git a/python/pcb.py b/python/pcb.py index 705ced3..8a9bbe6 100755 --- a/python/pcb.py +++ b/python/pcb.py @@ -41,27 +41,28 @@ import math,json,sys # # color(color,part) -# circle(x0, y0, r) -# cylinder(x0, y0, z0, z1, r) -# cone(x0, y0, z0, z1, r0) -# sphere(x0, y0, z0, r) -# torus(x0, y0, z0, r0, r1) -# rectangle(x0, x1, y0, y1) -# cube(x0, x1, y0, y1, z0, z1) -# right_triangle(x0, y0, h) -# triangle(x0, y0, x1, y1, x2, y2) (points in clockwise order) -# pyramid(x0, x1, y0, y1, z0, z1) +# circle(x,y,r) +# cylinder(x,y,z0,z1,r) +# cone(x,y,z0,z1,r) +# sphere(x,y,z,r) +# torus(x,y,z,r0,r1) +# rectangle(x0,x1,y0,y1) +# cube(x0,x1,y0,y1,z0,z1) +# line(x0,y0,x1,y1,z,width) +# right_triangle(x,y,h) +# triangle(x0,y0,x1,y1,x2,y2) (points in clockwise order) +# pyramid(x0,x1,y0,y1,z0,z1) # function(Z_of_XY) # functions(upper_Z_of_XY,lower_Z_of_XY) -# add(part1, part2) -# subtract(part1, part2) -# intersect(part1, part2) +# add(part1,part2) +# subtract(part1,part2) +# intersect(part1,part2) # move(part,dx,dy) # translate(part,dx,dy,dz) # rotate(part, angle) -# rotate_x(part, angle) -# rotate_y(part, angle) -# rotate_z(part, angle) +# rotate_x(part,angle) +# rotate_y(part,angle) +# rotate_z(part,angle) # rotate_90(part) # rotate_180(part) # rotate_270(part) @@ -71,24 +72,24 @@ import math,json,sys # reflect_xy(part) # reflect_xz(part) # reflect_yz(part) -# scale_x(part, x0, sx) -# scale_y(part, y0, sy) -# scale_z(part, z0, sz) -# scale_xy(part, x0, y0, sxy) -# scale_xyz(part, x0, y0, z0, sxyz) -# coscale_x_y(part, x0, y0, y1, angle0, angle1, amplitude, offset) -# coscale_x_z(part, x0, z0, z1, angle0, angle1, amplitude, offset) -# coscale_xy_z(part, x0, y0, z0, z1, angle0, angle1, amplitude, offset) -# taper_x_y(part, x0, y0, y1, s0, s1) -# taper_x_z(part, x0, z0, z1, s0, s1) -# taper_xy_z(part, x0, y0, z0, z1, s0, s1) -# shear_x_y(part, y0, y1, dx0, dx1) -# shear_x_z(part, z0, z1, dx0, dx1) +# scale_x(part,x0,sx) +# scale_y(part,y0,sy) +# scale_z(part,z0,sz) +# scale_xy(part,x0,y0,sxy) +# scale_xyz(part,x0,y0,z0,sxyz) +# coscale_x_y(part,x0,y0,y1,angle0,angle1,amplitude,offset) +# coscale_x_z(part,x0,z0 z1,angle0,angle1,amplitude,offset) +# coscale_xy_z(part,x0,y0,z0,z1,angle0,angle1,amplitude,offset) +# taper_x_y(part,x0,y0,y1,s0,s1) +# taper_x_z(part,x0,z0,z1,s0,s1) +# taper_xy_z(part,x0,y0,z0,z1,s0,s1) +# shear_x_y(part,y0,y1,dx0,dx1) +# shear_x_z(part,z0,z1,dx0,dx1) true = "1" false = "0" -def color(color, part): +def color(color,part): part = '('+str(color)+'*(('+part+')!=0))' return part @@ -104,14 +105,14 @@ Brown = (45 << 16) + (82 << 8) + (145 << 0) Navy = (128 << 16) + (0 << 8) + (0 << 0) Tan = (60 << 16) + (90 << 8) + (125 << 0) -def circle(x0, y0, r): +def circle(x0,y0,r): part = "(((X-(x0))*(X-(x0)) + (Y-(y0))*(Y-(y0))) <= (r*r))" part = part.replace('x0',str(x0)) part = part.replace('y0',str(y0)) part = part.replace('r',str(r)) return part -def cylinder(x0, y0, z0, z1, r): +def cylinder(x0,y0,z0,z1,r): part = "(((X-(x0))*(X-(x0)) + (Y-(y0))*(Y-(y0)) <= (r*r)) & (Z >= (z0)) & (Z <= (z1)))" part = part.replace('x0',str(x0)) part = part.replace('y0',str(y0)) @@ -120,12 +121,12 @@ def cylinder(x0, y0, z0, z1, r): part = part.replace('r',str(r)) return part -def cone(x0, y0, z0, z1, r0): +def cone(x0,y0,z0,z1,r0): part = cylinder(x0, y0, z0, z1, r0) part = taper_xy_z(part, x0, y0, z0, z1, 1.0, 0.0) return part -def sphere(x0, y0, z0, r): +def sphere(x0,y0,z0,r): part = "(((X-(x0))*(X-(x0)) + (Y-(y0))*(Y-(y0)) + (Z-(z0))*(Z-(z0))) <= (r*r))" part = part.replace('x0',str(x0)) part = part.replace('y0',str(y0)) @@ -133,7 +134,7 @@ def sphere(x0, y0, z0, r): part = part.replace('r',str(r)) return part -def torus(x0, y0, z0, r0, r1): +def torus(x0,y0,z0,r0,r1): part = "(((r0 - sqrt((X-(x0))*(X-(x0)) + (Y-(y0))*(Y-(y0))))*(r0 - sqrt((X-(x0))*(X-(x0)) + (Y-(y0))*(Y-(y0))) + (Z-(z0))*(Z-(z0))) <= (r1*r1))" part = part.replace('x0',str(x0)) part = part.replace('y0',str(y0)) @@ -142,7 +143,7 @@ def torus(x0, y0, z0, r0, r1): part = part.replace('r1',str(r1)) return part -def rectangle(x0, x1, y0, y1): +def rectangle(x0,x1,y0,y1): part = "((X >= (x0)) & (X <= (x1)) & (Y >= (y0)) & (Y <= (y1)))" part = part.replace('x0',str(x0)) part = part.replace('x1',str(x1)) @@ -150,7 +151,7 @@ def rectangle(x0, x1, y0, y1): part = part.replace('y1',str(y1)) return part -def cube(x0, x1, y0, y1, z0, z1): +def cube(x0,x1,y0,y1,z0,z1): part = "((X >= (x0)) & (X <= (x1)) & (Y >= (y0)) & (Y <= (y1)) & (Z >= (z0)) & (Z <= (z1)))" part = part.replace('x0',str(x0)) part = part.replace('x1',str(x1)) @@ -160,14 +161,36 @@ def cube(x0, x1, y0, y1, z0, z1): part = part.replace('z1',str(z1)) return part -def right_triangle(x0, y0, l): +def line(x0,y0,x1,y1,z,width): + dx = x1-x0 + dy = y1-y0 + l = math.sqrt(dx*dx+dy*dy) + nx = dx/l + ny = dy/l + rx = -ny + ry = nx + part = "((((X-(x0))*(nx)+(Y-(y0))*(ny)) >= 0) & (((X-(x0))*(nx)+(Y-(y0))*(ny)) <= l) & (((X-(x0))*(rx)+(Y-(y0))*(ry)) >= (-width/2)) & (((X-(x0))*(rx)+(Y-(y0))*(ry)) <= (width/2)) & (Z == z))" + part = part.replace('x0',str(x0)) + part = part.replace('x1',str(x1)) + part = part.replace('y0',str(y0)) + part = part.replace('y1',str(y1)) + part = part.replace('nx',str(nx)) + part = part.replace('ny',str(ny)) + part = part.replace('rx',str(rx)) + part = part.replace('ry',str(ry)) + part = part.replace('l',str(l)) + part = part.replace('z',str(z)) + part = part.replace('width',str(width)) + return part + +def right_triangle(x0,y0,l): part = "((X > x0) & (X < x0 + l - (Y-y0)) & (Y > y0))" part = part.replace('x0',str(x0)) part = part.replace('y0',str(y0)) part = part.replace('l',str(l)) return part -def triangle(x0, y0, x1, y1, x2, y2): # points in clockwise order +def triangle(x0,y0,x1,y1,x2,y2): # points in clockwise order part = "(((((y1)-(y0))*(X-(x0))-((x1)-(x0))*(Y-(y0))) >= 0) & ((((y2)-(y1))*(X-(x1))-((x2)-(x1))*(Y-(y1))) >= 0) & ((((y0)-(y2))*(X-(x2))-((x0)-(x2))*(Y-(y2))) >= 0))" part = part.replace('x0',str(x0)) part = part.replace('y0',str(y0)) @@ -177,7 +200,7 @@ def triangle(x0, y0, x1, y1, x2, y2): # points in clockwise order part = part.replace('y2',str(y2)) return part -def pyramid(x0, x1, y0, y1, z0, z1): +def pyramid(x0,x1,y0,y1,z0,z1): part = cube(x0, x1, y0, y1, z0, z1) part = taper_xy_z(part, (x0+x1)/2., (y0+y1)/2., z0, z1, 1.0, 0.0) return part @@ -190,19 +213,19 @@ def functions(upper_Z_of_XY,lower_Z_of_XY): part = '(Z <= '+upper_Z_of_XY+') & (Z >= '+lower_Z_of_XY+')' return part -def add(part1, part2): +def add(part1,part2): part = "part1 | part2" part = part.replace('part1',part1) part = part.replace('part2',part2) return part -def subtract(part1, part2): +def subtract(part1,part2): part = "(part1) & ~(part2)" part = part.replace('part1',part1) part = part.replace('part2',part2) return part -def intersect(part1, part2): +def intersect(part1,part2): part = "(part1) & (part2)" part = part.replace('part1',part1) part = part.replace('part2',part2) @@ -219,7 +242,7 @@ def translate(part,dx,dy,dz): part = part.replace('Z','(Z-('+str(dz)+'))') return part -def rotate(part, angle): +def rotate(part,angle): angle = angle*math.pi/180 part = part.replace('X','(math.cos(angle)*X+math.sin(angle)*y)') part = part.replace('Y','(-math.sin(angle)*X+math.cos(angle)*y)') @@ -227,7 +250,7 @@ def rotate(part, angle): part = part.replace('angle',str(angle)) return part -def rotate_x(part, angle): +def rotate_x(part,angle): angle = angle*math.pi/180 part = part.replace('Y','(math.cos(angle)*Y+math.sin(angle)*z)') part = part.replace('Z','(-math.sin(angle)*Y+math.cos(angle)*z)') @@ -235,7 +258,7 @@ def rotate_x(part, angle): part = part.replace('angle',str(angle)) return part -def rotate_y(part, angle): +def rotate_y(part,angle): angle = angle*math.pi/180 part = part.replace('X','(math.cos(angle)*X+math.sin(angle)*z)') part = part.replace('Z','(-math.sin(angle)*X+math.cos(angle)*z)') @@ -243,7 +266,7 @@ def rotate_y(part, angle): part = part.replace('angle',str(angle)) return part -def rotate_z(part, angle): +def rotate_z(part,angle): angle = angle*math.pi/180 part = part.replace('X','(math.cos(angle)*X+math.sin(angle)*y)') part = part.replace('Y','(-math.sin(angle)*X+math.cos(angle)*y)') @@ -300,25 +323,25 @@ def reflect_yz(part): part = part.replace('temp','Z') return part -def scale_x(part, x0, sx): +def scale_x(part,x0,sx): part = part.replace('X','((x0) + (X-(x0))/(sx))') part = part.replace('x0',str(x0)) part = part.replace('sx',str(sx)) return part -def scale_y(part, y0, sy): +def scale_y(part,y0,sy): part = part.replace('Y','((y0) + (Y-(y0))/(sy))') part = part.replace('y0',str(y0)) part = part.replace('sy',str(sy)) return part -def scale_z(part, z0, sz): +def scale_z(part,z0,sz): part = part.replace('Z','((z0) + (Z-(z0))/(sz))') part = part.replace('z0',str(z0)) part = part.replace('sz',str(sz)) return part -def scale_xy(part, x0, y0, sxy): +def scale_xy(part,x0,y0,sxy): part = part.replace('X','((x0) + (X-(x0))/(sxy))') part = part.replace('Y','((y0) + (Y-(y0))/(sxy))') part = part.replace('x0',str(x0)) @@ -326,7 +349,7 @@ def scale_xy(part, x0, y0, sxy): part = part.replace('sxy',str(sxy)) return part -def scale_xyz(part, x0, y0, z0, sxyz): +def scale_xyz(part,x0,y0,z0,sxyz): part = part.replace('X','((x0) + (X-(x0))/(sxyz))') part = part.replace('Y','((y0) + (Y-(y0))/(sxyz))') part = part.replace('Z','((z0) + (Z-(z0))/(sxyz))') @@ -336,7 +359,7 @@ def scale_xyz(part, x0, y0, z0, sxyz): part = part.replace('sxyz',str(sxyz)) return part -def coscale_x_y(part, x0, y0, y1, angle0, angle1, amplitude, offset): +def coscale_x_y(part,x0,y0,y1,angle0,angle1,amplitude,offset): phase0 = math.pi*angle0/180. phase1 = math.pi*angle1/180. part = part.replace('X','((x0) + (X-(x0))/((offset) + (amplitude)*math.cos((phase0) + ((phase1)-(phase0))*(Y-(y0))/((y1)-(y0)))))') @@ -349,7 +372,7 @@ def coscale_x_y(part, x0, y0, y1, angle0, angle1, amplitude, offset): part = part.replace('offset',str(offset)) return part -def coscale_x_z(part, x0, z0, z1, angle0, angle1, amplitude, offset): +def coscale_x_z(part,x0,z0,z1,angle0,angle1,amplitude,offset): phase0 = math.pi*angle0/180. phase1 = math.pi*angle1/180. part = part.replace('X','((x0) + (X-(x0))/((offset) + (amplitude)*math.cos((phase0) + ((phase1)-(phase0))*(Z-(z0))/((z1)-(z0)))))') @@ -362,7 +385,7 @@ def coscale_x_z(part, x0, z0, z1, angle0, angle1, amplitude, offset): part = part.replace('offset',str(offset)) return part -def coscale_xy_z(part, x0, y0, z0, z1, angle0, angle1, amplitude, offset): +def coscale_xy_z(part,x0,y0,z0,z1,angle0,angle1,amplitude,offset): phase0 = math.pi*angle0/180. phase1 = math.pi*angle1/180. part = part.replace('X','((x0) + (X-(x0))/((offset) + (amplitude)*math.cos((phase0) + ((phase1)-(phase0))*(Z-(z0))/((z1)-(z0)))))') @@ -377,7 +400,7 @@ def coscale_xy_z(part, x0, y0, z0, z1, angle0, angle1, amplitude, offset): part = part.replace('offset',str(offset)) return part -def taper_x_y(part, x0, y0, y1, s0, s1): +def taper_x_y(part,x0,y0,y1,s0,s1): part = part.replace('X','((x0) + (X-(x0))*((y1)-(y0))/((s1)*(Y-(y0)) + (s0)*((y1)-Y)))') part = part.replace('x0',str(x0)) part = part.replace('y0',str(y0)) @@ -386,7 +409,7 @@ def taper_x_y(part, x0, y0, y1, s0, s1): part = part.replace('s1',str(s1)) return part -def taper_x_z(part, x0, z0, z1, s0, s1): +def taper_x_z(part,x0,z0,z1,s0,s1): part = part.replace('X','((x0) + (X-(x0))*((z1)-(z0))/((s1)*(Z-(z0)) + (s0)*((z1)-Z)))') part = part.replace('x0',str(x0)) part = part.replace('z0',str(z0)) @@ -395,7 +418,7 @@ def taper_x_z(part, x0, z0, z1, s0, s1): part = part.replace('s1',str(s1)) return part -def taper_xy_z(part, x0, y0, z0, z1, s0, s1): +def taper_xy_z(part,x0,y0,z0,z1,s0,s1): part = part.replace('X','((x0) + (X-(x0))*((z1)-(z0))/((s1)*(Z-(z0)) + (s0)*((z1)-Z)))') part = part.replace('Y','((y0) + (Y-(y0))*((z1)-(z0))/((s1)*(Z-(z0)) + (s0)*((z1)-Z)))') part = part.replace('x0',str(x0)) @@ -406,7 +429,7 @@ def taper_xy_z(part, x0, y0, z0, z1, s0, s1): part = part.replace('s1',str(s1)) return part -def shear_x_y(part, y0, y1, dx0, dx1): +def shear_x_y(part,y0,y1,dx0,dx1): part = part.replace('X','(X - (dx0) - ((dx1)-(dx0))*(Y-(y0))/((y1)-(y0)))') part = part.replace('y0',str(y0)) part = part.replace('y1',str(y1)) @@ -414,7 +437,7 @@ def shear_x_y(part, y0, y1, dx0, dx1): part = part.replace('dx1',str(dx1)) return part -def shear_x_z(part, z0, z1, dx0, dx1): +def shear_x_z(part,z0,z1,dx0,dx1): part = part.replace('X','(X - (dx0) - ((dx1)-(dx0))*(Z-(z0))/((z1)-(z0)))') part = part.replace('z0',str(z0)) part = part.replace('z1',str(z1)) @@ -422,7 +445,7 @@ def shear_x_z(part, z0, z1, dx0, dx1): part = part.replace('dx1',str(dx1)) return part -def coshear_x_z(part, z0, z1, angle0, angle1, amplitude, offset): +def coshear_x_z(part,z0,z1,angle0,angle1,amplitude,offset): phase0 = math.pi*angle0/180. phase1 = math.pi*angle1/180. part = part.replace('X','(X - (offset) - (amplitude)*math.cos((phase0) + ((phase1)-(phase0))*(Z-(z0))/((z1)-(z0))))') @@ -990,7 +1013,7 @@ class part: pcb = pcb.add(translate(self.shape,0,0,z)) return pcb -def wire(pcb,width,*points): +def rightwire(pcb,width,*points): for i in range(1,len(points)): x0 = points[i-1].x y0 = points[i-1].y @@ -1008,6 +1031,22 @@ def wire(pcb,width,*points): pcb.board = add(pcb.board,cube(x1-width/2,x1+width/2,y1-width/2,y0+width/2,z0,z0)) return pcb +def wire(pcb,width,*points): + x0 = points[0].x + y0 = points[0].y + z0 = points[0].z + pcb.board = add(pcb.board,cylinder(x0,y0,z0,z0,width/2)) + for i in range(1,len(points)): + x0 = points[i-1].x + y0 = points[i-1].y + z0 = points[i-1].z + x1 = points[i].x + y1 = points[i].y + z1 = points[i].z + pcb.board = add(pcb.board,line(x0,y0,x1,y1,z1,width)) + pcb.board = add(pcb.board,cylinder(x1,y1,z1,z1,width/2)) + return pcb + # # PCB library # @@ -4593,7 +4632,7 @@ class fab(part): # define board # -w = .016 +w = .015 width = 1 height = .93 mask = .004 @@ -4612,25 +4651,34 @@ pcb = J1.add(pcb,IC1.x+.05,IC1.pad[7].y-.22,z,angle=90) pcb = wire(pcb,w, IC1.pad[8], + point(J1.pad[1].x,IC1.pad[8].y,z), J1.pad[1]) pcb = wire(pcb,w, IC1.pad[9], + point(J1.pad[3].x,IC1.pad[9].y,z), J1.pad[3]) pcb = wire(pcb,w, IC1.pad[7], - point(IC1.pad[7].x+.01,J1.y-.02,z), + point(IC1.pad[7].x,J1.y+.02,z), + point(IC1.pad[7].x+.04,J1.y-.02,z), + point(J1.pad[4].x,J1.y-.02,z), J1.pad[4]) pcb = wire(pcb,w, IC1.pad[4], + point(J1.pad[5].x,IC1.pad[4].y,z), J1.pad[5]) pcb = wire(pcb,w, IC1.pad[14], + point(J1.x-.01,IC1.pad[14].y,z), + point(J1.x-.05,IC1.pad[14].y-.04,z), point(J1.x-.05,J1.y+.02,z), + point(J1.x+.05,J1.y+.02,z), point(J1.x+.05,J1.pad[2].y-.08,z), + point(J1.pad[6].x,J1.pad[2].y-.08,z), J1.pad[6]) J2 = header_FTDI('J2 FTDI') @@ -4638,30 +4686,38 @@ pcb = J2.add(pcb,x+width-.22,IC1.y-.0,z,angle=0) pcb = wire(pcb,w, J1.pad[2], + point(J2.x,J1.pad[2].y,z), + point(J2.x+.08,J1.pad[2].y+.08,z), point(J2.x+.08,J2.pad[3].y,z), J2.pad[3]) pcb = wire(pcb,w, IC1.pad[13], + point(IC1.pad[13].x+.105,IC1.pad[13].y,z), point(IC1.pad[13].x+.105,J2.pad[4].y,z), J2.pad[4]) pcb = wire(pcb,w, IC1.pad[12], - point(IC1.pad[12].x+.07,J2.pad[5].y,z), + point(IC1.pad[12].x+.07,IC1.pad[12].y,z), + point(IC1.pad[12].x+.07,J2.pad[5].y+.04,z), + point(IC1.pad[12].x+.11,J2.pad[5].y,z), J2.pad[5]) XTAL1 = XTAL_EFOBM('XTAL1\n20 MHz') -pcb = XTAL1.add(pcb,IC1.pad[4].x-.2,IC1.pad[13].y+.008,z,angle=-90) +pcb = XTAL1.add(pcb,IC1.pad[4].x-.2,IC1.pad[13].y+.003,z,angle=-90) pcb = wire(pcb,w, IC1.pad[2], + point(XTAL1.x+.12,IC1.pad[2].y,z), point(XTAL1.x+.12,XTAL1.pad[1].y,z), XTAL1.pad[1]) pcb = wire(pcb,w, J1.pad[6], point(J1.pad[6].x,J1.pad[6].y-.08,z), + point(XTAL1.x-.04,J1.pad[6].y-.08,z), + point(XTAL1.x-.12,J1.pad[6].y,z), point(XTAL1.x-.12,XTAL1.pad[2].y,z), XTAL1.pad[2]) @@ -4678,11 +4734,14 @@ pcb = wire(pcb,w, pcb = wire(pcb,w, J2.pad[3], + point(J2.pad[3].x+.08,J2.pad[3].y,z), point(J2.pad[3].x+.08,R1.y+.06,z), + point(R1.pad[1].x,R1.y+.06,z), R1.pad[1]) pcb = wire(pcb,w, R1.pad[2], + point(J1.pad[5].x,R1.y,z), J1.pad[5]) C1 = C_1206('C1\n1uF'); -- GitLab