Macro Geneva Wheel GUI: Difference between revisions
(Creation of Page) |
(Fixed small text error and added graphic image) |
||
Line 1: | Line 1: | ||
{{Macro|Icon=Text-x-python|Name=MacroGeneva_Wheel_GUI|Description=A GUI front end that allows the user to create a Geneva wheel mechanism from scratch. Based on drei's Geneva Wheel Macro|Author=quick61}} |
{{Macro|Icon=Text-x-python|Name=MacroGeneva_Wheel_GUI|Description=A GUI front end that allows the user to create a Geneva wheel mechanism from scratch. Based on drei's Geneva Wheel Macro|Author=quick61}} |
||
<syntaxhighlight> |
<syntaxhighlight> |
||
#Creation of a Geneva Wheel with Parametric values By: Isaac Ayala (drei) & Mark (quick61) |
#Creation of a Geneva Wheel with Parametric values By: Isaac Ayala (drei) & Mark Stephen (quick61) |
||
#This Macro creates the main parts of a Geneva Wheel Mechanism |
#This Macro creates the main parts of a Geneva Wheel Mechanism |
||
Line 12: | Line 12: | ||
#b = Geneva Wheel Radius |
#b = Geneva Wheel Radius |
||
#n = Driven Slot Quantity |
#n = Driven Slot Quantity |
||
#p = Drive Pin |
#p = Drive Pin Radius |
||
#t = Geneva Wheel Tolerance |
#t = Geneva Wheel Tolerance |
||
#h = Geneva Wheel Height |
#h = Geneva Wheel Height |
||
Line 36: | Line 36: | ||
from FreeCAD import Base |
from FreeCAD import Base |
||
from PySide import QtGui, QtCore |
from PySide import QtGui, QtCore |
||
from PySide.QtGui import QApplication, QDialog, QMainWindow |
|||
import Part |
import Part |
||
import Draft |
import Draft |
||
Line 41: | Line 42: | ||
def Ggear(self): |
|||
try: |
|||
#Inputs |
|||
a = float(self.dCr.text()) |
|||
b = float(self.gWr.text()) |
|||
n = int(self.dSq.text()) |
|||
p = float(self.dPd.text()) |
|||
t = float(self.gWt.text()) |
|||
h = float(self.gWh.text()) |
|||
#Outputs |
|||
c = math.sqrt(pow(a,2) + pow(b,2)) |
|||
s = a + b - c |
|||
w = p + t |
|||
y = a - (1.5 * p) |
|||
z = y - t |
|||
v = (b * z)/a |
|||
# Create the Drive Crank (Will be placed on the origin) |
|||
driveCrank = Part.makeCylinder(z, h) |
|||
driveCrank.translate(Base.Vector(0,0,0)) |
|||
genevaWheelClearanceCut = Part.makeCylinder(b, h) |
|||
genevaWheelClearanceCut.translate(Base.Vector(-c,0,0)) |
|||
driveCrank = driveCrank.cut(genevaWheelClearanceCut) |
|||
driveCrankBase = Part.makeCylinder((2*a), h) |
|||
driveCrankBase.translate(Base.Vector(0,0,-h)) |
|||
driveCrank = driveCrank.fuse(driveCrankBase) |
|||
drivePin = Part.makeCylinder(p,h) |
|||
drivePin.translate(Base.Vector(-a,0,0)) |
|||
driveCrank = driveCrank.fuse(drivePin) |
|||
# Create the Geneva Wheel (Will be placed on the x-axis on the left side) |
|||
genevaWheel = Part.makeCylinder(b,h) |
|||
genevaWheel.translate(Base.Vector(-c,0,0)) |
|||
stopArc = Part.makeCylinder(y, h) |
|||
stopArc.translate(Base.Vector(((y-(b/2)),0,0))) |
|||
stopArc.rotate(Base.Vector(-c,0,0),Base.Vector(0,0,1),30) |
|||
for i in range(6): |
|||
stopArc.rotate(Base.Vector(-c,0,0),Base.Vector(0,0,1),60) |
|||
genevaWheel = genevaWheel.cut(stopArc) |
|||
#genevaWheel = genevaWheel.cut(Draft.makeArray(FreeCAD.ActiveDocument.stopArc, Base.Vector(-c,0,0), 360, n)) |
|||
slotLength = Part.makeBox(s,(2*w),h) |
|||
slotLength.translate(Base.Vector(-a,-w,0)) |
|||
slotLength = Part.makeBox(s,(2*w),h) |
|||
slotLength.translate(Base.Vector(-a,-w,0)) |
|||
slotRadius = Part.makeCylinder(w,h) |
|||
slot=slotLength.fuse(slotRadius) |
|||
slotRadius.translate(Base.Vector(-a,0,0)) |
|||
slot=slotLength.fuse(slotRadius) |
|||
for i in range(6): |
|||
slot.rotate(Base.Vector(-c,0,0),Base.Vector(0,0,1),60) |
|||
genevaWheel = genevaWheel.cut(slot) |
|||
for i in range(6): |
|||
# Display Result |
|||
slot.rotate(Base.Vector(-c,0,0),Base.Vector(0,0,1),60) |
|||
genevaWheel = genevaWheel.cut(slot) |
|||
#genevaWheel = genevaWheel.cut(Draft.makeArray(FreeCAD.ActiveDocument.slot, Base.Vector(-c,0,0), 360, n)) |
|||
Part.show(driveCrank) |
|||
Part.show(genevaWheel) |
|||
except: |
|||
FreeCAD.Console.PrintError("Unable to complete task. Please recheck your data entries.") |
|||
# Display Result |
|||
self.close() |
|||
Part.show(driveCrank) |
|||
def close(self): |
|||
#Part.show(genevaWheelClearanceCut) |
|||
self.dialog.hide() |
|||
Part.show(genevaWheel) |
|||
#Part.show(stopArc) |
|||
#Part.show(slot) |
|||
except: |
|||
def __init__(self): |
|||
FreeCAD.Console.PrintError("Unable to complete task. Please recheck your data entries.") |
|||
self.dialog = None |
|||
self.close() |
|||
self.dialog = QtGui.QDialog() |
|||
self.dialog.resize(240,100) |
|||
def close(self): |
|||
self.dialog.setWindowTitle("Geneva Wheel Set") |
|||
self.dialog.hide() |
|||
def __init__(self): |
|||
DCR = QtGui.QLabel("Drive Crank Radius") |
|||
self.dialog = None |
|||
la.addWidget(DCR) |
|||
self.dCr = QtGui.QLineEdit() |
|||
la.addWidget(self.dCr) |
|||
self.dialog = QtGui.QDialog() |
|||
self.dialog.resize(240,100) |
|||
la.addWidget(GWR) |
|||
self.gWr = QtGui.QLineEdit() |
|||
la.addWidget(self.gWr) |
|||
self.dialog.setWindowTitle("Geneva Wheel Macro") |
|||
DSQ = QtGui.QLabel("Driven Slot Quantity") |
|||
la = QtGui.QVBoxLayout(self.dialog) |
|||
la.addWidget(DSQ) |
|||
self.dSq = QtGui.QLineEdit() |
|||
la.addWidget(self.dSq) |
|||
DCR = QtGui.QLabel("Drive Crank Radius ( A )") |
|||
la.addWidget(DCR) |
|||
self.dCr = QtGui.QLineEdit() |
|||
la.addWidget(self.dCr) |
|||
GWR = QtGui.QLabel("Geneva Wheel Radius ( B )") |
|||
la.addWidget(GWR) |
|||
self.gWr = QtGui.QLineEdit() |
|||
la.addWidget(self.gWr) |
|||
DSQ = QtGui.QLabel("Driven Slot Quantity ( C )") |
|||
la.addWidget(DSQ) |
|||
self.dSq = QtGui.QLineEdit() |
|||
la.addWidget(self.dSq) |
|||
DPD = QtGui.QLabel("Drive Pin Raidus ( D )") |
|||
okbox = QtGui.QDialogButtonBox(self.dialog) |
|||
la.addWidget(DPD) |
|||
okbox.setOrientation(QtCore.Qt.Horizontal) |
|||
self.dPd = QtGui.QLineEdit() |
|||
okbox.setStandardButtons(QtGui.QDialogButtonBox.Cancel|QtGui.QDialogButtonBox.Ok) |
|||
la.addWidget(self.dPd) |
|||
QtCore.QObject.connect(okbox, QtCore.SIGNAL("accepted()"), self.Ggear) |
|||
GWT = QtGui.QLabel("Geneva Wheel Tolerance ( E )") |
|||
QtCore.QObject.connect(okbox, QtCore.SIGNAL("rejected()"), self.close) |
|||
la.addWidget(GWT) |
|||
QtCore.QMetaObject.connectSlotsByName(self.dialog) |
|||
self.gWt = QtGui.QLineEdit() |
|||
self.dialog.show() |
|||
la.addWidget(self.gWt) |
|||
self.dialog.exec_() |
|||
GWH = QtGui.QLabel("Geneva Wheel Height") |
|||
la.addWidget(GWH) |
|||
self.gWh = QtGui.QLineEdit() |
|||
la.addWidget(self.gWh) |
|||
# |
|||
# - Include graphic image in dialog window - |
|||
# |
|||
# Insure that image is in the same directory as this Macro. |
|||
# Image should be available from same source as Macro. |
|||
# |
|||
import os |
|||
macro_dir = os.path.dirname(__file__) |
|||
self.PiX = QtGui.QLabel() |
|||
self.PiX.setPixmap(os.path.join(macro_dir, "GW_Dim.png")) |
|||
hbox = QtGui.QHBoxLayout() |
|||
hbox.addStretch() |
|||
hbox.addWidget(self.PiX) |
|||
hbox.addStretch() |
|||
la.addSpacing(15) |
|||
la.addLayout(hbox) |
|||
la.addSpacing(15) |
|||
# - End Image layout - |
|||
okbox = QtGui.QDialogButtonBox(self.dialog) |
|||
okbox.setOrientation(QtCore.Qt.Horizontal) |
|||
okbox.setStandardButtons(QtGui.QDialogButtonBox.Cancel|QtGui.QDialogButtonBox.Ok) |
|||
la.addWidget(okbox) |
|||
QtCore.QObject.connect(okbox, QtCore.SIGNAL("accepted()"), self.Ggear) |
|||
QtCore.QObject.connect(okbox, QtCore.SIGNAL("rejected()"), self.close) |
|||
QtCore.QMetaObject.connectSlotsByName(self.dialog) |
|||
self.dialog.show() |
|||
self.dialog.exec_() |
|||
p() |
p() |
Revision as of 17:44, 22 September 2014
File:Text-x-python MacroGeneva_Wheel_GUI |
Description |
---|
A GUI front end that allows the user to create a Geneva wheel mechanism from scratch. Based on drei's Geneva Wheel Macro Author: quick61 |
Author |
quick61 |
Download |
None |
Links |
Macros recipes How to install macros How to customize toolbars |
Macro Version |
1.0 |
Date last modified |
None |
FreeCAD Version(s) |
None |
Default shortcut |
None |
See also |
None |
#Creation of a Geneva Wheel with Parametric values By: Isaac Ayala (drei) & Mark Stephen (quick61)
#This Macro creates the main parts of a Geneva Wheel Mechanism
#It depends on six values that must be altered in the following code
#The variables are a, b, n, p, t and h.
#Definition for each variable
# Input
#a = Drive Crank Radius
#b = Geneva Wheel Radius
#n = Driven Slot Quantity
#p = Drive Pin Radius
#t = Geneva Wheel Tolerance
#h = Geneva Wheel Height
# Output
#c = Distance Between Centers
#s = Slot Center Width
#w = Slot Width
#y = Stop Arc Radius
#z = Stop Disc Radius
#v = Clearance Arc
#Please note that you can alter the code so it depends on five values exclusively
#Just replace c, and either a or b with the following
# Keep value for a
#c = a/math.sin(math.pi/n)
#b = math.sqrt((math.pow(c,2))-(math.pow(a,2)))
# Keep value for b
#c = b/math.cos(math.pi/n)
#a = math.sqrt((math.pow(c,2))-(math.pow(b,2)))
from __future__ import division
import math
from FreeCAD import Base
from PySide import QtGui, QtCore
from PySide.QtGui import QApplication, QDialog, QMainWindow
import Part
import Draft
class p():
def Ggear(self):
try:
#Inputs
a = float(self.dCr.text())
b = float(self.gWr.text())
n = int(self.dSq.text())
p = float(self.dPd.text())
t = float(self.gWt.text())
h = float(self.gWh.text())
#Outputs
c = math.sqrt(pow(a,2) + pow(b,2))
s = a + b - c
w = p + t
y = a - (1.5 * p)
z = y - t
v = (b * z)/a
# Create the Drive Crank (Will be placed on the origin)
driveCrank = Part.makeCylinder(z, h)
driveCrank.translate(Base.Vector(0,0,0))
genevaWheelClearanceCut = Part.makeCylinder(b, h)
genevaWheelClearanceCut.translate(Base.Vector(-c,0,0))
driveCrank = driveCrank.cut(genevaWheelClearanceCut)
driveCrankBase = Part.makeCylinder((2*a), h)
driveCrankBase.translate(Base.Vector(0,0,-h))
driveCrank = driveCrank.fuse(driveCrankBase)
drivePin = Part.makeCylinder(p,h)
drivePin.translate(Base.Vector(-a,0,0))
driveCrank = driveCrank.fuse(drivePin)
# Create the Geneva Wheel (Will be placed on the x-axis on the left side)
genevaWheel = Part.makeCylinder(b,h)
genevaWheel.translate(Base.Vector(-c,0,0))
stopArc = Part.makeCylinder(y, h)
stopArc.translate(Base.Vector(((y-(b/2)),0,0)))
stopArc.rotate(Base.Vector(-c,0,0),Base.Vector(0,0,1),30)
for i in range(6):
stopArc.rotate(Base.Vector(-c,0,0),Base.Vector(0,0,1),60)
genevaWheel = genevaWheel.cut(stopArc)
#genevaWheel = genevaWheel.cut(Draft.makeArray(FreeCAD.ActiveDocument.stopArc, Base.Vector(-c,0,0), 360, n))
slotLength = Part.makeBox(s,(2*w),h)
slotLength.translate(Base.Vector(-a,-w,0))
slotRadius = Part.makeCylinder(w,h)
slotRadius.translate(Base.Vector(-a,0,0))
slot=slotLength.fuse(slotRadius)
for i in range(6):
slot.rotate(Base.Vector(-c,0,0),Base.Vector(0,0,1),60)
genevaWheel = genevaWheel.cut(slot)
#genevaWheel = genevaWheel.cut(Draft.makeArray(FreeCAD.ActiveDocument.slot, Base.Vector(-c,0,0), 360, n))
# Display Result
Part.show(driveCrank)
#Part.show(genevaWheelClearanceCut)
Part.show(genevaWheel)
#Part.show(stopArc)
#Part.show(slot)
except:
FreeCAD.Console.PrintError("Unable to complete task. Please recheck your data entries.")
self.close()
def close(self):
self.dialog.hide()
def __init__(self):
self.dialog = None
self.dialog = QtGui.QDialog()
self.dialog.resize(240,100)
self.dialog.setWindowTitle("Geneva Wheel Macro")
la = QtGui.QVBoxLayout(self.dialog)
DCR = QtGui.QLabel("Drive Crank Radius ( A )")
la.addWidget(DCR)
self.dCr = QtGui.QLineEdit()
la.addWidget(self.dCr)
GWR = QtGui.QLabel("Geneva Wheel Radius ( B )")
la.addWidget(GWR)
self.gWr = QtGui.QLineEdit()
la.addWidget(self.gWr)
DSQ = QtGui.QLabel("Driven Slot Quantity ( C )")
la.addWidget(DSQ)
self.dSq = QtGui.QLineEdit()
la.addWidget(self.dSq)
DPD = QtGui.QLabel("Drive Pin Raidus ( D )")
la.addWidget(DPD)
self.dPd = QtGui.QLineEdit()
la.addWidget(self.dPd)
GWT = QtGui.QLabel("Geneva Wheel Tolerance ( E )")
la.addWidget(GWT)
self.gWt = QtGui.QLineEdit()
la.addWidget(self.gWt)
GWH = QtGui.QLabel("Geneva Wheel Height")
la.addWidget(GWH)
self.gWh = QtGui.QLineEdit()
la.addWidget(self.gWh)
#
# - Include graphic image in dialog window -
#
# Insure that image is in the same directory as this Macro.
# Image should be available from same source as Macro.
#
import os
macro_dir = os.path.dirname(__file__)
self.PiX = QtGui.QLabel()
self.PiX.setPixmap(os.path.join(macro_dir, "GW_Dim.png"))
hbox = QtGui.QHBoxLayout()
hbox.addStretch()
hbox.addWidget(self.PiX)
hbox.addStretch()
la.addSpacing(15)
la.addLayout(hbox)
la.addSpacing(15)
# - End Image layout -
okbox = QtGui.QDialogButtonBox(self.dialog)
okbox.setOrientation(QtCore.Qt.Horizontal)
okbox.setStandardButtons(QtGui.QDialogButtonBox.Cancel|QtGui.QDialogButtonBox.Ok)
la.addWidget(okbox)
QtCore.QObject.connect(okbox, QtCore.SIGNAL("accepted()"), self.Ggear)
QtCore.QObject.connect(okbox, QtCore.SIGNAL("rejected()"), self.close)
QtCore.QMetaObject.connectSlotsByName(self.dialog)
self.dialog.show()
self.dialog.exec_()
p()