# Future:
- [Oz] WIP - Shape builder tool
- [Oz] WIP - Custom IP camera support
- [Oz] WIP - New license dialog / flow

# 2.0
- [Oz] Simple shape creation now also allows select / move / scale / rotate
- [Oz] Added context menu to Cuts/Layers window for toggles
- [Oz] Stacked button for simple shape operations (Rect, Ellipse, Polygon, Star, etc)
- [Oz] Stacked button for boolean operations
- [Oz] Added "Select result" to Copy Along Path
- [Oz] Bugfix: fixed jitter when dragging nodes in node edit (they were snapping to the lines they were attached to)
- [Oz] Text shapes now have an option to remove newline if a variable text CSV field is empty
- [Oz] Removed decimal points in Speed / Power display if not significant (makes it easier to read from a distance)
- [Oz] Increased rendering speed of edit window by 20% for complex files
- [Oz] Increased speed of AI and DXF imports by about 50%
- [Oz] Added --devname (device name) command line argument to choose device on launch
- [Oz] Added LASER:LaserName command to UDP socket interface
- [Oz] Added support for alpha channels in RGB and CMYK images in AI files
- [Oz] Added a check for duplicates on same layer when running a job
- [JL] AprilTag and ArUco types added to barcode tool
- [Oz] Galvo rotary window now lets you visually adjust the Output Center value
- [Oz] Added "Ignore Text" option for DXF imports
- [Oz] Bugfix: grouped mask when grouped with the masked image would fail to reload properly
- [Oz] Added 'Focus Light' button for BSL lasers to enable 2nd focus dot
- [Oz] Bugfix: Prevent crash if setting a freq > 1000kHz on BSL cards

# 1.7
- [Oz] New Line tool
- [Oz] New Trim (Scissors) tool
- [Oz] Initial BSL galvo support
- [Oz] Store / restore camera resolution with camera data
- [Oz] Increased miter limit on Offsetter to 10x the offset
- [Oz] Emblaser Pro support
- [Oz] Bugfix: broken help links
- [Oz] Bugfix: Don't show "interval" setting on material test when in Line mode
- [Oz] Bugfix: Don't show missing material libraries in list
- [Oz] Bugfix: Global Passes wasn't working with Cylinder Correction
- [Oz] Bugfix: Corner fillet tool crashes / inconsistencies
- [Oz] Bugfix: Scale exported SVG stroke values to compensate for shape xform scale
- [Oz] Bugfix: Update window title bar when changing language
- [Oz] Bugfix: Framing on Trocen over network could fail because of garbage reply data
- [Oz] Added ability to hide fonts in the font list (as well as show hidden, and unhide)
- [Oz] DXF export now includes proper layer info (Wazer software compatibility)
- [Oz] Added support for letter spacing in imported SVG text
- [Oz] Bugfix: Identical images loaded at different DPI settings and sizes would load the same size because of caching
- [Oz] Added "Trim Shapes" tool (scissors)
- [OZ] Added "Completed" field to Repeat Marking window for galvo, to track completed part count
- [Oz] Bugfix: SVG stroke scale was huge if exporting mirrored shapes
- [JC] Initial WeCreat Vision camera support over RNDIS
- [JL] Overlay reprojection has been expanded from original rectangle to entire workspace
- [JL] Camera calibration and alignment will be rescaled if the camera is in a different resolution
- [JL] Camera alignment can now be done in a different resolution from calibration
- [JL] Camera combobox tooltip shows camera info
- [JL] Camera alignment wizard now pre-selects the current camera
- [JL] Bugfix: Camera 'bounce' (open, close, open) on device change
- [JL] Bugfix: Camera would never change back to 'None' on device change
- [AH] Add UI for serial port exclude/include
- [AH] Added automatic tracking and restore of unit and movement modal gcode states (G20, G21, G90, G91) to Custom GCode
- [Oz] Added support for image predictors in grayscale masks and CMYK images in PDFs
- [Oz] Bugfix: Slot resizer was confused by zero width or height rectangles
- [JL] Camera lens calibration wizard now pre-selects the current camera
- [Oz] Added simple engrave and cut presets to Material Test for diodes and CO2 systems
- [Oz] Bugfix: End of job alarm and "Done marking" signals only emitted on final slice of rotary or repeat marking
- [Oz] Bugfix: Added enable rotary setting to Generic GCode profile
- [Oz] Bugfix: sub layer 'interval' value was incorrect in small window under Cuts/Layers
- [Oz] Added "Stop at" feature for galvo lasers (won't start if enabled and count == stop at number)
- [JL] AprilTag pattern detector for camera lens calibration
- [JL] Bugfix: PDF import crash with inline 'CCF' images
- [Oz] Bugfix: Malformed DXF spline objects could crash the importer
- [Oz] Bugfix: User defined start point on spline shapes could be incorrect on output
- [Oz] Added support for start / end delays on galvo (pause before or after shape)
- [Oz] Added support for BSL/SeaCAD CorFile
- [Oz] Bugfix: New DXF export of shapes with arcs wasn't properly flagging closed shapes
- [JL] Material Test Settings now save to Bundles and restore again
- [JL] Bugfix: Bundle presets imports would 'error' if the presets file already existed but was completely empty
- [JL] Bugfix: Bundle presets imports would fail if the presets directory did not exist
- [JL] Bugfix: Bundle settings imports would sometimes crash due to a Qt bug
- [JL] Bugfix: Bundle settings imports combined with Art Library imports would forget the libraries
- [JL] Bugfix: Text with diacriticals (Thai, Hebrew) on a curved path would infinite loop
- [AH] Allow handling bundles from preferences import
- [JL] Bugfix: Device GUIDs were being copied by the Device Duplicate function, and then fixed on restart
- [JL] Bugfix: Overlay image memory leak
- [JL] New MacOS camera system
- [JC] Improved WeCreat camera support
- [JL] Added 'precalibrated camera' lens calibration option
- [JC] Upgraded Linux runner to 22.04, meaning minimum Linux version bumps to Ubuntu 22.04 for 1.7.
- [JC] Fixed jog Z moves sent out even if Z control was disabled in device prefs.
- [JL] 'Camera Resolution' setting now affects MacOS camera mode
- [JL] Camera Lens Calibration accepts wider range of scores to allow calibration of bad cameras
- [JL] Continuous Jog layout fixes
- [Oz] Bugfix: Changing the "interval" below the cuts/layers window then changing sub-layer would miss the interval change
- [JL] "Current calibration - reset resolution" option added to Camera Lens Calibration Presets for mis-assigned cameras
= [JL] UNC Temporary File paths for backup files were being incorrectly prefixed with "UNC/" by Qt on Windows

# 1.6.01
- [JN] Bugfix: Fixes for Cubiio / start from origin mode
- [Oz] Bugfix: Reset to default for cut settings was not working as expected
- [Oz] Bugfix: Cut settings memory leak
- [AH] Bugfix: Network connections were not working for Custom GCode
- [Oz] Bugfix: SVG export stroke scale was incorrect for mirrored shapes

# 1.6
- [Oz] Pressing Ctrl enables the drag-dots for corner radius and polyon sides
- [Oz] Added ability to rotate workspace for GCode machines (portrait -> landscape)
- [Oz] Added support for negative workspace for GCode machines
- [Oz] Allow 'Mirror across line' if the line is a bezier, but straight
- [Oz] Shift+Click on 'Reset to defaults' in Optimization Settings resets to LightBurn standard defaults
- [Oz] External start trigger for galvos will show a status warning if nothing selected or enabled for output
- [Oz] Bugfix: Handle different image paddings in PDF files
- [Oz] Bugfix: Remember last extension used when saving device specific files (gc, gcode, txt, etc...)
- [Oz] Added 'randomize orientation' flag to grid array
- [Oz] Added ability to nudge rotation during galvo framing
- [Oz] Bugfix: Setting a kerf offset on a sub-layer that wasn't the last sub would not apply the kerf properly
- [Oz] Bugfix: Extremely large decompressed streams (>2Gb) would cause Illustrator files to fail to load
- [Oz] Added option to clean whole image or just recent passes with 3DSlice on galvos
- [Oz] Bugfix: Corner Rounding tool crashed or didn't work on a few specific cases
- [Oz] Bugfix: pressing 'Frame' on rotary screen for galvos could freeze, or frame incorrectly
- [JL] Added User and Vendor Bundles, Export and Import
- [Oz] Bugfix: Galvo lens correction wizard would fail bounds check with lens size smaller than 100mm
- [Oz] Bugfix: If using 'Order by Priority' or 'Order by Group' with 'Angle per Pass', partitions after the first would get an incorrect number of passes
- [Oz] Bugfix: Stroke in exported SVGs wasn't properly scaled by shape scale
- [Oz] Bugfix: Fixed Trocen origin issues
- [Oz] Bugfix: Fixed Global Passes not applying Cylinder Projection
- [AH] Bugfix: Don't show missing material libraries in list
- [Oz] Bugfix: Clicking the Cut/Copy/Paste toolbar buttons could crash in specific cases
- [Oz] Bugfix: DXF import of MTEXT could break if formatting string had mismatched {}'s
- [AH] Bugfix: Rerunning device wizard on existing device could lose settings

# 1.5.06
- Bugfix: Trocen specific issues with Start From / Origin UI

# 1.5.03
- Bugfix: Overriding cut setting to be of line type for border for material test
- Bugfix: Cubiio - Enable Z material height
- Bugfix: Cubiio - Fix pause/resume/stop
- Bugfix: Bring back SnapMaker inline power
- Bugfix: Galvo field offset tooltips
- Bugfix: Force material library entries to always output
- Bugfix: Fix rotary framing freeze up

# 1.5.02
- Bugfix: Handle different image paddings in PDF files
- Bugfix: new SPLINE parser would crash when trying to close degenerate splines (single node)
- Bugfix: HSpace wasn’t being included in new font advance code
- Bugfix: Cached images could load in incorrect orientation

# 1.5.01
- Bugfix: Cached images could flip orientation when reloading, depending on machine origin and the image orientation.

# 1.5
- [Oz] Added automatic guide lines (hold Alt while dragging selection)
- [Oz] Added draggable guide lines
- [Oz] Enhanced automatic guide lines to work when drag-scaling, and shape creation (ellipse, rect, polygon, Qr, text)
- [JC] Added console command history with up/down key browsing
- [Oz] Added Taper Warp to Laser Tools menu
- [Oz] Corner Rounding tool now supports complex shapes and curves
- [Oz] Continuous framing support for GCode and DSP systems
- [Oz] Material Library merge function
- [Oz] Added caching of compressed image file sources, so re-saving (and auto-save) takes less time.
- [Oz] Added 'Global Passes' for galvos - runs all sub-layers in order multiple times
- [Oz] Added framing for galvo rotary - Frames in sections as it will appear on the rotary
- [Oz] Added 'Apply' button to Slot Resizer - allows it to stay open, be run again with different options
- [JN] Added border setting to material test
- [Oz] Added support for OMTech Polar Z axis handling (in Edit > Device Settings, enable Z, enable Polar, enable Optimize Z moves)
- [AH] Added "Design Only" device type and option to create one automatically on first launch
- [Oz] Added 'Squeeze Text' property to allow max-width to scale the whole string, or just the width
- [Oz] Added draggable rectangle corner radius dot
- [Oz] Added 'Fire Power' value to Device Settings, next to the enable toggle for it
- [Oz] Added support for transparency masks on PDF images
- [Oz] Improved galvo handling of 'Rewind' on repeat marking, added 'Set zero' to repeat mark and rotary windows
- [Oz] Added 'Show' button for galvo rotary output center
- [Oz] Added support for palettized CMYK images in PDF importer
- [Oz] Added 'Select Results' to Circular and Grid arrays
- [Oz] Added option to trace transparency channel if an image has one
- [AH] Added thumbnail output for SnapMaker machines
- [AH] Enable inline power mode for SnapMaker (available with recent firmware update to some machines)
- [AH] Fixed rotary B axis outputting A instead
- [AH] Added in-application trial extension
- [JC] Added home keyboard shortcut Ctrl+H to home the Laser
- [JC] Updated the circular array dialog to be modeless, like the grid array dialog
- [Oz] If a selection contains exactly one locked shape, align / size to that one instead when using align / make same width/height
- [Oz] Added 'Frame' and 'Stop' triggers for galvos
- [Oz] Added missing 'standalone' tag to SVG file header (improves compatibility)
- [Oz] Clicking labels next to Width, Height, or % controls will select the whole number, instead of having to triple-click in the box
- [AH] Bugfix: Correctly deal with virtual arrays when deleting all shapes in layer
- [AH] Bugfix: Prevent erroneous warning manual tab warning when changing to tool layer
- [AH] Bugfix: Prevent crash when loading file with corrupt cut setting
- [AH] Bugfix: Prevent accidental export of internal only cut settings
- [AH] Bugfix: Allow grouping results of radial array
- [Oz] Bugfix: Zooming while drag-scaling would cause the scaling to get weird
- [JL] Bugfix: Y2038 bug in licence handler fixed and expiry extended to fully cover final day
- [AH] BugFix: Finish position now respects configured units
- [Oz] Bugfix: Measure tool mm/in button showed incorrect units if starting in inches
- [Oz] Bugfix: Improved text style code removal in DXF text import


# 1.4.05:
- [Oz] Bugfix: Edge case in the DXF spline import could cause the last curve in a shape to become a line
- [Oz] Added linux AppImage release


# 1.4.04:
- [Oz] More decimals for material test interval when in Inches
- [Oz] SVG import automatically converts completely straight curves to lines, and removes duplicate verts
- [Oz] Resize Slots tool now highlights lines (green), curves (pink), and shape breaks (red circles) to help spot malformed art
- [Oz] Optimize Shapes tool now displays input and output line/curve counters
- [Oz] Bugfix: bad / empty entries in Art Library could cause crash when using search
- [Oz] Bugfix: Don't alter control handles when extending an existing line with the line tool
- [Oz] Bugfix: Don't allow grayscale when passthrough is enabled on galvo
- [Oz] Bugfix: Close Shapes With Tolerance window displayed incorrect counts
- [Oz] Bugfix: Close Shapes altered selection
- [Oz] Bugfix: Don't show cropped image when using Trace Image
- [Oz] Bugfix: Allow cancel while generating 3DSlice data
- [Oz] Bugfix: extremely small vertex bulge values could confuse the DXF importer
- [Oz] Bugfix: don't write rotary settings to controller if reading them wasn't successful (Ruida '360 steps' bug)
- [Oz] Bugfix: Grid Array 'variable increment' value wasn't always updated properly
- [Oz] Bugfix: Slot resizer would update scaled rectangles incorrectly
- [Oz] Bugfix: SVG style definition parser didn't handle empty space correctly
- [Oz] Bugfix: SVG parser could crash when using grouped switch/symbols that weren't used
- [Oz] Bugfix: DXF import could crash if an unnamed block contained inserts for unfound shapes
- [JC] Bugfix: Fixed serial disconnect issue ("port already in use?" bug)
- [Oz] Bugfix: After changing the Min/Max frequency for galvo, the main window wouldn't allow the new range
- [Oz] Bugfix: Handle huge steps per rotation values in rotary for galvos
- [AH] Bugfix: Disallow managing cut setting defaults when in material test generator
- [Oz] Added detection of G-Weike Cloud laser, handles Z correctly now (auto sets proper Z height based on material thickness)
- [Oz] Bugfix: Text blocks in AI files could confuse the parser
- [Oz] Bugfix: Major improvements to importing of DXF SPLINE objects
- [Oz] Change: Copy along path function now uses nearest point on path as starting point
- [Oz] Change: Holding Shift will now axis snap measure tool when dragging measure line


# 1.4.03:
- [Oz] Bugfix: bad command sequence caused 'Extend space' error on Ruida if Z moves were enabled on the first fill layer


# 1.4.02:
- [Oz] Art Library search function
- [Oz] Added thumbnails for Thunder 1Gb controller
- [Oz] Bugfix: groups with LOTS of objects took too long to load
- [AH] Bugfix: Snapmaker rotary outptu now correctly maps to B axis
- [JL] Bugfix: Lead in/out now allowed when tabs enabled
- [JL] Bugfix: Adjust Image tool now keeps images in sync, even with odd orientations
- [JL] Bugfix: Fire Button setting didn't work when the Move window was hidden
- [JL] Bugfix: DXF MTEXT vertical alignment was sometimes incorrect
- [JL] Bugfix: fiber out-of-bounds images masked by 'unframed' tool layers were being output
- [Oz] Bugfix: Deleting a node that connected to itself could crash node edit
- [Oz] Bugfix: Dragging a node that connected to itself could crash node edit
- [Oz] Increased precision of Boolean operations (was 1/125th of a mm, now 1/4096th of a mm)
- [Oz] Bugfix: Ctrl+Shift didn't de-select shapes
- [Oz] Bugfix: Ruida Z-step per pass could fail to set scanning speed if not filling whole layer at once
- [Oz] Bugfix: Convert Move Window target location for 'Go' button to new units when switching
- [Oz] Bugfix: Rotary setup screen would reset "run whole shapes" settings back to default
- [Oz] Allow galvo frequency setting as low as 10hz
- [Oz] Added 'Test' button for Repeat Marking axis setup
- [Oz] Faster screen refresh when drawing lots of very small shapes
- [Oz] Shape Optimizer will now remove Beziers that are basically linear
- [Oz] Bugfix: weird error in PDF decompression code caused some files to not import properly or even crash
- [JN] Bugfix: IP address selection would not show in new device setup
- [Oz] Bugfix: Door Protect on galvo could not be un-paused when triggered
- [Oz] Bugfix: UV pulse now allowed as low as 0.05ns (controller limit)
- [Oz] Bugfix: 'Increment by' for variable text in radial array wasn't being picked up when changed
- [Oz] Bugfix: Nasty crash in break / break apart / convert to path interaction, often triggered when node editing
- [Oz] Bugfix: Exported SVG shapes are now sorted into layer order
- [Oz] Improved accuracy of galvo scanline output - produces more consistent engraving without line artifacts


# 1.4.01:
- [Oz] Don't auto-connect lines to existing shapes if on different layers
- [Oz] Slot resizer bug fixes for rectangular slots
- [WP] Fixed docking with perpendicular lines
- [Oz] Bugfix: Offset Fill didn't respect power scale
- [Oz] Bugfix: reload hotkey map on language Change
- [Oz] Bugfix: support SVG 'dominant-baseline' tag on text
- [Oz] Bugfix: DXF line patterns that are extremely short should be ignored
- [Oz] Bugfix: Done Marking signal pulse wasn't always turned off
- [Oz] Bugfix: UV Pulse length now clamps correctly based on freq limits
- [Oz] Added new 1Gb Thunder laser controller support
- [Oz] Cut/Copy/Paste behavior in edit boxes now working on MacOS
- [Oz] Bugfix: PDF inline JPG images didn't load correctly
- [Oz] Bugfix: measure tool reported incorrect arc lengths for grouped / scaled shapes
- [Oz] Bugfix: Ruida start/end delays didn't work if longer than 17 seconds
- [Oz] Bugfix: Don't re-join broken nodes if the user simply clicks to select, but doesn't move
- [Oz] Added support for Ruida controller stored scanning offsets
- [AH] Bugfix: Galvo timing overrides were not being shown correctly on sub-layers
- [Oz] Bugfix: Added support for true RGB colors in DXF layers
- [Oz] Added support for Large Canvas scale in AI files
- [Oz] Bugfix: Slot resizer was resizing some 4-point rect shapes in the wrong direction
- [Oz] Bugfix: Headcam on DSPs wasn't polling controller connection properly
- [Oz,JS] Bugfix: head camera math was a little off, could trigger limit switches


# 1.4.00:
- [Oz] Added 'Repeat Marking' feature for galvos
- [Oz] Added Scale nudge to galvo framing dialog with PgUp / PgDn
- [AH] Add File > New Window option to launch separate instance
- [Oz] Added warp tool
- [Oz] Added deform tool
- [Oz] Line tool now actively tries to connect to existing shapes
- [Oz] Cleaner output when deleting single line/curve in a shape
- [Oz] Auto-close combined paths in SVGs on import
- [Oz] Add head camera settings to camera import/export
- [Oz] Added field offset for fine tuning galvo devices
- [Oz] Added cursors to indicate failure modes for Fillet tool
- [Oz] Updated Slot resizer to support Inch units
- [Oz] Allow two decimal places for Q-pulse length for UV galvos
- [Oz] Added Done Marking duration setting
- [Oz] Remember the Job Counter value after the framing dialog is closed (might move this to a global counter, but trying this for now)
- [Oz] Can now drag-reorder stored move coordinates
- [Oz] Expanded range of allowed override frequency for CO2 lasers up to 100khz
- [Oz] Don't allow MOPA commands through to DIGIT boards (prevents hanging the board when wrong laser is chosen)

- [Oz] Bugfix: SVGs with shape instances that specified size in percent imported incorrectly
- [Oz] Bugfix: Don't print hidden layers
- [Oz] Bugfix: Variable text parser would miss quotes on start of line
- [Oz] Bugfix: New auto-overscan code for DSPs ignored multiple passes
- [Oz] Bugfix: properly handle multi-appended SVG style definitions (new Illustrator exports & clipboard format)
- [Oz] Bugfix: large data packets sent from Ortur WIFI (like machine settings) could hang the connection
- [Oz] Bugfix: support height wasn't properly restored when switching between mm/in on the main toolbar
- [Oz] Bugfix: DXF polyline arc export was incorrect for some device origin settings
- [Oz] Produce less direction change in Offset Fill of curves
- [Oz] Bugfix: Done Marking signal for galvos wasn't properly emitted when a job completed normally
- [Oz] Bugfix: Overscan distance wasn't shown properly for Image Mode on GCode systems
- [Oz] Bugfix: Enable Focus / Air assist by layer/with laser settings interfered with each other
- [Oz] Bugfix: Overcut used with "Choose best starting point" on Ruida could produce an incorrect cutting line
- [Oz] Bugfix: GCode produced for non-horizontal fills on A-axis rotary had incorrect feed-rate
- [Oz] Bugfix: Flood Fill now disables Fill grouping in galvo mode
- [Oz] Bugfix: 'Show Me' open shapes would crash if the shapes were in a virtual array
- [Oz] Bugfix: Pause button in rotary screen would sometimes not resume
- [Oz] Bugfix: Image compositor could sometimes output zero-length pixels on the edge of an image
- [Oz] Bugfix: 'Start Here' + Overcut would emit incorrect cut line at end on GCode systems
- [Oz] Bugfix: AutoGroup feature could incorrectly exclude interior shapes
- [Oz] Bugfix: don't do extra work during 'Break Shapes' (dramatically faster when breaking shapes with lots of nodes)
- [Oz] Bugfix: PDF file with a line-break in an object reference would crash
- [Oz] Bugfix: Scan image preview showed wrong angle for some device origins
- [Oz] Bugfix: Ramp mode broken if "ramp outer edge" was off (bug in inside/outside sorting)
- [Oz] Bugfix: Disabling first sub-layer could cause a crash, and incorrect filling of subsequent sub-layers
- [Oz] Bugfix: Slicing shapes for rotary could cause a crash in rare circumstances
- [Oz] Bugfix: Limit total attempts to intersect Bezier curves (prevents crash on malformed or weird files)
- [Oz] Bugfix: Roller rotary on galvo was incorrectly using object diameter, not roller diameter
- [Oz] Bugfix: inline style should override class style on shapes
- [Oz] Bugfix: Send File shortcut (Alt+Shift+S) was broken
- [Oz] Bugfix: 'Mirror output to rotary' would revert if creating or loading a new file
- [Oz] Bugfix: DXF spline parser got confused if some data fields were out of order



# 1.3.01
- [Oz] Updated slot resizer to handle rectangle slots, differentiate between slot depth and width, other improvements
- [Oz] Bugfix: frame speed was not restored correctly
- [Oz] Bugfix: laser position display wasn't updated properly
- [Oz] Bugfix: importing bent text from art library could flip incorrectly
- [Oz] Bugfix: remove overlapping lines could miss small lines fully covered by larger ones in some cases
- [Oz] Added 'Select shapes smaller than selection'
- [Oz] Added support for ComMarker B4 and similar 'Dynamic' FPGA based boards
- [Oz] Show sub-layer tabs in 'Quick Cut' window in red if disabled
- [Oz] First pass of support for SPI galvo sources


# 1.3.00
- [Oz] Added hotkey editor
- [Oz] Added 'Resize Slots' function
- [Oz] Auto-flip files on open or import project if the device origin doesn't match
- [Oz] Added ability to remove rounded corners in the corner round tool
- [Oz] Preview will now add automatic overscan moves for DSPs, improving preview time estimate
- [Oz] Added 'Distort' setting for bent text, allowing you to choose whether to distort individual letters or not
- [Oz] Added 'Align selected shapes' function to Edit Nodes
- [Oz] Added user editable distance value for 'Remove Overlapping lines' optimization
- [Oz] Remove Overlapping Lines now handles partial overlaps
- [Oz] Framing the material test on galvo now interactive, supports nudging
- [Oz] Added I-Beam cursor when near text in text mode
- [Oz] Major speedup of 'Optimize Shapes' when smoothing is enabled
- [Oz] Added a check for network MTU size - adjusts packet size on Ruida file sends accordingly if too small
- [Oz] Added timing delays and jump speed to EZCad config import
- [Oz] Added 'Frequency' to material test for supported gantry CO2 systems (Ruida)
- [Oz] Material test now shows all unit labels
- [Oz] Finalized UV galvo support
- [Oz] GCode devices will now show estimated time remaining when running a job
- [Oz] Modified the 'Start Points' tool to also show start / end points of compound shapes, making it easier to find open shapes
- [JS,Oz] Added "Door Switch" support for galvos
- [JS] Added 'Done Marking' signal for galvos
- [Oz] Proper detection of XTool and Ortur devices with Find My Laser, better detection of GCode systems overall
- [Oz] Much faster job generation when 'Optimize Cuts' is disabled
- [Oz] Updated Emblaser2 focus calibration page
- [Oz] Bugfix: Improved Node Edit 'break' function to keep nodes in 'nice' order, less crash prone
- [Oz] Bugfix: Auto-Join now properly handles duplicate shapes, won't produce T-junctions
- [Oz] Bugfix: turning off a sub-layer in the middle of a set would change the output order of the others
- [Oz] Bugfix: 'Run from Here' didn't always work if images set to 'Fill all at once' or 'Fill groups together' were in the job
- [Oz] Bugfix: drawing a closed-loop shape could make a large loop if the first line was curved
- [Oz] Bugfix: when framing from the Camera Align wizard on a galvo, if you ran the job from the frame window, power settings were wrong
- [Oz] Bugfix: double-quote in a CSV file was handled incorrectly (variable text)
- [Oz] Bugfix: importing a LightBurn file that contained virtual arrays and immediately assigning to a new layer caused a crash
- [Oz] Bugfix: Exporting a shape with one bezier made of a single point to SVG caused weird output
- [Oz] Bugfix: dotted lines could hang DXF import
- [Oz] Bugfix: galvo rotary settings would change Roller Diameter to the Object Diameter value


# 1.2.04
- [Oz] CutBuilder now forces shapes to run in generated order if no optimizations are enabled
- [Oz] Bugfix: Tool layers could cause later multi-layer cuts to run out of order
- [Oz] Bugfix: Restored missing German language file
- [Oz] Bugfix: Ruida cut-through delays would affect later layers (RDWorks does this too)
- [Oz] Bugfix: image merging (whole layer or by group) was broken
- [Oz] Bugfix: Close Path could hang
- [Oz] Bugfix: Fixed framing of tool layers / disabled output layers
- [Oz] Bugfix: Warning pop-up in Cut Builder didn't let you continue because of the progress bar being "on top" of it
- [Oz] Bugfix: If a small shape set to Offset Fill didn't generate anything, it could crash


# 1.2.03
- [Oz] Bugfix: Missing startup command for Raycus / IPG sources

# 1.2.02
- [AH] Fix framing with virtual arrays and disabled layers
- [AH] Hide the "Output" option when editing cut library settings
- [Oz] If removing the 2nd-last sub-layer, force the remaining layer to be enabled
- [Oz] Force close / delete any floating window if the user closes the app
- [Oz] Galvo framing wasn't properly ignoring out-of-bounds shapes in non-rotary mode
- [Oz] Bugfix: Cut Shapes could put inner / outer shapes in wrong result when cutting a prim
- [Oz] Improved Auto-join behavior by making tolerance larger
- [AH] Save Cut Origin per device
- [AH] Save grid settings per device
- [AH] Save constant power mode per sub-layer
- [AH] Ensure all settings get saved before adding new sub-layer
- [Oz] bugfix: crash when using 'offset fill' with material test generator
- [Oz] Bugfix: Nested ()'s in text strings could crash PDF import
- [AH] Bugfix: Flatten array was not deleting the virtual array
- [Oz] Bugfix: Galvo was not respecting Min Power for grayscale image mode
- [Oz] Bugfix: grouped shapes now retain selection order in the group (useful for ordering images)
- [Oz] Bugfix: Cut builder / optimizer rewritten to correctly handle inner/outer sorting with multi-layer cuts, or when Order by Layer is not used
- [Oz] Bugfix: shape close / join code is now much more robust
- [Oz] Bugfix: suppress 'Start Marking' trigger if any dialog is open
- [Oz] Bugfix: Order By Layer / etc now works properly
- [Oz] Galvo rotary now allows running by slice or by shape
- [Oz] Bugfix: Trocen Ethernet connection wasn't respecting Network Timeout setting
- [Oz] Bugfix: Don't show certain options in galvo cut settings when Beginner Mode is enabled
- [Oz] Bugfix: Smoothieware cluster generator fixes for stray lines
- [Oz] Bugfix: Don't re-write material height field if user is still typing it
- [WP] Bugfix: Fixed .ai import issue (freeze when files contained large blocks of null data)
- [Oz] Bugfix: Fixed WIFI sending to OLM3, probably others (Capped maximum write to GCode devices to not overflow send buffer)
- [AH] Bugfix: Variable text was not rendered correctly when inside a group in a virtual array
- [Oz] Use the user nudge preferences for galvo framing nudges
- [Oz] Close Shapes will now work as long as something in the selection is open / unlocked
- [Oz] Dont show a progress bar when framing with a galvo - show 'Framing' in the status
- [Oz] Added 'Auto-Rotate' for galvos (per layer setting)
- [Oz] Bugfix: Galvo - robust filtering of foot switch trigger, both with Pulse mode enabled and without
- [AH] Bugfix: Material test generator was not working with linked cut settings
- [Oz] Bugfix: Added scanning offsets to new Flood Fill code
- [Oz] Fillet tool now accepts negative radius numbers
- [Oz] Improved grayscale output for galvo / fiber (removed unintended pauses)
- [Oz] Updated DXF importer to support dash patterns on LINE objects
- [Oz] Added 'Sanity Check' to galvo rotary runner
- [Oz] Updated galvo grayscale and drill mode

# 1.2.01
- [AH] Fix losing changes when changing quick settings tabs
- [AH] Use correct units for cor file import
- [AH] BugFix: Extend didn't always work if prims were out of normal order
- [AH] BugFix: Tabs from old files were loading disabled
- [AH] BugFix: Tabs checkbox still looked usable when disabled
- [AH] Added option to assign library setting to layer without linking
- [Oz] Bugfix: DXF files containing shapes with negative extrusion values could load incorrectly
- [Oz] Bugfix: blanking of red-dot pointer caused weird framing on some systems.  Now optional, has its own delay values.
- [Oz] Bugfix: DXF MTEXT importer now handles line spacing adjustment value
- [Oz] Tweak to Linked material display (Fill/Line/etc drop down is locked)
- [AH] Allow drag/drop reorder of devices list.
- [AH] Allow device list order by name and device type
- [Oz] Added input port display to galvo device settings screen
- [Oz] Bugfix: Ruida didn't properly set speed when using sub-layer line after a fill
- [Oz] Bugfix: JPT laser sources now configure correctly
- [JN] Bugfix: Copying text using a backup path now works as expected
- [Oz] Rotary output now has an 'Output Center' value that can be edited
- [Oz] Bugfix: close any open 'floating windows' (Grid array, etc) if the user closes the app
- [AH] Added ability to drag/drop .lbdev files into window to import them
- [Oz] Bugfix: linked materials set to 'Fill shapes individually' could fill incorrectly
- [Oz] Bugfix: angle-increment with cross-hatch didn't rotate the 2nd hatch pass (galvo)
- [Oz] Bugfix: Saving an RD file when not connected, and set to UDP, would use the wrong scramble key
- [AH] Bugfix: Converting a virtual array to bitmap and then undoing was causing a crash
- [AH] Added support for webp image format
- [AH] Bugfix: Automatically unlink layer when deleting the source library entry
- [Oz] Bugfix: Ruida display showed placeholder layers when sending a single layer from the middle of the layer list
- [Oz] Bugfix: Preserve shape order from original file if optimizations are disabled
- [AH] Bugfix: Fix virtual array flip with row/column shift
- [Oz] Added Kerf offset for galvos
- [Oz] Bugfix: DXF arc entities were offset when using negative extrusion values


# 1.2.00
- [AH] Added multi-pass sub-layers
- [WP] Added new Docking feature
- [AH,JS] Added cut library parameter linking
- [Oz] Head-mounted camera support and stitching
- [Oz] Increase recent file list to 24 entries
- [Oz] Added 'Don't show again' option to 'Library failed to load' message
- [JS] Added support for keypad jogging on mac with full keyboard
- [AH] Allow grid array toolbar button to edit existing arrays
- [Oz] Added setting to enable importing shapes to tool layers
- [AH] Show length units on Tab Size label
- [Oz] Updated max speed for gantry systems in material test to 2000 mm/sec
- [Oz] Added a camera type chooser for overhead / head mount cameras, to reduce confusion
- [Oz] Added job start / end delays for Ruida controllers, to allow time for exhaust to spin up/clear smoke
- [Oz] Improved handling of SVG text position and font attributes
- [JN] Added support for inline images in PDFs
- [Oz] Added support for CMYK images in PDF files
- [Oz] Handle DXF imports with extremely large position offsets
- [WP] Bugfix: handle non-UTF-8 object names in DXF import
- [Oz] Bugfix: Correct image orientation when exporting
- [WP] Bugfix: Use px as SVG import units if unspecified in document
- [Oz] Bugfix: Normal camera alignment properly overrides Head Camera setting
- [Oz] Bugfix: SVG defaults to "no stroke" on shapes, so LightBurn now does too
- [Oz] Bugfix: Don't auto-save while Bool helper or Align helper dialogs are open
- [Oz] Bugfix: Don't crash if using the LightBurn Bridge finder for unsupported devices
- [Oz] Bugfix: DTR setting was not respected for Marlin devices
- [Oz] Bugfix: Cut Shapes tool got incorrect results if a shape had nodes that crossed lines of the cutter
- [Oz] Bugfix: updated LinuxCNC profile to use M67 E0 Qxx command for laser power setting
- [Oz] Bugfix: Focus test could sometimes emit incorrect focus numbers for Z (rounding issue)
- [Oz] Bugfix: can now select between multiple Trocen (or other LibUSB) devices properly
- [AH] Bugfix: Closed single line beziers did not render correctly in filled mode.
