diff --git a/src/octoprint/filemanager/analysis.py b/src/octoprint/filemanager/analysis.py
index cd4ca7fd..8fed445a 100644
--- a/src/octoprint/filemanager/analysis.py
+++ b/src/octoprint/filemanager/analysis.py
@@ -260,6 +260,8 @@ class GcodeAnalysisQueue(AbstractAnalysisQueue):
self._gcode.load(self._current.absolute_path, self._current.printer_profile, throttle=throttle_callback)
result = dict()
+ result["printingArea"] = {"minX" : self._gcode.minX, "minY" : self._gcode.minY, "minZ" : self._gcode.minZ,
+ "maxX" : self._gcode.maxX, "maxY" : self._gcode.maxY, "maxZ" : self._gcode.maxZ}
if self._gcode.totalMoveTimeMinute:
result["estimatedPrintTime"] = self._gcode.totalMoveTimeMinute * 60
if self._gcode.extrusionAmount:
diff --git a/src/octoprint/static/js/app/viewmodels/files.js b/src/octoprint/static/js/app/viewmodels/files.js
index 30da0ada..92d110aa 100644
--- a/src/octoprint/static/js/app/viewmodels/files.js
+++ b/src/octoprint/static/js/app/viewmodels/files.js
@@ -6,6 +6,7 @@ $(function() {
self.loginState = parameters[1];
self.printerState = parameters[2];
self.slicing = parameters[3];
+ self.printerProfiles=parameters[4];
self.isErrorOrClosed = ko.observable(undefined);
self.isOperational = ko.observable(undefined);
@@ -288,7 +289,8 @@ $(function() {
}
OctoPrint.files.select(file.origin, OctoPrint.files.pathForElement(file))
.done(function() {
- if (printAfterLoad) {
+ var withinPrintDimensions = self.evaluatePrintDimensions(file, true);
+ if (withinPrintDimensions && printAfterLoad) {
OctoPrint.job.start();
}
});
@@ -410,6 +412,17 @@ $(function() {
self.getAdditionalData = function(data) {
var output = "";
if (data["gcodeAnalysis"]) {
+ if (data["gcodeAnalysis"]["printingArea"]) {
+ var area = data["gcodeAnalysis"]["printingArea"];
+ var dimensions = {
+ width: area["maxX"] - area["minX"],
+ depth: area["maxY"] - area["minY"],
+ height: area["maxZ"] - area["minZ"]
+ };
+
+ output += gettext("Model Size") + ": " + _.sprintf("%(width).2fmm × %(depth).2fmm × %(height).2fmm", dimensions);
+ output += "
";
+ }
if (data["gcodeAnalysis"]["filament"] && typeof(data["gcodeAnalysis"]["filament"]) == "object") {
var filament = data["gcodeAnalysis"]["filament"];
if (_.keys(filament).length == 1) {
@@ -433,6 +446,80 @@ $(function() {
return output;
};
+ self.evaluatePrintDimensions = function(data, notify) {
+ var printingArea = data["gcodeAnalysis"]["printingArea"];
+ if (!printingArea) {
+ return true;
+ }
+
+ var printerProfile = self.printerProfiles.currentProfileData();
+ if (!printerProfile) {
+ return true;
+ }
+
+ var volumeInfo = printerProfile.volume;
+ if (!volumeInfo) {
+ return true;
+ }
+
+ // set print volume boundaries
+ var boundaries = {
+ minX : 0,
+ maxX : volumeInfo.width(),
+ minY : 0,
+ maxY : volumeInfo.depth(),
+ minZ : 0,
+ maxZ : volumeInfo.height()
+ };
+ if (volumeInfo.origin() == "center") {
+ boundaries["maxX"] = volumeInfo.width() / 2;
+ boundaries["minX"] = -1 * boundaries["maxX"];
+ boundaries["maxY"] = volumeInfo.depth() / 2;
+ boundaries["minY"] = -1 * boundaries["maxY"];
+ }
+
+ // model not within bounds, we need to prepare a warning
+ var warning = "
" + _.sprintf(gettext("Object in %(name)s exceeds the print volume of the currently selected printer profile, be careful when printing this."), data) + "
"; + var info = ""; + + var formatData = { + profile: boundaries, + object: printingArea + }; + + info += _.sprintf(gettext("Object's bounding box: (%(object.minX).2f, %(object.minY).2f, %(object.minZ).2f) × (%(object.maxX).2f, %(object.maxY).2f, %(object.maxZ).2f)"), formatData); + info += "