Files
Tiago Conceição e727a097b3 v3.8.1
- **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
2022-11-02 23:39:21 +00:00

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.
&#x0a;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>