diff --git a/src/octoprint/filemanager/__init__.py b/src/octoprint/filemanager/__init__.py index 4e427fe0..5e232d59 100644 --- a/src/octoprint/filemanager/__init__.py +++ b/src/octoprint/filemanager/__init__.py @@ -24,8 +24,10 @@ def full_extension_tree(): result = dict( # extensions for 3d model files model=dict( - stl=["svg"] + stl=["svg"], + image=['jpg', 'jpeg', 'png', 'gif', 'bmp', 'pcx', 'webp'] ), + # extensions for printable machine code machinecode=dict( gcode=["gcode", "gco", "g", "nc"] diff --git a/src/octoprint/plugins/svgtogcode/static/js/working_area.js b/src/octoprint/plugins/svgtogcode/static/js/working_area.js index c164bf09..936f1d04 100644 --- a/src/octoprint/plugins/svgtogcode/static/js/working_area.js +++ b/src/octoprint/plugins/svgtogcode/static/js/working_area.js @@ -111,7 +111,7 @@ $(function(){ url: API_BASEURL + "printer/printhead", type: "POST", dataType: "json", - contentType: "application/json; charset=UTF-8", + contentType: "application/json; charset=UTF8", data: JSON.stringify({"command": "position", x:x, y:y}) }); } @@ -387,6 +387,49 @@ $(function(){ }; + self.placeIMG = function (file) { + var url = self._getIMGserveUrl(file); + var img = new Image(); + img.onload = function () { + + var wpx = this.width; + var hpx = this.height; + + var dimPT = self.getUsefulDimensions(wpx, hpx); + var wPT = dimPT[0]; + var hPT = dimPT[1]; + + var y = self.mm2svgUnits(self.workingAreaHeightMM()) - hPT; + var newImg = snap.image(url, 0, y, wPT, hPT); + var id = self.getEntryId(file); + var previewId = self.generateUniqueId(id); // appends # if multiple times the same design is placed. + newImg.attr({id: previewId, filter: 'url(#grayscale_filter)'}); + snap.select("#userContent").append(newImg); + newImg.transformable(); + newImg.ftRegisterCallback(self.svgTransformUpdate); + file.id = previewId; + file.previewId = previewId; + file.url = url; + file.subtype = "bitmap"; + self.placedDesigns.push(file); + }; + img.src = url; + }; + + self.removeIMG = function(file){ + self.removeSVG(file); + }; + + self.getUsefulDimensions = function(wpx, hpx){ + var maxWidthMM = wpx * 0.25; // TODO parametrize + var aspectRatio = wpx / hpx; + var destWidthMM = Math.min(self.workingAreaWidthMM(), 100, maxWidthMM); + var destHeightMM = destWidthMM / aspectRatio; + var destWidthPT = self.mm2svgUnits(destWidthMM); + var destHeightPT = self.mm2svgUnits(destHeightMM); + return [destWidthPT, destHeightPT]; + }; + self.getDocumentDimensionsInPt = function(doc_width, doc_height, doc_viewbox){ if(doc_width === null){ // assume defaults if not set @@ -426,7 +469,7 @@ $(function(){ }; self.getDocumentViewBoxMatrix = function(widthStr, heightStr, vbox){ - var dim = self.getDocumentDimensionsInPt(widthStr, heightStr, vbox) + var dim = self.getDocumentDimensionsInPt(widthStr, heightStr, vbox); if(vbox !== null ){ var widthPx = dim[0]; var heightPx = dim[1]; @@ -488,13 +531,23 @@ $(function(){ } }; + + self._getIMGserveUrl = function(file){ + return self._getSVGserveUrl(file); + }; self.templateFor = function(data) { - var extension = data.name.split('.').pop().toLowerCase(); - if (extension === "svg") { - return "wa_template_" + data.type + "_svg"; + if(data.type === "model" || data.type === "machinecode"){ + var extension = data.name.split('.').pop().toLowerCase(); + if (extension === "svg") { + return "wa_template_" + data.type + "_svg"; + } else if (_.contains(['jpg', 'jpeg', 'png', 'gif', 'bmp', 'pcx', 'webp'], extension)) { + return "wa_template_" + data.type + "_img"; + } else { + return "wa_template_" + data.type; + } } else { - return "wa_template_" + data.type; + return "wa_template_dummy"; } }; diff --git a/src/octoprint/server/__init__.py b/src/octoprint/server/__init__.py index ab5b4f69..7ba71f6e 100644 --- a/src/octoprint/server/__init__.py +++ b/src/octoprint/server/__init__.py @@ -606,7 +606,7 @@ class Server(): (r"/downloads/files/local/(.*)", util.tornado.LargeResponseHandler, dict(path=s.getBaseFolder("uploads"), as_attachment=True, path_validation=util.tornado.path_validation_factory(lambda path: not os.path.basename(path).startswith("."), status_code=404))), (r"/downloads/logs/([^/]*)", util.tornado.LargeResponseHandler, dict(path=s.getBaseFolder("logs"), as_attachment=True, access_validation=util.tornado.access_validation_factory(app, loginManager, util.flask.admin_validator))), # serve instead of downloads for preview // as_attachment=False - (r"/serve/files/local/([^/]*\.(gco|gcode|g|nc|svg))", util.tornado.LargeResponseHandler, dict(path=s.getBaseFolder("uploads"), as_attachment=False)), + (r"/serve/files/local/([^/]*\.(gco|gcode|g|nc|svg|jpg|jpeg|png|gif|bmp|pcx|webp))", util.tornado.LargeResponseHandler, dict(path=s.getBaseFolder("uploads"), as_attachment=False)), # camera snapshot (r"/downloads/camera/current", util.tornado.UrlForwardHandler, dict(url=s.get(["webcam", "snapshot"]), as_attachment=True, access_validation=util.tornado.access_validation_factory(app, loginManager, util.flask.user_validator))), # generated webassets diff --git a/src/octoprint/static/js/app/viewmodels/files.js b/src/octoprint/static/js/app/viewmodels/files.js index 20d025f6..45fe0290 100644 --- a/src/octoprint/static/js/app/viewmodels/files.js +++ b/src/octoprint/static/js/app/viewmodels/files.js @@ -245,12 +245,26 @@ $(function() { return data["prints"]["last"]["success"] ? "text-success" : "text-error"; }; +// self.templateFor = function(data) { +// var extension = data.name.split('.').pop().toLowerCase(); +// if (extension === "svg") { +// return "files_template_" + data.type + "_svg"; +// } else { +// return "files_template_" + data.type; +// } +// }; self.templateFor = function(data) { - var extension = data.name.split('.').pop().toLowerCase(); - if (extension === "svg") { - return "files_template_" + data.type + "_svg"; + if(data.type === "model" || data.type === "machinecode"){ + var extension = data.name.split('.').pop().toLowerCase(); + if (extension === "svg") { + return "files_template_" + data.type + "_svg"; + } else if (_.contains(['jpg', 'jpeg', 'png', 'gif', 'bmp', 'pcx', 'webp'], extension)) { + return "files_template_" + data.type + "_img"; + } else { + return "files_template_" + data.type; + } } else { - return "files_template_" + data.type; + return "files_template_dummy"; } }; diff --git a/src/octoprint/templates/mrbeam_index.jinja2 b/src/octoprint/templates/mrbeam_index.jinja2 index 7c30a232..a35430d6 100644 --- a/src/octoprint/templates/mrbeam_index.jinja2 +++ b/src/octoprint/templates/mrbeam_index.jinja2 @@ -220,6 +220,31 @@ + + @@ -241,6 +266,9 @@ height: workingAreaHeightPx()+'px' } "> + + + + + + +