Skip to content

Commit 05abf30

Browse files
committed
first prototyp for gear connector
1 parent 10d4bf0 commit 05abf30

File tree

2 files changed

+45
-6
lines changed

2 files changed

+45
-6
lines changed

freecad/gears/commands.py

+9-2
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
import FreeCAD
2121
import FreeCADGui as Gui
2222
from .features import ViewProviderGear, InvoluteGear, InternalInvoluteGear, InvoluteGearRack, CycloidGearRack
23-
from .features import CycloidGear, BevelGear, CrownGear, WormGear, TimingGear, LanternGear, HypoCycloidGear
23+
from .features import CycloidGear, BevelGear, CrownGear, WormGear, TimingGear, LanternGear, HypoCycloidGear, BaseGear
2424
from .connector import GearConnector, ViewProviderGearConnector
2525

2626

@@ -167,10 +167,17 @@ class CreateGearConnector(BaseCommand):
167167
ToolTip = 'Combine two gears'
168168

169169
def Activated(self):
170-
obj = FreeCAD.ActiveDocument.addObject("Part::FeaturePython", self.NAME)
171170
gear1 = Gui.Selection.getSelection()[0]
171+
assert isinstance(gear1.Proxy, BaseGear)
172+
172173
gear2 = Gui.Selection.getSelection()[1]
174+
assert isinstance(gear2.Proxy, BaseGear)
175+
173176
# check if selected objects are beams
177+
178+
obj = FreeCAD.ActiveDocument.addObject("Part::FeaturePython", self.NAME)
174179
GearConnector(obj, gear1, gear2)
175180
ViewProviderGearConnector(obj.ViewObject)
181+
182+
FreeCAD.ActiveDocument.recompute()
176183
return obj

freecad/gears/connector.py

+36-4
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,12 @@
1616
# * *
1717
# ***************************************************************************
1818

19-
from pygears import __version__
2019
import os
20+
import copy
21+
import numpy as np
22+
import FreeCAD
23+
from pygears import __version__
24+
from .features import InvoluteGear
2125

2226
class ViewProviderGearConnector(object):
2327
def __init__(self, vobj, icon_fn=None):
@@ -33,7 +37,7 @@ def getIcon(self):
3337
return self.icon_fn
3438

3539
def claimChildren(self):
36-
return [self.vobj.Object.master_gear, self.vobj.Object.slave_gear]
40+
return [self.vobj.Object.master_gear, self.vobj.Object.slave_gear]
3741

3842
def __getstate__(self):
3943
return {"icon_fn": self.icon_fn}
@@ -47,9 +51,37 @@ def __init__(self, obj, master_gear, slave_gear):
4751
obj.addProperty("App::PropertyString", "version", "version", "freecad.gears-version", 1)
4852
obj.addProperty("App::PropertyLink","master_gear","gear","master gear", 1)
4953
obj.addProperty("App::PropertyLink","slave_gear","gear","slave gear", 1)
54+
obj.addProperty("App::PropertyAngle", "angle1", "gear", "angle at which second gear is placed", 0)
55+
obj.addProperty("App::PropertyAngle", "angle2", "gear", "angle at which second gear is placed", 0)
5056
obj.version = __version__
5157
obj.master_gear = master_gear
5258
obj.slave_gear = slave_gear
59+
obj.angle1 = 0
60+
obj.angle2 = 0
61+
obj.Proxy = self
62+
63+
def onChanged(self, fp, prop):
64+
print(fp.master_gear.Proxy)
65+
if isinstance(fp.master_gear.Proxy, InvoluteGear) and isinstance(fp.slave_gear.Proxy, InvoluteGear):
66+
fp.master_gear.Placement.Rotation.Angle = np.deg2rad(fp.angle2.Value)
67+
angle_master = fp.master_gear.Placement.Rotation.Angle
68+
dw_master = fp.master_gear.dw
69+
dw_slave = fp.slave_gear.dw
70+
mat0 = FreeCAD.Matrix() # unity matrix
71+
trans = FreeCAD.Vector(dw_master + dw_slave) / 2
72+
mat0.move(trans)
73+
rot = FreeCAD.Rotation(FreeCAD.Vector(0,0,1), fp.angle1).toMatrix()
74+
angle2 = dw_master / dw_slave * fp.angle1.Value
75+
angle4 = dw_master / dw_slave * np.rad2deg(angle_master)
76+
rot2 = FreeCAD.Rotation(FreeCAD.Vector(0,0,1), angle2).toMatrix()
77+
angle3 = abs(fp.slave_gear.teeth % 2 - 1) * 180. / fp.slave_gear.teeth
78+
rot3 = FreeCAD.Rotation(FreeCAD.Vector(0,0,1), angle3).toMatrix()
79+
rot4 = FreeCAD.Rotation(FreeCAD.Vector(0,0,1), -angle4).toMatrix()
80+
mat1 = rot * mat0 * rot2 * rot3 * rot4
81+
mat1.move(fp.master_gear.Placement.Base)
82+
fp.slave_gear.Placement = mat1
83+
84+
85+
86+
5387

54-
def execute(self, fp):
55-
pass

0 commit comments

Comments
 (0)