MinMax3D type for tracking printing area & include dimensions in analysis
This commit is contained in:
parent
5a9852e7b8
commit
66792da5bc
3 changed files with 59 additions and 23 deletions
|
|
@ -260,8 +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}
|
||||
result["printingArea"] = self._gcode.printing_area
|
||||
result["dimensions"] = self._gcode.dimensions
|
||||
if self._gcode.totalMoveTimeMinute:
|
||||
result["estimatedPrintTime"] = self._gcode.totalMoveTimeMinute * 60
|
||||
if self._gcode.extrusionAmount:
|
||||
|
|
|
|||
|
|
@ -541,14 +541,8 @@ $(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"]
|
||||
};
|
||||
|
||||
if (data["gcodeAnalysis"]["dimensions"]) {
|
||||
var dimensions = data["gcodeAnalysis"]["dimensions"];
|
||||
output += gettext("Model Size") + ": " + _.sprintf("%(width).2fmm × %(depth).2fmm × %(height).2fmm", dimensions);
|
||||
output += "<br>";
|
||||
}
|
||||
|
|
|
|||
|
|
@ -115,6 +115,42 @@ class Vector3D(object):
|
|||
return "Scalar3D(x={}, y={}, z={}, length={})".format(self.x, self.y, self.z, self.length)
|
||||
|
||||
|
||||
class MinMax3D(object):
|
||||
"""
|
||||
Tracks minimum and maximum of recorded values
|
||||
|
||||
Examples:
|
||||
|
||||
>>> minmax = MinMax3D()
|
||||
>>> minmax.record(Scalar3D(2.0, 2.0, 2.0))
|
||||
>>> minmax.min.x == 2.0 == minmax.max.x and minmax.min.y == 2.0 == minmax.max.y and minmax.min.z == 2.0 == minmax.max.z
|
||||
True
|
||||
>>> minmax.record(Scalar3D(1.0, 2.0, 3.0))
|
||||
>>> minmax.min.x == 1.0 and minmax.min.y == 2.0 and minmax.min.z == 2.0
|
||||
True
|
||||
>>> minmax.max.x == 2.0 and minmax.max.y == 2.0 and minmax.max.z == 3.0
|
||||
True
|
||||
>>> minmax.size == Scalar3D(1.0, 0.0, 1.0)
|
||||
True
|
||||
"""
|
||||
|
||||
def __init__(self):
|
||||
self.min = Vector3D(None, None, None)
|
||||
self.max = Vector3D(None, None, None)
|
||||
|
||||
def record(self, coordinate):
|
||||
for c in ("x", "y", "z"):
|
||||
current_min = getattr(self.min, c)
|
||||
current_max = getattr(self.max, c)
|
||||
value = getattr(coordinate, c)
|
||||
setattr(self.min, c, value if current_min is None or value < current_min else current_min)
|
||||
setattr(self.max, c, value if current_max is None or value > current_max else current_max)
|
||||
|
||||
@property
|
||||
def size(self):
|
||||
return abs(self.max - self.min)
|
||||
|
||||
|
||||
class AnalysisAborted(Exception):
|
||||
pass
|
||||
|
||||
|
|
@ -130,13 +166,23 @@ class gcode(object):
|
|||
self.progressCallback = None
|
||||
self._abort = False
|
||||
self._filamentDiameter = 0
|
||||
#Parameters for object size check
|
||||
self.minX=None
|
||||
self.minY=None
|
||||
self.minZ=None
|
||||
self.maxX=None
|
||||
self.maxY=None
|
||||
self.maxZ=None
|
||||
self._minMax = MinMax3D()
|
||||
|
||||
@property
|
||||
def dimensions(self):
|
||||
size = self._minMax.size
|
||||
return dict(width=size.x,
|
||||
depth=size.y,
|
||||
height=size.z)
|
||||
|
||||
@property
|
||||
def printing_area(self):
|
||||
return dict(minX=self._minMax.min.x,
|
||||
minY=self._minMax.min.y,
|
||||
minZ=self._minMax.min.z,
|
||||
maxX=self._minMax.max.x,
|
||||
maxY=self._minMax.max.y,
|
||||
maxZ=self._minMax.max.z)
|
||||
|
||||
def load(self, filename, printer_profile, throttle=None):
|
||||
if os.path.isfile(filename):
|
||||
|
|
@ -246,12 +292,8 @@ class gcode(object):
|
|||
e -= currentE[currentExtruder]
|
||||
# If move includes extrusion, calculate new min/max coordinates of model
|
||||
if e > 0.0:
|
||||
self.minX = pos[0] if self.minX is None or pos[0] < self.minX else self.minX
|
||||
self.maxX = pos[0] if self.maxX is None or pos[0] > self.maxX else self.maxX
|
||||
self.minY = pos[1] if self.minY is None or pos[1] < self.minY else self.minY
|
||||
self.maxY = pos[1] if self.maxY is None or pos[1] > self.maxY else self.maxY
|
||||
self.minZ = pos[2] if self.minZ is None or pos[2] < self.minZ else self.minZ
|
||||
self.maxZ = pos[2] if self.maxZ is None or pos[2] > self.maxZ else self.maxZ
|
||||
# extrusion -> relevant for print area & dimensions
|
||||
self._minMax.record(pos)
|
||||
totalExtrusion[currentExtruder] += e
|
||||
currentE[currentExtruder] += e
|
||||
maxExtrusion[currentExtruder] = max(maxExtrusion[currentExtruder],
|
||||
|
|
|
|||
Loading…
Reference in a new issue