Пример #1
0
class GCodeDlg(wx.Frame):
	def __init__(self, parent, server, gcode, filenm, pname, settings, images, cbexit):
		wx.Frame.__init__(self, None, wx.ID_ANY, self.formatTitle(pname, filenm))
		self.SetBackgroundColour("white")
		self.Bind(wx.EVT_CLOSE, self.onClose)

		self.parent = parent
		self.server = server
		self.gcode = gcode
		self.filenm = filenm
		self.pname = pname
		self.settings = settings
		self.images = images
		self.exitDlg = cbexit
		self.nExtr = self.parent.nExtr
		self.layerCount = 0
		if self.gcode:
			self.sTotalTime = " / " + formatElapsed(self.gcode.getPrintTime())
			self.filament = self.gcode.getFilament()
		else:
			self.sTotalTime = ""
			self.filament = [[0.0, 0.0]]

		self.printPosition = 0
		self.followPrint = True

		self.lx = 0

		lbFont = wx.Font(10, wx.FONTFAMILY_SWISS, wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_BOLD)

		self.gcf = GcFrame(self, self.pname, self.gcode, self.settings)
		self.stHeight = wx.StaticText(self, wx.ID_ANY, "")
		self.stHeight.SetFont(lbFont)
		self.stTime = wx.StaticText(self, wx.ID_ANY, "")
		self.stTime.SetFont(lbFont)
		self.stFilament = wx.StaticText(self, wx.ID_ANY, "")
		self.stFilament.SetFont(lbFont)
		self.slLayer = wx.Slider(self, wx.ID_ANY, 1, 1, 10, style=wx.SL_VERTICAL+wx.SL_LABELS+wx.SL_INVERSE)
		self.Bind(wx.EVT_SLIDER, self.onSlLayer, self.slLayer)
		self.bUp =  wx.BitmapButton(self, wx.ID_ANY, self.images.pngUp, size=BTNDIM, style=wx.NO_BORDER)
		self.bUp.SetBackgroundColour("white")
		self.Bind(wx.EVT_BUTTON, self.onBUp, self.bUp)
		self.bDown =  wx.BitmapButton(self, wx.ID_ANY, self.images.pngDown, size=BTNDIM, style=wx.NO_BORDER)
		self.bDown.SetBackgroundColour("white")
		self.Bind(wx.EVT_BUTTON, self.onBDown, self.bDown)

		self.setSliderRange()

		self.cbSync = wx.CheckBox(self, wx.ID_ANY, "Sync with print")
		self.cbSync.SetValue(True)
		self.Bind(wx.EVT_CHECKBOX, self.onCbSync, self.cbSync)
		self.cbPrintedOnly = wx.CheckBox(self, wx.ID_ANY, "Only show printed")
		self.cbPrintedOnly.SetValue(self.settings.getSetting("showprintedonly", self.pname, "False"))
		self.Bind(wx.EVT_CHECKBOX, self.onCbShowPrintedOnly, self.cbPrintedOnly)
		self.cbShowPrev = wx.CheckBox(self, wx.ID_ANY, "Show previous layer")
		self.cbShowPrev.SetValue(self.settings.getSetting("showprevious", self.pname, "False"))
		self.Bind(wx.EVT_CHECKBOX, self.onCbShowPrev, self.cbShowPrev)
		self.cbShowMoves = wx.CheckBox(self, wx.ID_ANY, "Show moves")
		self.cbShowMoves.SetValue(self.settings.getSetting("showmoves", self.pname, "False"))
		self.Bind(wx.EVT_CHECKBOX, self.onCbShowMoves, self.cbShowMoves)
		self.cbShowRetr = wx.CheckBox(self, wx.ID_ANY, "Show retractions")
		self.cbShowRetr.SetValue(self.settings.getSetting("showretractions", self.pname, "False"))
		self.Bind(wx.EVT_CHECKBOX, self.onCbShowRetr, self.cbShowRetr)
		self.cbShowRevRetr = wx.CheckBox(self, wx.ID_ANY, "Show reverse retractions")
		self.cbShowRevRetr.SetValue(self.settings.getSetting("showrevretractions", self.pname, "False"))
		self.Bind(wx.EVT_CHECKBOX, self.onCbShowRevRetr, self.cbShowRevRetr)

		sznavgc = wx.BoxSizer(wx.VERTICAL)
		sznavgc.Add(self.bUp, 0, wx.LEFT, 12 if os.name == 'posix' else 25)
		sznavgc.Add(self.slLayer, 1, wx.GROW)
		sznavgc.Add(self.bDown, 0, wx.LEFT, 12 if os.name == 'posix' else 25)

		szgcf = wx.BoxSizer(wx.VERTICAL)
		szgcf.Add(self.gcf)
		szgcf.AddSpacer(5)
		szgcf.Add(self.stHeight, 0, wx.ALIGN_CENTER)
		szgcf.AddSpacer(5)
		szgcf.Add(self.stTime, 0, wx.ALIGN_CENTER)
		szgcf.AddSpacer(5)
		szgcf.Add(self.stFilament, 0, wx.ALIGN_CENTER)

		szgc = wx.BoxSizer(wx.HORIZONTAL)
		szgc.AddSpacer(15)
		szgc.Add(szgcf)
		if os.name == 'posix':
			szgc.AddSpacer(10)
		szgc.Add(sznavgc, 1, wx.GROW)
		szgc.AddSpacer(15)

		szopt1 = wx.BoxSizer(wx.VERTICAL)
		szopt1.Add(self.cbSync, 1, wx.EXPAND)
		szopt1.Add(self.cbPrintedOnly, 1, wx.EXPAND)

		szopt2 = wx.BoxSizer(wx.VERTICAL)
		szopt2.Add(self.cbShowPrev, 1, wx.EXPAND)
		szopt2.Add(self.cbShowMoves, 1, wx.EXPAND)

		szopt3 = wx.BoxSizer(wx.VERTICAL)
		szopt3.Add(self.cbShowRetr, 1, wx.EXPAND)
		szopt3.Add(self.cbShowRevRetr, 1, wx.EXPAND)

		szoptions = wx.BoxSizer(wx.HORIZONTAL)
		szoptions.AddSpacer(20)
		szoptions.Add(szopt1, 1, wx.EXPAND)
		szoptions.AddSpacer(5)
		szoptions.Add(szopt2, 1, wx.EXPAND)
		szoptions.AddSpacer(5)
		szoptions.Add(szopt3, 1, wx.EXPAND)
		szoptions.AddSpacer(10)

		sz = wx.BoxSizer(wx.VERTICAL)
		sz.AddSpacer(10)
		sz.Add(szgc)
		sz.AddSpacer(5)
		sz.Add(szoptions)
		sz.AddSpacer(10)

		self.showLayerInfo()

		self.SetSizer(sz)
		self.Fit()
		self.Layout()

	@staticmethod
	def formatTitle(pname, filenm):

		if filenm is None:
			return "%s - GCode Monitor - (no file loaded)" % pname
		else:
			return "%s - GCode monitor - %s" % (pname, filenm)

	def reloadGCode(self, gcode, filenm):
		self.filenm = filenm
		self.SetTitle(self.formatTitle(self.pname, filenm))
		self.gcode = gcode
		if self.gcode:
			self.sTotalTime = " / " + formatElapsed(self.gcode.getPrintTime())
			self.filament = self.gcode.getFilament()
		else:
			self.sTotalTime = ""
			self.filament = 0.0

		self.setSliderRange()

		# send new gcode to gcf
		self.printPosition = 0
		self.gcf.loadGCode(gcode)
		self.showLayerInfo()

	def setSliderRange(self):
		n = self.gcode.layerCount()
		self.slLayer.SetRange(1, 10 if n == 0 else n)
		self.slLayer.SetValue(1)
		self.slLayer.Enable(n != 0)
		self.bUp.Enable(n != 0)
		self.bDown.Enable(n != 0)
		self.layerCount = n

	def setPrintPosition(self, pos):
		if pos is None:
			return False, None, None
		self.printPosition = 0 if pos is None else pos
		self.gcf.setPrintPosition(self.printPosition)

		pLayer, lpct = self.gcode.findLayerByOffset(self.printPosition)
		cLayer = self.gcf.getCurrentLayerNum()

		if not self.followPrint:
			return cLayer != pLayer, pLayer, lpct
		
		if cLayer != pLayer:
			self.gcf.setLayer(pLayer)
			self.slLayer.SetValue(pLayer+1)
			self.showLayerInfo()
			return True, pLayer, lpct

		return False, pLayer, lpct

	def showLayerInfo(self):
		l = self.gcf.getCurrentLayer()
		if l is None:
			lblHt = ""
			lblTime = ""
			lblFilament = ""
		else:
			lx = self.gcf.getCurrentLayerNum()
			lblHt, lblTime, lblFilament = self.formatLayerInfo(l, lx)
			
		self.stHeight.SetLabel(lblHt)
		self.stTime.SetLabel(lblTime)
		self.stFilament.SetLabel(lblFilament)
		
	def formatLayerInfo(self, l, lx):
		sHt = "Height: {:.2f}  Layer: {:d} / {:d}".format(l.getHeight(), lx+1, self.layerCount)
		
		sTm = "  Print time: {:s}{:s}".format(formatElapsed(l.getLayerTime()), self.sTotalTime)
		o = l.getOffsets()
		if self.printPosition < o[0]:
			lyrs = self.gcode.getLayersBetweenOffsets(self.printPosition, o[0])
			untilTime = 0.0
			for ly in lyrs:
				untilTime += ly.getLayerTime()
			sTm += " ({:s} until)".format(formatElapsed(untilTime))

		sFi = "  Filament: "
		lf = l.getFilament()
		for i in range(self.nExtr):
			if i > 0:
				sFi += " / "
				
			if self.nExtr > 1:
				if i > 0:
					sFi += " - "
				sFi += "{:d}: ".format(i)
			sFi += "{:.2f}mm ({:.2f}cm3) / {:.2f}mm".format(lf[i][0], lf[i][1], self.filament[i][0])
			
		return sHt, sTm, sFi

	def onSlLayer(self, _):
		self.followPrintOff()
		v = self.slLayer.GetValue()-1
		self.gcf.setLayer(v)
		self.showLayerInfo()

	def onBUp(self, _):
		v = self.slLayer.GetValue()
		if v < self.gcode.layerCount():
			self.followPrintOff()
			v += 1
			self.slLayer.SetValue(v)
			self.gcf.setLayer(v-1)
			self.showLayerInfo()

	def onBDown(self, _):
		v = self.slLayer.GetValue()
		if v > 1:
			self.followPrintOff()
			v -= 1
			self.slLayer.SetValue(v)
			self.gcf.setLayer(v-1)
			self.showLayerInfo()

	def followPrintOff(self):
		if self.followPrint:
			self.cbSync.SetValue(False)
			self.followPrint = False
			self.gcf.setFollowPrint(False)

	def onCbSync(self, _):
		self.followPrint = self.cbSync.GetValue()
		self.gcf.setFollowPrint(self.followPrint)

	def onCbShowPrintedOnly(self, _):
		v = self.cbPrintedOnly.GetValue()
		self.settings.setSetting("showprintedonly", str(v), self.pname)
		self.gcf.setShowPrintedOnly(v)

	def onCbShowPrev(self, _):
		v = self.cbShowPrev.GetValue()
		self.settings.setSetting("showprevious", str(v), self.pname)
		self.gcf.setShowPrevious(v)

	def onCbShowMoves(self, _):
		v = self.cbShowMoves.GetValue()
		self.settings.setSetting("showmoves", str(v), self.pname)
		self.gcf.setShowMoves(v)

	def onCbShowRetr(self, _):
		v = self.cbShowRetr.GetValue()
		self.settings.setSetting("showretractions", str(v), self.pname)
		self.gcf.setShowRetractions(v)

	def onCbShowRevRetr(self, _):
		v = self.cbShowRevRetr.GetValue()
		self.settings.setSetting("showrevretractions", str(v), self.pname)
		self.gcf.setShowRevRetractions(v)

	def onClose(self, _):
		self.exitDlg()