def helicalextrusion(wire, height, angle): face_a = Face(wire) face_b = face_a.copy() face_transform = App.Matrix() face_transform.rotateZ(angle) face_transform.move(App.Vector(0,0,height)) face_b . transformShape(face_transform) step = 2 + int(angle / pi * 4 ) angleinc = angle / (step - 1) zinc = height / (step-1) spine = makePolygon([(0, 0, i * zinc) for i in range(step)]) auxspine = makePolygon( [ (cos(i * angleinc), sin(i * angleinc), i * height/(step-1))for i in range(step) ]) faces=[face_a,face_b ] pipeshell = BRepOffsetAPI.MakePipeShell(spine) pipeshell.setSpineSupport(spine) pipeshell.add(wire) pipeshell.setAuxiliarySpine(auxspine,True,False) assert(pipeshell.isReady()) pipeshell.build() faces.extend(pipeshell.shape().Faces) fullshell = Shell(faces) solid = Solid(fullshell) if solid.Volume < 0: solid.reverse() assert(solid.Volume >= 0) return(solid)
def execute(self, fp): fp.rack.m = fp.module.Value fp.rack.z = fp.teeth fp.rack.pressure_angle = fp.pressure_angle.Value * np.pi / 180. fp.rack.thickness = fp.thickness.Value fp.rack.beta = fp.beta.Value * np.pi / 180. fp.rack.head = fp.head fp.rack._update() pts = fp.rack.points() pol = Wire(makePolygon(list(map(fcvec, pts)))) if fp.beta.Value == 0: face = Face(Wire(pol)) fp.Shape = face.extrude(fcvec([0., 0., fp.height.Value])) elif fp.double_helix: beta = fp.beta.Value * np.pi / 180. pol2 = Part.Wire(pol) pol2.translate(fcvec([0., np.tan(beta) * fp.height.Value / 2, fp.height.Value / 2])) pol3 = Part.Wire(pol) pol3.translate(fcvec([0., 0., fp.height.Value])) fp.Shape = makeLoft([pol, pol2, pol3], True, True) else: beta = fp.beta.Value * np.pi / 180. pol2 = Part.Wire(pol) pol2.translate(fcvec([0., np.tan(beta) * fp.height.Value, fp.height.Value])) fp.Shape = makeLoft([pol, pol2], True)
def execute(self, fp): fp.rack.m = fp.module.Value fp.rack.z = fp.teeth fp.rack.pressure_angle = fp.pressure_angle.Value * pi / 180. fp.rack.thickness = fp.thickness.Value fp.rack.beta = fp.beta.Value * pi / 180. fp.rack.head = fp.head fp.rack._update() pts = fp.rack.points() pol = Wire(makePolygon(list(map(fcvec, pts)))) if fp.beta.Value == 0: face = Face(Wire(pol)) fp.Shape = face.extrude(fcvec([0., 0., fp.height.Value])) elif fp.double_helix: beta = fp.beta.Value * pi / 180. pol2 = Part.Wire(pol) pol2.translate( fcvec( [0., tan(beta) * fp.height.Value / 2, fp.height.Value / 2])) pol3 = Part.Wire(pol) pol3.translate(fcvec([0., 0., fp.height.Value])) fp.Shape = makeLoft([pol, pol2, pol3], True, True) else: beta = fp.beta.Value * pi / 180. pol2 = Part.Wire(pol) pol2.translate( fcvec([0., tan(beta) * fp.height.Value, fp.height.Value])) fp.Shape = makeLoft([pol, pol2], True)
def execute(self, fp): fp.rack.m = fp.module.Value fp.rack.z = fp.teeth fp.rack.alpha = fp.alpha.Value * pi / 180. fp.rack.thickness = fp.thickness.Value fp.rack._update() pts = fp.rack.points() pol = Wire(makePolygon(map(fcvec, pts))) fp.Shape = Face(Wire(pol)).extrude(fcvec([0., 0., fp.height]))
def execute(self, fp): fp.rack.m = fp.module.Value fp.rack.z = fp.teeth fp.rack.pressure_angle = fp.pressure_angle.Value * pi / 180. fp.rack.thickness = fp.thickness.Value fp.rack._update() pts = fp.rack.points() pol = Wire(makePolygon(list(map(fcvec, pts)))) fp.Shape = Face(Wire(pol)).extrude(fcvec([0., 0., fp.height]))
def execute(self, fp): fp.rack.m = fp.module.Value fp.rack.z = fp.teeth fp.rack.pressure_angle = fp.pressure_angle.Value * np.pi / 180. fp.rack.thickness = fp.thickness.Value fp.rack.beta = fp.beta.Value * np.pi / 180. fp.rack.head = fp.head # checksbackwardcompatibility: if "clearance" in fp.PropertiesList: fp.rack.clearance = fp.clearance if "properties_from_tool" in fp.PropertiesList: fp.rack.properties_from_tool = fp.properties_from_tool if "add_endings" in fp.PropertiesList: fp.rack.add_endings = fp.add_endings if "simplified" in fp.PropertiesList: fp.rack.simplified = fp.simplified fp.rack._update() pts = fp.rack.points() pol = Wire(makePolygon(list(map(fcvec, pts)))) if fp.height.Value == 0: fp.Shape = pol elif fp.beta.Value == 0: face = Face(Wire(pol)) fp.Shape = face.extrude(fcvec([0., 0., fp.height.Value])) elif fp.double_helix: beta = fp.beta.Value * np.pi / 180. pol2 = Part.Wire(pol) pol2.translate( fcvec([ 0., np.tan(beta) * fp.height.Value / 2, fp.height.Value / 2 ])) pol3 = Part.Wire(pol) pol3.translate(fcvec([0., 0., fp.height.Value])) fp.Shape = makeLoft([pol, pol2, pol3], True, True) else: beta = fp.beta.Value * np.pi / 180. pol2 = Part.Wire(pol) pol2.translate( fcvec([0., np.tan(beta) * fp.height.Value, fp.height.Value])) fp.Shape = makeLoft([pol, pol2], True) # computed properties if "transverse_pitch" in fp.PropertiesList: fp.transverse_pitch = "{} mm".format( fp.rack.compute_properties()[2])
def execute(self, fp): super(CrownGear, self).execute(fp) inner_diameter = fp.module.Value * fp.teeth outer_diameter = inner_diameter + fp.height.Value * 2 inner_circle = Part.Wire(Part.makeCircle(inner_diameter / 2.)) outer_circle = Part.Wire(Part.makeCircle(outer_diameter / 2.)) inner_circle.reverse() face = Part.Face([outer_circle, inner_circle]) solid = face.extrude(App.Vector([0., 0., -fp.thickness.Value])) # cutting obj alpha_w = np.deg2rad(fp.pressure_angle.Value) m = fp.module.Value t = fp.teeth t_c = t t_i = fp.other_teeth rm = inner_diameter / 2 y0 = m * 0.5 y1 = m + y0 y2 = m r0 = inner_diameter / 2 - fp.height.Value * 0.1 r1 = outer_diameter / 2 + fp.height.Value * 0.3 polies = [] for r_i in np.linspace(r0, r1, fp.num_profiles): pts = self.profile(m, r_i, rm, t_c, t_i, alpha_w, y0, y1, y2) poly = Wire(makePolygon(list(map(fcvec, pts)))) polies.append(poly) loft = makeLoft(polies, True) rot = App.Matrix() rot.rotateZ(2 * np.pi / t) if fp.preview_mode: cut_shapes = [solid] for _ in range(t): loft = loft.transformGeometry(rot) cut_shapes.append(loft) fp.Shape = Part.Compound(cut_shapes) else: for i in range(t): loft = loft.transformGeometry(rot) solid = solid.cut(loft) fp.Shape = solid
def execute(self, fp): inner_diameter = fp.module.Value * fp.teeth outer_diameter = inner_diameter + fp.height.Value * 2 inner_circle = Part.Wire(Part.makeCircle(inner_diameter / 2.)) outer_circle = Part.Wire(Part.makeCircle(outer_diameter / 2.)) inner_circle.reverse() face = Part.Face([outer_circle, inner_circle]) solid = face.extrude(App.Vector([0., 0., -fp.thickness.Value])) ### cutting obj alpha_w = np.deg2rad(fp.pressure_angle.Value) m = fp.module.Value t = fp.teeth t_c = t t_i = fp.other_teeth rm = inner_diameter / 2 y0 = m * 0.5 y1 = m + y0 y2 = m r0 = inner_diameter / 2 - fp.height.Value * 0.1 r1 = outer_diameter / 2 + fp.height.Value * 0.3 polies = [] for r_i in np.linspace(r0, r1, fp.num_profiles): pts = self.profile(m, r_i, rm, t_c, t_i, alpha_w, y0, y1, y2) poly = Wire(makePolygon(list(map(fcvec, pts)))) polies.append(poly) loft = makeLoft(polies, True) rot = App.Matrix() rot.rotateZ(2 * np.pi / t) if fp.construct: cut_shapes = [solid] for _ in range(t): loft = loft.transformGeometry(rot) cut_shapes.append(loft) fp.Shape = Part.Compound(cut_shapes) else: for i in range(t): loft = loft.transformGeometry(rot) solid = solid.cut(loft) fp.Shape = solid
def execute(self, fp): b = fp.pin_circle_diameter d = fp.roller_diameter e = fp.eccentricity n = fp.teeth_number p = b / n s = fp.segment_count ang = fp.pressure_angle_lim c = fp.pressure_angle_offset q = 2 * math.pi / float(s) # Find the pressure angle limit circles minAngle = -1.0 maxAngle = -1.0 for i in range(0, 180): x = self.calcPressureAngle(p, d, n, float(i) * math.pi / 180) if (x < ang) and (minAngle < 0): minAngle = float(i) if (x < -ang) and (maxAngle < 0): maxAngle = float(i - 1) minRadius = self.calcPressureLimit(p, d, e, n, minAngle * math.pi / 180) maxRadius = self.calcPressureLimit(p, d, e, n, maxAngle * math.pi / 180) Wire(Part.makeCircle(minRadius, App.Vector(-e, 0, 0))) Wire(Part.makeCircle(maxRadius, App.Vector(-e, 0, 0))) App.Console.PrintMessage("Generating cam disk\r\n") #generate the cam profile - note: shifted in -x by eccentricicy amount i = 0 x = self.calcX(p, d, e, n, q * i) y = self.calcY(p, d, e, n, q * i) x, y = self.checkLimit(x, y, maxRadius, minRadius, c) points = [App.Vector(x - e, y, 0)] for i in range(0, s): x = self.calcX(p, d, e, n, q * (i + 1)) y = self.calcY(p, d, e, n, q * (i + 1)) x, y = self.checkLimit(x, y, maxRadius, minRadius, c) points.append(App.Vector(x - e, y, 0)) cam = Face(Wire(makePolygon(points))) #add a circle in the center of the cam centerCircle = Face( Wire(Part.makeCircle(fp.hole_radius.Value, App.Vector(-e, 0, 0)))) cam = cam.cut(centerCircle) to_be_fused = [] if fp.show_disk0 == True: if fp.disk_height.Value == 0: to_be_fused.append(cam) else: to_be_fused.append( cam.extrude(App.Vector(0, 0, fp.disk_height.Value))) #secondary cam disk if fp.show_disk1 == True: App.Console.PrintMessage("Generating secondary cam disk\r\n") second_cam = cam.copy() mat = App.Matrix() mat.rotateZ(np.pi) mat.move(App.Vector(-e, 0, 0)) mat.rotateZ(np.pi / n) mat.move(App.Vector(e, 0, 0)) second_cam = second_cam.transformGeometry(mat) if fp.disk_height.Value == 0: to_be_fused.append(second_cam) else: to_be_fused.append( second_cam.extrude(App.Vector(0, 0, -fp.disk_height.Value))) #pins if fp.show_pins == True: App.Console.PrintMessage("Generating pins\r\n") pins = [] for i in range(0, n + 1): x = p * n * math.cos(2 * math.pi / (n + 1) * i) y = p * n * math.sin(2 * math.pi / (n + 1) * i) pins.append(Wire(Part.makeCircle(d / 2, App.Vector(x, y, 0)))) pins = Face(pins) z_offset = -fp.pin_height.Value / 2 if fp.center_pins == True: if fp.show_disk0 == True and fp.show_disk1 == False: z_offset += fp.disk_height.Value / 2 elif fp.show_disk0 == False and fp.show_disk1 == True: z_offset += -fp.disk_height.Value / 2 #extrude if z_offset != 0: pins.translate(App.Vector(0, 0, z_offset)) if fp.pin_height != 0: pins = pins.extrude(App.Vector(0, 0, fp.pin_height.Value)) to_be_fused.append(pins) if to_be_fused: fp.Shape = Part.makeCompound(to_be_fused)