21
21
import numpy as np
22
22
import FreeCAD
23
23
from pygears import __version__
24
- from .features import InvoluteGear , CycloidGear , InvoluteGearRack , CycloidGearRack
24
+ from .features import InvoluteGear , CycloidGear , InvoluteGearRack , CycloidGearRack , InternalInvoluteGear
25
25
from pygears .computation import compute_shifted_gears
26
26
27
27
class ViewProviderGearConnector (object ):
@@ -50,7 +50,7 @@ def __init__(self, obj, master_gear, slave_gear):
50
50
obj .addProperty ("App::PropertyLink" ,"master_gear" ,"gear" ,"master gear" , 1 )
51
51
obj .addProperty ("App::PropertyLink" ,"slave_gear" ,"gear" ,"slave gear" , 1 )
52
52
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 )
54
54
obj .version = __version__
55
55
obj .master_gear = master_gear
56
56
obj .slave_gear = slave_gear
@@ -59,9 +59,9 @@ def __init__(self, obj, master_gear, slave_gear):
59
59
obj .Proxy = self
60
60
61
61
def onChanged (self , fp , prop ):
62
+ # fp.angle2 = fp.master_gear.Placement.Rotation.Angle
62
63
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 )
65
65
dw_master = fp .master_gear .dw
66
66
dw_slave = fp .slave_gear .dw
67
67
dist = (dw_master + dw_slave ) / 2
@@ -88,10 +88,37 @@ def onChanged(self, fp, prop):
88
88
mat1 .move (fp .master_gear .Placement .Base )
89
89
fp .slave_gear .Placement = mat1
90
90
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
+
91
119
if ((isinstance (fp .master_gear .Proxy , InvoluteGear ) and isinstance (fp .slave_gear .Proxy , InvoluteGearRack ))
92
120
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 )
95
122
dw_master = fp .master_gear .dw .Value
96
123
dw_slave = 0
97
124
dist = - (dw_master + dw_slave ) / 2
@@ -107,8 +134,7 @@ def onChanged(self, fp, prop):
107
134
fp .slave_gear .Placement = mat3
108
135
109
136
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 )
112
138
dw_master = fp .master_gear .dw
113
139
dw_slave = fp .slave_gear .dw
114
140
dist = (dw_master + dw_slave ) / 2
0 commit comments