From 4aa255962955594b1f9b3b40dc2c283454e82db0 Mon Sep 17 00:00:00 2001 From: looooo Date: Sat, 4 Dec 2021 14:07:08 +0100 Subject: [PATCH] connector: add support for cycloid gears --- freecad/gears/connector.py | 22 ++++++++++++++++++++-- freecad/gears/features.py | 6 ++++++ 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/freecad/gears/connector.py b/freecad/gears/connector.py index fc429a3..2d4bf33 100644 --- a/freecad/gears/connector.py +++ b/freecad/gears/connector.py @@ -21,7 +21,7 @@ import copy import numpy as np import FreeCAD from pygears import __version__ -from .features import InvoluteGear +from .features import InvoluteGear, CycloidGear from pygears.computation import compute_shifted_gears class ViewProviderGearConnector(object): @@ -90,7 +90,25 @@ class GearConnector(object): mat1 = rot * mat0 * rot2 * rot3 * rot4 mat1.move(fp.master_gear.Placement.Base) fp.slave_gear.Placement = mat1 - + if isinstance(fp.master_gear.Proxy, CycloidGear) and isinstance(fp.slave_gear.Proxy, CycloidGear): + fp.master_gear.Placement.Rotation.Angle = np.deg2rad(fp.angle2.Value) + angle_master = fp.master_gear.Placement.Rotation.Angle + dw_master = fp.master_gear.dw + dw_slave = fp.slave_gear.dw + dist = (dw_master + dw_slave) / 2 + mat0 = FreeCAD.Matrix() # unity matrix + trans = FreeCAD.Vector(dist) + mat0.move(trans) + rot = FreeCAD.Rotation(FreeCAD.Vector(0,0,1), fp.angle1).toMatrix() + angle2 = dw_master / dw_slave * fp.angle1.Value + angle4 = dw_master / dw_slave * np.rad2deg(angle_master) + rot2 = FreeCAD.Rotation(FreeCAD.Vector(0,0,1), angle2).toMatrix() + angle3 = abs(fp.slave_gear.teeth % 2 - 1) * 180. / fp.slave_gear.teeth + rot3 = FreeCAD.Rotation(FreeCAD.Vector(0,0,1), angle3).toMatrix() + rot4 = FreeCAD.Rotation(FreeCAD.Vector(0,0,1), -angle4).toMatrix() + mat1 = rot * mat0 * rot2 * rot3 * rot4 + mat1.move(fp.master_gear.Placement.Base) + fp.slave_gear.Placement = mat1 def execute(self, fp): self.onChanged(fp, None) diff --git a/freecad/gears/features.py b/freecad/gears/features.py index a20294c..549e144 100644 --- a/freecad/gears/features.py +++ b/freecad/gears/features.py @@ -859,6 +859,7 @@ class CycloidGear(BaseGear): self.add_fillet_properties(obj) self.add_tolerance_properties(obj) self.add_cycloid_properties(obj) + self.add_computed_properties(obj) obj.gear = self.cycloid_tooth obj.teeth = 15 obj.module = '1. mm' @@ -873,6 +874,7 @@ class CycloidGear(BaseGear): obj.head = 0 obj.head_fillet = 0 obj.root_fillet = 0 + obj.dw = obj.module * obj.teeth obj.Proxy = self def add_helical_properties(self, obj): @@ -892,9 +894,13 @@ class CycloidGear(BaseGear): obj.addProperty("App::PropertyFloat", "inner_diameter", "cycloid", "inner_diameter divided by module (hypocycloid)") obj.addProperty("App::PropertyFloat", "outer_diameter", "cycloid", "outer_diameter divided by module (epicycloid)") + def add_computed_properties(self, obj): + obj.addProperty("App::PropertyLength", "dw", "computed", "pitch diameter", 1) + def generate_gear_shape(self, fp): fp.gear.m = fp.module.Value fp.gear.z = fp.teeth + fp.dw = fp.module * fp.teeth fp.gear.z1 = fp.inner_diameter fp.gear.z2 = fp.outer_diameter fp.gear.clearance = fp.clearance