From 397c10fdf23081342c651319523ba88210c7b238 Mon Sep 17 00:00:00 2001 From: looooo Date: Tue, 4 Feb 2020 10:24:41 +0100 Subject: [PATCH] add property clearence and property_of_tool for involute gears --- freecad/gears/features.py | 22 ++++++++++++++++++++++ pygears/involute_tooth.py | 38 +++++++++++++++++++++++++------------- 2 files changed, 47 insertions(+), 13 deletions(-) diff --git a/freecad/gears/features.py b/freecad/gears/features.py index 3d91466..2771225 100644 --- a/freecad/gears/features.py +++ b/freecad/gears/features.py @@ -103,6 +103,9 @@ class InvoluteGear(object): "App::PropertyBool", "reversed_backlash", "tolerance", "backlash direction") obj.addProperty( "App::PropertyFloat", "head", "gear_parameter", "head_value * modul_value = additional length of head") + obj.addProperty( + "App::PropertyBool", "properties_from_tool", "gear_parameter", "if beta is given and properties_from_tool is enabled, \ + gear parameters are internally recomputed for the rotated gear") obj.addProperty("App::PropertyPythonObject", "gear", "gear_parameter", "test") obj.addProperty("App::PropertyFloat", "dw", @@ -122,6 +125,7 @@ class InvoluteGear(object): obj.double_helix = False obj.backlash = '0.00 mm' obj.reversed_backlash = False + obj.properties_from_tool = True self.obj = obj obj.Proxy = self @@ -137,6 +141,9 @@ class InvoluteGear(object): fp.gear.backlash = fp.backlash.Value * \ (-fp.reversed_backlash + 0.5) * 2. fp.gear.head = fp.head + # checksbackwardcompatibility: + if "properties_from_tool" in fp.PropertiesList: + fp.gear.properties_from_tool = fp.properties_from_tool fp.gear._update() pts = fp.gear.points(num=fp.numpoints) rotated_pts = pts @@ -194,6 +201,11 @@ class InvoluteGearRack(object): "App::PropertyBool", "double_helix", "gear_parameter", "double helix") obj.addProperty( "App::PropertyFloat", "head", "gear_parameter", "head_value * modul_value = additional length of head") + obj.addProperty( + "App::PropertyFloat", "clearence", "gear_parameter", "head_value * modul_value = additional length of foot") + obj.addProperty( + "App::PropertyBool", "properties_from_tool", "gear_parameter", "if beta is given and properties_from_tool is enabled, \ + gear parameters are internally recomputed for the rotated gear") obj.addProperty("App::PropertyPythonObject", "rack", "test", "test") obj.rack = self.involute_rack obj.teeth = 15 @@ -202,6 +214,9 @@ class InvoluteGearRack(object): obj.height = '5. mm' obj.thickness = '5 mm' obj.beta = '0. deg' + obj.clearence = 0.25 + obj.head = 0. + obj.properties_from_tool = True self.obj = obj obj.Proxy = self @@ -212,6 +227,13 @@ class InvoluteGearRack(object): fp.rack.thickness = fp.thickness.Value fp.rack.beta = fp.beta.Value * np.pi / 180. fp.rack.head = fp.head + # checksbackwardcompatibility: + if "clearence" in fp.PropertiesList: + print(fp.clearence) + fp.rack.clearence = fp.clearence + if "properties_from_tool" in fp.PropertiesList: + print(fp.properties_from_tool) + fp.rack.properties_from_tool = fp.properties_from_tool fp.rack._update() pts = fp.rack.points() pol = Wire(makePolygon(list(map(fcvec, pts)))) diff --git a/pygears/involute_tooth.py b/pygears/involute_tooth.py index 56b2d56..c0e02ce 100644 --- a/pygears/involute_tooth.py +++ b/pygears/involute_tooth.py @@ -27,7 +27,7 @@ import numpy as np class InvoluteTooth(): def __init__(self, m=5, z=15, pressure_angle=20 * pi / 180., clearance=0.12, shift=0.5, beta=0., - undercut=False, backlash=0.00, head=0.00): + undercut=False, backlash=0.00, head=0.00, properties_from_tool=False): self.pressure_angle = pressure_angle self.beta = beta self.m_n = m @@ -37,12 +37,17 @@ class InvoluteTooth(): self.clearance = clearance self.backlash = backlash self.head = head # factor, rename!!! + self.properties_from_tool = properties_from_tool self._calc_gear_factors() def _calc_gear_factors(self): - self.pressure_angle_t = arctan( - tan(self.pressure_angle) / cos(self.beta)) - self.m = self.m_n / cos(self.beta) + if self.properties_from_tool: + self.pressure_angle_t = arctan( + tan(self.pressure_angle) / cos(self.beta)) + self.m = self.m_n / cos(self.beta) + else: + self.pressure_angle_t = self.pressure_angle + self.m = self.m_n self.c = self.clearance * self.m_n self.midpoint = [0., 0.] self.d = self.z * self.m @@ -151,34 +156,41 @@ class InvoluteTooth(): def _update(self): self.__init__(m=self.m_n, z=self.z, pressure_angle=self.pressure_angle, clearance=self.clearance, shift=self.shift, - beta=self.beta, undercut=self.undercut, backlash=self.backlash, head=self.head) + beta=self.beta, undercut=self.undercut, backlash=self.backlash, head=self.head, + properties_from_tool=self.properties_from_tool) class InvoluteRack(object): - def __init__(self, m=5, z=15, pressure_angle=20 * pi / 180., thickness=5, beta=0, head=0): + def __init__(self, m=5, z=15, pressure_angle=20 * pi / 180., thickness=5, beta=0, head=0, clearence = 0.25, properties_from_tool=False): self.pressure_angle = pressure_angle self.thickness = thickness self.m = m self.z = z self.beta = beta self.head = head + self.clearence = clearence + self.properties_from_tool = properties_from_tool def _update(self): self.__init__(m=self.m, z=self.z, pressure_angle=self.pressure_angle, - thickness=self.thickness, beta=self.beta, head=self.head) + thickness=self.thickness, beta=self.beta, head=self.head, clearence=self.clearence, + properties_from_tool=self.properties_from_tool) def points(self, num=10): - pressure_angle_t = arctan(tan(self.pressure_angle) / cos(self.beta)) - m = self.m / cos(self.beta) + if self.properties_from_tool: + pressure_angle_t = arctan(tan(self.pressure_angle) / cos(self.beta)) + m = self.m / cos(self.beta) + else: + pressure_angle_t = self.pressure_angle + m = self.m - clearence = 0.25 - a = (2 + self.head + clearence) * m * tan(pressure_angle_t) + a = (2 + self.head + self.clearence) * m * tan(pressure_angle_t) b = (m * pi) / 4 - (1 + self.head) * m * tan(pressure_angle_t) tooth = [ - [-self.m * (1 + clearence), -a - b], + [-self.m * (1 + self.clearence), -a - b], [self.m * (1 + self.head), -b], [self.m * (1 + self.head), b], - [-self.m * (1 + clearence), a + b] + [-self.m * (1 + self.clearence), a + b] ] teeth = [tooth] trans = translation([0., m * pi, 0.])