diff --git a/src/octoprint/plugins/svgtogcode/static/js/matrix_oven.js b/src/octoprint/plugins/svgtogcode/static/js/matrix_oven.js index dce7235a..478c638e 100644 --- a/src/octoprint/plugins/svgtogcode/static/js/matrix_oven.js +++ b/src/octoprint/plugins/svgtogcode/static/js/matrix_oven.js @@ -70,12 +70,14 @@ Snap.plugin(function (Snap, Element, Paper, global) { // Validity checks from http://www.w3.org/TR/SVG/shapes.html#RectElement: // If 'x' and 'y' are not specified, then set both to 0. // CorelDraw is creating that sometimes - if (!isFinite(x)) + if (!isFinite(x)) { console.log('No attribute "x" in image tag. Assuming 0.') x = 0; - if (!isFinite(y)) + } + if (!isFinite(y)) { console.log('No attribute "y" in image tag. Assuming 0.') y = 0; + } var transform = elem.transform(); var matrix = transform['totalMatrix']; var transformedX = matrix.x(x, y); diff --git a/src/octoprint/plugins/svgtogcode/static/js/working_area.js b/src/octoprint/plugins/svgtogcode/static/js/working_area.js index 24f4d498..6fc20b1c 100644 --- a/src/octoprint/plugins/svgtogcode/static/js/working_area.js +++ b/src/octoprint/plugins/svgtogcode/static/js/working_area.js @@ -345,7 +345,7 @@ $(function(){ dx = -svgBB.x + 0.01; outside = true; } else if(svgBB.x2 > waBB.x2){ - dx = -svgBB.x2 + waBB.x2 - 0.01; + dx = -svgBB.x + 0.01; outside = true; } if(svgBB.y < waBB.y){ @@ -390,7 +390,7 @@ $(function(){ }); }; - + self.placeIMG = function (file) { var url = self._getIMGserveUrl(file); var img = new Image(); @@ -426,10 +426,16 @@ $(function(){ }; self.getUsefulDimensions = function(wpx, hpx){ - var maxWidthMM = wpx * 0.25; // TODO parametrize - var aspectRatio = wpx / hpx; - var destWidthMM = Math.min(self.workingAreaWidthMM() - 2, maxWidthMM); - var destHeightMM = destWidthMM / aspectRatio; + var maxWidthMM = wpx * 0.25; // TODO parametrize + var maxHeightMM = hpx * 0.25; // TODO parametrize + var aspectRatio = wpx / hpx; + var destWidthMM = Math.min(self.workingAreaWidthMM() - 2, maxWidthMM); + var destHeightMM = Math.min(self.workingAreaHeightMM() - 2, maxHeightMM); + if ((destWidthMM / aspectRatio) > destHeightMM) { + destWidthMM = destHeightMM * aspectRatio; + } else { + destHeightMM = destWidthMM / aspectRatio; + } var destWidthPT = self.mm2svgUnits(destWidthMM); var destHeightPT = self.mm2svgUnits(destHeightMM); return [destWidthPT, destHeightPT]; @@ -632,13 +638,13 @@ $(function(){ var userContent = snap.select("#userContent").clone(); compSvg.append(userContent); - + self.renderInfill(compSvg, fillAreas, wMM, hMM, 10, function(svgWithRenderedInfill){ callback( self._wrapInSvgAndScale(svgWithRenderedInfill)); $('#compSvg').remove(); }); }; - + self._wrapInSvgAndScale = function(content){ var svgStr = content.innerSVG(); if(svgStr !== ''){ @@ -721,7 +727,7 @@ $(function(){ self.clear_gcode = function(){ snap.select('#gCodePreview').clear(); }; - + self.onStartup = function(){ self.state.workingArea = self; self.files.workingArea = self; @@ -754,11 +760,16 @@ $(function(){ } }); }; - + self._embedAllImages = function(svg, callback){ - + var allImages = svg.selectAll('image'); - var linkedImages = allImages.items.filter(function(i){ return !i.attr('href').startsWith('data:') }); + var linkedImages = allImages.items.filter(function(i){ + if(i.attr('xlink:href') != null) { + return !i.attr('xlink:href').startsWith('data:'); + } else if(i.attr('href') != null) { + return !i.attr('href').startsWith('data:'); + }}); if(linkedImages.length > 0){ var callbackCounter = linkedImages.length; for (var i = 0; i < linkedImages.length; i++) { @@ -790,7 +801,7 @@ $(function(){ var fillings = userContent.removeUnfilled(fillAreas); for (var i = 0; i < fillings.length; i++) { var item = fillings[i]; - + if (item.type === 'image') { // remove filter effects on images for proper rendering var style = item.attr('style'); diff --git a/src/octoprint/static/js/app/viewmodels/printerstate.js b/src/octoprint/static/js/app/viewmodels/printerstate.js index 85e27832..21a406cc 100644 --- a/src/octoprint/static/js/app/viewmodels/printerstate.js +++ b/src/octoprint/static/js/app/viewmodels/printerstate.js @@ -217,6 +217,8 @@ $(function() { $("#confirmation_dialog .confirmation_dialog_acknowledge").click( function (e) { if (typeof callback === 'function') { + self.resetOverrideSlider(); + self.numberOfPasses(1); callback(e); $("#confirmation_dialog").modal("hide"); $("#confirmation_dialog .confirmation_dialog_message").html(''); @@ -286,8 +288,14 @@ $(function() { self.onEventRealTimeState = function(payload){ self.currentPos({x: payload.wx, y: payload.wy}); }; - - + + self.intensityOverride.subscribe(function(factor){ + self._overrideCommand("/intensity "+factor); + }); + self.feedrateOverride.subscribe(function(factor){ + self._overrideCommand("/feedrate "+factor); + }); + self._overrideCommand = function(command, callback) { $.ajax({ url: API_BASEURL + "printer/command", @@ -302,34 +310,30 @@ $(function() { } }); }; - + self._configureOverrideSliders = function() { self.intensityOverrideSlider = $("#intensity_override_slider").slider({ step: 1, min: 10, max: 200, value: 100, - tooltip: 'hide' - }).on("slide", function(ev){ - self.intensityOverride(ev.value); +// tooltip: 'hide' }).on("slideStop", function(ev){ - self._overrideCommand("/intensity "+self.intensityOverride()); + self.intensityOverride(ev.value); }); - + self.feedrateOverrideSlider = $("#feedrate_override_slider").slider({ step: 1, min: 10, max: 200, value: 100, - tooltip: 'hide' - }).on("slide", function(ev){ - self.feedrateOverride(ev.value); +// tooltip: 'hide' }).on("slideStop", function(ev){ - self._overrideCommand("/feedrate "+self.feedrateOverride()); + self.feedrateOverride(ev.value); }); }; - + self.increasePasses = function(){ self.numberOfPasses(self.numberOfPasses()+1); self._jobCommand("incpasses"); @@ -339,17 +343,21 @@ $(function() { self.numberOfPasses(passes); self._jobCommand("degpasses"); } - + self.onEventPrintDone = function(){ - self.feedrateOverrideSlider.slider('setValue', 100); + self.resetOverrideSlider(); + }; + + self.onStartup = function() { + self._configureOverrideSliders(); + }; + + self.resetOverrideSlider = function() { + self.feedrateOverrideSlider.slider('setValue', 100); self.intensityOverrideSlider.slider('setValue', 100); self.intensityOverride(100); self.feedrateOverride(100); }; - - self.onStartup = function() { - self._configureOverrideSliders(); - }; } OCTOPRINT_VIEWMODELS.push([ diff --git a/src/octoprint/util/comm_acc2.py b/src/octoprint/util/comm_acc2.py index ee16a541..bb1556a3 100644 --- a/src/octoprint/util/comm_acc2.py +++ b/src/octoprint/util/comm_acc2.py @@ -84,6 +84,8 @@ class MachineCom(object): self._actual_intensity = None self._feedrate_dict = {} self._intensity_dict = {} + self._passes = 1 + self._finished_passes = 0 # regular expressions self._regex_command = re.compile("^\s*\$?([GM]\d+|[TH])") @@ -164,8 +166,15 @@ class MachineCom(object): if cmd is not None: self.sendCommand(cmd) self._callback.on_comm_progress() - elif len(self._acc_line_buffer) == 0: - self._set_print_finished() + else: + if self._finished_passes >= self._passes: + if len(self._acc_line_buffer) == 0: + self._set_print_finished() + self._currentFile.resetToBeginning() + cmd = self._getNext() + if cmd is not None: + self.sendCommand(cmd) + self._callback.on_comm_progress() self._sendCommand() self._send_event.wait(1) @@ -311,7 +320,9 @@ class MachineCom(object): if self._finished_currentFile is False: line = self._currentFile.getNext() if line is None: - self._finished_currentFile = True + self._finished_passes += 1 + if self._finished_passes >= self._passes: + self._finished_currentFile = True return line else: return None @@ -830,6 +841,12 @@ class MachineCom(object): if self._currentFile is None: raise ValueError("No file selected for printing") + # reset feedrate and intesity factor in case they where changed in a previous run + self._feedrate_factor = 1 + self._intensity_factor = 1 + self._passes = 1 + self._finished_passes = 0 + try: # ensure fan is on whatever gcode follows. self.sendCommand("M08") @@ -900,10 +917,12 @@ class MachineCom(object): eventManager().fire(Events.PRINT_PAUSED, payload) def increasePasses(self): - self._log("increase Passes") + self._passes += 1 + self._log("increased Passes to %d" % self._passes) def degreasePasses(self): - self._log("degrease Passes") + self._passes -= 1 + self._log("degrease Passes to %d" % self._passes) def getStateString(self): if self._state == self.STATE_NONE: @@ -1167,6 +1186,12 @@ class PrintingGcodeFileInformation(PrintingFileInformation): pass self._handle = None + def resetToBeginning(self): + """ + resets the file handle so you can read from the beginning again. + """ + self._handle = open(self._filename, "r") + def getNext(self): """ Retrieves the next line for printing.