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'
}
">
+
+
+
+
+
+
+