mirror of
https://github.com/riegera2412/UVtools.git
synced 2026-07-08 17:42:31 +02:00
e727a097b3
- **Tools:**
- **PCB Exposure:**
- (Add) Allow to scale the drawing sizes per gerber file
- (Add) Allow to invert the drawing polarity per gerber file (#592)
- (Add) Allow to drag and drop files into "Add files" button and grid header
- (Improvement) Do not add empty layers when usable to draw or when draw a all black image
- (Improvement) "Merge all gerbers into one layer" will now draw all gerber into one image instead of perform the Max(of all gerbers pixels), allowing to subtract areas as they are on gerbers
- **Import layers:** Fix error when trying to insert layers
- **Export layers images:** Better compression of contours for SVG export, resulting in smooth curves, better visuals and lower file size
- (Add) Outline: Triangulate
- (Remove) Avalonia.Diagnostics dependency in release mode
426 lines
16 KiB
XML
426 lines
16 KiB
XML
<controls:WindowEx xmlns="https://github.com/avaloniaui"
|
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
|
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
|
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
|
xmlns:controls="clr-namespace:UVtools.WPF.Controls"
|
|
xmlns:i="clr-namespace:Projektanker.Icons.Avalonia;assembly=Projektanker.Icons.Avalonia"
|
|
mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"
|
|
x:Class="UVtools.WPF.Windows.ToolWindow"
|
|
SizeToContent="WidthAndHeight"
|
|
MinWidth="500"
|
|
MinHeight="400"
|
|
WindowStartupLocation="CenterOwner"
|
|
Title="Tool"
|
|
Icon="/Assets/Icons/UVtools.ico">
|
|
|
|
<Grid RowDefinitions="Auto,Auto,Auto,Auto,*,Auto">
|
|
|
|
<!-- Description -->
|
|
<Border Grid.Row="0"
|
|
Classes="BoxBackground"
|
|
Padding="10"
|
|
IsVisible="{Binding Description, Converter={x:Static StringConverters.IsNotNullOrEmpty}}">
|
|
<Expander
|
|
IsExpanded="{Binding Settings.Tools.ExpandDescriptions}"
|
|
HorizontalContentAlignment="Stretch"
|
|
Header="Description (Click to toggle)">
|
|
|
|
<TextBox Classes="TransparentReadOnlyMultiLineNoBorder"
|
|
MaxWidth="{Binding DescriptionMaxWidth}"
|
|
FontSize="16"
|
|
Margin="-10"
|
|
Watermark="Description:"
|
|
Padding="5"
|
|
Text="{Binding Description}"/>
|
|
|
|
</Expander>
|
|
</Border>
|
|
|
|
<!-- Layer Range -->
|
|
<Border Grid.Row="1"
|
|
Classes="GroupBox"
|
|
Margin="5"
|
|
IsVisible="{Binding LayerRangeVisible}">
|
|
|
|
<StackPanel Orientation="Vertical">
|
|
<Grid ColumnDefinitions="Auto,*" Classes="GroupBoxHeader">
|
|
<TextBlock
|
|
Padding="10" FontWeight="Bold"
|
|
VerticalAlignment="Center"
|
|
Text="Layer range selector"/>
|
|
<CheckBox
|
|
Grid.Column="1"
|
|
Padding="10"
|
|
FontWeight="Bold"
|
|
VerticalAlignment="Center"
|
|
HorizontalAlignment="Right"
|
|
IsChecked="{Binding LayerRangeSync}"
|
|
IsVisible="{Binding LayerIndexEndEnabled}"
|
|
ToolTip.Tip="Synchronize and lock the layer range for single layer navigation"
|
|
Content="Synchronize"/>
|
|
</Grid>
|
|
|
|
<Grid
|
|
RowDefinitions="Auto,5,Auto"
|
|
ColumnDefinitions="Auto,180,Auto,180,Auto"
|
|
Margin="15">
|
|
<TextBlock
|
|
Grid.Row="0"
|
|
Grid.Column="0"
|
|
VerticalAlignment="Center"
|
|
Text="From:"
|
|
Margin="0,0,10,0"/>
|
|
|
|
<NumericUpDown Grid.Row="0" Grid.Column="1"
|
|
Classes="ValueLabel ValueLabel_layers"
|
|
VerticalAlignment="Center"
|
|
Minimum="0"
|
|
Maximum="{Binding MaximumLayerIndex}"
|
|
Value="{Binding LayerIndexStart}"/>
|
|
|
|
<TextBlock
|
|
Grid.Row="0"
|
|
Grid.Column="2"
|
|
VerticalAlignment="Center"
|
|
Text="To:"
|
|
IsEnabled="{Binding !LayerRangeSync}"
|
|
Margin="20,0,10,0"/>
|
|
|
|
<NumericUpDown Grid.Row="0" Grid.Column="3"
|
|
Classes="ValueLabel ValueLabel_layers"
|
|
VerticalAlignment="Center"
|
|
Minimum="0"
|
|
Maximum="{Binding MaximumLayerIndex}"
|
|
Value="{Binding LayerIndexEnd}">
|
|
<NumericUpDown.IsEnabled>
|
|
<MultiBinding Converter="{x:Static BoolConverters.And}">
|
|
<Binding Path="LayerIndexEndEnabled"/>
|
|
<Binding Path="!LayerRangeSync"/>
|
|
</MultiBinding>
|
|
</NumericUpDown.IsEnabled>
|
|
</NumericUpDown>
|
|
|
|
<Button Name="LayerSelectPresetButton"
|
|
Grid.Row="0"
|
|
Grid.Column="4"
|
|
Margin="10,0,0,0"
|
|
VerticalAlignment="Stretch"
|
|
VerticalContentAlignment="Center"
|
|
Padding="10,0,10,0"
|
|
Content="Select ⮟"
|
|
Command="{Binding OpenContextMenu}"
|
|
CommandParameter="LayerSelectPreset">
|
|
<Button.ContextMenu>
|
|
<ContextMenu Name="LayerSelectPresetContextMenu" PlacementMode="Bottom">
|
|
<MenuItem
|
|
Header="_All layers"
|
|
HotKey="Ctrl + Shift + A" InputGesture="Ctrl + Shift + A"
|
|
Command="{Binding SelectAllLayers}"/>
|
|
|
|
<MenuItem
|
|
Header="_Current layer"
|
|
HotKey="Ctrl + Shift + C" InputGesture="Ctrl + Shift + C"
|
|
Command="{Binding SelectCurrentLayer}"/>
|
|
|
|
<Separator />
|
|
|
|
<MenuItem
|
|
Header="From first to current layer"
|
|
HotKey="Ctrl + Alt + F" InputGesture="Ctrl + Alt + F"
|
|
Command="{Binding SelectFirstToCurrentLayer}"/>
|
|
|
|
<MenuItem
|
|
Header="From current to last layer"
|
|
HotKey="Ctrl + Alt + L" InputGesture="Ctrl + Alt + L"
|
|
Command="{Binding SelectCurrentToLastLayer}"/>
|
|
|
|
<Separator />
|
|
|
|
<MenuItem
|
|
Header="_Bottom layers"
|
|
HotKey="Ctrl + Shift + B" InputGesture="Ctrl + Shift + B"
|
|
Command="{Binding SelectBottomLayers}"/>
|
|
|
|
<MenuItem
|
|
Header="_Normal layers"
|
|
HotKey="Ctrl + Shift + N" InputGesture="Ctrl + Shift + N"
|
|
Command="{Binding SelectNormalLayers}"/>
|
|
|
|
<Separator />
|
|
|
|
<MenuItem
|
|
Header="_First layer"
|
|
HotKey="Ctrl + Shift + F" InputGesture="Ctrl + Shift + F"
|
|
Command="{Binding SelectFirstLayer}"/>
|
|
|
|
<MenuItem
|
|
Header="_Last layer"
|
|
HotKey="Ctrl + Shift + L" InputGesture="Ctrl + Shift + L"
|
|
Command="{Binding SelectLastLayer}"/>
|
|
|
|
</ContextMenu>
|
|
</Button.ContextMenu>
|
|
</Button>
|
|
|
|
<TextBlock
|
|
Grid.Row="2" Grid.Column="1"
|
|
HorizontalAlignment="Center"
|
|
Text="{Binding LayerStartMM, StringFormat=({0:F3}mm)}" />
|
|
|
|
<TextBlock
|
|
Grid.Row="2" Grid.Column="3"
|
|
HorizontalAlignment="Center"
|
|
Text="{Binding LayerEndMM, StringFormat=({0:F3}mm)}" />
|
|
|
|
<TextBlock
|
|
Grid.Row="2" Grid.Column="4"
|
|
Margin="10,0,0,0"
|
|
HorizontalAlignment="Center"
|
|
Text="{Binding LayerRangeCountStr}" />
|
|
|
|
</Grid>
|
|
</StackPanel>
|
|
|
|
</Border>
|
|
|
|
<!-- ROI -->
|
|
<Border Grid.Row="2" Classes="GroupBox"
|
|
Margin="5"
|
|
IsVisible="{Binding IsROIOrMasksVisible}">
|
|
|
|
<StackPanel Orientation="Vertical">
|
|
|
|
<Grid ColumnDefinitions="Auto,*" Classes="GroupBoxHeader">
|
|
<TextBlock
|
|
Padding="10" FontWeight="Bold"
|
|
VerticalAlignment="Center"
|
|
Text="Region of interest (ROI) and Masks" />
|
|
|
|
<StackPanel Orientation="Horizontal"
|
|
Grid.Column="1"
|
|
HorizontalAlignment="Right"
|
|
Spacing="1">
|
|
<Button
|
|
VerticalAlignment="Center"
|
|
Content="Clear ROI"
|
|
IsVisible="{Binding IsROIVisible}"
|
|
Command="{Binding ClearROI}"/>
|
|
<Button
|
|
VerticalAlignment="Center"
|
|
Content="{Binding Masks.Length, StringFormat=Clear {0} mask(s)}"
|
|
IsVisible="{Binding IsMasksVisible}"
|
|
Command="{Binding ClearMasks}"/>
|
|
|
|
</StackPanel>
|
|
|
|
</Grid>
|
|
|
|
<StackPanel Margin="15" Spacing="5">
|
|
<TextBlock VerticalAlignment="Center"
|
|
IsVisible="{Binding IsROIVisible}"
|
|
Text="{Binding ROI, StringFormat=Region: {0}}" />
|
|
|
|
<CheckBox
|
|
Content="Clear ROI and Masks after perform the operation"
|
|
IsChecked="{Binding ClearROIAndMaskAfterOperation}"/>
|
|
|
|
</StackPanel>
|
|
</StackPanel>
|
|
|
|
|
|
</Border>
|
|
|
|
<!-- Profiles -->
|
|
<Border
|
|
Grid.Row="3" Classes="GroupBox"
|
|
Margin="5"
|
|
IsVisible="{Binding IsProfilesVisible}">
|
|
|
|
<StackPanel Orientation="Vertical">
|
|
<Grid ColumnDefinitions="Auto,*" Classes="GroupBoxHeader">
|
|
<TextBlock Grid.Row="0" Grid.Column="0"
|
|
Padding="10" FontWeight="Bold"
|
|
VerticalAlignment="Center"
|
|
Text="{Binding Profiles.Count, StringFormat=Profiles: {0}}" />
|
|
|
|
<Button Grid.Row="0" Grid.Column="1"
|
|
VerticalAlignment="Center"
|
|
HorizontalAlignment="Right"
|
|
ToolTip.Tip="Clear all profiles"
|
|
IsEnabled="{Binding Profiles.Count}"
|
|
Command="{Binding ClearProfiles}"
|
|
i:Attached.Icon="fa-solid fa-xmark">
|
|
</Button>
|
|
|
|
|
|
</Grid>
|
|
|
|
<Grid RowDefinitions="Auto,Auto"
|
|
ColumnDefinitions="*,5,Auto,5,Auto,5,Auto"
|
|
Margin="15">
|
|
|
|
<ComboBox
|
|
Name="ProfileComboBox"
|
|
Margin="0,0,0,10"
|
|
IsEnabled="{Binding Profiles.Count}"
|
|
IsVisible="{Binding Profiles.Count}"
|
|
SelectedItem="{Binding SelectedProfileItem}"
|
|
HorizontalAlignment="Stretch"
|
|
Items="{Binding Profiles}"
|
|
Width="{Binding ProfileBoxMaxWidth}"/>
|
|
|
|
<Button
|
|
Grid.Row="0"
|
|
Grid.Column="2"
|
|
Margin="0,0,0,10"
|
|
VerticalAlignment="Stretch"
|
|
ToolTip.Tip="Deselect the current profile"
|
|
IsEnabled="{Binding SelectedProfileItem, Converter={x:Static ObjectConverters.IsNotNull}}"
|
|
IsVisible="{Binding Profiles.Count}"
|
|
Command="{Binding DeselectProfile}"
|
|
i:Attached.Icon="fa-regular fa-square"/>
|
|
|
|
<Button
|
|
Grid.Row="0"
|
|
Grid.Column="4"
|
|
Margin="0,0,0,10"
|
|
VerticalAlignment="Stretch"
|
|
FontWeight="Bold"
|
|
ToolTip.Tip="Set the selected profile as default to load in with this dialog.
|
|

Shift + click to clear the default profile."
|
|
IsEnabled="{Binding SelectedProfileItem, Converter={x:Static ObjectConverters.IsNotNull}}"
|
|
IsVisible="{Binding Profiles.Count}"
|
|
Command="{Binding SetDefaultProfile}"
|
|
Content="D"/>
|
|
|
|
<Button
|
|
Grid.Row="0"
|
|
Grid.Column="6"
|
|
Margin="0,0,0,10"
|
|
VerticalAlignment="Stretch"
|
|
ToolTip.Tip="Remove the selected profile"
|
|
IsEnabled="{Binding SelectedProfileItem, Converter={x:Static ObjectConverters.IsNotNull}}"
|
|
IsVisible="{Binding Profiles.Count}"
|
|
Command="{Binding RemoveSelectedProfile}"
|
|
i:Attached.Icon="fa-solid fa-trash-alt"/>
|
|
|
|
|
|
<TextBox
|
|
Name="ProfileName"
|
|
Grid.Row="1"
|
|
Grid.Column="0"
|
|
IsEnabled="{Binding ButtonOkEnabled}"
|
|
Text="{Binding ProfileText}"
|
|
Watermark="Profile name or leave empty for auto name"
|
|
Width="{Binding ProfileBoxMaxWidth}"/>
|
|
|
|
<Button Grid.Row="1" Grid.Column="2"
|
|
VerticalAlignment="Stretch"
|
|
ToolTip.Tip="Add a new profile with the current set values"
|
|
IsEnabled="{Binding ButtonOkEnabled}"
|
|
Command="{Binding AddProfile}"
|
|
i:Attached.Icon="fa-solid fa-plus"/>
|
|
|
|
</Grid>
|
|
|
|
</StackPanel>
|
|
|
|
</Border>
|
|
|
|
<!-- Content -->
|
|
<Border Grid.Row="4"
|
|
Classes="GroupBox"
|
|
IsVisible="{Binding IsContentVisible}"
|
|
Margin="5">
|
|
|
|
<Grid RowDefinitions="Auto,*">
|
|
<TextBlock Classes="GroupBoxHeader"
|
|
Text="{Binding Title}"/>
|
|
|
|
<ScrollViewer Grid.Row="1"
|
|
Name="ContentScrollViewer"
|
|
VerticalScrollBarVisibility="Auto"
|
|
HorizontalScrollBarVisibility="Auto"
|
|
Content="{Binding ContentControl}"/>
|
|
</Grid>
|
|
</Border>
|
|
|
|
<!-- Actions -->
|
|
<Border Grid.Row="5" Classes="FooterActions">
|
|
<Grid RowDefinitions="Auto"
|
|
ColumnDefinitions="*">
|
|
<StackPanel Spacing="10" Orientation="Horizontal">
|
|
<Button Command="{Binding #OptionsContextMenu.Open}"
|
|
Padding="10"
|
|
Content="☰">
|
|
<Button.ContextMenu>
|
|
<ContextMenu Name="OptionsContextMenu" PlacementMode="Top">
|
|
<MenuItem IsVisible="{Binding CanROI}"
|
|
Command="{Binding SelectVolumeBoundingRectangle}"
|
|
Header="Select print volume ROI"
|
|
i:MenuItem.Icon="fa-solid fa-expand"/>
|
|
|
|
<Separator IsVisible="{Binding CanROI}"/>
|
|
|
|
<MenuItem IsVisible="{Binding CanHaveProfiles}"
|
|
Command="{Binding ImportSettings}"
|
|
Header="Import settings"
|
|
i:MenuItem.Icon="fa-solid fa-file-import"/>
|
|
|
|
|
|
<MenuItem
|
|
Command="{Binding ExportSettings}"
|
|
Header="Export settings"
|
|
i:MenuItem.Icon="fa-solid fa-file-export"/>
|
|
|
|
<Separator IsVisible="{Binding CanHaveProfiles}"/>
|
|
|
|
<MenuItem Command="{Binding ResetToDefaults}"
|
|
Header="Reset to defaults"
|
|
i:MenuItem.Icon="fa-solid fa-undo-alt"/>
|
|
</ContextMenu>
|
|
</Button.ContextMenu>
|
|
</Button>
|
|
|
|
<controls:ButtonWithIcon Padding="10"
|
|
IsDefault="True"
|
|
IsVisible="{Binding IsButton1Visible}"
|
|
Icon="fa-solid fa-undo-alt"
|
|
Text="{Binding Button1Text}"
|
|
Command="{Binding OnButton1Click}">
|
|
</controls:ButtonWithIcon>
|
|
|
|
<CheckBox
|
|
IsChecked="{Binding IsCheckBox1Checked}"
|
|
IsVisible="{Binding IsCheckBox1Visible}"
|
|
Content="{Binding CheckBox1Text}"/>
|
|
</StackPanel>
|
|
|
|
<StackPanel
|
|
Spacing="10"
|
|
HorizontalAlignment="Right"
|
|
Orientation="Horizontal">
|
|
|
|
<controls:ButtonWithIcon Padding="10"
|
|
IsDefault="True"
|
|
IsVisible="{Binding ButtonOkVisible}"
|
|
IsEnabled="{Binding ButtonOkEnabled}"
|
|
Icon="fa-solid fa-check"
|
|
Text="{Binding ButtonOkText}"
|
|
Command="{Binding Process}">
|
|
</controls:ButtonWithIcon>
|
|
|
|
<controls:ButtonWithIcon Padding="10"
|
|
IsCancel="True"
|
|
Icon="fa-solid fa-sign-out-alt"
|
|
Text="Cancel"
|
|
Command="{Binding Close}"/>
|
|
</StackPanel>
|
|
|
|
</Grid>
|
|
</Border>
|
|
|
|
</Grid>
|
|
|
|
</controls:WindowEx>
|