Skip to content

Commit 5909949

Browse files
committed
connector: add support for internal involute gears
1 parent 2ecc0e8 commit 5909949

File tree

1 file changed

+34
-8
lines changed

1 file changed

+34
-8
lines changed

freecad/gears/connector.py

Lines changed: 34 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
import numpy as np
2222
import FreeCAD
2323
from pygears import __version__
24-
from .features import InvoluteGear, CycloidGear, InvoluteGearRack, CycloidGearRack
24+
from .features import InvoluteGear, CycloidGear, InvoluteGearRack, CycloidGearRack, InternalInvoluteGear
2525
from pygears.computation import compute_shifted_gears
2626

2727
class ViewProviderGearConnector(object):
@@ -50,7 +50,7 @@ def __init__(self, obj, master_gear, slave_gear):
5050
obj.addProperty("App::PropertyLink","master_gear","gear","master gear", 1)
5151
obj.addProperty("App::PropertyLink","slave_gear","gear","slave gear", 1)
5252
obj.addProperty("App::PropertyAngle", "angle1", "gear", "angle at which second gear is placed", 0)
53-
obj.addProperty("App::PropertyAngle", "angle2", "gear", "angle at which second gear is placed", 0)
53+
obj.addProperty("App::PropertyAngle", "angle2", "gear", "angle at which second gear is placed", 1)
5454
obj.version = __version__
5555
obj.master_gear = master_gear
5656
obj.slave_gear = slave_gear
@@ -59,9 +59,9 @@ def __init__(self, obj, master_gear, slave_gear):
5959
obj.Proxy = self
6060

6161
def onChanged(self, fp, prop):
62+
# fp.angle2 = fp.master_gear.Placement.Rotation.Angle
6263
if isinstance(fp.master_gear.Proxy, InvoluteGear) and isinstance(fp.slave_gear.Proxy, InvoluteGear):
63-
fp.master_gear.Placement.Rotation.Angle = np.deg2rad(fp.angle2.Value)
64-
angle_master = fp.master_gear.Placement.Rotation.Angle
64+
angle_master = fp.master_gear.Placement.Rotation.Angle * sum(fp.master_gear.Placement.Rotation.Axis)
6565
dw_master = fp.master_gear.dw
6666
dw_slave = fp.slave_gear.dw
6767
dist = (dw_master + dw_slave) / 2
@@ -88,10 +88,37 @@ def onChanged(self, fp, prop):
8888
mat1.move(fp.master_gear.Placement.Base)
8989
fp.slave_gear.Placement = mat1
9090

91+
if isinstance(fp.master_gear.Proxy, InternalInvoluteGear) and isinstance(fp.slave_gear.Proxy, InvoluteGear):
92+
angle_master = fp.master_gear.Placement.Rotation.Angle * sum(fp.master_gear.Placement.Rotation.Axis)
93+
dw_master = fp.master_gear.dw
94+
dw_slave = fp.slave_gear.dw
95+
dist = (dw_master - dw_slave) / 2
96+
if fp.master_gear.shift != 0 or fp.slave_gear.shift != 0:
97+
dist, alpha_w = compute_shifted_gears(
98+
fp.master_gear.module,
99+
np.deg2rad(fp.master_gear.pressure_angle.Value),
100+
fp.master_gear.teeth,
101+
fp.slave_gear.teeth,
102+
fp.master_gear.shift,
103+
fp.slave_gear.shift)
104+
105+
mat0 = FreeCAD.Matrix() # unity matrix
106+
trans = FreeCAD.Vector(dist)
107+
mat0.move(trans)
108+
rot = FreeCAD.Rotation(FreeCAD.Vector(0,0,1), fp.angle1).toMatrix()
109+
angle2 = -dw_master / dw_slave * fp.angle1.Value
110+
angle4 = -dw_master / dw_slave * np.rad2deg(angle_master)
111+
rot2 = FreeCAD.Rotation(FreeCAD.Vector(0,0,1), angle2).toMatrix()
112+
angle3 = abs(fp.slave_gear.teeth % 2 - 1) * 180. / fp.slave_gear.teeth
113+
rot3 = FreeCAD.Rotation(FreeCAD.Vector(0,0,1), angle3).toMatrix()
114+
rot4 = FreeCAD.Rotation(FreeCAD.Vector(0,0,1), -angle4).toMatrix()
115+
mat1 = rot * mat0 * rot2 * rot3 * rot4
116+
mat1.move(fp.master_gear.Placement.Base)
117+
fp.slave_gear.Placement = mat1
118+
91119
if ((isinstance(fp.master_gear.Proxy, InvoluteGear) and isinstance(fp.slave_gear.Proxy, InvoluteGearRack))
92120
or (isinstance(fp.master_gear.Proxy, CycloidGear) and isinstance(fp.slave_gear.Proxy, CycloidGearRack))):
93-
fp.master_gear.Placement.Rotation.Angle = np.deg2rad(fp.angle2.Value)
94-
angle_master = fp.master_gear.Placement.Rotation.Angle
121+
angle_master = fp.master_gear.Placement.Rotation.Angle * sum(fp.master_gear.Placement.Rotation.Axis)
95122
dw_master = fp.master_gear.dw.Value
96123
dw_slave = 0
97124
dist = -(dw_master + dw_slave) / 2
@@ -107,8 +134,7 @@ def onChanged(self, fp, prop):
107134
fp.slave_gear.Placement = mat3
108135

109136
if isinstance(fp.master_gear.Proxy, CycloidGear) and isinstance(fp.slave_gear.Proxy, CycloidGear):
110-
fp.master_gear.Placement.Rotation.Angle = np.deg2rad(fp.angle2.Value)
111-
angle_master = fp.master_gear.Placement.Rotation.Angle
137+
angle_master = fp.master_gear.Placement.Rotation.Angle * sum(fp.master_gear.Placement.Rotation.Axis)
112138
dw_master = fp.master_gear.dw
113139
dw_slave = fp.slave_gear.dw
114140
dist = (dw_master + dw_slave) / 2

0 commit comments

Comments
 (0)