diff --git a/src/components/inputs/MoveToInput.vue b/src/components/inputs/MoveToInput.vue new file mode 100644 index 000000000..e2d581fe1 --- /dev/null +++ b/src/components/inputs/MoveToInput.vue @@ -0,0 +1,103 @@ +<template> + <v-text-field + v-model="position" + :label="`[ ${label} ]`" + :suffix="suffix" + :disabled="disabled" + :readonly="readonly" + :error="!validate" + hide-details="auto" + type="number" + hide-spin-buttons + outlined + reverse + dense + @blur="onBlur" + @focus="!readonly ? $event.target.select() : {}"> + <template v-if="errorMsg.length" #append> + <v-tooltip top> + <template #activator="{ on, attrs }"> + <v-icon color="error" v-bind="attrs" v-on="on">{{ mdiAlert }}</v-icon> + </template> + <span>{{ errorMsg.join(', ') }}</span> + </v-tooltip> + </template> + </v-text-field> +</template> + +<script lang="ts"> +import { Component, Mixins, Prop, VModel } from 'vue-property-decorator' +import BaseMixin from '@/components/mixins/base' +import { mdiAlert } from '@mdi/js' + +@Component({ + components: {}, +}) +export default class MoveToInput extends Mixins(BaseMixin) { + mdiAlert = mdiAlert + + @VModel({ type: String }) + declare position: string + + @Prop({ type: String, required: true }) + declare readonly currentPos: string + + @Prop({ type: String, required: false }) + declare readonly label: string + + @Prop({ type: String, required: false }) + declare readonly suffix: string + + @Prop({ type: Number, required: true }) + declare readonly positionMax: number + + @Prop({ type: Number, required: true }) + declare readonly positionMin: number + + @Prop({ type: Boolean, required: false }) + declare readonly disabled: boolean + + @Prop({ type: Boolean, required: false }) + declare readonly readonly: boolean + + onBlur() { + if (!this.validate && this.position !== this.currentPos) { + this.position = this.currentPos + this.$emit('validate', { axis: this.suffix.toLowerCase(), valid: true }) + } + } + + get validate(): boolean { + const isValid = + this.position !== '' && + parseFloat(this.position) <= this.positionMax && + parseFloat(this.position) >= this.positionMin + this.$emit('validate', { axis: this.suffix.toLowerCase(), valid: isValid }) + return isValid + } + + get errorMsg() { + const errors = [] + if (this.position === '') errors.push(this.$t('Panels.ToolheadControlPanel.Invalid')) + if (parseFloat(this.position) > this.positionMax || parseFloat(this.position) < this.positionMin) + errors.push(this.$t('Panels.ToolheadControlPanel.OutOfRange')) + + return errors + } +} +</script> + +<style> +label { + font-size: 14px !important; + color: rgba(255, 255, 255, 0.5) !important; +} + +.v-input.error--text .v-input__slot { + padding-left: 3px !important; +} + +.v-input.error--text .v-input__append-inner { + margin-right: 5px !important; +} +</style> diff --git a/src/components/inputs/NumberInput.vue b/src/components/inputs/NumberInput.vue index c89ab6fec..2d7a747bd 100644 --- a/src/components/inputs/NumberInput.vue +++ b/src/components/inputs/NumberInput.vue @@ -105,7 +105,7 @@ export default class NumberInput extends Mixins(BaseMixin) { @Prop({ type: Number, required: false, default: 1 }) declare readonly step: number - @Prop({ type: String, required: true }) + @Prop({ type: String, required: false }) declare readonly unit: string // spinner related props diff --git a/src/components/mixins/control.ts b/src/components/mixins/control.ts index 0bc9d0a0b..30dd0f7f1 100644 --- a/src/components/mixins/control.ts +++ b/src/components/mixins/control.ts @@ -11,6 +11,10 @@ export default class ControlMixin extends Vue { return this.$store.state.printer?.toolhead?.homed_axes ?? '' } + get enableXYHoming(): boolean { + return this.$store.state.gui.control.enableXYHoming + } + get feedrateXY() { return this.$store.state.gui.control?.feedrateXY ?? 100 } @@ -20,19 +24,27 @@ export default class ControlMixin extends Vue { } get existsQGL() { - if (!this.$store.state.printer.configfile?.settings) { - return false - } - - return 'quad_gantry_level' in this.$store.state.printer.configfile.settings ?? false + return this.$store.getters['printer/existsQGL'] } get existsZtilt() { - if (!this.$store.state.printer.configfile?.settings) { - return false - } + return this.$store.getters['printer/existsZtilt'] + } + + get existsBedTilt() { + return this.$store.getters['printer/existsBedTilt'] + } + + get existsBedScrews() { + return this.$store.getters['printer/existsBedScrews'] + } + + get existsDeltaCalibrate() { + return this.$store.getters['printer/existsDeltaCalibrate'] + } - return 'z_tilt' in this.$store.state.printer.configfile.settings ?? false + get existsScrewsTilt() { + return this.$store.getters['printer/existsScrewsTilt'] } get colorQuadGantryLevel() { @@ -47,6 +59,10 @@ export default class ControlMixin extends Vue { return status ? 'primary' : 'warning' } + get defaultActionButton() { + return this.$store.getters['gui/getDefaultControlActionButton'] + } + doHome() { this.$store.dispatch('server/addEvent', { message: 'G28', type: 'command' }) this.$socket.emit('printer.gcode.script', { script: 'G28' }, { loading: 'homeAll' }) @@ -62,6 +78,11 @@ export default class ControlMixin extends Vue { this.$socket.emit('printer.gcode.script', { script: 'G28 Y' }, { loading: 'homeY' }) } + doHomeXY() { + this.$store.dispatch('server/addEvent', { message: 'G28 X Y', type: 'command' }) + this.$socket.emit('printer.gcode.script', { script: 'G28 X Y' }, { loading: 'homeXY' }) + } + doHomeZ() { this.$store.dispatch('server/addEvent', { message: 'G28 Z', type: 'command' }) this.$socket.emit('printer.gcode.script', { script: 'G28 Z' }, { loading: 'homeZ' }) diff --git a/src/components/panels/ControlPanel.vue b/src/components/panels/ControlPanel.vue index 4a7be2e9b..e69de29bb 100644 --- a/src/components/panels/ControlPanel.vue +++ b/src/components/panels/ControlPanel.vue @@ -1,39 +0,0 @@ -<template> - <panel - v-if="klipperReadyForGui && ['standby', 'paused', 'complete', 'cancelled', 'error'].includes(printer_state)" - :icon="mdiGamepad" - :title="$t('Panels.ControlPanel.Headline').toString()" - :collapsible="true" - card-class="control-panel"> - <v-container> - <control-panel-cross-control v-if="controlStyle === 'cross'"></control-panel-cross-control> - <control-panel-circle-control v-else-if="controlStyle === 'circle'"></control-panel-circle-control> - <control-panel-bars-control v-else></control-panel-bars-control> - </v-container> - </panel> -</template> - -<script lang="ts"> -import { Component, Mixins } from 'vue-property-decorator' -import BaseMixin from '../mixins/base' -import ControlPanelCrossControl from '@/components/panels/ControlPanelCrossControl.vue' -import ControlPanelBarsControl from '@/components/panels/ControlPanelBarsControl.vue' -import ControlPanelCircleControl from '@/components/panels/ControlPanelCircleControl.vue' -import Panel from '@/components/ui/Panel.vue' -import { mdiGamepad } from '@mdi/js' -@Component({ - components: { - Panel, - ControlPanelCircleControl, - ControlPanelBarsControl, - ControlPanelCrossControl, - }, -}) -export default class ControlPanel extends Mixins(BaseMixin) { - mdiGamepad = mdiGamepad - - get controlStyle() { - return this.$store.state.gui.control.style ?? 'bars' - } -} -</script> diff --git a/src/components/panels/ControlPanelCrossControl.vue b/src/components/panels/ControlPanelCrossControl.vue deleted file mode 100644 index 9c720df6a..000000000 --- a/src/components/panels/ControlPanelCrossControl.vue +++ /dev/null @@ -1,262 +0,0 @@ -<style lang="scss" scoped> -.btnMinWidthAuto { - min-width: auto !important; -} - -.steps { - width: 100%; - > div { - width: 100%; - display: flex; - > button { - flex-grow: 1; - } - } -} -</style> - -<template> - <div> - <v-row> - <v-col :cols="homeCols"> - <v-row dense class="mb-1"> - <v-col cols="3"></v-col> - <v-col cols="3"> - <v-btn - class="btnMinWidthAuto fill-width" - :disabled="selectedCrossStep === null || selectedCrossStep === undefined" - @click=" - doSendMove('Y' + (reverseY ? '-' : '+') + stepsReversed[selectedCrossStep], feedrateXY) - "> - <v-icon>{{ mdiChevronUp }}</v-icon> - </v-btn> - </v-col> - <v-col cols="3"></v-col> - <v-col cols="3"> - <v-btn - class="btnMinWidthAuto fill-width" - :disabled="selectedCrossStep === null || selectedCrossStep === undefined" - @click=" - doSendMove('Z' + (reverseZ ? '-' : '+') + stepsReversed[selectedCrossStep], feedrateZ) - "> - <v-icon>{{ mdiChevronUp }}</v-icon> - </v-btn> - </v-col> - </v-row> - <v-row dense> - <v-col cols="3" class="p-rel"> - <v-btn - class="btnMinWidthAuto fill-width p-abs" - style="top: -50%; width: calc(100% - 8px)" - :disabled="selectedCrossStep === null || selectedCrossStep === undefined" - @click=" - doSendMove('X' + (!reverseX ? '-' : '+') + stepsReversed[selectedCrossStep], feedrateXY) - "> - <v-icon>{{ mdiChevronLeft }}</v-icon> - </v-btn> - </v-col> - <v-col cols="3"> - <v-btn - class="btnMinWidthAuto fill-width" - :disabled="selectedCrossStep === null || selectedCrossStep === undefined" - @click=" - doSendMove('Y' + (!reverseY ? '-' : '+') + stepsReversed[selectedCrossStep], feedrateXY) - "> - <v-icon>{{ mdiChevronDown }}</v-icon> - </v-btn> - </v-col> - <v-col cols="3" class="p-rel"> - <v-btn - class="btnMinWidthAuto fill-width p-abs" - style="top: -50%; width: calc(100% - 8px)" - :disabled="selectedCrossStep === null || selectedCrossStep === undefined" - @click=" - doSendMove('X' + (reverseX ? '-' : '+') + stepsReversed[selectedCrossStep], feedrateXY) - "> - <v-icon>{{ mdiChevronRight }}</v-icon> - </v-btn> - </v-col> - <v-col cols="3"> - <v-btn - class="btnMinWidthAuto fill-width" - :disabled="selectedCrossStep === null || selectedCrossStep === undefined" - @click=" - doSendMove('Z' + (!reverseZ ? '-' : '+') + stepsReversed[selectedCrossStep], feedrateZ) - "> - <v-icon>{{ mdiChevronDown }}</v-icon> - </v-btn> - </v-col> - </v-row> - </v-col> - <v-col :cols="homeCols" class="d-flex align-center"> - <div class="flex-grow-1" style="border-radius: 4px; overflow: hidden"> - <v-row dense class="" style="margin-bottom: -2px !important"> - <v-col :cols="existsQGL || existsZtilt ? 6 : 12"> - <v-btn - class="w-100" - tile - height="30" - :loading="loadings.includes('homeAll')" - :color="homedAxes.includes('xyz') ? 'primary' : 'warning'" - @click="doHome"> - <div class="d-flex align-center"> - <v-icon>{{ mdiHome }}</v-icon> - <span class="ml-1">{{ $t('Panels.ControlPanel.ALL') }}</span> - </div> - </v-btn> - </v-col> - <v-col v-if="existsQGL || existsZtilt" cols="6" class="d-flex"> - <v-btn - v-if="existsQGL" - class="btnMinWidthAuto flex-grow-1 px-0" - tile - dense - :color="colorQuadGantryLevel" - height="30" - :loading="loadings.includes('qgl')" - @click="doQGL"> - {{ $t('Panels.ControlPanel.QGL') }} - </v-btn> - <v-btn - v-if="existsZtilt" - class="btnMinWidthAuto flex-grow-1 px-0" - tile - dense - :color="colorZTilt" - height="30" - :loading="loadings.includes('zTilt')" - @click="doZtilt"> - {{ $t('Panels.ControlPanel.ZTilt') }} - </v-btn> - </v-col> - </v-row> - <v-row dense class=""> - <v-col cols="4" class="flex-grow-1"> - <v-btn - class="btnMinWidthAuto w-100" - tile - height="30" - :loading="loadings.includes('homeX')" - :color="homedAxes.includes('x') ? 'primary' : 'warning'" - @click="doHomeX"> - {{ $t('Panels.ControlPanel.X') }} - </v-btn> - </v-col> - <v-col cols="4" class="flex-grow-1"> - <v-btn - class="btnMinWidthAuto w-100" - tile - height="30" - :loading="loadings.includes('homeY')" - :color="homedAxes.includes('y') ? 'primary' : 'warning'" - @click="doHomeY"> - {{ $t('Panels.ControlPanel.Y') }} - </v-btn> - </v-col> - <v-col cols="4" class="flex-grow-1"> - <v-btn - class="btnMinWidthAuto w-100" - tile - height="30" - :loading="loadings.includes('homeZ')" - :color="homedAxes.includes('z') ? 'primary' : 'warning'" - @click="doHomeZ"> - {{ $t('Panels.ControlPanel.Z') }} - </v-btn> - </v-col> - </v-row> - </div> - </v-col> - </v-row> - <v-row no-gutters class="mt-3"> - <v-col class="col-12"> - <v-btn-toggle - v-if="stepsReversed.length > 0" - :key="'all-steps-' + stepsReversed.join('_')" - v-model="selectedCrossStep" - dense - no-gutters - style="flex-wrap: nowrap; width: 100%"> - <v-btn - v-for="step of stepsReversed" - :key="'step-' + step" - dense - class="btnMinWidthAuto flex-grow-1 px-0"> - <span class="body-2">{{ step }}</span> - </v-btn> - </v-btn-toggle> - <div v-else class="font-weight-bold warning rounded pa-2"> - {{ $t('Panels.ControlPanel.PleaseConfigureSteps') }} - <br /> - <router-link style="color: white" to="/settings/interface"> - {{ $t('Panels.ControlPanel.SettingsInterfaceControl') }} - </router-link> - </div> - </v-col> - </v-row> - </div> -</template> - -<script lang="ts"> -import { Component, Mixins } from 'vue-property-decorator' -import BaseMixin from '../mixins/base' -import ControlMixin from '@/components/mixins/control' -import { mdiChevronUp, mdiChevronLeft, mdiChevronRight, mdiChevronDown, mdiHome } from '@mdi/js' - -@Component -export default class ControlPanelCrossControl extends Mixins(BaseMixin, ControlMixin) { - private homeCols = 6 - - mdiChevronUp = mdiChevronUp - mdiChevronLeft = mdiChevronLeft - mdiChevronRight = mdiChevronRight - mdiChevronDown = mdiChevronDown - mdiHome = mdiHome - - get selectedCrossStep() { - return this.$store.state.gui.control.selectedCrossStep - } - - set selectedCrossStep(newVal) { - this.$store.dispatch('gui/saveSetting', { name: 'control.selectedCrossStep', value: newVal }) - } - - get reverseX() { - return this.$store.state.gui.control.reverseX - } - - get reverseY() { - return this.$store.state.gui.control.reverseY - } - - get reverseZ() { - return this.$store.state.gui.control.reverseZ - } - - get stepsAll() { - return this.$store.state.gui.control?.stepsAll ?? [] - } - - get stepsReversed() { - return Array.from(new Set([...(this.stepsAll ?? [])])).sort((a, b) => a - b) - } - - onResize() { - this.homeCols = window.screen.width < 360 ? 12 : 6 - } - - created() { - window.addEventListener('resize', this.onResize) - } - - mounted() { - if (window.screen.width < 330) { - this.homeCols = 12 - } - } - - destroyed() { - window.removeEventListener('resize', this.onResize) - } -} -</script> diff --git a/src/components/panels/PrintsettingsPanel.vue b/src/components/panels/PrintsettingsPanel.vue deleted file mode 100644 index e1b8891db..000000000 --- a/src/components/panels/PrintsettingsPanel.vue +++ /dev/null @@ -1,44 +0,0 @@ -<template> - <panel - v-if="klipperReadyForGui && ['printing', 'paused'].includes(printer_state)" - :icon="mdiPrinter3d" - :title="$t('Panels.PrintsettingsPanel.Headline').toString()" - :collapsible="true" - card-class="printsettings-panel"> - <tool-slider - :label="$t('Panels.PrintsettingsPanel.SpeedFactor').toString()" - :icon="mdiSpeedometer" - :target="speed_factor" - :min="1" - :max="200" - :multi="100" - :step="5" - :dynamic-range="true" - :has-input-field="true" - command="M220" - attribute-name="S"></tool-slider> - </panel> -</template> - -<script lang="ts"> -import { Component, Mixins } from 'vue-property-decorator' -import BaseMixin from '@/components/mixins/base' -import Panel from '@/components/ui/Panel.vue' -import ToolSlider from '@/components/inputs/ToolSlider.vue' -import { mdiPrinter3d, mdiSpeedometer } from '@mdi/js' - -@Component({ - components: { - Panel, - ToolSlider, - }, -}) -export default class PrintsettingsPanel extends Mixins(BaseMixin) { - mdiPrinter3d = mdiPrinter3d - mdiSpeedometer = mdiSpeedometer - - get speed_factor() { - return this.$store.state.printer?.gcode_move?.speed_factor ?? 1 - } -} -</script> diff --git a/src/components/panels/StatusPanel.vue b/src/components/panels/StatusPanel.vue index e61774681..5024e4a07 100644 --- a/src/components/panels/StatusPanel.vue +++ b/src/components/panels/StatusPanel.vue @@ -134,46 +134,7 @@ </v-container> <v-divider class="mt-0 mb-0"></v-divider> </template> - <v-container class="py-0"> - <v-row - :class=" - 'text-center ' + - (!['printing', 'paused', 'error', 'complete', 'cancelled'].includes(printer_state) - ? 'pt-5 pb-2 mb-0' - : 'py-5') - " - align="center"> - <v-col class="col-3 pa-0"> - <strong>{{ $t('Panels.StatusPanel.Position') }}</strong> - <br /> - {{ coordinates }} - </v-col> - <v-col class="col-3 pa-0"> - <strong>{{ $t('Panels.StatusPanel.X') }}</strong> - <br /> - {{ positions.x }} - </v-col> - <v-col class="col-3 pa-0"> - <strong>{{ $t('Panels.StatusPanel.Y') }}</strong> - <br /> - {{ positions.y }} - </v-col> - <v-col class="col-3 pa-0"> - <v-tooltip top> - <template #activator="{ on, attrs }"> - <div v-bind="attrs" class="text-center" v-on="on"> - <strong>{{ $t('Panels.StatusPanel.Z') }}</strong> - <br /> - {{ positions.z }} - </div> - </template> - <span>G-Code: {{ positions.gcode_z }}mm</span> - </v-tooltip> - </v-col> - </v-row> - </v-container> <template v-if="['printing', 'paused', 'error', 'cancelled'].includes(printer_state)"> - <v-divider class="my-0"></v-divider> <v-container class="py-0"> <v-row class="text-center py-5" align="center"> <v-col class="col-3 pa-0"> @@ -417,16 +378,6 @@ export default class StatusPanel extends Mixins(BaseMixin) { return this.$store.state.printer.print_stats?.message ?? '' } - get positions() { - return this.$store.getters['printer/getPositions'] - } - - get coordinates() { - return this.positions.coordinates - ? this.$t('Panels.StatusPanel.Absolute') - : this.$t('Panels.StatusPanel.Relative') - } - get filament_used() { return this.$store.state.printer.print_stats?.filament_used ?? 0 } @@ -574,8 +525,9 @@ export default class StatusPanel extends Mixins(BaseMixin) { get current_layer() { if (this.print_time > 0 && 'first_layer_height' in this.current_file && 'layer_height' in this.current_file) { + const gcodePositionZ = this.$store.state.printer.gcode_move?.gcode_position[2] ?? 0 let current_layer = Math.ceil( - (this.positions.gcode_z - this.current_file.first_layer_height) / this.current_file.layer_height + 1 + (gcodePositionZ - this.current_file.first_layer_height) / this.current_file.layer_height + 1 ) current_layer = current_layer <= this.max_layers ? current_layer : this.max_layers diff --git a/src/components/panels/ToolheadControlPanel.vue b/src/components/panels/ToolheadControlPanel.vue new file mode 100644 index 000000000..355356219 --- /dev/null +++ b/src/components/panels/ToolheadControlPanel.vue @@ -0,0 +1,168 @@ +<template> + <panel + v-if="klipperReadyForGui" + :icon="mdiGamepad" + :title="$t('Panels.ToolheadControlPanel.Headline').toString()" + :collapsible="true" + card-class="toolhead-control-panel"> + <!-- PANEL-HEADER 3-DOT-MENU --> + <template + v-if=" + (controlStyle !== 'bars' && (existsZtilt || existsQGL)) || + existsBedScrews || + existsBedTilt || + existsDeltaCalibrate || + existsScrewsTilt + " + #buttons> + <v-menu left offset-y :close-on-content-click="false" class="pa-0"> + <template #activator="{ on, attrs }"> + <v-btn icon tile v-bind="attrs" v-on="on"> + <v-icon>{{ mdiDotsVertical }}</v-icon> + </v-btn> + </template> + <v-list dense> + <v-list-item v-if="controlStyle !== 'bars' && actionButton !== 'm84'"> + <v-btn small style="width: 100%" @click="doSend('M84')"> + <v-icon left small>{{ mdiEngineOff }}</v-icon> + {{ $t('Settings.ControlTab.MotorsOff', { isDefault: '' }) }} + </v-btn> + </v-list-item> + <v-list-item v-if="controlStyle !== 'bars' && existsZtilt && actionButton !== 'ztilt'"> + <v-btn small style="width: 100%" @click="doZtilt">Z-Tilt Adjust</v-btn> + </v-list-item> + <v-list-item v-if="controlStyle !== 'bars' && existsQGL && actionButton !== 'qgl'"> + <v-btn small style="width: 100%" @click="doQGL">Quad Gantry Level</v-btn> + </v-list-item> + <!-- SPECIAL BUTTONS ALWAYS INSIDE 3-DOT MENU --> + <v-list-item v-if="existsBedTilt"> + <v-btn small style="width: 100%" @click="doSend('BED_TILT_CALIBRATE')"> + BED TILT CALIBRATE + </v-btn> + </v-list-item> + <v-list-item v-if="existsBedScrews"> + <v-btn small style="width: 100%" @click="doSend('BED_SCREWS_ADJUST')">BED SCREWS ADJUST</v-btn> + </v-list-item> + <v-list-item v-if="existsDeltaCalibrate"> + <v-btn small style="width: 100%" @click="doSend('DELTA_CALIBRATE')">DELTA CALIBRATE</v-btn> + </v-list-item> + <v-list-item v-if="existsScrewsTilt"> + <div class="d-flex align-center" style="width: 100%"> + <v-btn + small + style="border-top-right-radius: 0; border-bottom-right-radius: 0" + @click="doSend('SCREWS_TILT_CALCULATE')"> + SCREWS TILT CALCULATE + </v-btn> + <v-menu offset-y left :close-on-content-click="false"> + <template #activator="{ on, attrs }"> + <v-btn + small + v-bind="attrs" + class="px-0" + style="min-width: 32px; border-top-left-radius: 0; border-bottom-left-radius: 0" + v-on="on"> + <v-icon>{{ mdiMenuDown }}</v-icon> + </v-btn> + </template> + <v-list dense> + <v-list-item> + <v-btn + small + style="width: 100%" + @click="doSend('SCREWS_TILT_CALCULATE DIRECTION=CW')"> + <v-icon left small style="transform: scaleX(-1)">{{ mdiRestore }}</v-icon> + <span>CW</span> + </v-btn> + </v-list-item> + <v-list-item> + <v-btn + small + style="width: 100%" + @click="doSend('SCREWS_TILT_CALCULATE DIRECTION=CCW')"> + <v-icon left small>{{ mdiRestore }}</v-icon> + <span>CCW</span> + </v-btn> + </v-list-item> + </v-list> + </v-menu> + </div> + </v-list-item> + </v-list> + </v-menu> + </template> + <!-- MOVE TO CONTROL --> + <move-to-control class="py-0 pt-3"></move-to-control> + <!-- AXIS CONTROL --> + <v-container> + <component :is="`${controlStyle}-control`"></component> + </v-container> + <!-- Z-OFFSET CONTROL --> + <v-divider></v-divider> + <v-container> + <zoffset-control></zoffset-control> + </v-container> + <!-- SPEED FACTOR --> + <v-divider></v-divider> + <v-container> + <tool-slider + :label="$t('Panels.ToolheadControlPanel.SpeedFactor').toString()" + :icon="mdiSpeedometer" + :target="speedFactor" + :min="1" + :max="200" + :multi="100" + :step="5" + :dynamic-range="true" + :has-input-field="true" + command="M220" + attribute-name="S"></tool-slider> + </v-container> + </panel> +</template> + +<script lang="ts"> +import { Component, Mixins } from 'vue-property-decorator' +import BarsControl from '@/components/panels/ToolheadControls/BarsControl.vue' +import BaseMixin from '../mixins/base' +import CircleControl from '@/components/panels/ToolheadControls/CircleControl.vue' +import ControlMixin from '@/components/mixins/control' +import CrossControl from '@/components/panels/ToolheadControls/CrossControl.vue' +import MoveToControl from '@/components/panels/ToolheadControls/MoveToControl.vue' +import Panel from '@/components/ui/Panel.vue' +import ToolSlider from '@/components/inputs/ToolSlider.vue' +import ZoffsetControl from '@/components/panels/ToolheadControls/ZoffsetControl.vue' +import { mdiDotsVertical, mdiEngineOff, mdiGamepad, mdiSpeedometer, mdiMenuDown, mdiRestore } from '@mdi/js' + +@Component({ + components: { + BarsControl, + CircleControl, + CrossControl, + MoveToControl, + Panel, + ToolSlider, + ZoffsetControl, + }, +}) +export default class ToolheadControlPanel extends Mixins(BaseMixin, ControlMixin) { + mdiDotsVertical = mdiDotsVertical + mdiEngineOff = mdiEngineOff + mdiGamepad = mdiGamepad + mdiSpeedometer = mdiSpeedometer + mdiRestore = mdiRestore + mdiMenuDown = mdiMenuDown + + get controlStyle(): string { + return this.$store.state.gui.control.style ?? 'bars' + } + + get actionButton(): string { + return this.$store.state.gui.control.actionButton ?? this.defaultActionButton + } + + get speedFactor(): number { + return this.$store.state.printer?.gcode_move?.speed_factor ?? 1 + } +} +</script> diff --git a/src/components/panels/ControlPanelBarsControl.vue b/src/components/panels/ToolheadControls/BarsControl.vue similarity index 53% rename from src/components/panels/ControlPanelBarsControl.vue rename to src/components/panels/ToolheadControls/BarsControl.vue index 7d1ae52d2..a3e6117c1 100644 --- a/src/components/panels/ControlPanelBarsControl.vue +++ b/src/components/panels/ToolheadControls/BarsControl.vue @@ -4,122 +4,195 @@ min-width: 36px !important; } +.btnGroup { + height: 28px !important; +} + .btnMinWidthAuto { min-width: auto !important; } + +._btn-group { + border-radius: 4px; + display: inline-flex; + flex-wrap: nowrap; + max-width: 100%; + min-width: 100%; + width: 100%; + + .v-btn { + border-radius: 0; + border-color: rgba(255, 255, 255, 0.12); + border-style: solid; + border-width: thin; + box-shadow: none; + height: 28px; + opacity: 0.8; + min-width: auto !important; + } + + .v-btn:first-child { + border-top-left-radius: inherit; + border-bottom-left-radius: inherit; + } + + .v-btn:last-child { + border-top-right-radius: inherit; + border-bottom-right-radius: inherit; + } + + .v-btn:not(:first-child) { + border-left-width: 0; + } +} </style> <template> <div> + <!-- HOME ALL / ACTION BUTTON --> <v-row no-gutters> <v-col class="col-12 pb-0 text-center"> <v-btn small + :disabled="['printing'].includes(printer_state)" :loading="loadings.includes('homeAll')" :color="homedAxes.includes('xyz') ? 'primary' : 'warning'" @click="doHome"> <v-icon class="mr-1">{{ mdiHome }}</v-icon> - {{ $t('Panels.ControlPanel.ALL') }} + {{ $t('Panels.ToolheadControlPanel.ALL') }} + </v-btn> + <v-btn + v-if="enableXYHoming" + :disabled="['printing'].includes(printer_state)" + :loading="loadings.includes('homeAll')" + :color="homedAxes.includes('xy') ? 'primary' : 'warning'" + small + class="ml-2" + @click="doHomeXY"> + <v-icon class="mr-1">{{ mdiHome }}</v-icon> + XY </v-btn> <v-btn v-if="existsQGL" + :disabled="['printing'].includes(printer_state)" small :loading="loadings.includes('qgl')" :color="colorQuadGantryLevel" class="ml-2" @click="doQGL"> - {{ $t('Panels.ControlPanel.QGL') }} + {{ $t('Panels.ToolheadControlPanel.QGL') }} </v-btn> <v-btn v-if="existsZtilt" + :disabled="['printing'].includes(printer_state)" small :loading="loadings.includes('zTilt')" :color="colorZTilt" class="ml-2" @click="doZtilt"> - {{ $t('Panels.ControlPanel.ZTilt') }} + {{ $t('Panels.ToolheadControlPanel.ZTilt') }} + </v-btn> + <v-btn + small + :disabled="['printing'].includes(printer_state)" + :color="homedAxes !== '' ? 'primary' : 'warning'" + class="ml-2" + @click="doSend('M84')"> + <v-icon>{{ mdiEngineOff }}</v-icon> </v-btn> </v-col> </v-row> - <v-row no-gutters class="mt-2"> + <!-- X MOVEMENT BUTTONGROUPS --> + <v-row dense> <v-col class="text-center"> - <v-btn-toggle dense no-gutters class="row no-gutters" style="flex-wrap: nowrap; width: 100%"> + <v-item-group class="_btn-group row no-gutters"> <v-btn v-for="steps of stepsXYsorted" :key="'x-' + steps" - class="btnMinWidthAuto col" + :disabled="['printing'].includes(printer_state)" + class="btnMinWidthAuto col btnGroup" @click="doSendMove('X-' + steps, feedrateXY)"> <span class="body-2">–{{ steps }}</span> </v-btn> <v-btn + :disabled="['printing'].includes(printer_state)" :color="homedAxes.includes('x') ? 'primary' : 'warning'" :loading="loadings.includes('homeX')" - class="font-weight-bold btnHomeAxis" + class="font-weight-bold btnHomeAxis btnGroup" @click="doHomeX"> - {{ $t('Panels.ControlPanel.X') }} + X </v-btn> <v-btn v-for="steps of stepsXYsortedReverse" :key="'x+' + steps" - class="btnMinWidthAuto col" + :disabled="['printing'].includes(printer_state)" + class="btnMinWidthAuto col btnGroup" @click="doSendMove('X+' + steps, feedrateXY)"> <span class="body-2">+{{ steps }}</span> </v-btn> - </v-btn-toggle> + </v-item-group> </v-col> </v-row> - <v-row no-gutters class="mt-3"> + <!-- Y MOVEMENT BUTTONGROUPS --> + <v-row dense> <v-col class="text-center"> - <v-btn-toggle dense no-gutters class="row no-gutters" style="flex-wrap: nowrap; width: 100%"> + <v-item-group class="_btn-group row no-gutters"> <v-btn v-for="steps of stepsXYsorted" :key="'y-' + steps" - class="btnMinWidthAuto col" + :disabled="['printing'].includes(printer_state)" + class="btnMinWidthAuto col btnGroup" @click="doSendMove('Y-' + steps, feedrateXY)"> <span class="body-2">–{{ steps }}</span> </v-btn> <v-btn + :disabled="['printing'].includes(printer_state)" :color="homedAxes.includes('y') ? 'primary' : 'warning'" :loading="loadings.includes('homeY')" - class="font-weight-bold btnHomeAxis" + class="font-weight-bold btnHomeAxis btnGroup" @click="doHomeY"> - {{ $t('Panels.ControlPanel.Y') }} + Y </v-btn> <v-btn v-for="steps of stepsXYsortedReverse" :key="'y+' + steps" - class="btnMinWidthAuto col" + :disabled="['printing'].includes(printer_state)" + class="btnMinWidthAuto col btnGroup" @click="doSendMove('Y+' + steps, feedrateXY)"> <span class="body-2">+{{ steps }}</span> </v-btn> - </v-btn-toggle> + </v-item-group> </v-col> </v-row> - <v-row no-gutters class="mt-3"> + <!-- Z MOVEMENT BUTTONGROUPS --> + <v-row dense> <v-col class="text-center"> - <v-btn-toggle dense no-gutters class="row no-gutters" style="flex-wrap: nowrap; width: 100%"> + <v-item-group class="_btn-group row no-gutters"> <v-btn v-for="steps of stepsZsorted" :key="'z-' + steps" - class="btnMinWidthAuto col" + :disabled="['printing'].includes(printer_state)" + class="btnMinWidthAuto col btnGroup" @click="doSendMove('Z-' + steps, feedrateZ)"> <span class="body-2">–{{ steps }}</span> </v-btn> <v-btn + :disabled="['printing'].includes(printer_state)" :color="homedAxes.includes('z') ? 'primary' : 'warning'" :loading="loadings.includes('homeZ')" - class="font-weight-bold btnHomeAxis" + class="font-weight-bold btnHomeAxis btnGroup" @click="doHomeZ"> - {{ $t('Panels.ControlPanel.Z') }} + Z </v-btn> <v-btn v-for="steps of stepsZsortedReverse" :key="'z+' + steps" - class="btnMinWidthAuto col" + :disabled="['printing'].includes(printer_state)" + class="btnMinWidthAuto col btnGroup" @click="doSendMove('Z+' + steps, feedrateZ)"> <span class="body-2">+{{ steps }}</span> </v-btn> - </v-btn-toggle> + </v-item-group> </v-col> </v-row> </div> @@ -127,13 +200,19 @@ <script lang="ts"> import { Component, Mixins } from 'vue-property-decorator' -import BaseMixin from '../mixins/base' +import BaseMixin from '@/components/mixins/base' import ControlMixin from '@/components/mixins/control' -import { mdiHome } from '@mdi/js' +import { mdiEngineOff, mdiHome } from '@mdi/js' + @Component -export default class ControlPanelBarsControl extends Mixins(BaseMixin, ControlMixin) { +export default class BarsControl extends Mixins(BaseMixin, ControlMixin) { + mdiEngineOff = mdiEngineOff mdiHome = mdiHome + get enableXYHoming(): boolean { + return this.$store.state.gui.control.enableXYHoming + } + get stepsXYsorted() { return [...this.$store.state.gui.control.stepsXY].sort(function (a, b) { return b - a diff --git a/src/components/panels/ControlPanelCircleControl.vue b/src/components/panels/ToolheadControls/CircleControl.vue similarity index 60% rename from src/components/panels/ControlPanelCircleControl.vue rename to src/components/panels/ToolheadControls/CircleControl.vue index f4d9fbcaa..716bff83a 100644 --- a/src/components/panels/ControlPanelCircleControl.vue +++ b/src/components/panels/ToolheadControls/CircleControl.vue @@ -1,8 +1,8 @@ <style lang="scss" scoped> svg { - max-height: 300px; + max-height: 350px; + min-height: 275px; user-select: none; - user-drag: none; filter: drop-shadow(0px 10px 10px rgba(0, 0, 0, 0.3)); } @@ -16,12 +16,12 @@ svg a.step { } svg a.step:hover { - fill: #697180 !important; + fill: hsl(215, 0%, 50%) !important; transition: fill 100ms ease-in; } svg a.step:active { - fill: #858c98 !important; + fill: hsl(215, 0%, 70%) !important; } svg a.step.inner { @@ -41,7 +41,6 @@ svg g#stepsZ, svg g#stepsXY { pointer-events: none; user-select: none; - user-drag: none; font-family: 'Roboto-Regular', 'Roboto', sans-serif; font-size: 3px; fill: white; @@ -59,41 +58,49 @@ svg g#home_buttons text { fill: black; } -svg g.home_button { +svg g.home_button, +svg a#home_all_center { fill: var(--color-warning); transition: opacity 250ms; } -svg a#tilt_adjust { +svg a#tilt_adjust, +svg a#stepper_off { transition: opacity 250ms; } -svg a#tilt_adjust.warning { +svg a#tilt_adjust.warning, +svg a#stepper_off.warning { fill: var(--color-warning); } -svg a#tilt_adjust.primary { +svg a#tilt_adjust.primary, +svg a#stepper_off.primary { fill: var(--color-primary); } -svg g.home_button.homed { +svg g.home_button.homed, +svg a#home_all_center.homed { fill: var(--color-primary); } svg g.home_button:hover, -svg a#tilt_adjust:hover { +svg a#home_all_center:hover, +svg a#tilt_adjust:hover, +svg a#stepper_off:hover { opacity: 0.8; } svg a#tilt_adjust text, svg a#tilt_adjust #tilt_icon, +svg a#stepper_off #stepper_off_icon, svg g#home_buttons .home-icon { pointer-events: none; user-select: none; - user-drag: none; } -svg a#tilt_adjust #tilt_icon { +svg a#tilt_adjust #tilt_icon, +svg a#stepper_off #stepper_off_icon { fill: #000; } </style> @@ -101,20 +108,18 @@ svg a#tilt_adjust #tilt_icon { <template> <div> <v-row> - <v-col class="pb-0"> + <v-col class="pa-0"> <svg width="100%" height="100%" viewBox="0 0 78 62" - version="1.1" xmlns="http://www.w3.org/2000/svg" - xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" - xmlns:serif="http://www.serif.com/" style="fill-rule: evenodd; clip-rule: evenodd; stroke-linejoin: round; stroke-miterlimit: 2"> <g id="ArtBoard1" transform="matrix(1.24239,0,0,1,0,0)"> <rect x="0" y="0" width="62" height="62" style="fill: none" /> <g id="home_buttons" transform="matrix(0.804902,0,0,1,0.0430241,0)"> + <!-- HOME X BUTTON --> <a @click="doHomeX"> <g id="home_x" @@ -123,8 +128,7 @@ svg a#tilt_adjust #tilt_icon { id="home_button_x" :class="'home_button' + (homedAxes.includes('x') ? ' homed' : '')" transform="matrix(0.68689,0.68689,-0.68689,0.68689,3.87132,0.962447)"> - <path - d="M9.188,-0C9.634,0.001 10.028,0.291 10.162,0.717C10.295,1.142 10.136,1.605 9.77,1.86C6.722,4.035 4.05,6.701 1.869,9.743C1.614,10.11 1.151,10.269 0.724,10.135C0.298,10.002 0.008,9.607 0.008,9.16C0,6.418 0,2.781 0,1.029C-0,0.756 0.108,0.495 0.302,0.302C0.495,0.108 0.756,-0 1.029,0L9.188,-0Z" /> + <path :d="pathHomeButtonTop" /> </g> <g transform="matrix(0.654426,0,0,0.654426,0.298666,4.01315)"> <text x="3.789px" y="6.089px">X</text> @@ -133,12 +137,11 @@ svg a#tilt_adjust #tilt_icon { id="Icon" class="home-icon" transform="matrix(0.147059,0,0,0.147059,2.10662,2.08254)"> - <path - d="M10,20L10,14L14,14L14,20L19,20L19,12L22,12L12,3L2,12L5,12L5,20L10,20Z" - style="fill-rule: nonzero" /> + <path :d="homeIcon" style="fill-rule: nonzero" /> </g> </g> </a> + <!-- HOME Y BUTTON --> <a @click="doHomeY"> <g id="home_y" @@ -147,8 +150,7 @@ svg a#tilt_adjust #tilt_icon { id="home_button_y" :class="'home_button' + (homedAxes.includes('y') ? ' homed' : '')" transform="matrix(0.68689,0.68689,-0.68689,0.68689,3.87132,0.962447)"> - <path - d="M9.188,-0C9.634,0.001 10.028,0.291 10.162,0.717C10.295,1.142 10.136,1.605 9.77,1.86C6.722,4.035 4.05,6.701 1.869,9.743C1.614,10.11 1.151,10.269 0.724,10.135C0.298,10.002 0.008,9.607 0.008,9.16C0,6.418 0,2.781 0,1.029C-0,0.756 0.108,0.495 0.302,0.302C0.495,0.108 0.756,-0 1.029,0L9.188,-0Z" /> + <path :d="pathHomeButtonTop" /> </g> <g transform="matrix(0.654426,0,0,0.654426,0.298666,4.01315)"> <text x="3.789px" y="6.089px">Y</text> @@ -157,12 +159,11 @@ svg a#tilt_adjust #tilt_icon { id="icon" class="home-icon" transform="matrix(0.147059,0,0,0.147059,2.10662,2.08254)"> - <path - d="M10,20L10,14L14,14L14,20L19,20L19,12L22,12L12,3L2,12L5,12L5,20L10,20Z" - style="fill-rule: nonzero" /> + <path :d="homeIcon" style="fill-rule: nonzero" /> </g> </g> </a> + <!-- HOME Z BUTTON --> <a @click="doHomeZ"> <g id="home_z" @@ -171,8 +172,7 @@ svg a#tilt_adjust #tilt_icon { id="home_button_z" :class="'home_button ' + (homedAxes.includes('z') ? ' homed' : '')" transform="matrix(0.68689,0.68689,-0.68689,0.68689,3.87132,0.962447)"> - <path - d="M9.188,0C9.634,0.001 10.028,0.291 10.162,0.717C10.295,1.142 10.136,1.605 9.77,1.86C6.722,4.035 4.05,6.701 1.869,9.743C1.614,10.11 1.151,10.269 0.724,10.135C0.298,10.002 0.008,9.607 0.008,9.16C0,6.418 0,2.781 0,1.029C-0,0.756 0.108,0.495 0.302,0.302C0.495,0.108 0.756,-0 1.029,0L9.188,0Z" /> + <path :d="pathHomeButtonBottom" /> </g> <g transform="matrix(0.654426,0,0,0.654426,0.298666,4.01315)"> <text x="3.93px" y="6.089px">Z</text> @@ -180,15 +180,35 @@ svg a#tilt_adjust #tilt_icon { <g id="icon1" class="home-icon" - serif:id="icon" transform="matrix(0.147059,0,0,0.147059,2.10662,2.08254)"> - <path - d="M10,20L10,14L14,14L14,20L19,20L19,12L22,12L12,3L2,12L5,12L5,20L10,20Z" - style="fill-rule: nonzero" /> + <path :d="homeIcon" style="fill-rule: nonzero" /> </g> </g> </a> - <a @click="doHome"> + <!-- HOME XY BUTTON --> + <a v-if="enableXYHoming" @click="doHomeXY"> + <g + id="home_xy" + transform="matrix(-0.707107,-0.707107,0.707107,-0.707107,4.05689,63.3555)"> + <g + id="home_button_xy" + :class="'home_button' + (homedAxes.includes('xy') ? ' homed' : '')" + transform="matrix(0.68689,0.68689,-0.68689,0.68689,3.87132,0.962447)"> + <path :d="pathHomeButtonBottom" /> + </g> + <g transform="matrix(0.654426,0,0,0.654426,0.298666,4.01315)"> + <text x="2.3px" y="6.089px">XY</text> + </g> + <g + id="icon2" + class="home-icon" + transform="matrix(0.147059,0,0,0.147059,2.10662,2.08254)"> + <path :d="homeIcon" style="fill-rule: nonzero" /> + </g> + </g> + </a> + <!-- HOME ALL BUTTON --> + <a v-if="!enableXYHoming" @click="doHome"> <g id="home_all" transform="matrix(-0.707107,-0.707107,0.707107,-0.707107,4.05689,63.3555)"> @@ -196,75 +216,77 @@ svg a#tilt_adjust #tilt_icon { id="home_button_all" :class="'home_button' + (homedAxes.includes('xyz') ? ' homed' : '')" transform="matrix(0.68689,0.68689,-0.68689,0.68689,3.87132,0.962447)"> - <path - d="M9.188,0C9.634,0.001 10.028,0.291 10.162,0.717C10.295,1.142 10.136,1.605 9.77,1.86C6.722,4.035 4.05,6.701 1.869,9.743C1.614,10.11 1.151,10.269 0.724,10.135C0.298,10.002 0.008,9.607 0.008,9.16C0,6.418 0,2.781 0,1.029C-0,0.756 0.108,0.495 0.302,0.302C0.495,0.108 0.756,-0 1.029,0L9.188,0Z" /> + <path :d="pathHomeButtonBottom" /> </g> <g - id="icon2" + id="icon3" class="home-icon" - serif:id="icon" transform="matrix(0.29377,0,0,0.29377,0.346087,1.64241)"> - <path - d="M10,20L10,14L14,14L14,20L19,20L19,12L22,12L12,3L2,12L5,12L5,20L10,20Z" - style="fill-rule: nonzero" /> + <path :d="homeIcon" style="fill-rule: nonzero" /> </g> </g> </a> + <a v-if="enableXYHoming" @click="doHome"> + <g + id="home_all_center" + :class="'home_button' + (homedAxes.includes('xyz') ? ' homed' : '')"> + <circle id="home_button_all_center" cx="31" cy="31" r="5" /> + </g> + <g id="icon4" class="home-icon" transform="scale(0.3) translate(91.25,91.25)"> + <!-- transform="matrix(0.29377,0,0,0.29377,0.346087,1.64241)"--> + <path :d="homeIcon" style="fill-rule: nonzero" /> + </g> + </a> </g> <g id="step_buttons" transform="matrix(0.804902,0,0,1,0.0430241,0)"> + <!-- Z STEPS BUTTONS --> <g id="Z" transform="matrix(1.24239,0,0,1,-0.0534526,0)"> <g id="Bottom" transform="matrix(-1,-1.52149e-16,9.85721e-17,-1,114.34,62)"> <a class="step inner" @click=" doSendMove( - 'Z' + (!reverseZ ? '-' : '+') + (stepsZ.length >= 0 ? stepsZ[0] : 0), + `Z${!reverseZ ? '-' : '+'}${stepsZ.length >= 0 ? stepsZ[0] : 0}`, feedrateZ ) "> - <g transform="matrix(0.804902,0,0,1,0,0)"> - <path - d="M66.037,19.186C69.409,18.542 72.742,18.52 76.037,19.102L76.037,23.682C76.037,23.815 75.984,23.942 75.891,24.036C75.564,24.362 74.774,25.153 74.359,25.567C74.204,25.722 73.967,25.757 73.773,25.656C72.955,25.236 72.029,25 71.048,25C70.051,25 69.112,25.243 68.284,25.674C68.09,25.777 67.852,25.742 67.697,25.586C67.283,25.175 66.506,24.395 66.183,24.071C66.09,23.977 66.037,23.85 66.037,23.718C66.037,22.806 66.037,19.186 66.037,19.186Z" /> - </g> + <g transform="matrix(0.804902,0,0,1,0,0)"><path :d="zStepInner" /></g> </a> <a class="step inner-mid" @click=" doSendMove( - 'Z' + (!reverseZ ? '-' : '+') + (stepsZ.length >= 1 ? stepsZ[1] : 0), + `Z${!reverseZ ? '-' : '+'}${stepsZ.length >= 1 ? stepsZ[1] : 0}`, feedrateZ ) "> <g transform="matrix(0.804902,1.2326e-32,-9.92118e-33,1,-5.71917e-15,-7.10543e-15)"> - <path - d="M66.037,13.244C69.353,12.66 72.687,12.7 76.037,13.355L76.037,20.099C74.523,19.39 72.831,19 71.048,19C69.256,19 67.556,19.393 66.037,20.109L66.037,13.244Z" /> + <path :d="zStepInnerMid" /> </g> </a> <a class="step outer-mid" @click=" doSendMove( - 'Z' + (!reverseZ ? '-' : '+') + (stepsZ.length >= 2 ? stepsZ[2] : 0), + `Z${!reverseZ ? '-' : '+'}${stepsZ.length >= 2 ? stepsZ[2] : 0}`, feedrateZ ) "> <g transform="matrix(0.804902,0,0,1,0,0)"> - <path - d="M66.037,7.221C69.367,6.597 72.7,6.583 76.037,7.192L76.037,13.702C74.453,13.245 72.778,13 71.048,13C69.309,13 67.627,13.247 66.037,13.708L66.037,7.221Z" /> + <path :d="zStepOuterMid" /> </g> </a> <a class="step outer" @click=" doSendMove( - 'Z' + (!reverseZ ? '-' : '+') + (stepsZ.length >= 3 ? stepsZ[3] : 0), + `Z${!reverseZ ? '-' : '+'}${stepsZ.length >= 3 ? stepsZ[3] : 0}`, feedrateZ ) "> <g transform="matrix(0.804902,0,0,1,0,0)"> - <path - d="M66.037,2.5C66.037,1.672 66.709,1 67.537,1L74.537,1C75.365,1 76.037,1.672 76.037,2.5L76.037,7.521C74.428,7.179 72.759,7 71.048,7C69.33,7 67.654,7.181 66.037,7.525L66.037,2.5Z" /> + <path :d="zStepOuter" /> </g> </a> </g> @@ -273,57 +295,54 @@ svg a#tilt_adjust #tilt_icon { class="step inner" @click=" doSendMove( - 'Z' + (reverseZ ? '-' : '+') + (stepsZ.length >= 0 ? stepsZ[0] : 0), + `Z${reverseZ ? '-' : '+'}${stepsZ.length >= 0 ? stepsZ[0] : 0}`, feedrateZ ) "> <g transform="matrix(0.804902,0,0,1,0,0)"> - <path - d="M66.037,19.186C69.409,18.542 72.742,18.52 76.037,19.102L76.037,23.682C76.037,23.815 75.984,23.942 75.891,24.036C75.564,24.362 74.774,25.153 74.359,25.567C74.204,25.722 73.967,25.757 73.773,25.656C72.955,25.236 72.029,25 71.048,25C70.051,25 69.112,25.243 68.284,25.674C68.09,25.777 67.852,25.742 67.697,25.586C67.283,25.175 66.506,24.395 66.183,24.071C66.09,23.977 66.037,23.85 66.037,23.718C66.037,22.806 66.037,19.186 66.037,19.186Z" /> + <path :d="zStepInner" /> </g> </a> <a class="step inner-mid" @click=" doSendMove( - 'Z' + (reverseZ ? '-' : '+') + (stepsZ.length >= 1 ? stepsZ[1] : 0), + `Z${reverseZ ? '-' : '+'}${stepsZ.length >= 1 ? stepsZ[1] : 0}`, feedrateZ ) "> <g transform="matrix(0.804902,1.2326e-32,-9.92118e-33,1,-5.71917e-15,-7.10543e-15)"> - <path - d="M66.037,13.244C69.353,12.66 72.687,12.7 76.037,13.355L76.037,20.099C74.523,19.39 72.831,19 71.048,19C69.256,19 67.556,19.393 66.037,20.109L66.037,13.244Z" /> + <path :d="zStepInnerMid" /> </g> </a> <a class="step outer-mid" @click=" doSendMove( - 'Z' + (reverseZ ? '-' : '+') + (stepsZ.length >= 2 ? stepsZ[2] : 0), + `Z${reverseZ ? '-' : '+'}${stepsZ.length >= 2 ? stepsZ[2] : 0}`, feedrateZ ) "> <g transform="matrix(0.804902,0,0,1,0,0)"> - <path - d="M66.037,7.221C69.367,6.597 72.7,6.583 76.037,7.192L76.037,13.702C74.453,13.245 72.778,13 71.048,13C69.309,13 67.627,13.247 66.037,13.708L66.037,7.221Z" /> + <path :d="zStepOuterMid" /> </g> </a> <a class="step outer" @click=" doSendMove( - 'Z' + (reverseZ ? '-' : '+') + (stepsZ.length >= 3 ? stepsZ[3] : 0), + `Z${reverseZ ? '-' : '+'}${stepsZ.length >= 3 ? stepsZ[3] : 0}`, feedrateZ ) "> <g transform="matrix(0.804902,0,0,1,0,0)"> - <path - d="M66.037,2.5C66.037,1.672 66.709,1 67.537,1L74.537,1C75.365,1 76.037,1.672 76.037,2.5L76.037,7.521C74.428,7.179 72.759,7 71.048,7C69.33,7 67.654,7.181 66.037,7.525L66.037,2.5Z" /> + <path :d="zStepOuter" /> </g> </a> </g> </g> + <!-- Z STEP BUTTON TEXT --> <g id="stepsZ" transform="matrix(1,0,0,1,40,0)"> <g transform="matrix(1,0,0,1,0.483899,4.07983)"> <text x="30.7px" y="19.056px" text-anchor="middle"> @@ -346,58 +365,55 @@ svg a#tilt_adjust #tilt_icon { </text> </g> </g> + <!-- XY STEP BUTTONS --> <g id="XY"> <g id="Right"> <a class="step inner" @click=" doSendMove( - 'X' + (reverseX ? '-' : '+') + (stepsXY.length >= 0 ? stepsXY[0] : 0), + `X${reverseX ? '-' : '+'}${stepsXY.length >= 0 ? stepsXY[0] : 0}`, feedrateXY ) "> <g transform="matrix(0.48,0,0,0.48,19,19)"> - <path - d="M36.096,19.243C35.88,18.839 35.954,18.342 36.278,18.019C40.686,13.619 69.84,-15.445 69.84,-15.445C90.891,13.786 89.845,38.467 69.564,65.144C69.564,65.144 40.684,36.265 36.318,31.899C35.996,31.576 35.922,31.081 36.134,30.678C37.008,28.975 37.5,27.044 37.5,25C37.5,22.925 36.993,20.967 36.096,19.243Z" /> + <path :d="xyStepInner" /> </g> </a> <a class="step inner-mid" @click=" doSendMove( - 'X' + (reverseX ? '-' : '+') + (stepsXY.length >= 1 ? stepsXY[1] : 0), + `X${reverseX ? '-' : '+'}${stepsXY.length >= 1 ? stepsXY[1] : 0}`, feedrateXY ) "> <g transform="matrix(0.72,0,0,0.72,13,13)"> - <path - d="M54.897,-1.964C68.991,16.277 68.542,32.764 54.738,51.763L44.077,41.131L38.115,35.169C40.361,32.389 41.667,28.846 41.667,25C41.667,21.132 40.346,17.57 38.076,14.784L54.897,-1.964Z" /> + <path :d="xyStepInnerMid" /> </g> </a> <a class="step outer-mid" @click=" doSendMove( - 'X' + (reverseX ? '-' : '+') + (stepsXY.length >= 2 ? stepsXY[2] : 0), + `X${reverseX ? '-' : '+'}${stepsXY.length >= 2 ? stepsXY[2] : 0}`, feedrateXY ) "> <g transform="matrix(0.96,0,0,0.96,7,7)"> - <path - d="M47.418,4.777C57.663,18.688 57.829,31.029 47.304,45.072L39.308,37.098C42.081,33.838 43.75,29.612 43.75,25C43.75,20.371 42.069,16.132 39.277,12.868L47.418,4.777Z" /> + <path :d="xyStepOuterMid" /> </g> </a> <a class="step outer" @click=" doSendMove( - 'X' + (reverseX ? '-' : '+') + (stepsXY.length >= 3 ? stepsXY[3] : 0), + `X${reverseX ? '-' : '+'}${stepsXY.length >= 3 ? stepsXY[3] : 0}`, feedrateXY ) "> <g transform="matrix(1.2,0,0,1.2,1,1)"> - <path - d="M43.181,8.535C43.262,8.453 43.373,8.409 43.488,8.412C43.602,8.415 43.711,8.466 43.787,8.551C47.661,12.933 50,18.695 50,25C50,31.291 47.672,37.042 43.811,41.42C43.735,41.505 43.627,41.556 43.512,41.559C43.398,41.562 43.287,41.518 43.206,41.437C42.343,40.575 39.981,38.213 39.981,38.213C43.11,34.7 45,30.069 45,25C45,19.918 43.1,15.276 39.956,11.759C39.956,11.759 42.319,9.397 43.181,8.535Z" /> + <path :d="xyStepOuter" /> </g> </a> </g> @@ -406,170 +422,153 @@ svg a#tilt_adjust #tilt_icon { class="step inner" @click=" doSendMove( - 'X' + (!reverseX ? '-' : '+') + (stepsXY.length >= 0 ? stepsXY[0] : 0), + `X${!reverseX ? '-' : '+'}${stepsXY.length >= 0 ? stepsXY[0] : 0}`, feedrateXY ) "> <g transform="matrix(0.48,0,0,0.48,19,19)"> - <path - d="M36.096,19.243C35.88,18.839 35.954,18.342 36.278,18.019C40.686,13.619 69.84,-15.445 69.84,-15.445C90.891,13.786 89.845,38.467 69.564,65.144C69.564,65.144 40.684,36.265 36.318,31.899C35.996,31.576 35.922,31.081 36.134,30.678C37.008,28.975 37.5,27.044 37.5,25C37.5,22.925 36.993,20.967 36.096,19.243Z" /> + <path :d="xyStepInner" /> </g> </a> <a class="step inner-mid" @click=" doSendMove( - 'X' + (!reverseX ? '-' : '+') + (stepsXY.length >= 1 ? stepsXY[1] : 0), + `X${!reverseX ? '-' : '+'}${stepsXY.length >= 1 ? stepsXY[1] : 0}`, feedrateXY ) "> <g transform="matrix(0.72,0,0,0.72,13,13)"> - <path - d="M54.897,-1.964C68.991,16.277 68.542,32.764 54.738,51.763L44.077,41.131L38.115,35.169C40.361,32.389 41.667,28.846 41.667,25C41.667,21.132 40.346,17.57 38.076,14.784L54.897,-1.964Z" /> + <path :d="xyStepInnerMid" /> </g> </a> <a class="step outer-mid" @click=" doSendMove( - 'X' + (!reverseX ? '-' : '+') + (stepsXY.length >= 2 ? stepsXY[2] : 0), + `X${!reverseX ? '-' : '+'}${stepsXY.length >= 2 ? stepsXY[2] : 0}`, feedrateXY ) "> <g transform="matrix(0.96,0,0,0.96,7,7)"> - <path - d="M47.418,4.777C57.663,18.688 57.829,31.029 47.304,45.072L39.308,37.098C42.081,33.838 43.75,29.612 43.75,25C43.75,20.371 42.069,16.132 39.277,12.868L47.418,4.777Z" /> + <path :d="xyStepOuterMid" /> </g> </a> <a class="step outer" @click=" doSendMove( - 'X' + (!reverseX ? '-' : '+') + (stepsXY.length >= 3 ? stepsXY[3] : 0), + `X${!reverseX ? '-' : '+'}${stepsXY.length >= 3 ? stepsXY[3] : 0}`, feedrateXY ) "> <g transform="matrix(1.2,0,0,1.2,1,1)"> - <path - d="M43.181,8.535C43.262,8.453 43.373,8.409 43.488,8.412C43.602,8.415 43.711,8.466 43.787,8.551C47.661,12.933 50,18.695 50,25C50,31.291 47.672,37.042 43.811,41.42C43.735,41.505 43.627,41.556 43.512,41.559C43.398,41.562 43.287,41.518 43.206,41.437C42.343,40.575 39.981,38.213 39.981,38.213C43.11,34.7 45,30.069 45,25C45,19.918 43.1,15.276 39.956,11.759C39.956,11.759 42.319,9.397 43.181,8.535Z" /> + <path :d="xyStepOuter" /> </g> </a> </g> - <g - id="Bottom1" - serif:id="Bottom" - transform="matrix(6.12323e-17,1,-1,6.12323e-17,61.9767,-1.77705e-14)"> + <g id="Bottom1" transform="matrix(6.12323e-17,1,-1,6.12323e-17,61.9767,-1.77705e-14)"> <a class="step inner" @click=" doSendMove( - 'Y' + (!reverseY ? '-' : '+') + (stepsXY.length >= 0 ? stepsXY[0] : 0), + `Y${!reverseY ? '-' : '+'}${stepsXY.length >= 0 ? stepsXY[0] : 0}`, feedrateXY ) "> <g transform="matrix(0.48,0,0,0.48,19,19)"> - <path - d="M36.096,19.243C35.88,18.839 35.954,18.342 36.278,18.019C40.686,13.619 69.84,-15.445 69.84,-15.445C90.891,13.786 89.845,38.467 69.564,65.144C69.564,65.144 40.684,36.265 36.318,31.899C35.996,31.576 35.922,31.081 36.134,30.678C37.008,28.975 37.5,27.044 37.5,25C37.5,22.925 36.993,20.967 36.096,19.243Z" /> + <path :d="xyStepInner" /> </g> </a> <a class="step inner-mid" @click=" doSendMove( - 'Y' + (!reverseY ? '-' : '+') + (stepsXY.length >= 1 ? stepsXY[1] : 0), + `Y${!reverseY ? '-' : '+'}${stepsXY.length >= 1 ? stepsXY[1] : 0}`, feedrateXY ) "> <g transform="matrix(0.72,0,0,0.72,13,13)"> - <path - d="M54.897,-1.964C68.991,16.277 68.542,32.764 54.738,51.763L44.077,41.131L38.115,35.169C40.361,32.389 41.667,28.846 41.667,25C41.667,21.132 40.346,17.57 38.076,14.784L54.897,-1.964Z" /> + <path :d="xyStepInnerMid" /> </g> </a> <a class="step outer-mid" @click=" doSendMove( - 'Y' + (!reverseY ? '-' : '+') + (stepsXY.length >= 2 ? stepsXY[2] : 0), + `Y${!reverseY ? '-' : '+'}${stepsXY.length >= 2 ? stepsXY[2] : 0}`, feedrateXY ) "> <g transform="matrix(0.96,0,0,0.96,7,7)"> - <path - d="M47.418,4.777C57.663,18.688 57.829,31.029 47.304,45.072L39.308,37.098C42.081,33.838 43.75,29.612 43.75,25C43.75,20.371 42.069,16.132 39.277,12.868L47.418,4.777Z" /> + <path :d="xyStepOuterMid" /> </g> </a> <a class="step outer" @click=" doSendMove( - 'Y' + (!reverseY ? '-' : '+') + (stepsXY.length >= 3 ? stepsXY[3] : 0), + `Y${!reverseY ? '-' : '+'}${stepsXY.length >= 3 ? stepsXY[3] : 0}`, feedrateXY ) "> <g transform="matrix(1.2,0,0,1.2,1,1)"> - <path - d="M43.181,8.535C43.262,8.453 43.373,8.409 43.488,8.412C43.602,8.415 43.711,8.466 43.787,8.551C47.661,12.933 50,18.695 50,25C50,31.291 47.672,37.042 43.811,41.42C43.735,41.505 43.627,41.556 43.512,41.559C43.398,41.562 43.287,41.518 43.206,41.437C42.343,40.575 39.981,38.213 39.981,38.213C43.11,34.7 45,30.069 45,25C45,19.918 43.1,15.276 39.956,11.759C39.956,11.759 42.319,9.397 43.181,8.535Z" /> + <path :d="xyStepOuter" /> </g> </a> </g> - <g - id="Top1" - serif:id="Top" - transform="matrix(6.12323e-17,-1,1,6.12323e-17,7.10543e-15,61.9767)"> + <g id="Top1" transform="matrix(6.12323e-17,-1,1,6.12323e-17,7.10543e-15,61.9767)"> <a class="step inner" @click=" doSendMove( - 'Y' + (reverseY ? '-' : '+') + (stepsXY.length >= 0 ? stepsXY[0] : 0), + `Y${reverseY ? '-' : '+'}${stepsXY.length >= 0 ? stepsXY[0] : 0}`, feedrateXY ) "> <g transform="matrix(0.48,0,0,0.48,19,19)"> - <path - d="M36.096,19.243C35.88,18.839 35.954,18.342 36.278,18.019C40.686,13.619 69.84,-15.445 69.84,-15.445C90.891,13.786 89.845,38.467 69.564,65.144C69.564,65.144 40.684,36.265 36.318,31.899C35.996,31.576 35.922,31.081 36.134,30.678C37.008,28.975 37.5,27.044 37.5,25C37.5,22.925 36.993,20.967 36.096,19.243Z" /> + <path :d="xyStepInner" /> </g> </a> <a class="step inner-mid" @click=" doSendMove( - 'Y' + (reverseY ? '-' : '+') + (stepsXY.length >= 1 ? stepsXY[1] : 0), + `Y${reverseY ? '-' : '+'}${stepsXY.length >= 1 ? stepsXY[1] : 0}`, feedrateXY ) "> <g transform="matrix(0.72,0,0,0.72,13,13)"> - <path - d="M54.897,-1.964C68.991,16.277 68.542,32.764 54.738,51.763L44.077,41.131L38.115,35.169C40.361,32.389 41.667,28.846 41.667,25C41.667,21.132 40.346,17.57 38.076,14.784L54.897,-1.964Z" /> + <path :d="xyStepInnerMid" /> </g> </a> <a class="step outer-mid" @click=" doSendMove( - 'Y' + (reverseY ? '-' : '+') + (stepsXY.length >= 2 ? stepsXY[2] : 0), + `Y${reverseY ? '-' : '+'}${stepsXY.length >= 2 ? stepsXY[2] : 0}`, feedrateXY ) "> <g transform="matrix(0.96,0,0,0.96,7,7)"> - <path - d="M47.418,4.777C57.663,18.688 57.829,31.029 47.304,45.072L39.308,37.098C42.081,33.838 43.75,29.612 43.75,25C43.75,20.371 42.069,16.132 39.277,12.868L47.418,4.777Z" /> + <path :d="xyStepOuterMid" /> </g> </a> <a class="step outer" @click=" doSendMove( - 'Y' + (reverseY ? '-' : '+') + (stepsXY.length >= 3 ? stepsXY[3] : 0), + `Y${reverseY ? '-' : '+'}${stepsXY.length >= 3 ? stepsXY[3] : 0}`, feedrateXY ) "> <g transform="matrix(1.2,0,0,1.2,1,1)"> - <path - d="M43.181,8.535C43.262,8.453 43.373,8.409 43.488,8.412C43.602,8.415 43.711,8.466 43.787,8.551C47.661,12.933 50,18.695 50,25C50,31.291 47.672,37.042 43.811,41.42C43.735,41.505 43.627,41.556 43.512,41.559C43.398,41.562 43.287,41.518 43.206,41.437C42.343,40.575 39.981,38.213 39.981,38.213C43.11,34.7 45,30.069 45,25C45,19.918 43.1,15.276 39.956,11.759C39.956,11.759 42.319,9.397 43.181,8.535Z" /> + <path :d="xyStepOuter" /> </g> </a> </g> </g> + <!-- XY STEP BUTTON TEXT --> <g id="stepsXY"> <g transform="matrix(1,0,0,1,0.483899,4.07983)"> <text x="30.5px" y="19.056px" text-anchor="middle"> @@ -595,16 +594,33 @@ svg a#tilt_adjust #tilt_icon { </g> </g> <a - v-if="existsQGL || existsZtilt" + v-if="existsQGL && actionButton === 'qgl'" + id="tilt_adjust" + :class="colorSpecialButton" + @click="clickSpecialButton"> + <circle id="qgl_button" cx="70.92" cy="31" r="5" /> + <text x="66.776px" y="32.066px">QGL</text> + <g id="tilt_icon"> + <path :d="zTiltIcon1" /> + <path :d="zTiltIcon2" /> + </g> + </a> + <a + v-else-if="existsZtilt && actionButton === 'ztilt'" id="tilt_adjust" :class="colorSpecialButton" @click="clickSpecialButton"> <circle id="tilt_button" cx="70.92" cy="31" r="5" /> <text x="66.776px" y="32.066px">Z-TILT</text> <g id="tilt_icon"> - <path d="M74.189,31.503L67.751,30.009L67.638,30.496L74.076,31.99L74.189,31.503Z" /> - <path - d="M74.361,32.85L74.034,32.676L74.939,32.188L75.039,33.211L74.745,33.055C74.386,33.724 73.858,34.288 73.213,34.69L72.983,34.321C73.563,33.959 74.038,33.452 74.361,32.85ZM67.193,28.75C67.586,28.1 68.142,27.564 68.807,27.196L69.018,27.576C68.42,27.907 67.919,28.389 67.565,28.974L67.883,29.165L66.954,29.605L66.907,28.578L67.193,28.75Z" /> + <path :d="zTiltIcon1" /> + <path :d="zTiltIcon2" /> + </g> + </a> + <a v-else id="stepper_off" :class="homedAxes !== '' ? 'primary' : 'warning'" @click="doSend('M84')"> + <circle id="stepper_off_button" cx="70.92" cy="31" r="5" /> + <g id="stepper_off_icon" transform="scale(0.3) translate(224,91)"> + <path :d="engineOffIcon" /> </g> </a> </svg> @@ -615,11 +631,61 @@ svg a#tilt_adjust #tilt_icon { <script lang="ts"> import { Component, Mixins } from 'vue-property-decorator' -import BaseMixin from '../mixins/base' +import BaseMixin from '@/components/mixins/base' import ControlMixin from '@/components/mixins/control' @Component -export default class ControlPanelCrossControl extends Mixins(BaseMixin, ControlMixin) { +export default class CircleControl extends Mixins(BaseMixin, ControlMixin) { + /** + * SVG paths for home buttons + */ + homeIcon = 'M10,20L10,14L14,14L14,20L19,20L19,12L22,12L12,3L2,12L5,12L5,20L10,20Z' + pathHomeButtonTop = + 'M9.188,-0C9.634,0.001 10.028,0.291 10.162,0.717C10.295,1.142 10.136,1.605 9.77,1.86C6.722,4.035 4.05,6.701 1.869,9.743C1.614,10.11 1.151,10.269 0.724,10.135C0.298,10.002 0.008,9.607 0.008,9.16C0,6.418 0,2.781 0,1.029C-0,0.756 0.108,0.495 0.302,0.302C0.495,0.108 0.756,-0 1.029,0L9.188,-0Z' + pathHomeButtonBottom = + 'M9.188,0C9.634,0.001 10.028,0.291 10.162,0.717C10.295,1.142 10.136,1.605 9.77,1.86C6.722,4.035 4.05,6.701 1.869,9.743C1.614,10.11 1.151,10.269 0.724,10.135C0.298,10.002 0.008,9.607 0.008,9.16C0,6.418 0,2.781 0,1.029C-0,0.756 0.108,0.495 0.302,0.302C0.495,0.108 0.756,-0 1.029,0L9.188,0Z' + /** + * SVG paths for XY steps + */ + xyStepOuter = + 'M43.181,8.535C43.262,8.453 43.373,8.409 43.488,8.412C43.602,8.415 43.711,8.466 43.787,8.551C47.661,12.933 50,18.695 50,25C50,31.291 47.672,37.042 43.811,41.42C43.735,41.505 43.627,41.556 43.512,41.559C43.398,41.562 43.287,41.518 43.206,41.437C42.343,40.575 39.981,38.213 39.981,38.213C43.11,34.7 45,30.069 45,25C45,19.918 43.1,15.276 39.956,11.759C39.956,11.759 42.319,9.397 43.181,8.535Z' + xyStepOuterMid = + 'M47.418,4.777C57.663,18.688 57.829,31.029 47.304,45.072L39.308,37.098C42.081,33.838 43.75,29.612 43.75,25C43.75,20.371 42.069,16.132 39.277,12.868L47.418,4.777Z' + xyStepInnerMid = + 'M54.897,-1.964C68.991,16.277 68.542,32.764 54.738,51.763L44.077,41.131L38.115,35.169C40.361,32.389 41.667,28.846 41.667,25C41.667,21.132 40.346,17.57 38.076,14.784L54.897,-1.964Z' + xyStepInner = + 'M36.096,19.243C35.88,18.839 35.954,18.342 36.278,18.019C40.686,13.619 69.84,-15.445 69.84,-15.445C90.891,13.786 89.845,38.467 69.564,65.144C69.564,65.144 40.684,36.265 36.318,31.899C35.996,31.576 35.922,31.081 36.134,30.678C37.008,28.975 37.5,27.044 37.5,25C37.5,22.925 36.993,20.967 36.096,19.243Z' + /** + * SVG paths for Z steps + */ + zStepOuter = + 'M66.037,2.5C66.037,1.672 66.709,1 67.537,1L74.537,1C75.365,1 76.037,1.672 76.037,2.5L76.037,7.521C74.428,7.179 72.759,7 71.048,7C69.33,7 67.654,7.181 66.037,7.525L66.037,2.5Z' + zStepOuterMid = + 'M66.037,7.221C69.367,6.597 72.7,6.583 76.037,7.192L76.037,13.702C74.453,13.245 72.778,13 71.048,13C69.309,13 67.627,13.247 66.037,13.708L66.037,7.221Z' + zStepInnerMid = + 'M66.037,13.244C69.353,12.66 72.687,12.7 76.037,13.355L76.037,20.099C74.523,19.39 72.831,19 71.048,19C69.256,19 67.556,19.393 66.037,20.109L66.037,13.244Z' + zStepInner = + 'M66.037,19.186C69.409,18.542 72.742,18.52 76.037,19.102L76.037,23.682C76.037,23.815 75.984,23.942 75.891,24.036C75.564,24.362 74.774,25.153 74.359,25.567C74.204,25.722 73.967,25.757 73.773,25.656C72.955,25.236 72.029,25 71.048,25C70.051,25 69.112,25.243 68.284,25.674C68.09,25.777 67.852,25.742 67.697,25.586C67.283,25.175 66.506,24.395 66.183,24.071C66.09,23.977 66.037,23.85 66.037,23.718C66.037,22.806 66.037,19.186 66.037,19.186Z' + /** + * SVG path for Z Tilt icon + */ + zTiltIcon1 = 'M74.189,31.503L67.751,30.009L67.638,30.496L74.076,31.99L74.189,31.503Z' + zTiltIcon2 = + 'M74.361,32.85L74.034,32.676L74.939,32.188L75.039,33.211L74.745,33.055C74.386,33.724 73.858,34.288 73.213,34.69L72.983,34.321C73.563,33.959 74.038,33.452 74.361,32.85ZM67.193,28.75C67.586,28.1 68.142,27.564 68.807,27.196L69.018,27.576C68.42,27.907 67.919,28.389 67.565,28.974L67.883,29.165L66.954,29.605L66.907,28.578L67.193,28.75Z' + /** + * SVG path for engine off icon + */ + engineOffIcon = + 'M3.78 2.5L21.5 20.22l-1.27 1.28L18 19.27V20h-8l-2-2H5v-3H3v3H1v-8h2v3h2v-3l1.87-1.86L2.5 3.77L3.78 2.5M20 9v3h-2V8h-6V6h3V4H7.82l15 15H23V9h-3Z' + + get actionButton(): string { + return this.$store.state.gui.control.actionButton ?? this.defaultActionButton + } + + get enableXYHoming(): boolean { + return this.$store.state.gui.control.enableXYHoming + } + get reverseX() { return this.$store.state.gui.control.reverseX } diff --git a/src/components/panels/ToolheadControls/CrossControl.vue b/src/components/panels/ToolheadControls/CrossControl.vue new file mode 100644 index 000000000..f5ac949f2 --- /dev/null +++ b/src/components/panels/ToolheadControls/CrossControl.vue @@ -0,0 +1,434 @@ +<style lang="scss" scoped> +.btnMinWidthAuto { + min-width: auto !important; +} +</style> + +<template> + <responsive + :breakpoints="{ + small: (el) => el.width <= 300, + }"> + <template #default="{ el }"> + <div> + <v-row> + <!-- DIRECTION BUTTONS --> + <v-col> + <v-row dense class="mb-1"> + <v-col cols="3"></v-col> + <v-col cols="3"> + <v-btn + class="btnMinWidthAuto fill-width" + :disabled=" + !yAxisHomed || + selectedCrossStep === null || + selectedCrossStep === undefined || + ['printing'].includes(printer_state) + " + @click="doSendMove(`Y${reverseY ? '-' : '+'}${stepSize}`, feedrateXY)"> + <v-icon>{{ mdiChevronUp }}</v-icon> + </v-btn> + </v-col> + <v-col cols="3"></v-col> + <v-col cols="3"> + <v-btn + class="btnMinWidthAuto fill-width" + :disabled=" + !zAxisHomed || + selectedCrossStep === null || + selectedCrossStep === undefined || + ['printing'].includes(printer_state) + " + @click="doSendMove(`Z${reverseZ ? '-' : '+'}${stepSize}`, feedrateZ)"> + <v-icon>{{ mdiChevronUp }}</v-icon> + </v-btn> + </v-col> + </v-row> + <v-row dense> + <v-col cols="3" class="p-rel"> + <v-btn + class="btnMinWidthAuto fill-width p-abs" + style="top: -50%; width: calc(100% - 8px)" + :disabled=" + !xAxisHomed || + selectedCrossStep === null || + selectedCrossStep === undefined || + ['printing'].includes(printer_state) + " + @click="doSendMove(`X${!reverseX ? '-' : '+'}${stepSize}`, feedrateXY)"> + <v-icon>{{ mdiChevronLeft }}</v-icon> + </v-btn> + </v-col> + <v-col cols="3"> + <v-btn + class="btnMinWidthAuto fill-width" + :disabled=" + !yAxisHomed || + selectedCrossStep === null || + selectedCrossStep === undefined || + ['printing'].includes(printer_state) + " + @click="doSendMove(`Y${!reverseY ? '-' : '+'}${stepSize}`, feedrateXY)"> + <v-icon>{{ mdiChevronDown }}</v-icon> + </v-btn> + </v-col> + <v-col cols="3" class="p-rel"> + <v-btn + class="btnMinWidthAuto fill-width p-abs" + style="top: -50%; width: calc(100% - 8px)" + :disabled=" + !xAxisHomed || + selectedCrossStep === null || + selectedCrossStep === undefined || + ['printing'].includes(printer_state) + " + @click="doSendMove(`X${reverseX ? '-' : '+'}${stepSize}`, feedrateXY)"> + <v-icon>{{ mdiChevronRight }}</v-icon> + </v-btn> + </v-col> + <v-col cols="3"> + <v-btn + class="btnMinWidthAuto fill-width" + :disabled=" + !zAxisHomed || + selectedCrossStep === null || + selectedCrossStep === undefined || + ['printing'].includes(printer_state) + " + @click="doSendMove(`Z${!reverseZ ? '-' : '+'}${stepSize}`, feedrateZ)"> + <v-icon>{{ mdiChevronDown }}</v-icon> + </v-btn> + </v-col> + </v-row> + </v-col> + <!-- HOME / 5th ACTION BUTTONS --> + <v-col v-if="!el.is.small" class="d-flex align-center"> + <div class="flex-grow-1" style="border-radius: 4px; overflow: hidden"> + <v-row dense style="margin-bottom: -2px !important"> + <v-col cols="6"> + <v-btn + :disabled="['printing'].includes(printer_state)" + :loading="loadings.includes('homeAll')" + :color="homedAxes.includes('xyz') ? 'primary' : 'warning'" + height="30" + tile + class="w-100" + @click="doHome"> + <div class="d-flex align-center"> + <v-icon>{{ mdiHome }}</v-icon> + <span>{{ $t('Panels.ToolheadControlPanel.ALL') }}</span> + </div> + </v-btn> + </v-col> + <v-col cols="6" class="d-flex"> + <v-btn + v-if="actionButton === 'qgl'" + :disabled="['printing'].includes(printer_state)" + :loading="loadings.includes('qgl')" + :color="colorQuadGantryLevel" + height="30" + dense + tile + class="btnMinWidthAuto flex-grow-1 px-0" + @click="doQGL"> + {{ $t('Panels.ToolheadControlPanel.QGL') }} + </v-btn> + <v-btn + v-else-if="actionButton === 'ztilt'" + :disabled="['printing'].includes(printer_state)" + :loading="loadings.includes('zTilt')" + :color="colorZTilt" + height="30" + dense + tile + class="btnMinWidthAuto flex-grow-1 px-0" + @click="doZtilt"> + {{ $t('Panels.ToolheadControlPanel.ZTilt') }} + </v-btn> + <v-btn + v-else + :disabled="['printing'].includes(printer_state)" + :color="homedAxes !== '' ? 'primary' : 'warning'" + height="30" + dense + tile + class="flex-grow-1 px-0" + @click="doSend('M84')"> + <v-icon>{{ mdiEngineOff }}</v-icon> + </v-btn> + </v-col> + </v-row> + <!-- X/Y/Z HOME BUTTONS --> + <v-row dense> + <v-col v-if="!enableXYHoming" cols="4" class="flex-grow-1"> + <v-btn + :disabled="['printing'].includes(printer_state)" + :loading="loadings.includes('homeX')" + :color="homedAxes.includes('x') ? 'primary' : 'warning'" + tile + height="30" + class="btnMinWidthAuto w-100" + @click="doHomeX"> + X + </v-btn> + </v-col> + <v-col v-if="!enableXYHoming" cols="4" class="flex-grow-1"> + <v-btn + :disabled="['printing'].includes(printer_state)" + :loading="loadings.includes('homeY')" + :color="homedAxes.includes('y') ? 'primary' : 'warning'" + tile + height="30" + class="btnMinWidthAuto w-100" + @click="doHomeY"> + Y + </v-btn> + </v-col> + <v-col v-else cols="6" class="flex-grow-1"> + <v-btn + :disabled="['printing'].includes(printer_state)" + :loading="loadings.includes('homeY')" + :color="homedAxes.includes('xy') ? 'primary' : 'warning'" + tile + height="30" + class="btnMinWidthAuto w-100" + @click="doHomeXY"> + XY + </v-btn> + </v-col> + <v-col :class="enableXYHoming ? 'col-6' : 'col-4'" class="flex-grow-1"> + <v-btn + :disabled="['printing'].includes(printer_state)" + :loading="loadings.includes('homeZ')" + :color="homedAxes.includes('z') ? 'primary' : 'warning'" + tile + height="30" + class="btnMinWidthAuto w-100" + @click="doHomeZ"> + Z + </v-btn> + </v-col> + </v-row> + </div> + </v-col> + </v-row> + <v-row v-if="el.is.small"> + <!-- HOME / 5th ACTION BUTTONS --> + <v-col class="d-flex align-center"> + <div class="flex-grow-1" style="border-radius: 4px; overflow: hidden"> + <v-row dense style="margin-bottom: -2px !important"> + <v-col cols="6"> + <v-btn + :disabled="['printing'].includes(printer_state)" + :loading="loadings.includes('homeAll')" + :color="homedAxes.includes('xyz') ? 'primary' : 'warning'" + height="30" + tile + class="w-100" + @click="doHome"> + <div class="d-flex align-center"> + <v-icon>{{ mdiHome }}</v-icon> + <span>{{ $t('Panels.ToolheadControlPanel.ALL') }}</span> + </div> + </v-btn> + </v-col> + <v-col cols="6" class="d-flex"> + <v-btn + v-if="actionButton === 'qgl'" + :disabled="['printing'].includes(printer_state)" + :loading="loadings.includes('qgl')" + :color="colorQuadGantryLevel" + height="30" + dense + tile + class="btnMinWidthAuto flex-grow-1 px-0" + @click="doQGL"> + {{ $t('Panels.ToolheadControlPanel.QGL') }} + </v-btn> + <v-btn + v-else-if="actionButton === 'ztilt'" + :disabled="['printing'].includes(printer_state)" + :loading="loadings.includes('zTilt')" + :color="colorZTilt" + height="30" + dense + tile + class="btnMinWidthAuto flex-grow-1 px-0" + @click="doZtilt"> + {{ $t('Panels.ToolheadControlPanel.ZTilt') }} + </v-btn> + <v-btn + v-else + :disabled="['printing'].includes(printer_state)" + :color="homedAxes !== '' ? 'primary' : 'warning'" + height="30" + dense + tile + class="flex-grow-1 px-0" + @click="doSend('M84')"> + <v-icon>{{ mdiEngineOff }}</v-icon> + </v-btn> + </v-col> + </v-row> + <!-- X/Y/Z HOME BUTTONS --> + <v-row dense> + <v-col v-if="!enableXYHoming" cols="4" class="flex-grow-1"> + <v-btn + :disabled="['printing'].includes(printer_state)" + :loading="loadings.includes('homeX')" + :color="homedAxes.includes('x') ? 'primary' : 'warning'" + tile + height="30" + class="btnMinWidthAuto w-100" + @click="doHomeX"> + X + </v-btn> + </v-col> + <v-col v-if="!enableXYHoming" cols="4" class="flex-grow-1"> + <v-btn + :disabled="['printing'].includes(printer_state)" + :loading="loadings.includes('homeY')" + :color="homedAxes.includes('y') ? 'primary' : 'warning'" + tile + height="30" + class="btnMinWidthAuto w-100" + @click="doHomeY"> + Y + </v-btn> + </v-col> + <v-col v-else cols="6" class="flex-grow-1"> + <v-btn + :disabled="['printing'].includes(printer_state)" + :loading="loadings.includes('homeY')" + :color="homedAxes.includes('xy') ? 'primary' : 'warning'" + tile + height="30" + class="btnMinWidthAuto w-100" + @click="doHomeXY"> + XY + </v-btn> + </v-col> + <v-col :class="enableXYHoming ? 'col-6' : 'col-4'" class="flex-grow-1"> + <v-btn + :disabled="['printing'].includes(printer_state)" + :loading="loadings.includes('homeZ')" + :color="homedAxes.includes('z') ? 'primary' : 'warning'" + tile + height="30" + class="btnMinWidthAuto w-100" + @click="doHomeZ"> + Z + </v-btn> + </v-col> + </v-row> + </div> + </v-col> + </v-row> + <!-- STEP SIZE BUTTON GROUP --> + <v-row no-gutters class="mt-3"> + <v-col> + <v-btn-toggle + v-if="stepsReversed.length > 0" + :key="`all-steps-${stepsReversed.join('_')}`" + v-model="selectedCrossStep" + dense + mandatory + style="flex-wrap: nowrap; width: 100%"> + <v-btn + v-for="step of stepsReversed" + :key="`step-${step}`" + :disabled="['printing'].includes(printer_state)" + dense + class="btnMinWidthAuto flex-grow-1 px-0" + style="height: 28px"> + <span class="body-2">{{ step }}</span> + </v-btn> + </v-btn-toggle> + <div v-else class="font-weight-bold warning rounded pa-2"> + {{ $t('Panels.ToolheadControlPanel.PleaseConfigureSteps') }} + <br /> + <router-link style="color: white" to="/settings/interface"> + {{ $t('Panels.ToolheadControlPanel.SettingsInterfaceControl') }} + </router-link> + </div> + </v-col> + </v-row> + </div> + </template> + </responsive> +</template> + +<script lang="ts"> +import { Component, Mixins } from 'vue-property-decorator' +import BaseMixin from '@/components/mixins/base' +import ControlMixin from '@/components/mixins/control' +import Responsive from '@/components/ui/Responsive.vue' +import { mdiChevronUp, mdiChevronLeft, mdiChevronRight, mdiChevronDown, mdiEngineOff, mdiHome } from '@mdi/js' + +@Component({ + components: { Responsive }, +}) +export default class CrossControl extends Mixins(BaseMixin, ControlMixin) { + mdiChevronUp = mdiChevronUp + mdiChevronLeft = mdiChevronLeft + mdiChevronRight = mdiChevronRight + mdiChevronDown = mdiChevronDown + mdiEngineOff = mdiEngineOff + mdiHome = mdiHome + + private stepSize = this.stepsReversed[this.selectedCrossStep] + + get actionButton(): string { + return this.$store.state.gui.control.actionButton ?? this.defaultActionButton + } + + /** + * Step size selection + */ + get selectedCrossStep() { + return this.$store.state.gui.control.selectedCrossStep + } + + set selectedCrossStep(newVal) { + this.$store.dispatch('gui/saveSetting', { name: 'control.selectedCrossStep', value: newVal }) + } + + /** + * Axes reverse states + */ + get reverseX() { + return this.$store.state.gui.control.reverseX + } + + get reverseY() { + return this.$store.state.gui.control.reverseY + } + + get reverseZ() { + return this.$store.state.gui.control.reverseZ + } + + get stepsAll() { + return this.$store.state.gui.control?.stepsAll ?? [] + } + + get stepsReversed() { + return Array.from(new Set([...(this.stepsAll ?? [])])).sort((a, b) => a - b) + } + + /** + * Axes home states + */ + get xAxisHomed(): boolean { + return this.$store.state.printer.toolhead?.homed_axes.includes('x') ?? false + } + + get yAxisHomed(): boolean { + return this.$store.state.printer.toolhead?.homed_axes.includes('y') ?? false + } + + get zAxisHomed(): boolean { + return this.$store.state.printer.toolhead?.homed_axes.includes('z') ?? false + } +} +</script> diff --git a/src/components/panels/ToolheadControls/MoveToControl.vue b/src/components/panels/ToolheadControls/MoveToControl.vue new file mode 100644 index 000000000..d5afef421 --- /dev/null +++ b/src/components/panels/ToolheadControls/MoveToControl.vue @@ -0,0 +1,220 @@ +<template> + <responsive + :breakpoints="{ + small: (el) => el.width <= 320, + }"> + <template #default="{ el }"> + <v-container class="py-0"> + <v-row> + <v-col> + <v-btn-toggle v-model="positionString" dense mandatory style="flex-wrap: nowrap; width: 100%"> + <v-btn + value="absolute" + :disabled="['printing'].includes(printer_state)" + dense + class="btnMinWidthAuto flex-grow-1 px-0" + style="height: 28px"> + <span class="body-2">{{ $t('Panels.ToolheadControlPanel.Absolute') }}</span> + </v-btn> + <v-btn + value="relative" + :disabled="['printing'].includes(printer_state)" + dense + class="btnMinWidthAuto flex-grow-1 px-0" + style="height: 28px"> + <span class="body-2">{{ $t('Panels.ToolheadControlPanel.Relative') }}</span> + </v-btn> + </v-btn-toggle> + </v-col> + </v-row> + <v-form class="pt-3" @keyup.native.enter="sendCmd"> + <v-row dense> + <v-col :class="el.is.small ? 'col-12' : 'col-4'"> + <move-to-input + v-model="input.x.pos" + :label="livePositions.x" + :suffix="'X'" + :position-max="stepperXmax" + :position-min="stepperXmin" + :current-pos="gcodePositions.x" + :readonly="['printing'].includes(printer_state)" + :disabled="!xAxisHomed" + @validate="validate"></move-to-input> + </v-col> + <v-col :class="el.is.small ? 'col-12' : 'col-4'"> + <move-to-input + v-model="input.y.pos" + :label="livePositions.y" + :suffix="'Y'" + :position-max="stepperYmax" + :position-min="stepperYmin" + :current-pos="gcodePositions.y" + :readonly="['printing'].includes(printer_state)" + :disabled="!yAxisHomed" + @validate="validate"></move-to-input> + </v-col> + <v-col :class="el.is.small ? 'col-12' : 'col-4'"> + <move-to-input + v-model="input.z.pos" + :label="livePositions.z" + :suffix="'Z'" + :position-max="stepperZmax" + :position-min="stepperZmin" + :current-pos="gcodePositions.z" + :readonly="['printing'].includes(printer_state)" + :disabled="!zAxisHomed" + @validate="validate"></move-to-input> + </v-col> + </v-row> + </v-form> + </v-container> + </template> + </responsive> +</template> + +<script lang="ts"> +import { Component, Mixins, Watch } from 'vue-property-decorator' +import BaseMixin from '@/components/mixins/base' +import ControlMixin from '@/components/mixins/control' +import MoveToInput from '@/components/inputs/MoveToInput.vue' +import Responsive from '@/components/ui/Responsive.vue' + +@Component({ + components: { MoveToInput, Responsive }, +}) +export default class MoveToControl extends Mixins(BaseMixin, ControlMixin) { + input: { [index: string]: any } = { + x: { pos: '', valid: true }, + y: { pos: '', valid: true }, + z: { pos: '', valid: true }, + } + + validate(event: { axis: string; valid: boolean }): void { + this.input[event.axis].valid = event.valid + } + + @Watch('gcodePositions.x', { immediate: true }) + updatePositionX(newVal: string): void { + this.input.x.pos = newVal + } + + @Watch('gcodePositions.y', { immediate: true }) + updatePositionY(newVal: string): void { + this.input.y.pos = newVal + } + + @Watch('gcodePositions.z', { immediate: true }) + updatePositionZ(newVal: string): void { + this.input.z.pos = newVal + } + + /** + * Axes home states + */ + get xAxisHomed(): boolean { + return this.$store.state.printer.toolhead?.homed_axes.includes('x') ?? false + } + + get yAxisHomed(): boolean { + return this.$store.state.printer.toolhead?.homed_axes.includes('y') ?? false + } + + get zAxisHomed(): boolean { + return this.$store.state.printer.toolhead?.homed_axes.includes('z') ?? false + } + + /** + * Axis limits + */ + get stepperXmin(): number { + return this.$store.state.printer.configfile?.settings?.stepper_x?.position_min ?? Number.NEGATIVE_INFINITY + } + + get stepperXmax(): number { + return this.$store.state.printer.configfile?.settings?.stepper_x?.position_max ?? Number.POSITIVE_INFINITY + } + + get stepperYmin(): number { + return this.$store.state.printer.configfile?.settings?.stepper_y?.position_min ?? Number.NEGATIVE_INFINITY + } + + get stepperYmax(): number { + return this.$store.state.printer.configfile?.settings?.stepper_y?.position_max ?? Number.POSITIVE_INFINITY + } + + get stepperZmin(): number { + return this.$store.state.printer.configfile?.settings?.stepper_z?.position_min ?? Number.NEGATIVE_INFINITY + } + + get stepperZmax(): number { + return this.$store.state.printer.configfile?.settings?.stepper_z?.position_max ?? Number.POSITIVE_INFINITY + } + + /** + * Axes positions and positioning mode (G90 / G91) + */ + get displayPositionAbsolute() { + return this.positionAbsolute + ? this.$t('Panels.ToolheadControlPanel.Absolute') + : this.$t('Panels.ToolheadControlPanel.Relative') + } + + get positionAbsolute() { + return this.$store.state.printer.gcode_move?.absolute_coordinates ?? true + } + + get positionString() { + return this.positionAbsolute ? 'absolute' : 'relative' + } + + set positionString(newVal) { + let gcode = 'G90' + if (newVal === 'relative') gcode = 'G91' + + this.$store.dispatch('server/addEvent', { message: gcode, type: 'command' }) + this.$socket.emit('printer.gcode.script', { script: gcode }) + } + + get livePositions() { + const pos = this.$store.state.printer.motion_report?.live_position ?? [0, 0, 0] + return { + x: pos[0]?.toFixed(2) ?? '--', + y: pos[1]?.toFixed(2) ?? '--', + z: pos[2]?.toFixed(3) ?? '--', + } + } + + get gcodePositions() { + const pos = this.$store.state.printer.gcode_move?.gcode_position ?? [0, 0, 0] + return { + x: pos[0]?.toFixed(2) ?? '--', + y: pos[1]?.toFixed(2) ?? '--', + z: pos[2]?.toFixed(3) ?? '--', + } + } + + sendCmd(): void { + const xPos = this.input.x.pos !== this.gcodePositions.x ? ` X${this.input.x.pos}` : '' + const yPos = this.input.y.pos !== this.gcodePositions.y ? ` Y${this.input.y.pos}` : '' + const zPos = this.input.z.pos !== this.gcodePositions.z ? ` Z${this.input.z.pos}` : '' + + let gcode = '' + if (!this.positionAbsolute) { + gcode += 'G90\n' + } + if (zPos !== '') { + gcode += `G1${zPos} F${this.feedrateZ * 60}\n` + } + if (xPos !== '' || yPos !== '') { + gcode += `G1${xPos}${yPos} F${this.feedrateXY * 60}` + } + + if (gcode !== '' && this.input.x.valid && this.input.y.valid && this.input.z.valid) { + this.$store.dispatch('server/addEvent', { message: gcode, type: 'command' }) + this.$socket.emit('printer.gcode.script', { script: gcode }) + } + + return + } +} +</script> diff --git a/src/components/panels/ToolheadControls/ZoffsetControl.vue b/src/components/panels/ToolheadControls/ZoffsetControl.vue new file mode 100644 index 000000000..8aa9f8c30 --- /dev/null +++ b/src/components/panels/ToolheadControls/ZoffsetControl.vue @@ -0,0 +1,296 @@ +<style lang="scss" scoped> +.v-btn-toggle { + width: 100%; +} + +._btn-group { + border-radius: 4px; + display: inline-flex; + flex-wrap: nowrap; + max-width: 100%; + min-width: 100%; + width: 100%; + + .v-btn { + border-radius: 0; + border-color: rgba(255, 255, 255, 0.12); + border-style: solid; + border-width: thin; + box-shadow: none; + height: 28px; + opacity: 0.8; + min-width: auto !important; + } + + .v-btn:first-child { + border-top-left-radius: inherit; + border-bottom-left-radius: inherit; + } + + .v-btn:last-child { + border-top-right-radius: inherit; + border-bottom-right-radius: inherit; + } + + .v-btn:not(:first-child) { + border-left-width: 0; + } +} + +._btn-qs { + font-size: 0.8rem !important; + font-weight: 400; + max-height: 28px; +} +</style> + +<template> + <responsive + :breakpoints="{ + xsmall: (el) => el.width <= 285, + }"> + <template #default="{ el }"> + <v-container class="pa-0"> + <v-row> + <v-col class="v-subheader text--secondary pr-0"> + <v-icon small class="mr-2"> + {{ mdiLayersOutline }} + </v-icon> + <span>{{ $t('Panels.ZoffsetPanel.Headline') }}: {{ zOffset }}</span> + </v-col> + <v-col class="v-subheader justify-end pl-0"> + <div class="d-flex align-center"> + <v-btn + v-if="z_gcode_offset !== 0" + :loading="loadings.includes('babySteppingClear')" + text + small + plain + class="px-2 mr-1" + @click="clearZOffset()"> + <v-icon small>{{ mdiBroom }}</v-icon> + <span v-if="!el.is.xsmall" class="ml-1">{{ $t('Panels.ZoffsetPanel.Clear') }}</span> + </v-btn> + <v-btn + v-if=" + z_gcode_offset !== 0 && + ((existZOffsetApplyProbe && !existZOffsetApplyEndstop) || + (!existZOffsetApplyProbe && existZOffsetApplyEndstop)) + " + color="primary" + text + small + plain + class="px-2" + @click="saveZOffset"> + <v-icon small>{{ mdiContentSave }}</v-icon> + <span v-if="!el.is.xsmall" class="ml-1">{{ $t('Panels.ZoffsetPanel.Save') }}</span> + </v-btn> + <v-menu v-else-if="z_gcode_offset !== 0" offset-y left :close-on-content-click="false"> + <template #activator="{ on, attrs }"> + <v-btn plain text small color="primary" v-bind="attrs" class="pl-2 pr-0" v-on="on"> + <v-icon small>{{ mdiContentSave }}</v-icon> + <span v-if="!el.is.xsmall" class="ml-1"> + {{ $t('Panels.ZoffsetPanel.Save') }} + </span> + <v-icon small>{{ mdiMenuDown }}</v-icon> + </v-btn> + </template> + <v-list dense> + <v-list-item> + <v-btn small style="width: 100%" @click="saveZOffsetToEndstop"> + <v-icon left small>{{ mdiElectricSwitch }}</v-icon> + {{ $t('Panels.ZoffsetPanel.ToEndstop') }} + </v-btn> + </v-list-item> + <v-list-item> + <v-btn small style="width: 100%" @click="saveZOffsetToProbe"> + <v-icon left small>{{ mdiElevator }}</v-icon> + {{ $t('Panels.ZoffsetPanel.ToProbe') }} + </v-btn> + </v-list-item> + </v-list> + </v-menu> + </div> + </v-col> + </v-row> + <v-row dense> + <v-col> + <div class="d-flex align-center"> + <v-item-group class="_btn-group"> + <v-btn + v-for="(offset, index) in offsetsZ" + :key="`offsetsUp-${index}`" + small + class="_btn-qs flex-grow-1 px-1" + @click="sendBabyStepUp(offset)"> + <v-icon v-if="index === 0 && !el.is.xsmall" left small class="mr-1 ml-1"> + {{ mdiArrowSplitHorizontal }} + </v-icon> + <span>+{{ offset }}</span> + </v-btn> + </v-item-group> + </div> + </v-col> + <v-col> + <v-item-group class="_btn-group"> + <v-btn + v-for="(offset, index) in offsetsZ" + :key="`offsetsDown-${index}`" + small + class="_btn-qs flex-grow-1 px-1" + @click="sendBabyStepDown(offset)"> + <v-icon v-if="index === 0 && !el.is.xsmall" left small class="mr-1 ml-1"> + {{ mdiArrowCollapseVertical }} + </v-icon> + <span>−{{ offset }}</span> + </v-btn> + </v-item-group> + </v-col> + </v-row> + + <v-dialog v-model="saveOffsetDialog" max-width="290"> + <panel + :title="$t('Panels.ZoffsetPanel.SaveInfoHeadline').toString()" + :icon="mdiInformation" + card-class="zoffset-saveinfo-dialog" + :margin-bottom="false"> + <v-card-text v-if="printerIsPrinting" class="mt-3"> + {{ $t('Panels.ZoffsetPanel.SaveInfoDescriptionPrint') }} + </v-card-text> + <v-card-text v-else class="mt-3"> + {{ $t('Panels.ZoffsetPanel.SaveInfoDescription') }} + </v-card-text> + <v-card-actions v-if="printerIsPrinting"> + <v-spacer></v-spacer> + <v-btn text @click="saveOffsetDialog = false">{{ $t('Panels.ZoffsetPanel.Ok') }}</v-btn> + </v-card-actions> + <v-card-actions v-else> + <v-spacer></v-spacer> + <v-btn color="primary" text @click="saveConfig"> + {{ $t('Panels.ZoffsetPanel.SaveConfig') }} + </v-btn> + <v-btn text @click="saveOffsetDialog = false">{{ $t('Panels.ZoffsetPanel.Later') }}</v-btn> + </v-card-actions> + </panel> + </v-dialog> + </v-container> + </template> + </responsive> +</template> + +<script lang="ts"> +import { Component, Mixins } from 'vue-property-decorator' +import { CommandHelp } from '@/store/printer/types' +import BaseMixin from '@/components/mixins/base' +import Panel from '@/components/ui/Panel.vue' +import Responsive from '@/components/ui/Responsive.vue' + +import { + mdiBroom, + mdiElectricSwitch, + mdiElevator, + mdiContentSave, + mdiArrowCollapseVertical, + mdiInformation, + mdiMenuDown, + mdiArrowSplitHorizontal, + mdiLayersOutline, +} from '@mdi/js' +@Component({ + components: { Panel, Responsive }, +}) +export default class ZoffsetControl extends Mixins(BaseMixin) { + mdiBroom = mdiBroom + mdiElectricSwitch = mdiElectricSwitch + mdiElevator = mdiElevator + mdiContentSave = mdiContentSave + mdiArrowCollapseVertical = mdiArrowCollapseVertical + mdiInformation = mdiInformation + mdiMenuDown = mdiMenuDown + mdiArrowSplitHorizontal = mdiArrowSplitHorizontal + mdiLayersOutline = mdiLayersOutline + + private saveOffsetDialog = false + + get homing_origin() { + return this.$store.state.printer?.gcode_move?.homing_origin ?? [] + } + + get z_gcode_offset() { + return this.homing_origin.length > 1 ? Math.round(this.homing_origin[2] * 1000) / 1000 : 0 + } + + get offsetsZ() { + return this.$store.state.gui.control.offsetsZ + } + + get homed_axis() { + return this.$store.state.printer.toolhead.homed_axes ?? '' + } + + get helplist() { + return this.$store.state.printer.helplist ?? [] + } + + get existZOffsetApplyProbe() { + return this.helplist.findIndex((gcode: CommandHelp) => gcode.commandLow === 'z_offset_apply_probe') !== -1 + } + + get existZOffsetApplyEndstop() { + return this.helplist.findIndex((gcode: CommandHelp) => gcode.commandLow === 'z_offset_apply_endstop') !== -1 + } + + get zOffset(): number { + return this.$store.state.printer?.gcode_move?.homing_origin[2].toFixed(3) + } + + sendBabyStepDown(offset: number): void { + const gcode = `SET_GCODE_OFFSET Z_ADJUST=-${offset} ${this.homed_axis === 'xyz' ? 'MOVE=1' : ''}` + this.$store.dispatch('server/addEvent', { message: gcode, type: 'command' }) + this.$socket.emit('printer.gcode.script', { script: gcode }, { loading: 'babyStepDown' }) + } + + sendBabyStepUp(offset: number): void { + const gcode = `SET_GCODE_OFFSET Z_ADJUST=+${offset} ${this.homed_axis === 'xyz' ? 'MOVE=1' : ''}` + this.$store.dispatch('server/addEvent', { message: gcode, type: 'command' }) + this.$socket.emit('printer.gcode.script', { script: gcode }, { loading: 'babyStepUp' }) + } + + clearZOffset(): void { + const gcode = 'SET_GCODE_OFFSET Z=0' + (this.homed_axis === 'xyz' ? ' MOVE=1' : '') + this.$store.dispatch('server/addEvent', { message: gcode, type: 'command' }) + this.$socket.emit('printer.gcode.script', { script: gcode }, { loading: 'babySteppingClear' }) + } + + saveZOffset(): void { + if (this.existZOffsetApplyProbe && !this.existZOffsetApplyEndstop) { + this.saveZOffsetToProbe() + } + if (!this.existZOffsetApplyProbe && this.existZOffsetApplyEndstop) { + this.saveZOffsetToEndstop() + } + } + + saveZOffsetToEndstop(): void { + const gcode = 'Z_OFFSET_APPLY_ENDSTOP' + this.$store.dispatch('server/addEvent', { message: gcode, type: 'command' }) + this.$socket.emit('printer.gcode.script', { script: gcode }) + this.saveOffsetDialog = true + } + + saveZOffsetToProbe(): void { + const gcode = 'Z_OFFSET_APPLY_PROBE' + this.$store.dispatch('server/addEvent', { message: gcode, type: 'command' }) + this.$socket.emit('printer.gcode.script', { script: gcode }) + this.saveOffsetDialog = true + } + + saveConfig(): void { + const gcode = 'SAVE_CONFIG' + this.$store.dispatch('server/addEvent', { message: gcode, type: 'command' }) + this.$socket.emit('printer.gcode.script', { script: gcode }, { loading: 'topbarSaveConfig' }) + this.saveOffsetDialog = false + } +} +</script> diff --git a/src/components/panels/ZoffsetPanel.vue b/src/components/panels/ZoffsetPanel.vue deleted file mode 100644 index 1c4541183..000000000 --- a/src/components/panels/ZoffsetPanel.vue +++ /dev/null @@ -1,266 +0,0 @@ -<style></style> - -<template> - <div> - <panel - v-if="displayPanel" - :icon="mdiArrowCollapseVertical" - :title="$t('Panels.ZoffsetPanel.Headline')" - :collapsible="true" - card-class="zoffset-panel"> - <template #buttons> - <template v-if="z_gcode_offset !== 0"> - <v-btn icon tile :loading="loadings.includes('babySteppingClear')" @click="clearZOffset()"> - <v-icon>{{ mdiBroom }}</v-icon> - </v-btn> - <v-menu v-if="existZOffsetApplyProbe && existZOffsetApplyEndstop" offset-y left> - <template #activator="{ on, attrs }"> - <v-btn text tile color="primary" v-bind="attrs" class="pa-1" v-on="on"> - <span class="ml-1">{{ $t('Panels.ZoffsetPanel.Save') }}</span> - <v-icon>{{ mdiMenuDown }}</v-icon> - </v-btn> - </template> - <v-list dense class="py-0"> - <v-list-item link @click="saveZOffsetToEndstop"> - <v-list-item-icon class="mr-0"> - <v-icon small>{{ mdiElectricSwitch }}</v-icon> - </v-list-item-icon> - <v-list-item-content> - <v-list-item-title>{{ $t('Panels.ZoffsetPanel.ToEndstop') }}</v-list-item-title> - </v-list-item-content> - </v-list-item> - <v-list-item link @click="saveZOffsetToProbe"> - <v-list-item-icon class="mr-0"> - <v-icon small>{{ mdiElevator }}</v-icon> - </v-list-item-icon> - <v-list-item-content> - <v-list-item-title>{{ $t('Panels.ZoffsetPanel.ToProbe') }}</v-list-item-title> - </v-list-item-content> - </v-list-item> - </v-list> - </v-menu> - <v-btn - v-else-if="existZOffsetApplyProbe && !existZOffsetApplyEndstop" - text - tile - class="px-2 minwidth-0" - color="primary ml-3" - @click="saveZOffsetToProbe"> - <v-icon small class="mr-1">{{ mdiContentSave }}</v-icon> - {{ $t('Panels.ZoffsetPanel.Save') }} - </v-btn> - <v-btn - v-else-if="!existZOffsetApplyProbe && existZOffsetApplyEndstop" - text - tile - class="px-2 minwidth-0" - color="primary ml-3" - @click="saveZOffsetToEndstop"> - <v-icon small class="mr-1">{{ mdiContentSave }}</v-icon> - {{ $t('Panels.ZoffsetPanel.Save') }} - </v-btn> - </template> - </template> - <v-card-text class="px-0 py-0"> - <v-container> - <v-row class="py-0"> - <v-col class="pb-0 text-center"> - <p class="mb-0"> - {{ $t('Panels.ZoffsetPanel.CurrentOffset') }}: {{ z_gcode_offset.toFixed(3) }}mm - </p> - </v-col> - </v-row> - <v-row> - <v-col class="col text-center d-flex flex-column align-center flex-sm-row justify-center"> - <v-btn-toggle - dense - no-gutters - class="mx-2 mt-3 mt-sm-0 order-last flex-nowrap order-sm-first"> - <v-btn - small - class="" - :loading="loadings.includes('babySteppingDownFine')" - @click="sendBabySteppingDownFine()"> - <v-icon small class="mr-2">{{ mdiArrowCollapseDown }}</v-icon> - -0.01 - <span class="d-sm-none d-md-inline">mm</span> - </v-btn> - <v-btn - small - class="" - :loading="loadings.includes('babySteppingDown')" - @click="sendBabySteppingDown()"> - -0.05 - <span class="d-sm-none d-md-inline">mm</span> - </v-btn> - </v-btn-toggle> - <v-btn-toggle dense no-gutters class="mx-2 order-first flex-nowrap order-sm-last"> - <v-btn - small - class="" - :loading="loadings.includes('babySteppingUpFine')" - @click="sendBabySteppingUpFine()"> - <v-icon small class="mr-2">{{ mdiArrowExpandUp }}</v-icon> - +0.01 - <span class="d-sm-none d-md-inline">mm</span> - </v-btn> - <v-btn - small - class="" - :loading="loadings.includes('babySteppingUp')" - @click="sendBabySteppingUp()"> - +0.05 - <span class="d-sm-none d-md-inline">mm</span> - </v-btn> - </v-btn-toggle> - </v-col> - </v-row> - </v-container> - </v-card-text> - </panel> - <v-dialog v-model="saveOffsetDialog" max-width="290"> - <panel - :title="$t('Panels.ZoffsetPanel.SaveInfoHeadline')" - :icon="mdiInformation" - card-class="zoffset-saveinfo-dialog" - :margin-bottom="false"> - <v-card-text v-if="printerIsPrinting" class="mt-3"> - {{ $t('Panels.ZoffsetPanel.SaveInfoDescriptionPrint') }} - </v-card-text> - <v-card-text v-else class="mt-3">{{ $t('Panels.ZoffsetPanel.SaveInfoDescription') }}</v-card-text> - <v-card-actions v-if="printerIsPrinting"> - <v-spacer></v-spacer> - <v-btn text @click="saveOffsetDialog = false">{{ $t('Panels.ZoffsetPanel.Ok') }}</v-btn> - </v-card-actions> - <v-card-actions v-else> - <v-spacer></v-spacer> - <v-btn color="primary" text @click="saveConfig">{{ $t('Panels.ZoffsetPanel.SAVE_CONFIG') }}</v-btn> - <v-btn text @click="saveOffsetDialog = false">{{ $t('Panels.ZoffsetPanel.Later') }}</v-btn> - </v-card-actions> - </panel> - </v-dialog> - </div> -</template> - -<script lang="ts"> -import { Component, Mixins } from 'vue-property-decorator' -import BaseMixin from '../mixins/base' -import { CommandHelp } from '@/store/printer/types' -import Panel from '@/components/ui/Panel.vue' -import { - mdiBroom, - mdiMenuDown, - mdiElectricSwitch, - mdiElevator, - mdiContentSave, - mdiArrowCollapseVertical, - mdiArrowCollapseDown, - mdiArrowExpandUp, - mdiInformation, -} from '@mdi/js' -@Component({ - components: { Panel }, -}) -export default class ZoffsetPanel extends Mixins(BaseMixin) { - mdiBroom = mdiBroom - mdiMenuDown = mdiMenuDown - mdiElectricSwitch = mdiElectricSwitch - mdiElevator = mdiElevator - mdiContentSave = mdiContentSave - mdiArrowCollapseVertical = mdiArrowCollapseVertical - mdiArrowCollapseDown = mdiArrowCollapseDown - mdiArrowExpandUp = mdiArrowExpandUp - mdiInformation = mdiInformation - - private saveOffsetDialog = false - - get displayPanel() { - if (!this.klippyIsConnected) return false - - if (this.displayZOffsetStandby) return this.klipperReadyForGui - else if (this.klipperReadyForGui && this.z_gcode_offset !== 0) return true - else if (['printing', 'paused'].includes(this.printer_state)) return true - - return false - } - - get displayZOffsetStandby() { - return this.$store.state.gui.uiSettings.displayZOffsetStandby ?? false - } - - get homing_origin() { - return this.$store.state.printer?.gcode_move?.homing_origin ?? [] - } - - get z_gcode_offset() { - return this.homing_origin.length > 1 ? Math.round(this.homing_origin[2] * 1000) / 1000 : 0 - } - - get homed_axis() { - return this.$store.state.printer.toolhead.homed_axes ?? '' - } - - get helplist() { - return this.$store.state.printer.helplist ?? [] - } - - get existZOffsetApplyProbe() { - return this.helplist.findIndex((gcode: CommandHelp) => gcode.commandLow === 'z_offset_apply_probe') !== -1 - } - - get existZOffsetApplyEndstop() { - return this.helplist.findIndex((gcode: CommandHelp) => gcode.commandLow === 'z_offset_apply_endstop') !== -1 - } - - sendBabySteppingDownFine() { - const gcode = 'SET_GCODE_OFFSET Z_ADJUST=-0.01' + (this.homed_axis === 'xyz' ? ' MOVE=1' : '') - this.$store.dispatch('server/addEvent', { message: gcode, type: 'command' }) - this.$socket.emit('printer.gcode.script', { script: gcode }, { loading: 'babySteppingDownFine' }) - } - - sendBabySteppingDown() { - const gcode = 'SET_GCODE_OFFSET Z_ADJUST=-0.05' + (this.homed_axis === 'xyz' ? ' MOVE=1' : '') - this.$store.dispatch('server/addEvent', { message: gcode, type: 'command' }) - this.$socket.emit('printer.gcode.script', { script: gcode }, { loading: 'babySteppingDown' }) - } - - sendBabySteppingUpFine() { - const gcode = 'SET_GCODE_OFFSET Z_ADJUST=0.01' + (this.homed_axis === 'xyz' ? ' MOVE=1' : '') - this.$store.dispatch('server/addEvent', { message: gcode, type: 'command' }) - this.$socket.emit('printer.gcode.script', { script: gcode }, { loading: 'babySteppingUpFine' }) - } - - sendBabySteppingUp() { - const gcode = 'SET_GCODE_OFFSET Z_ADJUST=0.05' + (this.homed_axis === 'xyz' ? ' MOVE=1' : '') - this.$store.dispatch('server/addEvent', { message: gcode, type: 'command' }) - this.$socket.emit('printer.gcode.script', { script: gcode }, { loading: 'babySteppingUp' }) - } - - clearZOffset() { - const gcode = 'SET_GCODE_OFFSET Z=0' + (this.homed_axis === 'xyz' ? ' MOVE=1' : '') - this.$store.dispatch('server/addEvent', { message: gcode, type: 'command' }) - this.$socket.emit('printer.gcode.script', { script: gcode }, { loading: 'babySteppingClear' }) - } - - saveZOffsetToEndstop() { - const gcode = 'Z_OFFSET_APPLY_ENDSTOP' - this.$store.dispatch('server/addEvent', { message: gcode, type: 'command' }) - this.$socket.emit('printer.gcode.script', { script: gcode }) - this.saveOffsetDialog = true - } - - saveZOffsetToProbe() { - const gcode = 'Z_OFFSET_APPLY_PROBE' - this.$store.dispatch('server/addEvent', { message: gcode, type: 'command' }) - this.$socket.emit('printer.gcode.script', { script: gcode }) - this.saveOffsetDialog = true - } - - saveConfig() { - const gcode = 'SAVE_CONFIG' - this.$store.dispatch('server/addEvent', { message: gcode, type: 'command' }) - this.$socket.emit('printer.gcode.script', { script: gcode }, { loading: 'topbarSaveConfig' }) - this.saveOffsetDialog = false - } -} -</script> diff --git a/src/components/settings/SettingsConsoleTab.vue b/src/components/settings/SettingsConsoleTab.vue index 2d0bb6214..27542e35c 100644 --- a/src/components/settings/SettingsConsoleTab.vue +++ b/src/components/settings/SettingsConsoleTab.vue @@ -4,7 +4,7 @@ <div> <v-card v-if="!form.bool" flat> <v-card-text> - <settings-row :title="$t('Settings.ConsoleTab.Direction')"> + <settings-row :title="$t('Settings.ConsoleTab.Direction').toString()"> <v-select v-model="consoleDirection" :items="availableDirections" @@ -14,7 +14,7 @@ attach></v-select> </settings-row> <v-divider class="my-2"></v-divider> - <settings-row :title="$t('Settings.ConsoleTab.EntryStyle')"> + <settings-row :title="$t('Settings.ConsoleTab.EntryStyle').toString()"> <v-select v-model="entryStyle" :items="availableEntryStyles" @@ -24,7 +24,7 @@ attach></v-select> </settings-row> <v-divider class="my-2"></v-divider> - <settings-row :title="$t('Settings.ConsoleTab.Height')"> + <settings-row :title="$t('Settings.ConsoleTab.Height').toString()"> <v-slider v-model="consoleHeightTmp" hide-details @@ -35,12 +35,14 @@ @change="updateConsoleHeight"></v-slider> </settings-row> <v-divider class="my-2"></v-divider> - <settings-row :title="$t('Settings.ConsoleTab.HideTemperatures')" :dynamic-slot-width="true"> + <settings-row :title="$t('Settings.ConsoleTab.HideTemperatures').toString()" :dynamic-slot-width="true"> <v-switch v-model="hideWaitTemperatures" hide-details class="mt-0"></v-switch> </settings-row> <template v-if="moonrakerComponents.includes('timelapse')"> <v-divider class="my-2"></v-divider> - <settings-row :title="$t('Settings.ConsoleTab.HideTimelapse')" :dynamic-slot-width="true"> + <settings-row + :title="$t('Settings.ConsoleTab.HideTimelapse').toString()" + :dynamic-slot-width="true"> <v-switch v-model="hideTimelapse" hide-details class="mt-0"></v-switch> </settings-row> </template> @@ -85,7 +87,7 @@ }} </v-card-title> <v-card-text> - <settings-row :title="$t('Settings.ConsoleTab.Name')"> + <settings-row :title="$t('Settings.ConsoleTab.Name').toString()"> <v-text-field v-model="form.name" hide-details="auto" @@ -94,7 +96,7 @@ outlined></v-text-field> </settings-row> <v-divider class="my-2"></v-divider> - <settings-row :title="$t('Settings.ConsoleTab.Regex')"> + <settings-row :title="$t('Settings.ConsoleTab.Regex').toString()"> <v-textarea v-model="form.regex" outlined hide-details="auto"></v-textarea> </settings-row> </v-card-text> diff --git a/src/components/settings/SettingsControlTab.vue b/src/components/settings/SettingsControlTab.vue index 6fdfb5362..de438fca0 100644 --- a/src/components/settings/SettingsControlTab.vue +++ b/src/components/settings/SettingsControlTab.vue @@ -17,6 +17,24 @@ attach></v-select> </settings-row> <v-divider class="my-2"></v-divider> + <template v-if="['circle', 'cross'].includes(controlStyle) && actionOptions.length > 1"> + <settings-row :title="'Overwrite action button'"> + <v-select + v-model="actionButton" + :items="actionOptions" + outlined + dense + hide-details + attach></v-select> + </settings-row> + <v-divider class="my-2"></v-divider> + </template> + <settings-row + :title="$t('Settings.ControlTab.EnableXYHoming').toString()" + :dynamic-slot-width="true"> + <v-switch v-model="enableXYHoming" hide-details class="mt-0"></v-switch> + </settings-row> + <v-divider class="my-2"></v-divider> <template v-if="['circle', 'cross'].includes(controlStyle)"> <settings-row :title="$t('Settings.ControlTab.InvertXMovement').toString()" @@ -63,6 +81,7 @@ @blur="blurFeedrateZ"></v-text-field> </settings-row> <v-divider class="my-2"></v-divider> + <!-- CONTROL STYLE CROSS SPECIFICS --> <template v-if="controlStyle === 'cross'"> <settings-row :title="$t('Settings.ControlTab.MoveDistancesInMm').toString()" @@ -88,6 +107,7 @@ </settings-row> <v-divider class="my-2"></v-divider> </template> + <!-- CONTROL STYLE CIRCLE SPECIFICS --> <template v-else-if="controlStyle === 'circle'"> <settings-row :title="$t('Settings.ControlTab.MoveDistancesXYInMm').toString()" @@ -132,6 +152,7 @@ </settings-row> <v-divider class="my-2"></v-divider> </template> + <!-- CONTROL STYLE BARS SPECIFICS --> <template v-else> <settings-row :title="$t('Settings.ControlTab.MoveDistancesXYInMm').toString()" @@ -182,6 +203,31 @@ </template> <!-- EXTRUDER CONTROL SETTINGS --> <v-card-title class="mx-n4">{{ $t('Panels.ExtruderControlPanel.Headline') }}</v-card-title> + <settings-row + :title="$t('Settings.ControlTab.ZOffsetIncrements').toString()" + :mobile-second-row="true"> + <v-combobox + v-model="offsetsZ" + hide-selected + hide-details="auto" + multiple + small-chips + :deletable-chips="true" + append-icon="" + type="number" + :rules="[ + (v) => v.length > 0 || $t('Settings.ControlTab.MinimumValues', { minimum: '1' }), + (v) => + v.length <= 4 || + $t('Settings.ControlTab.MaximumValuesVisibility', { maximum: '4' }), + ]" + dense + outlined + hide-spin-buttons /> + </settings-row> + <v-divider class="my-2"></v-divider> + <!-- EXTRUDER CONTROL SETTINGS --> + <v-card-title class="mx-n4">{{ $t('Panels.ExtruderControlPanel.Headline') }}</v-card-title> <settings-row :title="$t('Settings.ControlTab.MoveDistancesEInMm').toString()" :mobile-second-row="true"> @@ -240,11 +286,13 @@ <script lang="ts"> import { Component, Mixins } from 'vue-property-decorator' import BaseMixin from '@/components/mixins/base' +import ControlMixin from '@/components/mixins/control' import SettingsRow from '@/components/settings/SettingsRow.vue' + @Component({ components: { SettingsRow }, }) -export default class SettingsControlTab extends Mixins(BaseMixin) { +export default class SettingsControlTab extends Mixins(BaseMixin, ControlMixin) { declare $refs: { formControlExtruder: HTMLFormElement } @@ -274,6 +322,54 @@ export default class SettingsControlTab extends Mixins(BaseMixin) { this.$store.dispatch('gui/saveSetting', { name: 'control.style', value: newVal }) } + get actionOptions() { + let actions = [ + { + text: this.$t('Settings.ControlTab.MotorsOff', { + isDefault: this.defaultActionButton === 'm84' ? this.$t('Settings.ControlTab.IsDefault') : '', + }), + value: 'm84', + }, + ] + if (this.existsQGL) { + actions.push({ + text: this.$t('Settings.ControlTab.QuadGantryLevel', { + isDefault: this.defaultActionButton === 'qgl' ? this.$t('Settings.ControlTab.IsDefault') : '', + }), + value: 'qgl', + }) + } + if (this.existsZtilt) { + actions.push({ + text: this.$t('Settings.ControlTab.ZTiltAdjust', { + isDefault: this.defaultActionButton === 'ztilt' ? this.$t('Settings.ControlTab.IsDefault') : '', + }), + value: 'ztilt', + }) + } + return actions + } + + get actionButton(): string { + return this.$store.state.gui.control.actionButton ?? this.defaultActionButton + } + + set actionButton(newVal) { + this.$store.dispatch('gui/saveSetting', { name: 'control.actionButton', value: newVal }) + } + + get defaultActionButton() { + return this.$store.getters['gui/getDefaultControlActionButton'] + } + + get enableXYHoming(): boolean { + return this.$store.state.gui.control.enableXYHoming ?? false + } + + set enableXYHoming(newVal) { + this.$store.dispatch('gui/saveSetting', { name: 'control.enableXYHoming', value: newVal }) + } + get reverseX() { return this.$store.state.gui.control.reverseX } @@ -314,6 +410,20 @@ export default class SettingsControlTab extends Mixins(BaseMixin) { this.$store.dispatch('gui/saveSetting', { name: 'control.feedrateZ', value: newVal }) } + get offsetsZ() { + const steps = this.$store.state.gui.control.offsetsZ + return steps.sort(function (a: number, b: number) { + return a - b + }) + } + + set offsetsZ(steps) { + // Use a set to prevent adding duplicate entries. + const absSteps = new Set() + for (const value of steps) absSteps.add(Math.abs(value)) + this.$store.dispatch('gui/saveSetting', { name: 'control.offsetsZ', value: Array.from(absSteps) }) + } + get stepsAll() { const steps = this.$store.state.gui.control.stepsAll return (steps ?? []).sort(function (a: number, b: number) { diff --git a/src/components/settings/SettingsUiSettingsTab.vue b/src/components/settings/SettingsUiSettingsTab.vue index 2b5bb2a68..5881030f2 100644 --- a/src/components/settings/SettingsUiSettingsTab.vue +++ b/src/components/settings/SettingsUiSettingsTab.vue @@ -211,14 +211,6 @@ export default class SettingsUiSettingsTab extends Mixins(BaseMixin) { this.$store.dispatch('gui/saveSetting', { name: 'uiSettings.displayCancelPrint', value: newVal }) } - get displayZOffsetStandby() { - return this.$store.state.gui.uiSettings.displayZOffsetStandby - } - - set displayZOffsetStandby(newVal) { - this.$store.dispatch('gui/saveSetting', { name: 'uiSettings.displayZOffsetStandby', value: newVal }) - } - get confirmOnEmergencyStop() { return this.$store.state.gui.uiSettings.confirmOnEmergencyStop } diff --git a/src/locales/da.json b/src/locales/da.json index 366df946f..3de6dd4c4 100644 --- a/src/locales/da.json +++ b/src/locales/da.json @@ -412,22 +412,6 @@ } }, "Panels": { - "ControlPanel": { - "ALL": "Alle", - "AlternateControls": "Alternative kontroller", - "Headline": "Kontrolpanel", - "InvertX": "Invertér X", - "InvertY": "Invertér Y", - "InvertZ": "Invertér Z", - "PleaseConfigureSteps": "Konfigurer steps", - "QGL": "QGL", - "SettingsInterfaceControl": "Indstillinger > Interface > Control", - "SetupControls": "Kontrolindstillinger", - "X": "X", - "Y": "Y", - "Z": "Z", - "ZTilt": "Z Tilt" - }, "DependenciesPanel": { "Dependency": "Afhængighed | Afhængigheder", "DependencyDescription": "Din nuværende version af {name} understøtter ikke alle funktioner i Mainsail. Opdater {name} til mindst version {neededVersion}." @@ -504,13 +488,7 @@ "On": "Tænd", "PowerControl": "Strømstyring" }, - "PrintsettingsPanel": { - "ExtrusionFactor": "Ekstrudering", - "Headline": "Print indstillinger", - "SpeedFactor": "Hastighed" - }, "StatusPanel": { - "Absolute": "Absolut", "CancelPrint": "Afbryd print", "ClearPrintStats": "Slet printstatistik", "Difference": "Opvarmning", @@ -531,19 +509,14 @@ "Max": "maks", "ObjectHeight": "Objekt Højde", "PausePrint": "Pause print", - "Position": "Position", "Print": "Reel printtid", - "Relative": "Relativ", "ReprintJob": "Print job igen", "Requested": "Anmodet", "ResumePrint": "Genoptag print", "Slicer": "Slicer", "Speed": "Hastighed", "Total": "Total", - "Unknown": "Ukendt", - "X": "X", - "Y": "Y", - "Z": "Z" + "Unknown": "Ukendt" }, "TemperaturePanel": { "AutoscaleChart": "Autoskalér diagram", @@ -572,6 +545,22 @@ "TempTooHigh": "Temperaturen er for høj for {name}! (max: {max})", "TempTooLow": "Temperaturen er for lav for {name}! (min: {min})" }, + "ToolheadControlPanel": { + "Absolute": "absolut", + "ALL": "Alle", + "Headline": "Kontrolpanel", + "InvertX": "Invertér X", + "InvertY": "Invertér Y", + "InvertZ": "Invertér Z", + "PleaseConfigureSteps": "Konfigurer steps", + "Position": "Position", + "QGL": "QGL", + "Relative": "relativ", + "SettingsInterfaceControl": "Indstillinger > Interface > Control", + "SetupControls": "Kontrolindstillinger", + "SpeedFactor": "Hastighed", + "ZTilt": "Z Tilt" + }, "WebcamPanel": { "All": "Alle", "FPS": "FPS", @@ -585,9 +574,9 @@ "Later": "Senere", "Ok": "OK", "Save": "Gem", - "SAVE_CONFIG": "GEM KONFIGURATION", - "SaveInfoDescription": "Det nye z-offset er blevet beregnet og registreret. Klik på GEM KONFIGURATION for at gemme det nye z-offset i CONFIG og genstarte Klipper.", - "SaveInfoDescriptionPrint": "Det nye z-offset er blevet beregnet og registreret. Klik på GEM KONFIGURATION i topbaren efter endt print for at gemme det nye z-offset i CONFIG og genstarte Klipper.", + "SaveConfig": "GEM KONFIGURATION", + "SaveInfoDescription": "Det nye z-offset er blevet beregnet og registreret. Klik på \"GEM KONFIGURATION\" for at gemme det nye z-offset i CONFIG og genstarte Klipper.", + "SaveInfoDescriptionPrint": "Det nye z-offset er blevet beregnet og registreret. Klik på \"GEM KONFIGURATION\" i topbaren efter endt print for at gemme det nye z-offset i CONFIG og genstarte Klipper.", "SaveInfoHeadline": "Information", "ToEndstop": "Til Endstop", "ToProbe": "Til Probe" diff --git a/src/locales/de.json b/src/locales/de.json index 18a2b0eec..a6863b56f 100644 --- a/src/locales/de.json +++ b/src/locales/de.json @@ -1,16 +1,9 @@ { "App": { "Notifications": { - "DependencyName": "Abhängigkeit: {name}", "DependencyDescription": "Die momentane {name} Version unterstützt nicht alle Funktionen von Mainsail. Aktualisiere {name} mindestens auf Version {neededVersion}.", + "DependencyName": "Abhängigkeit: {name}", "DismissAll": "Dismiss all", - "MoonrakerWarnings": { - "MoonrakerComponent": "Moonraker: {component}", - "MoonrakerFailedComponentDescription": "Beim Laden der Moonraker-Komponenten wurde ein Fehler festgestellt. Bitte prüfe die Logdatei und behebe das Problem.", - "MoonrakerWarning": "Moonraker Warnung", - "UnparsedConfigOption": "Nicht erkannte Config-Option '{option}: {value}' in Abschnitt [{section}] entdeckt. Dies kann eine Option sein, die nicht mehr verfügbar ist, oder das Ergebnis eines Moduls sein, das nicht geladen werden konnte. In Zukunft wird dies zu einem Startfehler führen.", - "UnparsedConfigSection": "Nicht erkannter Config-Abschnitt [{section}] gefunden. Dies kann das Ergebnis einer Komponente sein, die nicht geladen werden konnte. In Zukunft wird dies zu einem Startfehler führen." - }, "KlipperWarnings": { "DeprecatedOption": "Option '{option}' im Abschnitt '{section}' ist veraltet und wird in einem zukünftigen Release entfernt.", "DeprecatedOptionHeadline": "Veralterte Klipper Option", @@ -18,6 +11,13 @@ "DeprecatedValueHeadline": "Veralteter Klipper Wert", "KlipperWarning": "Klipper Warnung" }, + "MoonrakerWarnings": { + "MoonrakerComponent": "Moonraker: {component}", + "MoonrakerFailedComponentDescription": "Beim Laden der Moonraker-Komponenten wurde ein Fehler festgestellt. Bitte prüfe die Logdatei und behebe das Problem.", + "MoonrakerWarning": "Moonraker Warnung", + "UnparsedConfigOption": "Nicht erkannte Config-Option '{option}: {value}' in Abschnitt [{section}] entdeckt. Dies kann eine Option sein, die nicht mehr verfügbar ist, oder das Ergebnis eines Moduls sein, das nicht geladen werden konnte. In Zukunft wird dies zu einem Startfehler führen.", + "UnparsedConfigSection": "Nicht erkannter Config-Abschnitt [{section}] gefunden. Dies kann das Ergebnis einer Komponente sein, die nicht geladen werden konnte. In Zukunft wird dies zu einem Startfehler führen." + }, "Never": "nie", "NextReboot": "nächsten Reboot", "NoNotification": "Keine Benachrichtigung vorhanden", @@ -433,22 +433,6 @@ } }, "Panels": { - "ControlPanel": { - "ALL": "ALLE", - "AlternateControls": "Steuerkreuz", - "Headline": "Steuerung", - "InvertX": "X invertieren", - "InvertY": "Y invertieren", - "InvertZ": "Z invertieren", - "PleaseConfigureSteps": "Bitte Schritte konfigurieren", - "QGL": "QGL", - "SettingsInterfaceControl": "Einstellungen > Interface > Steuerung", - "SetupControls": "Setup-Steuerelemente", - "X": "X", - "Y": "Y", - "Z": "Z", - "ZTilt": "Z Tilt" - }, "ExtruderControlPanel": { "Allowed": "Erlaubt", "EstimatedExtrusion": "Geschätzte Extrusion:", @@ -529,13 +513,7 @@ "On": "An", "PowerControl": "Stromversorgung" }, - "PrintsettingsPanel": { - "ExtrusionFactor": "Extrusionsfaktor", - "Headline": "Druckeinstellungen", - "SpeedFactor": "Geschwindigkeitsfaktor" - }, "StatusPanel": { - "Absolute": "absolut", "CancelPrint": "Druck abbrechen", "ClearPrintStats": "Druckstatistiken löschen", "Difference": "Unterschied", @@ -556,22 +534,14 @@ "Max": "max", "ObjectHeight": "Objekthöhe", "PausePrint": "Druck pausieren", - "Position": "Position", "Print": "Druck", - "Relative": "relativ", "ReprintJob": "Auftrag erneut drucken", "Requested": "Angefordert", "ResumePrint": "Druck fortführen", "Slicer": "Slicer", "Speed": "Geschwindigkeit", "Total": "Gesamt", - "Unknown": "Unbekannt", - "X": "X", - "Y": "Y", - "Z": "Z" - }, - "ToolheadControlPanel": { - "Headline": "Werkzeugkopf-Steuerung" + "Unknown": "Unbekannt" }, "TemperaturePanel": { "AutoscaleChart": "Autoskalierung", @@ -600,6 +570,25 @@ "TempTooHigh": "Temperature von {name} zu hoch! (max: {max})", "TempTooLow": "Temperature von {name} zu niedrig! (min: {min})" }, + "ToolheadControlPanel": { + "Absolute": "absolut", + "ALL": "ALLE", + "Headline": "Werkzeugkopf", + "InvertX": "X invertieren", + "InvertY": "Y invertieren", + "InvertZ": "Z invertieren", + "PleaseConfigureSteps": "Bitte Schritte konfigurieren", + "Position": "Position", + "QGL": "QGL", + "Relative": "relativ", + "SettingsInterfaceControl": "Einstellungen > Interface > Steuerung", + "SetupControls": "Setup-Steuerelemente", + "SpeedFactor": "Geschwindigkeitsfaktor", + "XOffset": "X-Versatz", + "YOffset": "Y-Versatz", + "ZOffset": "Z-Versatz", + "ZTilt": "Z Tilt" + }, "WebcamPanel": { "All": "Alle", "FPS": "FPS", @@ -609,14 +598,15 @@ "UrlNotAvailable": "URL nicht verfügbar" }, "ZoffsetPanel": { + "Clear": "Löschen", "CurrentOffset": "Aktueller Versatz", - "Headline": "Z-Offset", + "Headline": "Z-Versatz", "Later": "Später", "Ok": "OK", "Save": "Speichern", - "SAVE_CONFIG": "SAVE_CONFIG", - "SaveInfoDescription": "Der neue Z-Versatz wurde berechnet und registriert. Auf SAVE_CONFIG, klicken um den neuen Z-Versatz in Ihrer printer.cfg zu speichern und Klipper neu zu starten.", - "SaveInfoDescriptionPrint": "Der neue Z-Versatz wurde berechnet und registriert. Nach dem Drucken auf SAVE_CONFIG in der oberen Leiste klicken um die Einstellungen in der Datei printer.cfg zu speichern und Klipper neu zu starten.", + "SaveConfig": "SAVE CONFIG", + "SaveInfoDescription": "Der neue Z-Versatz wurde berechnet und registriert. Auf \"SAVE CONFIG\", klicken um den neuen Z-Versatz in der printer.cfg zu speichern und Klipper neu zu starten.", + "SaveInfoDescriptionPrint": "Der neue Z-Versatz wurde berechnet und registriert. Nach dem Drucken auf \"SAVE CONFIG\" in der oberen Leiste klicken um den neuen Z-Versatz in der printer.cfg zu speichern und Klipper neu zu starten.", "SaveInfoHeadline": "Information", "ToEndstop": "bis Endschalter", "ToProbe": "bis Sensor" @@ -685,23 +675,31 @@ "Circle": "Kreis", "Control": "Steuerung", "Cross": "Kreuz", - "EstimatedExtrusionInfo": "Info zur geschätzten Extrusion", + "DisplayZOffset": "Z-Offset-Steuerung immer anzeigen", + "DisplayZOffsetDescription": "Wenn deaktiviert, dann werden die Steuerelemente nur angezeigt wenn ein Druckvorgang gestartet wurde.", + "EnableXYHoming": "Aktiviere kombiniertes X & Y homing", + "EstimatedExtrusionInfo": "Zeige Info zur geschätzten Extrusion", "EstimatedExtrusionInfoDescription": "Anzeigen/ausblenden der Info zur geschätzten Extrusion, basierend auf Extrusionmenge und Extrusionsgeschwindigkeit", - "InvertXMovement": "X-Bewegung invertieren", - "InvertYMovement": "Y-Bewegung invertieren", - "InvertZMovement": "Z-Bewegung invertieren", + "InvertXMovement": "Bewegung der X-Achse invertieren", + "InvertYMovement": "Bewegung der Y-Achse invertieren", + "InvertZMovement": "Bewegung der Z-Achse invertieren", + "IsDefault": " (standard)", "MaximumValues": "Maximum: {maximum} Einträge", "MaximumValuesVisibility": "Maximal {maximum} Einträge für beste Darstellung", "MinimumValues": "Minimum: {minimum} Eintrag", - "MoveDistancesEInMm": "Verfahrwege E in mm", - "MoveDistancesInMm": "Abstände in mm verschieben", - "MoveDistancesXYInMm": "Verfahrwege XY in mm", - "MoveDistancesZInMm": "Verfahrwege Z in mm", - "SpeedEInMms": "Geschw. E in mm/s", - "SpeedXY": "Geschw. XY", - "SpeedZ": "Geschw. Z", + "MotorsOff": "Motoren aus{isDefault}", + "MoveDistancesEInMm": "Extrusionslängen (in mm)", + "MoveDistancesInMm": "Schrittweiten (in mm)", + "MoveDistancesXYInMm": "Schrittweiten X & Y-Achse (in mm)", + "MoveDistancesZInMm": "Schrittweiten Z-Achse (in mm)", + "QuadGantryLevel": "Quad Gantry Level{isDefault}", + "SpeedEInMms": "Extrusions-Geschwindigkeit (in mm/s)", + "SpeedXY": "Geschwindigkeit X & Y-Achse (in mm/s)", + "SpeedZ": "Geschwindigkeit Z-Achse (in mm/s)", "Style": "Stil", - "ValueGreaterThan": "Wert muss größer als {value} sein" + "ValueGreaterThan": "Wert muss größer als {value} sein", + "ZOffsetIncrements": "Schrittweiten Z-Versatz (in mm)", + "ZTiltAdjust": "Z-Tilt Adjust{isDefault}" }, "DashboardTab": { "Dashboard": "Dashboard", @@ -898,8 +896,6 @@ "ConfirmOnPowerDeviceChangeDescription": "Zeige vor Änderung der Stromversorgung von Geräten einen Bestätigungsdialog.", "DisplayCANCEL_PRINT": "Zeige CANCEL_PRINT an", "DisplayCANCEL_PRINTDescription": "Zeigt die CANCEL_PRINT Schaltfläche dauerhaft an - keine weitere Bestätigung erforderlich.", - "DisplayZOffset": "Zeige Z-Offset-Panel an", - "DisplayZOffsetDescription": "Andernfalls wird das Bedienfeld nur nach dem Starten eines Drucks angezeigt .", "GcodeThumbnails": "G-Code Vorschaubilder", "GcodeThumbnailsDescription": "Klicke auf die Schaltfläche um zum Leitfaden zu gelangen.", "Guide": "Leitfaden", diff --git a/src/locales/en.json b/src/locales/en.json index ab0082564..b42c48945 100644 --- a/src/locales/en.json +++ b/src/locales/en.json @@ -1,16 +1,9 @@ { "App": { "Notifications": { - "DependencyName": "Dependency: {name}", "DependencyDescription": "The current {name} version does not support all features of Mainsail. Update {name} to at least {neededVersion}.", + "DependencyName": "Dependency: {name}", "DismissAll": "Dismiss all", - "MoonrakerWarnings": { - "MoonrakerComponent": "Moonraker: {component}", - "MoonrakerFailedComponentDescription": "An error was detected while loading the moonraker component '{component}'. Please check the logfile and fix the issue.", - "MoonrakerWarning": "Moonraker warning", - "UnparsedConfigOption": "Unparsed config option '{option}: {value}' detected in section [{section}]. This may be an option no longer available or could be the result of a module that failed to load. In the future this will result in a startup error.", - "UnparsedConfigSection": "Unparsed config section [{section}] detected. This may be the result of a component that failed to load. In the future this will result in a startup error." - }, "KlipperWarnings": { "DeprecatedOption": "Option '{option}' in section '{section}' is deprecated and will be removed in a future release.", "DeprecatedOptionHeadline": "Deprecated Klipper Option", @@ -18,6 +11,13 @@ "DeprecatedValueHeadline": "Deprecated Klipper Value", "KlipperWarning": "Klipper warning" }, + "MoonrakerWarnings": { + "MoonrakerComponent": "Moonraker: {component}", + "MoonrakerFailedComponentDescription": "An error was detected while loading the moonraker component '{component}'. Please check the logfile and fix the issue.", + "MoonrakerWarning": "Moonraker warning", + "UnparsedConfigOption": "Unparsed config option '{option}: {value}' detected in section [{section}]. This may be an option no longer available or could be the result of a module that failed to load. In the future this will result in a startup error.", + "UnparsedConfigSection": "Unparsed config section [{section}] detected. This may be the result of a component that failed to load. In the future this will result in a startup error." + }, "Never": "never", "NextReboot": "next reboot", "NoNotification": "No Notification available", @@ -531,13 +531,7 @@ "On": "On", "PowerControl": "Power Control" }, - "PrintsettingsPanel": { - "ExtrusionFactor": "Extrusion factor", - "Headline": "Print Settings", - "SpeedFactor": "Speed factor" - }, "StatusPanel": { - "Absolute": "absolute", "CancelPrint": "Cancel print", "ClearPrintStats": "Clear print stats", "Difference": "Difference", @@ -558,24 +552,16 @@ "Max": "max", "ObjectHeight": "Object Height", "PausePrint": "Pause print", - "Position": "Position", "Print": "Print", - "Relative": "relative", "ReprintJob": "Reprint job", "Requested": "Requested", "ResumePrint": "Resume print", "Slicer": "Slicer", "Speed": "Speed", "Total": "Total", - "Unknown": "Unknown", - "X": "X", - "Y": "Y", - "Z": "Z" - }, - "ToolheadControlPanel": { - "Headline": "Toolhead Controls" + "Unknown": "Unknown" }, - "ToolsPanel": { + "TemperaturePanel": { "AutoscaleChart": "Autoscale Chart", "Avg": "Avg", "Color": "Color", @@ -602,6 +588,26 @@ "TempTooHigh": "Temperature too high for {name}! (max: {max})", "TempTooLow": "Temperature too low for {name}! (min: {min})" }, + "ToolheadControlPanel": { + "Absolute": "absolute", + "ALL": "ALL", + "Headline": "Toolhead", + "InvertX": "Invert X", + "InvertY": "Invert Y", + "InvertZ": "Invert Z", + "MotorsOff": "Motors Off", + "PleaseConfigureSteps": "Please configure steps", + "Position": "Position", + "QGL": "QGL", + "Relative": "relative", + "SettingsInterfaceControl": "Settings > Interface > Control", + "SetupControls": "Setup Controls", + "SpeedFactor": "Speed factor", + "XOffset": "X-Offset", + "YOffset": "Y-Offset", + "ZOffset": "Z-Offset", + "ZTilt": "Z-Tilt" + }, "WebcamPanel": { "All": "All", "FPS": "FPS", @@ -611,14 +617,15 @@ "UrlNotAvailable": "URL not available" }, "ZoffsetPanel": { + "Clear": "Clear", "CurrentOffset": "current offset", "Headline": "Z-Offset", "Later": "Later", "Ok": "OK", "Save": "Save", - "SAVE_CONFIG": "SAVE_CONFIG", - "SaveInfoDescription": "The new z-offset has been calculated and registered. Click on SAVE_CONFIG to store the new z-offset in your printer.cfg and restart Klipper.", - "SaveInfoDescriptionPrint": "The new Z offset has been calculated and registered. After printing, click on SAVE_CONFIG in the top bar to store it in printer.cfg and restart Klipper.", + "SaveConfig": "SAVE CONFIG", + "SaveInfoDescription": "The new Z-Offset has been calculated and registered. Click on \"SAVE CONFIG\" to save it to the printer.cfg and restart Klipper.", + "SaveInfoDescriptionPrint": "The new Z-Offset has been calculated and registered. After printing, click on \"SAVE CONFIG\" in the top bar to save it to the printer.cfg and restart Klipper.", "SaveInfoHeadline": "Information", "ToEndstop": "to Endstop", "ToProbe": "to Probe" @@ -689,23 +696,31 @@ "Circle": "Circle", "Control": "Control", "Cross": "Cross", - "EstimatedExtrusionInfo": "Estimated Extrusion Info", + "DisplayZOffset": "Always display Z-Offset-Controls", + "DisplayZOffsetDescription": "If disabled, the controls will appear only if a print has started.", + "EnableXYHoming": "Enable combined X & Y axes homing", + "EstimatedExtrusionInfo": "Show estimated extrusion info", "EstimatedExtrusionInfoDescription": "Show / Hide info for estimated extrusions based on extrusion amount and feedrate", - "InvertXMovement": "Invert X movement", - "InvertYMovement": "Invert Y movement", - "InvertZMovement": "Invert Z movement", + "InvertXMovement": "Invert X axis movement direction", + "InvertYMovement": "Invert Y axis movement direction", + "InvertZMovement": "Invert Z axis movement direction", + "IsDefault": " (default)", "MaximumValues": "Maximum values: {maximum}", "MaximumValuesVisibility": "Maximum of {maximum} values is recommended for best visibilty", "MinimumValues": "Minimum values: {minimum}", - "MoveDistancesEInMm": "Move distances E in mm", - "MoveDistancesInMm": "Move distances in mm", - "MoveDistancesXYInMm": "Move distances XY in mm", - "MoveDistancesZInMm": "Move distances Z in mm", - "SpeedEInMms": "Speed E in mm/s", - "SpeedXY": "Speed XY", - "SpeedZ": "Speed Z", + "MotorsOff": "Motors off{isDefault}", + "MoveDistancesEInMm": "Extrusion amount presets (in mm)", + "MoveDistancesInMm": "Move distance increments (in mm)", + "MoveDistancesXYInMm": "Move distance increments X & Y axes (in mm)", + "MoveDistancesZInMm": "Move distance increments Z axis (in mm)", + "QuadGantryLevel": "Quad Gantry Level{isDefault}", + "SpeedEInMms": "Extrusion speed presets (in mm/s)", + "SpeedXY": "Movement speed X & Y axes", + "SpeedZ": "Movement speed Z axis", "Style": "Style", - "ValueGreaterThan": "Value has to be greater than {value}" + "ValueGreaterThan": "Value has to be greater than {value}", + "ZOffsetIncrements": "Z-Offset increments (in mm)", + "ZTiltAdjust": "Z-Tilt Adjust{isDefault}" }, "DashboardTab": { "Dashboard": "Dashboard", @@ -906,8 +921,6 @@ "ConfirmOnPowerDeviceChangeDescription": "Show a confirmation dialog on Device Power changes", "DisplayCANCEL_PRINT": "Display CANCEL_PRINT", "DisplayCANCEL_PRINTDescription": "Shows the CANCEL_PRINT button permanently - no second layer confirmation needed.", - "DisplayZOffset": "Show Z-Offset-Panel", - "DisplayZOffsetDescription": "Otherwise, the panel will appear only after a print has started.", "GcodeThumbnails": "G-Code thumbnails", "GcodeThumbnailsDescription": "Click on the button to get to the instructions.", "Guide": "Guide", diff --git a/src/locales/es.json b/src/locales/es.json index c1c12fd33..a5aad1ef5 100644 --- a/src/locales/es.json +++ b/src/locales/es.json @@ -396,26 +396,6 @@ } }, "Panels": { - "ControlPanel": { - "ALL": "TODO", - "AlternateControls": "Alternar controles", - "Headline": "Controles", - "InvertX": "Invertir X", - "InvertY": "Invertir Y", - "InvertZ": "Invertir Z", - "PleaseConfigureSteps": "Por favor configure los pasos", - "QGL": "QGL", - "SettingsInterfaceControl": "Configuración > Interfaz > Control", - "SetupControls": "Configurar controles", - "X": "X", - "Y": "Y", - "Z": "Z", - "ZTilt": "Z Tilt" - }, - "DependenciesPanel": { - "Dependency": "Dependencia | Dependencias", - "DependencyDescription": "La versión de {name} actual no soporta todas las funciones de Mainsail. Actualice {name} por lo menos a la versión {neededVersion}." - }, "ExtruderControlPanel": { "Extrude": "Extruir", "ExtrusionFactor": "Factor de extrusión", @@ -493,13 +473,7 @@ "On": "Encendido", "PowerControl": "Control de energía" }, - "PrintsettingsPanel": { - "ExtrusionFactor": "Factor de extrusión", - "Headline": "Configuración de impresión", - "SpeedFactor": "Factor de velocidad" - }, "StatusPanel": { - "Absolute": "absoluta", "CancelPrint": "Cancelar impresión", "ClearPrintStats": "Limpiar estadísticas de impresión", "Difference": "Diferencia", @@ -520,19 +494,14 @@ "Max": "max", "ObjectHeight": "Altura del objeto", "PausePrint": "Pausar impresión", - "Position": "Posición", "Print": "Imprimir", - "Relative": "relativa", "ReprintJob": "Reimprimir trabajo", "Requested": "Solicitada", "ResumePrint": "Reanudar impresión", "Slicer": "Laminador", "Speed": "Velocidad", "Total": "Total", - "Unknown": "Desconocido", - "X": "X", - "Y": "Y", - "Z": "Z" + "Unknown": "Desconocido" }, "TemperaturePanel": { "AutoscaleChart": "Autoescalar gráfico", @@ -561,6 +530,21 @@ "TempTooHigh": "¡Temperatura muy alta para {name}! (max: {max})", "TempTooLow": "¡Temperatura muy baja para {name}! (min: {min})" }, + "ToolheadControlPanel": { + "Absolute": "absoluta", + "ALL": "TODO", + "InvertX": "Invertir X", + "InvertY": "Invertir Y", + "InvertZ": "Invertir Z", + "PleaseConfigureSteps": "Por favor configure los pasos", + "Position": "Posición", + "QGL": "QGL", + "Relative": "relativa", + "SettingsInterfaceControl": "Configuración > Interfaz > Control", + "SetupControls": "Configurar controles", + "SpeedFactor": "Factor de velocidad", + "ZTilt": "Z Tilt" + }, "WebcamPanel": { "All": "Todos", "FPS": "FPS", @@ -574,9 +558,9 @@ "Later": "Más tarde", "Ok": "OK", "Save": "Guardar", - "SAVE_CONFIG": "SAVEE_CONFIG", - "SaveInfoDescription": "El nuervo Z-Offset fue calculado y registrado. Haga click en SAVE_CONFIG para guardar el nuevo Z-Offset en su archivo printer.cfg y reiniciar Klipper.", - "SaveInfoDescriptionPrint": "El nuevo Z-Offset fue calculado y registrado. Después de imprimir, haga click en SAVE_CONFIG en la barra superior para guardarlo en printer.cfg y reiniciar Klipper.", + "SaveConfig": "SAVEE CONFIG", + "SaveInfoDescription": "El nuervo Z-Offset fue calculado y registrado. Haga click en \"SAVE CONFIG\" para guardar el nuevo Z-Offset en su archivo printer.cfg y reiniciar Klipper.", + "SaveInfoDescriptionPrint": "El nuevo Z-Offset fue calculado y registrado. Después de imprimir, haga click en \"SAVE CONFIG\" en la barra superior para guardarlo en printer.cfg y reiniciar Klipper.", "SaveInfoHeadline": "Información", "ToEndstop": "al fin de carrera", "ToProbe": "a la sonda" diff --git a/src/locales/fr.json b/src/locales/fr.json index fbd6286fc..e3eab5634 100644 --- a/src/locales/fr.json +++ b/src/locales/fr.json @@ -380,22 +380,6 @@ } }, "Panels": { - "ControlPanel": { - "ALL": "Tous", - "AlternateControls": "Commandes en croix", - "Headline": "Contrôles", - "InvertX": "Inversion X", - "InvertY": "Inversion Y", - "InvertZ": "Inversion Z", - "PleaseConfigureSteps": "Configurez Pas", - "QGL": "QGL", - "SettingsInterfaceControl": "Réglages > Interface > Contrôle", - "SetupControls": "Réglages", - "X": "X", - "Y": "Y", - "Z": "Z", - "ZTilt": "Z Tilt" - }, "DependenciesPanel": { "Dependency": "Dépendance(s)", "DependencyDescription": "Votre version {name} ne supporte pas toutes possibilités de Mainsail. Mettez à jour {name} vers {neededVersion}." @@ -479,13 +463,7 @@ "On": "Marche", "PowerControl": "Alimentation" }, - "PrintsettingsPanel": { - "ExtrusionFactor": "Facteur d'extrusion", - "Headline": "Réglages d'impression", - "SpeedFactor": "Facteur de vitesse" - }, "StatusPanel": { - "Absolute": "absolue", "CancelPrint": "Annuler l'impression", "ClearPrintStats": "Effacer les statistiques d'impression", "Difference": "Différence", @@ -506,19 +484,14 @@ "Max": "max", "ObjectHeight": "hauteur objet", "PausePrint": "Pause impression", - "Position": "Position", "Print": "Impression", - "Relative": "relative", "ReprintJob": "Ré-impression", "Requested": "Requis", "ResumePrint": "Reprise impression", "Slicer": "Trancheur", "Speed": "Vitesse", "Total": "Total", - "Unknown": "Inconnu", - "X": "X", - "Y": "Y", - "Z": "Z" + "Unknown": "Inconnu" }, "TemperaturePanel": { "AutoscaleChart": "Echelle automatique", @@ -547,6 +520,21 @@ "TempTooHigh": "La température de {name} est trop haute, (max: {max})", "TempTooLow": "La température de {name} est trop basse, (min: {min})" }, + "ToolheadControlPanel": { + "Absolute": "absolue", + "ALL": "Tous", + "InvertX": "Inversion X", + "InvertY": "Inversion Y", + "InvertZ": "Inversion Z", + "PleaseConfigureSteps": "Configurez Pas", + "Position": "Position", + "QGL": "QGL", + "Relative": "relative", + "SettingsInterfaceControl": "Réglages > Interface > Contrôle", + "SetupControls": "Réglages", + "SpeedFactor": "Facteur de vitesse", + "ZTilt": "Z Tilt" + }, "WebcamPanel": { "All": "Tous", "FPS": "IPS", @@ -560,9 +548,9 @@ "Later": "Plus tard", "Ok": "Ok", "Save": "Sauvegarder", - "SAVE_CONFIG": "SAVE_CONFIG", - "SaveInfoDescription": "Le nouvel offset Z a été calculé et enregistré. Cliquez sur SAVE_CONFIG afin de sauvegarder les valeurs dans \"printer.cfg\" et redémarrez Klipper.", - "SaveInfoDescriptionPrint": "Le nouvel offset Z a été calculé et enregistré. Après l'impression cliquez sur SAVE_CONFIG dans la barre du haut afin de sauvegarder les valeurs dans \"printer.cfg\" et redémarrez Klipper.", + "SaveConfig": "SAVE CONFIG", + "SaveInfoDescription": "Le nouvel offset Z a été calculé et enregistré. Cliquez sur \"SAVE CONFIG\" afin de sauvegarder les valeurs dans \"printer.cfg\" et redémarrez Klipper.", + "SaveInfoDescriptionPrint": "Le nouvel offset Z a été calculé et enregistré. Après l'impression cliquez sur \"SAVE CONFIG\" dans la barre du haut afin de sauvegarder les valeurs dans \"printer.cfg\" et redémarrez Klipper.", "SaveInfoHeadline": "Information", "ToEndstop": "jusqu'au fin de course", "ToProbe": "jusqu'à la sonde" diff --git a/src/locales/hu.json b/src/locales/hu.json index 592dcde23..eb57afdb4 100644 --- a/src/locales/hu.json +++ b/src/locales/hu.json @@ -1,12 +1,12 @@ { "App": { - "Printers": "Nyomtatók", "Notifications": { "KlipperWarnings": { "DeprecatedOption": "'{section}' / '{option}' opcióját leírtuk, és a következő verzióban már nem lesz benne.", "DeprecatedValue": "'{section}' / '{option}' / Value '{value}' opcióját leírtuk, és a következő verzióban már nem lesz benne." } }, + "Printers": "Nyomtatók", "ThrottledStates": { "DescriptionCurrentlyThrottled": "Az rPi ARM mag(ok) jelenleg túlterheltek.", "DescriptionFrequencyCapped": "Az rPi ARM max frekvenciája jelenleg 1,2 GHz -re korlátozódik.", @@ -379,22 +379,6 @@ } }, "Panels": { - "ControlPanel": { - "ALL": "MIND", - "AlternateControls": "Vezérlési alternatívák", - "Headline": "Vezérlések", - "InvertX": "X invertálása", - "InvertY": "Y invertálása", - "InvertZ": "Z invertálása", - "PleaseConfigureSteps": "Kérlek állítsd be a step értékét", - "QGL": "QGL", - "SettingsInterfaceControl": "Beállítások > Kezelőfelület > Vezérlés", - "SetupControls": "Beállítás vezérlései", - "X": "X", - "Y": "Y", - "Z": "Z", - "ZTilt": "Z dőlésszög" - }, "DependenciesPanel": { "Dependency": "Függőség | Függőségek", "DependencyDescription": "A jelenlegi verzió {name} nem támogatja a Mainsail minden funkcióját. Frissítsd a {name} verziót legalább erre: {neededVersion}." @@ -476,13 +460,7 @@ "On": "BE", "PowerControl": "Tápellátás vezérlés" }, - "PrintsettingsPanel": { - "ExtrusionFactor": "Extrudálási szorzó", - "Headline": "Nyomtatási beállítások", - "SpeedFactor": "Sebességállítás" - }, "StatusPanel": { - "Absolute": "abszolút", "CancelPrint": "Nyomtatás megszakítása", "ClearPrintStats": "Nyomt. statisztikák törlése", "Difference": "Különbség", @@ -503,19 +481,14 @@ "Max": "max", "ObjectHeight": "Tárgy magassága", "PausePrint": "Nyomtatás szüneteltetése", - "Position": "Pozíció", "Print": "Nyomtatás", - "Relative": "relatív", "ReprintJob": "Munka újranyomtatása", "Requested": "Kért", "ResumePrint": "Nyomtatás folytatása", "Slicer": "Slicer", "Speed": "Sebesség", "Total": "Összesen", - "Unknown": "Ismeretlen", - "X": "X", - "Y": "Y", - "Z": "Z" + "Unknown": "Ismeretlen" }, "TemperaturePanel": { "AutoscaleChart": "Grafikon automatikus méretezése", @@ -544,6 +517,21 @@ "TempTooHigh": "A {name} hőmérséklete túl magas! (max: {max})", "TempTooLow": "A {name} hőmérséklete túl alacsony! (min: {min})" }, + "ToolheadControlPanel": { + "Absolute": "abszolút", + "ALL": "MIND", + "InvertX": "X invertálása", + "InvertY": "Y invertálása", + "InvertZ": "Z invertálása", + "PleaseConfigureSteps": "Kérlek állítsd be a step értékét", + "Position": "Pozíció", + "QGL": "QGL", + "Relative": "relatív", + "SettingsInterfaceControl": "Beállítások > Kezelőfelület > Vezérlés", + "SetupControls": "Beállítás vezérlései", + "SpeedFactor": "Sebességállítás", + "ZTilt": "Z dőlésszög" + }, "WebcamPanel": { "All": "Mind", "FPS": "FPS", @@ -557,9 +545,9 @@ "Later": "Később", "Ok": "OK", "Save": "Mentés", - "SAVE_CONFIG": "BÁLLÍTÁS MENTÉSE", - "SaveInfoDescription": "Új Z-eltolás kiszámítva és regisztrálva. Kattints a BÁLLÍTÁS MENTÉSE gombra az új Z-eltolás eltárolásához a printer.cfg-be és indítsd újra a Klippert.", - "SaveInfoDescriptionPrint": "Új Z-eltolás kiszámítva és regisztrálva. Nyomtatás után kattints a BÁLLÍTÁS MENTÉSE-re a felső sávban, a printer.cfg-be eltárolásához és a Klipper újraindításához.", + "SaveConfig": "BÁLLÍTÁS MENTÉSE", + "SaveInfoDescription": "Új Z-eltolás kiszámítva és regisztrálva. Kattints a \"BÁLLÍTÁS MENTÉSE\" gombra az új Z-eltolás eltárolásához a printer.cfg-be és indítsd újra a Klippert.", + "SaveInfoDescriptionPrint": "Új Z-eltolás kiszámítva és regisztrálva. Nyomtatás után kattints a \"BÁLLÍTÁS MENTÉSE\"-re a felső sávban, a printer.cfg-be eltárolásához és a Klipper újraindításához.", "SaveInfoHeadline": "Információ", "ToEndstop": "a végállásig", "ToProbe": "szondáig" diff --git a/src/locales/it.json b/src/locales/it.json index d805128ea..aac71ec8b 100644 --- a/src/locales/it.json +++ b/src/locales/it.json @@ -1,12 +1,12 @@ { "App": { - "Printers": "Stampanti", "Notifications": { "KlipperWarnings": { "DeprecatedOption": "L'opzione '{option}' nella sezione '{section}' è obsoleta e sarà rimossa in una versione futura.", "DeprecatedValue": "Il valore '{value}' in '{option}' nella sezione '{section}' è obsoleto e sarà rimosso in una versione futura." } }, + "Printers": "Stampanti", "ThrottledStates": { "DescriptionCurrentlyThrottled": "Uno o più core ARM dell'rPI sono attualmente rallentati.", "DescriptionFrequencyCapped": "La frequenza massima del processore ARM dell'rPI è attualmente limitata a 1,2 GHz.", @@ -379,26 +379,6 @@ } }, "Panels": { - "ControlPanel": { - "ALL": "TUTTI", - "AlternateControls": "Controlli Alternativi", - "Headline": "Controlli", - "InvertX": "Inverti X", - "InvertY": "Inverti Y", - "InvertZ": "Inverti Z", - "PleaseConfigureSteps": "Configura gli step", - "QGL": "QGL", - "SettingsInterfaceControl": "Impostazioni> Interfaccia> Controllo", - "SetupControls": "Controlli Installazione", - "X": "X", - "Y": "Y", - "Z": "Z", - "ZTilt": "Inclinazione Z" - }, - "DependenciesPanel": { - "Dependency": "Dipendenze", - "DependencyDescription": "L'attuale versione di {name} non supporta tutte le features di Mainsail. Aggiorna {name} almeno alla versione {neededVersion}." - }, "ExtruderControlPanel": { "Extrude": "Estrudi", "ExtrusionFactor": "Fattore di estrusione", @@ -478,13 +458,7 @@ "On": "Acceso", "PowerControl": "Controllo Alimentazione" }, - "PrintsettingsPanel": { - "ExtrusionFactor": "Fattore di estrusione", - "Headline": "Impostazioni di Stampa", - "SpeedFactor": "Fattore di velocità" - }, "StatusPanel": { - "Absolute": "assoluto", "CancelPrint": "Annulla stampa", "ClearPrintStats": "Cancella statistiche di stampa", "Difference": "Differenza", @@ -505,19 +479,14 @@ "Max": "max", "ObjectHeight": "Altezza Oggetto", "PausePrint": "Metti in Pausa la stampa", - "Position": "Posizione", "Print": "Stampa", - "Relative": "relativo", "ReprintJob": "Ristampa il processo", "Requested": "Richiesto", "ResumePrint": "Riprendi stampa", "Slicer": "Slicer", "Speed": "Velocità", "Total": "Totale", - "Unknown": "Sconosciuto", - "X": "X", - "Y": "Y", - "Z": "Z" + "Unknown": "Sconosciuto" }, "TemperaturePanel": { "AutoscaleChart": "Scala automaticamente il Grafico", @@ -546,6 +515,21 @@ "TempTooHigh": "Temperatura troppo alta per {name}! (max: {max})", "TempTooLow": "Temperatura troppo bassa per {name}! (min: {min})" }, + "ToolheadControlPanel": { + "Absolute": "assoluto", + "ALL": "TUTTI", + "InvertX": "Inverti X", + "InvertY": "Inverti Y", + "InvertZ": "Inverti Z", + "PleaseConfigureSteps": "Configura gli step", + "Position": "Posizione", + "QGL": "QGL", + "Relative": "relativo", + "SettingsInterfaceControl": "Impostazioni> Interfaccia> Controllo", + "SetupControls": "Controlli Installazione", + "SpeedFactor": "Fattore di velocità", + "ZTilt": "Inclinazione Z" + }, "WebcamPanel": { "All": "Tutto", "FPS": "FPS", @@ -553,16 +537,15 @@ "UnknownWebcamService": "Servizio Webcam Sconosciuto", "UrlNotAvailable": "URL non disponibile" }, - "ZOffsetPanel": {}, "ZoffsetPanel": { "CurrentOffset": "offset corrente", "Headline": "Z-Offset", "Later": "Dopo", "Ok": "OK", "Save": "Salva", - "SAVE_CONFIG": "SAVE_CONFIG", - "SaveInfoDescription": "Il nuovo z-offset è stato calcolato e registrato. Fai clic su SAVE_CONFIG per memorizzare il nuovo z-offset nel tuo printer.cfg e riavviare Klipper.", - "SaveInfoDescriptionPrint": "Il nuovo Z offset è stato calcolato e registrato. Dopo la stampa, fai clic su SAVE_CONFIG nella barra in alto per salvarlo in printer.cfg e riavviare Klipper.", + "SaveConfig": "SAVE CONFIG", + "SaveInfoDescription": "Il nuovo z-offset è stato calcolato e registrato. Fai clic su \"SAVE CONFIG\" per memorizzare il nuovo z-offset nel tuo printer.cfg e riavviare Klipper.", + "SaveInfoDescriptionPrint": "Il nuovo Z offset è stato calcolato e registrato. Dopo la stampa, fai clic su \"SAVE CONFIG\" nella barra in alto per salvarlo in printer.cfg e riavviare Klipper.", "SaveInfoHeadline": "Informazione", "ToEndstop": "all'Endstop", "ToProbe": "alla Sonda" diff --git a/src/locales/nl.json b/src/locales/nl.json index ecefc9ffd..82fa02a09 100644 --- a/src/locales/nl.json +++ b/src/locales/nl.json @@ -1,12 +1,12 @@ { "App": { - "Printers": "Printers", "Notifications": { "KlipperWarnings": { "DeprecatedOption": "Optie '{option}' in sectie '{section}' is verouderd en wordt in een toekomstige versie verwijderd.", "DeprecatedValue": "Waarde '{value}' in optie '{option}' in sectie '{section}' is verouderd en wordt in een toekomstige versie verwijderd." } }, + "Printers": "Printers", "ThrottledStates": { "DescriptionCurrentlyThrottled": "rPi ARM core(s) worden momenteel gethrottled.", "DescriptionFrequencyCapped": "rPi ARM max frequency is momenteel beperkt tot 1.2 GHz.", @@ -379,30 +379,6 @@ } }, "Panels": { - "ControlPanel": { - "ALL": "ALLES", - "AlternateControls": "Alternatieve bediening", - "Controls": "Bediening", - "Headline": "Bediening", - "Home": "Home", - "HotendTooCold": "Hotend temp. lager dan", - "InvertX": "Inverteer X", - "InvertY": "Inverteer Y", - "InvertZ": "Inverteer Z", - "Macros": "Macros", - "PleaseConfigureSteps": "Configureer steps", - "QGL": "QGL", - "SettingsInterfaceControl": "Instllingen > Interface > Bediening", - "SetupControls": "Bewerk Bediening", - "X": "X", - "Y": "Y", - "Z": "Z", - "ZTilt": "Z Tilt" - }, - "DependenciesPanel": { - "Dependency": "Afhankelijkheid | Afhankelijkheden", - "DependencyDescription": "Je huidige {name} versie ondersteunt niet alle features van Mainsail. Update {name} naar tenminste {neededVersion}" - }, "ExtruderControlPanel": { "Extrude": "Extrude", "ExtrusionFactor": "Extrusie factor", @@ -496,13 +472,7 @@ "On": "Aan", "PowerControl": "Power Control" }, - "PrintsettingsPanel": { - "ExtrusionFactor": "Extrusie factor", - "Headline": "Print instellingen", - "SpeedFactor": "Snelheid factor" - }, "StatusPanel": { - "Absolute": "absoluut", "CancelPrint": "Annuleer print", "ClearPrintStats": "Wis print statistieken", "Difference": "Verschil", @@ -523,19 +493,14 @@ "Max": "max", "ObjectHeight": "Objecthoogte", "PausePrint": "Pauzeer print", - "Position": "Positie", "Print": "Print", - "Relative": "relatief", "ReprintJob": "Herprint job", "Requested": "Aangevraagd", "ResumePrint": "Hervat print", "Slicer": "Slicer", "Speed": "Snelheid", "Total": "Totaal", - "Unknown": "Onbekend", - "X": "X", - "Y": "Y", - "Z": "Z" + "Unknown": "Onbekend" }, "TemperaturePanel": { "AutoscaleChart": "Schaal automatisch", @@ -571,6 +536,25 @@ "TempTooLow": "Temperatuur te laag voor {name}! (min: {min})", "UNKNOWN": "ONBEKEND" }, + "ToolheadControlPanel": { + "Absolute": "absoluut", + "ALL": "ALLES", + "Controls": "Bediening", + "Home": "Home", + "HotendTooCold": "Hotend temp. lager dan", + "InvertX": "Inverteer X", + "InvertY": "Inverteer Y", + "InvertZ": "Inverteer Z", + "Macros": "Macros", + "PleaseConfigureSteps": "Configureer steps", + "Position": "Positie", + "QGL": "QGL", + "Relative": "relatief", + "SettingsInterfaceControl": "Instllingen > Interface > Bediening", + "SetupControls": "Bewerk Bediening", + "SpeedFactor": "Snelheid factor", + "ZTilt": "Z Tilt" + }, "WebcamPanel": { "All": "Alle", "FPS": "FPS", @@ -579,19 +563,15 @@ "UrlNotAvailable": "URL niet beschikbaar", "Webcam": "Webcam" }, - "ZOffsetPanel": { - "CurrentOffset": "Huidige Offset", - "ZBabyStepping": "Z Baby Stepping" - }, "ZoffsetPanel": { "CurrentOffset": "Huidige offset", "Headline": "Z offset", "Later": "Later", "Ok": "Ok", "Save": "Opslaan", - "SAVE_CONFIG": "SAVE_CONFIG", - "SaveInfoDescription": "De nieuwe z-offset is berekend en geregistreerd. Klik op SAVE_CONFIG om de nieuwe z-offset op te slaan in je printer.cf en Klipper te herstarten.", - "SaveInfoDescriptionPrint": "De nieuwe z-offset is berekend en geregistreerd. Klik na het printen op SAVE_CONFIG om de nieuwe z-offset op te slaan in je printer.cf en Klipper te herstarten.", + "SaveConfig": "SAVE CONFIG", + "SaveInfoDescription": "De nieuwe z-offset is berekend en geregistreerd. Klik op \"SAVE CONFIG\" om de nieuwe z-offset op te slaan in je printer.cf en Klipper te herstarten.", + "SaveInfoDescriptionPrint": "De nieuwe z-offset is berekend en geregistreerd. Klik na het printen op \"SAVE CONFIG\" om de nieuwe z-offset op te slaan in je printer.cf en Klipper te herstarten.", "SaveInfoHeadline": "Informatie", "ToEndstop": "naar Endstop", "ToProbe": "naar Probe", diff --git a/src/locales/pl.json b/src/locales/pl.json index ab0942318..e9fd50d5c 100644 --- a/src/locales/pl.json +++ b/src/locales/pl.json @@ -1,12 +1,12 @@ { "App": { - "Printers": "Drukarki", "Notifications": { "KlipperWarnings": { "DeprecatedOption": "Opcja '{option}' w sekcji '{section}' jest przestarzała i zostanie usunięta w przyszłych wydaniach.", "DeprecatedValue": "Ustawienie '{value}' w opcji '{option}' w sekcji '{section}' jest przestarzała i zostanie usunięta w przyszłych wydaniach." } }, + "Printers": "Drukarki", "ThrottledStates": { "DescriptionCurrentlyThrottled": "Częstotliwość rdzeni rPi jest aktualnie obniżona.", "DescriptionFrequencyCapped": "Taktowanie rPi ograniczone do 1.2 GHz.", @@ -379,26 +379,6 @@ } }, "Panels": { - "ControlPanel": { - "ALL": "WSZYSTKIE", - "AlternateControls": "Alternatywne sterowanie", - "Headline": "Sterowanie drukarką", - "InvertX": "Odwróć oś X", - "InvertY": "Odwróć oś Y", - "InvertZ": "Odwróć oś Z", - "PleaseConfigureSteps": "Proszę skonfigurować kroki", - "QGL": "QGL", - "SettingsInterfaceControl": "Ustawienia > Interfejs > Konfiguracja", - "SetupControls": "Konfiguracja sterowania", - "X": "X", - "Y": "Y", - "Z": "Z", - "ZTilt": "Nachylenie osi Z" - }, - "DependenciesPanel": { - "Dependency": "Zależność | Zależności", - "DependencyDescription": "Twoja aktualna {name} wersja nie wspiera wszystkich funkcji Mainsaila. Zaktualizuj {name} do wersji co najmniej {neededVersion}." - }, "ExtruderControlPanel": { "Extrude": "Wytłocz", "ExtrusionFactor": "Wartość ekstruzji", @@ -476,13 +456,7 @@ "On": "Wł.", "PowerControl": "Kontrola zasilania" }, - "PrintsettingsPanel": { - "ExtrusionFactor": "Wartość ekstruzji", - "Headline": "Ustawienia wydruku", - "SpeedFactor": "Wartość prędkości" - }, "StatusPanel": { - "Absolute": "absolutna", "CancelPrint": "Anuluj wydruk", "ClearPrintStats": "Wyczyść statystyki drukarki", "Difference": "Różnica", @@ -503,19 +477,14 @@ "Max": "Maks.", "ObjectHeight": "Wysokość obiektu", "PausePrint": "Pauza wydruku", - "Position": "Pozycja", "Print": "Drukuj", - "Relative": "względna", "ReprintJob": "Ponownie wydrukuj", "Requested": "Wymagane", "ResumePrint": "Wznowienie wydruku", "Slicer": "Slicer", "Speed": "Prędkość", "Total": "Całkowicie", - "Unknown": "Nieznany", - "X": "X", - "Y": "Y", - "Z": "Z" + "Unknown": "Nieznany" }, "TemperaturePanel": { "AutoscaleChart": "Autoskaluj wykres", @@ -544,6 +513,22 @@ "TempTooHigh": "Temperatura zbyt wysoka dla {name}! (max: {max})", "TempTooLow": "Temperatura zbyt mała dla {name}! (min: {min})" }, + "ToolheadControlPanel": { + "Absolute": "absolutna", + "ALL": "WSZYSTKIE", + "Headline": "Sterowanie drukarką", + "InvertX": "Odwróć oś X", + "InvertY": "Odwróć oś Y", + "InvertZ": "Odwróć oś Z", + "PleaseConfigureSteps": "Proszę skonfigurować kroki", + "Position": "Pozycja", + "QGL": "QGL", + "Relative": "względna", + "SettingsInterfaceControl": "Ustawienia > Interfejs > Konfiguracja", + "SetupControls": "Konfiguracja sterowania", + "SpeedFactor": "Wartość prędkości", + "ZTilt": "Nachylenie osi Z" + }, "WebcamPanel": { "All": "Wszystkie", "FPS": "Kl/S", @@ -557,9 +542,9 @@ "Later": "Później", "Ok": "Okej", "Save": "Zapisz", - "SAVE_CONFIG": "ZAPISZ_KONFIGURACJĘ", - "SaveInfoDescription": "Nowe przesunięcie osi z zostało przeliczone i zarejestrowane. Kliknij na ZAPISZ_KONFIGURACJĘ aby zapisać nowe przesunięcie w drukarka.cfg i uruchom ponownie Klippera.", - "SaveInfoDescriptionPrint": "Nowe przesunięcie osi z zostało przeliczone i zarejestrowane. Po wydrukowaniu , kliknij na ZAPISZ_KONFIGURACJĘ aby zapisać nowe przesunięcie w drukarka.cfg i uruchom ponownie Klippera.", + "SaveConfig": "ZAPISZ KONFIGURACJĘ", + "SaveInfoDescription": "Nowe przesunięcie osi z zostało przeliczone i zarejestrowane. Kliknij na \"ZAPISZ KONFIGURACJĘ\" aby zapisać nowe przesunięcie w drukarka.cfg i uruchom ponownie Klippera.", + "SaveInfoDescriptionPrint": "Nowe przesunięcie osi z zostało przeliczone i zarejestrowane. Po wydrukowaniu , kliknij na \"ZAPISZ KONFIGURACJĘ\" aby zapisać nowe przesunięcie w drukarka.cfg i uruchom ponownie Klippera.", "SaveInfoHeadline": "Informacja", "ToEndstop": "Do krańcówki", "ToProbe": "Do sondy" diff --git a/src/locales/ru.json b/src/locales/ru.json index 9add4bafd..83dee1ad0 100644 --- a/src/locales/ru.json +++ b/src/locales/ru.json @@ -1,12 +1,12 @@ { "App": { - "Printers": "Принтер", "Notifications": { "KlipperWarnings": { "DeprecatedOption": "Опция '{option}' в разделе '{section}' устарела и будет удалена в будущем выпуске.", "DeprecatedValue": "Значение '{value}' в опции '{option}' в секции '{section}' устарело и будет удалено в будущем релизе." } }, + "Printers": "Принтер", "ThrottledStates": { "DescriptionCurrentlyThrottled": "ARM-ядро(ядра) rPi в настоящее время дросселируется.", "DescriptionFrequencyCapped": "Максимальная частота rPi ARM в настоящее время ограничена 1,2 ГГц.", @@ -379,29 +379,6 @@ } }, "Panels": { - "ControlPanel": { - "ALL": "ALL", - "AlternateControls": "Альтернативный контроль", - "Controls": "Контроль", - "Headline": "Управление", - "Home": "Home", - "InvertX": "X инвертировать", - "InvertY": "Y инвертировать", - "InvertZ": "Z инвертировать", - "Macros": "Макрос", - "PleaseConfigureSteps": "Пожалуйста, настройте расстояние вращения", - "QGL": "QGL", - "SettingsInterfaceControl": "Настройки > интерфейс > управление", - "SetupControls": "Установить контроль", - "X": "X", - "Y": "Y", - "Z": "Z", - "ZTilt": "Z Tilt" - }, - "DependenciesPanel": { - "Dependency": "Зависимость | Зависимости", - "DependencyDescription": "Ваша текущая версия {name} не поддерживает все функции Mainsail. Обновите {name} по крайней мере до версии {neededVersion}." - }, "ExtruderControlPanel": { "Extrude": "Экструдировать", "ExtrusionFactor": "Коэффициент экструзии", @@ -495,13 +472,7 @@ "On": "На сайте", "PowerControl": "Переключатель питания" }, - "PrintsettingsPanel": { - "ExtrusionFactor": "Коэффициент экструзии", - "Headline": "Настройки печати", - "SpeedFactor": "Коэффициент скорости" - }, "StatusPanel": { - "Absolute": "Абсолютно", "CancelPrint": "Отменить давление", "ClearPrintStats": "Удаление статистики печати", "Difference": "Разница", @@ -522,19 +493,14 @@ "Max": "макс.", "ObjectHeight": "Высота объекта", "PausePrint": "Давление прерывания", - "Position": "Позиция", "Print": "Печать", - "Relative": "Инкрементальный", "ReprintJob": "Повторять давление", "Requested": "Запрошено", "ResumePrint": "Возобновить печать", "Slicer": "Slicer", "Speed": "Скорость", "Total": "Всего", - "Unknown": "Неизвестный", - "X": "X", - "Y": "Y", - "Z": "Z" + "Unknown": "Неизвестный" }, "TemperaturePanel": { "AutoscaleChart": "Автомасштабируемая диаграмма", @@ -570,6 +536,24 @@ "TempTooLow": "Температура слишком низкая для {name}! (min: {min})", "UNKNOWN": "ЗНАЕТЕ" }, + "ToolheadControlPanel": { + "Absolute": "Абсолютно", + "ALL": "ALL", + "Controls": "Контроль", + "Home": "Home", + "InvertX": "X инвертировать", + "InvertY": "Y инвертировать", + "InvertZ": "Z инвертировать", + "Macros": "Макрос", + "PleaseConfigureSteps": "Пожалуйста, настройте расстояние вращения", + "Position": "Позиция", + "QGL": "QGL", + "Relative": "Инкрементальный", + "SettingsInterfaceControl": "Настройки > интерфейс > управление", + "SetupControls": "Установить контроль", + "SpeedFactor": "Коэффициент скорости", + "ZTilt": "Z Tilt" + }, "WebcamPanel": { "All": "Все", "FPS": "FPS", @@ -578,19 +562,15 @@ "UrlNotAvailable": "URL недоступен", "Webcam": "Веб-камера" }, - "ZOffsetPanel": { - "CurrentOffset": "Смещение тока: ", - "ZBabyStepping": "Z Смещение" - }, "ZoffsetPanel": { "CurrentOffset": "Текущее смещение", "Headline": "Z-смещение", "Later": "Позже", "Ok": "OK", "Save": "Сохранить", - "SAVE_CONFIG": "СОХРАНИТЬ_КОНФИГ", - "SaveInfoDescription": "Новое z-смещение было рассчитано и зарегистрировано. Нажмите SAVE_CONFIG, чтобы сохранить новое z-смещение в файле printer.cfg, и перезапустите Klipper.", - "SaveInfoDescriptionPrint": "Новое смещение по Z было рассчитано и зарегистрировано. После печати нажмите на SAVE_CONFIG в верхней панели, чтобы сохранить его в файле printer.cfg, и перезапустите Klipper.", + "SaveConfig": "SAVE CONFIG", + "SaveInfoDescription": "Новое z-смещение было рассчитано и зарегистрировано. Нажмите \"SAVE CONFIG\", чтобы сохранить новое z-смещение в файле printer.cfg, и перезапустите Klipper.", + "SaveInfoDescriptionPrint": "Новое смещение по Z было рассчитано и зарегистрировано. После печати нажмите на \"SAVE CONFIG\" в верхней панели, чтобы сохранить его в файле printer.cfg, и перезапустите Klipper.", "SaveInfoHeadline": "Информация", "ToEndstop": "до конечной остановки", "ToProbe": "к зонду" diff --git a/src/locales/zh-tw.json b/src/locales/zh-tw.json index 126a344cb..25f0932fc 100644 --- a/src/locales/zh-tw.json +++ b/src/locales/zh-tw.json @@ -1,12 +1,12 @@ { "App": { - "Printers": "列印機組", "Notifications": { "KlipperWarnings": { "DeprecatedOption": "{section}' 中的部分選項 '{option}' 已棄用,將在未來版本中刪除。", "DeprecatedValue": "不推薦使用'{section}' 部分的選項'{option}' 中的值'{value}',並將在未來版本中刪除。" } }, + "Printers": "列印機組", "ThrottledStates": { "DescriptionCurrentlyThrottled": "樹莓派ARM核心目前已被限制.", "DescriptionFrequencyCapped": "樹莓派ARM最大頻率目前限制為1.2 GHz.", @@ -328,26 +328,6 @@ } }, "Panels": { - "ControlPanel": { - "ALL": "所有", - "AlternateControls": "備用控制", - "Headline": "控制", - "InvertX": "翻轉 X", - "InvertY": "翻轉 Y", - "InvertZ": "翻轉 Z", - "PleaseConfigureSteps": "請設定步進", - "QGL": "QGL", - "SettingsInterfaceControl": "設定 > 界面 > 控制", - "SetupControls": "設定控制", - "X": "X", - "Y": "Y", - "Z": "Z", - "ZTilt": "Z 傾斜" - }, - "DependenciesPanel": { - "Dependency": "依賴 | 依賴關係", - "DependencyDescription": "您當前的 {name} 版本不支持 Mainsail 的所有功能。將 {name} 更新為至少 {neededVersion}。" - }, "ExtruderControlPanel": { "Extrude": "擠出", "ExtrusionFactor": "擠出係數", @@ -424,13 +404,7 @@ "On": "開", "PowerControl": "電源管理" }, - "PrintsettingsPanel": { - "ExtrusionFactor": "擠出係數", - "Headline": "列印設定", - "SpeedFactor": "速度係數" - }, "StatusPanel": { - "Absolute": "絕對", "CancelPrint": "取消列印", "ClearPrintStats": "清除列印統計數據", "Difference": "差異", @@ -451,19 +425,14 @@ "Max": "max", "ObjectHeight": "物體高度", "PausePrint": "暫停列印", - "Position": "位置", "Print": "列印", - "Relative": "相對的", "ReprintJob": "繼續列印", "Requested": "請求", "ResumePrint": "繼續列印", "Slicer": "切片", "Speed": "速度", "Total": "總共: ", - "Unknown": "Unknown", - "X": "X", - "Y": "Y", - "Z": "Z" + "Unknown": "Unknown" }, "TemperaturePanel": { "AutoscaleChart": "自動縮放圖表", @@ -490,6 +459,21 @@ "Target": "目標", "TemperaturesInChart": "溫度 [°C]" }, + "ToolheadControlPanel": { + "Absolute": "絕對", + "ALL": "所有", + "InvertX": "翻轉 X", + "InvertY": "翻轉 Y", + "InvertZ": "翻轉 Z", + "PleaseConfigureSteps": "請設定步進", + "Position": "位置", + "QGL": "QGL", + "Relative": "相對的", + "SettingsInterfaceControl": "設定 > 界面 > 控制", + "SetupControls": "設定控制", + "SpeedFactor": "速度係數", + "ZTilt": "Z 傾斜" + }, "WebcamPanel": { "All": "全部", "FPS": "FPS", @@ -503,7 +487,7 @@ "Later": "最後的", "Ok": "好", "Save": "儲存", - "SAVE_CONFIG": "儲存配置", + "SaveConfig": "儲存配置", "SaveInfoDescription": "已經計算生成新的Z偏移. 點擊 儲存配置 儲存到 printer.cfg 中並重啟 Klipper.", "SaveInfoDescriptionPrint": "已經計算生成新的Z偏移. 列印後點擊 儲存配置 儲存到 printer.cfg 中並重啟 Klipper.", "SaveInfoHeadline": "資訊", diff --git a/src/locales/zh.json b/src/locales/zh.json index 7834df04d..d7fd2e256 100644 --- a/src/locales/zh.json +++ b/src/locales/zh.json @@ -1,12 +1,12 @@ { "App": { - "Printers": "打印机组", "Notifications": { "KlipperWarnings": { "DeprecatedOption": "选项 '{option}' 在章节 '{section}' 已经弃用,在未来版本会被移除.", "DeprecatedValue": "数值 '{value}' 在选项 '{option}' 中的章节'{section}' 已经弃用,在未来版本会被移除." } }, + "Printers": "打印机组", "ThrottledStates": { "DescriptionCurrentlyThrottled": "rPi ARM 核心当前被限制.", "DescriptionFrequencyCapped": "rPi ARM 最高频率限制再 1.2 GHz.", @@ -379,26 +379,6 @@ } }, "Panels": { - "ControlPanel": { - "ALL": "所有", - "AlternateControls": "翻转控制", - "Headline": "控制", - "InvertX": "翻转 X", - "InvertY": "翻转 Y", - "InvertZ": "翻转 Z", - "PleaseConfigureSteps": "请设置步", - "QGL": "四点调平", - "SettingsInterfaceControl": "设置 > 界面 > 控制", - "SetupControls": "设置", - "X": "X", - "Y": "Y", - "Z": "Z", - "ZTilt": "Z 抬升" - }, - "DependenciesPanel": { - "Dependency": "依赖", - "DependencyDescription": "你当前 {name} 版本并不支持所有 Mainsail 的特性. 跟新 {name} 到至少 {neededVersion}版本." - }, "ExtruderControlPanel": { "Extrude": "挤出", "ExtrusionFactor": "挤出因子", @@ -476,13 +456,7 @@ "On": "打开", "PowerControl": "电源控制" }, - "PrintsettingsPanel": { - "ExtrusionFactor": "挤出因子", - "Headline": "打印机设置", - "SpeedFactor": "速度因子" - }, "StatusPanel": { - "Absolute": "绝对", "CancelPrint": "终止打印", "ClearPrintStats": "清除打印提醒", "Difference": "不同", @@ -503,19 +477,14 @@ "Max": "最大", "ObjectHeight": "物体高度", "PausePrint": "暂停打印", - "Position": "位置", "Print": "打印", - "Relative": "相对", "ReprintJob": "再次打印", "Requested": "已发送请求", "ResumePrint": "继续打印", "Slicer": "切片", "Speed": "速度", "Total": "总", - "Unknown": "未知", - "X": "X", - "Y": "Y", - "Z": "Z" + "Unknown": "未知" }, "TemperaturePanel": { "AutoscaleChart": "自动缩放图表", @@ -544,6 +513,21 @@ "TempTooHigh": "温度过高 {name}! (max: {max})", "TempTooLow": "温度过低 {name}! (min: {min})" }, + "ToolheadControlPanel": { + "Absolute": "绝对", + "ALL": "所有", + "InvertX": "翻转 X", + "InvertY": "翻转 Y", + "InvertZ": "翻转 Z", + "PleaseConfigureSteps": "请设置步", + "Position": "位置", + "QGL": "四点调平", + "Relative": "相对", + "SettingsInterfaceControl": "设置 > 界面 > 控制", + "SetupControls": "设置", + "SpeedFactor": "速度因子", + "ZTilt": "Z 抬升" + }, "WebcamPanel": { "All": "所有", "FPS": "帧率", @@ -557,7 +541,7 @@ "Later": "最后的", "Ok": "好", "Save": "保存", - "SAVE_CONFIG": "保存配置", + "SaveConfig": "保存配置", "SaveInfoDescription": "已经计算生成新的Z偏移. 点击 保存配置 保存到 printer.cfg 中并重启 Klipper.", "SaveInfoDescriptionPrint": "已经计算生成新的Z偏移. 打印后点击 保存配置 保存到 printer.cfg 中并重启 Klipper.", "SaveInfoHeadline": "信息", diff --git a/src/pages/Dashboard.vue b/src/pages/Dashboard.vue index a9dd472b7..7361a73c6 100644 --- a/src/pages/Dashboard.vue +++ b/src/pages/Dashboard.vue @@ -82,7 +82,6 @@ <script lang="ts"> import Component from 'vue-class-component' import { Mixins } from 'vue-property-decorator' -import ControlPanel from '@/components/panels/ControlPanel.vue' import ExtruderControlPanel from '@/components/panels/ExtruderControlPanel.vue' import DashboardMixin from '@/components/mixins/dashboard' import KlippyStatePanel from '@/components/panels/KlippyStatePanel.vue' @@ -92,16 +91,14 @@ import MacrosPanel from '@/components/panels/MacrosPanel.vue' import MiniconsolePanel from '@/components/panels/MiniconsolePanel.vue' import MinSettingsPanel from '@/components/panels/MinSettingsPanel.vue' import MiscellaneousPanel from '@/components/panels/MiscellaneousPanel.vue' -import PrintsettingsPanel from '@/components/panels/PrintsettingsPanel.vue' import StatusPanel from '@/components/panels/StatusPanel.vue' +import ToolheadControlPanel from '@/components/panels/ToolheadControlPanel.vue' import TemperaturePanel from '@/components/panels/TemperaturePanel.vue' import WebcamPanel from '@/components/panels/WebcamPanel.vue' -import ZoffsetPanel from '@/components/panels/ZoffsetPanel.vue' import kebabCase from 'lodash.kebabcase' @Component({ components: { - ControlPanel, ExtruderControlPanel, KlippyStatePanel, MachineSettingsPanel, @@ -110,11 +107,10 @@ import kebabCase from 'lodash.kebabcase' MiniconsolePanel, MinSettingsPanel, MiscellaneousPanel, - PrintsettingsPanel, StatusPanel, + ToolheadControlPanel, TemperaturePanel, WebcamPanel, - ZoffsetPanel, }, }) export default class PageDashboard extends Mixins(DashboardMixin) { diff --git a/src/plugins/helpers.ts b/src/plugins/helpers.ts index 9ebd82d88..d9e4ae6fe 100644 --- a/src/plugins/helpers.ts +++ b/src/plugins/helpers.ts @@ -13,6 +13,25 @@ import { mdiThermometerLines, mdiWebcam, } from '@mdi/js' +import Vue from 'vue' + +export const setDataDeep = (currentState: any, payload: any) => { + if (payload !== null && typeof payload === 'object') { + Object.keys(payload).forEach((key: string) => { + const value = payload[key] + + if ( + typeof value === 'object' && + !Array.isArray(value) && + key in currentState && + value !== null && + currentState[key] !== null + ) { + setDataDeep(currentState[key], value) + } else Vue.set(currentState, key, value) + }) + } +} export const findDirectory = (folder: FileStateFile[], dirArray: string[]): FileStateFile[] | null => { if (folder !== undefined && folder !== null && dirArray.length) { @@ -54,12 +73,10 @@ export const convertPanelnameToIcon = (name: string): string => { return mdiWebcam case 'zoffset': return mdiArrowCollapseVertical - case 'control': + case 'toolhead-control': return mdiGamepad case 'macros': return mdiCodeTags - case 'printsettings': - return mdiPrinter3d case 'miscellaneous': return mdiDipSwitch case 'temperature': diff --git a/src/store/farm/printer/mutations.ts b/src/store/farm/printer/mutations.ts index 0857aba41..4598195d6 100644 --- a/src/store/farm/printer/mutations.ts +++ b/src/store/farm/printer/mutations.ts @@ -2,6 +2,7 @@ import Vue from 'vue' import { getDefaultState } from './index' import { MutationTree } from 'vuex' import { FarmPrinterState } from '@/store/farm/printer/types' +import { setDataDeep } from '@/plugins/helpers' export const mutations: MutationTree<FarmPrinterState> = { reset(state) { @@ -82,17 +83,6 @@ export const mutations: MutationTree<FarmPrinterState> = { }, setMainsailData(state, payload) { - // eslint-disable-next-line - const setDataDeep = (currentState: any, payload: any) => { - Object.entries(payload).forEach(([key, value]) => { - if (typeof value === 'object' && !Array.isArray(value) && key in currentState) { - setDataDeep(currentState[key], value) - } else if (key in currentState) { - Vue.set(currentState, key, value) - } - }) - } - setDataDeep(state.data.gui, payload) }, diff --git a/src/store/gui/getters.ts b/src/store/gui/getters.ts index 6343f0921..9022c6c9a 100644 --- a/src/store/gui/getters.ts +++ b/src/store/gui/getters.ts @@ -63,4 +63,11 @@ export const getters: GetterTree<GuiState, any> = { return panels }, + + getDefaultControlActionButton: (state, getters, rootState, rootGetters) => { + if (rootGetters['printer/existsQGL']) return 'qgl' + else if (rootGetters['printer/existsZtilt']) return 'ztilt' + + return 'm84' + }, } diff --git a/src/store/gui/index.ts b/src/store/gui/index.ts index 8d650397f..c60c1a5e0 100644 --- a/src/store/gui/index.ts +++ b/src/store/gui/index.ts @@ -24,9 +24,12 @@ export const getDefaultState = (): GuiState => { }, control: { style: 'bars', + actionButton: null, + enableXYHoming: false, feedrateXY: 100, stepsXY: [100, 10, 1], feedrateZ: 25, + offsetsZ: [0.005, 0.01, 0.025, 0.05], stepsZ: [25, 1, 0.1], stepsAll: [0.1, 1, 10, 25, 50, 100], stepsCircleXY: [1, 10, 50, 100], @@ -37,7 +40,7 @@ export const getDefaultState = (): GuiState => { reverseZ: false, extruder: { feedamount: 25, - feedamounts: [50, 10, 5, 1], + feedamounts: [50, 25, 10, 5, 1], feedrate: 5, feedrates: [10, 5, 2, 1], showEstimatedExtrusionInfo: true, @@ -52,11 +55,9 @@ export const getDefaultState = (): GuiState => { }, mobileLayout: [ { name: 'webcam', visible: false }, - { name: 'zoffset', visible: true }, - { name: 'control', visible: true }, + { name: 'toolhead-control', visible: true }, { name: 'extruder-control', visible: true }, { name: 'macros', visible: true }, - { name: 'printsettings', visible: true }, { name: 'machine-settings', visible: true }, { name: 'miscellaneous', visible: true }, { name: 'temperature', visible: true }, @@ -64,11 +65,9 @@ export const getDefaultState = (): GuiState => { ], tabletLayout1: [ { name: 'webcam', visible: true }, - { name: 'zoffset', visible: true }, - { name: 'control', visible: true }, + { name: 'toolhead-control', visible: true }, { name: 'extruder-control', visible: true }, { name: 'macros', visible: true }, - { name: 'printsettings', visible: true }, { name: 'machine-settings', visible: true }, { name: 'miscellaneous', visible: true }, ], @@ -78,11 +77,9 @@ export const getDefaultState = (): GuiState => { ], desktopLayout1: [ { name: 'webcam', visible: true }, - { name: 'zoffset', visible: true }, - { name: 'control', visible: true }, + { name: 'toolhead-control', visible: true }, { name: 'extruder-control', visible: true }, { name: 'macros', visible: true }, - { name: 'printsettings', visible: true }, { name: 'machine-settings', visible: true }, { name: 'miscellaneous', visible: true }, ], @@ -91,15 +88,13 @@ export const getDefaultState = (): GuiState => { { name: 'miniconsole', visible: true }, ], widescreenLayout1: [ - { name: 'zoffset', visible: true }, - { name: 'control', visible: true }, + { name: 'toolhead-control', visible: true }, { name: 'extruder-control', visible: true }, { name: 'macros', visible: true }, { name: 'miscellaneous', visible: true }, ], widescreenLayout2: [ { name: 'temperature', visible: true }, - { name: 'printsettings', visible: true }, { name: 'machine-settings', visible: true }, ], widescreenLayout3: [ @@ -144,7 +139,6 @@ export const getDefaultState = (): GuiState => { logo: defaultLogoColor, primary: defaultPrimaryColor, displayCancelPrint: false, - displayZOffsetStandby: false, lockSlidersOnTouchDevices: true, lockSlidersDelay: 1.5, confirmOnEmergencyStop: false, diff --git a/src/store/gui/mutations.ts b/src/store/gui/mutations.ts index 28ce73c9a..fcae432df 100644 --- a/src/store/gui/mutations.ts +++ b/src/store/gui/mutations.ts @@ -2,6 +2,7 @@ import Vue from 'vue' import { getDefaultState } from './index' import { MutationTree } from 'vuex' import { GuiState } from '@/store/gui/types' +import { setDataDeep } from '@/plugins/helpers' export const mutations: MutationTree<GuiState> = { reset(state) { @@ -9,19 +10,6 @@ export const mutations: MutationTree<GuiState> = { }, setData(state, payload) { - // eslint-disable-next-line - const setDataDeep = (currentState: any, payload: any) => { - if (typeof payload === 'object') { - Object.keys(payload).forEach((key: string) => { - const value = payload[key] - - if (typeof value === 'object' && !Array.isArray(value) && key in currentState) { - setDataDeep(currentState[key], value) - } else Vue.set(currentState, key, value) - }) - } - } - setDataDeep(state, payload) }, diff --git a/src/store/gui/types.ts b/src/store/gui/types.ts index 5f7425544..668e11029 100644 --- a/src/store/gui/types.ts +++ b/src/store/gui/types.ts @@ -15,9 +15,12 @@ export interface GuiState { console?: GuiConsoleState control: { style: 'bars' | 'circle' | 'cross' + actionButton: null | 'm84' | 'qgl' | 'ztilt' + enableXYHoming: boolean feedrateXY: number stepsXY: number[] feedrateZ: number + offsetsZ: number[] stepsZ: number[] stepsAll: number[] stepsCircleXY: number[] @@ -88,7 +91,6 @@ export interface GuiState { logo: string primary: string displayCancelPrint: boolean - displayZOffsetStandby: boolean lockSlidersOnTouchDevices: boolean lockSlidersDelay: number confirmOnEmergencyStop: boolean diff --git a/src/store/printer/getters.ts b/src/store/printer/getters.ts index 3cd240ff0..5474f0df5 100644 --- a/src/store/printer/getters.ts +++ b/src/store/printer/getters.ts @@ -48,20 +48,6 @@ export const getters: GetterTree<PrinterState, RootState> = { return state.virtual_sdcard?.progress ?? 0 }, - getPositions: (state) => { - const position = state.motion_report?.live_position ?? state.toolhead?.position ?? [0, 0, 0] - const gcode_position = state.gcode_move?.gcode_position ?? [0, 0, 0] - const absolute = state.gcode_move?.absolute_coordinates ?? true - - return { - coordinates: absolute, - x: position[0]?.toFixed(2) ?? '--', - y: position[1]?.toFixed(2) ?? '--', - z: position[2]?.toFixed(2) ?? '--', - gcode_z: gcode_position[2]?.toFixed(2) ?? '--', - } - }, - getMacros: (state, getters, rootState) => { const array: PrinterStateMacro[] = [] const hiddenMacros: string[] = [] @@ -849,4 +835,40 @@ export const getters: GetterTree<PrinterState, RootState> = { return 0 }, + + existsQGL: (state) => { + if (!state.configfile?.settings) return false + + return 'quad_gantry_level' in state.configfile.settings + }, + + existsZtilt: (state) => { + if (!state.configfile?.settings) return false + + return 'z_tilt' in state.configfile.settings + }, + + existsBedTilt: (state) => { + if (!state.configfile?.settings) return false + + return 'bed_tilt' in state.configfile.settings + }, + + existsBedScrews: (state) => { + if (!state.configfile?.settings) return false + + return 'bed_screws' in state.configfile.settings + }, + + existsDeltaCalibrate: (state) => { + if (!state.configfile?.settings) return false + + return 'delta_calibrate' in state.configfile.settings + }, + + existsScrewsTilt: (state) => { + if (!state.configfile?.settings) return false + + return 'screws_tilt_adjust' in state.configfile.settings + }, } diff --git a/src/store/printer/mutations.ts b/src/store/printer/mutations.ts index 0a642e801..5c4869f14 100644 --- a/src/store/printer/mutations.ts +++ b/src/store/printer/mutations.ts @@ -2,6 +2,7 @@ import Vue from 'vue' import { getDefaultState } from './index' import { MutationTree } from 'vuex' import { PrinterState } from '@/store/printer/types' +import { setDataDeep } from '@/plugins/helpers' export const mutations: MutationTree<PrinterState> = { reset(state) { @@ -19,25 +20,6 @@ export const mutations: MutationTree<PrinterState> = { }, setData(state, payload) { - // eslint-disable-next-line - const setDataDeep = (currentState: any, payload: any) => { - if (payload !== null && typeof payload === 'object') { - Object.keys(payload).forEach((key: string) => { - const value = payload[key] - - if ( - typeof value === 'object' && - !Array.isArray(value) && - key in currentState && - value !== null && - currentState[key] !== null - ) { - setDataDeep(currentState[key], value) - } else Vue.set(currentState, key, value) - }) - } - } - setDataDeep(state, payload) }, diff --git a/src/store/printer/types.ts b/src/store/printer/types.ts index 9a6760b49..d6c04a814 100644 --- a/src/store/printer/types.ts +++ b/src/store/printer/types.ts @@ -212,3 +212,12 @@ export interface PrinterStateExtruder { nozzleDiameter: number maxExtrudeOnlyDistance: number } + +export interface PrinterStateExtruder { + key: string + name: string + filamentDiameter: number + minExtrudeTemp: number + nozzleDiameter: number + maxExtrudeOnlyDistance: number +} diff --git a/src/store/variables.ts b/src/store/variables.ts index 8457f9413..e6f74efef 100644 --- a/src/store/variables.ts +++ b/src/store/variables.ts @@ -69,16 +69,14 @@ export const maxGcodeHistory = 50 * List of generic dashboard panels */ export const allDashboardPanels = [ - 'control', + 'toolhead-control', 'extruder-control', 'macros', 'machine-settings', 'miniconsole', 'miscellaneous', - 'printsettings', 'temperature', 'webcam', - 'zoffset', ] export const thumbnailSmallMin = 32