diff --git a/freecad/gears/commands.py b/freecad/gears/commands.py index 20777a6..0331ca1 100644 --- a/freecad/gears/commands.py +++ b/freecad/gears/commands.py @@ -20,7 +20,7 @@ import os import FreeCAD import FreeCADGui as Gui from .features import ViewProviderGear, InvoluteGear, InternalInvoluteGear, InvoluteGearRack, CycloidGearRack -from .features import CycloidGear, BevelGear, CrownGear, WormGear, TimingGear, LanternGear, HypoCycloidGear +from .features import CycloidGear, BevelGear, CrownGear, WormGear, TimingGear, LanternGear, HypoCycloidGear, BaseGear from .connector import GearConnector, ViewProviderGearConnector @@ -167,10 +167,17 @@ class CreateGearConnector(BaseCommand): ToolTip = 'Combine two gears' def Activated(self): - obj = FreeCAD.ActiveDocument.addObject("Part::FeaturePython", self.NAME) gear1 = Gui.Selection.getSelection()[0] + assert isinstance(gear1.Proxy, BaseGear) + gear2 = Gui.Selection.getSelection()[1] + assert isinstance(gear2.Proxy, BaseGear) + # check if selected objects are beams + + obj = FreeCAD.ActiveDocument.addObject("Part::FeaturePython", self.NAME) GearConnector(obj, gear1, gear2) ViewProviderGearConnector(obj.ViewObject) + + FreeCAD.ActiveDocument.recompute() return obj diff --git a/freecad/gears/connector.py b/freecad/gears/connector.py index 49842e1..bc911ed 100644 --- a/freecad/gears/connector.py +++ b/freecad/gears/connector.py @@ -16,8 +16,12 @@ # * * # *************************************************************************** -from pygears import __version__ import os +import copy +import numpy as np +import FreeCAD +from pygears import __version__ +from .features import InvoluteGear class ViewProviderGearConnector(object): def __init__(self, vobj, icon_fn=None): @@ -33,7 +37,7 @@ class ViewProviderGearConnector(object): return self.icon_fn def claimChildren(self): - return [self.vobj.Object.master_gear, self.vobj.Object.slave_gear] + return [self.vobj.Object.master_gear, self.vobj.Object.slave_gear] def __getstate__(self): return {"icon_fn": self.icon_fn} @@ -47,9 +51,37 @@ class GearConnector(object): obj.addProperty("App::PropertyString", "version", "version", "freecad.gears-version", 1) 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.version = __version__ obj.master_gear = master_gear obj.slave_gear = slave_gear + obj.angle1 = 0 + obj.angle2 = 0 + obj.Proxy = self + + def onChanged(self, fp, prop): + print(fp.master_gear.Proxy) + 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 + dw_master = fp.master_gear.dw + dw_slave = fp.slave_gear.dw + mat0 = FreeCAD.Matrix() # unity matrix + trans = FreeCAD.Vector(dw_master + dw_slave) / 2 + 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): - pass \ No newline at end of file