|
21 | 21 | import numpy as np
|
22 | 22 | import FreeCAD
|
23 | 23 | from pygears import __version__
|
24 |
| -from .features import InvoluteGear |
| 24 | +from .features import InvoluteGear, CycloidGear |
25 | 25 | from pygears.computation import compute_shifted_gears
|
26 | 26 |
|
27 | 27 | class ViewProviderGearConnector(object):
|
@@ -90,7 +90,25 @@ def onChanged(self, fp, prop):
|
90 | 90 | mat1 = rot * mat0 * rot2 * rot3 * rot4
|
91 | 91 | mat1.move(fp.master_gear.Placement.Base)
|
92 | 92 | 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 |
94 | 112 | def execute(self, fp):
|
95 | 113 | self.onChanged(fp, None)
|
96 | 114 |
|
|
0 commit comments