From d77f5c1ab4e7879f09241f3941373c2514d72786 Mon Sep 17 00:00:00 2001 From: looooo Date: Mon, 6 Dec 2021 21:03:14 +0100 Subject: [PATCH] connector: add support for racks --- freecad/gears/connector.py | 27 ++++++++++++++++++++++----- 1 file changed, 22 insertions(+), 5 deletions(-) diff --git a/freecad/gears/connector.py b/freecad/gears/connector.py index 2d4bf33..f16d1bc 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 +from .features import InvoluteGear, CycloidGear, InvoluteGearRack, CycloidGearRack from pygears.computation import compute_shifted_gears class ViewProviderGearConnector(object): @@ -37,9 +37,6 @@ class ViewProviderGearConnector(object): def getIcon(self): return self.icon_fn - def claimChildren(self): - return [self.vobj.Object.master_gear, self.vobj.Object.slave_gear] - def __getstate__(self): return {"icon_fn": self.icon_fn} @@ -90,6 +87,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, 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 + dw_master = fp.master_gear.dw.Value + dw_slave = 0 + dist = -(dw_master + dw_slave) / 2 + mat0 = FreeCAD.Matrix() # unity matrix + mat0.move(FreeCAD.Vector(dist, 0, 0)) + mat1 = FreeCAD.Matrix() + mat1.move(FreeCAD.Vector(0, np.deg2rad(fp.angle1.Value) * dw_master / 2, 0)) + mat2 = FreeCAD.Matrix() + mat2.move(FreeCAD.Vector(0, -np.deg2rad(fp.angle2.Value) * dw_master / 2, 0)) + rot = FreeCAD.Rotation(FreeCAD.Vector(0,0,1), fp.angle1).toMatrix() + mat3 = rot * mat2 *mat1 * mat0 + mat3.move(fp.master_gear.Placement.Base) + 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 @@ -97,7 +113,7 @@ class GearConnector(object): dw_slave = fp.slave_gear.dw dist = (dw_master + dw_slave) / 2 mat0 = FreeCAD.Matrix() # unity matrix - trans = FreeCAD.Vector(dist) + trans = FreeCAD.Vector(dist, 0, 0) mat0.move(trans) rot = FreeCAD.Rotation(FreeCAD.Vector(0,0,1), fp.angle1).toMatrix() angle2 = dw_master / dw_slave * fp.angle1.Value @@ -109,6 +125,7 @@ class GearConnector(object): 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)