Пример #1
0
    def _buildSendPrintJobHttpRequest(self, require_printer_name):
        api_url = QUrl(self._api_base_uri + "print_jobs/")
        request = QNetworkRequest(api_url)
        # Create multipart request and add the g-code.
        self._multipart = QHttpMultiPart(QHttpMultiPart.FormDataType)

        # Add gcode
        part = QHttpPart()
        part.setHeader(QNetworkRequest.ContentDispositionHeader,
                       'form-data; name="file"; filename="%s"' % self._file_name)

        gcode = getattr(Application.getInstance().getController().getScene(), "gcode_list")
        compressed_gcode = self._compressGcode(gcode)
        if compressed_gcode is None:
            return None     # User aborted print, so stop trying.

        part.setBody(compressed_gcode)
        self._multipart.append(part)

        # require_printer_name "" means automatic
        if require_printer_name:
            self._multipart.append(self.__createKeyValueHttpPart("require_printer_name", require_printer_name))
        user_name = self.__get_username()
        if user_name is None:
            user_name = "unknown"
        self._multipart.append(self.__createKeyValueHttpPart("owner", user_name))

        self._addUserAgentHeader(request)
        return request
    def postFormWithParts(
        self,
        target: str,
        parts: List[QHttpPart],
        on_finished: Optional[Callable[[QNetworkReply], None]],
        on_progress: Optional[Callable[[int, int],
                                       None]] = None) -> QNetworkReply:
        self._validateManager()
        request = self._createEmptyRequest(target, content_type=None)
        multi_post_part = QHttpMultiPart(QHttpMultiPart.FormDataType)
        for part in parts:
            multi_post_part.append(part)

        self._last_request_time = time()

        if self._manager is not None:
            reply = self._manager.post(request, multi_post_part)

            self._kept_alive_multiparts[reply] = multi_post_part

            if on_progress is not None:
                reply.uploadProgress.connect(on_progress)
            self._registerOnFinishedCallback(reply, on_finished)

            return reply
        else:
            Logger.log("e", "Could not find manager.")
Пример #3
0
    def startPrint(self):
        global_container_stack = Application.getInstance().getGlobalContainerStack()
        if not global_container_stack:
            return

        if self.jobState != "ready" and self.jobState != "":
            self._error_message = Message(i18n_catalog.i18nc("@info:status", "OctoPrint is printing. Unable to start a new job."))
            self._error_message.show()
            return
        try:
            self._progress_message = Message(i18n_catalog.i18nc("@info:status", "Sending data to OctoPrint"), 0, False, -1)
            self._progress_message.show()

            ## Mash the data into single string
            single_string_file_data = ""
            for line in self._gcode:
                single_string_file_data += line

            file_name = "%s.gcode" % Application.getInstance().getPrintInformation().jobName

            ##  Create multi_part request
            self._post_multi_part = QHttpMultiPart(QHttpMultiPart.FormDataType)

            ##  Create parts (to be placed inside multipart)
            self._post_part = QHttpPart()
            self._post_part.setHeader(QNetworkRequest.ContentDispositionHeader, "form-data; name=\"select\"")
            self._post_part.setBody(b"true")
            self._post_multi_part.append(self._post_part)

            if global_container_stack.getMetaDataEntry("octoprint_auto_print", True):
                self._post_part = QHttpPart()
                self._post_part.setHeader(QNetworkRequest.ContentDispositionHeader, "form-data; name=\"print\"")
                self._post_part.setBody(b"true")
                self._post_multi_part.append(self._post_part)

                self._post_part = QHttpPart()
                self._post_part.setHeader(QNetworkRequest.ContentDispositionHeader, "form-data; name=\"file\"; filename=\"%s\"" % file_name)
                self._post_part.setBody(single_string_file_data.encode())
                self._post_multi_part.append(self._post_part)

            url = QUrl("http://" + self._address + self._api_prefix + "files/local")

            ##  Create the QT request
            self._post_request = QNetworkRequest(url)
            self._post_request.setRawHeader(self._api_header.encode(), self._api_key.encode())

            ##  Post request + data
            self._post_reply = self._manager.post(self._post_request, self._post_multi_part)
            self._post_reply.uploadProgress.connect(self._onUploadProgress)

            self._gcode = None

        except IOError:
            self._progress_message.hide()
            self._error_message = Message(i18n_catalog.i18nc("@info:status", "Unable to send data to OctoPrint."))
            self._error_message.show()
        except Exception as e:
            self._progress_message.hide()
            Logger.log("e", "An exception occurred in network connection: %s" % str(e))
Пример #4
0
    def postFormWithParts(self, target:str, parts: List[QHttpPart], onFinished: Optional[Callable[[Any, QNetworkReply], None]], onProgress: Callable = None) -> None:
        if self._manager is None:
            self._createNetworkManager()
        request = self._createEmptyRequest(target, content_type=None)
        multi_post_part = QHttpMultiPart(QHttpMultiPart.FormDataType)
        for part in parts:
            multi_post_part.append(part)

        self._last_request_time = time()

        reply = self._manager.post(request, multi_post_part)

        self._kept_alive_multiparts[reply] = multi_post_part

        if onProgress is not None:
            reply.uploadProgress.connect(onProgress)
        self._registerOnFinishedCallback(reply, onFinished)

        return reply
Пример #5
0
def generate_multipart_data(text_dict=None, file_dict=None):
    multipart_data = QHttpMultiPart(QHttpMultiPart.FormDataType)
    if text_dict:
        for key, value in text_dict.items():
            text_part = QHttpPart()
            text_part.setHeader(QNetworkRequest.ContentDispositionHeader,
                                "form-data;name=\"%s\"" % key)
            text_part.setBody(str(value).encode("utf-8"))
            multipart_data.append(text_part)
    if file_dict:
        for key, file in file_dict.items():
            file_part = QHttpPart()
            filename = QFileInfo(file.fileName()).fileName()
            file_part.setHeader(
                QNetworkRequest.ContentDispositionHeader,
                "form-data; name=\"%s\"; filename=\"%s\"" % (key, filename))
            file_part.setBodyDevice(file)
            file.setParent(multipart_data)
            multipart_data.append(file_part)
    return multipart_data
Пример #6
0
    def stopPrint(self):
        self._post_multi_part = QHttpMultiPart(QHttpMultiPart.FormDataType)

        ##  Create parts (to be placed inside multipart)
        self._post_part = QHttpPart()
        self._post_part.setHeader(QNetworkRequest.ContentDispositionHeader,
                                  "form-data; name=\"cool\"")
        self._post_part.setBody(b"true")
        self._post_multi_part.append(self._post_part)

        url = QUrl(self._base_url + "stop_print")

        ##  Create the QT request
        self._post_request = QNetworkRequest(url)
        self._post_request.setRawHeader(self._api_header.encode(),
                                        self._api_key.encode())

        ##  Post request + data
        self._post_reply = self._manager.post(self._post_request,
                                              self._post_multi_part)
Пример #7
0
    def genReqStr(value: Dict[str, Any],
                  prefix="",
                  multiPart=None) -> QHttpMultiPart:
        if not multiPart:
            multiPart = QHttpMultiPart(QHttpMultiPart.FormDataType)

        if isinstance(
                value,
            (QtCore.QFile,
             io.BufferedReader)):  # file content must be a QFile object
            # FIXME: This is broken. IoBufferedReader will be read to memory entirely - not streamed!!
            if "name" in dir(value):
                fileName = value.name
            elif "fileName" in dir(value):
                fileName = value.fileName()
            try:
                mimetype, encoding = mimetypes.guess_type(fileName,
                                                          strict=False)
                mimetype = mimetype or "application/octet-stream"
            except:
                mimetype = "application/octet-stream"
            filePart = QHttpPart()
            filePart.setHeader(QNetworkRequest.ContentTypeHeader, mimetype)
            filePart.setHeader(
                QNetworkRequest.ContentDispositionHeader,
                'form-data; name="{0}"; filename="{1}"'.format(
                    prefix, os.path.basename(fileName)))
            if isinstance(value, io.BufferedReader):
                filePart.setBody(value.read())
            else:
                filePart.setBodyDevice(value)
                value.setParent(multiPart)
            multiPart.append(filePart)
        elif isinstance(value, list):
            if not value:
                otherPart = QHttpPart()
                otherPart.setHeader(QNetworkRequest.ContentTypeHeader,
                                    "application/octet-stream")
                otherPart.setHeader(QNetworkRequest.ContentDispositionHeader,
                                    'form-data; name="{0}"'.format(prefix))
                otherPart.setBody(b"")
                multiPart.append(otherPart)
            elif any([isinstance(x, dict) for x in value]):
                for idx, v in enumerate(value):
                    NetworkService.genReqStr(
                        v, (prefix + "." if prefix else "") + str(idx),
                        multiPart)
            else:
                for val in value:
                    logger.debug("serializing param item %r of list value %r",
                                 val, prefix)
                    textPart = QHttpPart()
                    textPart.setHeader(QNetworkRequest.ContentTypeHeader,
                                       "application/octet-stream")
                    textPart.setHeader(
                        QNetworkRequest.ContentDispositionHeader,
                        'form-data; name="{0}"'.format(prefix))
                    textPart.setBody(str(val).encode("utf-8"))
                    multiPart.append(textPart)
        elif isinstance(value, dict):
            if prefix:
                prefix += "."
            for k, v in value.items():
                NetworkService.genReqStr(v, prefix + k, multiPart)
        #elif value is None:
        #return multiPart
        else:
            if value is None:
                value = ""
            otherPart = QHttpPart()
            otherPart.setHeader(QNetworkRequest.ContentTypeHeader,
                                "application/octet-stream")
            otherPart.setHeader(QNetworkRequest.ContentDispositionHeader,
                                'form-data; name="{0}"'.format(prefix))
            otherPart.setBody(str(value).encode("utf-8"))
            multiPart.append(otherPart)
        return multiPart
Пример #8
0
    def startPrint(self):
        global_container_stack = Application.getInstance().getGlobalContainerStack()
        if not global_container_stack:
            return

        if self.jobState not in ["ready", ""]:
            if self.jobState == "offline":
                self._error_message = Message(i18n_catalog.i18nc("@info:status", "OctoPrint is offline. Unable to start a new job."))
            else:
                self._error_message = Message(i18n_catalog.i18nc("@info:status", "OctoPrint is busy. Unable to start a new job."))
            self._error_message.show()
            return

        self._preheat_timer.stop()

        self._auto_print = parseBool(global_container_stack.getMetaDataEntry("octoprint_auto_print", True))
        if self._auto_print:
            Application.getInstance().showPrintMonitor.emit(True)

        try:
            self._progress_message = Message(i18n_catalog.i18nc("@info:status", "Sending data to OctoPrint"), 0, False, -1)
            self._progress_message.addAction("Cancel", i18n_catalog.i18nc("@action:button", "Cancel"), None, "")
            self._progress_message.actionTriggered.connect(self._cancelSendGcode)
            self._progress_message.show()

            ## Mash the data into single string
            single_string_file_data = ""
            last_process_events = time()
            for line in self._gcode:
                single_string_file_data += line
                if time() > last_process_events + 0.05:
                    # Ensure that the GUI keeps updated at least 20 times per second.
                    QCoreApplication.processEvents()
                    last_process_events = time()

            job_name = Application.getInstance().getPrintInformation().jobName.strip()
            if job_name is "":
                job_name = "untitled_print"
            file_name = "%s.gcode" % job_name

            ##  Create multi_part request
            self._post_multi_part = QHttpMultiPart(QHttpMultiPart.FormDataType)

            ##  Create parts (to be placed inside multipart)
            self._post_part = QHttpPart()
            self._post_part.setHeader(QNetworkRequest.ContentDispositionHeader, "form-data; name=\"select\"")
            self._post_part.setBody(b"true")
            self._post_multi_part.append(self._post_part)

            if self._auto_print:
                self._post_part = QHttpPart()
                self._post_part.setHeader(QNetworkRequest.ContentDispositionHeader, "form-data; name=\"print\"")
                self._post_part.setBody(b"true")
                self._post_multi_part.append(self._post_part)

            self._post_part = QHttpPart()
            self._post_part.setHeader(QNetworkRequest.ContentDispositionHeader, "form-data; name=\"file\"; filename=\"%s\"" % file_name)
            self._post_part.setBody(single_string_file_data.encode())
            self._post_multi_part.append(self._post_part)

            destination = "local"
            if parseBool(global_container_stack.getMetaDataEntry("octoprint_store_sd", False)):
                destination = "sdcard"

            url = QUrl(self._api_url + "files/" + destination)

            ##  Create the QT request
            self._post_request = QNetworkRequest(url)
            self._post_request.setRawHeader(self._api_header.encode(), self._api_key.encode())

            ##  Post request + data
            self._post_reply = self._manager.post(self._post_request, self._post_multi_part)
            self._post_reply.uploadProgress.connect(self._onUploadProgress)

            self._gcode = None

        except IOError:
            self._progress_message.hide()
            self._error_message = Message(i18n_catalog.i18nc("@info:status", "Unable to send data to OctoPrint."))
            self._error_message.show()
        except Exception as e:
            self._progress_message.hide()
            Logger.log("e", "An exception occurred in network connection: %s" % str(e))
Пример #9
0
    def _startPrint(self, file_name="cura_file.gcode"):
        self._preheat_timer.stop()
        self._screenShot = utils.take_screenshot()
        try:
            preferences = Application.getInstance().getPreferences()
            preferences.addPreference("mkswifi/autoprint", "True")
            preferences.addPreference("mkswifi/savepath", "")
            # CuraApplication.getInstance().showPrintMonitor.emit(True)
            self._progress_message = Message(
                i18n_catalog.i18nc("@info:status", "Sending data to printer"),
                0,
                False,
                -1,
                i18n_catalog.i18nc("@info:title", "Sending Data"),
                option_text=i18n_catalog.i18nc("@label", "Print jobs"),
                option_state=preferences.getValue("mkswifi/autoprint"))
            self._progress_message.addAction(
                "Cancel", i18n_catalog.i18nc("@action:button", "Cancel"), None,
                "")
            self._progress_message.actionTriggered.connect(
                self._cancelSendGcode)
            self._progress_message.optionToggled.connect(
                self._onOptionStateChanged)
            self._progress_message.show()
            # job_name = Application.getInstance().getPrintInformation().jobName.strip()
            # if job_name is "":
            #     job_name = "untitled_print"
            # job_name = "cura_file"
            # file_name = "%s.gcode" % job_name
            self._last_file_name = file_name
            Logger.log(
                "d", "mks: " + file_name + Application.getInstance().
                getPrintInformation().jobName.strip())

            single_string_file_data = ""
            if self._screenShot:
                single_string_file_data += utils.add_screenshot(
                    self._screenShot, 50, 50, ";simage:")
                single_string_file_data += utils.add_screenshot(
                    self._screenShot, 200, 200, ";;gimage:")
                single_string_file_data += "\r"
            last_process_events = time.time()
            for line in self._gcode:
                single_string_file_data += line
                if time.time() > last_process_events + 0.05:
                    QCoreApplication.processEvents()
                    last_process_events = time.time()

            self._post_multi_part = QHttpMultiPart(QHttpMultiPart.FormDataType)
            self._post_part = QHttpPart()
            # self._post_part.setHeader(QNetworkRequest.ContentTypeHeader, b'application/octet-stream')
            self._post_part.setHeader(
                QNetworkRequest.ContentDispositionHeader,
                "form-data; name=\"file\"; filename=\"%s\"" % file_name)
            self._post_part.setBody(single_string_file_data.encode())
            self._post_multi_part.append(self._post_part)
            post_request = QNetworkRequest(
                QUrl("http://%s/upload?X-Filename=%s" %
                     (self._address, file_name)))
            post_request.setRawHeader(b'Content-Type',
                                      b'application/octet-stream')
            post_request.setRawHeader(b'Connection', b'keep-alive')
            self._post_reply = self._manager.post(post_request,
                                                  self._post_multi_part)
            self._post_reply.uploadProgress.connect(self._onUploadProgress)
            self._post_reply.sslErrors.connect(self._onUploadError)
            # Logger.log("d", "http://%s:80/upload?X-Filename=%s" % (self._address, file_name))
            self._gcode = None
        except IOError as e:
            Logger.log(
                "e",
                "An exception occurred in network connection: %s" % str(e))
            self._progress_message.hide()
            self._error_message = Message(
                i18n_catalog.i18nc("@info:status",
                                   "Send file to printer failed."))
            self._error_message.show()
            self._update_timer.start()
        except Exception as e:
            self._update_timer.start()
            self._progress_message.hide()
            Logger.log(
                "e",
                "An exception occurred in network connection: %s" % str(e))
Пример #10
0
 def uploadfunc(self, filename):
     preferences = Application.getInstance().getPreferences()
     preferences.addPreference("mkswifi/autoprint", "True")
     preferences.addPreference("mkswifi/savepath", "")
     self._update_timer.stop()
     self._isSending = True
     self._preheat_timer.stop()
     single_string_file_data = ""
     try:
         f = open(self._uploadpath, "r")
         single_string_file_data = f.read()
         file_name = filename[filename.rfind("/") + 1:]
         self._last_file_name = file_name
         self._progress_message = Message(
             i18n_catalog.i18nc("@info:status", "Sending data to printer"),
             0,
             False,
             -1,
             i18n_catalog.i18nc("@info:title", "Sending Data"),
             option_text=i18n_catalog.i18nc("@label", "Print jobs"),
             option_state=preferences.getValue("mkswifi/autoprint"))
         self._progress_message.addAction(
             "Cancel", i18n_catalog.i18nc("@action:button", "Cancel"), None,
             "")
         self._progress_message.actionTriggered.connect(
             self._cancelSendGcode)
         self._progress_message.optionToggled.connect(
             self._onOptionStateChanged)
         self._progress_message.show()
         self._post_multi_part = QHttpMultiPart(QHttpMultiPart.FormDataType)
         self._post_part = QHttpPart()
         self._post_part.setHeader(
             QNetworkRequest.ContentDispositionHeader,
             "form-data; name=\"file\"; filename=\"%s\"" % file_name)
         self._post_part.setBody(single_string_file_data.encode())
         self._post_multi_part.append(self._post_part)
         post_request = QNetworkRequest(
             QUrl("http://%s/upload?X-Filename=%s" %
                  (self._address, file_name)))
         post_request.setRawHeader(b'Content-Type',
                                   b'application/octet-stream')
         post_request.setRawHeader(b'Connection', b'keep-alive')
         self._post_reply = self._manager.post(post_request,
                                               self._post_multi_part)
         self._post_reply.uploadProgress.connect(self._onUploadProgress)
         self._post_reply.sslErrors.connect(self._onUploadError)
         self._gcode = None
     except IOError as e:
         Logger.log(
             "e",
             "An exception occurred in network connection: %s" % str(e))
         self._progress_message.hide()
         self._error_message = Message(
             i18n_catalog.i18nc("@info:status",
                                "Send file to printer failed."))
         self._error_message.show()
         self._update_timer.start()
     except Exception as e:
         self._update_timer.start()
         self._progress_message.hide()
         Logger.log(
             "e",
             "An exception occurred in network connection: %s" % str(e))
Пример #11
0
    def startPrint(self):
        global_container_stack = Application.getInstance(
        ).getGlobalContainerStack()
        if not global_container_stack:
            return

        self._auto_print = parseBool(
            global_container_stack.getMetaDataEntry("repetier_auto_print",
                                                    True))
        if self._auto_print:
            Application.getInstance().showPrintMonitor.emit(True)

        if self.jobState != "ready" and self.jobState != "":
            self._error_message = Message(
                i18n_catalog.i18nc(
                    "@info:status",
                    "Repetier-Server is printing. Unable to start a new job."))
            self._error_message.show()
            return
        try:
            self._progress_message = Message(
                i18n_catalog.i18nc("@info:status",
                                   "Sending data to Repetier-Server"), 0,
                False, -1)
            self._progress_message.show()

            ## Mash the data into single string
            single_string_file_data = ""
            last_process_events = time()
            for line in self._gcode:
                single_string_file_data += line
                if time() > last_process_events + 0.05:
                    # Ensure that the GUI keeps updated at least 20 times per second.
                    QCoreApplication.processEvents()
                    last_process_events = time()

            file_name = "%s.gcode" % Application.getInstance(
            ).getPrintInformation().jobName

            ##  Create multi_part request
            self._post_multi_part = QHttpMultiPart(QHttpMultiPart.FormDataType)

            ##  Create parts (to be placed inside multipart)
            # self._post_part = QHttpPart()
            # self._post_part.setHeader(QNetworkRequest.ContentDispositionHeader, "form-data; name=\"select\"")
            # self._post_part.setBody(b"true")
            # self._post_multi_part.append(self._post_part)

            # if self._auto_print:
            #     self._post_part = QHttpPart()
            #     self._post_part.setHeader(QNetworkRequest.ContentDispositionHeader, "form-data; name=\"print\"")
            #     self._post_part.setBody(b"true")
            #     self._post_multi_part.append(self._post_part)

            self._post_part = QHttpPart()
            self._post_part.setHeader(QNetworkRequest.ContentDispositionHeader,
                                      "form-data; filename=\"%s\"" % file_name)
            self._post_part.setBody(single_string_file_data.encode())
            self._post_multi_part.append(self._post_part)

            # destination = "local"
            # if parseBool(global_container_stack.getMetaDataEntry("octoprint_store_sd", False)):
            #     destination = "sdcard"
            # TODO ??

            url = QUrl(self._model_url + "&name=" + file_name)

            ##  Create the QT request
            self._post_request = QNetworkRequest(url)
            self._post_request.setRawHeader(self._api_header.encode(),
                                            self._api_key.encode())

            ##  Post request + data
            self._post_reply = self._manager.post(self._post_request,
                                                  self._post_multi_part)
            self._post_reply.uploadProgress.connect(self._onUploadProgress)

            self._gcode = None

        except IOError:
            self._progress_message.hide()
            self._error_message = Message(
                i18n_catalog.i18nc("@info:status",
                                   "Unable to send data to Repetier-Server."))
            self._error_message.show()
        except Exception as e:
            self._progress_message.hide()
            Logger.log(
                "e",
                "An exception occurred in network connection: %s" % str(e))
Пример #12
0
    def _startPrint(self):
        if self._auto_print and not self._forced_queue:
            Application.getInstance().getController().setActiveStage(
                "MonitorStage")

            # cancel any ongoing preheat timer before starting a print
            try:
                self._printers[0].stopPreheatTimers()
            except AttributeError:
                # stopPreheatTimers was added after Cura 3.3 beta
                pass

        self._progress_message = Message(
            i18n_catalog.i18nc("@info:status", "Sending data to OctoPrint"), 0,
            False, -1)
        self._progress_message.addAction(
            "Cancel", i18n_catalog.i18nc("@action:button", "Cancel"), None, "")
        self._progress_message.actionTriggered.connect(self._cancelSendGcode)
        self._progress_message.show()

        ## Mash the data into single string
        single_string_file_data = ""
        last_process_events = time()
        for line in self._gcode:
            single_string_file_data += line
            if time() > last_process_events + 0.05:
                # Ensure that the GUI keeps updated at least 20 times per second.
                QCoreApplication.processEvents()
                last_process_events = time()

        job_name = Application.getInstance().getPrintInformation(
        ).jobName.strip()
        if job_name is "":
            job_name = "untitled_print"
        file_name = "%s.gcode" % job_name

        ##  Create multi_part request
        self._post_multi_part = QHttpMultiPart(QHttpMultiPart.FormDataType)

        ##  Create parts (to be placed inside multipart)
        post_part = QHttpPart()
        post_part.setHeader(QNetworkRequest.ContentDispositionHeader,
                            "form-data; name=\"select\"")
        post_part.setBody(b"true")
        self._post_multi_part.append(post_part)

        if self._auto_print and not self._forced_queue:
            post_part = QHttpPart()
            post_part.setHeader(QNetworkRequest.ContentDispositionHeader,
                                "form-data; name=\"print\"")
            post_part.setBody(b"true")
            self._post_multi_part.append(post_part)

        post_part = QHttpPart()
        post_part.setHeader(
            QNetworkRequest.ContentDispositionHeader,
            "form-data; name=\"file\"; filename=\"%s\"" % file_name)
        post_part.setBody(single_string_file_data.encode())
        self._post_multi_part.append(post_part)

        destination = "local"
        if self._sd_supported and parseBool(Application.getInstance(
        ).getGlobalContainerStack().getMetaDataEntry("octoprint_store_sd",
                                                     False)):
            destination = "sdcard"

        try:
            ##  Post request + data
            post_request = self._createApiRequest("files/" + destination)
            self._post_reply = self._manager.post(post_request,
                                                  self._post_multi_part)
            self._post_reply.uploadProgress.connect(self._onUploadProgress)

        except IOError:
            self._progress_message.hide()
            self._error_message = Message(
                i18n_catalog.i18nc("@info:status",
                                   "Unable to send data to OctoPrint."))
            self._error_message.show()
        except Exception as e:
            self._progress_message.hide()
            Logger.log(
                "e",
                "An exception occurred in network connection: %s" % str(e))

        self._gcode = []
Пример #13
0
    def _sendRequest(self,
                     path,
                     name=None,
                     data=None,
                     dataIsJSON=False,
                     on_success=None,
                     on_error=None):
        url = self._url + path

        headers = {
            'User-Agent': 'Cura Plugin Moonraker',
            'Accept': 'application/json, text/plain',
            'Connection': 'keep-alive'
        }

        if self._api_key:
            headers['X-API-Key'] = self._api_key

        postData = data
        if data is not None:
            if not dataIsJSON:
                # Create multi_part request
                parts = QHttpMultiPart(QHttpMultiPart.FormDataType)

                part_file = QHttpPart()
                part_file.setHeader(
                    QNetworkRequest.ContentDispositionHeader,
                    QVariant('form-data; name="file"; filename="/' + name +
                             '"'))
                part_file.setHeader(QNetworkRequest.ContentTypeHeader,
                                    QVariant('application/octet-stream'))
                part_file.setBody(data)
                parts.append(part_file)

                part_root = QHttpPart()
                part_root.setHeader(QNetworkRequest.ContentDispositionHeader,
                                    QVariant('form-data; name="root"'))
                part_root.setBody(b"gcodes")
                parts.append(part_root)

                if self._startPrint:
                    part_print = QHttpPart()
                    part_print.setHeader(
                        QNetworkRequest.ContentDispositionHeader,
                        QVariant('form-data; name="print"'))
                    part_print.setBody(b"true")
                    parts.append(part_print)

                headers[
                    'Content-Type'] = 'multipart/form-data; boundary=' + str(
                        parts.boundary().data(), encoding='utf-8')

                postData = parts
            else:
                # postData is JSON
                headers['Content-Type'] = 'application/json'

            self.application.getHttpRequestManager().post(
                url,
                headers,
                postData,
                callback=on_success,
                error_callback=on_error if on_error else self._onNetworkError,
                upload_progress_callback=self._onUploadProgress
                if not dataIsJSON else None)
        else:
            self.application.getHttpRequestManager().get(
                url,
                headers,
                callback=on_success,
                error_callback=on_error if on_error else self._onNetworkError)
    def uploadGCode(self, data):
        try:
            job_name = Application.getInstance().getPrintInformation(
            ).jobName.strip()
            if job_name == "":
                job_name = "untitled_print"

            global_stack = Application.getInstance().getGlobalContainerStack()
            machine_manager = Application.getInstance().getMachineManager()

            cura_printer_type = machine_manager.activeDefinitionId
            printer_type = ConnectPrinterIdTranslation.curaPrinterIdToConnect(
                cura_printer_type)
            # Fall back to marlin or makerbot generic if printer is not supported on WiFi-Box
            if printer_type is None:
                gcode_flavor = global_stack.getProperty(
                    "machine_gcode_flavor", "value")
                if gcode_flavor == "RepRap (Marlin/Sprinter)":
                    printer_type = "marlin_generic"
                elif gcode_flavor == "MakerBot":
                    printer_type = "makerbot_generic"
                else:
                    printer_type = cura_printer_type

            sliceInfo = {
                'printer': {
                    'type': printer_type,
                    'title': global_stack.getName()
                },
                'material': {
                    'type': global_stack.material.getId(),
                    'title': global_stack.material.getName()
                },
                'filamentThickness':
                global_stack.getProperty("material_diameter", "value"),
                'temperature':
                global_stack.getProperty("material_print_temperature",
                                         "value"),
                'name':
                job_name
            }

            gcode_list = getattr(
                Application.getInstance().getController().getScene(),
                "gcode_list")
            gcode = ";%s\n" % json.dumps(sliceInfo)
            for line in gcode_list:
                gcode += line

            multi_part = QHttpMultiPart(QHttpMultiPart.FormDataType)

            for prop_name, prop_value in data["data"]["reservation"][
                    "fields"].items():
                part = QHttpPart()
                part.setHeader(QNetworkRequest.ContentDispositionHeader,
                               "form-data; name=\"%s\"" % prop_name)
                part.setBody(prop_value.encode())
                multi_part.append(part)

            gcode_part = QHttpPart()
            gcode_part.setHeader(QNetworkRequest.ContentDispositionHeader,
                                 "form-data; name=\"file\"")
            gcode_part.setBody(gcode.encode())
            multi_part.append(gcode_part)

            upload_url = QUrl(data["data"]["reservation"]["url"])
            Logger.log("d", "{}", upload_url)

            self._post_reply = self._manager.post(QNetworkRequest(upload_url),
                                                  multi_part)
            self._post_reply.uploadProgress.connect(self._onProgress)
            self._post_reply.error.connect(self._onNetworkError)
            self._progress_message = Message(
                i18n_catalog.i18nc("@info:status",
                                   "Sending data to Doodle3D Connect"), 0,
                False, -1)
            self._progress_message.addAction(
                "Cancel", i18n_catalog.i18nc("@action:button", "Cancel"), None,
                "")
            self._progress_message.actionTriggered.connect(
                self._onMessageActionTriggered)
            self._progress_message.show()
            multi_part.setParent(self._post_reply)
        except Exception as e:
            self._progress_message.hide()
            self._progress_message = Message(
                i18n_catalog.i18nc(
                    "@info:status",
                    "Unable to send data to Doodle3D Connect. Is another job still active?"
                ))
            self._progress_message.show()
            Logger.log(
                "e", "An exception occured during G-code upload: %s" % str(e))
Пример #15
0
    def startPrint(self):
        global_container_stack = Application.getInstance(
        ).getGlobalContainerStack()
        if not global_container_stack:
            return

        self._auto_print = parseBool(
            global_container_stack.getMetaDataEntry("repetier_auto_print",
                                                    True))

        if self.jobState not in ["ready", ""]:
            if self.jobState == "offline":
                self._error_message = Message(
                    i18n_catalog.i18nc(
                        "@info:status",
                        "Repetier is offline. Unable to start a new job."))
            elif self._auto_print:
                self._error_message = Message(
                    i18n_catalog.i18nc(
                        "@info:status",
                        "Repetier is busy. Unable to start a new job."))
            else:
                # allow queueing the job even if Repetier is currently busy if autoprinting is disabled
                self._error_message = None

            if self._error_message:
                self._error_message.show()
                return

        self._preheat_timer.stop()

        if self._auto_print:
            Application.getInstance().showPrintMonitor.emit(True)

        try:
            self._progress_message = Message(
                i18n_catalog.i18nc("@info:status", "Sending data to Repetier"),
                0, False, -1)
            self._progress_message.addAction(
                "Cancel", i18n_catalog.i18nc("@action:button", "Cancel"), None,
                "")
            self._progress_message.actionTriggered.connect(
                self._cancelSendGcode)
            self._progress_message.show()

            ## Mash the data into single string
            single_string_file_data = ""
            last_process_events = time()
            for line in self._gcode:
                single_string_file_data += line
                if time() > last_process_events + 0.05:
                    # Ensure that the GUI keeps updated at least 20 times per second.
                    QCoreApplication.processEvents()
                    last_process_events = time()

            job_name = Application.getInstance().getPrintInformation(
            ).jobName.strip()
            ##Logger.log("d", "debug Print job: [%s]", job_name)
            if job_name is "":
                job_name = "untitled_print"
            file_name = "%s.gcode" % job_name

            ##  Create multi_part request
            self._post_multi_part = QHttpMultiPart(QHttpMultiPart.FormDataType)

            ##  Create parts (to be placed inside multipart)
            self._post_part = QHttpPart()
            self._post_part.setHeader(QNetworkRequest.ContentDispositionHeader,
                                      "form-data; name=\"a\"")
            self._post_part.setBody(b"upload")
            self._post_multi_part.append(self._post_part)

            ##if self._auto_print:
            ##    self._post_part = QHttpPart()
            ##    self._post_part.setHeader(QNetworkRequest.ContentDispositionHeader, "form-data; name=\"%s\"" % file_name)
            ##    self._post_part.setBody(b"upload")
            ##    self._post_multi_part.append(self._post_part)

            self._post_part = QHttpPart()
            self._post_part.setHeader(
                QNetworkRequest.ContentDispositionHeader,
                "form-data; name=\"filename\"; filename=\"%s\"" % file_name)
            self._post_part.setBody(single_string_file_data.encode())
            self._post_multi_part.append(self._post_part)

            self._post_part = QHttpPart()
            self._post_part.setHeader(QNetworkRequest.ContentDispositionHeader,
                                      "form-data; name=\"name\"")
            b = bytes(file_name, 'utf-8')
            self._post_part.setBody(b)
            self._post_multi_part.append(self._post_part)

            destination = "local"
            if self._sd_supported and parseBool(
                    global_container_stack.getMetaDataEntry(
                        "Repetier_store_sd", False)):
                destination = "sdcard"

            ##  Post request + data
            #post_request = self._createApiRequest("files/" + destination)
            post_request = self._createApiRequest("upload")
            self._post_reply = self._manager.post(post_request,
                                                  self._post_multi_part)
            self._post_reply.uploadProgress.connect(self._onUploadProgress)

            self._gcode = None

        except IOError:
            self._progress_message.hide()
            self._error_message = Message(
                i18n_catalog.i18nc("@info:status",
                                   "Unable to send data to Repetier."))
            self._error_message.show()
        except Exception as e:
            self._progress_message.hide()
            Logger.log(
                "e",
                "An exception occurred in network connection: %s" % str(e))