Teacup_Firmware/configtool/calcbelt.py

332 lines
8.9 KiB
Python

import wx
from configtool.data import BSIZESMALL, reFloat, reInteger, offsetChLabel, offsetTcLabel
class CalcBelt(wx.Dialog):
def __init__(self, parent, font, cbUse):
wx.Dialog.__init__(
self,
parent,
wx.ID_ANY,
"Steps calculator for belt driven axes",
size=(360, 300),
)
self.SetFont(font)
self.Bind(wx.EVT_CLOSE, self.onExit)
self.use = cbUse
labelWidth = 130
hsz = wx.BoxSizer(wx.HORIZONTAL)
hsz.Add((10, 10))
sz = wx.BoxSizer(wx.VERTICAL)
sz.Add((10, 10))
lsz = wx.BoxSizer(wx.HORIZONTAL)
st = wx.StaticText(
self, wx.ID_ANY, "Step Angle:", size=(labelWidth, -1), style=wx.ALIGN_RIGHT
)
st.SetFont(font)
lsz.Add(st, 1, wx.TOP, offsetChLabel)
lsz.Add((5, 5))
stepAngles = [
"1.8 (200 per revolution)",
"0.9 (400 per revolution)",
"7.5 (48 per revolution)",
]
self.stepAngleValues = [200, 400, 48]
tc = wx.Choice(self, wx.ID_ANY, choices=stepAngles)
tc.SetFont(font)
tc.SetSelection(0)
tc.Bind(wx.EVT_CHOICE, self.onChoice)
lsz.Add(tc)
tc.SetToolTip("Step angle. Depends on your type of stepper motor.")
self.tcStep = tc
sz.Add(lsz)
sz.Add((10, 10))
lsz = wx.BoxSizer(wx.HORIZONTAL)
st = wx.StaticText(
self,
wx.ID_ANY,
"Microstepping:",
size=(labelWidth, -1),
style=wx.ALIGN_RIGHT,
)
st.SetFont(font)
lsz.Add(st, 1, wx.TOP, offsetChLabel)
lsz.Add((5, 5))
microStepping = [
"1 - full step",
"1/2 - half step",
"1/4 - quarter step",
"1/8",
"1/16",
"1/32",
"1/64",
"1/128",
]
self.microSteppingValues = [1, 2, 4, 8, 16, 32, 64, 128]
tc = wx.Choice(self, wx.ID_ANY, choices=microStepping)
tc.SetFont(font)
tc.Bind(wx.EVT_CHOICE, self.onChoice)
tc.SetSelection(4)
lsz.Add(tc)
tc.SetToolTip(
"Microstepping. Most boards allow to change this by "
"setting jumpers. The value here must match the "
"setting on the board in conjunction with the type "
"of stepper driver chip."
)
self.tcMicroStepping = tc
sz.Add(lsz)
sz.Add((10, 10))
lsz = wx.BoxSizer(wx.HORIZONTAL)
st = wx.StaticText(
self,
wx.ID_ANY,
"Belt Pitch (in mm):",
size=(labelWidth, -1),
style=wx.ALIGN_RIGHT,
)
st.SetFont(font)
lsz.Add(st, 1, wx.TOP, offsetTcLabel)
lsz.Add((5, 5))
tc = wx.TextCtrl(self, wx.ID_ANY, "2", style=wx.TE_RIGHT)
tc.SetFont(font)
tc.Bind(wx.EVT_TEXT, self.onTextCtrlFloat)
lsz.Add(tc)
tc.SetToolTip("Belt pitch. Distance between two teeth on the belt.")
self.tcBeltPitch = tc
lsz.Add((5, 5))
beltPresets = [
"-",
"2mm Pitch (GT2)",
"MXL Pitch (2.03mm)",
"T2.5 (2.5mm)",
"3mm Pitch (GT2, HTD)",
"5mm Pitch (T5, GTD, HTD)",
'0.2" XL belt (5.08mm)',
]
self.beltPresetValues = [-1, 2.0, 2.03, 2.5, 3.0, 5.0, 5.08]
tc = wx.Choice(self, wx.ID_ANY, choices=beltPresets)
tc.SetFont(font)
tc.SetSelection(0)
tc.Bind(wx.EVT_CHOICE, self.onPresetChoice)
lsz.Add(tc)
tc.SetToolTip("Belt pitch presets.")
self.tcPresets = tc
sz.Add(lsz)
sz.Add((10, 10))
lsz = wx.BoxSizer(wx.HORIZONTAL)
st = wx.StaticText(
self,
wx.ID_ANY,
"Pulley Teeth Count:",
size=(labelWidth, -1),
style=wx.ALIGN_RIGHT,
)
st.SetFont(font)
lsz.Add(st, 1, wx.TOP, offsetTcLabel)
lsz.Add((5, 5))
tc = wx.TextCtrl(self, wx.ID_ANY, "8", style=wx.TE_RIGHT)
tc.SetFont(font)
tc.Bind(wx.EVT_TEXT, self.onTextCtrlInteger)
lsz.Add(tc)
tc.SetToolTip("Pulley teeth count. Count them!")
self.tcPulleyTeeth = tc
sz.Add(lsz)
sz.Add((30, 30))
lsz = wx.BoxSizer(wx.HORIZONTAL)
st = wx.StaticText(
self, wx.ID_ANY, "Result:", size=(labelWidth, -1), style=wx.ALIGN_RIGHT
)
st.SetFont(font)
lsz.Add(st)
lsz.Add((5, 5))
tc = wx.StaticText(self, wx.ID_ANY, "", size=(260, -1), style=wx.ALIGN_LEFT)
tc.SetFont(font)
lsz.Add(tc)
self.tcResult = tc
sz.Add(lsz)
lsz = wx.BoxSizer(wx.HORIZONTAL)
st = wx.StaticText(
self, wx.ID_ANY, "Resolution:", size=(labelWidth, -1), style=wx.ALIGN_RIGHT
)
st.SetFont(font)
lsz.Add(st)
lsz.Add((5, 5))
tc = wx.StaticText(self, wx.ID_ANY, "", size=(260, -1), style=wx.ALIGN_LEFT)
tc.SetFont(font)
lsz.Add(tc)
self.tcResolution = tc
sz.Add(lsz)
sz.Add((20, 20))
bsz = wx.BoxSizer(wx.HORIZONTAL)
b = wx.Button(self, wx.ID_ANY, "Use for X", size=BSIZESMALL)
b.SetFont(font)
self.Bind(wx.EVT_BUTTON, self.onUseForX, b)
bsz.Add(b)
self.bUseForX = b
bsz.Add((5, 5))
b = wx.Button(self, wx.ID_ANY, "Use for Y", size=BSIZESMALL)
b.SetFont(font)
self.Bind(wx.EVT_BUTTON, self.onUseForY, b)
bsz.Add(b)
self.bUseForY = b
bsz.Add((5, 5))
b = wx.Button(self, wx.ID_ANY, "Use for Z", size=BSIZESMALL)
b.SetFont(font)
self.Bind(wx.EVT_BUTTON, self.onUseForZ, b)
bsz.Add(b)
self.bUseForZ = b
bsz.Add((5, 5))
b = wx.Button(self, wx.ID_ANY, "Use for E", size=BSIZESMALL)
b.SetFont(font)
self.Bind(wx.EVT_BUTTON, self.onUseForE, b)
bsz.Add(b)
self.bUseForE = b
sz.Add(bsz)
sz.Add((10, 10))
hsz.Add(sz)
hsz.Add((10, 10))
self.enableUseButtons(False)
self.SetSizer(hsz)
self.Fit()
self.calculate()
def calculate(self):
self.tcResult.SetLabel("")
self.tcResolution.SetLabel("")
self.enableUseButtons(False)
s = self.tcStep.GetSelection()
sv = self.stepAngleValues[s]
try:
bp = float(self.tcBeltPitch.GetValue())
except:
return
try:
pt = int(self.tcPulleyTeeth.GetValue())
except:
return
s = self.tcMicroStepping.GetSelection()
msv = self.microSteppingValues[s]
length = pt * bp
steps = sv * msv
resultmm = steps / length
self.result = int(resultmm * 1000.0)
self.tcResult.SetLabel("%d steps/m (%.3f steps/mm)" % (self.result, resultmm))
self.tcResolution.SetLabel("%.3f micrometers" % (length / steps * 1000.0))
self.enableUseButtons(True)
def enableUseButtons(self, flag):
self.bUseForX.Enable(flag)
self.bUseForY.Enable(flag)
self.bUseForZ.Enable(flag)
self.bUseForE.Enable(flag)
def onUseForX(self, evt):
self.use("STEPS_PER_M_X", self.result)
def onUseForY(self, evt):
self.use("STEPS_PER_M_Y", self.result)
def onUseForZ(self, evt):
self.use("STEPS_PER_M_Z", self.result)
def onUseForE(self, evt):
self.use("STEPS_PER_M_E", self.result)
def onPresetChoice(self, evt):
s = self.tcPresets.GetSelection()
sv = self.beltPresetValues[s]
if sv < 0:
return
s = "%f" % sv
s = s.rstrip("0")
if s[-1] == ".":
s += "0"
self.tcBeltPitch.SetValue(s)
def onChoice(self, evt):
self.calculate()
def onTextCtrlInteger(self, evt):
tc = evt.GetEventObject()
w = tc.GetValue().strip()
if w == "":
valid = False
else:
m = reInteger.match(w)
if m:
valid = True
else:
valid = False
if valid:
tc.SetBackgroundColour(wx.SystemSettings.GetColour(wx.SYS_COLOUR_WINDOW))
else:
tc.SetBackgroundColour("pink")
tc.Refresh()
self.calculate()
evt.Skip()
def onTextCtrlFloat(self, evt):
tc = evt.GetEventObject()
w = tc.GetValue().strip()
if w == "":
valid = False
else:
m = reFloat.match(w)
if m:
valid = True
else:
valid = False
if valid:
tc.SetBackgroundColour(wx.SystemSettings.GetColour(wx.SYS_COLOUR_WINDOW))
else:
tc.SetBackgroundColour("pink")
tc.Refresh()
self.calculate()
evt.Skip()
def onExit(self, evt):
self.EndModal(wx.ID_OK)