Package empro :: Package toolkit :: Package geometry :: Package bonding :: Module solderball
[frames] | no frames]

Source Code for Module empro.toolkit.geometry.bonding.solderball

 1  # Copyright 1983-2012 Keysight Technologies, Inc   
 2  # Simple models of solder balls 
 3   
 4  import empro.toolkit as toolkit 
 5  import empro.toolkit.geometry 
 6  import math 
 7  from empro import * 
 8  V = geometry.Vector3d 
 9   
10   
11 -def solderBall(minRadius = 0.01*units.inch, 12 maxRadius = 0.0125*units.inch, 13 height = 0.01*units.inch, 14 divisions = 3, 15 arcResolution = 30.0):
16 cornerPoints = cornerPointsAlongZ(minRadius,maxRadius,height,divisions) 17 mySketch = geometry.Sketch() 18 for index in range(len(cornerPoints)-1): 19 mySketch.add(geometry.Line(cornerPoints[index],cornerPoints[index+1])) 20 myRevolve = geometry.Revolve(mySketch,V(0.0,0.0,0.0),V(0.0,0.0,1.0)) 21 myRevolve.options.steps = int(math.floor(180.0/arcResolution)) 22 print myRevolve.options.steps 23 myModel = geometry.Model() 24 myModel.recipe.append(myRevolve) 25 myModel.name = "Solder Ball" 26 solderBall = geometry.Assembly() 27 solderBall.append(myModel) 28 return solderBall
29
30 -def sideView(iMinRadius,iMaxRadius,iHeight,iDivisions,iArcResolution):
31 points3D = cornerPointsAlongZ(iMinRadius,iMaxRadius,iHeight,iDivisions) 32 points2D = [] 33 for i in range(len(points3D)): 34 point = points3D[i] 35 tmpPoint = (float(point.x),float(point.z)) 36 if not tmpPoint in points2D: 37 points2D.append(tmpPoint) 38 for i in range(len(points3D)): 39 point = points3D[len(points3D)-1-i] 40 tmpPoint = (-float(point.x),float(point.z)) 41 if not tmpPoint in points2D: 42 points2D.append(tmpPoint) 43 return points2D
44
45 -def cornerPointsAlongZ(iMinRadius,iMaxRadius,iHeight,iDivisions):
46 halfOfDivisions = math.modf(iDivisions/2.0)[1] 47 incrementAlongZ = iHeight/iDivisions 48 if (iMinRadius == iMaxRadius): 49 corners = [] 50 corners.append(V(0.0,0.0,0.0)) 51 corners.append(V(iMinRadius,0.0,0.0)) 52 corners.append(V(iMinRadius,0.0,iHeight)) 53 corners.append(V(0.0,0.0,iHeight)) 54 corners.append(corners[0]) 55 else: 56 sign = (iMaxRadius-iMinRadius)/abs(iMaxRadius-iMinRadius) 57 middlePoint = V((iMinRadius+iMaxRadius)/2.0,0.0,halfOfDivisions*incrementAlongZ/2.0) 58 alpha = sign * math.pi/2.0 + math.atan2(halfOfDivisions*incrementAlongZ,iMaxRadius-iMinRadius) 59 xCenter = float(middlePoint.x) + (iHeight/2.0-float(middlePoint.z))/math.tan(alpha) 60 radius = math.sqrt(math.pow(xCenter-iMinRadius,2.0)+math.pow(iHeight/2.0,2.0)) 61 corners = [] 62 corners.append(V(0.0,0.0,0.0)) 63 corners.append(V(iMinRadius,0.0,0.0)) 64 for index in range(iDivisions-1): 65 z = (index+1)*incrementAlongZ 66 x = xCenter + sign * math.sqrt(math.pow(radius,2.0)-math.pow(z-iHeight/2.0,2.0)) 67 corners.append(V(x,0.0,z)) 68 corners.append(V(iMinRadius,0.0,iHeight)) 69 corners.append(V(0.0,0.0,iHeight)) 70 corners.append(corners[0]) 71 return corners
72