diff --git a/src/octoprint/plugins/svgtogcode/static/css/mrbeam.css b/src/octoprint/plugins/svgtogcode/static/css/mrbeam.css index 2bdfe20b..ec78e016 100644 --- a/src/octoprint/plugins/svgtogcode/static/css/mrbeam.css +++ b/src/octoprint/plugins/svgtogcode/static/css/mrbeam.css @@ -1160,6 +1160,7 @@ ul.dropdown-menu li a { #control_zaxis { display:inline-block; width: 80px; + margin: 1em auto 0; } #control_zaxis_focus { display:inline-block; @@ -1541,7 +1542,7 @@ td.settings_printerProfiles_profiles_action a.disabled { .nav-pills>li>a, select, textarea, -input, +input, input[type="text"], input[type="password"], input[type="datetime"], input[type="datetime-local"], input[type="date"], input[type="month"], input[type="time"], input[type="week"], input[type="number"], input[type="email"], input[type="url"], input[type="search"], input[type="tel"], input[type="color"], input.search-query, .uneditable-input, .input-append .add-on:last-child, diff --git a/src/octoprint/plugins/svgtogcode/static/css/svgtogcode.css b/src/octoprint/plugins/svgtogcode/static/css/svgtogcode.css index a7a6e0a2..80134add 100644 --- a/src/octoprint/plugins/svgtogcode/static/css/svgtogcode.css +++ b/src/octoprint/plugins/svgtogcode/static/css/svgtogcode.css @@ -102,3 +102,28 @@ svg text { .overrideSlider span { padding-left: .6em; } + +.repeatGcode .btn-group { + width: 145px; +} +.repeatGcode input, .repeatGcode button { + width: 33%; +} + +.repeatGcode input { + margin-bottom:0; + padding-left: 0; + padding-right: 0; + text-align: center; +} +.repeatGcode>span { + padding-left: .6em; +} + +.manual_position_input { + padding-top: 12px; +} + +#manual_position.warning { + color: #DD0000; +} \ No newline at end of file diff --git a/src/octoprint/plugins/svgtogcode/static/js/working_area.js b/src/octoprint/plugins/svgtogcode/static/js/working_area.js index 41fe67c4..8c320b95 100644 --- a/src/octoprint/plugins/svgtogcode/static/js/working_area.js +++ b/src/octoprint/plugins/svgtogcode/static/js/working_area.js @@ -450,10 +450,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]; diff --git a/src/octoprint/printer/standard.py b/src/octoprint/printer/standard.py index 5fee8558..a10580dd 100644 --- a/src/octoprint/printer/standard.py +++ b/src/octoprint/printer/standard.py @@ -433,6 +433,22 @@ class Printer(PrinterInterface, comm.MachineComPrintCallback): payload["origin"] = FileDestinations.SDCARD eventManager().fire(Events.PRINT_FAILED, payload) + def increase_passes(self): + """ + increase the number of passes by one. + """ + if self._comm is None: + return + self._comm.increasePasses() + + def degrease_passes(self): + """ + degrease the number of passes by one. + """ + if self._comm is None: + return + self._comm.degreasePasses() + def get_state_string(self): """ Returns a human readable string corresponding to the current communication state. diff --git a/src/octoprint/server/api/job.py b/src/octoprint/server/api/job.py index b2d9b02e..65f4143a 100644 --- a/src/octoprint/server/api/job.py +++ b/src/octoprint/server/api/job.py @@ -23,7 +23,9 @@ def controlJob(): "start": [], "restart": [], "pause": [], - "cancel": [] + "cancel": [], + "incpasses": [], + "degpasses": [] } command, data, response = get_json_command_from_request(request, valid_commands) @@ -48,6 +50,15 @@ def controlJob(): if not activePrintjob: return make_response("Printer is neither printing nor paused, 'cancel' command cannot be performed", 409) printer.cancel_print() + elif command == "incpasses": + if not activePrintjob: + return make_response("Printer is neither printing nor paused, 'incpasses' command cannot be performed", 409) + printer.increase_passes() + elif command == "degpasses": + if not activePrintjob: + return make_response("Printer is neither printing nor paused, 'degpasses' command cannot be performed", 409) + printer.degrease_passes() + return NO_CONTENT diff --git a/src/octoprint/static/js/app/viewmodels/control.js b/src/octoprint/static/js/app/viewmodels/control.js index cf3b18bf..9441c269 100644 --- a/src/octoprint/static/js/app/viewmodels/control.js +++ b/src/octoprint/static/js/app/viewmodels/control.js @@ -404,6 +404,11 @@ $(function() { self.onStartup = function () { self.requestData(); self._configureJogDistanceSlider(); + $('#manual_position').keyup(function(e) { + if (e.which === 13){ // 13 == enter + self.manualPosition(); + } + }); }; self.updateRotatorWidth = function() { @@ -606,6 +611,24 @@ $(function() { self.setCoordinateOrigin = function () { self.sendCustomCommand({type: 'command', command: "G92 X0 Y0"}); }; + + self.manualPosition = function(){ + $('#manual_position').removeClass('warning'); + var s = $('#manual_position').val(); + var tmp = s.split(/[^0-9.,-\\+]+/); + if (tmp.length === 2) { + var x = parseFloat(tmp[0]); + var y = parseFloat(tmp[1]); + if(!isNaN(x) && !isNaN(y)) { + self.sendCustomCommand({type: 'command', command: "G0X"+x+"Y"+y}); + $('#manual_position').val(''); + } else { + $('#manual_position').addClass('warning'); + } + } else { + $('#manual_position').addClass('warning'); + } + }; self.jogDistanceInMM = ko.observable(undefined); diff --git a/src/octoprint/static/js/app/viewmodels/printerstate.js b/src/octoprint/static/js/app/viewmodels/printerstate.js index b6b8f6d5..21a406cc 100644 --- a/src/octoprint/static/js/app/viewmodels/printerstate.js +++ b/src/octoprint/static/js/app/viewmodels/printerstate.js @@ -38,6 +38,7 @@ $(function() { self.feedrateOverride = ko.observable(100); self.intensityOverride.extend({ rateLimit: 500 }); self.feedrateOverride.extend({ rateLimit: 500 }); + self.numberOfPasses = ko.observable(1); self.TITLE_PRINT_BUTTON_PAUSED = gettext("Restarts the print job from the beginning"); self.TITLE_PRINT_BUTTON_UNPAUSED = gettext("Starts the print job"); @@ -216,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(''); @@ -285,14 +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", @@ -307,7 +310,7 @@ $(function() { } }); }; - + self._configureOverrideSliders = function() { self.intensityOverrideSlider = $("#intensity_override_slider").slider({ step: 1, @@ -318,7 +321,7 @@ $(function() { }).on("slideStop", function(ev){ self.intensityOverride(ev.value); }); - + self.feedrateOverrideSlider = $("#feedrate_override_slider").slider({ step: 1, min: 10, @@ -330,17 +333,31 @@ $(function() { }); }; - + + self.increasePasses = function(){ + self.numberOfPasses(self.numberOfPasses()+1); + self._jobCommand("incpasses"); + } + self.decreasePasses = function(){ + var passes = Math.max(self.numberOfPasses()-1, 1); + 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/templates/mrbeam_index.jinja2 b/src/octoprint/templates/mrbeam_index.jinja2 index 86b64cdf..3e6ec539 100644 --- a/src/octoprint/templates/mrbeam_index.jinja2 +++ b/src/octoprint/templates/mrbeam_index.jinja2 @@ -123,6 +123,10 @@
+
+ + +
@@ -168,6 +172,19 @@ 100% Feedrate +
+
+ + + +
+ Passes + +