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..ecc660b5 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);
@@ -423,6 +424,82 @@ $(function() {
}
}
output += gettext("Estimated Print Time") + ": " + formatDuration(data["gcodeAnalysis"]["estimatedPrintTime"]) + "
";
+ if (self.loginState.isUser())
+ {
+ var profileItems=self.printerProfiles.profiles.items();
+ var count=0;
+ while(count < profileItems.length && !profileItems[count].current)
+ {
+ count++;
+ }
+ if (count < profileItems.length)
+ {
+ var warn=false;
+ var volumeInfo=profileItems[count].volume;
+ var printingArea=data["gcodeAnalysis"]["printingArea"];
+ if(volumeInfo.origin=="lowerleft")
+ {
+ if(printingArea["maxX"]>volumeInfo.width || printingArea["maxY"]>volumeInfo.depth ||
+ printingArea["maxZ"]>volumeInfo.height)
+ {
+ warn=true;
+ }
+ }
+ else //origin is centre
+ {
+ if( printingArea["maxX"]>(volumeInfo.width/2) || printingArea["maxY"]>(volumeInfo.depth/2) ||
+ printingArea["maxZ"]>volumeInfo.height || Math.abs(printingArea["minX"])>(volumeInfo.width/2) ||
+ Math.abs(printingArea["minY"])>(volumeInfo.depth/2))
+ {
+ warn=true;
+ }
+ }
+ }
+ if(warn)
+ {
+ var warning = "
" + _.sprintf(gettext("Revise file %s"), data["name"]) + "
"; + var info=""; + + // 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"]; + } + + // find exceeded dimensions + if (printingArea["minX"] < boundaries["minX"] || printingArea["maxX"] > boundaries["maxX"]) { + info += _.sprintf(gettext("Profile's width: ( %s, %s) vs object's width: (%s, %s)\n"), boundaries["minX"], + boundaries["maxX"],printingArea["minX"], printingArea["maxX"]); + } + if (printingArea["minY"] < boundaries["minY"] || printingArea["maxY"] > boundaries["maxY"]) { + info += _.sprintf(gettext("Profile's depth: (%s, %s) vs object's depth: (%s, %s)\n"),boundaries["minY"], + boundaries["maxY"], printingArea["minY"], printingArea["maxY"]); + } + if (printingArea["minZ"] < boundaries["minZ"] || printingArea["maxZ"] > boundaries["maxZ"]) { + info += _.sprintf(gettext("Profile's height: (%s, %s) vs object's height: (%s, %s)\n"),boundaries["minZ"], + boundaries["maxZ"], printingArea["minZ"], printingArea["maxZ"]); + } + + //warn user + warning += pnotifyAdditionalInfo("" + info + ""); + new PNotify({ + title: "Object exceeds the printing area", + text: warning, + type: "warning", + hide: false + }); + } + } } if (data["prints"] && data["prints"]["last"]) { output += gettext("Last Printed") + ": " + formatTimeAgo(data["prints"]["last"]["date"]) + "