def requestWrite(self, node, fileName=None, *args, **kwargs): if self._stage != OutputStage.ready: raise OutputDeviceError.DeviceBusyError() if fileName: fileName = os.path.splitext(fileName)[0] + '.gcode' else: fileName = "%s.gcode" % Application.getInstance( ).getPrintInformation().jobName self._fileName = fileName # create the temp file for the gcode self._stream = StringIO() self._stage = OutputStage.writing self.writeStarted.emit(self) # show a progress message message = Message( catalog.i18nc("@info:progress", "Saving to <filename>{0}</filename>").format( self.getName()), 0, False, -1) message.show() self._message = message # send all the gcode to self._stream gcode = getattr(Application.getInstance().getController().getScene(), "gcode_list") lines = len(gcode) nextYield = time() + 0.05 i = 0 for line in gcode: i += 1 self._stream.write(line) if time() > nextYield: self._onProgress(i / lines) QCoreApplication.processEvents() nextYield = time() + 0.05 # self._stream now contains the gcode, now upload it self._stage = OutputStage.uploading self._stream.seek(0) # set up a multi-part post self._multipart = QtNetwork.QHttpMultiPart( QtNetwork.QHttpMultiPart.FormDataType) # add the file part part = QtNetwork.QHttpPart() part.setHeader(QtNetwork.QNetworkRequest.ContentDispositionHeader, 'form-data; name="file"; filename="%s"' % fileName) part.setHeader(QtNetwork.QNetworkRequest.ContentTypeHeader, "application/octet-stream") part.setBody(self._stream.getvalue().encode()) self._multipart.append(part) # send the post url = "http://" + self._address + "/print" Logger.log("d", url) self._update_timer.stop() #################################################### # This is working but ugly. Pull Requests welcome. fd = open('/tmp/' + fileName, "w") fd.write(self._stream.getvalue()) fd.close() command = 'curl -F "file=@/tmp/' + fileName + '" ' + url Logger.log("d", command) import subprocess, shlex subprocess.Popen(shlex.split(command)) self._stage = OutputStage.ready if self._message: self._message.hide() self._message = None
def requestWrite(self, node, fileName=None, *args, **kwargs): if self._stage != OutputStage.ready: raise OutputDeviceError.DeviceBusyError() if fileName: fileName = os.path.splitext(fileName)[0] + '.gcode' else: fileName = "%s.gcode" % Application.getInstance( ).getPrintInformation().jobName self._fileName = fileName # create the temp file for the gcode self._stream = StringIO() self._stage = OutputStage.writing self.writeStarted.emit(self) # show a progress message message = Message( catalog.i18nc("@info:progress", "Saving to <filename>{0}</filename>").format( self.getName()), 0, False, -1) message.show() self._message = message # find the G-code for the active build plate to print active_build_plate_id = Application.getInstance().getBuildPlateModel( ).activeBuildPlate gcode_dict = getattr( Application.getInstance().getController().getScene(), "gcode_dict") gcode = gcode_dict[active_build_plate_id] # send all the gcode to self._stream lines = len(gcode) nextYield = time() + 0.05 i = 0 for line in gcode: i += 1 self._stream.write(line) if time() > nextYield: self._onProgress(i / lines) QCoreApplication.processEvents() nextYield = time() + 0.05 # self._stream now contains the gcode, now upload it self._stage = OutputStage.uploading self._stream.seek(0) # set up a multi-part post self._multipart = QtNetwork.QHttpMultiPart( QtNetwork.QHttpMultiPart.FormDataType) # add the form variables formvalues = {'select': 'false', 'print': 'false'} for key, value in formvalues.items(): part = QtNetwork.QHttpPart() part.setHeader(QtNetwork.QNetworkRequest.ContentDispositionHeader, 'form-data; name="%s"' % key) part.setBody(value.encode()) self._multipart.append(part) # add the file part part = QtNetwork.QHttpPart() part.setHeader(QtNetwork.QNetworkRequest.ContentDispositionHeader, 'form-data; name="file"; filename="%s"' % fileName) part.setBody(self._stream.getvalue().encode()) self._multipart.append(part) # send the post self._request = QtNetwork.QNetworkRequest( QUrl(self._host + "/api/files/local")) self._request.setRawHeader( 'User-agent'.encode(), 'Cura OctoPrintOutputDevice Plugin'.encode()) self._request.setRawHeader('X-Api-Key'.encode(), self._apiKey.encode()) self._reply = self._qnam.post(self._request, self._multipart) # connect the reply signals self._reply.error.connect(self._onNetworkError) self._reply.uploadProgress.connect(self._onUploadProgress) self._reply.downloadProgress.connect(self._onDownloadProgress)