connector: add support for internal involute gears
This commit is contained in:
@@ -21,7 +21,7 @@ import copy
|
||||
import numpy as np
|
||||
import FreeCAD
|
||||
from pygears import __version__
|
||||
from .features import InvoluteGear, CycloidGear, InvoluteGearRack, CycloidGearRack
|
||||
from .features import InvoluteGear, CycloidGear, InvoluteGearRack, CycloidGearRack, InternalInvoluteGear
|
||||
from pygears.computation import compute_shifted_gears
|
||||
|
||||
class ViewProviderGearConnector(object):
|
||||
@@ -50,7 +50,7 @@ class GearConnector(object):
|
||||
obj.addProperty("App::PropertyLink","master_gear","gear","master gear", 1)
|
||||
obj.addProperty("App::PropertyLink","slave_gear","gear","slave gear", 1)
|
||||
obj.addProperty("App::PropertyAngle", "angle1", "gear", "angle at which second gear is placed", 0)
|
||||
obj.addProperty("App::PropertyAngle", "angle2", "gear", "angle at which second gear is placed", 0)
|
||||
obj.addProperty("App::PropertyAngle", "angle2", "gear", "angle at which second gear is placed", 1)
|
||||
obj.version = __version__
|
||||
obj.master_gear = master_gear
|
||||
obj.slave_gear = slave_gear
|
||||
@@ -59,9 +59,9 @@ class GearConnector(object):
|
||||
obj.Proxy = self
|
||||
|
||||
def onChanged(self, fp, prop):
|
||||
# fp.angle2 = fp.master_gear.Placement.Rotation.Angle
|
||||
if isinstance(fp.master_gear.Proxy, InvoluteGear) and isinstance(fp.slave_gear.Proxy, InvoluteGear):
|
||||
fp.master_gear.Placement.Rotation.Angle = np.deg2rad(fp.angle2.Value)
|
||||
angle_master = fp.master_gear.Placement.Rotation.Angle
|
||||
angle_master = fp.master_gear.Placement.Rotation.Angle * sum(fp.master_gear.Placement.Rotation.Axis)
|
||||
dw_master = fp.master_gear.dw
|
||||
dw_slave = fp.slave_gear.dw
|
||||
dist = (dw_master + dw_slave) / 2
|
||||
@@ -88,10 +88,37 @@ class GearConnector(object):
|
||||
mat1.move(fp.master_gear.Placement.Base)
|
||||
fp.slave_gear.Placement = mat1
|
||||
|
||||
if isinstance(fp.master_gear.Proxy, InternalInvoluteGear) and isinstance(fp.slave_gear.Proxy, InvoluteGear):
|
||||
angle_master = fp.master_gear.Placement.Rotation.Angle * sum(fp.master_gear.Placement.Rotation.Axis)
|
||||
dw_master = fp.master_gear.dw
|
||||
dw_slave = fp.slave_gear.dw
|
||||
dist = (dw_master - dw_slave) / 2
|
||||
if fp.master_gear.shift != 0 or fp.slave_gear.shift != 0:
|
||||
dist, alpha_w = compute_shifted_gears(
|
||||
fp.master_gear.module,
|
||||
np.deg2rad(fp.master_gear.pressure_angle.Value),
|
||||
fp.master_gear.teeth,
|
||||
fp.slave_gear.teeth,
|
||||
fp.master_gear.shift,
|
||||
fp.slave_gear.shift)
|
||||
|
||||
mat0 = FreeCAD.Matrix() # unity matrix
|
||||
trans = FreeCAD.Vector(dist)
|
||||
mat0.move(trans)
|
||||
rot = FreeCAD.Rotation(FreeCAD.Vector(0,0,1), fp.angle1).toMatrix()
|
||||
angle2 = -dw_master / dw_slave * fp.angle1.Value
|
||||
angle4 = -dw_master / dw_slave * np.rad2deg(angle_master)
|
||||
rot2 = FreeCAD.Rotation(FreeCAD.Vector(0,0,1), angle2).toMatrix()
|
||||
angle3 = abs(fp.slave_gear.teeth % 2 - 1) * 180. / fp.slave_gear.teeth
|
||||
rot3 = FreeCAD.Rotation(FreeCAD.Vector(0,0,1), angle3).toMatrix()
|
||||
rot4 = FreeCAD.Rotation(FreeCAD.Vector(0,0,1), -angle4).toMatrix()
|
||||
mat1 = rot * mat0 * rot2 * rot3 * rot4
|
||||
mat1.move(fp.master_gear.Placement.Base)
|
||||
fp.slave_gear.Placement = mat1
|
||||
|
||||
if ((isinstance(fp.master_gear.Proxy, InvoluteGear) and isinstance(fp.slave_gear.Proxy, InvoluteGearRack))
|
||||
or (isinstance(fp.master_gear.Proxy, CycloidGear) and isinstance(fp.slave_gear.Proxy, CycloidGearRack))):
|
||||
fp.master_gear.Placement.Rotation.Angle = np.deg2rad(fp.angle2.Value)
|
||||
angle_master = fp.master_gear.Placement.Rotation.Angle
|
||||
angle_master = fp.master_gear.Placement.Rotation.Angle * sum(fp.master_gear.Placement.Rotation.Axis)
|
||||
dw_master = fp.master_gear.dw.Value
|
||||
dw_slave = 0
|
||||
dist = -(dw_master + dw_slave) / 2
|
||||
@@ -107,8 +134,7 @@ class GearConnector(object):
|
||||
fp.slave_gear.Placement = mat3
|
||||
|
||||
if isinstance(fp.master_gear.Proxy, CycloidGear) and isinstance(fp.slave_gear.Proxy, CycloidGear):
|
||||
fp.master_gear.Placement.Rotation.Angle = np.deg2rad(fp.angle2.Value)
|
||||
angle_master = fp.master_gear.Placement.Rotation.Angle
|
||||
angle_master = fp.master_gear.Placement.Rotation.Angle * sum(fp.master_gear.Placement.Rotation.Axis)
|
||||
dw_master = fp.master_gear.dw
|
||||
dw_slave = fp.slave_gear.dw
|
||||
dist = (dw_master + dw_slave) / 2
|
||||
|
||||
Reference in New Issue
Block a user