| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
feat: add support for uploading files to the watch directory (#1008) * Add "Save to Watch Directory" checkbox * Add cross-env * Hide "Save to Watch Directory" if not configured * Rework Watch Directory modal with realtime upload support - Remove the "Save to Watch Directory" checkbox from the visualizer toolbar; uploading to the watch directory now happens from the Watch Directory modal itself - Add an Add button and a dropzone to the modal for uploading files to the configured watch directory, with an upload progress overlay - Refresh the file tree in real time: monitor service forwards file system events through an EventEmitter facade and CNCEngine broadcasts watchdir:change over Socket.IO; the modal re-lists on change events (debounced) instead of polling - Add a Refresh button whose spinner reflects the in-flight getFiles request - File tree UX: folders toggle expansion on single click and double-click loads files only, clicking outside the table deselects, long file names truncate with an ellipsis and a title tooltip, the name column keeps at least 40% of the table width and the size column reserves fixed padding for the vertical scrollbar - Make the modal width dynamic (80vw) instead of a fixed preset - Drop the server-side file deletion endpoint introduced earlier in this branch as deletion is out of scope for now * chore(i18n): complete missing translations * chore: update changeset file --------- Co-authored-by: cheton <cheton@gmail.com> Co-authored-by: Cheton Wu <447801+cheton@users.noreply.github.com> | 14 天前 | |
Rename files and restructure folder layout (#440) | 7 年前 | |
feat(a11y): add ARIA attributes for WCAG 2.1 level AA compliance (#965) * feat(a11y): add ARIA attributes for WCAG 2.1 Level AA compliance Add aria-label, aria-hidden, role, aria-expanded, aria-live, and aria-haspopup attributes across 58 files covering all major UI areas. App shell & layout: - Add role="status" + aria-live="polite" to loading indicator - Add role="main" to main content container - Add role="region" to Widget base component - Add role="toolbar" + aria-label to Controls and QuickAccessToolbar - Add aria-label="Main navigation" to Sidebar nav - Add aria-label="Application header" to Header navbar (distinct from Sidebar) - Add aria-label to Sidebar icon-only links; aria-hidden to icons Widget base components: - Widget: role="region" on root div - Controls: role="toolbar" aria-label="Widget controls" - DropdownButton: aria-haspopup="menu"; accept/forward aria-label prop - All 16 widgets: aria-label="<Name> widget" on root Widget Widget common pattern (all 16 widgets): - aria-label="Expand"/"Collapse" + aria-expanded on minimize button - aria-label="More options" on overflow dropdown - aria-hidden={minimized} on Widget.Content - aria-hidden="true" on all decorative FA icons Widget-specific controls: - Axes: keypad jogging, MDI mode, settings, axis-specific DisplayPanel labels - Console: clear, fullscreen buttons; role="log" on terminal - Connection/Laser/Grbl/Marlin/Smoothie/TinyG: reset and override buttons - Macro: dynamic aria-labels per macro name - Visualizer: workflow (Run/Pause/Stop), camera view/zoom buttons - Webcam/Custom/GCode: toggle, refresh, edit buttons Settings: - All TableRecords: contextual aria-labels on enable/edit/delete actions - Events: use human-readable event strings (mapEventToTextString) - UserAccounts: dynamic "Password"/"Old Password" label - All form inputs: aria-label matching visible label text Fixes: - Correct aria-haspopup="true" to explicit "menu" - Fix duplicate landmark labels (Header vs Sidebar nav) - Fix incomplete Smoothie widget a11y pattern - Add axis context to DisplayPanel "Go to zero"/"Home" buttons - Add aria-labels to all unlabeled Dropdown.Toggle and TaskbarButton elements * fix(lint): fix eslint errors in UpdateRecord and GridLine - Replace double quotes with single quotes in aria-label (UpdateRecord.jsx) - Fix constant-truthiness warning by moving fallback inside THREE.Color constructor (GridLine.js) * fix(lint): replace || with ?? in GridLine and fix setState in componentDidUpdate - Use nullish coalescing (??) instead of || for THREE.Color fallback to correctly handle 0 (black) as a valid color value - Replace setState in componentDidUpdate with componentWillReceiveProps in Tool.jsx to avoid extra re-render and simplify guard condition (React 15 compatible) * style: apply eslint auto-fix formatting and disable jsx-no-leaked-render - Auto-fix JSX closing brace placement and whitespace across all widgets and containers - Disable react/jsx-no-leaked-render rule in .eslintrc.js | 6 个月前 | |
feat(autolevel): add `Autolevel` widget for surface probing and Z-axis compensation (#959) * feat(autoleveling): add Z compensation with planar interpolation - Add geometry utility functions (sub3, distanceSquared2/3, crossProduct3, isColinear) - Add subdivideSegment function to split long moves for accurate compensation - Implement planar interpolation using 3 closest non-collinear probed points - Add applyZCompensation method to process G-code with Z height adjustment - Support both metric and imperial units - Rename autolevel command and add feedrate/probeFeedrate parameters Co-Authored-By: Claude <noreply@anthropic.com> * feat(ui): add auto leveling button to quick access toolbar Co-Authored-By: Claude <noreply@anthropic.com> * fix(grbl): correct autolevel command parameter destructuring The autolevel command was incorrectly destructuring parameters with 'args[0]' instead of 'args', causing parameter parsing failures. This fix ensures proper parameter extraction for the autolevel probing command. Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com> * feat(autolevel): add autolevel:apply command to apply Z compensation Implement server-side command to apply auto-leveling Z compensation to G-code. The command accepts probing data and G-code, loads the probing points into the autoLeveling state, and applies planar interpolation-based Z compensation using the applyZCompensation method. Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com> * feat(autolevel): add AutoLevel widget UI components Add complete AutoLevel widget implementation including: - Main widget container with probing parameter management - ProbingSetup modal for configuring grid parameters - ApplyAutoLevel modal for applying compensation to G-code files - Probing data display with statistics (min/max/delta Z) - Widget styling and constants The widget allows users to configure and run auto-leveling probing sequences, view collected probe points, and apply Z compensation to G-code for PCB milling or uneven surface machining. Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com> * feat(autolevel): register AutoLevel widget in workspace Register the AutoLevel widget in the workspace widget system: - Add widget import and registration in Widget.jsx - Add widget entry in WidgetManager with localized caption and description This makes the AutoLevel widget available for users to add to their workspace layout. Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com> * feat(autolevel): add AutoLevel widget default configuration Add AutoLevel widget to the default workspace configuration: - Include in secondary widget panel by default - Set default probing parameters (100x100mm grid, 10mm steps) - Configure default feedrates (1000 mm/min XY, 100 mm/min Z) - Set safe height to 5mm and probe depth to -5mm These defaults provide reasonable starting values for PCB milling and auto-leveling operations. Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com> * feat: rename "Auto Leveling" to "Auto Level" * refactor(autolevel): simplify to pure utility class with comprehensive tests - Rename AutoLevel.js to auto-level.js following kebab-case convention - Refactor AutoLevel from stateful EventEmitter to pure utility class - Expose 2 static functions: generateProbePositions, applyProbeCompensation - Move probe state tracking from AutoLevel to GrblController.probeState - Auto-detect grid step size from probe data spacing - Optimize segment subdivision to skip duplicate points - Add new server commands: - autolevel:start (renamed from autolevel) - autolevel:runTestProbe - autolevel:getProbeState - autolevel:loadFromFile - autolevel:saveToFile - autolevel:applyProbeCompensation (renamed from autolevel:apply) - Add socket events: autolevel:progress, autolevel:point, autolevel:complete - Implement async file I/O in GrblController - Add Jest configuration and comprehensive test suite (14 tests) - Update widget to use new command names Co-Authored-By: Claude Sonnet 4.5 (1M context) <noreply@anthropic.com> * refactor(autolevel): optimize events and state structure - Rename createProbePoints → createProbeXYPoints for clarity - Merge autolevel:point and autolevel:progress into autolevel:update - Remove percentage from event (UI calculates from current/total) - Simplify autolevel:complete to empty signal - Remove currentPointIndex and probePointCount (use array lengths) - Add minZ/maxZ/maxDeviation to autolevel:update for live stats - Initialize minZ/maxZ as null instead of 0 - Rename probeConfig → config - Add all probe parameters to config (startZ, endZ, feedrate, probeFeedrate) Co-Authored-By: Claude Sonnet 4.5 (1M context) <noreply@anthropic.com> * feat: rename probeConfig to config for simplicity * test: move auto-level test to __tests__ directory - Move src/server/lib/auto-level.test.js → src/server/lib/__tests__/auto-level.test.js - Fix import path from './auto-level' to '../auto-level' - Remove unused jest.config.js (config in package.json) Co-Authored-By: Claude Sonnet 4.5 (1M context) <noreply@anthropic.com> * refactor(autolevel): rewrite widget with wizard-based workflow Completely redesigned AutoLevel widget UI based on comprehensive development plan: - Replace modal-based flow with wizard workflow (Landing → Setup/Load → Apply) - Add dual-path entry: probe new surface (Path A) or load existing .probe file (Path B) - Implement safety confirmation modal with mandatory checkbox before probing - Add real-time progress display during probing - Separate components with individual stylesheets for better organization - Integrate with autolevel:* controller commands and events - Support React 15 compatibility (no Fragment syntax) New components: - LandingView: Initial dual-path selection - SetupProbeView: Combined setup and probing configuration (Path A) - LoadProbeView: Load existing .probe files (Path B) - ApplyView: Shared apply screen for both paths - ProbeProgressDisplay: Real-time progress tracking - StartProbeModal: Safety confirmation dialog Removed legacy components: - ApplyAutoLevel.jsx - AutoLevel.jsx (replaced by LandingView) - ProbingSetup.jsx (replaced by SetupProbeView) Co-Authored-By: Claude Sonnet 4.5 (1M context) <noreply@anthropic.com> * fix(autolevel): initialize probe progress total before probing starts Calculate and set total points in probeProgress state when starting probe sequence to ensure progress display shows correct values (e.g., "0/25 points (0%)") instead of "0/0 points (0%)". Co-Authored-By: Claude Sonnet 4.5 (1M context) <noreply@anthropic.com> * feat(autolevel): add probe visualization and stop probe modal - Add ProbeVisualization component for real-time probe progress display - Add StopProbeModal for safe probe cancellation - Extract Controller class for better separation of concerns - Update ApplyView with enhanced probe state management - Improve probe configuration in constants and setup view - Update Visualizer to integrate probe visualization - Add grbl-simulator support for async probe responses Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com> * feat(grbl-simulator): add realistic probe simulation with event emitters - Add event emitter system (on/emit) for async probe responses - Simulate realistic PCB surface warpage in probe contact detection - Emit PRB response when probe motion completes - Add dataListener management in grbl-server for async data - Clean up event listeners on client disconnect to prevent leaks Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com> * feat(autolevel): enhance probe visualization UI and interaction controls - Add interactable flag to enable/disable probe area dragging/resizing based on view - Interactive only in PROBE NEW SURFACE view - Disabled in APPLY AUTO LEVEL view and during probing - Hide interactive elements (handles, boundary, labels) when disabled - Fix probe visualization positioning with pivot point handling - Add updateProbeVisualizationPosition() to account for pivot point offset - Position updates when work position or pivot point changes - Remove "Show probe area in 3D viewer" toggle (always shown by default) - Improve UI layout and navigation - Add chevron icon back buttons in view headers - Remove navigation footers, integrate back button into header - Update section titles to 14px font size - Simplify probe info display: points and dimensions on separate lines - Use space-between layout for test/start buttons - Update 3D visualization labels to capital case (PROBE AREA, START, END) - Reset all probe state when returning to landing page - Remove redundant canvas clear in TextSprite (dimensions reset already clears) Co-Authored-By: Claude Sonnet 4.5 (1M context) <noreply@anthropic.com> * fix(autolevel): preserve isAutoLevelled flag and refactor processing phases - Fix "Auto Levelled" badge not displaying consistently in 3D view * Preserve existing isAutoLevelled flag when controller loads G-code * Prevents race condition where controller event overwrites pubsub update - Refactor processing phases to use constants * Add PROCESSING_PHASE_READING, PROCESSING_PHASE_COMPENSATING, PROCESSING_PHASE_LOADING * Replace magic strings with constants in index.jsx and ApplyView.jsx * Improve code maintainability and type safety - Improve button wording * Change "Load & Compensate G-code" to "Load & Apply Auto-Level" * More concise and consistent with widget naming Co-Authored-By: Claude Sonnet 4.5 (1M context) <noreply@anthropic.com> * refactor(ui): remove auto level button from quick access toolbar Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * feat(autolevel): add support for Marlin, TinyG, and Smoothie controllers Extends autolevel functionality beyond Grbl to support three additional controllers, each with firmware-specific probe result handling: - MarlinController: Query M114 after G38.x completes, capture position from 'pos' event with Send-Response protocol preservation - TinyGController: Parse JSON probe response {"r":{"prb":{"e":1,...}}} from g2core firmware - SmoothieController: Parse [PRB:x,y,z:result] parameters (identical to Grbl) All controllers share identical command handlers (startProbing, runTestProbe, getProbeState, loadFromFile, saveToFile, applyProbeCompensation) using the common autoLevel library. Total: +789 lines across 3 controllers Co-Authored-By: Claude Sonnet 4.5 (1M context) <noreply@anthropic.com> * fix(autolevel): improve probe area interaction reliability and correctness - Fix camera pan breaking hit-testing: sub-camera matrixWorld was not updated by TrackballControls, causing raycaster rays to originate from origin instead of actual camera position - Fix drag offset and stuck drag: getPixelToWorldScale was corrupting the raycaster state; reordered calls so mouse screenToWorld always runs last, and pass pre-computed worldPos through to startInteraction - Fix screenToWorld returning (0,0,0) instead of null on no-intersection - Intersect ray at group Z level (pivot-aware) instead of fixed world Z=0 - Make corner hit area zoom-aware so handles stay clickable when zoomed out - Fix hover state resetting every mousemove due to object reference comparison; add isSameIntersection for logical equality - Fix drag changing probe area dimensions; snap only start corner and preserve original width/height from initialBounds - Fix right-click mouseup ending left-button drag - Fix interaction plane geometry recreated every frame during drag - Add per-corner hover highlight instead of lighting all four corners - Add GPU resource cleanup in dispose() to prevent memory leaks * fix(visualizer): constant-speed panning at all zoom levels In orthographic mode, zoom changes the frustum size without moving the camera, so _eye.length() is constant while the visible area shrinks or grows. Pan speed felt slow when zoomed out and fast when zoomed in. Replace the pan scale with the actual frustum width (cameraO.right - cameraO.left) which is already zoom-corrected. With panSpeed = 1.0, dragging the mouse across the full screen always pans by exactly one visible width, giving 1:1 mouse-to-scene tracking at any zoom level. * fix(visualizer): improve coordinate axes, grid alignment, and rotation speed - Fix CoordinateAxes to draw each axis from its actual min/max bounds instead of a fixed symmetric size; Z axis now renders correctly - Fix parameter naming mismatch between CoordinateAxes constructor and Visualizer call site (xmin/xmax → minX/maxX) - Refactor GridLine to accept explicit min/max bounds per axis so grid aligns exactly with machine profile limits - Add getCoordinateBounds() to derive grid/axis extents from machine profile or fall back to unit-system defaults - Add rebuildCoordinateSystems() to rebuild grid and axes when machine profile changes - Fix Z pivot centering: pivot is set on XY center only; Z origin stays at 0 to match CNC machine convention - Fix changeMachineProfile to handle profile removal and rebuild scene - Increase rotateSpeed to 2*Math.PI for direct 1:1 rotation feel - Increase panSpeed default to 1.0 in TrackballControls * fix(visualizer): reduce rotateSpeed from 2*PI to PI for better control Half-screen drag now equals 180° instead of 360°, giving more precise rotation control while still feeling fast and responsive. * feat(visualizer): add Shift+drag horizontal orbit constraint Hold Shift while dragging to lock rotation to the horizontal plane — the camera orbits around the world Z axis, preserving its elevation angle relative to the pivot point. Releasing Shift restores the full free-rotation trackball behavior. Implementation details: - Added _constrainHorizontal flag set from event.shiftKey in mousemove - Constrained path rotates _eye around world Z using setFromAxisAngle, guaranteeing no elevation drift - camera.up is recomputed as cross(_eye, sideways) after each constrained rotation to keep it upright - Normal trackball path is completely unchanged - _lastAxis/_lastAngle are tracked per-branch for correct damping * docs(controller): document autolevel commands and events in Controller.js Add autolevel command signatures to the command() JSDoc block: - autolevel:startProbing: { startX, endX, stepX, startY, endY, stepY, startZ, endZ, feedrate, probeFeedrate } - autolevel:runTestProbe: { depth, feedrate } - autolevel:getProbeState: null, callback - autolevel:applyProbeCompensation: { gcode, probeData }, callback - autolevel:loadFromFile: filepath, callback - autolevel:saveToFile: filepath, callback Note that autolevel:update and autolevel:complete are server-emitted events and belong with addListener/removeListener, not command(). * docs(controller): move autolevel event docs inline as JSDoc comments Replace the comment block before command() with JSDoc @event annotations directly on each event key in the listeners object. * refactor(server): rename auto-level to autolevel - Rename auto-level.js to autolevel.js - Rename auto-level.test.js to autolevel.test.js - Update logger tag from 'AutoLevel' to 'autolevel' - Update import variable from autoLevel to autolevel in all controllers - Update describe block in test file * refactor(autolevel): rename app widget from AutoLevel to Autolevel - Rename widget directory from AutoLevel to Autolevel - Update import and variable name in Widget.jsx - Rename class from AutoLevelWidget to AutolevelWidget in index.jsx - Update constant namespaces in constants.js - Update widget caption and description in WidgetManager.jsx - Hide probe area visualization when probing starts - Improve log levels (info → debug for high-frequency/internal calls) - Remove redundant log prefix (file is already scoped to autolevel widget) - Add probe visualization lifecycle comments for all show/hide calls - Add margin-top spacing and last-child reset to ProbeProgressDisplay * chore(i18n): upgrade i18next to v25 with compatibilityJSON v4 - Bump i18next ~15 to ~25.8.17 - Replace i18next-xhr-backend with i18next-http-backend ~3.0.2 - Replace i18next-node-fs-backend with i18next-fs-backend ~2.6.1 - Replace i18next-express-middleware with i18next-http-middleware ~3.9.2 - Bump i18next-browser-languagedetector ~3 to ~8.2.1 - Add compatibilityJSON: 'v4' to app, server, and scanner configs - Rename deprecated 'whitelist' option to 'supportedLngs' - Update backend parse() to use namespace param instead of url - Fix i18n._: use pluralResolver.getSuffix() for CLDR plural suffixes with Number.isFinite() guard and non-mutating tOptions spread * fix(autolevel): move colons inside i18n keys for proper translation * feat(i18n): add autolevel translations and v4 plural forms for all locales * feat(autolevel): add i18n to probe visualization labels, step sizes, and fix button layout - Wrap PROBE AREA/START/END labels in ProbeVisualization with i18n._() - Translate step size dropdown labels and use IMPERIAL_UNITS constant - Refine step size options: metric [1,2,5,10,20mm], imperial [1/16"-1"] - Move Run Test Probe button below Z-Axis Settings section - Make Start/Stop Probing a full-width btn-block button - Add flex-wrap to button-row to prevent overflow with long translations * feat(autolevel): extend step size range for small and large workspaces Add coarse step sizes (50mm/2", 100mm/4") for large flat workspaces while keeping fine steps (1mm/1/16") for precision PCB work. Metric: 1, 2, 5, 10, 20, 50, 100mm Imperial: 1/16", 1/8", 1/4", 1/2", 1", 2", 4" * feat(i18n): add translations for probe visualization and step size labels Add translations for PROBE AREA, START, END labels across all 16 non-English locales. Add new i18n keys for step size dropdown options and measurement units. * feat(autolevel): add SVG diagrams, confirmation modals, input validation, and UI improvements - Add TestProbeModal with safety confirmation and ZProbeDiagram - Add ProbeAreaDiagram showing probe grid with dot visualization - Add ZProbeDiagram showing Z-axis probe cycle with clearance/start/end Z labels - Add input validation with error display for all numeric fields - Use existing Button, Checkbox, ToastNotification, Infotip, Dropdown components - Add infotip tooltips for all Z-axis and probe area settings - Replace native select with Dropdown for step size picker - Side-by-side ZProbeDiagram + ProbeAreaDiagram in Start Probing modal - Rename Clearance Height to Clearance Z for consistency - Allow negative input values for Probe Start Z and Probe End Z - Only persist valid numeric values to config store * feat(autolevel): improve ApplyView UI, rename compensation labels, and fix state management - Rename "G-code Compensation" to "Probe Compensation" throughout ApplyView - Rename isAutoLevelled to isProbeCompensationApplied for clarity - Update Visualizer badge text to "Probe Compensation Applied" - Add close button on filename row to unload G-code and reset state - Add help-block descriptions for Load G-code and Export buttons - Add gcode:load pubsub listener to reset state when new G-code is uploaded - Reset isProbeCompensationApplied in Visualizer uploadFile to clear badge - Remove dead LoadProbeView component and VIEW_LOAD_PROBE constant - Move tip from LandingView to ApplyView Probe Results section - Use flex layout with gap for LandingView - Remove unused .noGcodeText style - Add .form-group:last-child margin reset in ApplyView sections * refactor(autolevel): use Button component in modals and replace unicode icons with FontAwesome - Replace raw <button> elements with Button component in StartProbeModal, TestProbeModal, and StopProbeModal footers - Replace unicode ▶/⏹ with fa-play/fa-stop icons in SetupProbeView - Use blue background/border for gcode-data-info in ApplyView * fix(autolevel): use controller reset to immediately stop probe cycle Replace feedhold with reset command in stopProbing action so the probe cycle is cancelled immediately instead of just paused. * feat(autolevel): full unit conversion, probe API refactor, and server improvements UI / Client: - Add full unit conversion (metric/imperial) following Probe/Tool widget patterns - Config stored in mm, display in current G20/G21 units - unitsDidChange flag prevents config overwrite during unit switch - Add toDisplayUnits() utility to units.js for consistent unit label display - Rename clearanceHeight -> clearanceZ, probeStartZ -> startZ, probeEndZ -> endZ, probeFeedrate -> feedrate, feedXY removed (G0 ignores feedrate) - Remove ProbeProgressDisplay component, use Bootstrap ProgressBar inline - Use Bootstrap ProgressBar with percentage label in SetupProbeView - Probe stats (Z-min, Z-max, max deviation) displayed via mapPositionToUnits - Update defaultState.js to match server parameter names Server / Protocol: - Rename autolevel:startProbing -> autolevel:start with mode param - mode='full': multi-point probe grid (default) - mode='test': single-point test probe at current XY position - Remove autolevel:startTestProbe command (merged into autolevel:start) - Add autolevel:stop command: resets machine + clears probe state - Add clearanceZ as separate parameter from startZ - G-code: G0 Z{clearanceZ} -> G0 X Y -> G0 Z{startZ} -> G38.2 Z{endZ} - Remove feedrate from G0 moves (G0 ignores feedrate by definition) - Normalize probe data to mm in all 4 controllers - Grbl: uses $13 setting to detect inch reporting - Smoothie/Marlin: uses G20/G21 modal state - TinyG: prb always in mm, WCO computed with unit-aware conversion - feedrate (G38.2 probe speed) made optional in G0 XY moves * feat(autolevel): replace stepSize with stepX/stepY and per-axis snap - Replace single stepSize with separate stepX/stepY inputs in SetupProbeView - Update ProbeAreaDiagram to accept stepX/stepY props - Update all probe point calculations to use stepX/stepY - Per-axis snap in 3D visualizer: snapX=stepX/2, snapY=stepY/2 - Remove snapSize fallback from ProbeVisualization constructor - Fix Visualizer.jsx to update snapX/snapY (was still using snapSize) - Update defaultState.js with stepX:5, stepY:5 and bCNC-aligned defaults - Add stepX/stepY validation (must be > 0) - Changed validation message to 'Must be a number' * feat(i18n): add autolevel translations and fix feedrate units display - Fix feedrate unit addon to use mm/min and in/min as single i18n keys following the same pattern as the Probe and Tool widgets - Remove unused "min" key from all 17 locale resource.json files - Add translations for new autolevel keys in all 16 non-English locales: Step X/Y, Clearance Z, Start Z, End Z, Probe Compensation, Probe Compensation Applied, Must be a number, Must be greater than zero, and all tooltip descriptions using proper CNC terminology - Fill all remaining missing translations (Load G-code file, Test Probe, Workpiece, probing progress, warning messages) across all locales including nb and pt which had 30 missing keys each --------- Co-authored-by: Claude <noreply@anthropic.com> | 6 个月前 | |
fix: add missing `cs` language to the supported language list | 1 年前 | |
fix(autolevel): UI polish, i18n fixes, and Electron first-launch white screen (#967) * fix(electron): use ready-to-show on all platforms to prevent white screen on first launch * fix(autolevel): UI polish, i18n fixes, and code cleanup - Replace raw back buttons with compact Button component in SetupProbeView and ApplyView - Fix i18n interpolation in ZProbeDiagram and ProbeAreaDiagram using unescaped {{- units}} - Fix feedrate label using i18n._('mm/min') / i18n._('in/min') instead of split i18n._('min') - Add clearanceZ validation: show error when clearance Z is not above start Z - Update Autolevel widget description in WidgetManager - Update LandingView description text - Fix WidgetManager grid layout using CSS grid to prevent float wrapping issues - Remove unused CSS classes from ApplyView.styl, SetupProbeView.styl, LandingView.styl - Delete unused StartProbeModal.styl * i18n: translate new autolevel diagram labels and widget strings | 6 个月前 | |
Rename files and restructure folder layout (#440) | 7 年前 | |
feat: add support for uploading files to the watch directory (#1008) * Add "Save to Watch Directory" checkbox * Add cross-env * Hide "Save to Watch Directory" if not configured * Rework Watch Directory modal with realtime upload support - Remove the "Save to Watch Directory" checkbox from the visualizer toolbar; uploading to the watch directory now happens from the Watch Directory modal itself - Add an Add button and a dropzone to the modal for uploading files to the configured watch directory, with an upload progress overlay - Refresh the file tree in real time: monitor service forwards file system events through an EventEmitter facade and CNCEngine broadcasts watchdir:change over Socket.IO; the modal re-lists on change events (debounced) instead of polling - Add a Refresh button whose spinner reflects the in-flight getFiles request - File tree UX: folders toggle expansion on single click and double-click loads files only, clicking outside the table deselects, long file names truncate with an ellipsis and a title tooltip, the name column keeps at least 40% of the table width and the size column reserves fixed padding for the vertical scrollbar - Make the modal width dynamic (80vw) instead of a fixed preset - Drop the server-side file deletion endpoint introduced earlier in this branch as deletion is out of scope for now * chore(i18n): complete missing translations * chore: update changeset file --------- Co-authored-by: cheton <cheton@gmail.com> Co-authored-by: Cheton Wu <447801+cheton@users.noreply.github.com> | 14 天前 | |
Rename files and restructure folder layout (#440) | 7 年前 | |
feat: add support for uploading files to the watch directory (#1008) * Add "Save to Watch Directory" checkbox * Add cross-env * Hide "Save to Watch Directory" if not configured * Rework Watch Directory modal with realtime upload support - Remove the "Save to Watch Directory" checkbox from the visualizer toolbar; uploading to the watch directory now happens from the Watch Directory modal itself - Add an Add button and a dropzone to the modal for uploading files to the configured watch directory, with an upload progress overlay - Refresh the file tree in real time: monitor service forwards file system events through an EventEmitter facade and CNCEngine broadcasts watchdir:change over Socket.IO; the modal re-lists on change events (debounced) instead of polling - Add a Refresh button whose spinner reflects the in-flight getFiles request - File tree UX: folders toggle expansion on single click and double-click loads files only, clicking outside the table deselects, long file names truncate with an ellipsis and a title tooltip, the name column keeps at least 40% of the table width and the size column reserves fixed padding for the vertical scrollbar - Make the modal width dynamic (80vw) instead of a fixed preset - Drop the server-side file deletion endpoint introduced earlier in this branch as deletion is out of scope for now * chore(i18n): complete missing translations * chore: update changeset file --------- Co-authored-by: cheton <cheton@gmail.com> Co-authored-by: Cheton Wu <447801+cheton@users.noreply.github.com> | 14 天前 | |
fix(autolevel): UI polish, i18n fixes, and Electron first-launch white screen (#967) * fix(electron): use ready-to-show on all platforms to prevent white screen on first launch * fix(autolevel): UI polish, i18n fixes, and code cleanup - Replace raw back buttons with compact Button component in SetupProbeView and ApplyView - Fix i18n interpolation in ZProbeDiagram and ProbeAreaDiagram using unescaped {{- units}} - Fix feedrate label using i18n._('mm/min') / i18n._('in/min') instead of split i18n._('min') - Add clearanceZ validation: show error when clearance Z is not above start Z - Update Autolevel widget description in WidgetManager - Update LandingView description text - Fix WidgetManager grid layout using CSS grid to prevent float wrapping issues - Remove unused CSS classes from ApplyView.styl, SetupProbeView.styl, LandingView.styl - Delete unused StartProbeModal.styl * i18n: translate new autolevel diagram labels and widget strings | 6 个月前 | |
Rename files and restructure folder layout (#440) | 7 年前 | |
feat: add support for uploading files to the watch directory (#1008) * Add "Save to Watch Directory" checkbox * Add cross-env * Hide "Save to Watch Directory" if not configured * Rework Watch Directory modal with realtime upload support - Remove the "Save to Watch Directory" checkbox from the visualizer toolbar; uploading to the watch directory now happens from the Watch Directory modal itself - Add an Add button and a dropzone to the modal for uploading files to the configured watch directory, with an upload progress overlay - Refresh the file tree in real time: monitor service forwards file system events through an EventEmitter facade and CNCEngine broadcasts watchdir:change over Socket.IO; the modal re-lists on change events (debounced) instead of polling - Add a Refresh button whose spinner reflects the in-flight getFiles request - File tree UX: folders toggle expansion on single click and double-click loads files only, clicking outside the table deselects, long file names truncate with an ellipsis and a title tooltip, the name column keeps at least 40% of the table width and the size column reserves fixed padding for the vertical scrollbar - Make the modal width dynamic (80vw) instead of a fixed preset - Drop the server-side file deletion endpoint introduced earlier in this branch as deletion is out of scope for now * chore(i18n): complete missing translations * chore: update changeset file --------- Co-authored-by: cheton <cheton@gmail.com> Co-authored-by: Cheton Wu <447801+cheton@users.noreply.github.com> | 14 天前 | |
Rename files and restructure folder layout (#440) | 7 年前 | |
Rename files and restructure folder layout (#440) | 7 年前 | |
feat(autolevel): add `Autolevel` widget for surface probing and Z-axis compensation (#959) * feat(autoleveling): add Z compensation with planar interpolation - Add geometry utility functions (sub3, distanceSquared2/3, crossProduct3, isColinear) - Add subdivideSegment function to split long moves for accurate compensation - Implement planar interpolation using 3 closest non-collinear probed points - Add applyZCompensation method to process G-code with Z height adjustment - Support both metric and imperial units - Rename autolevel command and add feedrate/probeFeedrate parameters Co-Authored-By: Claude <noreply@anthropic.com> * feat(ui): add auto leveling button to quick access toolbar Co-Authored-By: Claude <noreply@anthropic.com> * fix(grbl): correct autolevel command parameter destructuring The autolevel command was incorrectly destructuring parameters with 'args[0]' instead of 'args', causing parameter parsing failures. This fix ensures proper parameter extraction for the autolevel probing command. Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com> * feat(autolevel): add autolevel:apply command to apply Z compensation Implement server-side command to apply auto-leveling Z compensation to G-code. The command accepts probing data and G-code, loads the probing points into the autoLeveling state, and applies planar interpolation-based Z compensation using the applyZCompensation method. Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com> * feat(autolevel): add AutoLevel widget UI components Add complete AutoLevel widget implementation including: - Main widget container with probing parameter management - ProbingSetup modal for configuring grid parameters - ApplyAutoLevel modal for applying compensation to G-code files - Probing data display with statistics (min/max/delta Z) - Widget styling and constants The widget allows users to configure and run auto-leveling probing sequences, view collected probe points, and apply Z compensation to G-code for PCB milling or uneven surface machining. Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com> * feat(autolevel): register AutoLevel widget in workspace Register the AutoLevel widget in the workspace widget system: - Add widget import and registration in Widget.jsx - Add widget entry in WidgetManager with localized caption and description This makes the AutoLevel widget available for users to add to their workspace layout. Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com> * feat(autolevel): add AutoLevel widget default configuration Add AutoLevel widget to the default workspace configuration: - Include in secondary widget panel by default - Set default probing parameters (100x100mm grid, 10mm steps) - Configure default feedrates (1000 mm/min XY, 100 mm/min Z) - Set safe height to 5mm and probe depth to -5mm These defaults provide reasonable starting values for PCB milling and auto-leveling operations. Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com> * feat: rename "Auto Leveling" to "Auto Level" * refactor(autolevel): simplify to pure utility class with comprehensive tests - Rename AutoLevel.js to auto-level.js following kebab-case convention - Refactor AutoLevel from stateful EventEmitter to pure utility class - Expose 2 static functions: generateProbePositions, applyProbeCompensation - Move probe state tracking from AutoLevel to GrblController.probeState - Auto-detect grid step size from probe data spacing - Optimize segment subdivision to skip duplicate points - Add new server commands: - autolevel:start (renamed from autolevel) - autolevel:runTestProbe - autolevel:getProbeState - autolevel:loadFromFile - autolevel:saveToFile - autolevel:applyProbeCompensation (renamed from autolevel:apply) - Add socket events: autolevel:progress, autolevel:point, autolevel:complete - Implement async file I/O in GrblController - Add Jest configuration and comprehensive test suite (14 tests) - Update widget to use new command names Co-Authored-By: Claude Sonnet 4.5 (1M context) <noreply@anthropic.com> * refactor(autolevel): optimize events and state structure - Rename createProbePoints → createProbeXYPoints for clarity - Merge autolevel:point and autolevel:progress into autolevel:update - Remove percentage from event (UI calculates from current/total) - Simplify autolevel:complete to empty signal - Remove currentPointIndex and probePointCount (use array lengths) - Add minZ/maxZ/maxDeviation to autolevel:update for live stats - Initialize minZ/maxZ as null instead of 0 - Rename probeConfig → config - Add all probe parameters to config (startZ, endZ, feedrate, probeFeedrate) Co-Authored-By: Claude Sonnet 4.5 (1M context) <noreply@anthropic.com> * feat: rename probeConfig to config for simplicity * test: move auto-level test to __tests__ directory - Move src/server/lib/auto-level.test.js → src/server/lib/__tests__/auto-level.test.js - Fix import path from './auto-level' to '../auto-level' - Remove unused jest.config.js (config in package.json) Co-Authored-By: Claude Sonnet 4.5 (1M context) <noreply@anthropic.com> * refactor(autolevel): rewrite widget with wizard-based workflow Completely redesigned AutoLevel widget UI based on comprehensive development plan: - Replace modal-based flow with wizard workflow (Landing → Setup/Load → Apply) - Add dual-path entry: probe new surface (Path A) or load existing .probe file (Path B) - Implement safety confirmation modal with mandatory checkbox before probing - Add real-time progress display during probing - Separate components with individual stylesheets for better organization - Integrate with autolevel:* controller commands and events - Support React 15 compatibility (no Fragment syntax) New components: - LandingView: Initial dual-path selection - SetupProbeView: Combined setup and probing configuration (Path A) - LoadProbeView: Load existing .probe files (Path B) - ApplyView: Shared apply screen for both paths - ProbeProgressDisplay: Real-time progress tracking - StartProbeModal: Safety confirmation dialog Removed legacy components: - ApplyAutoLevel.jsx - AutoLevel.jsx (replaced by LandingView) - ProbingSetup.jsx (replaced by SetupProbeView) Co-Authored-By: Claude Sonnet 4.5 (1M context) <noreply@anthropic.com> * fix(autolevel): initialize probe progress total before probing starts Calculate and set total points in probeProgress state when starting probe sequence to ensure progress display shows correct values (e.g., "0/25 points (0%)") instead of "0/0 points (0%)". Co-Authored-By: Claude Sonnet 4.5 (1M context) <noreply@anthropic.com> * feat(autolevel): add probe visualization and stop probe modal - Add ProbeVisualization component for real-time probe progress display - Add StopProbeModal for safe probe cancellation - Extract Controller class for better separation of concerns - Update ApplyView with enhanced probe state management - Improve probe configuration in constants and setup view - Update Visualizer to integrate probe visualization - Add grbl-simulator support for async probe responses Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com> * feat(grbl-simulator): add realistic probe simulation with event emitters - Add event emitter system (on/emit) for async probe responses - Simulate realistic PCB surface warpage in probe contact detection - Emit PRB response when probe motion completes - Add dataListener management in grbl-server for async data - Clean up event listeners on client disconnect to prevent leaks Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com> * feat(autolevel): enhance probe visualization UI and interaction controls - Add interactable flag to enable/disable probe area dragging/resizing based on view - Interactive only in PROBE NEW SURFACE view - Disabled in APPLY AUTO LEVEL view and during probing - Hide interactive elements (handles, boundary, labels) when disabled - Fix probe visualization positioning with pivot point handling - Add updateProbeVisualizationPosition() to account for pivot point offset - Position updates when work position or pivot point changes - Remove "Show probe area in 3D viewer" toggle (always shown by default) - Improve UI layout and navigation - Add chevron icon back buttons in view headers - Remove navigation footers, integrate back button into header - Update section titles to 14px font size - Simplify probe info display: points and dimensions on separate lines - Use space-between layout for test/start buttons - Update 3D visualization labels to capital case (PROBE AREA, START, END) - Reset all probe state when returning to landing page - Remove redundant canvas clear in TextSprite (dimensions reset already clears) Co-Authored-By: Claude Sonnet 4.5 (1M context) <noreply@anthropic.com> * fix(autolevel): preserve isAutoLevelled flag and refactor processing phases - Fix "Auto Levelled" badge not displaying consistently in 3D view * Preserve existing isAutoLevelled flag when controller loads G-code * Prevents race condition where controller event overwrites pubsub update - Refactor processing phases to use constants * Add PROCESSING_PHASE_READING, PROCESSING_PHASE_COMPENSATING, PROCESSING_PHASE_LOADING * Replace magic strings with constants in index.jsx and ApplyView.jsx * Improve code maintainability and type safety - Improve button wording * Change "Load & Compensate G-code" to "Load & Apply Auto-Level" * More concise and consistent with widget naming Co-Authored-By: Claude Sonnet 4.5 (1M context) <noreply@anthropic.com> * refactor(ui): remove auto level button from quick access toolbar Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * feat(autolevel): add support for Marlin, TinyG, and Smoothie controllers Extends autolevel functionality beyond Grbl to support three additional controllers, each with firmware-specific probe result handling: - MarlinController: Query M114 after G38.x completes, capture position from 'pos' event with Send-Response protocol preservation - TinyGController: Parse JSON probe response {"r":{"prb":{"e":1,...}}} from g2core firmware - SmoothieController: Parse [PRB:x,y,z:result] parameters (identical to Grbl) All controllers share identical command handlers (startProbing, runTestProbe, getProbeState, loadFromFile, saveToFile, applyProbeCompensation) using the common autoLevel library. Total: +789 lines across 3 controllers Co-Authored-By: Claude Sonnet 4.5 (1M context) <noreply@anthropic.com> * fix(autolevel): improve probe area interaction reliability and correctness - Fix camera pan breaking hit-testing: sub-camera matrixWorld was not updated by TrackballControls, causing raycaster rays to originate from origin instead of actual camera position - Fix drag offset and stuck drag: getPixelToWorldScale was corrupting the raycaster state; reordered calls so mouse screenToWorld always runs last, and pass pre-computed worldPos through to startInteraction - Fix screenToWorld returning (0,0,0) instead of null on no-intersection - Intersect ray at group Z level (pivot-aware) instead of fixed world Z=0 - Make corner hit area zoom-aware so handles stay clickable when zoomed out - Fix hover state resetting every mousemove due to object reference comparison; add isSameIntersection for logical equality - Fix drag changing probe area dimensions; snap only start corner and preserve original width/height from initialBounds - Fix right-click mouseup ending left-button drag - Fix interaction plane geometry recreated every frame during drag - Add per-corner hover highlight instead of lighting all four corners - Add GPU resource cleanup in dispose() to prevent memory leaks * fix(visualizer): constant-speed panning at all zoom levels In orthographic mode, zoom changes the frustum size without moving the camera, so _eye.length() is constant while the visible area shrinks or grows. Pan speed felt slow when zoomed out and fast when zoomed in. Replace the pan scale with the actual frustum width (cameraO.right - cameraO.left) which is already zoom-corrected. With panSpeed = 1.0, dragging the mouse across the full screen always pans by exactly one visible width, giving 1:1 mouse-to-scene tracking at any zoom level. * fix(visualizer): improve coordinate axes, grid alignment, and rotation speed - Fix CoordinateAxes to draw each axis from its actual min/max bounds instead of a fixed symmetric size; Z axis now renders correctly - Fix parameter naming mismatch between CoordinateAxes constructor and Visualizer call site (xmin/xmax → minX/maxX) - Refactor GridLine to accept explicit min/max bounds per axis so grid aligns exactly with machine profile limits - Add getCoordinateBounds() to derive grid/axis extents from machine profile or fall back to unit-system defaults - Add rebuildCoordinateSystems() to rebuild grid and axes when machine profile changes - Fix Z pivot centering: pivot is set on XY center only; Z origin stays at 0 to match CNC machine convention - Fix changeMachineProfile to handle profile removal and rebuild scene - Increase rotateSpeed to 2*Math.PI for direct 1:1 rotation feel - Increase panSpeed default to 1.0 in TrackballControls * fix(visualizer): reduce rotateSpeed from 2*PI to PI for better control Half-screen drag now equals 180° instead of 360°, giving more precise rotation control while still feeling fast and responsive. * feat(visualizer): add Shift+drag horizontal orbit constraint Hold Shift while dragging to lock rotation to the horizontal plane — the camera orbits around the world Z axis, preserving its elevation angle relative to the pivot point. Releasing Shift restores the full free-rotation trackball behavior. Implementation details: - Added _constrainHorizontal flag set from event.shiftKey in mousemove - Constrained path rotates _eye around world Z using setFromAxisAngle, guaranteeing no elevation drift - camera.up is recomputed as cross(_eye, sideways) after each constrained rotation to keep it upright - Normal trackball path is completely unchanged - _lastAxis/_lastAngle are tracked per-branch for correct damping * docs(controller): document autolevel commands and events in Controller.js Add autolevel command signatures to the command() JSDoc block: - autolevel:startProbing: { startX, endX, stepX, startY, endY, stepY, startZ, endZ, feedrate, probeFeedrate } - autolevel:runTestProbe: { depth, feedrate } - autolevel:getProbeState: null, callback - autolevel:applyProbeCompensation: { gcode, probeData }, callback - autolevel:loadFromFile: filepath, callback - autolevel:saveToFile: filepath, callback Note that autolevel:update and autolevel:complete are server-emitted events and belong with addListener/removeListener, not command(). * docs(controller): move autolevel event docs inline as JSDoc comments Replace the comment block before command() with JSDoc @event annotations directly on each event key in the listeners object. * refactor(server): rename auto-level to autolevel - Rename auto-level.js to autolevel.js - Rename auto-level.test.js to autolevel.test.js - Update logger tag from 'AutoLevel' to 'autolevel' - Update import variable from autoLevel to autolevel in all controllers - Update describe block in test file * refactor(autolevel): rename app widget from AutoLevel to Autolevel - Rename widget directory from AutoLevel to Autolevel - Update import and variable name in Widget.jsx - Rename class from AutoLevelWidget to AutolevelWidget in index.jsx - Update constant namespaces in constants.js - Update widget caption and description in WidgetManager.jsx - Hide probe area visualization when probing starts - Improve log levels (info → debug for high-frequency/internal calls) - Remove redundant log prefix (file is already scoped to autolevel widget) - Add probe visualization lifecycle comments for all show/hide calls - Add margin-top spacing and last-child reset to ProbeProgressDisplay * chore(i18n): upgrade i18next to v25 with compatibilityJSON v4 - Bump i18next ~15 to ~25.8.17 - Replace i18next-xhr-backend with i18next-http-backend ~3.0.2 - Replace i18next-node-fs-backend with i18next-fs-backend ~2.6.1 - Replace i18next-express-middleware with i18next-http-middleware ~3.9.2 - Bump i18next-browser-languagedetector ~3 to ~8.2.1 - Add compatibilityJSON: 'v4' to app, server, and scanner configs - Rename deprecated 'whitelist' option to 'supportedLngs' - Update backend parse() to use namespace param instead of url - Fix i18n._: use pluralResolver.getSuffix() for CLDR plural suffixes with Number.isFinite() guard and non-mutating tOptions spread * fix(autolevel): move colons inside i18n keys for proper translation * feat(i18n): add autolevel translations and v4 plural forms for all locales * feat(autolevel): add i18n to probe visualization labels, step sizes, and fix button layout - Wrap PROBE AREA/START/END labels in ProbeVisualization with i18n._() - Translate step size dropdown labels and use IMPERIAL_UNITS constant - Refine step size options: metric [1,2,5,10,20mm], imperial [1/16"-1"] - Move Run Test Probe button below Z-Axis Settings section - Make Start/Stop Probing a full-width btn-block button - Add flex-wrap to button-row to prevent overflow with long translations * feat(autolevel): extend step size range for small and large workspaces Add coarse step sizes (50mm/2", 100mm/4") for large flat workspaces while keeping fine steps (1mm/1/16") for precision PCB work. Metric: 1, 2, 5, 10, 20, 50, 100mm Imperial: 1/16", 1/8", 1/4", 1/2", 1", 2", 4" * feat(i18n): add translations for probe visualization and step size labels Add translations for PROBE AREA, START, END labels across all 16 non-English locales. Add new i18n keys for step size dropdown options and measurement units. * feat(autolevel): add SVG diagrams, confirmation modals, input validation, and UI improvements - Add TestProbeModal with safety confirmation and ZProbeDiagram - Add ProbeAreaDiagram showing probe grid with dot visualization - Add ZProbeDiagram showing Z-axis probe cycle with clearance/start/end Z labels - Add input validation with error display for all numeric fields - Use existing Button, Checkbox, ToastNotification, Infotip, Dropdown components - Add infotip tooltips for all Z-axis and probe area settings - Replace native select with Dropdown for step size picker - Side-by-side ZProbeDiagram + ProbeAreaDiagram in Start Probing modal - Rename Clearance Height to Clearance Z for consistency - Allow negative input values for Probe Start Z and Probe End Z - Only persist valid numeric values to config store * feat(autolevel): improve ApplyView UI, rename compensation labels, and fix state management - Rename "G-code Compensation" to "Probe Compensation" throughout ApplyView - Rename isAutoLevelled to isProbeCompensationApplied for clarity - Update Visualizer badge text to "Probe Compensation Applied" - Add close button on filename row to unload G-code and reset state - Add help-block descriptions for Load G-code and Export buttons - Add gcode:load pubsub listener to reset state when new G-code is uploaded - Reset isProbeCompensationApplied in Visualizer uploadFile to clear badge - Remove dead LoadProbeView component and VIEW_LOAD_PROBE constant - Move tip from LandingView to ApplyView Probe Results section - Use flex layout with gap for LandingView - Remove unused .noGcodeText style - Add .form-group:last-child margin reset in ApplyView sections * refactor(autolevel): use Button component in modals and replace unicode icons with FontAwesome - Replace raw <button> elements with Button component in StartProbeModal, TestProbeModal, and StopProbeModal footers - Replace unicode ▶/⏹ with fa-play/fa-stop icons in SetupProbeView - Use blue background/border for gcode-data-info in ApplyView * fix(autolevel): use controller reset to immediately stop probe cycle Replace feedhold with reset command in stopProbing action so the probe cycle is cancelled immediately instead of just paused. * feat(autolevel): full unit conversion, probe API refactor, and server improvements UI / Client: - Add full unit conversion (metric/imperial) following Probe/Tool widget patterns - Config stored in mm, display in current G20/G21 units - unitsDidChange flag prevents config overwrite during unit switch - Add toDisplayUnits() utility to units.js for consistent unit label display - Rename clearanceHeight -> clearanceZ, probeStartZ -> startZ, probeEndZ -> endZ, probeFeedrate -> feedrate, feedXY removed (G0 ignores feedrate) - Remove ProbeProgressDisplay component, use Bootstrap ProgressBar inline - Use Bootstrap ProgressBar with percentage label in SetupProbeView - Probe stats (Z-min, Z-max, max deviation) displayed via mapPositionToUnits - Update defaultState.js to match server parameter names Server / Protocol: - Rename autolevel:startProbing -> autolevel:start with mode param - mode='full': multi-point probe grid (default) - mode='test': single-point test probe at current XY position - Remove autolevel:startTestProbe command (merged into autolevel:start) - Add autolevel:stop command: resets machine + clears probe state - Add clearanceZ as separate parameter from startZ - G-code: G0 Z{clearanceZ} -> G0 X Y -> G0 Z{startZ} -> G38.2 Z{endZ} - Remove feedrate from G0 moves (G0 ignores feedrate by definition) - Normalize probe data to mm in all 4 controllers - Grbl: uses $13 setting to detect inch reporting - Smoothie/Marlin: uses G20/G21 modal state - TinyG: prb always in mm, WCO computed with unit-aware conversion - feedrate (G38.2 probe speed) made optional in G0 XY moves * feat(autolevel): replace stepSize with stepX/stepY and per-axis snap - Replace single stepSize with separate stepX/stepY inputs in SetupProbeView - Update ProbeAreaDiagram to accept stepX/stepY props - Update all probe point calculations to use stepX/stepY - Per-axis snap in 3D visualizer: snapX=stepX/2, snapY=stepY/2 - Remove snapSize fallback from ProbeVisualization constructor - Fix Visualizer.jsx to update snapX/snapY (was still using snapSize) - Update defaultState.js with stepX:5, stepY:5 and bCNC-aligned defaults - Add stepX/stepY validation (must be > 0) - Changed validation message to 'Must be a number' * feat(i18n): add autolevel translations and fix feedrate units display - Fix feedrate unit addon to use mm/min and in/min as single i18n keys following the same pattern as the Probe and Tool widgets - Remove unused "min" key from all 17 locale resource.json files - Add translations for new autolevel keys in all 16 non-English locales: Step X/Y, Clearance Z, Start Z, End Z, Probe Compensation, Probe Compensation Applied, Must be a number, Must be greater than zero, and all tooltip descriptions using proper CNC terminology - Fill all remaining missing translations (Load G-code file, Test Probe, Workpiece, probing progress, warning messages) across all locales including nb and pt which had 30 missing keys each --------- Co-authored-by: Claude <noreply@anthropic.com> | 6 个月前 |
| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
| 14 天前 | ||
| 7 年前 | ||
| 6 个月前 | ||
| 6 个月前 | ||
| 1 年前 | ||
| 6 个月前 | ||
| 7 年前 | ||
| 14 天前 | ||
| 7 年前 | ||
| 14 天前 | ||
| 6 个月前 | ||
| 7 年前 | ||
| 14 天前 | ||
| 7 年前 | ||
| 7 年前 | ||
| 6 个月前 |