first prototyp for gear connector
This commit is contained in:
@@ -20,7 +20,7 @@ import os
|
||||
import FreeCAD
|
||||
import FreeCADGui as Gui
|
||||
from .features import ViewProviderGear, InvoluteGear, InternalInvoluteGear, InvoluteGearRack, CycloidGearRack
|
||||
from .features import CycloidGear, BevelGear, CrownGear, WormGear, TimingGear, LanternGear, HypoCycloidGear
|
||||
from .features import CycloidGear, BevelGear, CrownGear, WormGear, TimingGear, LanternGear, HypoCycloidGear, BaseGear
|
||||
from .connector import GearConnector, ViewProviderGearConnector
|
||||
|
||||
|
||||
@@ -167,10 +167,17 @@ class CreateGearConnector(BaseCommand):
|
||||
ToolTip = 'Combine two gears'
|
||||
|
||||
def Activated(self):
|
||||
obj = FreeCAD.ActiveDocument.addObject("Part::FeaturePython", self.NAME)
|
||||
gear1 = Gui.Selection.getSelection()[0]
|
||||
assert isinstance(gear1.Proxy, BaseGear)
|
||||
|
||||
gear2 = Gui.Selection.getSelection()[1]
|
||||
assert isinstance(gear2.Proxy, BaseGear)
|
||||
|
||||
# check if selected objects are beams
|
||||
|
||||
obj = FreeCAD.ActiveDocument.addObject("Part::FeaturePython", self.NAME)
|
||||
GearConnector(obj, gear1, gear2)
|
||||
ViewProviderGearConnector(obj.ViewObject)
|
||||
|
||||
FreeCAD.ActiveDocument.recompute()
|
||||
return obj
|
||||
|
||||
@@ -16,8 +16,12 @@
|
||||
# * *
|
||||
# ***************************************************************************
|
||||
|
||||
from pygears import __version__
|
||||
import os
|
||||
import copy
|
||||
import numpy as np
|
||||
import FreeCAD
|
||||
from pygears import __version__
|
||||
from .features import InvoluteGear
|
||||
|
||||
class ViewProviderGearConnector(object):
|
||||
def __init__(self, vobj, icon_fn=None):
|
||||
@@ -33,7 +37,7 @@ class ViewProviderGearConnector(object):
|
||||
return self.icon_fn
|
||||
|
||||
def claimChildren(self):
|
||||
return [self.vobj.Object.master_gear, self.vobj.Object.slave_gear]
|
||||
return [self.vobj.Object.master_gear, self.vobj.Object.slave_gear]
|
||||
|
||||
def __getstate__(self):
|
||||
return {"icon_fn": self.icon_fn}
|
||||
@@ -47,9 +51,37 @@ class GearConnector(object):
|
||||
obj.addProperty("App::PropertyString", "version", "version", "freecad.gears-version", 1)
|
||||
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.version = __version__
|
||||
obj.master_gear = master_gear
|
||||
obj.slave_gear = slave_gear
|
||||
obj.angle1 = 0
|
||||
obj.angle2 = 0
|
||||
obj.Proxy = self
|
||||
|
||||
def onChanged(self, fp, prop):
|
||||
print(fp.master_gear.Proxy)
|
||||
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
|
||||
dw_master = fp.master_gear.dw
|
||||
dw_slave = fp.slave_gear.dw
|
||||
mat0 = FreeCAD.Matrix() # unity matrix
|
||||
trans = FreeCAD.Vector(dw_master + dw_slave) / 2
|
||||
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
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
def execute(self, fp):
|
||||
pass
|
||||
Reference in New Issue
Block a user