Форум сайта python.su
0
Есть программа Pronterface для Raspberry Pi. Нужно сделать так, чтобы при запуске она автоматически загружала определенный файл, имя которого получает из другого модуля. Для удобства пока его имя прописал в коде.
filename="/media/TRANSCEND/mod/model3.gcode"

wx.CallAfter(self.loadbtn.SetLabel, _("Cancel"))
self.loadbtn.SetLabel(_("Load File"))
# -------------------------------------------------------------- # File loading handling # -------------------------------------------------------------- def filesloaded(self): dlg = wx.SingleChoiceDialog(self, _("Select the file to print"), _("Pick SD file"), self.sdfiles) if dlg.ShowModal() == wx.ID_OK: target = dlg.GetStringSelection() if len(target): self.recvlisteners.append(self.waitforsdresponse) self.p.send_now("M23 " + target.lower()) dlg.Destroy() def getfiles(self): if not self.p.online: self.sdfiles = [] return self.sdlisting = 0 self.sdfiles = [] self.recvlisteners.append(self.listfiles) self.p.send_now("M21") self.p.send_now("M20") def model_to_gcode_filename(self, filename): suffix = "_export.gcode" for ext in [".stl", ".obj"]: filename = filename.replace(ext, suffix) filename = filename.replace(ext.upper(), suffix) return filename def slice_func(self): try: output_filename = self.model_to_gcode_filename(self.filename) pararray = prepare_command(self.settings.slicecommand, {"$s": self.filename, "$o": output_filename}) if self.settings.slic3rintegration: for cat, config in self.slic3r_configs.items(): if config: fpath = os.path.join(self.slic3r_configpath, cat, config) pararray += ["--load", fpath] self.log(_("Running ") + " ".join(pararray)) self.slicep = subprocess.Popen(pararray, stderr = subprocess.STDOUT, stdout = subprocess.PIPE) while True: o = self.slicep.stdout.read(1) if o == '' and self.slicep.poll() is not None: break sys.stdout.write(o) self.slicep.wait() self.stopsf = 1 except: self.logError(_("Failed to execute slicing software: ") + "\n" + traceback.format_exc()) self.stopsf = 1 def slice_monitor(self): while not self.stopsf: try: wx.CallAfter(self.statusbar.SetStatusText, _("Slicing...")) # +self.cout.getvalue().split("\n")[-1]) except: pass time.sleep(0.1) fn = self.filename try: self.load_gcode_async(self.model_to_gcode_filename(self.filename)) except: self.filename = fn self.slicing = False self.slicep = None def slice(self, filename): wx.CallAfter(self.loadbtn.SetLabel, _("Cancel")) wx.CallAfter(self.toolbarsizer.Layout) self.log(_("Slicing ") + filename) self.cout = StringIO.StringIO() self.filename = filename self.stopsf = 0 self.slicing = True threading.Thread(target = self.slice_func).start() threading.Thread(target = self.slice_monitor).start() def cmdline_filename_callback(self, filename): # Do nothing when processing a filename from command line, as we'll # handle it when everything has been prepared self.filename = filename def do_load(self, l): if hasattr(self, 'slicing'): self.loadfile(None, l) else: self._do_load(l) def load_recent_file(self, event): fileid = event.GetId() - wx.ID_FILE1 path = self.filehistory.GetHistoryFile(fileid) self.loadfile(None, filename = path) def loadfile(self, event, filename = None): if self.slicing and self.slicep is not None: self.slicep.terminate() return basedir = self.settings.last_file_path if not os.path.exists(basedir): basedir = "." try: basedir = os.path.split(self.filename)[0] except: pass dlg = None filename="/media/TRANSCEND/mod/model3.gcode" if filename is None: dlg = wx.FileDialog(self, _("Open file to print"), basedir, style = wx.FD_OPEN | wx.FD_FILE_MUST_EXIST) dlg.SetWildcard(_("OBJ, STL, and GCODE files (*.gcode;*.gco;*.g;*.stl;*.STL;*.obj;*.OBJ)|*.gcode;*.gco;*.g;*.stl;*.STL;*.obj;*.OBJ|All Files (*.*)|*.*")) if filename or dlg.ShowModal() == wx.ID_OK: if filename: name = filename else: name = dlg.GetPath() dlg.Destroy() if not os.path.exists(name): self.statusbar.SetStatusText(_("File not found!")) return path = os.path.split(name)[0] if path != self.settings.last_file_path: self.set("last_file_path", path) try: abspath = os.path.abspath(name) recent_files = [] try: recent_files = json.loads(self.settings.recentfiles) except: self.logError(_("Failed to load recent files list:") + "\n" + traceback.format_exc()) if abspath in recent_files: recent_files.remove(abspath) recent_files.insert(0, abspath) if len(recent_files) > 5: recent_files = recent_files[:5] self.set("recentfiles", json.dumps(recent_files)) except: self.logError(_("Could not update recent files list:") + "\n" + traceback.format_exc()) if name.lower().endswith(".stl") or name.lower().endswith(".obj"): self.slice(name) else: self.load_gcode_async(name) else: dlg.Destroy() def load_gcode_async(self, filename): self.filename = filename gcode = self.pre_gcode_load() self.log(_("Loading file: %s") % filename) threading.Thread(target = self.load_gcode_async_thread, args = (gcode,)).start() def load_gcode_async_thread(self, gcode): try: self.load_gcode(self.filename, layer_callback = self.layer_ready_cb, gcode = gcode) except PronterfaceQuitException: return wx.CallAfter(self.post_gcode_load) def layer_ready_cb(self, gcode, layer): global pronterface_quitting if pronterface_quitting: raise PronterfaceQuitException if not self.settings.refreshwhenloading: return self.viz_last_layer = layer if time.time() - self.viz_last_yield > 1.0: time.sleep(0.2) self.loading_gcode_message = _("Loading %s: %d layers loaded (%d lines)") % (self.filename, layer + 1, len(gcode)) self.viz_last_yield = time.time() wx.CallAfter(self.statusbar.SetStatusText, self.loading_gcode_message) def start_viz_thread(self, gcode = None): threading.Thread(target = self.loadviz, args = (gcode,)).start() def pre_gcode_load(self): self.loading_gcode = True self.loading_gcode_message = _("Loading %s...") % self.filename if self.settings.mainviz == "None": gcode = gcoder.LightGCode(deferred = True) else: gcode = gcoder.GCode(deferred = True) self.viz_last_yield = 0 self.viz_last_layer = -1 self.start_viz_thread(gcode) return gcode def post_gcode_load(self, print_stats = True): # Must be called in wx.CallAfter for safety self.loading_gcode = False self.SetTitle(_(u"Pronterface - %s") % self.filename) message = _("Loaded %s, %d lines") % (self.filename, len(self.fgcode),) self.log(message) self.statusbar.SetStatusText(message) self.savebtn.Enable(True) self.loadbtn.SetLabel(_("Load File")) self.printbtn.SetLabel(_("Print")) self.pausebtn.SetLabel(_("Pause")) self.pausebtn.Disable() self.recoverbtn.Disable() if self.p.online: self.printbtn.Enable() self.toolbarsizer.Layout() self.viz_last_layer = None if print_stats: self.output_gcode_stats() def output_gcode_stats(self): gcode = self.fgcode self.log(_("%.2fmm of filament used in this print") % gcode.filament_length) self.log(_("The print goes:")) self.log(_("- from %.2f mm to %.2f mm in X and is %.2f mm wide") % (gcode.xmin, gcode.xmax, gcode.width)) self.log(_("- from %.2f mm to %.2f mm in Y and is %.2f mm deep") % (gcode.ymin, gcode.ymax, gcode.depth)) self.log(_("- from %.2f mm to %.2f mm in Z and is %.2f mm high") % (gcode.zmin, gcode.zmax, gcode.height)) self.log(_("Estimated duration: %d layers, %s") % gcode.estimate_duration()) def loadviz(self, gcode = None): self.gviz.clear() self.gwindow.p.clear() if gcode is not None: generator = self.gviz.addfile_perlayer(gcode, True) next_layer = 0 # Progressive loading of visualization # We load layers up to the last one which has been processed in GCoder # (self.viz_last_layer) # Once the GCode has been entirely loaded, this variable becomes None, # indicating that we can do the last generator call to finish the # loading of the visualization, which will itself return None. # During preloading we verify that the layer we added is the one we # expected through the assert call. while True: global pronterface_quitting if pronterface_quitting: return max_layer = self.viz_last_layer if max_layer is None: break while next_layer <= max_layer: assert(generator.next() == next_layer) next_layer += 1 time.sleep(0.1) generator_output = generator.next() while generator_output is not None: assert(generator_output in (None, next_layer)) next_layer += 1 generator_output = generator.next() else: # If GCode is not being loaded asynchroneously, it is already # loaded, so let's make visualization sequentially gcode = self.fgcode self.gviz.addfile(gcode) wx.CallAfter(self.gviz.Refresh) # Load external window sequentially now that everything is ready. # We can't really do any better as the 3D viewer might clone the # finalized model from the main visualization self.gwindow.p.addfile(gcode)
Прикреплённый файлы:
pronterface.py (98,3 KБ)
Офлайн
857
fabucusake123class PronterApp(wx.App): mainwindow = None def __init__(self, *args, **kwargs): super(PronterApp, self).__init__(*args, **kwargs) self.SetAppName("Pronterface") self.mainwindow = PronterWindow(self) self.mainwindow.Show()
self.mainwindow.Show()
self.mainwindow.loadfile(None, "/media/TRANSCEND/mod/model3.gcode")
Отредактировано py.user.next (Апрель 5, 2016 02:44:22)
Офлайн
0
Спасибо. Я придумал еще один способ решения проблемы. Вечером попробую и свой и ваш способ, отпишусь.
Все модули находятся здесь, если интересно: https://github.com/kliment/Printrun
Отредактировано fabucusake123 (Апрель 5, 2016 11:43:23)
Офлайн
0
Спасибо, заработало
Офлайн