From eadc796e0112f52f3f4a4ef7b47cedecde6c0819 Mon Sep 17 00:00:00 2001 From: Stefan Dej Date: Sun, 26 Sep 2021 17:32:11 +0200 Subject: [PATCH] Feature: exclude objects (#362) * feature: add exclude objects on the dashboard * chore: fix ts issues from status panel * chore: update gcodeviewer to v2.1.12 * feature: add object selection to gcode viewer Signed-off-by: Stefan Dej --- package-lock.json | 14 ++-- package.json | 2 +- src/components/gcodeviewer/Viewer.vue | 48 ++++++++++- src/components/panels/StatusPanel.vue | 116 +++++++++++++++++++++----- src/locales/en.json | 11 ++- src/store/gui/index.ts | 1 + 6 files changed, 160 insertions(+), 32 deletions(-) diff --git a/package-lock.json b/package-lock.json index c0c28b8e..e1d45b1d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16,7 +16,7 @@ "@codemirror/state": "^0.19.1", "@codemirror/stream-parser": "^0.19.1", "@codemirror/view": "^0.19.1", - "@sindarius/gcodeviewer": "^2.1.11", + "@sindarius/gcodeviewer": "^2.1.12", "axios": "^0.21.1", "core-js": "^3.16.0", "echarts": "^5.1.2", @@ -1980,9 +1980,9 @@ "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==" }, "node_modules/@sindarius/gcodeviewer": { - "version": "2.1.11", - "resolved": "https://registry.npmjs.org/@sindarius/gcodeviewer/-/gcodeviewer-2.1.11.tgz", - "integrity": "sha512-B2qTxf+Tiv6RTIe9HULdqAJfrPIIPmvRtcChZDsjwTnNzmDuP7/l1K0VANgp9+kFvsGSzdFuM72r+auUMZyGsw==", + "version": "2.1.12", + "resolved": "https://registry.npmjs.org/@sindarius/gcodeviewer/-/gcodeviewer-2.1.12.tgz", + "integrity": "sha512-gquHWaNMvInCuV0Wrzy8nM84TD5fysg80kfImL+DqJdw8O7jrtYS3Rd11oVeL9mOMtcmd+HQ99VWI0Bz5xvCZQ==", "dependencies": { "@babylonjs/core": "^4.2.0", "@babylonjs/inspector": "^4.2.0", @@ -21797,9 +21797,9 @@ "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==" }, "@sindarius/gcodeviewer": { - "version": "2.1.11", - "resolved": "https://registry.npmjs.org/@sindarius/gcodeviewer/-/gcodeviewer-2.1.11.tgz", - "integrity": "sha512-B2qTxf+Tiv6RTIe9HULdqAJfrPIIPmvRtcChZDsjwTnNzmDuP7/l1K0VANgp9+kFvsGSzdFuM72r+auUMZyGsw==", + "version": "2.1.12", + "resolved": "https://registry.npmjs.org/@sindarius/gcodeviewer/-/gcodeviewer-2.1.12.tgz", + "integrity": "sha512-gquHWaNMvInCuV0Wrzy8nM84TD5fysg80kfImL+DqJdw8O7jrtYS3Rd11oVeL9mOMtcmd+HQ99VWI0Bz5xvCZQ==", "requires": { "@babylonjs/core": "^4.2.0", "@babylonjs/inspector": "^4.2.0", diff --git a/package.json b/package.json index 06089873..de924c03 100644 --- a/package.json +++ b/package.json @@ -22,7 +22,7 @@ "@codemirror/state": "^0.19.1", "@codemirror/stream-parser": "^0.19.1", "@codemirror/view": "^0.19.1", - "@sindarius/gcodeviewer": "^2.1.11", + "@sindarius/gcodeviewer": "^2.1.12", "axios": "^0.21.1", "core-js": "^3.16.0", "echarts": "^5.1.2", diff --git a/src/components/gcodeviewer/Viewer.vue b/src/components/gcodeviewer/Viewer.vue index a7a06bea..4181ffa6 100644 --- a/src/components/gcodeviewer/Viewer.vue +++ b/src/components/gcodeviewer/Viewer.vue @@ -96,6 +96,9 @@ + + + @@ -260,6 +263,14 @@ export default class Viewer extends Mixins(BaseMixin) { return this.printerIsPrinting && this.sdCardFilePath === this.loadedFile } + get printing_objects() { + return this.$store.state.printer.exclude_object?.objects ?? [] + } + + get excluded_objects() { + return this.$store.state.printer.exclude_object?.excluded_objects ?? [] + } + async init() { let canvasElement = this.$store.state.gcodeviewer?.canvasBackup ?? null @@ -356,6 +367,26 @@ export default class Viewer extends Mixins(BaseMixin) { this.zSlider = this.maxZSlider this.loading = false viewer.setCursorVisiblity(this.showCursor) + viewer.gcodeProcessor.updateFilePosition(viewer.fileSize) + + if (this.loadedFile === this.sdCardFilePath && this.printing_objects.length) { + let objects: any = [] + + this.printing_objects.forEach((object: any) => { + const xValues = object.polygon.map((point: number[]) => point[0]) + const yValues = object.polygon.map((point: number[]) => point[1]) + + objects.push({ + cancelled: this.excluded_objects.includes(object.name), + name: object.name, + x: [Math.min(...xValues), Math.max(...xValues)], + y: [Math.min(...yValues), Math.max(...yValues)], + }) + }) + + viewer.buildObjects.loadObjectBoundaries(objects) + viewer.buildObjects.showObjectSelection(this.showObjectSelection) + } } async fileSelected(e: any) { @@ -423,8 +454,8 @@ export default class Viewer extends Mixins(BaseMixin) { await new Promise((resolve) => setTimeout(resolve, ms)) } - loadCurrentFile() { - this.loadFile('gcodes/' + this.sdCardFilePath) + async loadCurrentFile() { + await this.loadFile('gcodes/' + this.sdCardFilePath) this.loadedFile = this.sdCardFilePath } @@ -532,6 +563,19 @@ export default class Viewer extends Mixins(BaseMixin) { viewer?.toggleTravels(newVal) } + get showObjectSelection(): boolean { + return this.$store.state.gui.gcodeViewer.showObjectSelection ?? false + } + + set showObjectSelection(newVal: boolean) { + this.$store.dispatch('gui/saveSetting', {name: 'gcodeViewer.showObjectSelection', value: newVal}) + } + + @Watch('showObjectSelection') + showObjectSelectionChanged(newVal: boolean) { + viewer?.buildObjects.showObjectSelection(newVal) + } + get hdRendering() { return this.$store.state.gui.gcodeViewer.hdRendering } diff --git a/src/components/panels/StatusPanel.vue b/src/components/panels/StatusPanel.vue index 95daee81..ecf7478f 100644 --- a/src/components/panels/StatusPanel.vue +++ b/src/components/panels/StatusPanel.vue @@ -73,6 +73,43 @@ + + + + + + {{ $t("Panels.StatusPanel.ExcludeObjectHeadline") }} + + + {{ $t("Panels.StatusPanel.ExcludeObjectText", {name: cancelObjectDialog.objectName}) }} + + + {{ $t("Panels.StatusPanel.Cancel") }} + {{ $t("Panels.StatusPanel.ExcludeObject") }} + + + -