From 590994984f8bc78a7d5ce14615e9fb1c18cb8a47 Mon Sep 17 00:00:00 2001 From: looooo Date: Thu, 16 Dec 2021 13:20:11 +0100 Subject: [PATCH] connector: add support for internal involute gears --- freecad/gears/connector.py | 42 ++++++++++++++++++++++++++++++-------- 1 file changed, 34 insertions(+), 8 deletions(-) diff --git a/freecad/gears/connector.py b/freecad/gears/connector.py index f16d1bc..5633db4 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, CycloidGear, InvoluteGearRack, CycloidGearRack +from .features import InvoluteGear, CycloidGear, InvoluteGearRack, CycloidGearRack, InternalInvoluteGear from pygears.computation import compute_shifted_gears class ViewProviderGearConnector(object): @@ -50,7 +50,7 @@ class GearConnector(object): obj.addProperty("App::PropertyLink","master_gear","gear","master gear", 1) obj.addProperty("App::PropertyLink","slave_gear","gear","slave gear", 1) obj.addProperty("App::PropertyAngle", "angle1", "gear", "angle at which second gear is placed", 0) - obj.addProperty("App::PropertyAngle", "angle2", "gear", "angle at which second gear is placed", 0) + obj.addProperty("App::PropertyAngle", "angle2", "gear", "angle at which second gear is placed", 1) obj.version = __version__ obj.master_gear = master_gear obj.slave_gear = slave_gear @@ -59,9 +59,9 @@ class GearConnector(object): obj.Proxy = self def onChanged(self, fp, prop): + # fp.angle2 = fp.master_gear.Placement.Rotation.Angle if isinstance(fp.master_gear.Proxy, InvoluteGear) and isinstance(fp.slave_gear.Proxy, InvoluteGear): - fp.master_gear.Placement.Rotation.Angle = np.deg2rad(fp.angle2.Value) - angle_master = fp.master_gear.Placement.Rotation.Angle + angle_master = fp.master_gear.Placement.Rotation.Angle * sum(fp.master_gear.Placement.Rotation.Axis) dw_master = fp.master_gear.dw dw_slave = fp.slave_gear.dw dist = (dw_master + dw_slave) / 2 @@ -88,10 +88,37 @@ class GearConnector(object): mat1.move(fp.master_gear.Placement.Base) fp.slave_gear.Placement = mat1 + if isinstance(fp.master_gear.Proxy, InternalInvoluteGear) and isinstance(fp.slave_gear.Proxy, InvoluteGear): + angle_master = fp.master_gear.Placement.Rotation.Angle * sum(fp.master_gear.Placement.Rotation.Axis) + dw_master = fp.master_gear.dw + dw_slave = fp.slave_gear.dw + dist = (dw_master - dw_slave) / 2 + if fp.master_gear.shift != 0 or fp.slave_gear.shift != 0: + dist, alpha_w = compute_shifted_gears( + fp.master_gear.module, + np.deg2rad(fp.master_gear.pressure_angle.Value), + fp.master_gear.teeth, + fp.slave_gear.teeth, + fp.master_gear.shift, + fp.slave_gear.shift) + + 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 + if ((isinstance(fp.master_gear.Proxy, InvoluteGear) and isinstance(fp.slave_gear.Proxy, InvoluteGearRack)) or (isinstance(fp.master_gear.Proxy, CycloidGear) and isinstance(fp.slave_gear.Proxy, CycloidGearRack))): - fp.master_gear.Placement.Rotation.Angle = np.deg2rad(fp.angle2.Value) - angle_master = fp.master_gear.Placement.Rotation.Angle + angle_master = fp.master_gear.Placement.Rotation.Angle * sum(fp.master_gear.Placement.Rotation.Axis) dw_master = fp.master_gear.dw.Value dw_slave = 0 dist = -(dw_master + dw_slave) / 2 @@ -107,8 +134,7 @@ class GearConnector(object): fp.slave_gear.Placement = mat3 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 + angle_master = fp.master_gear.Placement.Rotation.Angle * sum(fp.master_gear.Placement.Rotation.Axis) dw_master = fp.master_gear.dw dw_slave = fp.slave_gear.dw dist = (dw_master + dw_slave) / 2