21
21
import numpy as np
22
22
import FreeCAD
23
23
from pygears import __version__
24
- from .features import InvoluteGear , CycloidGear
24
+ from .features import InvoluteGear , CycloidGear , InvoluteGearRack , CycloidGearRack
25
25
from pygears .computation import compute_shifted_gears
26
26
27
27
class ViewProviderGearConnector (object ):
@@ -37,9 +37,6 @@ def attach(self, vobj):
37
37
def getIcon (self ):
38
38
return self .icon_fn
39
39
40
- def claimChildren (self ):
41
- return [self .vobj .Object .master_gear , self .vobj .Object .slave_gear ]
42
-
43
40
def __getstate__ (self ):
44
41
return {"icon_fn" : self .icon_fn }
45
42
@@ -90,14 +87,33 @@ def onChanged(self, fp, prop):
90
87
mat1 = rot * mat0 * rot2 * rot3 * rot4
91
88
mat1 .move (fp .master_gear .Placement .Base )
92
89
fp .slave_gear .Placement = mat1
90
+
91
+ if ((isinstance (fp .master_gear .Proxy , InvoluteGear ) and isinstance (fp .slave_gear .Proxy , InvoluteGearRack ))
92
+ 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
95
+ dw_master = fp .master_gear .dw .Value
96
+ dw_slave = 0
97
+ dist = - (dw_master + dw_slave ) / 2
98
+ mat0 = FreeCAD .Matrix () # unity matrix
99
+ mat0 .move (FreeCAD .Vector (dist , 0 , 0 ))
100
+ mat1 = FreeCAD .Matrix ()
101
+ mat1 .move (FreeCAD .Vector (0 , np .deg2rad (fp .angle1 .Value ) * dw_master / 2 , 0 ))
102
+ mat2 = FreeCAD .Matrix ()
103
+ mat2 .move (FreeCAD .Vector (0 , - np .deg2rad (fp .angle2 .Value ) * dw_master / 2 , 0 ))
104
+ rot = FreeCAD .Rotation (FreeCAD .Vector (0 ,0 ,1 ), fp .angle1 ).toMatrix ()
105
+ mat3 = rot * mat2 * mat1 * mat0
106
+ mat3 .move (fp .master_gear .Placement .Base )
107
+ fp .slave_gear .Placement = mat3
108
+
93
109
if isinstance (fp .master_gear .Proxy , CycloidGear ) and isinstance (fp .slave_gear .Proxy , CycloidGear ):
94
110
fp .master_gear .Placement .Rotation .Angle = np .deg2rad (fp .angle2 .Value )
95
111
angle_master = fp .master_gear .Placement .Rotation .Angle
96
112
dw_master = fp .master_gear .dw
97
113
dw_slave = fp .slave_gear .dw
98
114
dist = (dw_master + dw_slave ) / 2
99
115
mat0 = FreeCAD .Matrix () # unity matrix
100
- trans = FreeCAD .Vector (dist )
116
+ trans = FreeCAD .Vector (dist , 0 , 0 )
101
117
mat0 .move (trans )
102
118
rot = FreeCAD .Rotation (FreeCAD .Vector (0 ,0 ,1 ), fp .angle1 ).toMatrix ()
103
119
angle2 = dw_master / dw_slave * fp .angle1 .Value
@@ -109,6 +125,7 @@ def onChanged(self, fp, prop):
109
125
mat1 = rot * mat0 * rot2 * rot3 * rot4
110
126
mat1 .move (fp .master_gear .Placement .Base )
111
127
fp .slave_gear .Placement = mat1
128
+
112
129
def execute (self , fp ):
113
130
self .onChanged (fp , None )
114
131
0 commit comments