mirror of
https://github.com/riegera2412/UVtools.git
synced 2026-07-09 01:52:32 +02:00
67fbec1fff
- **PCB Exposure:** - (Fix) Able to omit X or Y coordinate and use last known value in place - (Fix) Reusing macros in apertures was causing to use the last aperture values for all previous apertures that share the same macro name - (Fix) Implement the inch measurement (%MOIN*%) - (Fix) Crash when redo the operation (Ctrl + Shift + Z) - **UI - Issue list:** - (Add) Context menu when right click issues to select an action - (Add) Option to solidify suction cups when right click on the issue - (Improvement) Better confirmation text when click on remove issue(s) with detailed list of actions
2138 lines
76 KiB
XML
2138 lines
76 KiB
XML
<uc: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:uc="clr-namespace:UVtools.WPF.Controls"
|
|
xmlns:uvtava="clr-namespace:UVtools.AvaloniaControls;assembly=UVtools.AvaloniaControls"
|
|
xmlns:i="clr-namespace:Projektanker.Icons.Avalonia;assembly=Projektanker.Icons.Avalonia"
|
|
mc:Ignorable="d" d:DesignWidth="1024" d:DesignHeight="600"
|
|
x:Class="UVtools.WPF.MainWindow"
|
|
Title="UVtools"
|
|
Icon="/Assets/Icons/UVtools.ico"
|
|
MinWidth="1024"
|
|
MinHeight="600"
|
|
DragDrop.AllowDrop="True">
|
|
|
|
<Grid RowDefinitions="*" ColumnDefinitions="*">
|
|
<DockPanel Grid.Row="0" Grid.Column="0" IsEnabled="{Binding IsGUIEnabled}">
|
|
<Menu DockPanel.Dock="Top">
|
|
<MenuItem Name="MainMenu.File" Header="_File">
|
|
<MenuItem Name="MainMenu.File.Open"
|
|
Header="_Open"
|
|
HotKey="Ctrl+O" InputGesture="Ctrl+O"
|
|
Command="{Binding MenuFileOpenClicked}"
|
|
i:MenuItem.Icon="fa-solid fa-file-import"/>
|
|
|
|
<MenuItem Name="MainMenu.File.OpenNewWindow"
|
|
Header="Open in _new window"
|
|
HotKey="Ctrl+Shift+O" InputGesture="Ctrl+Shift+O"
|
|
Command="{Binding MenuFileOpenNewWindowClicked}"
|
|
i:MenuItem.Icon="fa-solid fa-file-import"/>
|
|
|
|
<MenuItem Name="MainMenu.File.OpenRecent"
|
|
Header="Open recent"
|
|
ToolTip.ShowDelay="2000"
|
|
ToolTip.Tip="On a file:
|
|

Shift + Click: Open file in a new window
|
|

Shift + Ctrl + Click: Remove file from list
|
|

Ctrl + Click: Purge non-existing files"
|
|
Items="{Binding MenuFileOpenRecentItems}"
|
|
i:MenuItem.Icon="fa-solid fa-file-import"/>
|
|
|
|
<MenuItem Name="MainMenu.File.OpenInPartialMode"
|
|
Header="Open in partial mode"
|
|
Command="{Binding MenuFileOpenInPartialModeClicked}"
|
|
ToolTip.Tip="Open a file only to see and/or edit properties.
|
|

Layer images won't be loaded and most tools won't run in this mode."
|
|
i:MenuItem.Icon="fa-solid fa-file-import"/>
|
|
|
|
<MenuItem Name="MainMenu.File.Reload"
|
|
Header="_Reload"
|
|
HotKey="Ctrl+F5" InputGesture="Ctrl+F5"
|
|
IsEnabled="{Binding IsFileLoaded}"
|
|
Command="{Binding ReloadFile}"
|
|
i:MenuItem.Icon="mdi-file-restore"/>
|
|
|
|
<MenuItem Name="MainMenu.File.Save"
|
|
Header="_Save"
|
|
HotKey="Ctrl+S" InputGesture="Ctrl+S"
|
|
IsEnabled="{Binding CanSave}"
|
|
Command="{Binding MenuFileSaveClicked}"
|
|
i:MenuItem.Icon="fa-solid fa-floppy-disk"/>
|
|
|
|
<MenuItem Name="MainMenu.File.SaveAs"
|
|
Header="Save _as"
|
|
HotKey="Ctrl+Shift+S" InputGesture="Ctrl+Shift+S"
|
|
IsEnabled="{Binding IsFileLoaded}"
|
|
Command="{Binding MenuFileSaveAsClicked}"
|
|
i:MenuItem.Icon="fa-solid fa-floppy-disk"/>
|
|
|
|
<MenuItem Name="MainMenu.File.SendTo"
|
|
Header="Send to"
|
|
IsEnabled="{Binding IsFileLoaded}"
|
|
Items="{Binding MenuFileSendToItems}"
|
|
i:MenuItem.Icon="fa-solid fa-share-square"/>
|
|
|
|
<MenuItem Name="MainMenu.File.Close"
|
|
Header="_Close"
|
|
HotKey="Ctrl+W" InputGesture="Ctrl+W"
|
|
IsEnabled="{Binding IsFileLoaded}"
|
|
Command="{Binding OnMenuFileCloseFile}"
|
|
i:MenuItem.Icon="fa-solid fa-sign-out-alt"/>
|
|
|
|
<Separator/>
|
|
|
|
<MenuItem Header="I _printed this file" HotKey="Ctrl+P" InputGesture="Ctrl+P"
|
|
IsEnabled="{Binding IsFileLoaded}"
|
|
Command="{Binding IPrintedThisFile}"
|
|
i:MenuItem.Icon="fa-solid fa-flask"/>
|
|
|
|
<MenuItem Name="MainMenu.File.OpenContainingFileFolder"
|
|
Header="Open containing fo_lder"
|
|
HotKey="Ctrl+Shift+L" InputGesture="Ctrl+Shift+L"
|
|
IsEnabled="{Binding IsFileLoaded}"
|
|
Command="{Binding MenuFileOpenContainingFolderClicked}"
|
|
i:MenuItem.Icon="fa-solid fa-folder-open"/>
|
|
|
|
<MenuItem Name="MainMenu.File.Extract"
|
|
Header="_Extract file contents" HotKey="Ctrl+E" InputGesture="Ctrl+E"
|
|
IsEnabled="{Binding IsFileLoaded}"
|
|
Command="{Binding ExtractFile}"
|
|
i:MenuItem.Icon="fa-solid fa-box-open"/>
|
|
|
|
<MenuItem Name="MainMenu.File.Terminal"
|
|
HotKey="Ctrl+Shift+T" InputGesture="Ctrl+Shift+T"
|
|
Header="_Terminal"
|
|
Command="{Binding OpenTerminal}"
|
|
IsEnabled="{Binding IsFileLoaded}"
|
|
i:MenuItem.Icon="fa-solid fa-terminal"/>
|
|
|
|
|
|
<MenuItem Name="MainMenu.File.Convert"
|
|
Header="_Convert to"
|
|
IsEnabled="{Binding IsFileLoaded}"
|
|
IsVisible="{Binding MenuFileConvertItems, Converter={x:Static ObjectConverters.IsNotNull}}"
|
|
Items="{Binding MenuFileConvertItems}"
|
|
i:MenuItem.Icon="fa-solid fa-exchange-alt"/>
|
|
|
|
<Separator/>
|
|
|
|
<MenuItem Name="MainMenu.File.Fullscreen"
|
|
Header="_Fullscreen"
|
|
InputGesture="F11" HotKey="F11"
|
|
Command="{Binding OnMenuFileFullscreen}"
|
|
i:MenuItem.Icon="fa-solid fa-window-maximize"/>
|
|
|
|
<MenuItem Name="MainMenu.File.Settings"
|
|
Header="_Settings"
|
|
InputGesture="F12" HotKey="F12"
|
|
Command="{Binding MenuFileSettingsClicked}"
|
|
i:MenuItem.Icon="fa-solid fa-cog"/>
|
|
|
|
<Separator/>
|
|
|
|
<MenuItem Name="MainMenu.File.Exit"
|
|
Header="_Exit"
|
|
InputGesture="Alt+F4"
|
|
Command="{Binding Close}"
|
|
i:MenuItem.Icon="fa-solid fa-door-open"/>
|
|
</MenuItem>
|
|
|
|
<MenuItem Header="_Tools"
|
|
IsVisible="{Binding IsFileLoaded}"
|
|
IsEnabled="{Binding IsFileLoaded}"
|
|
Items="{Binding MenuTools}">
|
|
</MenuItem>
|
|
|
|
<MenuItem Header="_Calibration"
|
|
IsVisible="{Binding IsFileLoaded}"
|
|
IsEnabled="{Binding IsFileLoaded}"
|
|
Items="{Binding MenuCalibration}">
|
|
</MenuItem>
|
|
|
|
|
|
<MenuItem Header="_Help">
|
|
<MenuItem Header="_About"
|
|
InputGesture="F1" HotKey="F1"
|
|
Command="{Binding MenuHelpAboutClicked}"
|
|
i:MenuItem.Icon="fa-solid fa-info-circle"/>
|
|
|
|
<MenuItem Header="_Website"
|
|
InputGesture="Ctrl + F1" HotKey="Ctrl + F1"
|
|
Command="{Binding OpenHomePage}"
|
|
i:MenuItem.Icon="fa-brands fa-edge"/>
|
|
|
|
<MenuItem Header="Wi_ki & tutorials"
|
|
Command="{Binding OpenWebsite}"
|
|
CommandParameter="https://github.com/sn4k3/UVtools/wiki"
|
|
i:MenuItem.Icon="fa-brands fa-wikipedia-w"/>
|
|
|
|
<MenuItem Header="_Facebook group"
|
|
Command="{Binding OpenWebsite}"
|
|
CommandParameter="https://www.facebook.com/groups/uvtools"
|
|
i:MenuItem.Icon="fa-brands fa-facebook"/>
|
|
|
|
<MenuItem Header="_Donate"
|
|
Command="{Binding OpenDonateWebsite}"
|
|
i:MenuItem.Icon="fa-solid fa-donate"/>
|
|
|
|
<MenuItem Header="_Sponsor"
|
|
Command="{Binding OpenWebsite}"
|
|
CommandParameter="https://github.com/sponsors/sn4k3"
|
|
i:MenuItem.Icon="fa-solid fa-heart"/>
|
|
|
|
<Separator/>
|
|
|
|
<MenuItem Header="_Material manager"
|
|
HotKey="F10"
|
|
InputGesture="F10"
|
|
Command="{Binding MenuHelpMaterialManagerClicked}"
|
|
i:MenuItem.Icon="fa-solid fa-flask"/>
|
|
|
|
<MenuItem Header="_Install profiles into PrusaSlicer"
|
|
Command="{Binding MenuHelpInstallProfilesClicked}"
|
|
i:MenuItem.Icon="fa-solid fa-list"/>
|
|
|
|
<Separator/>
|
|
|
|
<MenuItem Header="_Benchmark"
|
|
Command="{Binding MenuHelpBenchmarkClicked}"
|
|
i:MenuItem.Icon="fa-solid fa-microchip"/>
|
|
|
|
<Separator/>
|
|
|
|
<MenuItem Header="_Open settings folder"
|
|
Command="{Binding MenuHelpOpenSettingsFolderClicked}"
|
|
i:MenuItem.Icon="fa-solid fa-folder-open"/>
|
|
|
|
<Separator/>
|
|
|
|
<MenuItem Header="_Report a issue"
|
|
Command="{Binding OpenWebsite}"
|
|
CommandParameter="https://github.com/sn4k3/UVtools/issues/new?assignees=sn4k3&labels=&template=bug_report.md&title=%5BBUG%5D+"
|
|
i:MenuItem.Icon="fa-solid fa-bug"/>
|
|
|
|
<MenuItem Header="Ask a _question"
|
|
Command="{Binding OpenWebsite}"
|
|
CommandParameter="https://github.com/sn4k3/UVtools/discussions/categories/q-a"
|
|
i:MenuItem.Icon="fa-solid fa-question"/>
|
|
|
|
<MenuItem Header="Suggest an improvement or new features"
|
|
Command="{Binding OpenWebsite}"
|
|
CommandParameter="https://github.com/sn4k3/UVtools/discussions/categories/ideas"
|
|
i:MenuItem.Icon="fa-solid fa-lightbulb"/>
|
|
|
|
</MenuItem>
|
|
|
|
<MenuItem Background="LimeGreen"
|
|
IsVisible="{Binding VersionChecker.HaveNewVersion}"
|
|
Header="{Binding VersionChecker.VersionAnnouncementText}"
|
|
Command="{Binding MenuNewVersionClicked}">
|
|
</MenuItem>
|
|
|
|
</Menu>
|
|
|
|
<Border Padding="5" DockPanel.Dock="Bottom" IsVisible="{Binding IsFileLoaded}">
|
|
<WrapPanel
|
|
Orientation="Horizontal"
|
|
VerticalAlignment="Center">
|
|
<TextBlock Text="{Binding SlicerFile.LayerHeight, StringFormat=Layer height: {0}mm}"/>
|
|
|
|
<TextBlock IsVisible="{Binding SlicerFile.CanUseBottomLayerCount}" Text=" | "/>
|
|
<TextBlock IsVisible="{Binding SlicerFile.CanUseBottomLayerCount}"
|
|
Text="{Binding SlicerFile.BottomLayerCount, StringFormat=Bottom layers: {0}}"/>
|
|
|
|
<TextBlock IsVisible="{Binding SlicerFile.CanUseAnyExposureTime}" Text=" | "/>
|
|
<TextBlock IsVisible="{Binding SlicerFile.CanUseAnyExposureTime}"
|
|
Text="{Binding SlicerFile.ExposureRepresentation, StringFormat=Exposure: {0}}"/>
|
|
|
|
<TextBlock IsVisible="{Binding SlicerFile.CanUseAnyLiftHeight}" Text=" | "/>
|
|
<TextBlock IsVisible="{Binding SlicerFile.CanUseAnyLiftHeight}"
|
|
Text="{Binding SlicerFile.LiftRepresentation, StringFormat=Lift: {0}}"/>
|
|
|
|
|
|
<TextBlock IsVisible="{Binding SlicerFile.CanUseRetractSpeed}" Text=" | "/>
|
|
<TextBlock IsVisible="{Binding SlicerFile.CanUseRetractSpeed}"
|
|
Text="{Binding SlicerFile.RetractRepresentation, StringFormat=Retract: {0}}"/>
|
|
|
|
<TextBlock IsVisible="{Binding SlicerFile.CanUseAnyLightOffDelay}" Text=" | "/>
|
|
<TextBlock IsVisible="{Binding SlicerFile.CanUseAnyLightOffDelay}"
|
|
Text="{Binding SlicerFile.LightOffDelayRepresentation, StringFormat=Light-off: {0}}"/>
|
|
|
|
<TextBlock IsVisible="{Binding SlicerFile.CanUseAnyWaitTime}" Text=" | "/>
|
|
<TextBlock IsVisible="{Binding SlicerFile.CanUseAnyWaitTime}"
|
|
ToolTip.Tip="Wait time: Before cure / After cure / After lift"
|
|
Text="{Binding SlicerFile.WaitTimeRepresentation, StringFormat=Wait time: {0}}"/>
|
|
|
|
<TextBlock IsVisible="{Binding SlicerFile.PrintTimeHours}" Text=" | "/>
|
|
<TextBlock IsVisible="{Binding SlicerFile.PrintTimeHours}"
|
|
Text="{Binding SlicerFile.PrintTimeString, StringFormat=Print time: {0}}"/>
|
|
|
|
|
|
<TextBlock IsVisible="{Binding SlicerFile.MaterialMilliliters}" Text=" | "/>
|
|
<TextBlock IsVisible="{Binding SlicerFile.MaterialMilliliters}"
|
|
Text="{Binding SlicerFile.MaterialMilliliters, StringFormat=Used material: {0}ml}"/>
|
|
|
|
|
|
<TextBlock IsVisible="{Binding SlicerFile.MaterialCost}" Text=" | "/>
|
|
<TextBlock IsVisible="{Binding SlicerFile.MaterialCost}" Text="{Binding SlicerFile.MaterialCost, StringFormat=Material cost: {0}€}"/>
|
|
|
|
|
|
<TextBlock IsVisible="{Binding SlicerFile.MaterialName, Converter={x:Static StringConverters.IsNotNullOrEmpty}}"
|
|
Text=" | "/>
|
|
<TextBlock IsVisible="{Binding SlicerFile.MaterialName, Converter={x:Static StringConverters.IsNotNullOrEmpty}}"
|
|
Text="{Binding SlicerFile.MaterialName, StringFormat=Material: {0}}"/>
|
|
|
|
|
|
<TextBlock IsVisible="{Binding SlicerFile.MachineName, Converter={x:Static StringConverters.IsNotNullOrEmpty}}"
|
|
Text=" | "/>
|
|
<TextBlock IsVisible="{Binding SlicerFile.MachineName, Converter={x:Static StringConverters.IsNotNullOrEmpty}}"
|
|
Text="{Binding SlicerFile.MachineName, StringFormat=Machine: {0}}"/>
|
|
</WrapPanel>
|
|
</Border>
|
|
|
|
<TabControl
|
|
DockPanel.Dock="Left"
|
|
Width="400"
|
|
SelectedItem="{Binding SelectedTabItem}">
|
|
<TabControl.Styles>
|
|
<Style Selector="TabItem">
|
|
<Setter Property="FontSize" Value="32"/>
|
|
</Style>
|
|
</TabControl.Styles>
|
|
<TabItem
|
|
Name="TabInformation"
|
|
ToolTip.Tip="Information"
|
|
IsEnabled="{Binding IsFileLoaded}">
|
|
<TabItem.Header>
|
|
<StackPanel VerticalAlignment="Center" Orientation="Horizontal">
|
|
<i:Icon Value="fa-solid fa-info-circle"/>
|
|
<!--<TextBlock Margin="5,0,0,0">Information</TextBlock>!-->
|
|
</StackPanel>
|
|
</TabItem.Header>
|
|
|
|
<Grid ColumnDefinitions="*" IsVisible="{Binding IsFileLoaded}">
|
|
<Grid.RowDefinitions>
|
|
<RowDefinition Height="Auto"/>
|
|
<RowDefinition Height="Auto" MaxHeight="400"/>
|
|
<RowDefinition Height="Auto"/>
|
|
<RowDefinition Height="Auto"/>
|
|
<RowDefinition Height="*" MinHeight="200"/>
|
|
<RowDefinition Height="Auto"/>
|
|
<RowDefinition Height="Auto" MinHeight="220"/>
|
|
</Grid.RowDefinitions>
|
|
<!-- Thumbnails -->
|
|
<StackPanel Grid.Row="0"
|
|
IsVisible="{Binding SlicerFile.CreatedThumbnailsCount}"
|
|
Orientation="Horizontal"
|
|
Spacing="5"
|
|
VerticalAlignment="Center">
|
|
<Button IsEnabled="{Binding ThumbnailCanGoPrevious}"
|
|
i:Attached.Icon="fa-solid fa-caret-left"
|
|
Command="{Binding ThumbnailGoPrevious}"/>
|
|
|
|
<TextBlock VerticalAlignment="Center">
|
|
<TextBlock.Text>
|
|
<MultiBinding StringFormat="{}{0}/{1}">
|
|
<Binding Path="VisibleThumbnailIndex"/>
|
|
<Binding Path="SlicerFile.CreatedThumbnailsCount"/>
|
|
</MultiBinding>
|
|
</TextBlock.Text>
|
|
</TextBlock>
|
|
|
|
<Button IsEnabled="{Binding ThumbnailCanGoNext}"
|
|
i:Attached.Icon="fa-solid fa-caret-right"
|
|
Command="{Binding ThumbnailGoNext}"/>
|
|
|
|
</StackPanel>
|
|
|
|
<StackPanel Grid.Row="0"
|
|
IsVisible="{Binding SlicerFile.CreatedThumbnailsCount}"
|
|
Orientation="Horizontal"
|
|
Spacing="2"
|
|
HorizontalAlignment="Right"
|
|
VerticalAlignment="Center">
|
|
<TextBlock VerticalAlignment="Center"
|
|
Text="{Binding VisibleThumbnailResolution}"/>
|
|
|
|
<Button IsEnabled="{Binding VisibleThumbnailIndex}"
|
|
ToolTip.Tip="Replace the current preview image"
|
|
i:Attached.Icon="fa-solid fa-file-image"
|
|
Command="{Binding OnClickThumbnailImport}"/>
|
|
|
|
<Button IsEnabled="{Binding VisibleThumbnailIndex}"
|
|
ToolTip.Tip="Save thumbnail image to a file"
|
|
i:Attached.Icon="fa-solid fa-floppy-disk"
|
|
Command="{Binding OnClickThumbnailSave}"/>
|
|
|
|
</StackPanel>
|
|
|
|
<!-- Preview image -->
|
|
<Image Grid.Row="1"
|
|
IsVisible="{Binding SlicerFile.CreatedThumbnailsCount}"
|
|
Stretch="Uniform"
|
|
Source="{Binding VisibleThumbnailImage}"/>
|
|
|
|
<GridSplitter Grid.Row="2" ResizeDirection="Rows" ResizeBehavior="PreviousAndNext" Height="5"/>
|
|
|
|
<!-- Properties -->
|
|
<StackPanel
|
|
IsVisible="{Binding SlicerProperties.Count}"
|
|
Grid.Row="3"
|
|
Orientation="Horizontal"
|
|
Spacing="5"
|
|
VerticalAlignment="Center">
|
|
|
|
<TextBlock
|
|
VerticalAlignment="Center"
|
|
Text="{Binding SlicerProperties.Count, StringFormat=Properties: {0}}"/>
|
|
|
|
<TextBlock VerticalAlignment="Center" Text="|"/>
|
|
|
|
<TextBlock
|
|
VerticalAlignment="Center"
|
|
Text="{Binding SlicerFile.Configs.Length, StringFormat=Groups: {0}}"/>
|
|
|
|
</StackPanel>
|
|
|
|
<StackPanel
|
|
IsVisible="{Binding SlicerProperties.Count}"
|
|
Grid.Row="3"
|
|
Orientation="Horizontal"
|
|
Spacing="2"
|
|
HorizontalAlignment="Right"
|
|
VerticalAlignment="Center">
|
|
|
|
<uc:ButtonWithIcon
|
|
Name="PropertiesSaveButton"
|
|
IsEnabled="{Binding SlicerFile.CreatedThumbnailsCount}"
|
|
ToolTip.Tip="Save properties to a file or clipboard"
|
|
Icon="fa-solid fa-floppy-disk"
|
|
Spacing="3"
|
|
Text="⮟"
|
|
Command="{Binding OpenContextMenu}"
|
|
CommandParameter="PropertiesSave">
|
|
<uc:ButtonWithIcon.ContextMenu>
|
|
<ContextMenu Name="PropertiesSaveContextMenu" PlacementMode="Bottom">
|
|
<MenuItem
|
|
Command="{Binding OnClickPropertiesSaveFile}"
|
|
Header="To File"
|
|
i:MenuItem.Icon="fa-regular fa-floppy-disk"/>
|
|
|
|
<MenuItem
|
|
Command="{Binding OnClickPropertiesSaveClipboard}"
|
|
Header="To Clipboard"
|
|
i:MenuItem.Icon="fa-regular fa-clipboard"/>
|
|
|
|
</ContextMenu>
|
|
</uc:ButtonWithIcon.ContextMenu>
|
|
</uc:ButtonWithIcon>
|
|
|
|
</StackPanel>
|
|
|
|
<DataGrid IsVisible="{Binding SlicerProperties.Count}"
|
|
Name="PropertiesGrid"
|
|
Grid.Row="4"
|
|
CanUserReorderColumns="True"
|
|
CanUserResizeColumns="True"
|
|
CanUserSortColumns="True"
|
|
GridLinesVisibility="Horizontal"
|
|
IsReadOnly="True"
|
|
SelectionMode="Extended"
|
|
ClipboardCopyMode="IncludeHeader"
|
|
Items="{Binding SlicerProperties}">
|
|
<DataGrid.Columns>
|
|
<DataGridTextColumn Header="Name"
|
|
Binding="{Binding Name}"
|
|
Width="Auto" />
|
|
<DataGridTextColumn Header="Value"
|
|
Binding="{Binding Value}"
|
|
Width="Auto" />
|
|
<DataGridTextColumn Header="Group"
|
|
Binding="{Binding Group}"
|
|
Width="Auto" />
|
|
</DataGrid.Columns>
|
|
|
|
</DataGrid>
|
|
|
|
<GridSplitter Grid.Row="5" ResizeDirection="Rows" ResizeBehavior="PreviousAndNext"/>
|
|
|
|
<TextBlock Grid.Row="5"
|
|
Text="Layer data"
|
|
ToolTip.Tip="Shows the properties for the current selected layer"
|
|
FontWeight="Bold"
|
|
TextAlignment="Center"/>
|
|
|
|
<!-- Layer data -->
|
|
|
|
<DataGrid Grid.Row="6"
|
|
IsVisible="{Binding IsFileLoaded}"
|
|
Name="CurrentLayerGrid"
|
|
CanUserReorderColumns="False"
|
|
CanUserResizeColumns="False"
|
|
CanUserSortColumns="False"
|
|
GridLinesVisibility="Horizontal"
|
|
IsReadOnly="True"
|
|
ClipboardCopyMode="IncludeHeader"
|
|
Items="{Binding CurrentLayerProperties}">
|
|
<DataGrid.Columns>
|
|
<DataGridTextColumn Header="Name"
|
|
Binding="{Binding Description}"
|
|
Width="Auto" />
|
|
<DataGridTextColumn Header="Value"
|
|
Binding="{Binding Value}"
|
|
Width="Auto" />
|
|
</DataGrid.Columns>
|
|
|
|
</DataGrid>
|
|
|
|
|
|
|
|
</Grid>
|
|
|
|
</TabItem>
|
|
|
|
<TabItem
|
|
Name="TabGCode"
|
|
ToolTip.Tip="GCode"
|
|
IsVisible="False"
|
|
IsEnabled="{Binding HaveGCode}">
|
|
<TabItem.Header>
|
|
<StackPanel VerticalAlignment="Center" Orientation="Horizontal">
|
|
<i:Icon Value="fa-solid fa-code"/>
|
|
<!--<TextBlock
|
|
IsVisible="{Binding $parent[TabItem].IsSelected}"
|
|
VerticalAlignment="Center"
|
|
Margin="5,0,0,0">Gcode</TextBlock>!-->
|
|
</StackPanel>
|
|
</TabItem.Header>
|
|
|
|
<Grid RowDefinitions="Auto,*">
|
|
<StackPanel Grid.Row="0" Orientation="Horizontal" Spacing="5">
|
|
<TextBlock
|
|
Text="{Binding GCodeLines, StringFormat=Lines: {0}}"
|
|
VerticalAlignment="Center"/>
|
|
|
|
<TextBlock Text="|" VerticalAlignment="Center"/>
|
|
|
|
<TextBlock Text="{Binding #GCodeText.Text.Length, StringFormat=Chars: {0}}"
|
|
VerticalAlignment="Center"/>
|
|
</StackPanel>
|
|
|
|
<StackPanel Grid.Row="0"
|
|
Orientation="Horizontal"
|
|
Spacing="2"
|
|
HorizontalAlignment="Right"
|
|
VerticalAlignment="Center">
|
|
|
|
<ToggleButton
|
|
IsChecked="{Binding SlicerFile.SuppressRebuildGCode}"
|
|
ToolTip.Tip="Enable this to directly edit and use custom gcode.
|
|

While this is active, UVtools won't update/generate the gcode, meaning any future change won't be replicated to gcode, unless you press the 'Refresh' button.
|
|

To save the file with your custom gcode this setting must remain active while saving the file or else it will be re-generated.
|
|

Use with caution and only if you know what you are doing!"
|
|
i:Attached.Icon="fa-regular fa-edit"/>
|
|
|
|
<Button
|
|
ToolTip.Tip="Rebuild GCode with current settings"
|
|
i:Attached.Icon="fa-solid fa-sync-alt"
|
|
Command="{Binding OnClickRebuildGcode}"/>
|
|
|
|
<uc:ButtonWithIcon Name="GcodeSaveButton"
|
|
ToolTip.Tip="Save gcode to a file or clipboard"
|
|
Icon="fa-solid fa-floppy-disk"
|
|
Spacing="3"
|
|
Text="⮟"
|
|
Command="{Binding OpenContextMenu}"
|
|
CommandParameter="GcodeSave">
|
|
<uc:ButtonWithIcon.ContextMenu>
|
|
<ContextMenu Name="GcodeSaveContextMenu" PlacementMode="Bottom">
|
|
<MenuItem
|
|
Command="{Binding OnClickGCodeSaveFile}"
|
|
Header="To File"
|
|
i:MenuItem.Icon="fa-regular fa-floppy-disk"/>
|
|
|
|
<MenuItem
|
|
Command="{Binding OnClickGCodeSaveClipboard}"
|
|
Header="To Clipboard"
|
|
i:MenuItem.Icon="fa-regular fa-clipboard"/>
|
|
|
|
</ContextMenu>
|
|
</uc:ButtonWithIcon.ContextMenu>
|
|
</uc:ButtonWithIcon>
|
|
|
|
</StackPanel>
|
|
|
|
<TextBox
|
|
Name="GCodeText"
|
|
Grid.Row="1"
|
|
IsReadOnly="{Binding !SlicerFile.SuppressRebuildGCode}"
|
|
AcceptsReturn="True"
|
|
Text="{Binding SlicerFile.GCodeStr}" />
|
|
|
|
</Grid>
|
|
|
|
</TabItem>
|
|
|
|
<!--
|
|
Issues Tab
|
|
-->
|
|
<TabItem
|
|
Name="TabIssues"
|
|
ToolTip.Tip="Issues"
|
|
IsEnabled="{Binding IsFileLoaded}" >
|
|
<TabItem.Header>
|
|
<StackPanel VerticalAlignment="Center" Orientation="Horizontal">
|
|
<i:Icon Value="fa-solid fa-radiation-alt"/>
|
|
<!--<TextBlock Margin="5,0,0,0">Issues</TextBlock>!-->
|
|
</StackPanel>
|
|
</TabItem.Header>
|
|
|
|
<Grid
|
|
RowDefinitions="Auto,*">
|
|
<StackPanel
|
|
IsEnabled="{Binding IsFileLoaded}"
|
|
Grid.Row="0"
|
|
Orientation="Horizontal"
|
|
Spacing="2"
|
|
VerticalAlignment="Center">
|
|
<RepeatButton VerticalAlignment="Stretch"
|
|
HotKey="Ctrl + Shift + Down"
|
|
ToolTip.Tip="Go to the previous issue [Ctrl + Shift + Down]"
|
|
IsEnabled="{Binding IssueCanGoPrevious}"
|
|
Command="{Binding IssueGoPrevious}"
|
|
Interval="100"
|
|
i:Attached.Icon="fa-solid fa-caret-left"/>
|
|
|
|
<TextBlock VerticalAlignment="Center">
|
|
<TextBlock.Text>
|
|
<MultiBinding StringFormat="{}{0}/{1}">
|
|
<Binding Path="IssueSelectedIndexStr"/>
|
|
<Binding Path="SlicerFile.IssueManager.Count"/>
|
|
</MultiBinding>
|
|
</TextBlock.Text>
|
|
</TextBlock>
|
|
|
|
<RepeatButton VerticalAlignment="Stretch"
|
|
HotKey="Ctrl + Shift + Up"
|
|
ToolTip.Tip="Go to the next issue [Ctrl + Shift + Up]"
|
|
IsEnabled="{Binding IssueCanGoNext}"
|
|
Command="{Binding IssueGoNext}"
|
|
Interval="100"
|
|
i:Attached.Icon="fa-solid fa-caret-right"/>
|
|
|
|
<Button VerticalAlignment="Stretch"
|
|
ToolTip.Tip="Hides and ignores the selected issues, they won't be re-detected.
|
|

ALT + Click to re-enable the ignored issues."
|
|
IsEnabled="{Binding #IssuesGrid.SelectedItem, Converter={x:Static ObjectConverters.IsNotNull}}"
|
|
i:Attached.Icon="fa-solid fa-eye-slash"
|
|
Command="{Binding OnClickIssueIgnore}"/>
|
|
|
|
<Button VerticalAlignment="Stretch"
|
|
ToolTip.Tip="Remove the selected issue(s) when possible.
|
|

Islands: All pixels are removed (turn black).
|
|

ResinTrap: All areas are filled with white pixels.
|
|

SuctionCup: Drills a vertical vent hole.
|
|

EmptyLayers: Layers are removed."
|
|
IsEnabled="{Binding #IssuesGrid.SelectedItem, Converter={x:Static ObjectConverters.IsNotNull}}"
|
|
i:Attached.Icon="fa-solid fa-trash-alt"
|
|
Command="{Binding OnClickIssueRemove}"/>
|
|
|
|
</StackPanel>
|
|
|
|
<StackPanel Grid.Row="0"
|
|
Orientation="Horizontal"
|
|
Spacing="2"
|
|
HorizontalAlignment="Right"
|
|
VerticalAlignment="Center">
|
|
|
|
<Button IsEnabled="{Binding IsFileLoaded}"
|
|
ToolTip.Tip="Attempt to repair issues"
|
|
VerticalAlignment="Stretch"
|
|
i:Attached.Icon="fa-solid fa-toolbox"
|
|
Command="{Binding OnClickRepairIssues}"/>
|
|
|
|
<uc:ButtonWithIcon VerticalAlignment="Stretch"
|
|
ToolTip.Tip="Compute Issues.
|
|

Right click to access settings."
|
|
Icon="fa-solid fa-sync-alt"
|
|
Spacing="5"
|
|
Text="Detect ⮟"
|
|
Command="{Binding OnClickDetectIssues}">
|
|
|
|
<uc:ButtonWithIcon.ContextMenu>
|
|
<ContextMenu PlacementMode="Bottom">
|
|
<CheckBox
|
|
IsChecked="{Binding Settings.Issues.ComputeIslands}"
|
|
Content="Islands"/>
|
|
<CheckBox
|
|
IsChecked="{Binding Settings.Issues.ComputeOverhangs}"
|
|
Content="Overhangs"/>
|
|
<StackPanel Orientation="Horizontal">
|
|
<CheckBox
|
|
VerticalAlignment="Center"
|
|
IsChecked="{Binding Settings.Issues.ComputeResinTraps}"
|
|
Content="Resin traps"/>
|
|
|
|
<NumericUpDown
|
|
VerticalAlignment="Center"
|
|
Margin="10,0,0,0"
|
|
ToolTip.Tip="Starting layer index for resin trap detection which will also be considered a drain layer.
|
|

Use this setting to bypass complicated rafts by select the model first real layer."
|
|
Minimum="0"
|
|
Maximum="{Binding SlicerFile.LastLayerIndex}"
|
|
Increment="1"
|
|
Width="110"
|
|
Value="{Binding ResinTrapDetectionStartLayer}"/>
|
|
|
|
<Button
|
|
VerticalAlignment="Center"
|
|
Margin="2,0,0,0"
|
|
ToolTip.Tip="Set to the first normal layer"
|
|
Content="N"
|
|
Command="{Binding SetResinTrapDetectionStartLayer}"
|
|
CommandParameter="N"/>
|
|
<Button
|
|
VerticalAlignment="Center"
|
|
Margin="2,0,0,0"
|
|
ToolTip.Tip="Set to the current layer"
|
|
Content="C"
|
|
Command="{Binding SetResinTrapDetectionStartLayer}"
|
|
CommandParameter="C"/>
|
|
</StackPanel>
|
|
|
|
<CheckBox
|
|
VerticalAlignment="Center"
|
|
IsEnabled="{Binding Settings.Issues.ComputeResinTraps}"
|
|
IsChecked="{Binding Settings.Issues.ComputeSuctionCups}"
|
|
Content="Suction cups"/>
|
|
|
|
<CheckBox
|
|
IsChecked="{Binding Settings.Issues.ComputeTouchingBounds}"
|
|
Content="Touching bounds"/>
|
|
<CheckBox
|
|
IsChecked="{Binding Settings.Issues.ComputePrintHeight}"
|
|
Content="Print height"/>
|
|
<CheckBox
|
|
IsChecked="{Binding Settings.Issues.ComputeEmptyLayers}"
|
|
Content="Empty layers"/>
|
|
</ContextMenu>
|
|
</uc:ButtonWithIcon.ContextMenu>
|
|
</uc:ButtonWithIcon>
|
|
|
|
</StackPanel>
|
|
|
|
<DataGrid
|
|
Name="IssuesGrid"
|
|
Grid.Row="1"
|
|
CanUserReorderColumns="True"
|
|
CanUserResizeColumns="True"
|
|
CanUserSortColumns="True"
|
|
GridLinesVisibility="Horizontal"
|
|
SelectionMode="Extended"
|
|
SelectedIndex="{Binding IssueSelectedIndex, Mode=TwoWay}"
|
|
IsReadOnly="True"
|
|
ClipboardCopyMode="None"
|
|
Items="{Binding IssuesGridItems}">
|
|
<DataGrid.ContextMenu>
|
|
<ContextMenu IsVisible="{Binding #IssuesGrid.SelectedItem, Converter={x:Static ObjectConverters.IsNotNull}}">
|
|
<MenuItem i:MenuItem.Icon="fa-solid fa-eye-slash" Command="{Binding OnClickIssueIgnore}" Header="Ignore issue(s)"/>
|
|
<Separator/>
|
|
<MenuItem i:MenuItem.Icon="fa-solid fa-trash-can" Command="{Binding SelectedIssuesIslandRemove}" IsVisible="{Binding #IssuesGrid.SelectedItem.IsIsland}" Header="Remove island(s)"/>
|
|
<MenuItem i:MenuItem.Icon="fa-solid fa-diamond" Command="{Binding SelectedIssuesResinTrapSolidify}" IsVisible="{Binding #IssuesGrid.SelectedItem.IsResinTrap}" Header="Fill/solidify resin trap(s)"/>
|
|
<MenuItem i:MenuItem.Icon="fa-solid fa-circle-dot" Command="{Binding SelectedIssuesSuctionCupDrill}" IsVisible="{Binding #IssuesGrid.SelectedItem.IsSuctionCup}" Header="Drill suction cup(s)"/>
|
|
<MenuItem i:MenuItem.Icon="fa-solid fa-diamond" Command="{Binding SelectedIssuesSuctionCupSolidify}" IsVisible="{Binding #IssuesGrid.SelectedItem.IsSuctionCup}" Header="Fill/solidify suction cup(s)"/>
|
|
<MenuItem i:MenuItem.Icon="fa-solid fa-trash-can" Command="{Binding SelectedIssuesEmptyLayerRemove}" IsVisible="{Binding #IssuesGrid.SelectedItem.IsEmptyLayer}" Header="Remove empty layer(s)"/>
|
|
</ContextMenu>
|
|
</DataGrid.ContextMenu>
|
|
<DataGrid.Columns>
|
|
|
|
<DataGridTextColumn Header="Type"
|
|
Binding="{Binding Type}"
|
|
Width="Auto" />
|
|
<DataGridTextColumn Header="Layer(s)"
|
|
Binding="{Binding LayerInfoStr}"
|
|
Width="Auto" />
|
|
<DataGridTextColumn Header="Area"
|
|
Binding="{Binding Area, StringFormat={}{0:F0}}"
|
|
Width="Auto" />
|
|
</DataGrid.Columns>
|
|
|
|
</DataGrid>
|
|
|
|
|
|
</Grid>
|
|
|
|
|
|
</TabItem>
|
|
|
|
<!--
|
|
Suggestions Tab
|
|
-->
|
|
<TabItem
|
|
Name="TabSuggestions"
|
|
ToolTip.Tip="Suggestions, automations and analyzer"
|
|
IsVisible="{Binding Suggestions.Length}"
|
|
IsEnabled="{Binding IsFileLoaded}" >
|
|
<TabItem.Header>
|
|
<StackPanel VerticalAlignment="Center" Orientation="Horizontal">
|
|
<i:Icon Value="fa-solid fa-shield-virus"/>
|
|
<!--<TextBlock Margin="5,0,0,0">Suggestions</TextBlock>!-->
|
|
</StackPanel>
|
|
</TabItem.Header>
|
|
|
|
<Grid ColumnDefinitions="*">
|
|
<Grid.RowDefinitions>
|
|
<RowDefinition Height="Auto" />
|
|
<RowDefinition Height="2*" MinHeight="200" />
|
|
<RowDefinition Height="Auto" />
|
|
<RowDefinition Height="*" MinHeight="200" />
|
|
</Grid.RowDefinitions>
|
|
|
|
<Grid Grid.Row="0" RowDefinitions="Auto" ColumnDefinitions="Auto,2,Auto,*">
|
|
<uc:ButtonWithIcon Grid.Column="0"
|
|
Text="Unselect all"
|
|
Spacing="5"
|
|
Icon="fa-regular fa-square"
|
|
Command="{Binding #SuggestionsAvailableListBox.UnselectAll}"/>
|
|
|
|
<uc:ButtonWithIcon Grid.Column="2"
|
|
Text="Select all"
|
|
Spacing="5"
|
|
Icon="fa-regular fa-check-square"
|
|
Command="{Binding #SuggestionsAvailableListBox.SelectAll}"/>
|
|
|
|
<StackPanel Grid.Column="3" Orientation="Horizontal" HorizontalAlignment="Right" Spacing="2">
|
|
<uc:ButtonWithIcon IsEnabled="{Binding #SuggestionsAvailableListBox.SelectedItem, Converter={x:Static ObjectConverters.IsNotNull}}"
|
|
Icon="fa-solid fa-check"
|
|
Spacing="5"
|
|
Text="Apply"
|
|
Command="{Binding ApplySuggestionsClicked}"/>
|
|
|
|
<Button VerticalAlignment="Stretch"
|
|
ToolTip.Tip="Configure suggestions"
|
|
Command="{Binding ConfigureSuggestionsClicked}"
|
|
i:Attached.Icon="fa-solid fa-cog"/>
|
|
</StackPanel>
|
|
|
|
</Grid>
|
|
|
|
<ListBox
|
|
Grid.Row="1"
|
|
Name="SuggestionsAvailableListBox"
|
|
SelectionMode="Multiple,Toggle"
|
|
Items="{Binding SuggestionsAvailable}">
|
|
<ListBox.ItemTemplate>
|
|
<DataTemplate>
|
|
<TextBlock Text="{Binding Message}"
|
|
TextWrapping="Wrap"
|
|
ToolTip.Tip="{Binding ToolTip}">
|
|
<!--<TextBlock.IsVisible>
|
|
<MultiBinding Converter="{x:Static BoolConverters.And}">
|
|
<Binding Path="Enabled"/>
|
|
<Binding Path="!IsApplied"/>
|
|
</MultiBinding>
|
|
</TextBlock.IsVisible>
|
|
!-->
|
|
<TextBlock.ContextMenu>
|
|
<ContextMenu>
|
|
<MenuItem
|
|
Command="{Binding $parent[uc:WindowEx].DataContext.ApplySuggestionClicked}"
|
|
CommandParameter="{Binding .}"
|
|
Header="Apply"
|
|
IsVisible="{Binding !IsInformativeOnly}"
|
|
i:MenuItem.Icon="fa-solid fa-check"/>
|
|
<MenuItem
|
|
Command="{Binding $parent[uc:WindowEx].DataContext.OpenWebsite}"
|
|
CommandParameter="{Binding InformationUrl}"
|
|
Header="More information (Web)"
|
|
IsVisible="{Binding InformationUrl, Converter={x:Static ObjectConverters.IsNotNull}}"
|
|
i:MenuItem.Icon="fa-solid fa-info-circle"/>
|
|
<MenuItem
|
|
Command="{Binding $parent[uc:WindowEx].DataContext.ConfigureSuggestionClicked}"
|
|
CommandParameter="{Binding .}"
|
|
Header="Configure"
|
|
i:MenuItem.Icon="fa-solid fa-cog"/>
|
|
</ContextMenu>
|
|
</TextBlock.ContextMenu>
|
|
</TextBlock>
|
|
</DataTemplate>
|
|
</ListBox.ItemTemplate>
|
|
</ListBox>
|
|
|
|
<GridSplitter Grid.Row="2" ResizeBehavior="PreviousAndNext" ResizeDirection="Rows"/>
|
|
|
|
<TextBlock Grid.Row="2" Text="Applied suggestions:" HorizontalAlignment="Center" FontWeight="Bold"/>
|
|
|
|
<ListBox
|
|
Grid.Row="3"
|
|
SelectionMode="AlwaysSelected"
|
|
Items="{Binding SuggestionsApplied}">
|
|
<ListBox.ItemTemplate>
|
|
<DataTemplate>
|
|
<TextBlock Text="{Binding Message}"
|
|
TextWrapping="Wrap"
|
|
ToolTip.Tip="{Binding ToolTip}">
|
|
<!--<TextBlock.IsVisible>
|
|
<MultiBinding Converter="{x:Static BoolConverters.And}">
|
|
<Binding Path="Enabled"/>
|
|
<Binding Path="IsApplied"/>
|
|
</MultiBinding>
|
|
</TextBlock.IsVisible>
|
|
!-->
|
|
<TextBlock.ContextMenu>
|
|
<ContextMenu>
|
|
<MenuItem
|
|
Command="{Binding $parent[uc:WindowEx].DataContext.OpenWebsite}"
|
|
CommandParameter="{Binding InformationUrl}"
|
|
Header="More information (Web)"
|
|
IsVisible="{Binding InformationUrl, Converter={x:Static ObjectConverters.IsNotNull}}"
|
|
i:MenuItem.Icon="fa-solid fa-info-circle"/>
|
|
<MenuItem
|
|
Command="{Binding $parent[uc:WindowEx].DataContext.ConfigureSuggestionClicked}"
|
|
CommandParameter="{Binding .}"
|
|
Header="Configure"
|
|
i:MenuItem.Icon="fa-solid fa-cog"/>
|
|
</ContextMenu>
|
|
</TextBlock.ContextMenu>
|
|
</TextBlock>
|
|
</DataTemplate>
|
|
</ListBox.ItemTemplate>
|
|
</ListBox>
|
|
</Grid>
|
|
|
|
</TabItem>
|
|
|
|
<!-- Pixel Editor !-->
|
|
<TabItem
|
|
Name="TabPixelEditor"
|
|
ToolTip.Tip="Pixel editor"
|
|
IsVisible="{Binding IsPixelEditorActive}"
|
|
IsEnabled="{Binding IsPixelEditorActive}">
|
|
<TabItem.Header>
|
|
<StackPanel VerticalAlignment="Center" Orientation="Horizontal">
|
|
<i:Icon Value="fa-solid fa-drafting-compass"/>
|
|
<!--<TextBlock Margin="5,0,0,0">Pixel editor</TextBlock>!-->
|
|
</StackPanel>
|
|
</TabItem.Header>
|
|
|
|
<Grid RowDefinitions="Auto,20,Auto,*">
|
|
<TabControl
|
|
Padding="10,0"
|
|
SelectedIndex="{Binding SelectedPixelOperationTabIndex}">
|
|
<!-- Drawing !-->
|
|
<TabControl.Styles>
|
|
<Style Selector="TabItem">
|
|
<Setter Property="FontSize" Value="24"/>
|
|
</Style>
|
|
</TabControl.Styles>
|
|
<TabItem ToolTip.Tip="Drawing">
|
|
<TabItem.Header>
|
|
<StackPanel VerticalAlignment="Center" Orientation="Horizontal" Spacing="5">
|
|
<i:Icon Value="fa-solid fa-paintbrush"/>
|
|
<TextBlock IsVisible="{Binding $parent[TabItem].IsSelected}" Text="Drawing" />
|
|
</StackPanel>
|
|
</TabItem.Header>
|
|
|
|
<StackPanel Spacing="10">
|
|
<Border Background="{DynamicResource LightBackground}" BorderThickness="1" BorderBrush="Black">
|
|
<TextBlock Padding="10" Text="Shift+Left click to add white pixels
|
|

Shift+Right click to remove pixels"/>
|
|
</Border>
|
|
|
|
<Grid
|
|
RowDefinitions="Auto,10,Auto,10,Auto,10,Auto,10,Auto,10,Auto,10,Auto,10,Auto,10,Auto"
|
|
ColumnDefinitions="Auto,10,130,5,40">
|
|
|
|
<TextBlock
|
|
Grid.Row="0"
|
|
Grid.Column="0"
|
|
VerticalAlignment="Center"
|
|
Text="Line type:" />
|
|
<ComboBox
|
|
Grid.Row="0"
|
|
Grid.Column="2"
|
|
Grid.ColumnSpan="3"
|
|
Width="180"
|
|
Items="{Binding DrawingPixelDrawing.LineTypes}"
|
|
SelectedItem="{Binding DrawingPixelDrawing.LineType}"/>
|
|
|
|
<TextBlock
|
|
Grid.Row="2"
|
|
Grid.Column="0"
|
|
VerticalAlignment="Center"
|
|
Text="Brush shape:" />
|
|
<ComboBox
|
|
Grid.Row="2"
|
|
Grid.Column="2"
|
|
Grid.ColumnSpan="3"
|
|
Width="180"
|
|
Items="{Binding DrawingPixelDrawing.BrushShapeTypes}"
|
|
SelectedItem="{Binding DrawingPixelDrawing.BrushShape}"/>
|
|
|
|
<TextBlock Grid.Row="4" Grid.Column="0"
|
|
VerticalAlignment="Center"
|
|
Text="Rotation angle:" />
|
|
<NumericUpDown Grid.Row="4" Grid.Column="2" Grid.ColumnSpan="3"
|
|
Classes="ValueLabel ValueLabel_deg"
|
|
FormatString="F2"
|
|
Minimum="-360"
|
|
Maximum="360"
|
|
Value="{Binding DrawingPixelDrawing.RotationAngle}"/>
|
|
|
|
<TextBlock Grid.Row="6" Grid.Column="0"
|
|
VerticalAlignment="Center"
|
|
Text="Brush diameter:" />
|
|
<NumericUpDown Grid.Row="6" Grid.Column="2" Grid.ColumnSpan="3"
|
|
Classes="ValueLabel ValueLabel_px"
|
|
Minimum="1"
|
|
Maximum="4000"
|
|
HorizontalAlignment="Stretch"
|
|
Value="{Binding DrawingPixelDrawing.BrushSize}"/>
|
|
|
|
<TextBlock Grid.Row="8" Grid.Column="0"
|
|
VerticalAlignment="Center"
|
|
Text="Thickness:" />
|
|
<NumericUpDown Grid.Row="8" Grid.Column="2" Grid.ColumnSpan="3"
|
|
Classes="ValueLabel ValueLabel_px"
|
|
Minimum="-1"
|
|
Maximum="255"
|
|
HorizontalAlignment="Stretch"
|
|
Value="{Binding DrawingPixelDrawing.Thickness}"/>
|
|
|
|
<TextBlock Grid.Row="10" Grid.Column="0"
|
|
VerticalAlignment="Center"
|
|
Text="Remove pixel brightness:" />
|
|
<NumericUpDown Grid.Row="10" Grid.Column="2"
|
|
Minimum="0"
|
|
Maximum="255"
|
|
HorizontalAlignment="Stretch"
|
|
Value="{Binding DrawingPixelDrawing.RemovePixelBrightness}"/>
|
|
<TextBlock
|
|
Grid.Row="10"
|
|
Grid.Column="4"
|
|
VerticalAlignment="Center"
|
|
Text="{Binding DrawingPixelDrawing.RemovePixelBrightnessPercent, StringFormat={}{0:0}%}" />
|
|
|
|
<TextBlock
|
|
Grid.Row="12"
|
|
Grid.Column="0"
|
|
VerticalAlignment="Center"
|
|
Text="Add pixel brightness:" />
|
|
<NumericUpDown
|
|
Grid.Row="12"
|
|
Grid.Column="2"
|
|
Minimum="1"
|
|
Maximum="255"
|
|
|
|
HorizontalAlignment="Stretch"
|
|
Value="{Binding DrawingPixelDrawing.PixelBrightness}"/>
|
|
<TextBlock
|
|
Grid.Row="12"
|
|
Grid.Column="4"
|
|
VerticalAlignment="Center"
|
|
Text="{Binding DrawingPixelDrawing.PixelBrightnessPercent, StringFormat={}{0:0}%}" />
|
|
|
|
<TextBlock
|
|
Grid.Row="14"
|
|
Grid.Column="0"
|
|
VerticalAlignment="Center"
|
|
Text="Layers depth below:" />
|
|
<NumericUpDown Grid.Row="14" Grid.Column="2" Grid.ColumnSpan="3"
|
|
Classes="ValueLabel ValueLabel_layers"
|
|
Minimum="0"
|
|
HorizontalAlignment="Stretch"
|
|
Value="{Binding DrawingPixelDrawing.LayersBelow}"/>
|
|
|
|
|
|
<TextBlock
|
|
Grid.Row="16"
|
|
Grid.Column="0"
|
|
VerticalAlignment="Center"
|
|
Text="Layers depth above:" />
|
|
<NumericUpDown Grid.Row="16" Grid.Column="2" Grid.ColumnSpan="3"
|
|
Classes="ValueLabel ValueLabel_layers"
|
|
Minimum="0"
|
|
HorizontalAlignment="Stretch"
|
|
Value="{Binding DrawingPixelDrawing.LayersAbove}"/>
|
|
|
|
</Grid>
|
|
|
|
</StackPanel>
|
|
|
|
</TabItem>
|
|
|
|
<!-- Text !-->
|
|
<TabItem ToolTip.Tip="Text">
|
|
<TabItem.Header>
|
|
<StackPanel VerticalAlignment="Center" Orientation="Horizontal" Spacing="5">
|
|
<i:Icon Value="fa-solid fa-font"/>
|
|
<TextBlock IsVisible="{Binding $parent[TabItem].IsSelected}" Text="Text" />
|
|
</StackPanel>
|
|
</TabItem.Header>
|
|
|
|
<StackPanel Spacing="10">
|
|
<Border Background="{DynamicResource LightBackground}" BorderThickness="1" BorderBrush="Black">
|
|
<TextBlock Padding="10" Text="Shift+Left click to add text
|
|

Shift+Right click to remove text"/>
|
|
</Border>
|
|
|
|
<Grid
|
|
RowDefinitions="Auto,10,Auto,10,Auto,10,Auto,10,Auto,10,Auto,10,Auto,10,Auto,10,Auto,10,Auto,10,Auto,10,Auto"
|
|
ColumnDefinitions="Auto,10,130,5,40">
|
|
|
|
<TextBlock
|
|
Grid.Row="0"
|
|
Grid.Column="0"
|
|
VerticalAlignment="Center"
|
|
Text="Line type:" />
|
|
<ComboBox
|
|
Grid.Row="0"
|
|
Grid.Column="2"
|
|
Grid.ColumnSpan="3"
|
|
Width="180"
|
|
Items="{Binding DrawingPixelText.LineTypes}"
|
|
SelectedItem="{Binding DrawingPixelText.LineType}"/>
|
|
|
|
<TextBlock
|
|
Grid.Row="2"
|
|
Grid.Column="0"
|
|
VerticalAlignment="Center"
|
|
Text="Font face:" />
|
|
<ComboBox
|
|
Grid.Row="2"
|
|
Grid.Column="2"
|
|
Grid.ColumnSpan="3"
|
|
Width="180"
|
|
Items="{Binding DrawingPixelText.FontFaces}"
|
|
SelectedItem="{Binding DrawingPixelText.Font}"/>
|
|
|
|
<TextBlock
|
|
Grid.Row="4"
|
|
Grid.Column="0"
|
|
VerticalAlignment="Center"
|
|
Text="Font scale:" />
|
|
<NumericUpDown
|
|
Grid.Row="4"
|
|
Grid.Column="2"
|
|
Grid.ColumnSpan="3"
|
|
Minimum="0.1"
|
|
Maximum="255"
|
|
Increment="0.1"
|
|
|
|
Value="{Binding DrawingPixelText.FontScale}"/>
|
|
|
|
|
|
<TextBlock
|
|
Grid.Row="6"
|
|
Grid.Column="0"
|
|
VerticalAlignment="Center"
|
|
Text="Thickness:" />
|
|
<NumericUpDown Grid.Row="6" Grid.Column="2"
|
|
Classes="ValueLabel ValueLabel_px"
|
|
Grid.ColumnSpan="3"
|
|
Minimum="1"
|
|
Maximum="255"
|
|
Value="{Binding DrawingPixelText.Thickness}"/>
|
|
|
|
<TextBlock
|
|
Grid.Row="8"
|
|
Grid.Column="0"
|
|
VerticalAlignment="Center"
|
|
Text="Text:" />
|
|
<TextBox
|
|
Grid.Row="8"
|
|
Grid.Column="2"
|
|
Grid.ColumnSpan="3"
|
|
AcceptsReturn="True"
|
|
Height="90"
|
|
Text="{Binding DrawingPixelText.Text}"/>
|
|
|
|
<TextBlock
|
|
Grid.Row="10"
|
|
Grid.Column="0"
|
|
VerticalAlignment="Center"
|
|
Text="Line alignment:" />
|
|
<ComboBox
|
|
Grid.Row="10"
|
|
Grid.Column="2"
|
|
Grid.ColumnSpan="3"
|
|
Width="180"
|
|
Items="{Binding DrawingPixelText.LineAlignment, Converter={StaticResource EnumToCollectionConverter}, Mode=OneTime}"
|
|
SelectedItem="{Binding DrawingPixelText.LineAlignment, Converter={StaticResource FromValueDescriptionToEnumConverter}}"/>
|
|
|
|
<CheckBox
|
|
Grid.Row="12"
|
|
Grid.Column="2"
|
|
Grid.ColumnSpan="3"
|
|
Content="Flip text Vertically"
|
|
IsChecked="{Binding DrawingPixelText.Mirror}"/>
|
|
|
|
<TextBlock
|
|
Grid.Row="14"
|
|
Grid.Column="0"
|
|
VerticalAlignment="Center"
|
|
Text="Rotation angle:" />
|
|
<NumericUpDown Grid.Row="14" Grid.Column="2" Grid.ColumnSpan="3"
|
|
Classes="ValueLabel ValueLabel_deg"
|
|
FormatString="F2"
|
|
Minimum="-360"
|
|
Maximum="360"
|
|
Value="{Binding DrawingPixelText.Angle}"/>
|
|
|
|
<TextBlock
|
|
Grid.Row="16"
|
|
Grid.Column="0"
|
|
VerticalAlignment="Center"
|
|
Text="Remove pixel brightness:" />
|
|
<NumericUpDown
|
|
Grid.Row="16"
|
|
Grid.Column="2"
|
|
Minimum="0"
|
|
Maximum="255"
|
|
|
|
Value="{Binding DrawingPixelText.RemovePixelBrightness}"/>
|
|
<TextBlock
|
|
Grid.Row="16"
|
|
Grid.Column="4"
|
|
VerticalAlignment="Center"
|
|
Text="{Binding DrawingPixelText.RemovePixelBrightnessPercent, StringFormat={}{0:0}%}" />
|
|
|
|
<TextBlock
|
|
Grid.Row="18"
|
|
Grid.Column="0"
|
|
VerticalAlignment="Center"
|
|
Text="Add pixel brightness:" />
|
|
<NumericUpDown
|
|
Grid.Row="18"
|
|
Grid.Column="2"
|
|
Minimum="1"
|
|
Maximum="255"
|
|
|
|
Value="{Binding DrawingPixelText.PixelBrightness}"/>
|
|
<TextBlock
|
|
Grid.Row="18"
|
|
Grid.Column="4"
|
|
VerticalAlignment="Center"
|
|
Text="{Binding DrawingPixelText.PixelBrightnessPercent, StringFormat={}{0:0}%}" />
|
|
|
|
|
|
<TextBlock
|
|
Grid.Row="20"
|
|
Grid.Column="0"
|
|
VerticalAlignment="Center"
|
|
Text="Layers depth below:" />
|
|
<NumericUpDown Grid.Row="20" Grid.Column="2" Grid.ColumnSpan="3"
|
|
Classes="ValueLabel ValueLabel_layers"
|
|
Minimum="0"
|
|
Value="{Binding DrawingPixelText.LayersBelow}"/>
|
|
|
|
|
|
<TextBlock
|
|
Grid.Row="22"
|
|
Grid.Column="0"
|
|
VerticalAlignment="Center"
|
|
Text="Layers depth above:" />
|
|
<NumericUpDown Grid.Row="22" Grid.Column="2" Grid.ColumnSpan="3"
|
|
Classes="ValueLabel ValueLabel_layers"
|
|
Minimum="0"
|
|
Value="{Binding DrawingPixelText.LayersAbove}"/>
|
|
|
|
</Grid>
|
|
|
|
</StackPanel>
|
|
|
|
</TabItem>
|
|
|
|
<!-- Eraser !-->
|
|
<TabItem ToolTip.Tip="Eraser">
|
|
<TabItem.Header>
|
|
<StackPanel VerticalAlignment="Center" Orientation="Horizontal" Spacing="5">
|
|
<i:Icon Value="fa-solid fa-eraser"/>
|
|
<TextBlock IsVisible="{Binding $parent[TabItem].IsSelected}" Text="Eraser" />
|
|
</StackPanel>
|
|
</TabItem.Header>
|
|
|
|
<StackPanel Spacing="10">
|
|
<Border Background="{DynamicResource LightBackground}" BorderThickness="1" BorderBrush="Black">
|
|
<TextBlock Padding="10" Text="Shift+click over a white pixel to remove the linked area.
|
|

(Fill linked area with black)"/>
|
|
</Border>
|
|
|
|
<Grid
|
|
RowDefinitions="Auto,10,Auto,10,Auto"
|
|
ColumnDefinitions="Auto,10,*,10,40">
|
|
|
|
<TextBlock
|
|
Grid.Row="0"
|
|
Grid.Column="0"
|
|
VerticalAlignment="Center"
|
|
Text="Pixel brightness:" />
|
|
<NumericUpDown Grid.Row="0" Grid.Column="2"
|
|
Classes="ValueLabel ValueLabel_sun"
|
|
Minimum="0"
|
|
Maximum="255"
|
|
|
|
Value="{Binding DrawingPixelEraser.PixelBrightness}"/>
|
|
<TextBlock
|
|
Grid.Row="0"
|
|
Grid.Column="4"
|
|
VerticalAlignment="Center"
|
|
Text="{Binding DrawingPixelEraser.PixelBrightnessPercent, StringFormat={}{0:0}%}" />
|
|
|
|
<TextBlock
|
|
Grid.Row="2"
|
|
Grid.Column="0"
|
|
VerticalAlignment="Center"
|
|
Text="Layers depth below:" />
|
|
<NumericUpDown Grid.Row="2" Grid.Column="2" Grid.ColumnSpan="3"
|
|
Classes="ValueLabel ValueLabel_layers"
|
|
Minimum="0"
|
|
Value="{Binding DrawingPixelEraser.LayersBelow}"/>
|
|
|
|
<TextBlock
|
|
Grid.Row="4"
|
|
Grid.Column="0"
|
|
VerticalAlignment="Center"
|
|
Text="Layers depth above:" />
|
|
<NumericUpDown Grid.Row="4" Grid.Column="2" Grid.ColumnSpan="3"
|
|
Classes="ValueLabel ValueLabel_layers"
|
|
Minimum="0"
|
|
Value="{Binding DrawingPixelEraser.LayersAbove}"/>
|
|
|
|
|
|
</Grid>
|
|
|
|
</StackPanel>
|
|
|
|
</TabItem>
|
|
|
|
<!-- Supports !-->
|
|
<TabItem
|
|
ToolTip.Tip="Supports"
|
|
>
|
|
<TabItem.Header>
|
|
<StackPanel VerticalAlignment="Center" Orientation="Horizontal" Spacing="5">
|
|
<i:Icon Value="fa-solid fa-code-branch"/>
|
|
<TextBlock IsVisible="{Binding $parent[TabItem].IsSelected}" Text="Supports" />
|
|
</StackPanel>
|
|
</TabItem.Header>
|
|
|
|
<StackPanel Spacing="10" >
|
|
<Border Background="{DynamicResource LightBackground}" BorderThickness="1" BorderBrush="Black">
|
|
<TextBlock Padding="10" Text="Shift+click under a island to add primitive support.
|
|

Note: this operation can't be previewed."/>
|
|
</Border>
|
|
<Grid
|
|
RowDefinitions="Auto,10,Auto,10,Auto,10,Auto"
|
|
ColumnDefinitions="Auto,10,*,5,35">
|
|
<TextBlock
|
|
Grid.Row="0"
|
|
Grid.Column="0"
|
|
VerticalAlignment="Center"
|
|
Text="Tip diameter:" />
|
|
<NumericUpDown Grid.Row="0" Grid.Column="2" Grid.ColumnSpan="3"
|
|
Classes="ValueLabel ValueLabel_px"
|
|
Minimum="1"
|
|
Maximum="255"
|
|
Value="{Binding DrawingPixelSupport.TipDiameter}"/>
|
|
|
|
<TextBlock
|
|
Grid.Row="2"
|
|
Grid.Column="0"
|
|
VerticalAlignment="Center"
|
|
Text="Pillar diameter:" />
|
|
<NumericUpDown Grid.Row="2" Grid.Column="2" Grid.ColumnSpan="3"
|
|
Classes="ValueLabel ValueLabel_px"
|
|
Minimum="1"
|
|
Maximum="255"
|
|
Value="{Binding DrawingPixelSupport.PillarDiameter}"/>
|
|
|
|
<TextBlock
|
|
Grid.Row="4"
|
|
Grid.Column="0"
|
|
VerticalAlignment="Center"
|
|
Text="Base diameter:" />
|
|
<NumericUpDown Grid.Row="4" Grid.Column="2" Grid.ColumnSpan="3"
|
|
Classes="ValueLabel ValueLabel_px"
|
|
Minimum="1"
|
|
Maximum="255"
|
|
Value="{Binding DrawingPixelSupport.BaseDiameter}"/>
|
|
|
|
<TextBlock
|
|
Grid.Row="6"
|
|
Grid.Column="0"
|
|
VerticalAlignment="Center"
|
|
Text="Pixel brightness:" />
|
|
<NumericUpDown Grid.Row="6" Grid.Column="2"
|
|
Classes="ValueLabel ValueLabel_sun"
|
|
Minimum="0"
|
|
Maximum="255"
|
|
|
|
Value="{Binding DrawingPixelSupport.PixelBrightness}"/>
|
|
<TextBlock
|
|
Grid.Row="6"
|
|
Grid.Column="4"
|
|
VerticalAlignment="Center"
|
|
Text="{Binding DrawingPixelSupport.PixelBrightnessPercent, StringFormat={}{0:0}%}" />
|
|
|
|
</Grid>
|
|
</StackPanel>
|
|
|
|
</TabItem>
|
|
|
|
<!-- Drain holes !-->
|
|
<TabItem
|
|
ToolTip.Tip="Drain holes"
|
|
>
|
|
<TabItem.Header>
|
|
<StackPanel VerticalAlignment="Center" Orientation="Horizontal" Spacing="5">
|
|
<i:Icon Value="fa-solid fa-ring"/>
|
|
<TextBlock IsVisible="{Binding $parent[TabItem].IsSelected}" Text="Drain holes" />
|
|
</StackPanel>
|
|
</TabItem.Header>
|
|
|
|
<StackPanel Spacing="10">
|
|
<Border Background="{DynamicResource LightBackground}" BorderThickness="1" BorderBrush="Black">
|
|
<TextBlock Padding="10" Text="Shift+click to add a vertical drain hole.
|
|

Note: this operation can't be previewed."/>
|
|
</Border>
|
|
<Grid
|
|
RowDefinitions="Auto"
|
|
ColumnDefinitions="Auto,10,*">
|
|
<TextBlock
|
|
Grid.Row="0"
|
|
Grid.Column="0"
|
|
VerticalAlignment="Center"
|
|
Text="Hole diameter:" />
|
|
<NumericUpDown Grid.Row="0" Grid.Column="2"
|
|
Classes="ValueLabel ValueLabel_px"
|
|
Minimum="20"
|
|
Maximum="255"
|
|
Value="{Binding DrawingPixelDrainHole.Diameter}"/>
|
|
</Grid>
|
|
</StackPanel>
|
|
|
|
</TabItem>
|
|
|
|
</TabControl>
|
|
|
|
<!-- Toolbar !-->
|
|
<StackPanel
|
|
Grid.Row="2"
|
|
Orientation="Horizontal" Spacing="1">
|
|
<uc:ButtonWithIcon IsEnabled="{Binding #DrawingsGrid.SelectedItem, Converter={x:Static ObjectConverters.IsNotNull}}"
|
|
Icon="fa-solid fa-trash-alt"
|
|
Spacing="5"
|
|
Text="Remove"
|
|
Command="{Binding OnClickDrawingRemove}"/>
|
|
|
|
<uc:ButtonWithIcon IsEnabled="{Binding Drawings.Count}"
|
|
Icon="fa-solid fa-xmark"
|
|
Spacing="5"
|
|
Text="Clear"
|
|
Command="{Binding OnClickDrawingClear}"/>
|
|
</StackPanel>
|
|
|
|
<StackPanel
|
|
Grid.Row="2"
|
|
HorizontalAlignment="Right"
|
|
Orientation="Horizontal"
|
|
Spacing="10" >
|
|
|
|
<uc:ButtonWithIcon IsEnabled="{Binding Drawings.Count}"
|
|
Icon="fa-solid fa-check"
|
|
Spacing="5"
|
|
Text="{Binding Drawings.Count, StringFormat=Apply {0} operations}"
|
|
Command="{Binding DrawModifications}"
|
|
CommandParameter="false"/>
|
|
</StackPanel>
|
|
|
|
<DataGrid
|
|
Name="DrawingsGrid"
|
|
Grid.Row="3"
|
|
CanUserReorderColumns="True"
|
|
CanUserResizeColumns="True"
|
|
CanUserSortColumns="True"
|
|
GridLinesVisibility="Horizontal"
|
|
SelectionMode="Extended"
|
|
IsReadOnly="True"
|
|
ClipboardCopyMode="IncludeHeader"
|
|
Items="{Binding Drawings}">
|
|
<DataGrid.Columns>
|
|
<DataGridTextColumn Header="#"
|
|
Binding="{Binding Index}"
|
|
Width="Auto" />
|
|
<DataGridTextColumn Header="Operation"
|
|
Binding="{Binding OperationType}"
|
|
Width="Auto" />
|
|
<DataGridTextColumn Header="Layer"
|
|
Binding="{Binding LayerIndex}"
|
|
Width="Auto" />
|
|
<DataGridTextColumn Header="Position (X, Y)"
|
|
Binding="{Binding Location}"
|
|
Width="Auto" />
|
|
</DataGrid.Columns>
|
|
|
|
</DataGrid>
|
|
|
|
</Grid>
|
|
|
|
</TabItem>
|
|
|
|
|
|
<TabItem
|
|
Name="TabClipboard"
|
|
IsEnabled="{Binding IsFileLoaded}"
|
|
ToolTip.Tip="Clipboard">
|
|
<TabItem.Header>
|
|
<StackPanel VerticalAlignment="Center" Orientation="Horizontal">
|
|
<i:Icon Value="fa-solid fa-clipboard-list"/>
|
|
<!--<TextBlock Margin="5,0,0,0">Clipboard</TextBlock>!-->
|
|
</StackPanel>
|
|
</TabItem.Header>
|
|
|
|
<Grid>
|
|
<Grid.RowDefinitions>
|
|
<RowDefinition Height="Auto"/>
|
|
<RowDefinition Height="*" MinHeight="140"/>
|
|
<RowDefinition Height="Auto"/>
|
|
<RowDefinition Height="*" MinHeight="180"/>
|
|
</Grid.RowDefinitions>
|
|
<StackPanel Orientation="Horizontal" Spacing="2">
|
|
|
|
<Button IsEnabled="{Binding Clipboard.CanUndo}"
|
|
Command="{Binding ClipboardUndo}"
|
|
HotKey="Ctrl + Z"
|
|
ToolTip.Tip="Undo [Ctrl + Z]
|
|

Shift + Click to Undo and edit last operation [Ctrl + Shift + Z]"
|
|
i:Attached.Icon="fa-solid fa-undo-alt"/>
|
|
|
|
<TextBlock VerticalAlignment="Center">
|
|
<TextBlock.Text>
|
|
<MultiBinding StringFormat="{}{0}/{1}">
|
|
<Binding Path="Clipboard.CurrentIndexCountStr"/>
|
|
<Binding Path="Clipboard.Items.Count"/>
|
|
</MultiBinding>
|
|
</TextBlock.Text>
|
|
</TextBlock>
|
|
|
|
<Button
|
|
IsEnabled="{Binding Clipboard.CanRedo}"
|
|
Command="{Binding ClipboardRedo}"
|
|
HotKey="Ctrl + Y"
|
|
ToolTip.Tip="Redo [Ctrl + Y]"
|
|
i:Attached.Icon="fa-solid fa-redo-alt"/>
|
|
|
|
</StackPanel>
|
|
|
|
<StackPanel Grid.Row="0" Orientation="Horizontal" Spacing="2" HorizontalAlignment="Right">
|
|
<Button
|
|
IsEnabled="{Binding Clipboard.Items.Count}"
|
|
Command="{Binding ClipboardClear}"
|
|
ToolTip.Tip="Clear all clips"
|
|
i:Attached.Icon="fa-solid fa-xmark"/>
|
|
</StackPanel>
|
|
|
|
<ListBox
|
|
Grid.Row="1"
|
|
Name="ClipboardList"
|
|
SelectionMode="Single"
|
|
AutoScrollToSelectedItem="True"
|
|
SelectedIndex="{Binding Clipboard.CurrentIndex}"
|
|
Items="{Binding Clipboard.Items}" />
|
|
|
|
<GridSplitter Grid.Row="2" ResizeBehavior="PreviousAndNext" ResizeDirection="Rows"/>
|
|
|
|
<Grid Grid.Row="3" RowDefinitions="Auto,*" ColumnDefinitions="*">
|
|
<Grid Grid.Row="0"
|
|
RowDefinitions="Auto"
|
|
ColumnDefinitions="Auto,*,Auto">
|
|
<TextBlock Grid.Row="0" Grid.Column="0"
|
|
VerticalAlignment="Center"
|
|
Text="{Binding Logs.Count, StringFormat=Operations: {0}}"/>
|
|
|
|
<TextBlock Grid.Row="0" Grid.Column="1"
|
|
HorizontalAlignment="Center"
|
|
VerticalAlignment="Center"
|
|
FontWeight="Bold" Text="Logs"/>
|
|
|
|
<StackPanel Grid.Row="0" Grid.Column="2" Orientation="Horizontal"
|
|
Spacing="5"
|
|
HorizontalAlignment="Right">
|
|
<CheckBox VerticalAlignment="Center"
|
|
ToolTip.Tip="Shows extra information useful to debug problems."
|
|
IsChecked="{Binding IsVerbose}"
|
|
Content="Verbose"/>
|
|
|
|
<Button VerticalAlignment="Center"
|
|
Command="{Binding Logs.Clear}"
|
|
ToolTip.Tip="Clear all logs"
|
|
i:Attached.Icon="fa-solid fa-xmark"/>
|
|
</StackPanel>
|
|
|
|
</Grid>
|
|
|
|
<DataGrid Grid.Row="1" Items="{Binding Logs}"
|
|
VerticalAlignment="Stretch"
|
|
CanUserReorderColumns="True"
|
|
CanUserResizeColumns="True"
|
|
CanUserSortColumns="True"
|
|
GridLinesVisibility="All"
|
|
IsReadOnly="True"
|
|
ClipboardCopyMode="IncludeHeader"
|
|
SelectionMode="Extended">
|
|
<DataGrid.Columns>
|
|
<DataGridTextColumn Header="#"
|
|
Binding="{Binding Index}"
|
|
Width="Auto" />
|
|
<DataGridTextColumn Header="Started"
|
|
Binding="{Binding StartTime}"
|
|
Width="Auto" />
|
|
<DataGridTextColumn Header="Time(s)"
|
|
Binding="{Binding ElapsedTime}"
|
|
Width="Auto" />
|
|
<DataGridTextColumn Header="Description"
|
|
Binding="{Binding Description}"
|
|
Width="Auto" />
|
|
</DataGrid.Columns>
|
|
</DataGrid>
|
|
</Grid>
|
|
|
|
</Grid>
|
|
|
|
|
|
</TabItem>
|
|
|
|
</TabControl>
|
|
|
|
<Grid
|
|
IsEnabled="{Binding IsFileLoaded}"
|
|
DockPanel.Dock="Right"
|
|
ColumnDefinitions="160"
|
|
RowDefinitions="Auto,Auto,*,Auto,Auto,Auto,Auto,Auto" Margin="5">
|
|
<TextBlock
|
|
Text="{Binding MaximumLayerString}"
|
|
Name="Layer.Navigation.Up"
|
|
Margin="0,0,0,10"
|
|
HorizontalAlignment="Center"
|
|
TextAlignment="Center"
|
|
Grid.Row="0"/>
|
|
<RepeatButton
|
|
Grid.Row="1"
|
|
ToolTip.Tip="Navigate to up layer [Ctrl + Up]"
|
|
HotKey="Ctrl + Up"
|
|
Interval="100"
|
|
HorizontalAlignment="Stretch"
|
|
IsEnabled="{Binding CanGoUp}"
|
|
Command="{Binding GoNextLayer}"
|
|
i:Attached.Icon="fa-solid fa-angle-up"/>
|
|
|
|
<Grid
|
|
Name="LayerNavigationSliderGrid"
|
|
Grid.Row="2" ColumnDefinitions="*,20,40">
|
|
<Panel
|
|
Grid.Column="0"
|
|
Name="LayerNavigationTooltipPanel"
|
|
Margin="{Binding LayerNavigationTooltipMargin}"
|
|
HorizontalAlignment="Stretch">
|
|
<Border
|
|
Name="Layer.Navigation.Tooltip.Border"
|
|
Classes="LayerNavigationToolTip"
|
|
VerticalAlignment="Top">
|
|
<TextBlock Padding="2" Text="{Binding ActualLayerTooltip}"/>
|
|
</Border>
|
|
</Panel>
|
|
|
|
<!--<Image
|
|
Grid.Column="1"
|
|
Name="Layer.Navigation.Issues" Width="16"></Image>!-->
|
|
|
|
<Canvas
|
|
Grid.Column="1"
|
|
Margin="0,15"
|
|
Classes="IssuesTrackerCanvas"
|
|
Name="Layer.Navigation.IssuesCanvas" Width="20"/>
|
|
|
|
<Slider
|
|
Grid.Column="2"
|
|
Name="Layer.Navigation.Slider"
|
|
Minimum="0"
|
|
Maximum="{Binding SliderMaximumValue}"
|
|
Value="{Binding ActualLayerSlider}"
|
|
TickFrequency="1"
|
|
TickPlacement="Outside"
|
|
SmallChange="1"
|
|
LargeChange="10"
|
|
IsSnapToTickEnabled="True"
|
|
Margin="0,5"
|
|
HorizontalAlignment="Right"
|
|
Orientation="Vertical"/>
|
|
</Grid>
|
|
|
|
<RepeatButton
|
|
Grid.Row="3"
|
|
ToolTip.Tip="Navigate to down layer [Ctrl + Down]"
|
|
HotKey="Ctrl + Down"
|
|
Interval="100"
|
|
HorizontalAlignment="Stretch"
|
|
IsEnabled="{Binding CanGoDown}"
|
|
Command="{Binding GoPreviousLayer}"
|
|
i:Attached.Icon="fa-solid fa-angle-down"/>
|
|
|
|
<NumericUpDown Grid.Row="4"
|
|
Margin="0,5"
|
|
Minimum="0"
|
|
Maximum="{Binding SliderMaximumValue}"
|
|
Value="{Binding ActualLayer}" />
|
|
|
|
<Grid Grid.Row="5" RowDefinitions="*" ColumnDefinitions="30,*,30">
|
|
<Button Grid.Column="0"
|
|
ToolTip.Tip="Navigate to first layer [Ctrl + Left]"
|
|
HotKey="Ctrl + Left"
|
|
IsEnabled="{Binding CanGoDown}"
|
|
Command="{Binding GoFirstLayer}"
|
|
i:Attached.Icon="fa-solid fa-angle-double-down"/>
|
|
|
|
<TextBlock
|
|
Grid.Column="1"
|
|
Text="{Binding MinimumLayerString}"
|
|
VerticalAlignment="Center"
|
|
HorizontalAlignment="Center"
|
|
TextAlignment="Center"/>
|
|
|
|
<Button
|
|
Grid.Column="2"
|
|
ToolTip.Tip="Navigate to last layer [Ctrl + Right]"
|
|
HotKey="Ctrl + Right"
|
|
IsEnabled="{Binding CanGoUp}"
|
|
Command="{Binding GoLastLayer}"
|
|
i:Attached.Icon="fa-solid fa-angle-double-up"/>
|
|
</Grid>
|
|
|
|
<StackPanel Grid.Row="6"
|
|
Margin="0,1,0,0"
|
|
HorizontalAlignment="Center"
|
|
VerticalAlignment="Center"
|
|
Orientation="Horizontal" Spacing="1">
|
|
<Button
|
|
ToolTip.Tip="Navigate to the smallest bottom layer in mass"
|
|
Command="{Binding GoMassLayer}"
|
|
CommandParameter="SB"
|
|
Content="SB"/>
|
|
|
|
<Button
|
|
ToolTip.Tip="Navigate to the largest bottom layer in mass"
|
|
Command="{Binding GoMassLayer}"
|
|
CommandParameter="LB"
|
|
Content="LB"/>
|
|
|
|
<Button
|
|
ToolTip.Tip="Navigate to the smallest normal layer in mass"
|
|
Command="{Binding GoMassLayer}"
|
|
CommandParameter="SN"
|
|
Content="SN"/>
|
|
|
|
<Button
|
|
ToolTip.Tip="Navigate to the largest normal layer in mass"
|
|
Command="{Binding GoMassLayer}"
|
|
CommandParameter="LN"
|
|
Content="LN"/>
|
|
</StackPanel>
|
|
|
|
</Grid>
|
|
|
|
|
|
<!--<StackPanel DockPanel.Dock="Top" Orientation="Horizontal">
|
|
<Button Name="zoomtofit">Zoom to fit</Button>
|
|
<Button Name="center">Center image</Button>
|
|
</StackPanel>-->
|
|
|
|
<Grid IsEnabled="{Binding IsFileLoaded}"
|
|
ColumnDefinitions="*" RowDefinitions="Auto,*,Auto" Margin="5">
|
|
<Grid Grid.Row="0" Grid.Column="0"
|
|
IsEnabled="{Binding IsFileLoaded}"
|
|
ColumnDefinitions="*,Auto" RowDefinitions="Auto" Margin="0,5,0,5">
|
|
<WrapPanel Grid.Row="0" Grid.Column="0" HorizontalAlignment="Left" Orientation="Horizontal">
|
|
<uc:ToggleButtonWithIcon
|
|
IsChecked="{Binding ShowLayerImageRotated}"
|
|
HotKey="Ctrl + R"
|
|
VerticalAlignment="Stretch"
|
|
ToolTip.Tip="Auto rotate layer preview image at 90º (This can slow down the layer preview) [CTRL+R]"
|
|
Margin="0,0,1,0"
|
|
Text="Rotate ⮟"
|
|
Spacing="5"
|
|
Icon="fa-solid fa-sync-alt">
|
|
<uc:ToggleButtonWithIcon.ContextMenu>
|
|
<ContextMenu PlacementMode="Bottom">
|
|
<RadioButton
|
|
GroupName="ShowLayerImageRotateDirection"
|
|
IsChecked="{Binding ShowLayerImageRotateCWDirection}"
|
|
Content="90º Clockwise (CW)"/>
|
|
<RadioButton
|
|
GroupName="ShowLayerImageRotateDirection"
|
|
IsChecked="{Binding ShowLayerImageRotateCCWDirection}"
|
|
Content="90º Counter-clockwise (CCW)"/>
|
|
</ContextMenu>
|
|
</uc:ToggleButtonWithIcon.ContextMenu>
|
|
</uc:ToggleButtonWithIcon>
|
|
|
|
|
|
<uc:ToggleButtonWithIcon
|
|
IsChecked="{Binding ShowLayerImageFlipped}"
|
|
HotKey="Ctrl + F"
|
|
VerticalAlignment="Stretch"
|
|
ToolTip.Tip="Auto flip layer preview image (This can slow down the layer preview) [CTRL+F]"
|
|
Margin="0,0,1,0"
|
|
Text="Flip ⮟"
|
|
Spacing="5"
|
|
Icon="mdi-flip-horizontal">
|
|
<uc:ToggleButtonWithIcon.ContextMenu>
|
|
<ContextMenu PlacementMode="Bottom">
|
|
<CheckBox
|
|
IsChecked="{Binding ShowLayerImageFlippedHorizontally}"
|
|
Content="Horizontally"/>
|
|
<CheckBox
|
|
IsChecked="{Binding ShowLayerImageFlippedVertically}"
|
|
Content="Vertically"/>
|
|
</ContextMenu>
|
|
</uc:ToggleButtonWithIcon.ContextMenu>
|
|
</uc:ToggleButtonWithIcon>
|
|
|
|
|
|
<uc:ToggleButtonWithIcon
|
|
IsChecked="{Binding ShowLayerImageDifference}"
|
|
ToolTip.Tip="Show layer differences where darker pixels were also present on previous layer and the white pixels the difference between previous and current layer."
|
|
VerticalAlignment="Stretch"
|
|
Margin="0,0,1,0"
|
|
Text="Difference ⮟"
|
|
Spacing="5"
|
|
Icon="fa-solid fa-layer-group">
|
|
<uc:ToggleButtonWithIcon.ContextMenu>
|
|
<ContextMenu PlacementMode="Bottom">
|
|
<CheckBox
|
|
Content="Show layer similarity instead of difference"
|
|
ToolTip.Tip="If enabled, it will recolor the current layer pixels in common with the previous and next layer"
|
|
IsChecked="{Binding Settings.LayerPreview.LayerDifferenceHighlightSimilarityInstead}"/>
|
|
</ContextMenu>
|
|
</uc:ToggleButtonWithIcon.ContextMenu>
|
|
</uc:ToggleButtonWithIcon>
|
|
|
|
<uc:ToggleButtonWithIcon
|
|
IsChecked="{Binding ShowLayerImageIssues}"
|
|
ToolTip.Tip="Highlight Issues on current layer. Valid only if Issues are calculated."
|
|
VerticalAlignment="Stretch"
|
|
Margin="0,0,1,0"
|
|
Text="Issues ⮟"
|
|
Spacing="5"
|
|
Icon="fa-solid fa-radiation-alt">
|
|
<Button.ContextMenu>
|
|
<ContextMenu PlacementMode="Bottom">
|
|
<CheckBox
|
|
ToolTip.Tip="Show crosshairs for selected issues on the current layer"
|
|
IsChecked="{Binding ShowLayerImageCrosshairs}">
|
|
<StackPanel Orientation="Horizontal">
|
|
<i:Icon Value="fa-solid fa-crosshairs"/>
|
|
<TextBlock Margin="5,0,5,0" Text="Crosshairs"/>
|
|
</StackPanel>
|
|
</CheckBox>
|
|
|
|
</ContextMenu>
|
|
</Button.ContextMenu>
|
|
</uc:ToggleButtonWithIcon>
|
|
|
|
|
|
<uc:ButtonWithIcon Name="LayerPreviewOutlineButton"
|
|
ToolTip.Tip="Click to access the various outlines."
|
|
Command="{Binding OpenContextMenu}"
|
|
CommandParameter="LayerPreviewOutline"
|
|
VerticalAlignment="Stretch"
|
|
Margin="1,0,2,0"
|
|
Text="Outline ⮟"
|
|
Spacing="5"
|
|
Icon="fa-solid fa-vector-square">
|
|
<uc:ButtonWithIcon.ContextMenu>
|
|
<ContextMenu Name="LayerPreviewOutlineContextMenu" PlacementMode="Bottom">
|
|
<CheckBox
|
|
IsChecked="{Binding ShowLayerOutlinePrintVolumeBoundary}"
|
|
Content="Print volume boundary"/>
|
|
<CheckBox
|
|
IsChecked="{Binding ShowLayerOutlineLayerBoundary}"
|
|
Content="Layer boundary"/>
|
|
<CheckBox
|
|
IsChecked="{Binding ShowLayerOutlineContourBoundary}"
|
|
Content="Blob boundary"/>
|
|
<CheckBox
|
|
IsChecked="{Binding ShowLayerOutlineHollowAreas}"
|
|
Content="Hollow areas"/>
|
|
<CheckBox
|
|
IsChecked="{Binding ShowLayerOutlineCentroids}"
|
|
Content="Centroids"/>
|
|
<CheckBox
|
|
IsChecked="{Binding ShowLayerOutlineEdgeDetection}"
|
|
Content="Edge detection">
|
|
<CheckBox.IsEnabled>
|
|
<MultiBinding Converter="{x:Static BoolConverters.And}">
|
|
<Binding Path="!ShowLayerOutlineDistanceDetection"/>
|
|
<Binding Path="!ShowLayerOutlineSkeletonize"/>
|
|
</MultiBinding>
|
|
</CheckBox.IsEnabled>
|
|
</CheckBox>
|
|
<CheckBox
|
|
IsChecked="{Binding ShowLayerOutlineDistanceDetection}"
|
|
ToolTip.Tip="Calculates the distance to the closest zero pixel for each pixel"
|
|
Content="Distance detection">
|
|
<CheckBox.IsEnabled>
|
|
<MultiBinding Converter="{x:Static BoolConverters.And}">
|
|
<Binding Path="!ShowLayerOutlineEdgeDetection"/>
|
|
<Binding Path="!ShowLayerOutlineSkeletonize"/>
|
|
</MultiBinding>
|
|
</CheckBox.IsEnabled>
|
|
</CheckBox>
|
|
<CheckBox
|
|
IsChecked="{Binding ShowLayerOutlineSkeletonize}"
|
|
Content="Skeletonize">
|
|
<CheckBox.IsEnabled>
|
|
<MultiBinding Converter="{x:Static BoolConverters.And}">
|
|
<Binding Path="!ShowLayerOutlineEdgeDetection"/>
|
|
<Binding Path="!ShowLayerOutlineDistanceDetection"/>
|
|
</MultiBinding>
|
|
</CheckBox.IsEnabled>
|
|
</CheckBox>
|
|
</ContextMenu>
|
|
</uc:ButtonWithIcon.ContextMenu>
|
|
</uc:ButtonWithIcon>
|
|
|
|
|
|
<uc:ToggleButtonWithIcon
|
|
IsChecked="{Binding IsPixelEditorActive}"
|
|
ToolTip.Tip="Edit layer image: Draw pixels, add supports and/or drain holes."
|
|
VerticalAlignment="Stretch"
|
|
Margin="-1,0,0,0"
|
|
Text="Pixel editor"
|
|
Spacing="5"
|
|
Icon="fa-solid fa-drafting-compass"/>
|
|
</WrapPanel>
|
|
|
|
|
|
<StackPanel Grid.Row="0" Grid.Column="1" HorizontalAlignment="Right" Orientation="Horizontal">
|
|
<uc:ButtonWithIcon Name="LayerActionsButton"
|
|
Command="{Binding OpenContextMenu}"
|
|
VerticalAlignment="Stretch"
|
|
VerticalContentAlignment="Center"
|
|
CommandParameter="LayerActions"
|
|
Text="Actions ⮟"
|
|
Spacing="5"
|
|
Icon="mdi-layers-edit">
|
|
<uc:ButtonWithIcon.ContextMenu>
|
|
<ContextMenu Name="LayerActionsContextMenu" PlacementMode="Bottom" Items="{Binding LayerActionsMenu}"/>
|
|
</uc:ButtonWithIcon.ContextMenu>
|
|
</uc:ButtonWithIcon>
|
|
|
|
<Button
|
|
Command="{Binding ShowLayer}"
|
|
HotKey="F5"
|
|
ToolTip.Tip="Refresh current layer [F5]"
|
|
VerticalAlignment="Stretch"
|
|
Margin="1,0,0,0"
|
|
i:Attached.Icon="fa-solid fa-sync-alt"/>
|
|
|
|
<uc:ButtonWithIcon
|
|
Command="{Binding SaveCurrentLayerImage}"
|
|
ToolTip.Tip="Save layer image to a file"
|
|
VerticalAlignment="Stretch"
|
|
VerticalContentAlignment="Center"
|
|
Margin="1,0,0,0"
|
|
Text="⮟"
|
|
Spacing="3"
|
|
Icon="fa-solid fa-floppy-disk">
|
|
<uc:ButtonWithIcon.ContextMenu>
|
|
<ContextMenu PlacementMode="Bottom">
|
|
<MenuItem
|
|
Command="{Binding SaveCurrentROIImage}"
|
|
Header="Save the selected region (ROI)"
|
|
i:MenuItem.Icon="fa-regular fa-object-group"/>
|
|
</ContextMenu>
|
|
</uc:ButtonWithIcon.ContextMenu>
|
|
</uc:ButtonWithIcon>
|
|
|
|
|
|
</StackPanel>
|
|
</Grid>
|
|
|
|
<Border
|
|
Grid.Row="1"
|
|
BorderBrush="{DynamicResource LightBackground}"
|
|
BorderThickness="5">
|
|
<uvtava:AdvancedImageBox
|
|
ShowGrid="{Binding Settings.LayerPreview.ShowBackgroudGrid}"
|
|
GridCellSize="15"
|
|
GridColor="{DynamicResource AdvancedImageBoxGridColor}"
|
|
GridColorAlternate="{DynamicResource AdvancedImageBoxGridAlternateColor}"
|
|
Name="LayerImage"/>
|
|
</Border>
|
|
|
|
|
|
<Canvas Grid.Row="1" Margin="20"
|
|
IsVisible="{Binding IsTooltipOverlayVisible}">
|
|
<Border BorderThickness="1"
|
|
BorderBrush="Black"
|
|
Background="{Binding Settings.LayerPreview.TooltipOverlayBackgroundBrush}"
|
|
Padding="10"
|
|
CornerRadius="5">
|
|
<TextBlock Text="{Binding TooltipOverlayText}" Foreground="Black" />
|
|
</Border>
|
|
</Canvas>
|
|
|
|
|
|
|
|
<Grid
|
|
IsEnabled="{Binding IsFileLoaded}"
|
|
Grid.Row="2"
|
|
ColumnDefinitions="4*,2*" RowDefinitions="Auto" Margin="5">
|
|
<WrapPanel Orientation="Horizontal">
|
|
<StackPanel
|
|
ToolTip.Tip="Number of pixels to cure on this layer image and the percentage of them against total lcd pixels and the total cured millimeters."
|
|
VerticalAlignment="Center" Orientation="Horizontal" Spacing="5">
|
|
<i:Icon Value="mdi-google-downasaur"/>
|
|
<TextBlock Text="{Binding LayerPixelCountStr}"/>
|
|
</StackPanel>
|
|
|
|
<uc:ButtonWithIcon
|
|
ToolTip.Tip="Object volume bounds for current layer, position and size in pixels and millimeters.
|
|

Click: go to region"
|
|
Command="{Binding ZoomToFitPrintVolume}"
|
|
Margin="5,0,0,0"
|
|
Text="{Binding LayerBoundsStr}"
|
|
Spacing="5"
|
|
Icon="fa-solid fa-expand"/>
|
|
|
|
<uc:ButtonWithIcon
|
|
IsEnabled="{Binding IsFileLoaded}"
|
|
Margin="2,0,0,0"
|
|
Command="{Binding OnROIClick}"
|
|
ToolTip.Tip="Region of interest selection over layer.
|
|

(NS): Not selected
|
|

Click: go to region
|
|

ESC: Clear ROI & Masks | ESC + Shift: Clear ROI"
|
|
Text="{Binding LayerROIStr}"
|
|
Spacing="5"
|
|
Icon="fa-regular fa-object-group">
|
|
<uc:ButtonWithIcon.ContextMenu>
|
|
<ContextMenu Name="ROIContextMenu" PlacementMode="Top">
|
|
<MenuItem
|
|
Command="{Binding SelectLayerPositiveAreasMask}"
|
|
Header="Mask: Select layer positive areas"/>
|
|
<MenuItem
|
|
Command="{Binding SelectLayerHollowAreasMask}"
|
|
Header="Mask: Select layer hollow areas"/>
|
|
<Separator/>
|
|
<MenuItem
|
|
Command="{Binding SelectModelVolumeRoi}"
|
|
Header="ROI: Select model volume"/>
|
|
<MenuItem
|
|
Command="{Binding SelectLayerVolumeRoi}"
|
|
Header="ROI: Select layer volume"/>
|
|
<Separator/>
|
|
<MenuItem
|
|
Command="{Binding ClearMask}"
|
|
Header="Clear Mask"/>
|
|
<MenuItem
|
|
Command="{Binding ClearROI}"
|
|
Header="Clear ROI"/>
|
|
</ContextMenu>
|
|
</uc:ButtonWithIcon.ContextMenu>
|
|
</uc:ButtonWithIcon>
|
|
|
|
</WrapPanel>
|
|
|
|
<WrapPanel Grid.Column="1" VerticalAlignment="Center" HorizontalAlignment="Right" Orientation="Horizontal">
|
|
<uc:ButtonWithIcon
|
|
IsEnabled="{Binding LayerPixelPicker.IsSet}"
|
|
Command="{Binding OnLayerPixelPickerClicked}"
|
|
ToolTip.Tip="Pixel picker:
|
|

Use CONTROL and over a pixel to get his position and brightness.
|
|

Click: Center at position"
|
|
Text="{Binding LayerPixelPicker}"
|
|
Spacing="5"
|
|
Icon="fa-solid fa-map-marker-alt"/>
|
|
|
|
<uc:ButtonWithIcon
|
|
ToolTip.Tip="Layer image zoom level, use mouse scroll to zoom in/out into image.
|
|

Click to set zoom to 100%
|
|

Shift+Click to set zoom to defined value
|
|

Ctrl + 0 OR double right click to scale to fit"
|
|
Margin="2,0,0,0"
|
|
Command="{Binding ZoomToNormal}"
|
|
Text="{Binding LayerZoomStr}"
|
|
Spacing="5"
|
|
Icon="fa-solid fa-search-plus"/>
|
|
|
|
<uc:ButtonWithIcon
|
|
ToolTip.Tip="Layer Resolution and display size.
|
|

Click: Zoom to fit"
|
|
Command="{Binding ZoomToFitSimple}"
|
|
Margin="2,0,0,0"
|
|
Text="{Binding LayerResolutionStr}"
|
|
Spacing="5"
|
|
Icon="fa-solid fa-expand"/>
|
|
|
|
|
|
<TextBlock
|
|
ToolTip.Tip="Layer preview computation time."
|
|
Margin="5,0,0,0"
|
|
VerticalAlignment="Center" Text="{Binding ShowLayerRenderMs, StringFormat={}{0}ms}"/>
|
|
</WrapPanel>
|
|
</Grid>
|
|
</Grid>
|
|
|
|
|
|
</DockPanel>
|
|
<Grid Grid.Row="0" Grid.Column="0"
|
|
RowDefinitions="*,Auto,*" ColumnDefinitions="*,Auto,*"
|
|
IsEnabled="{Binding IsProgressVisible}"
|
|
IsVisible="{Binding IsProgressVisible}">
|
|
<Border Grid.Row="1" Grid.Column="1" MinWidth="450"
|
|
Classes="ProgressLoading"
|
|
|
|
BorderThickness="5"
|
|
CornerRadius="5">
|
|
<Grid RowDefinitions="Auto,Auto,Auto,Auto"
|
|
ColumnDefinitions="*">
|
|
<TextBlock
|
|
Grid.Row="0"
|
|
Margin="10" Text="{Binding Progress.Title}"/>
|
|
<TextBlock
|
|
Grid.Row="1"
|
|
Margin="10,0,10,10" Text="{Binding Progress.ElapsedTimeStr, StringFormat=Elapsed Time: {0}}"/>
|
|
<TextBlock
|
|
Grid.Row="2"
|
|
Margin="10,0,10,10" Text="{Binding Progress.Description}" HorizontalAlignment="Center"/>
|
|
|
|
<Grid
|
|
Grid.Row="3"
|
|
RowDefinitions="30" ColumnDefinitions="*,100">
|
|
<ProgressBar
|
|
Grid.Column="0"
|
|
Minimum="0"
|
|
Maximum="100"
|
|
VerticalAlignment="Stretch"
|
|
IsIndeterminate="{Binding Progress.IsIndeterminate}"
|
|
Value="{Binding Progress.ProgressPercent}" ShowProgressText="True"/>
|
|
<Button
|
|
IsEnabled="{Binding Progress.CanCancel}"
|
|
Command="{Binding ProgressOnClickCancel}"
|
|
Grid.Column="1"
|
|
IsCancel="True"
|
|
VerticalAlignment="Stretch"
|
|
HorizontalAlignment="Stretch"
|
|
VerticalContentAlignment="Center"
|
|
HorizontalContentAlignment="Center"
|
|
Content="Cancel"/>
|
|
</Grid>
|
|
</Grid>
|
|
</Border>
|
|
</Grid>
|
|
</Grid>
|
|
</uc:WindowEx>
|