Macro Geneva Wheel GUI

From FreeCAD Documentation
Revision as of 17:44, 22 September 2014 by Quick61 (talk | contribs) (Fixed small text error and added graphic image)

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
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()