Skip to content

Commit 4aa2559

Browse files
committed
connector: add support for cycloid gears
1 parent 5846ffb commit 4aa2559

File tree

2 files changed

+26
-2
lines changed

2 files changed

+26
-2
lines changed

freecad/gears/connector.py

+20-2
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
24+
from .features import InvoluteGear, CycloidGear
2525
from pygears.computation import compute_shifted_gears
2626

2727
class ViewProviderGearConnector(object):
@@ -90,7 +90,25 @@ def onChanged(self, fp, prop):
9090
mat1 = rot * mat0 * rot2 * rot3 * rot4
9191
mat1.move(fp.master_gear.Placement.Base)
9292
fp.slave_gear.Placement = mat1
93-
93+
if isinstance(fp.master_gear.Proxy, CycloidGear) and isinstance(fp.slave_gear.Proxy, CycloidGear):
94+
fp.master_gear.Placement.Rotation.Angle = np.deg2rad(fp.angle2.Value)
95+
angle_master = fp.master_gear.Placement.Rotation.Angle
96+
dw_master = fp.master_gear.dw
97+
dw_slave = fp.slave_gear.dw
98+
dist = (dw_master + dw_slave) / 2
99+
mat0 = FreeCAD.Matrix() # unity matrix
100+
trans = FreeCAD.Vector(dist)
101+
mat0.move(trans)
102+
rot = FreeCAD.Rotation(FreeCAD.Vector(0,0,1), fp.angle1).toMatrix()
103+
angle2 = dw_master / dw_slave * fp.angle1.Value
104+
angle4 = dw_master / dw_slave * np.rad2deg(angle_master)
105+
rot2 = FreeCAD.Rotation(FreeCAD.Vector(0,0,1), angle2).toMatrix()
106+
angle3 = abs(fp.slave_gear.teeth % 2 - 1) * 180. / fp.slave_gear.teeth
107+
rot3 = FreeCAD.Rotation(FreeCAD.Vector(0,0,1), angle3).toMatrix()
108+
rot4 = FreeCAD.Rotation(FreeCAD.Vector(0,0,1), -angle4).toMatrix()
109+
mat1 = rot * mat0 * rot2 * rot3 * rot4
110+
mat1.move(fp.master_gear.Placement.Base)
111+
fp.slave_gear.Placement = mat1
94112
def execute(self, fp):
95113
self.onChanged(fp, None)
96114

freecad/gears/features.py

+6
Original file line numberDiff line numberDiff line change
@@ -859,6 +859,7 @@ def __init__(self, obj):
859859
self.add_fillet_properties(obj)
860860
self.add_tolerance_properties(obj)
861861
self.add_cycloid_properties(obj)
862+
self.add_computed_properties(obj)
862863
obj.gear = self.cycloid_tooth
863864
obj.teeth = 15
864865
obj.module = '1. mm'
@@ -873,6 +874,7 @@ def __init__(self, obj):
873874
obj.head = 0
874875
obj.head_fillet = 0
875876
obj.root_fillet = 0
877+
obj.dw = obj.module * obj.teeth
876878
obj.Proxy = self
877879

878880
def add_helical_properties(self, obj):
@@ -892,9 +894,13 @@ def add_cycloid_properties(self, obj):
892894
obj.addProperty("App::PropertyFloat", "inner_diameter", "cycloid", "inner_diameter divided by module (hypocycloid)")
893895
obj.addProperty("App::PropertyFloat", "outer_diameter", "cycloid", "outer_diameter divided by module (epicycloid)")
894896

897+
def add_computed_properties(self, obj):
898+
obj.addProperty("App::PropertyLength", "dw", "computed", "pitch diameter", 1)
899+
895900
def generate_gear_shape(self, fp):
896901
fp.gear.m = fp.module.Value
897902
fp.gear.z = fp.teeth
903+
fp.dw = fp.module * fp.teeth
898904
fp.gear.z1 = fp.inner_diameter
899905
fp.gear.z2 = fp.outer_diameter
900906
fp.gear.clearance = fp.clearance

0 commit comments

Comments
 (0)