first prototyp for gear connector

This commit is contained in:
looooo
2021-12-02 15:09:21 +01:00
parent 10d4bf0bbf
commit 05abf3054d
2 changed files with 45 additions and 6 deletions

View File

@@ -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

View File

@@ -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