Rename teeth property to num_teeth
This commit is contained in:
6
TODO.md
6
TODO.md
@@ -1,6 +1,6 @@
|
|||||||
#TODO:
|
# TODO
|
||||||
|
|
||||||
## refactoring
|
## refactoring
|
||||||
|
|
||||||
- [ ] fp.gear.z -> fp.gear.num_teeth
|
- [X] fp.gear.z -> fp.gear.num_teeth
|
||||||
- [ ] fp.teeth -> fp.gear.num_teeth
|
- [X] fp.teeth -> fp.gear.num_teeth
|
||||||
|
|||||||
@@ -124,6 +124,23 @@ class BaseGear:
|
|||||||
if not hasattr(fp, "positionBySupport"):
|
if not hasattr(fp, "positionBySupport"):
|
||||||
self.make_attachable(fp)
|
self.make_attachable(fp)
|
||||||
fp.positionBySupport()
|
fp.positionBySupport()
|
||||||
|
|
||||||
|
# Backward compatibility for old files
|
||||||
|
if hasattr(fp, "teeth"):
|
||||||
|
fp.addProperty(
|
||||||
|
"App::PropertyInteger",
|
||||||
|
"num_teeth",
|
||||||
|
"base",
|
||||||
|
"number of teeth",
|
||||||
|
)
|
||||||
|
app.Console.PrintLog(
|
||||||
|
app.Qt.translate(
|
||||||
|
"Log", "Migrating 'teeth' property to 'num_teeth' on {} part\n"
|
||||||
|
).format(fp.Name)
|
||||||
|
)
|
||||||
|
fp.num_teeth = fp.teeth # Copy old value to new property
|
||||||
|
fp.removeProperty("teeth") # Remove the old property
|
||||||
|
|
||||||
gear_shape = self.generate_gear_shape(fp)
|
gear_shape = self.generate_gear_shape(fp)
|
||||||
if hasattr(fp, "BaseFeature") and fp.BaseFeature != None:
|
if hasattr(fp, "BaseFeature") and fp.BaseFeature != None:
|
||||||
# we're inside a PartDesign Body, thus need to fuse with the base feature
|
# we're inside a PartDesign Body, thus need to fuse with the base feature
|
||||||
|
|||||||
@@ -28,7 +28,6 @@ from .basegear import BaseGear, fcvec, make_bspline_wire
|
|||||||
|
|
||||||
|
|
||||||
class BevelGear(BaseGear):
|
class BevelGear(BaseGear):
|
||||||
|
|
||||||
"""parameters:
|
"""parameters:
|
||||||
pressure_angle: pressureangle, 10-30°
|
pressure_angle: pressureangle, 10-30°
|
||||||
pitch_angle: cone angle, 0 < pitch_angle < pi/4
|
pitch_angle: cone angle, 0 < pitch_angle < pi/4
|
||||||
@@ -39,7 +38,7 @@ class BevelGear(BaseGear):
|
|||||||
self.bevel_tooth = BevelTooth()
|
self.bevel_tooth = BevelTooth()
|
||||||
obj.addProperty(
|
obj.addProperty(
|
||||||
"App::PropertyInteger",
|
"App::PropertyInteger",
|
||||||
"teeth",
|
"num_teeth",
|
||||||
"base",
|
"base",
|
||||||
translate("BevelGear", "number of teeth"),
|
translate("BevelGear", "number of teeth"),
|
||||||
)
|
)
|
||||||
@@ -116,7 +115,7 @@ class BevelGear(BaseGear):
|
|||||||
translate("BevelGear", "The pitch diameter."),
|
translate("BevelGear", "The pitch diameter."),
|
||||||
)
|
)
|
||||||
obj.setExpression(
|
obj.setExpression(
|
||||||
"dw", "teeth * module"
|
"dw", "num_teeth * module"
|
||||||
) # calculate via expression to ease usage for placement
|
) # calculate via expression to ease usage for placement
|
||||||
obj.setEditorMode(
|
obj.setEditorMode(
|
||||||
"dw", 1
|
"dw", 1
|
||||||
@@ -136,9 +135,10 @@ class BevelGear(BaseGear):
|
|||||||
obj.setEditorMode(
|
obj.setEditorMode(
|
||||||
"angular_backlash", 1
|
"angular_backlash", 1
|
||||||
) # set read-only after setting the expression, else it won't be visible. bug?
|
) # set read-only after setting the expression, else it won't be visible. bug?
|
||||||
|
|
||||||
obj.gear = self.bevel_tooth
|
obj.gear = self.bevel_tooth
|
||||||
obj.module = "1. mm"
|
obj.module = "1. mm"
|
||||||
obj.teeth = 15
|
obj.num_teeth = 15
|
||||||
obj.pressure_angle = "20. deg"
|
obj.pressure_angle = "20. deg"
|
||||||
obj.pitch_angle = "45. deg"
|
obj.pitch_angle = "45. deg"
|
||||||
obj.height = "5. mm"
|
obj.height = "5. mm"
|
||||||
@@ -151,28 +151,30 @@ class BevelGear(BaseGear):
|
|||||||
obj.Proxy = self
|
obj.Proxy = self
|
||||||
|
|
||||||
def generate_gear_shape(self, fp):
|
def generate_gear_shape(self, fp):
|
||||||
fp.gear.z = fp.teeth
|
|
||||||
fp.gear.module = fp.module.Value
|
fp.gear.module = fp.module.Value
|
||||||
fp.gear.pressure_angle = (90 - fp.pressure_angle.Value) * np.pi / 180.0
|
fp.gear.pressure_angle = (90 - fp.pressure_angle.Value) * np.pi / 180.0
|
||||||
fp.gear.pitch_angle = fp.pitch_angle.Value * np.pi / 180
|
fp.gear.pitch_angle = fp.pitch_angle.Value * np.pi / 180
|
||||||
max_height = fp.gear.module * fp.teeth / 2 / np.tan(fp.gear.pitch_angle)
|
max_height = fp.gear.module * fp.num_teeth / 2 / np.tan(fp.gear.pitch_angle)
|
||||||
if fp.height >= max_height:
|
if fp.height >= max_height:
|
||||||
app.Console.PrintWarning(
|
app.Console.PrintWarning(
|
||||||
"height must be smaller than {}".format(max_height)
|
"height must be smaller than {}".format(max_height)
|
||||||
)
|
)
|
||||||
fp.gear.backlash = fp.backlash.Value
|
fp.gear.backlash = fp.backlash.Value
|
||||||
scale = (
|
scale = (
|
||||||
fp.module.Value * fp.gear.z / 2 / np.tan(fp.pitch_angle.Value * np.pi / 180)
|
fp.module.Value
|
||||||
|
* fp.num_teeth
|
||||||
|
/ 2
|
||||||
|
/ np.tan(fp.pitch_angle.Value * np.pi / 180)
|
||||||
)
|
)
|
||||||
fp.gear.clearance = fp.clearance / scale
|
fp.gear.clearance = fp.clearance / scale
|
||||||
fp.gear._update()
|
fp.gear._update()
|
||||||
pts = list(fp.gear.points(num=fp.numpoints))
|
pts = list(fp.gear.points(num=fp.numpoints))
|
||||||
rot = rotation3D(-2 * np.pi / fp.teeth)
|
rot = rotation3D(-2 * np.pi / fp.num_teeth)
|
||||||
# if fp.beta.Value != 0:
|
# if fp.beta.Value != 0:
|
||||||
# pts = [np.array([self.spherical_rot(j, fp.beta.Value * np.pi / 180.) for j in i]) for i in pts]
|
# pts = [np.array([self.spherical_rot(j, fp.beta.Value * np.pi / 180.) for j in i]) for i in pts]
|
||||||
|
|
||||||
rotated_pts = pts
|
rotated_pts = pts
|
||||||
for i in range(fp.gear.z - 1):
|
for i in range(fp.num_teeth - 1):
|
||||||
rotated_pts = list(map(rot, rotated_pts))
|
rotated_pts = list(map(rot, rotated_pts))
|
||||||
pts.append(np.array([pts[-1][-1], rotated_pts[0][0]]))
|
pts.append(np.array([pts[-1][-1], rotated_pts[0][0]]))
|
||||||
pts += rotated_pts
|
pts += rotated_pts
|
||||||
@@ -211,20 +213,20 @@ class BevelGear(BaseGear):
|
|||||||
mat.move(fcvec([0, 0, scale_1]))
|
mat.move(fcvec([0, 0, scale_1]))
|
||||||
shape = shape.transformGeometry(mat)
|
shape = shape.transformGeometry(mat)
|
||||||
return shape
|
return shape
|
||||||
# return self.create_teeth(pts, pos1, fp.teeth)
|
# return self.create_teeth(pts, pos1, fp.num_teeth)
|
||||||
|
|
||||||
def create_tooth(self):
|
def create_tooth(self):
|
||||||
w = []
|
w = []
|
||||||
scal1 = (
|
scal1 = (
|
||||||
self.obj.m.Value
|
self.obj.m.Value
|
||||||
* self.obj.gear.z
|
* self.obj.num_teeth
|
||||||
/ 2
|
/ 2
|
||||||
/ np.tan(self.obj.pitch_angle.Value * np.pi / 180)
|
/ np.tan(self.obj.pitch_angle.Value * np.pi / 180)
|
||||||
- self.obj.height.Value / 2
|
- self.obj.height.Value / 2
|
||||||
)
|
)
|
||||||
scal2 = (
|
scal2 = (
|
||||||
self.obj.m.Value
|
self.obj.m.Value
|
||||||
* self.obj.gear.z
|
* self.obj.num_teeth
|
||||||
/ 2
|
/ 2
|
||||||
/ np.tan(self.obj.pitch_angle.Value * np.pi / 180)
|
/ np.tan(self.obj.pitch_angle.Value * np.pi / 180)
|
||||||
+ self.obj.height.Value / 2
|
+ self.obj.height.Value / 2
|
||||||
|
|||||||
@@ -38,7 +38,7 @@ class CrownGear(BaseGear):
|
|||||||
super(CrownGear, self).__init__(obj)
|
super(CrownGear, self).__init__(obj)
|
||||||
obj.addProperty(
|
obj.addProperty(
|
||||||
"App::PropertyInteger",
|
"App::PropertyInteger",
|
||||||
"teeth",
|
"num_teeth",
|
||||||
"base",
|
"base",
|
||||||
translate("CrownGear", "number of teeth"),
|
translate("CrownGear", "number of teeth"),
|
||||||
)
|
)
|
||||||
@@ -73,7 +73,7 @@ class CrownGear(BaseGear):
|
|||||||
translate("CrownGear", "pressure angle"),
|
translate("CrownGear", "pressure angle"),
|
||||||
)
|
)
|
||||||
self.add_accuracy_properties(obj)
|
self.add_accuracy_properties(obj)
|
||||||
obj.teeth = 15
|
obj.num_teeth = 15
|
||||||
obj.other_teeth = 15
|
obj.other_teeth = 15
|
||||||
obj.module = "1. mm"
|
obj.module = "1. mm"
|
||||||
obj.pressure_angle = "20. deg"
|
obj.pressure_angle = "20. deg"
|
||||||
@@ -135,7 +135,7 @@ class CrownGear(BaseGear):
|
|||||||
return pts
|
return pts
|
||||||
|
|
||||||
def generate_gear_shape(self, fp):
|
def generate_gear_shape(self, fp):
|
||||||
inner_diameter = fp.module.Value * fp.teeth
|
inner_diameter = fp.module.Value * fp.num_teeth
|
||||||
outer_diameter = inner_diameter + fp.height.Value * 2
|
outer_diameter = inner_diameter + fp.height.Value * 2
|
||||||
inner_circle = part.Wire(part.makeCircle(inner_diameter / 2.0))
|
inner_circle = part.Wire(part.makeCircle(inner_diameter / 2.0))
|
||||||
outer_circle = part.Wire(part.makeCircle(outer_diameter / 2.0))
|
outer_circle = part.Wire(part.makeCircle(outer_diameter / 2.0))
|
||||||
@@ -148,7 +148,7 @@ class CrownGear(BaseGear):
|
|||||||
# cutting obj
|
# cutting obj
|
||||||
alpha_w = np.deg2rad(fp.pressure_angle.Value)
|
alpha_w = np.deg2rad(fp.pressure_angle.Value)
|
||||||
m = fp.module.Value
|
m = fp.module.Value
|
||||||
t = fp.teeth
|
t = fp.num_teeth
|
||||||
t_c = t
|
t_c = t
|
||||||
t_i = fp.other_teeth
|
t_i = fp.other_teeth
|
||||||
rm = inner_diameter / 2
|
rm = inner_diameter / 2
|
||||||
|
|||||||
@@ -41,7 +41,7 @@ class CycloidGear(BaseGear):
|
|||||||
self.cycloid_tooth = CycloidTooth()
|
self.cycloid_tooth = CycloidTooth()
|
||||||
obj.addProperty(
|
obj.addProperty(
|
||||||
"App::PropertyInteger",
|
"App::PropertyInteger",
|
||||||
"teeth",
|
"num_teeth",
|
||||||
"base",
|
"base",
|
||||||
translate("CycloidGear", "number of teeth"),
|
translate("CycloidGear", "number of teeth"),
|
||||||
)
|
)
|
||||||
@@ -76,11 +76,11 @@ class CycloidGear(BaseGear):
|
|||||||
self.add_cycloid_properties(obj)
|
self.add_cycloid_properties(obj)
|
||||||
self.add_computed_properties(obj)
|
self.add_computed_properties(obj)
|
||||||
obj.gear = self.cycloid_tooth
|
obj.gear = self.cycloid_tooth
|
||||||
obj.teeth = 15
|
obj.num_teeth = 15
|
||||||
obj.module = "1. mm"
|
obj.module = "1. mm"
|
||||||
obj.setExpression(
|
obj.setExpression(
|
||||||
"inner_diameter", "teeth / 2"
|
"inner_diameter", "num_teeth / 2"
|
||||||
) # teeth/2 makes the hypocycloid a straight line to the center
|
) # num_teeth/2 makes the hypocycloid a straight line to the center
|
||||||
obj.outer_diameter = 7.5 # we don't know the mating gear, so we just set the default to mesh with our default
|
obj.outer_diameter = 7.5 # we don't know the mating gear, so we just set the default to mesh with our default
|
||||||
obj.beta = "0. deg"
|
obj.beta = "0. deg"
|
||||||
obj.height = "5. mm"
|
obj.height = "5. mm"
|
||||||
@@ -174,7 +174,7 @@ class CycloidGear(BaseGear):
|
|||||||
translate("CycloidGear", "The pitch diameter."),
|
translate("CycloidGear", "The pitch diameter."),
|
||||||
)
|
)
|
||||||
obj.setExpression(
|
obj.setExpression(
|
||||||
"dw", "teeth * module"
|
"dw", "num_teeth * module"
|
||||||
) # calculate via expression to ease usage for placement
|
) # calculate via expression to ease usage for placement
|
||||||
obj.setEditorMode(
|
obj.setEditorMode(
|
||||||
"dw", 1
|
"dw", 1
|
||||||
@@ -197,8 +197,7 @@ class CycloidGear(BaseGear):
|
|||||||
|
|
||||||
def generate_gear_shape(self, fp):
|
def generate_gear_shape(self, fp):
|
||||||
fp.gear.m = fp.module.Value
|
fp.gear.m = fp.module.Value
|
||||||
fp.gear.z = fp.teeth
|
fp.dw = fp.module * fp.num_teeth
|
||||||
fp.dw = fp.module * fp.teeth
|
|
||||||
fp.gear.z1 = fp.inner_diameter
|
fp.gear.z1 = fp.inner_diameter
|
||||||
fp.gear.z2 = fp.outer_diameter
|
fp.gear.z2 = fp.outer_diameter
|
||||||
fp.gear.clearance = fp.clearance
|
fp.gear.clearance = fp.clearance
|
||||||
@@ -232,7 +231,7 @@ class CycloidGear(BaseGear):
|
|||||||
|
|
||||||
tooth = part.Wire(edges)
|
tooth = part.Wire(edges)
|
||||||
|
|
||||||
profile = rotate_tooth(tooth, fp.teeth)
|
profile = rotate_tooth(tooth, fp.num_teeth)
|
||||||
if fp.height.Value == 0:
|
if fp.height.Value == 0:
|
||||||
return profile
|
return profile
|
||||||
base = part.Face(profile)
|
base = part.Face(profile)
|
||||||
|
|||||||
@@ -30,14 +30,13 @@ from .basegear import BaseGear, fcvec, points_to_wire, insert_fillet
|
|||||||
|
|
||||||
|
|
||||||
class CycloidGearRack(BaseGear):
|
class CycloidGearRack(BaseGear):
|
||||||
|
|
||||||
"""FreeCAD gear rack"""
|
"""FreeCAD gear rack"""
|
||||||
|
|
||||||
def __init__(self, obj):
|
def __init__(self, obj):
|
||||||
super(CycloidGearRack, self).__init__(obj)
|
super(CycloidGearRack, self).__init__(obj)
|
||||||
obj.addProperty(
|
obj.addProperty(
|
||||||
"App::PropertyInteger",
|
"App::PropertyInteger",
|
||||||
"teeth",
|
"num_teeth",
|
||||||
"base",
|
"base",
|
||||||
translate("CycloidGearRack", "number of teeth"),
|
translate("CycloidGearRack", "number of teeth"),
|
||||||
)
|
)
|
||||||
@@ -81,7 +80,7 @@ class CycloidGearRack(BaseGear):
|
|||||||
self.add_tolerance_properties(obj)
|
self.add_tolerance_properties(obj)
|
||||||
self.add_cycloid_properties(obj)
|
self.add_cycloid_properties(obj)
|
||||||
self.add_fillet_properties(obj)
|
self.add_fillet_properties(obj)
|
||||||
obj.teeth = 15
|
obj.num_teeth = 15
|
||||||
obj.module = "1. mm"
|
obj.module = "1. mm"
|
||||||
obj.inner_diameter = 7.5
|
obj.inner_diameter = 7.5
|
||||||
obj.outer_diameter = 7.5
|
obj.outer_diameter = 7.5
|
||||||
@@ -124,7 +123,7 @@ class CycloidGearRack(BaseGear):
|
|||||||
"base",
|
"base",
|
||||||
translate(
|
translate(
|
||||||
"CycloidGearRack",
|
"CycloidGearRack",
|
||||||
"if enabled the total length of the rack is teeth x pitch, otherwise the rack starts with a tooth-flank",
|
"if enabled the total length of the rack is num_teeth x pitch, otherwise the rack starts with a tooth-flank",
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -224,7 +223,7 @@ class CycloidGearRack(BaseGear):
|
|||||||
tooth = part.Wire(tooth_edges[1:-1] + edge)
|
tooth = part.Wire(tooth_edges[1:-1] + edge)
|
||||||
teeth = [tooth]
|
teeth = [tooth]
|
||||||
|
|
||||||
for i in range(obj.teeth - 1):
|
for i in range(obj.num_teeth - 1):
|
||||||
tooth = tooth.copy()
|
tooth = tooth.copy()
|
||||||
tooth.translate(app.Vector(0, np.pi * m, 0))
|
tooth.translate(app.Vector(0, np.pi * m, 0))
|
||||||
teeth.append(tooth)
|
teeth.append(tooth)
|
||||||
@@ -234,7 +233,7 @@ class CycloidGearRack(BaseGear):
|
|||||||
if obj.add_endings:
|
if obj.add_endings:
|
||||||
teeth = [part.Wire(tooth_edges[0])] + teeth
|
teeth = [part.Wire(tooth_edges[0])] + teeth
|
||||||
last_edge = tooth_edges[-1]
|
last_edge = tooth_edges[-1]
|
||||||
last_edge.translate(app.Vector(0, np.pi * m * (obj.teeth - 1), 0))
|
last_edge.translate(app.Vector(0, np.pi * m * (obj.num_teeth - 1), 0))
|
||||||
teeth = teeth + [part.Wire(last_edge)]
|
teeth = teeth + [part.Wire(last_edge)]
|
||||||
|
|
||||||
p_start = np.array(teeth[0].Edges[0].firstVertex().Point[:-1])
|
p_start = np.array(teeth[0].Edges[0].firstVertex().Point[:-1])
|
||||||
|
|||||||
@@ -52,7 +52,7 @@ class InternalInvoluteGear(BaseGear):
|
|||||||
)
|
)
|
||||||
obj.addProperty(
|
obj.addProperty(
|
||||||
"App::PropertyInteger",
|
"App::PropertyInteger",
|
||||||
"teeth",
|
"num_teeth",
|
||||||
"base",
|
"base",
|
||||||
translate("InternalInvoluteGear", "number of teeth"),
|
translate("InternalInvoluteGear", "number of teeth"),
|
||||||
)
|
)
|
||||||
@@ -99,7 +99,7 @@ class InternalInvoluteGear(BaseGear):
|
|||||||
|
|
||||||
obj.gear = self.involute_tooth
|
obj.gear = self.involute_tooth
|
||||||
obj.simple = False
|
obj.simple = False
|
||||||
obj.teeth = 15
|
obj.num_teeth = 15
|
||||||
obj.module = "1. mm"
|
obj.module = "1. mm"
|
||||||
obj.shift = 0.0
|
obj.shift = 0.0
|
||||||
obj.pressure_angle = "20. deg"
|
obj.pressure_angle = "20. deg"
|
||||||
@@ -263,7 +263,6 @@ class InternalInvoluteGear(BaseGear):
|
|||||||
def generate_gear_shape(self, fp):
|
def generate_gear_shape(self, fp):
|
||||||
fp.gear.double_helix = fp.double_helix
|
fp.gear.double_helix = fp.double_helix
|
||||||
fp.gear.m_n = fp.module.Value
|
fp.gear.m_n = fp.module.Value
|
||||||
fp.gear.z = fp.teeth
|
|
||||||
fp.gear.undercut = False # no undercut for internal gears
|
fp.gear.undercut = False # no undercut for internal gears
|
||||||
fp.gear.shift = fp.shift
|
fp.gear.shift = fp.shift
|
||||||
fp.gear.pressure_angle = fp.pressure_angle.Value * np.pi / 180.0
|
fp.gear.pressure_angle = fp.pressure_angle.Value * np.pi / 180.0
|
||||||
@@ -327,7 +326,7 @@ class InternalInvoluteGear(BaseGear):
|
|||||||
edges = [e for e in edges if e is not None]
|
edges = [e for e in edges if e is not None]
|
||||||
|
|
||||||
tooth = part.Wire(edges)
|
tooth = part.Wire(edges)
|
||||||
profile = rotate_tooth(tooth, fp.teeth)
|
profile = rotate_tooth(tooth, fp.num_teeth)
|
||||||
if fp.height.Value == 0:
|
if fp.height.Value == 0:
|
||||||
return part.makeCompound([outer_circle, profile])
|
return part.makeCompound([outer_circle, profile])
|
||||||
base = part.Face([outer_circle, profile])
|
base = part.Face([outer_circle, profile])
|
||||||
|
|||||||
@@ -36,7 +36,6 @@ from .basegear import (
|
|||||||
|
|
||||||
|
|
||||||
class InvoluteGear(BaseGear):
|
class InvoluteGear(BaseGear):
|
||||||
|
|
||||||
"""FreeCAD gear"""
|
"""FreeCAD gear"""
|
||||||
|
|
||||||
def __init__(self, obj):
|
def __init__(self, obj):
|
||||||
@@ -60,7 +59,7 @@ class InvoluteGear(BaseGear):
|
|||||||
obj.gear = self.involute_tooth
|
obj.gear = self.involute_tooth
|
||||||
obj.simple = False
|
obj.simple = False
|
||||||
obj.undercut = False
|
obj.undercut = False
|
||||||
obj.teeth = 15
|
obj.num_teeth = 15
|
||||||
obj.module = "1. mm"
|
obj.module = "1. mm"
|
||||||
obj.shift = 0.0
|
obj.shift = 0.0
|
||||||
obj.pressure_angle = "20. deg"
|
obj.pressure_angle = "20. deg"
|
||||||
@@ -82,7 +81,7 @@ class InvoluteGear(BaseGear):
|
|||||||
def add_gear_properties(self, obj):
|
def add_gear_properties(self, obj):
|
||||||
obj.addProperty(
|
obj.addProperty(
|
||||||
"App::PropertyInteger",
|
"App::PropertyInteger",
|
||||||
"teeth",
|
"num_teeth",
|
||||||
"base",
|
"base",
|
||||||
translate("InvoluteGear", "number of teeth"),
|
translate("InvoluteGear", "number of teeth"),
|
||||||
)
|
)
|
||||||
@@ -280,7 +279,6 @@ class InvoluteGear(BaseGear):
|
|||||||
def generate_gear_shape(self, obj):
|
def generate_gear_shape(self, obj):
|
||||||
obj.gear.double_helix = obj.double_helix
|
obj.gear.double_helix = obj.double_helix
|
||||||
obj.gear.m_n = obj.module.Value
|
obj.gear.m_n = obj.module.Value
|
||||||
obj.gear.z = obj.teeth
|
|
||||||
obj.gear.undercut = obj.undercut
|
obj.gear.undercut = obj.undercut
|
||||||
obj.gear.shift = obj.shift
|
obj.gear.shift = obj.shift
|
||||||
obj.gear.pressure_angle = obj.pressure_angle.Value * np.pi / 180.0
|
obj.gear.pressure_angle = obj.pressure_angle.Value * np.pi / 180.0
|
||||||
@@ -337,7 +335,7 @@ class InvoluteGear(BaseGear):
|
|||||||
edges = [e for e in edges if e is not None]
|
edges = [e for e in edges if e is not None]
|
||||||
|
|
||||||
tooth = part.Wire(edges)
|
tooth = part.Wire(edges)
|
||||||
profile = rotate_tooth(tooth, obj.teeth)
|
profile = rotate_tooth(tooth, obj.num_teeth)
|
||||||
|
|
||||||
if obj.height.Value == 0:
|
if obj.height.Value == 0:
|
||||||
return profile
|
return profile
|
||||||
|
|||||||
@@ -27,7 +27,6 @@ from .basegear import BaseGear, fcvec, points_to_wire, insert_fillet
|
|||||||
|
|
||||||
|
|
||||||
class InvoluteGearRack(BaseGear):
|
class InvoluteGearRack(BaseGear):
|
||||||
|
|
||||||
"""FreeCAD gear rack"""
|
"""FreeCAD gear rack"""
|
||||||
|
|
||||||
def __init__(self, obj):
|
def __init__(self, obj):
|
||||||
@@ -35,7 +34,7 @@ class InvoluteGearRack(BaseGear):
|
|||||||
self.involute_rack = InvoluteRack()
|
self.involute_rack = InvoluteRack()
|
||||||
obj.addProperty(
|
obj.addProperty(
|
||||||
"App::PropertyInteger",
|
"App::PropertyInteger",
|
||||||
"teeth",
|
"num_teeth",
|
||||||
"base",
|
"base",
|
||||||
translate("InvoluteGearRack", "number of teeth"),
|
translate("InvoluteGearRack", "number of teeth"),
|
||||||
)
|
)
|
||||||
@@ -79,7 +78,7 @@ class InvoluteGearRack(BaseGear):
|
|||||||
self.add_involute_properties(obj)
|
self.add_involute_properties(obj)
|
||||||
self.add_fillet_properties(obj)
|
self.add_fillet_properties(obj)
|
||||||
obj.rack = self.involute_rack
|
obj.rack = self.involute_rack
|
||||||
obj.teeth = 15
|
obj.num_teeth = 15
|
||||||
obj.module = "1. mm"
|
obj.module = "1. mm"
|
||||||
obj.pressure_angle = "20. deg"
|
obj.pressure_angle = "20. deg"
|
||||||
obj.height = "5. mm"
|
obj.height = "5. mm"
|
||||||
@@ -130,7 +129,7 @@ class InvoluteGearRack(BaseGear):
|
|||||||
"base",
|
"base",
|
||||||
translate(
|
translate(
|
||||||
"InvoluteGearRack",
|
"InvoluteGearRack",
|
||||||
"if enabled the total length of the rack is teeth x pitch, otherwise the rack starts with a tooth-flank",
|
"if enabled the total length of the rack is num_teeth x pitch, otherwise the rack starts with a tooth-flank",
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -180,7 +179,7 @@ class InvoluteGearRack(BaseGear):
|
|||||||
|
|
||||||
def generate_gear_shape(self, obj):
|
def generate_gear_shape(self, obj):
|
||||||
obj.rack.m = obj.module.Value
|
obj.rack.m = obj.module.Value
|
||||||
obj.rack.z = obj.teeth
|
obj.rack.z = obj.num_teeth
|
||||||
obj.rack.pressure_angle = obj.pressure_angle.Value * np.pi / 180.0
|
obj.rack.pressure_angle = obj.pressure_angle.Value * np.pi / 180.0
|
||||||
obj.rack.thickness = obj.thickness.Value
|
obj.rack.thickness = obj.thickness.Value
|
||||||
obj.rack.beta = obj.beta.Value * np.pi / 180.0
|
obj.rack.beta = obj.beta.Value * np.pi / 180.0
|
||||||
@@ -242,7 +241,7 @@ class InvoluteGearRack(BaseGear):
|
|||||||
tooth = part.Wire(tooth_edges[1:-1] + edge)
|
tooth = part.Wire(tooth_edges[1:-1] + edge)
|
||||||
teeth = [tooth]
|
teeth = [tooth]
|
||||||
|
|
||||||
for i in range(obj.teeth - 1):
|
for i in range(obj.num_teeth - 1):
|
||||||
tooth = tooth.copy()
|
tooth = tooth.copy()
|
||||||
tooth.translate(app.Vector(0, np.pi * m, 0))
|
tooth.translate(app.Vector(0, np.pi * m, 0))
|
||||||
teeth.append(tooth)
|
teeth.append(tooth)
|
||||||
@@ -252,7 +251,7 @@ class InvoluteGearRack(BaseGear):
|
|||||||
if obj.add_endings:
|
if obj.add_endings:
|
||||||
teeth = [part.Wire(tooth_edges[0])] + teeth
|
teeth = [part.Wire(tooth_edges[0])] + teeth
|
||||||
last_edge = tooth_edges[-1]
|
last_edge = tooth_edges[-1]
|
||||||
last_edge.translate(app.Vector(0, np.pi * m * (obj.teeth - 1), 0))
|
last_edge.translate(app.Vector(0, np.pi * m * (obj.num_teeth - 1), 0))
|
||||||
teeth = teeth + [part.Wire(last_edge)]
|
teeth = teeth + [part.Wire(last_edge)]
|
||||||
|
|
||||||
p_start = np.array(teeth[0].Edges[0].firstVertex().Point[:-1])
|
p_start = np.array(teeth[0].Edges[0].firstVertex().Point[:-1])
|
||||||
|
|||||||
@@ -34,7 +34,7 @@ class LanternGear(BaseGear):
|
|||||||
super(LanternGear, self).__init__(obj)
|
super(LanternGear, self).__init__(obj)
|
||||||
obj.addProperty(
|
obj.addProperty(
|
||||||
"App::PropertyInteger",
|
"App::PropertyInteger",
|
||||||
"teeth",
|
"num_teeth",
|
||||||
"gear_parameter",
|
"gear_parameter",
|
||||||
translate("LanternGear", "number of teeth"),
|
translate("LanternGear", "number of teeth"),
|
||||||
)
|
)
|
||||||
@@ -69,7 +69,7 @@ class LanternGear(BaseGear):
|
|||||||
translate("LanternGear", "head * module = additional length of head"),
|
translate("LanternGear", "head * module = additional length of head"),
|
||||||
)
|
)
|
||||||
|
|
||||||
obj.teeth = 15
|
obj.num_teeth = 15
|
||||||
obj.module = "1. mm"
|
obj.module = "1. mm"
|
||||||
obj.bolt_radius = "1 mm"
|
obj.bolt_radius = "1 mm"
|
||||||
|
|
||||||
@@ -81,7 +81,7 @@ class LanternGear(BaseGear):
|
|||||||
|
|
||||||
def generate_gear_shape(self, fp):
|
def generate_gear_shape(self, fp):
|
||||||
m = fp.module.Value
|
m = fp.module.Value
|
||||||
teeth = fp.teeth
|
teeth = fp.num_teeth
|
||||||
r_r = fp.bolt_radius.Value
|
r_r = fp.bolt_radius.Value
|
||||||
r_0 = m * teeth / 2
|
r_0 = m * teeth / 2
|
||||||
r_max = r_0 + r_r + fp.head * m
|
r_max = r_0 + r_r + fp.head * m
|
||||||
|
|||||||
@@ -106,7 +106,7 @@ class TimingGear(BaseGear):
|
|||||||
super(TimingGear, self).__init__(obj)
|
super(TimingGear, self).__init__(obj)
|
||||||
obj.addProperty(
|
obj.addProperty(
|
||||||
"App::PropertyInteger",
|
"App::PropertyInteger",
|
||||||
"teeth",
|
"num_teeth",
|
||||||
"base",
|
"base",
|
||||||
translate("TimingGear", "number of teeth"),
|
translate("TimingGear", "number of teeth"),
|
||||||
)
|
)
|
||||||
@@ -174,7 +174,7 @@ class TimingGear(BaseGear):
|
|||||||
translate("TimingGear", "x-offset of second arc-midpoint"),
|
translate("TimingGear", "x-offset of second arc-midpoint"),
|
||||||
1,
|
1,
|
||||||
)
|
)
|
||||||
obj.teeth = 15
|
obj.num_teeth = 15
|
||||||
obj.type = ["gt2", "gt3", "gt5", "gt8", "htd3", "htd5", "htd8"]
|
obj.type = ["gt2", "gt3", "gt5", "gt8", "htd3", "htd5", "htd8"]
|
||||||
obj.height = "5. mm"
|
obj.height = "5. mm"
|
||||||
|
|
||||||
@@ -198,9 +198,9 @@ class TimingGear(BaseGear):
|
|||||||
|
|
||||||
arcs = []
|
arcs = []
|
||||||
if offset == 0.0:
|
if offset == 0.0:
|
||||||
phi5 = np.pi / fp.teeth
|
phi5 = np.pi / fp.num_teeth
|
||||||
ref = reflection(-phi5 - np.pi / 2.0)
|
ref = reflection(-phi5 - np.pi / 2.0)
|
||||||
rp = pitch * fp.teeth / np.pi / 2.0 - u
|
rp = pitch * fp.num_teeth / np.pi / 2.0 - u
|
||||||
|
|
||||||
m_34 = np.array([-(r_12 + r_34), rp - h + r_12])
|
m_34 = np.array([-(r_12 + r_34), rp - h + r_12])
|
||||||
x2 = np.array([-r_12, m_34[1]])
|
x2 = np.array([-r_12, m_34[1]])
|
||||||
@@ -227,7 +227,7 @@ class TimingGear(BaseGear):
|
|||||||
|
|
||||||
else:
|
else:
|
||||||
phi_12 = np.arctan(np.sqrt(1.0 / (((r_12 - r_23) / offset) ** 2 - 1)))
|
phi_12 = np.arctan(np.sqrt(1.0 / (((r_12 - r_23) / offset) ** 2 - 1)))
|
||||||
rp = pitch * fp.teeth / np.pi / 2.0
|
rp = pitch * fp.num_teeth / np.pi / 2.0
|
||||||
r4 = r5 = rp - u
|
r4 = r5 = rp - u
|
||||||
|
|
||||||
m_12 = np.array([0.0, r5 - h + r_12])
|
m_12 = np.array([0.0, r5 - h + r_12])
|
||||||
@@ -282,7 +282,7 @@ class TimingGear(BaseGear):
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
phi5 = np.pi / fp.teeth
|
phi5 = np.pi / fp.num_teeth
|
||||||
|
|
||||||
m_34 = (r5 - r_34) * np.array([-np.sin(phi4), np.cos(phi4)])
|
m_34 = (r5 - r_34) * np.array([-np.sin(phi4), np.cos(phi4)])
|
||||||
|
|
||||||
@@ -312,8 +312,8 @@ class TimingGear(BaseGear):
|
|||||||
wire = part.Wire(arcs)
|
wire = part.Wire(arcs)
|
||||||
wires = [wire]
|
wires = [wire]
|
||||||
rot = app.Matrix()
|
rot = app.Matrix()
|
||||||
rot.rotateZ(np.pi * 2 / fp.teeth)
|
rot.rotateZ(np.pi * 2 / fp.num_teeth)
|
||||||
for _ in range(fp.teeth - 1):
|
for _ in range(fp.num_teeth - 1):
|
||||||
wire = wire.transformGeometry(rot)
|
wire = wire.transformGeometry(rot)
|
||||||
wires.append(wire)
|
wires.append(wire)
|
||||||
|
|
||||||
|
|||||||
@@ -40,7 +40,7 @@ class TimingGearT(BaseGear):
|
|||||||
)
|
)
|
||||||
obj.addProperty(
|
obj.addProperty(
|
||||||
"App::PropertyInteger",
|
"App::PropertyInteger",
|
||||||
"teeth",
|
"num_teeth",
|
||||||
"base",
|
"base",
|
||||||
translate("TimingGearT", "number of teeth"),
|
translate("TimingGearT", "number of teeth"),
|
||||||
)
|
)
|
||||||
@@ -96,7 +96,7 @@ class TimingGearT(BaseGear):
|
|||||||
translate("TimingGearT", "extrusion height"),
|
translate("TimingGearT", "extrusion height"),
|
||||||
)
|
)
|
||||||
obj.pitch = "5. mm"
|
obj.pitch = "5. mm"
|
||||||
obj.teeth = 15
|
obj.num_teeth = 15
|
||||||
obj.tooth_height = "1.2 mm"
|
obj.tooth_height = "1.2 mm"
|
||||||
obj.u = "0.6 mm"
|
obj.u = "0.6 mm"
|
||||||
obj.alpha = "40. deg"
|
obj.alpha = "40. deg"
|
||||||
@@ -109,7 +109,7 @@ class TimingGearT(BaseGear):
|
|||||||
|
|
||||||
def generate_gear_shape(self, obj):
|
def generate_gear_shape(self, obj):
|
||||||
pitch = obj.pitch.Value
|
pitch = obj.pitch.Value
|
||||||
teeth = obj.teeth
|
teeth = obj.num_teeth
|
||||||
u = obj.u.Value
|
u = obj.u.Value
|
||||||
tooth_height = obj.tooth_height.Value
|
tooth_height = obj.tooth_height.Value
|
||||||
alpha = obj.alpha.Value / 180.0 * np.pi # we need radiant
|
alpha = obj.alpha.Value / 180.0 * np.pi # we need radiant
|
||||||
|
|||||||
@@ -29,14 +29,13 @@ from .basegear import BaseGear, helical_extrusion, fcvec
|
|||||||
|
|
||||||
|
|
||||||
class WormGear(BaseGear):
|
class WormGear(BaseGear):
|
||||||
|
|
||||||
"""FreeCAD gear rack"""
|
"""FreeCAD gear rack"""
|
||||||
|
|
||||||
def __init__(self, obj):
|
def __init__(self, obj):
|
||||||
super(WormGear, self).__init__(obj)
|
super(WormGear, self).__init__(obj)
|
||||||
obj.addProperty(
|
obj.addProperty(
|
||||||
"App::PropertyInteger",
|
"App::PropertyInteger",
|
||||||
"teeth",
|
"num_teeth",
|
||||||
"base",
|
"base",
|
||||||
translate("WormGear", "number of teeth"),
|
translate("WormGear", "number of teeth"),
|
||||||
)
|
)
|
||||||
@@ -89,7 +88,7 @@ class WormGear(BaseGear):
|
|||||||
"tolerance",
|
"tolerance",
|
||||||
translate("WormGear", "clearance * module = additional length of root"),
|
translate("WormGear", "clearance * module = additional length of root"),
|
||||||
)
|
)
|
||||||
obj.teeth = 3
|
obj.num_teeth = 3
|
||||||
obj.module = "1. mm"
|
obj.module = "1. mm"
|
||||||
obj.pressure_angle = "20. deg"
|
obj.pressure_angle = "20. deg"
|
||||||
obj.height = "5. mm"
|
obj.height = "5. mm"
|
||||||
@@ -104,7 +103,7 @@ class WormGear(BaseGear):
|
|||||||
def generate_gear_shape(self, fp):
|
def generate_gear_shape(self, fp):
|
||||||
m = fp.module.Value
|
m = fp.module.Value
|
||||||
d = fp.diameter.Value
|
d = fp.diameter.Value
|
||||||
t = fp.teeth
|
t = fp.num_teeth
|
||||||
h = fp.height
|
h = fp.height
|
||||||
|
|
||||||
clearance = fp.clearance
|
clearance = fp.clearance
|
||||||
|
|||||||
Reference in New Issue
Block a user