From e7b286d57e789d83385316bc4b62f587ff404ede Mon Sep 17 00:00:00 2001 From: Almir Kadric Date: Sun, 13 Apr 2025 13:11:00 +0900 Subject: [PATCH] Fix: 40w laser crosshair offset when Run from Luban added moduleOriginOffset feature to machine definitions and setup a default crosshair offset --- .nvmrc | 1 + .../src/machine-definition/common/machine.ts | 1 + src/app/constants/copy.ts | 1 + src/app/constants/machines.ts | 5 +- src/app/machines/snapmaker-2-modules.ts | 15 ++++ src/app/machines/snapmaker-a350.ts | 6 +- src/app/resources/i18n/cs/resource.json | 1 + src/app/resources/i18n/de/resource.json | 1 + src/app/resources/i18n/en/resource.json | 1 + src/app/resources/i18n/es/resource.json | 1 + src/app/resources/i18n/fr/resource.json | 1 + src/app/resources/i18n/hu/resource.json | 1 + src/app/resources/i18n/it/resource.json | 1 + src/app/resources/i18n/ja/resource.json | 1 + src/app/resources/i18n/ko/resource.json | 1 + src/app/resources/i18n/pt-br/resource.json | 1 + src/app/resources/i18n/ru/resource.json | 1 + src/app/resources/i18n/uk/resource.json | 1 + src/app/resources/i18n/zh-CN/resource.json | 1 + src/app/resources/i18n/zh-tw/resource.json | 1 + .../ui/widgets/ConnectionControl/Control.tsx | 14 ++++ .../ConnectionControl/DisplayPanel.jsx | 71 +++++++++++++++---- .../ConnectionControl/MotionButtonGroup.jsx | 18 +++-- .../task-manager/workers/generateGcode.js | 18 +++++ 24 files changed, 141 insertions(+), 23 deletions(-) create mode 100644 .nvmrc diff --git a/.nvmrc b/.nvmrc new file mode 100644 index 0000000000..b6a7d89c68 --- /dev/null +++ b/.nvmrc @@ -0,0 +1 @@ +16 diff --git a/packages/luban-platform/src/machine-definition/common/machine.ts b/packages/luban-platform/src/machine-definition/common/machine.ts index ad10e1a4de..6a7c871831 100644 --- a/packages/luban-platform/src/machine-definition/common/machine.ts +++ b/packages/luban-platform/src/machine-definition/common/machine.ts @@ -55,6 +55,7 @@ export declare type MachineModuleOptions = { identifier: string; workRangeOffset?: number[]; + moduleOriginOffset?: number[]; }; diff --git a/src/app/constants/copy.ts b/src/app/constants/copy.ts index e0b1f17066..84bb38a4ab 100644 --- a/src/app/constants/copy.ts +++ b/src/app/constants/copy.ts @@ -436,6 +436,7 @@ i18n._('key-App/Settings/MachineSettings-10W Laser'); i18n._('key-App/Settings/MachineSettings-High CNC'); i18n._('key-App/Settings/MachineSettings-Snapmaker 2.0 Quick Swap Kit'); i18n._('key-App/Settings/MachineSettings-Snapmaker 2.0 Bracing Kit'); +i18n._('key-App/Settings/MachineSettings-Snapmaker 2.0 Module Crosshair'); i18n._('key-settings_message-update_not_ava'); // Snapmaker Luban is up to date. i18n._('key-settings_message-updateAva'); // Updates are available. diff --git a/src/app/constants/machines.ts b/src/app/constants/machines.ts index 15bef0f926..81a2c6ba78 100644 --- a/src/app/constants/machines.ts +++ b/src/app/constants/machines.ts @@ -11,7 +11,7 @@ import { SnapmakerOriginalMachine, SnapmakerRayMachine } from '../machines'; -import { quickSwapKitModule, bracingKitModule } from '../machines/snapmaker-2-modules'; +import { quickSwapKitModule, bracingKitModule, moduleCrosshair } from '../machines/snapmaker-2-modules'; import { L20WLaserToolModule, L2WLaserToolModule, @@ -410,7 +410,8 @@ export function getMachineToolOptions(machineIdentifier: string, toolIdentifier: export function findMachineModule(identifier: string): MachineModule | null { const availableModules = [ quickSwapKitModule, - bracingKitModule + bracingKitModule, + moduleCrosshair ]; for (const module of availableModules) { diff --git a/src/app/machines/snapmaker-2-modules.ts b/src/app/machines/snapmaker-2-modules.ts index 25ea1cb3a3..9f688fe2b4 100644 --- a/src/app/machines/snapmaker-2-modules.ts +++ b/src/app/machines/snapmaker-2-modules.ts @@ -10,6 +10,11 @@ export type BracingKit = MachineModule & { workRangeOffset?: number[]; }; } +export type ModuleCrosshair = MachineModule & { + metadata: { + moduleOriginOffset?: number[]; + }; +} export const quickSwapKitModule: QuickSwapKitModule = { identifier: 'snapmaker-2.0-quick-swap-module', @@ -30,3 +35,13 @@ export const bracingKitModule: BracingKit = { } }; + +export const moduleCrosshair: ModuleCrosshair = { + identifier: 'snapmaker-2.0-module-crosshair', + + name: 'key-App/Settings/MachineSettings-Snapmaker 2.0 Module Crosshair', + + metadata: { + + } +}; diff --git a/src/app/machines/snapmaker-a350.ts b/src/app/machines/snapmaker-a350.ts index 292fdb7f1b..1fc49b0b23 100644 --- a/src/app/machines/snapmaker-a350.ts +++ b/src/app/machines/snapmaker-a350.ts @@ -1,6 +1,6 @@ import { Machine, MachineType } from '@snapmaker/luban-platform'; -import { quickSwapKitModule, bracingKitModule } from './snapmaker-2-modules'; +import { quickSwapKitModule, bracingKitModule, moduleCrosshair } from './snapmaker-2-modules'; import { L20WLaserToolModule, L2WLaserToolModule, @@ -138,6 +138,10 @@ export const machine: Machine = { { identifier: bracingKitModule.identifier, workRangeOffset: [0, -12, -6], + }, + { + identifier: moduleCrosshair.identifier, + moduleOriginOffset: [-21.6, 0.4, 0], } ], diff --git a/src/app/resources/i18n/cs/resource.json b/src/app/resources/i18n/cs/resource.json index 28ffe141f2..b858359d72 100644 --- a/src/app/resources/i18n/cs/resource.json +++ b/src/app/resources/i18n/cs/resource.json @@ -1094,6 +1094,7 @@ "key-App/Settings/MachineSettings-Modules": "", "key-App/Settings/MachineSettings-Single Extruder Toolhead": "", "key-App/Settings/MachineSettings-Snapmaker 2.0 Bracing Kit": "", + "key-App/Settings/MachineSettings-Snapmaker 2.0 Module Crosshair": "", "key-App/Settings/MachineSettings-Snapmaker 2.0 Quick Swap Kit": "", "key-App/Settings/MachineSettings-Standard CNC": "", "key-App/Settings/Model Examination": "", diff --git a/src/app/resources/i18n/de/resource.json b/src/app/resources/i18n/de/resource.json index aa8e5ab091..897f11197e 100644 --- a/src/app/resources/i18n/de/resource.json +++ b/src/app/resources/i18n/de/resource.json @@ -1094,6 +1094,7 @@ "key-App/Settings/MachineSettings-Modules": "Modules", "key-App/Settings/MachineSettings-Single Extruder Toolhead": "Einzelner Extruder", "key-App/Settings/MachineSettings-Snapmaker 2.0 Bracing Kit": "", + "key-App/Settings/MachineSettings-Snapmaker 2.0 Module Crosshair": "", "key-App/Settings/MachineSettings-Snapmaker 2.0 Quick Swap Kit": "", "key-App/Settings/MachineSettings-Standard CNC": "Norm", "key-App/Settings/Model Examination": "Modellprüfung", diff --git a/src/app/resources/i18n/en/resource.json b/src/app/resources/i18n/en/resource.json index edccdfabe5..d52bfc1d5d 100644 --- a/src/app/resources/i18n/en/resource.json +++ b/src/app/resources/i18n/en/resource.json @@ -1094,6 +1094,7 @@ "key-App/Settings/MachineSettings-Modules": "Modules", "key-App/Settings/MachineSettings-Single Extruder Toolhead": "Single Extrusion", "key-App/Settings/MachineSettings-Snapmaker 2.0 Bracing Kit": "Snapmaker 2.0 Bracing Kit", + "key-App/Settings/MachineSettings-Snapmaker 2.0 Module Crosshair": "Snapmaker 2.0 Module Crosshair", "key-App/Settings/MachineSettings-Snapmaker 2.0 Quick Swap Kit": "Snapmaker 2.0 Quick Swap Kit", "key-App/Settings/MachineSettings-Standard CNC": "Standard", "key-App/Settings/Model Examination": "Model Examination", diff --git a/src/app/resources/i18n/es/resource.json b/src/app/resources/i18n/es/resource.json index df9761e5e5..87138d0ed1 100644 --- a/src/app/resources/i18n/es/resource.json +++ b/src/app/resources/i18n/es/resource.json @@ -1094,6 +1094,7 @@ "key-App/Settings/MachineSettings-Modules": "", "key-App/Settings/MachineSettings-Single Extruder Toolhead": "Extrusor simple", "key-App/Settings/MachineSettings-Snapmaker 2.0 Bracing Kit": "", + "key-App/Settings/MachineSettings-Snapmaker 2.0 Module Crosshair": "", "key-App/Settings/MachineSettings-Snapmaker 2.0 Quick Swap Kit": "", "key-App/Settings/MachineSettings-Standard CNC": "Estándar", "key-App/Settings/Model Examination": "", diff --git a/src/app/resources/i18n/fr/resource.json b/src/app/resources/i18n/fr/resource.json index 45ade2fed9..7b880465eb 100644 --- a/src/app/resources/i18n/fr/resource.json +++ b/src/app/resources/i18n/fr/resource.json @@ -1094,6 +1094,7 @@ "key-App/Settings/MachineSettings-Modules": "", "key-App/Settings/MachineSettings-Single Extruder Toolhead": "Extrudeuse unique", "key-App/Settings/MachineSettings-Snapmaker 2.0 Bracing Kit": "", + "key-App/Settings/MachineSettings-Snapmaker 2.0 Module Crosshair": "", "key-App/Settings/MachineSettings-Snapmaker 2.0 Quick Swap Kit": "", "key-App/Settings/MachineSettings-Standard CNC": "Standard", "key-App/Settings/Model Examination": "", diff --git a/src/app/resources/i18n/hu/resource.json b/src/app/resources/i18n/hu/resource.json index fbe23b7257..74b89e9507 100644 --- a/src/app/resources/i18n/hu/resource.json +++ b/src/app/resources/i18n/hu/resource.json @@ -1094,6 +1094,7 @@ "key-App/Settings/MachineSettings-Modules": "", "key-App/Settings/MachineSettings-Single Extruder Toolhead": "", "key-App/Settings/MachineSettings-Snapmaker 2.0 Bracing Kit": "", + "key-App/Settings/MachineSettings-Snapmaker 2.0 Module Crosshair": "", "key-App/Settings/MachineSettings-Snapmaker 2.0 Quick Swap Kit": "", "key-App/Settings/MachineSettings-Standard CNC": "", "key-App/Settings/Model Examination": "", diff --git a/src/app/resources/i18n/it/resource.json b/src/app/resources/i18n/it/resource.json index baf06dbbdf..23c6dbdd9e 100644 --- a/src/app/resources/i18n/it/resource.json +++ b/src/app/resources/i18n/it/resource.json @@ -1094,6 +1094,7 @@ "key-App/Settings/MachineSettings-Modules": "Modules", "key-App/Settings/MachineSettings-Single Extruder Toolhead": "Estrusore singolo", "key-App/Settings/MachineSettings-Snapmaker 2.0 Bracing Kit": "", + "key-App/Settings/MachineSettings-Snapmaker 2.0 Module Crosshair": "", "key-App/Settings/MachineSettings-Snapmaker 2.0 Quick Swap Kit": "", "key-App/Settings/MachineSettings-Standard CNC": "Standard", "key-App/Settings/Model Examination": "Model Examination", diff --git a/src/app/resources/i18n/ja/resource.json b/src/app/resources/i18n/ja/resource.json index 27e4bf1d2e..ebc1a37b32 100644 --- a/src/app/resources/i18n/ja/resource.json +++ b/src/app/resources/i18n/ja/resource.json @@ -1094,6 +1094,7 @@ "key-App/Settings/MachineSettings-Modules": "モジュール", "key-App/Settings/MachineSettings-Single Extruder Toolhead": "シングル押出機", "key-App/Settings/MachineSettings-Snapmaker 2.0 Bracing Kit": "", + "key-App/Settings/MachineSettings-Snapmaker 2.0 Module Crosshair": "", "key-App/Settings/MachineSettings-Snapmaker 2.0 Quick Swap Kit": "", "key-App/Settings/MachineSettings-Standard CNC": "標準", "key-App/Settings/Model Examination": "モデル検査", diff --git a/src/app/resources/i18n/ko/resource.json b/src/app/resources/i18n/ko/resource.json index 4f7bd760aa..c902c7f3e9 100644 --- a/src/app/resources/i18n/ko/resource.json +++ b/src/app/resources/i18n/ko/resource.json @@ -1094,6 +1094,7 @@ "key-App/Settings/MachineSettings-Modules": "", "key-App/Settings/MachineSettings-Single Extruder Toolhead": "단일 압출기", "key-App/Settings/MachineSettings-Snapmaker 2.0 Bracing Kit": "", + "key-App/Settings/MachineSettings-Snapmaker 2.0 Module Crosshair": "", "key-App/Settings/MachineSettings-Snapmaker 2.0 Quick Swap Kit": "", "key-App/Settings/MachineSettings-Standard CNC": "표준", "key-App/Settings/Model Examination": "", diff --git a/src/app/resources/i18n/pt-br/resource.json b/src/app/resources/i18n/pt-br/resource.json index b6b1f4b929..bec402b4cf 100644 --- a/src/app/resources/i18n/pt-br/resource.json +++ b/src/app/resources/i18n/pt-br/resource.json @@ -1094,6 +1094,7 @@ "key-App/Settings/MachineSettings-Modules": "", "key-App/Settings/MachineSettings-Single Extruder Toolhead": "", "key-App/Settings/MachineSettings-Snapmaker 2.0 Bracing Kit": "", + "key-App/Settings/MachineSettings-Snapmaker 2.0 Module Crosshair": "", "key-App/Settings/MachineSettings-Snapmaker 2.0 Quick Swap Kit": "", "key-App/Settings/MachineSettings-Standard CNC": "", "key-App/Settings/Model Examination": "", diff --git a/src/app/resources/i18n/ru/resource.json b/src/app/resources/i18n/ru/resource.json index 9061d18395..606c4e1f71 100644 --- a/src/app/resources/i18n/ru/resource.json +++ b/src/app/resources/i18n/ru/resource.json @@ -1094,6 +1094,7 @@ "key-App/Settings/MachineSettings-Modules": "", "key-App/Settings/MachineSettings-Single Extruder Toolhead": "Single Extruder", "key-App/Settings/MachineSettings-Snapmaker 2.0 Bracing Kit": "", + "key-App/Settings/MachineSettings-Snapmaker 2.0 Module Crosshair": "", "key-App/Settings/MachineSettings-Snapmaker 2.0 Quick Swap Kit": "", "key-App/Settings/MachineSettings-Standard CNC": "Standard", "key-App/Settings/Model Examination": "", diff --git a/src/app/resources/i18n/uk/resource.json b/src/app/resources/i18n/uk/resource.json index acf3f4b7ae..7fe12cd72b 100644 --- a/src/app/resources/i18n/uk/resource.json +++ b/src/app/resources/i18n/uk/resource.json @@ -1094,6 +1094,7 @@ "key-App/Settings/MachineSettings-Modules": "Модулі", "key-App/Settings/MachineSettings-Single Extruder Toolhead": "Одинарний екструдер", "key-App/Settings/MachineSettings-Snapmaker 2.0 Bracing Kit": "", + "key-App/Settings/MachineSettings-Snapmaker 2.0 Module Crosshair": "", "key-App/Settings/MachineSettings-Snapmaker 2.0 Quick Swap Kit": "", "key-App/Settings/MachineSettings-Standard CNC": "Стандартний", "key-App/Settings/Model Examination": "Перевірка моделі", diff --git a/src/app/resources/i18n/zh-CN/resource.json b/src/app/resources/i18n/zh-CN/resource.json index 3bc02defdb..bb1b5a4bb4 100644 --- a/src/app/resources/i18n/zh-CN/resource.json +++ b/src/app/resources/i18n/zh-CN/resource.json @@ -1094,6 +1094,7 @@ "key-App/Settings/MachineSettings-Modules": "模组", "key-App/Settings/MachineSettings-Single Extruder Toolhead": "单喷头", "key-App/Settings/MachineSettings-Snapmaker 2.0 Bracing Kit": "直线模组加固套件", + "key-App/Settings/MachineSettings-Snapmaker 2.0 Module Crosshair": "", "key-App/Settings/MachineSettings-Snapmaker 2.0 Quick Swap Kit": "快拆套件", "key-App/Settings/MachineSettings-Standard CNC": "标准", "key-App/Settings/Model Examination": "模型检测", diff --git a/src/app/resources/i18n/zh-tw/resource.json b/src/app/resources/i18n/zh-tw/resource.json index 6197d0347b..a274d4342e 100644 --- a/src/app/resources/i18n/zh-tw/resource.json +++ b/src/app/resources/i18n/zh-tw/resource.json @@ -1094,6 +1094,7 @@ "key-App/Settings/MachineSettings-Modules": "", "key-App/Settings/MachineSettings-Single Extruder Toolhead": "", "key-App/Settings/MachineSettings-Snapmaker 2.0 Bracing Kit": "", + "key-App/Settings/MachineSettings-Snapmaker 2.0 Module Crosshair": "", "key-App/Settings/MachineSettings-Snapmaker 2.0 Quick Swap Kit": "", "key-App/Settings/MachineSettings-Standard CNC": "", "key-App/Settings/Model Examination": "", diff --git a/src/app/ui/widgets/ConnectionControl/Control.tsx b/src/app/ui/widgets/ConnectionControl/Control.tsx index 0ed0883f7e..7565992d52 100644 --- a/src/app/ui/widgets/ConnectionControl/Control.tsx +++ b/src/app/ui/widgets/ConnectionControl/Control.tsx @@ -75,6 +75,18 @@ const Control: React.FC = ({ widgetId, isNotInWorkspace, const { isConnected } = useSelector((state: RootState) => state.workspace); const { headType } = useSelector((state: RootState) => state.workspace); + const moduleOriginOffset = useSelector((state: RootState) => { + const rtnModuleOriginOffset = { x: 0, y: 0, z: 0 }; + const modules = state.machine.activeMachine?.metadata?.modules || []; + for (const module of modules) { + if (module.moduleOriginOffset) { + rtnModuleOriginOffset.x += module.moduleOriginOffset[0]; + rtnModuleOriginOffset.y += module.moduleOriginOffset[1]; + rtnModuleOriginOffset.z += module.moduleOriginOffset[2]; + } + } + return rtnModuleOriginOffset; + }); const server: MachineAgent = useSelector((state: RootState) => state.workspace.server); const { @@ -439,6 +451,7 @@ const Control: React.FC = ({ widgetId, isNotInWorkspace, = ({ widgetId, isNotInWorkspace, state={state} workPosition={workPosition} originOffset={state.originOffset} + moduleOriginOffset={moduleOriginOffset} actions={actions} executeGcode={actions.executeGcode} isNotInWorkspace={isNotInWorkspace} diff --git a/src/app/ui/widgets/ConnectionControl/DisplayPanel.jsx b/src/app/ui/widgets/ConnectionControl/DisplayPanel.jsx index 91c6aad254..23585be6d0 100644 --- a/src/app/ui/widgets/ConnectionControl/DisplayPanel.jsx +++ b/src/app/ui/widgets/ConnectionControl/DisplayPanel.jsx @@ -82,8 +82,9 @@ class DisplayPanel extends PureComponent { }; render() { - const { state, workPosition, originOffset, headType } = this.props; + const { state, workPosition, originOffset, moduleOriginOffset, headType } = this.props; const { x, y, z, b } = originOffset; + const { x: x1, y: y1, z: z1 } = moduleOriginOffset; const { units, canClick, axes } = state; const lengthUnits = (units === METRIC_UNITS) ? i18n._('key-Workspace/Control/DisplayPanel-mm') : i18n._('key-Workspace/Control/DisplayPanel-in'); let machinePositionX = (Math.round((parseFloat(workPosition.x) - x) * 1000) / 1000).toFixed(3); @@ -95,6 +96,10 @@ class DisplayPanel extends PureComponent { machinePositionY = workPosition.y; machinePositionZ = workPosition.z; } + const workPositionX = (parseFloat(workPosition.x) + x1).toFixed(3); + const workPositionY = (parseFloat(workPosition.y) + y1).toFixed(3); + const workPositionZ = (parseFloat(workPosition.z) + z1).toFixed(3); + const workPositionB = (parseFloat(workPosition.b) + 0).toFixed(3); return (
@@ -133,9 +138,21 @@ class DisplayPanel extends PureComponent { title={'X'} disabled={!canClick} menus={[ - { key: 'G0 X0', title: i18n._('key-Workspace/Control/DisplayPanel-Go To Work Zero On X Axis (G0 X0)') }, { - key: 'G92 X0', + key: [ + 'G90', + `G0 X${-x1}`, + ].join('\n'), + title: i18n._('key-Workspace/Control/DisplayPanel-Go To Work Zero On X Axis (G0 X0)') + }, + { + key: [ + 'G91', + `G0 X${x1}`, + 'G90', + 'G92 X0', + `G0 X${-x1}`, + ].join('\n'), title: i18n._('key-Workspace/Control/DisplayPanel-Zero Out Temporary X Axis (G92 X0)'), isSetOrigin: true } @@ -155,9 +172,9 @@ class DisplayPanel extends PureComponent { @@ -199,9 +228,21 @@ class DisplayPanel extends PureComponent { title={'Z'} disabled={!canClick} menus={[ - { key: 'G0 Z0', title: i18n._('key-Workspace/Control/DisplayPanel-Go To Work Zero On Z Axis (G0 Z0)') }, { - key: 'G92 Z0', + key: [ + 'G90', + `G0 Z${-z1}`, + ].join('\n'), + title: i18n._('key-Workspace/Control/DisplayPanel-Go To Work Zero On Z Axis (G0 Z0)') + }, + { + key: [ + 'G91', + `G0 Z${z1}`, + 'G90', + 'G92 Z0', + `G0 Z${-z1}`, + ].join('\n'), title: i18n._('key-Workspace/Control/DisplayPanel-Zero Out Temporary Z Axis (G92 Z0)'), isSetOrigin: true } @@ -220,9 +261,9 @@ class DisplayPanel extends PureComponent { diff --git a/src/app/ui/widgets/ConnectionControl/MotionButtonGroup.jsx b/src/app/ui/widgets/ConnectionControl/MotionButtonGroup.jsx index 73e498e303..4c690f0493 100644 --- a/src/app/ui/widgets/ConnectionControl/MotionButtonGroup.jsx +++ b/src/app/ui/widgets/ConnectionControl/MotionButtonGroup.jsx @@ -10,12 +10,19 @@ import TipTrigger from '../../components/TipTrigger'; import { SnapmakerArtisanMachine } from '../../../machines'; const MotionButtonGroup = (props) => { - const { actions, workPosition, runBoundary, executeGcode, disabled } = props; + const { actions, workPosition, moduleOriginOffset, runBoundary, executeGcode, disabled } = props; const { activeMachine } = useSelector((state) => state.workspace); + const { x: x1, y: y1, z: z1 } = moduleOriginOffset; const setOriginWork = () => { - let gcode = 'G92 X0 Y0 Z0 B0'; + let gcode = [ + 'G91', + `G0 X${x1} Y${y1} Z${z1}`, + 'G90', + 'G92 X0 Y0 Z0 B0', + `G0 X${-x1} Y${-y1} Z${-z1}`, + ].join('\n'); // Fixme: hard code for artisan asking to store current work origin which is about Power Loss Recovery if (includes([SnapmakerArtisanMachine], activeMachine)) { gcode += '\nM500'; @@ -64,12 +71,12 @@ const MotionButtonGroup = (props) => { priority="level-three" onClick={() => { if (props.isConnectedRay) { - actions.move({ z: 0, x: 0, y: 0, b: 0 }, true); + actions.move({ z: -z1, x: -x1, y: -y1, b: 0 }, true); } else { if (workPosition.z > 0) { - actions.move({ x: 0, y: 0, b: 0, z: 0 }); + actions.move({ x: -x1, y: -y1, b: 0, z: -z1 }); } else { - actions.move({ z: 0, x: 0, y: 0, b: 0 }); + actions.move({ z: -z1, x: -x1, y: -y1, b: 0 }); } } }} @@ -100,6 +107,7 @@ const MotionButtonGroup = (props) => { MotionButtonGroup.propTypes = { disabled: PropTypes.bool, workPosition: PropTypes.object, + moduleOriginOffset: PropTypes.object, actions: PropTypes.object, runBoundary: PropTypes.func, executeGcode: PropTypes.func, diff --git a/src/server/services/task-manager/workers/generateGcode.js b/src/server/services/task-manager/workers/generateGcode.js index da7a7ff644..fba2adbcb9 100644 --- a/src/server/services/task-manager/workers/generateGcode.js +++ b/src/server/services/task-manager/workers/generateGcode.js @@ -236,10 +236,28 @@ const generateGcode = ({ toolPaths, size, toolHead, origin, jobOffsetMode, serie } if (headType === 'laser' && jobOffsetMode === JobOffsetMode.Crosshair) { + // TODO: these G-Codes are not currently implemented, we manually handle + // the work offset calculation using the machine module definition. headerGcodes.push( 'M2003', // crosshair offset 'M2004', // move ); + // TODO: support end of job macro hooks to enable better automation + const moduleOriginOffset = { x: 0, y: 0, z: 0 }; + const modules = metadata?.modules || []; + for (const module of modules) { + if (module.moduleOriginOffset) { + moduleOriginOffset.x += module.moduleOriginOffset[0]; + moduleOriginOffset.y += module.moduleOriginOffset[1]; + moduleOriginOffset.z += module.moduleOriginOffset[2]; + } + } + const endOfJob = [ + 'G90', + `G0 X${-moduleOriginOffset.x} Y${-moduleOriginOffset.y} Z${-moduleOriginOffset.z + 100} F${gcodeConfig.jogSpeed}` + ]; + writeStream.write(endOfJob.join('\n')); + fileTotalLines += endOfJob.length; } // header end
- {workPosition.x.split('.')[0]} + {workPositionX.split('.')[0]} . - {workPosition.x.split('.')[1]} + {workPositionX.split('.')[1]}
{lengthUnits}
{lengthUnits}
- {workPosition.y.split('.')[0]} + {workPositionY.split('.')[0]} . - {workPosition.y.split('.')[1]} + {workPositionY.split('.')[1]}
@@ -166,9 +183,21 @@ class DisplayPanel extends PureComponent { title={'Y'} disabled={!canClick} menus={[ - { key: 'G0 Y0', title: i18n._('key-Workspace/Control/DisplayPanel-Go To Work Zero On Y Axis (G0 Y0)') }, { - key: 'G92 Y0', + key: [ + 'G90', + `G0 Y${-y1}`, + ].join('\n'), + title: i18n._('key-Workspace/Control/DisplayPanel-Go To Work Zero On Y Axis (G0 Y0)') + }, + { + key: [ + 'G91', + `G0 Y${y1}`, + 'G90', + 'G92 Y0', + `G0 Y${-y1}`, + ].join('\n'), title: i18n._('key-Workspace/Control/DisplayPanel-Zero Out Temporary Y Axis (G92 Y0)'), isSetOrigin: true } @@ -187,9 +216,9 @@ class DisplayPanel extends PureComponent {
- {workPosition.z.split('.')[0]} + {workPositionZ.split('.')[0]} . - {workPosition.z.split('.')[1]} + {workPositionZ.split('.')[1]}
{lengthUnits}
- {(workPosition.b || '').split('.')[0]} + {(workPositionB || '').split('.')[0]} . - {(workPosition.b || '').split('.')[1]} + {(workPositionB || '').split('.')[1]}
°