Files
UVtools/UVtools.WPF/Controls/Calibrators/CalibrateExposureFinderControl.axaml
Tiago Conceição 15c500ecaf v3.5.0
- **PCB Exposure:**
   - (Add) Able to select multiple files and create a layer per file or merge them into one layer
   - (Add) Able to import files from a zip file
   - (Improvement) Round pixel coordinates and line thickness
   - (Improvement) Better position precision for primitives
   - (Improvement) Disable the ok button if no files were selected
   - (Change) Do not auto mirror based on printer lcd mirror type
   - (Fix) Limit line thickness to 1px minimum
   - (Fix) Allow leading zero omit from XY coordinates (#492)
   - (Fix) Mirror option was shifting the board position
- (Add) Calibrate - Blooming effect: Generates test models with various strategies and increments to measure the blooming effect
- (Add) Setting: Issues - Default order by, changes the default order on the issues list (#482)
- (Improvement) CTBv4 and encrypted: Fetch `BottomWaitTimes` virtual property from first bottom layer that has at least 2 pixels (#483)
- (Fix) Linux: Enable desktop integration for AppImages (#490)
- (Fix) Extracting zip contents inside folders would cause a error and not extract those contents
- (Upgrade) AvaloniaUI from 0.10.14 to 0.10.15 [Fixes auto-size problems]
2022-06-19 04:19:23 +01:00

1138 lines
55 KiB
XML

<UserControl 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"
mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"
x:Class="UVtools.WPF.Controls.Calibrators.CalibrateExposureFinderControl">
<Grid ColumnDefinitions="Auto,10,380">
<StackPanel Spacing="10">
<Expander
Header="Common properties"
IsExpanded="True">
<Grid
RowDefinitions="Auto,10,Auto,10,Auto,10,Auto,10,Auto,10,Auto,10,Auto"
ColumnDefinitions="Auto,10,190,20,Auto,10,190">
<TextBlock
Grid.Row="0" Grid.Column="0"
VerticalAlignment="Center"
ToolTip.Tip="The printer display width. Required to calculate the pixels per mm."
Text="Display width:"/>
<NumericUpDown Grid.Row="0" Grid.Column="2"
Classes="ValueLabel ValueLabel_mm"
Increment="0.1"
Minimum="0"
Maximum="10000"
FormatString="F2"
Value="{Binding Operation.DisplayWidth}"/>
<TextBlock Grid.Row="0" Grid.Column="4"
VerticalAlignment="Center"
ToolTip.Tip="The printer display height. Required to calculate the pixels per mm."
Text="Display height:"/>
<NumericUpDown Grid.Row="0" Grid.Column="6"
Classes="ValueLabel ValueLabel_mm"
Increment="0.1"
Minimum="0"
Maximum="10000"
FormatString="F2"
Value="{Binding Operation.DisplayHeight}"/>
<TextBlock Grid.Row="2" Grid.Column="0"
IsEnabled="{Binding !Operation.PatternModel}"
VerticalAlignment="Center"
Text="Layer height:"/>
<NumericUpDown Grid.Row="2" Grid.Column="2"
Classes="ValueLabel ValueLabel_mm"
IsEnabled="{Binding !Operation.PatternModel}"
Increment="0.01"
Minimum="0.01"
Maximum="0.30"
FormatString="F3"
Value="{Binding Operation.LayerHeight}"/>
<TextBlock Grid.Row="2" Grid.Column="4"
VerticalAlignment="Center"
Text="Bottom layers:"/>
<NumericUpDown Grid.Row="2" Grid.Column="6"
Classes="ValueLabel ValueLabel_layers"
Increment="1"
Minimum="1"
Maximum="1000"
Value="{Binding Operation.BottomLayers}"/>
<TextBlock Grid.Row="4" Grid.Column="0"
VerticalAlignment="Center"
Text="Bottom exposure:"/>
<NumericUpDown Grid.Row="4" Grid.Column="2"
Classes="ValueLabel ValueLabel_s"
Increment="0.5"
Minimum="0.1"
Maximum="200"
FormatString="F2"
Value="{Binding Operation.BottomExposure}"/>
<TextBlock Grid.Row="4" Grid.Column="4"
VerticalAlignment="Center"
Text="Normal exposure:"/>
<NumericUpDown Grid.Row="4" Grid.Column="6"
Classes="ValueLabel ValueLabel_s"
Increment="0.5"
Minimum="0.1"
Maximum="200"
FormatString="F2"
Value="{Binding Operation.NormalExposure}"/>
<TextBlock Grid.Row="6" Grid.Column="0"
VerticalAlignment="Center"
Text="Top/bottom margin:"/>
<NumericUpDown Grid.Row="6" Grid.Column="2"
Classes="ValueLabel ValueLabel_mm"
Increment="0.5"
Minimum="0"
Maximum="1000"
Value="{Binding Operation.TopBottomMargin}"/>
<TextBlock Grid.Row="6" Grid.Column="4"
VerticalAlignment="Center"
Text="Left/right margin:"/>
<NumericUpDown Grid.Row="6" Grid.Column="6"
Classes="ValueLabel ValueLabel_mm"
Increment="0.5"
Minimum="0"
Maximum="1000"
Value="{Binding Operation.LeftRightMargin}"/>
<TextBlock Grid.Row="8" Grid.Column="0"
VerticalAlignment="Center"
Text="Part margin:"/>
<NumericUpDown Grid.Row="8" Grid.Column="2"
Classes="ValueLabel ValueLabel_mm"
Increment="1"
Minimum="0"
Maximum="10000"
Value="{Binding Operation.PartMargin}"/>
<TextBlock Grid.Row="10" Grid.Column="0"
VerticalAlignment="Center"
ToolTip.Tip="Chamfer the bottom and top layers"
Text="Chamfer layers:"/>
<NumericUpDown Grid.Row="10" Grid.Column="2"
Classes="ValueLabel ValueLabel_layers"
Increment="1"
Minimum="0"
Maximum="255"
IsEnabled="{Binding Operation.ChamferModel}"
Value="{Binding Operation.ChamferLayers}"/>
<TextBlock Grid.Row="10" Grid.Column="4"
VerticalAlignment="Center"
ToolTip.Tip="Erode bottom iterations to counter the elephant foot"
Text="Erode bottom iter.:"/>
<NumericUpDown Grid.Row="10" Grid.Column="6"
Classes="ValueLabel ValueLabel_px"
Increment="1"
Minimum="0"
Maximum="255"
Value="{Binding Operation.ErodeBottomIterations}"/>
<CheckBox Grid.Row="12" Grid.Column="2"
VerticalAlignment="Center"
IsEnabled="{Binding !Operation.PatternModel}"
IsChecked="{Binding Operation.EnableAntiAliasing}"
Content="Enable Anti-Aliasing"/>
<CheckBox Grid.Row="12" Grid.Column="4"
IsEnabled="{Binding !Operation.PatternModel}"
ToolTip.Tip="Most of the printers requires a mirror output to print with the correct orientation"
IsChecked="{Binding Operation.MirrorOutput}"
Content="Mirror output" />
</Grid>
</Expander>
<Expander
Header="Object configuration"
IsExpanded="True" IsVisible="{Binding !Operation.PatternModel}">
<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,10,Auto,10,Auto,10,Auto,10,Auto,10,Auto"
ColumnDefinitions="Auto,10,180,20,Auto,10,180,20,Auto,10,180">
<TextBlock Grid.Row="0" Grid.Column="0"
Text="Base height:"
VerticalAlignment="Center"/>
<NumericUpDown Grid.Row="0" Grid.Column="2"
Classes="ValueLabel ValueLabel_mm"
Increment="0.5"
Minimum="0.3"
Maximum="100"
FormatString="F2"
Value="{Binding Operation.BaseHeight}"/>
<TextBlock Grid.Row="0" Grid.Column="4"
Text="Features height:"
VerticalAlignment="Center"/>
<NumericUpDown Grid.Row="0" Grid.Column="6"
Classes="ValueLabel ValueLabel_mm"
Increment="0.5"
Minimum="0.5"
Maximum="100"
FormatString="F2"
Value="{Binding Operation.FeaturesHeight}"/>
<TextBlock Grid.Row="0" Grid.Column="8"
Text="Features margin:"
VerticalAlignment="Center"/>
<NumericUpDown Grid.Row="0" Grid.Column="10"
Classes="ValueLabel ValueLabel_mm"
Increment="0.5"
Minimum="0"
Maximum="100"
FormatString="F2"
Value="{Binding Operation.FeaturesMargin}"/>
<TextBlock Grid.Row="2" Grid.Column="0"
ToolTip.Tip="Creates an incremental stair at top from left to right that goes up to the top layer"
Text="Staircase:"
VerticalAlignment="Center"/>
<NumericUpDown Grid.Row="2" Grid.Column="2"
Classes="ValueLabel ValueLabel_px"
IsVisible="{Binding !Operation.IsUnitOfMeasureMm}"
Increment="1"
Minimum="0"
Maximum="65535"
Value="{Binding Operation.StaircaseThicknessPx}"/>
<NumericUpDown Grid.Row="2" Grid.Column="2"
Classes="ValueLabel ValueLabel_mm"
IsVisible="{Binding Operation.IsUnitOfMeasureMm}"
Increment="1"
Minimum="0"
Maximum="500"
Value="{Binding Operation.StaircaseThicknessMm}"/>
<TextBlock Grid.Row="2" Grid.Column="4"
Text="Unit of measure:"
VerticalAlignment="Center"/>
<ComboBox Grid.Row="2" Grid.Column="6"
HorizontalAlignment="Stretch"
Items="{Binding Operation.MeasuresItems}"
SelectedItem="{Binding Operation.UnitOfMeasure}"/>
<CheckBox Grid.Row="4" Grid.Column="0"
Grid.ColumnSpan="11"
FontWeight="Bold"
Content="Pin (positive) / holes (negative):"
VerticalAlignment="Center"
IsChecked="{Binding Operation.HolesEnabled}"/>
<TextBlock Grid.Row="6" Grid.Column="0"
IsEnabled="{Binding Operation.HolesEnabled}"
Text="Shape:"
VerticalAlignment="Center"/>
<ComboBox Grid.Row="6" Grid.Column="2"
IsEnabled="{Binding Operation.HolesEnabled}"
HorizontalAlignment="Stretch"
Items="{Binding Operation.ShapesItems}"
SelectedItem="{Binding Operation.HoleShape}"/>
<TextBlock Grid.Row="8" Grid.Column="0"
IsEnabled="{Binding Operation.HolesEnabled}"
Text="Diameters:"
ToolTip.Tip="Diameters separated by a comma (,).
&#x0a;Order doesn't matter.
&#x0a;Values are pixel square, eg: 3 = 3x3 = 9 pixel hole"
VerticalAlignment="Center"/>
<TextBox Grid.Row="8" Grid.Column="2"
Grid.ColumnSpan="9"
Classes="ValueLabel ValueLabel_mm"
IsEnabled="{Binding Operation.HolesEnabled}"
IsVisible="{Binding Operation.IsUnitOfMeasureMm}"
Text="{Binding Operation.HoleDiametersMm}"/>
<TextBox Grid.Row="8" Grid.Column="2"
Grid.ColumnSpan="9"
Classes="ValueLabel ValueLabel_px"
IsEnabled="{Binding Operation.HolesEnabled}"
IsVisible="{Binding !Operation.IsUnitOfMeasureMm}"
Text="{Binding Operation.HoleDiametersPx}"/>
<CheckBox Grid.Row="10" Grid.Column="0"
Grid.ColumnSpan="11"
FontWeight="Bold"
Content="Zebra bars:"
VerticalAlignment="Center"
IsChecked="{Binding Operation.BarsEnabled}"/>
<TextBlock Grid.Row="12" Grid.Column="0"
IsEnabled="{Binding Operation.BarsEnabled}"
Text="Bar spacing:"
VerticalAlignment="Center"/>
<NumericUpDown Grid.Row="12" Grid.Column="2"
Classes="ValueLabel ValueLabel_mm"
IsEnabled="{Binding Operation.BarsEnabled}"
Increment="0.5"
Minimum="0.01"
Maximum="100"
FormatString="F2"
Value="{Binding Operation.BarSpacing}"/>
<TextBlock Grid.Row="12" Grid.Column="4"
IsEnabled="{Binding Operation.BarsEnabled}"
Text="Bar length:"
HorizontalAlignment="Right"
VerticalAlignment="Center"/>
<NumericUpDown Grid.Row="12" Grid.Column="6"
Classes="ValueLabel ValueLabel_mm"
IsEnabled="{Binding Operation.BarsEnabled}"
Increment="0.5"
Minimum="0.01"
Maximum="100"
FormatString="F2"
Value="{Binding Operation.BarLength}"/>
<TextBlock Grid.Row="12" Grid.Column="8"
IsEnabled="{Binding Operation.BarsEnabled}"
Text="Vertical splitter:"
HorizontalAlignment="Right"
VerticalAlignment="Center"/>
<NumericUpDown Grid.Row="12" Grid.Column="10"
Classes="ValueLabel ValueLabel_px"
IsEnabled="{Binding Operation.BarsEnabled}"
Increment="1"
Minimum="-128"
Maximum="127"
Value="{Binding Operation.BarVerticalSplitter}"/>
<TextBlock Grid.Row="14" Grid.Column="0"
IsEnabled="{Binding Operation.BarsEnabled}"
Text="Fence thick:"
VerticalAlignment="Center"/>
<NumericUpDown Grid.Row="14" Grid.Column="2"
Classes="ValueLabel ValueLabel_px"
IsEnabled="{Binding Operation.BarsEnabled}"
Increment="2"
Minimum="0"
Maximum="255"
Value="{Binding Operation.BarFenceThickness}"/>
<TextBlock Grid.Row="14" Grid.Column="4"
IsEnabled="{Binding Operation.BarsEnabled}"
Text="Fence offset:"
HorizontalAlignment="Right"
VerticalAlignment="Center"/>
<NumericUpDown Grid.Row="14" Grid.Column="6"
Classes="ValueLabel ValueLabel_px"
IsEnabled="{Binding Operation.BarsEnabled}"
Increment="1"
Minimum="-128"
Maximum="127"
Value="{Binding Operation.BarFenceOffset}"/>
<TextBlock Grid.Row="16" Grid.Column="0"
IsEnabled="{Binding Operation.BarsEnabled}"
Text="Thicknesses:"
VerticalAlignment="Center"/>
<TextBox Grid.Row="16" Grid.Column="2"
Classes="ValueLabel ValueLabel_mm"
Grid.ColumnSpan="9"
IsEnabled="{Binding Operation.BarsEnabled}"
IsVisible="{Binding Operation.IsUnitOfMeasureMm}"
Text="{Binding Operation.BarThicknessesMm}"/>
<TextBox Grid.Row="16" Grid.Column="2" Grid.ColumnSpan="9"
Classes="ValueLabel ValueLabel_px"
IsEnabled="{Binding Operation.BarsEnabled}"
IsVisible="{Binding !Operation.IsUnitOfMeasureMm}"
Text="{Binding Operation.BarThicknessesPx}"/>
<CheckBox Grid.Row="18" Grid.Column="0"
Grid.ColumnSpan="11"
FontWeight="Bold"
Content="Text:"
VerticalAlignment="Center"
IsChecked="{Binding Operation.TextEnabled}"/>
<TextBlock Grid.Row="20" Grid.Column="0"
IsEnabled="{Binding Operation.TextEnabled}"
Text="Font:"
VerticalAlignment="Center"/>
<ComboBox Grid.Row="20" Grid.Column="2"
IsEnabled="{Binding Operation.TextEnabled}"
VerticalAlignment="Center"
HorizontalAlignment="Stretch"
Items="{Binding Operation.TextFonts}"
SelectedItem="{Binding Operation.TextFont}"/>
<TextBlock Grid.Row="20" Grid.Column="4"
IsEnabled="{Binding Operation.TextEnabled}"
Text="Text scale:"
HorizontalAlignment="Right"
VerticalAlignment="Center"/>
<NumericUpDown Grid.Row="20" Grid.Column="6"
Classes="ValueLabel ValueLabel_times"
IsEnabled="{Binding Operation.TextEnabled}"
Increment="0.5"
Minimum="0.1"
Maximum="100"
FormatString="F2"
Value="{Binding Operation.TextScale}"/>
<TextBlock Grid.Row="20" Grid.Column="8"
IsEnabled="{Binding Operation.TextEnabled}"
Text="Text thickness:"
HorizontalAlignment="Right"
VerticalAlignment="Center"/>
<NumericUpDown Grid.Row="20" Grid.Column="10"
Classes="ValueLabel ValueLabel_px"
IsEnabled="{Binding Operation.TextEnabled}"
Increment="1"
Minimum="1"
Maximum="255"
Value="{Binding Operation.TextThickness}"/>
<TextBlock Grid.Row="22" Grid.Column="0"
IsEnabled="{Binding Operation.TextEnabled}"
Text="Text:"
VerticalAlignment="Center"/>
<TextBox Grid.Row="22" Grid.Column="2"
IsEnabled="{Binding Operation.TextEnabled}"
Grid.ColumnSpan="9"
Text="{Binding Operation.Text}"/>
<CheckBox Grid.Row="24" Grid.Column="0"
Grid.ColumnSpan="11"
FontWeight="Bold"
Content="Bullseye:"
VerticalAlignment="Center"
IsChecked="{Binding Operation.BullsEyeEnabled}"/>
<TextBlock Grid.Row="26" Grid.Column="0"
Text="Configuration:"
IsEnabled="{Binding Operation.BullsEyeEnabled}"
ToolTip.Tip="Diameter:Thickness, ..."
VerticalAlignment="Center"/>
<TextBox Grid.Row="26" Grid.Column="2"
Grid.ColumnSpan="9"
Classes="ValueLabel ValueLabel_mm"
IsEnabled="{Binding Operation.BullsEyeEnabled}"
IsVisible="{Binding Operation.IsUnitOfMeasureMm}"
Text="{Binding Operation.BullsEyeConfigurationMm}"/>
<TextBox Grid.Row="26" Grid.Column="2"
Grid.ColumnSpan="9"
Classes="ValueLabel ValueLabel_px"
IsEnabled="{Binding Operation.BullsEyeEnabled}"
IsVisible="{Binding !Operation.IsUnitOfMeasureMm}"
Text="{Binding Operation.BullsEyeConfigurationPx}"/>
<TextBlock Grid.Row="28" Grid.Column="0"
IsEnabled="{Binding Operation.BullsEyeEnabled}"
Text="Fence thick:"
VerticalAlignment="Center"/>
<NumericUpDown Grid.Row="28" Grid.Column="2"
Classes="ValueLabel ValueLabel_px"
IsEnabled="{Binding Operation.BullsEyeEnabled}"
Increment="2"
Minimum="0"
Maximum="255"
Value="{Binding Operation.BullsEyeFenceThickness}"/>
<TextBlock Grid.Row="28" Grid.Column="4"
IsEnabled="{Binding Operation.BullsEyeEnabled}"
Text="Fence offset:"
HorizontalAlignment="Right"
VerticalAlignment="Center"/>
<NumericUpDown Grid.Row="28" Grid.Column="6"
Classes="ValueLabel ValueLabel_px"
IsEnabled="{Binding Operation.BullsEyeEnabled}"
Increment="1"
Minimum="-128"
Maximum="127"
Value="{Binding Operation.BullsEyeFenceOffset}"/>
<CheckBox Grid.Row="28" Grid.Column="8"
Grid.ColumnSpan="3"
Content="Invert quadrants"
VerticalAlignment="Center"
IsEnabled="{Binding Operation.BullsEyeEnabled}"
IsChecked="{Binding Operation.BullsEyeInvertQuadrants}"/>
<CheckBox Grid.Row="30" Grid.Column="0"
Grid.ColumnSpan="11"
FontWeight="Bold"
Content="Counter triangles:"
VerticalAlignment="Center"
IsChecked="{Binding Operation.CounterTrianglesEnabled}"/>
<TextBlock Grid.Row="32" Grid.Column="0"
Text="Tip Offset:"
IsEnabled="{Binding Operation.CounterTrianglesEnabled}"
VerticalAlignment="Center"/>
<NumericUpDown Grid.Row="32" Grid.Column="2"
Classes="ValueLabel ValueLabel_px"
IsEnabled="{Binding Operation.CounterTrianglesEnabled}"
Increment="1"
Minimum="-128"
Maximum="127"
Value="{Binding Operation.CounterTrianglesTipOffset}"/>
<CheckBox Grid.Row="32" Grid.Column="4"
Grid.ColumnSpan="5"
IsEnabled="{Binding Operation.CounterTrianglesEnabled}"
Content="Fence the triangles"
VerticalAlignment="Center"
IsChecked="{Binding Operation.CounterTrianglesFence}"/>
</Grid>
</Expander>
<Expander IsExpanded="False">
<Expander.Header>
<StackPanel Orientation="Horizontal">
<TextBlock Text="Multiple brightness"
IsVisible="{Binding !SlicerFile.IsAntiAliasingEmulated}"/>
<TextBlock Text="Multiple brightness/exposures with emulated AntiAliasing and time fractions"
IsVisible="{Binding SlicerFile.IsAntiAliasingEmulated}"/>
</StackPanel>
</Expander.Header>
<StackPanel Spacing="10">
<TextBlock
Text="Only printers able to do Anti-Aliasing and enabled on file can support this.
&#x0a;Make sure your is supported or else it can print a full white or full black model.
&#x0a;Also take into consideration some printers/formats have fixed usable AA levels and all in between will be threshold, study this first.
&#x0a;When using this section, always set the exposure time to the highest time you want to test.
&#x0a;If your printer is able to do 'Multiple exposures times per layer', please use that method instead of this (More accurate and AA threshold free)."/>
<TextBlock
IsVisible="{Binding SlicerFile.IsAntiAliasingEmulated}"
TextWrapping="Wrap"
FontWeight="Bold"
Text="Note: This file format uses time fractions to emulate AntiAliasing.
&#x0a;This can be used to replace the 'Multiple exposures' sections and print multiple models at once at different timings.
&#x0a;However you can't set the object time, instead fractions of the main exposure must be used.
&#x0a;The brightness table will tell you the expected exposure time of each object."/>
<CheckBox
Content="Enable - For advanced users only!"
IsChecked="{Binding Operation.MultipleBrightness}"/>
<Grid RowDefinitions="Auto,10,Auto,10,Auto,10,Auto,10,Auto"
ColumnDefinitions="Auto,10,200,5,Auto,20,Auto,10,180,5,Auto"
IsEnabled="{Binding Operation.MultipleBrightness}">
<TextBlock Grid.Row="0" Grid.Column="0"
ToolTip.Tip="Do not change brightness from the selected layers. Full brightness of 255 is applied to the skip layers."
Text="Exclude from:"
VerticalAlignment="Center"/>
<ComboBox Grid.Row="0" Grid.Column="2"
VerticalAlignment="Center"
HorizontalAlignment="Stretch"
Items="{Binding Operation.MultipleBrightnessExcludeFromItems}"
SelectedItem="{Binding Operation.MultipleBrightnessExcludeFrom}"/>
<TextBlock Grid.Row="0" Grid.Column="4"
Text="layers"
VerticalAlignment="Center"/>
<TextBlock Grid.Row="0" Grid.Column="6"
IsVisible="{Binding !SlicerFile.IsAntiAliasingEmulated}"
ToolTip.Tip="Append a brightness level to the list by giving a desired exposure time. Supplied time must be lower than the common exposure time or you need to increase it on the common 'Normal Exposure'."
Text="Generate by exposure time:"
VerticalAlignment="Center"/>
<NumericUpDown Grid.Row="0" Grid.Column="8"
Classes="ValueLabel ValueLabel_s"
IsVisible="{Binding !SlicerFile.IsAntiAliasingEmulated}"
Increment="0.10"
Minimum="0.10"
Maximum="{Binding Operation.NormalExposure}"
FormatString="F2"
Value="{Binding Operation.MultipleBrightnessGenExposureTime}"/>
<controls:ButtonWithIcon
Grid.Row="0" Grid.Column="10" VerticalContentAlignment="Center"
IsVisible="{Binding !SlicerFile.IsAntiAliasingEmulated}"
HorizontalContentAlignment="Center"
VerticalAlignment="Stretch"
Command="{Binding BrightnessExposureGenAdd}"
Text="Add"
Icon="fa-solid fa-plus"/>
<TextBlock Grid.Row="2" Grid.Column="0"
Text="Brightnesses:"
ToolTip.Tip="From 1-255, where 1 is almost black and 255 is full white. No half numbers are allowed."
VerticalAlignment="Center"/>
<TextBox Grid.Row="2" Grid.Column="2" Grid.ColumnSpan="9"
Classes="ValueLabel ValueLabel_sun"
Text="{Binding Operation.MultipleBrightnessValues}"/>
<!--
<TextBlock Grid.Row="4" Grid.Column="0" Grid.ColumnSpan="3"
IsVisible="{Binding SlicerFile.IsAntiAliasingEmulated}"
FontWeight="Bold"
Text="Emulated AntiAliasing with time fractions"
VerticalAlignment="Center"/>
!-->
<TextBlock Grid.Row="4" Grid.Column="0"
IsVisible="{Binding SlicerFile.IsAntiAliasingEmulated}"
ToolTip.Tip="AntiAliasing level to set on file.
&#x0a;This value is used to set the maximum available time fractions on the next field.
&#x0a;Lower levels have larger time windows, while higher levels allow lower time windows (Recommended)."
Text="AntiAliasing:"
VerticalAlignment="Center"/>
<NumericUpDown Grid.Row="4" Grid.Column="2"
IsVisible="{Binding SlicerFile.IsAntiAliasingEmulated}"
Increment="2"
Minimum="2"
Maximum="{Binding Operation.MaximumAntiAliasing}"
Value="{Binding Operation.MultipleBrightnessGenEmulatedAALevel}"/>
<TextBlock Grid.Row="4" Grid.Column="4"
IsVisible="{Binding SlicerFile.IsAntiAliasingEmulated}"
Text="x"
VerticalAlignment="Center"/>
<TextBlock Grid.Row="4" Grid.Column="6"
IsVisible="{Binding SlicerFile.IsAntiAliasingEmulated}"
ToolTip.Tip="Amount of fractions from the main exposure: 2 to 16"
Text="Generate by time fractions:"
VerticalAlignment="Center"/>
<NumericUpDown Grid.Row="4" Grid.Column="8"
IsVisible="{Binding SlicerFile.IsAntiAliasingEmulated}"
Increment="1"
Minimum="2"
Maximum="{Binding Operation.MultipleBrightnessGenEmulatedAALevel}"
Value="{Binding Operation.MultipleBrightnessGenExposureFractions}"/>
<TextBlock Grid.Row="4" Grid.Column="10"
IsVisible="{Binding SlicerFile.IsAntiAliasingEmulated}"
Text="÷"
VerticalAlignment="Center"/>
</Grid>
<DataGrid
Name="BrightnessTable"
CanUserReorderColumns="True"
CanUserResizeColumns="True"
CanUserSortColumns="True"
GridLinesVisibility="Horizontal"
IsReadOnly="True"
ClipboardCopyMode="IncludeHeader"
VerticalAlignment="Stretch"
Margin="0,-10,0,0"
IsEnabled="{Binding Operation.MultipleBrightness}"
Items="{Binding Operation.MultipleBrightnessTable}">
<DataGrid.Columns>
<DataGridTextColumn Header="Brightness"
Binding="{Binding Brightness}"
Width="Auto" />
<DataGridTextColumn Header="Percent (%)"
Binding="{Binding BrightnessPercent}"
Width="Auto" />
<DataGridTextColumn Header="Bottom exposure (s)"
Binding="{Binding BottomExposure}"
Width="Auto" />
<DataGridTextColumn Header="Exposure (s)"
Binding="{Binding Exposure}"
Width="Auto" />
</DataGrid.Columns>
</DataGrid>
</StackPanel>
</Expander>
<Expander
Header="Multiple layer height"
IsExpanded="False">
<Expander.IsVisible>
<MultiBinding Converter="{x:Static BoolConverters.And}">
<Binding Path="CanSupportPerLayerSettings"/>
<Binding Path="!Operation.PatternModel"/>
</MultiBinding>
</Expander.IsVisible>
<StackPanel Spacing="10">
<TextBlock Text="Only few printers support this, make sure your is supported or else it will print a malformed model.
&#x0a;After this, do not apply any modification which reconstruct the z positions of the layers."/>
<CheckBox
Content="Enable - For advanced users only!"
IsChecked="{Binding Operation.MultipleLayerHeight}"/>
<Grid RowDefinitions="Auto"
ColumnDefinitions="Auto,10,180,20,Auto,10,180,20,Auto,10,180"
IsEnabled="{Binding Operation.MultipleLayerHeight}">
<TextBlock Grid.Row="0" Grid.Column="0"
Text="Start layer height:"
VerticalAlignment="Center"/>
<NumericUpDown Grid.Row="0" Grid.Column="2"
Classes="ValueLabel ValueLabel_mm"
Increment="0.01"
Minimum="0.01"
Maximum="0.30"
FormatString="F3"
Value="{Binding Operation.LayerHeight}"/>
<TextBlock Grid.Row="0" Grid.Column="4"
Text="Increment step:"
VerticalAlignment="Center"/>
<NumericUpDown Grid.Row="0" Grid.Column="6"
Classes="ValueLabel ValueLabel_mm"
Increment="0.01"
Minimum="0.01"
Maximum="0.1"
FormatString="F3"
Value="{Binding Operation.MultipleLayerHeightStep}"/>
<TextBlock Grid.Row="0" Grid.Column="8"
Text="Maximum layer height:"
VerticalAlignment="Center"/>
<NumericUpDown Grid.Row="0" Grid.Column="10"
Classes="ValueLabel ValueLabel_mm"
Increment="0.01"
Minimum="{Binding Operation.LayerHeight}"
Maximum="0.3"
FormatString="F3"
Value="{Binding Operation.MultipleLayerHeightMaximum}"/>
</Grid>
</StackPanel>
</Expander>
<Expander
Header="Multiple exposures"
IsExpanded="True">
<Expander.IsVisible>
<MultiBinding Converter="{x:Static BoolConverters.And}">
<Binding Path="CanSupportPerLayerPositionZ"/>
<Binding Path="CanSupportPerLayerExposureTime"/>
</MultiBinding>
</Expander.IsVisible>
<StackPanel Spacing="10">
<TextBlock Text="Only few printers support this, make sure your is supported or else it will print a malformed model.
&#x0a;After this, do not apply any modification which reconstruct the z positions of the layers."/>
<CheckBox
Content="Enable - For advanced users only!"
IsChecked="{Binding Operation.MultipleExposures}"/>
<TextBlock Text="Automatic exposure generation:"
IsEnabled="{Binding Operation.MultipleExposures}"
FontWeight="Bold"/>
<Grid RowDefinitions="Auto,10,Auto"
ColumnDefinitions="Auto,10,180,20,Auto,10,180,20,Auto,10,180,5,Auto"
IsEnabled="{Binding Operation.MultipleExposures}">
<TextBlock Grid.Row="0" Grid.Column="0"
ToolTip.Tip="Linear: Current exposure + step * test number.
&#x0a;Multiplier: Current exposure * layer height * step * test number."
Text="Generation type:"
VerticalAlignment="Center"/>
<ComboBox Grid.Row="0" Grid.Column="2"
VerticalAlignment="Center"
HorizontalAlignment="Stretch"
Items="{Binding Operation.ExposureGenTypeItems}"
SelectedItem="{Binding Operation.ExposureGenType}"/>
<CheckBox Grid.Row="0" Grid.Column="4" Grid.ColumnSpan="5"
VerticalAlignment="Center"
Content="Ignore global exposures"
IsChecked="{Binding Operation.ExposureGenIgnoreBaseExposure}"/>
<Button Grid.Row="0" Grid.Column="8" Grid.ColumnSpan="5"
Content="Generate exposure table"
VerticalContentAlignment="Center"
HorizontalContentAlignment="Center"
HorizontalAlignment="Stretch"
VerticalAlignment="Stretch"
Command="{Binding GenerateExposureTable}"/>
<TextBlock Grid.Row="2" Grid.Column="0"
ToolTip.Tip="Bottom exposure step"
Text="Bottom step:"
VerticalAlignment="Center"/>
<NumericUpDown Grid.Row="2" Grid.Column="2"
Classes="ValueLabel ValueLabel_s"
Increment="0.01"
Minimum="0"
Maximum="1000"
FormatString="F2"
Value="{Binding Operation.ExposureGenBottomStep}"/>
<TextBlock Grid.Row="2" Grid.Column="4"
ToolTip.Tip="Normal exposure step"
Text="Normal step:"
VerticalAlignment="Center"/>
<NumericUpDown Grid.Row="2" Grid.Column="6"
Classes="ValueLabel ValueLabel_s"
Increment="0.01"
Minimum="0.01"
Maximum="1000"
FormatString="F2"
Value="{Binding Operation.ExposureGenNormalStep}"/>
<TextBlock Grid.Row="2" Grid.Column="8"
ToolTip.Tip="Maximum of generations per layer height"
Text="Maximum generations:"
VerticalAlignment="Center"/>
<NumericUpDown Grid.Row="2" Grid.Column="10"
Increment="1"
Minimum="1"
Maximum="255"
Value="{Binding Operation.ExposureGenTests}"/>
<TextBlock Grid.Row="2" Grid.Column="12"
VerticalAlignment="Center"
Text="tests"/>
</Grid>
<TextBlock Text="Manual exposure entry:"
IsEnabled="{Binding Operation.MultipleExposures}"
FontWeight="Bold"/>
<Grid RowDefinitions="Auto,10,Auto"
ColumnDefinitions="Auto,10,180,5,Auto,20,Auto,10,180,20,Auto,10,180,10,Auto"
IsEnabled="{Binding Operation.MultipleExposures}">
<TextBlock Grid.Row="0" Grid.Column="0"
Text="Layer height:"
VerticalAlignment="Center"/>
<ComboBox Grid.Row="0" Grid.Column="2"
VerticalAlignment="Center"
HorizontalAlignment="Stretch"
MinWidth="100"
Items="{Binding Operation.AvailableLayerHeights}"
SelectedItem="{Binding Operation.ExposureGenManualLayerHeight}"/>
<TextBlock Grid.Row="0" Grid.Column="4"
Text="mm"
VerticalAlignment="Center"/>
<TextBlock Grid.Row="0" Grid.Column="6"
Text="Bottom exposure:"
VerticalAlignment="Center"/>
<NumericUpDown Grid.Row="0" Grid.Column="8"
Classes="ValueLabel ValueLabel_s"
Increment="0.1"
Minimum="0.5"
Maximum="1000"
FormatString="F2"
Value="{Binding Operation.ExposureGenManualBottom}"/>
<TextBlock Grid.Row="0" Grid.Column="10"
Text="Normal exposure:"
VerticalAlignment="Center"/>
<NumericUpDown Grid.Row="0" Grid.Column="12"
Classes="ValueLabel ValueLabel_s"
Increment="0.1"
Minimum="0.1"
Maximum="1000"
FormatString="F2"
Value="{Binding Operation.ExposureGenManualNormal}"/>
<controls:ButtonWithIcon
Grid.Row="0" Grid.Column="14" VerticalContentAlignment="Center"
HorizontalContentAlignment="Center"
VerticalAlignment="Stretch"
IsEnabled="{Binding Operation.ExposureGenManualLayerHeight}"
Command="{Binding ExposureTableAddManual}"
Text="Add"
Icon="fa-solid fa-plus"/>
</Grid>
<Grid RowDefinitions="Auto" ColumnDefinitions="Auto,*,Auto"
IsEnabled="{Binding Operation.MultipleExposures}"
Margin="0,10,0,0">
<TextBlock Text="{Binding Operation.ExposureTable.Count, StringFormat=Exposure table: {0} entries}" FontWeight="Bold"/>
<controls:ButtonWithIcon
Grid.Column="1" VerticalContentAlignment="Center"
HorizontalContentAlignment="Center"
HorizontalAlignment="Right"
IsEnabled="{Binding #ExposureTable.SelectedItem, Converter={x:Static ObjectConverters.IsNotNull}}"
Command="{Binding ExposureTableRemoveSelectedEntries}"
Text="Remove selected entries"
Icon="fa-solid fa-trash-alt"/>
<controls:ButtonWithIcon
Grid.Column="2" VerticalContentAlignment="Center"
Margin="10,0,0,0"
HorizontalContentAlignment="Center"
HorizontalAlignment="Right"
IsEnabled="{Binding Operation.ExposureTable.Count}"
Command="{Binding ExposureTableClearEntries}"
Text="{Binding Operation.ExposureTable.Count, StringFormat=Clear {0} entries}"
Icon="fa-solid fa-xmark"/>
</Grid>
<DataGrid
Name="ExposureTable"
CanUserReorderColumns="True"
CanUserResizeColumns="True"
CanUserSortColumns="True"
GridLinesVisibility="Horizontal"
IsReadOnly="False"
ClipboardCopyMode="IncludeHeader"
VerticalAlignment="Stretch"
MinHeight="100"
Margin="0,-10,0,0"
IsEnabled="{Binding Operation.MultipleExposures}"
Items="{Binding Operation.ExposureTable}">
<DataGrid.Columns>
<DataGridTextColumn Header="Layer height (mm)"
Binding="{Binding LayerHeight}"
Width="Auto" />
<DataGridTextColumn Header="Bottom exposure (s)"
Binding="{Binding BottomExposure}"
Width="Auto" />
<DataGridTextColumn Header="Exposure (s)"
Binding="{Binding Exposure}"
Width="Auto" />
</DataGrid.Columns>
</DataGrid>
<Grid RowDefinitions="Auto" ColumnDefinitions="Auto,10,*" Margin="0,10,0,0">
<TextBlock Grid.Row="0" Grid.Column="0"
ToolTip.Tip="Print mode for non-bottom base layers.
&#x0a;A option other than 'Iterative' will speed up the print process and merge all base layers in the same height.
&#x0a;The referred exposures come from the generated table."
Text="Base layers print mode:"
VerticalAlignment="Center"/>
<ComboBox Grid.Row="0" Grid.Column="2"
HorizontalAlignment="Stretch"
VerticalAlignment="Center"
Items="{Binding Operation.MultipleExposuresBaseLayersPrintMode, Converter={StaticResource EnumToCollectionConverter}, Mode=OneTime}"
SelectedItem="{Binding Operation.MultipleExposuresBaseLayersPrintMode, Converter={StaticResource FromValueDescriptionToEnumConverter}}"/>
</Grid>
<Grid RowDefinitions="Auto" ColumnDefinitions="Auto,10,180,5,Auto">
<TextBlock Grid.Row="0" Grid.Column="0"
Text="Base layers exposure: "
ToolTip.Tip="Use this custom exposure time for base layers"
IsEnabled="{Binding Operation.IsMultipleExposuresBaseLayersPrintModeCustom}"
VerticalAlignment="Center"/>
<NumericUpDown Grid.Row="0" Grid.Column="2"
Classes="ValueLabel ValueLabel_s"
Increment="0.5"
Minimum="0.1"
Maximum="1000"
FormatString="F2"
IsEnabled="{Binding Operation.IsMultipleExposuresBaseLayersPrintModeCustom}"
Value="{Binding Operation.MultipleExposuresBaseLayersCustomExposure}"/>
<TextBlock Grid.Row="0" Grid.Column="4"
Text="(For 'custom' mode only)"
IsEnabled="{Binding Operation.IsMultipleExposuresBaseLayersPrintModeCustom}"
VerticalAlignment="Center"/>
</Grid>
<StackPanel Orientation="Vertical" Margin="0,10,0,0" Spacing="10"
IsEnabled="{Binding Operation.MultipleExposures}"
IsVisible="{Binding SlicerFile.SupportPerLayerSettings}">
<CheckBox
ToolTip.Tip="Change some defined settings for sequential layers that share same z position"
Content="Use different settings for layers with same Z positioning:"
FontWeight="Bold"
IsChecked="{Binding Operation.DifferentSettingsForSamePositionedLayers}"/>
<Grid RowDefinitions="Auto,10,Auto" ColumnDefinitions="Auto,10,180"
IsEnabled="{Binding Operation.DifferentSettingsForSamePositionedLayers}">
<CheckBox Grid.Row="0" Grid.Column="0"
ToolTip.Tip="Use a low value to speed up layers with same Z position, lift is not really required here.
&#x0a;Set no lift height (0mm) will not work on most of the printers, so far, only gcode printers are known/able to use no lifts.
&#x0a;However set 0mm on a not compatible printer will cause no harm, value will be contained inside a min-max inside firmware."
Content="Lift height:"
IsVisible="{Binding SlicerFile.CanUseLayerLiftHeight}"
IsChecked="{Binding Operation.SamePositionedLayersLiftHeightEnabled}"
VerticalAlignment="Center"/>
<NumericUpDown Grid.Row="0" Grid.Column="2"
Classes="ValueLabel ValueLabel_mm"
Increment="0.5"
Minimum="0"
Maximum="1000"
FormatString="F2"
IsVisible="{Binding SlicerFile.CanUseLayerLiftHeight}"
IsEnabled="{Binding Operation.SamePositionedLayersLiftHeightEnabled}"
Value="{Binding Operation.SamePositionedLayersLiftHeight}"/>
<CheckBox Grid.Row="2" Grid.Column="0"
ToolTip.Tip="Use a low value to speed up layers with same Z position, a delay is not really required here.
&#x0a;Set no delay (0s) is not recommended for gcode printers, as most need some time to render the image before move to the next command, 2s is recommended as a safe-guard."
Content="Wait time before cure:"
IsChecked="{Binding Operation.SamePositionedLayersWaitTimeBeforeCureEnabled}"
VerticalAlignment="Center">
<CheckBox.IsVisible>
<MultiBinding Converter="{x:Static BoolConverters.Or}">
<Binding Path="SlicerFile.CanUseLayerLightOffDelay"/>
<Binding Path="SlicerFile.CanUseLayerWaitTimeBeforeCure"/>
</MultiBinding>
</CheckBox.IsVisible>
</CheckBox>
<NumericUpDown Grid.Row="2" Grid.Column="2"
Classes="ValueLabel ValueLabel_s"
Increment="0.5"
Minimum="0"
Maximum="1000"
FormatString="F2"
IsEnabled="{Binding Operation.SamePositionedLayersWaitTimeBeforeCureEnabled}"
Value="{Binding Operation.SamePositionedLayersWaitTimeBeforeCure}">
<NumericUpDown.IsVisible>
<MultiBinding Converter="{x:Static BoolConverters.Or}">
<Binding Path="SlicerFile.CanUseLayerLightOffDelay"/>
<Binding Path="SlicerFile.CanUseLayerWaitTimeBeforeCure"/>
</MultiBinding>
</NumericUpDown.IsVisible>
</NumericUpDown>
</Grid>
<!--
<CheckBox
ToolTip.Tip="The lift height will be set to 0 for sequential layers that share same z position, saving moves and time.
&#x0a;Some printers may not support this and always require a lift after each layer, in that case turning this on will not affect the print."
Content="Do not perform the lifting sequence for layers with same Z positioning"
IsEnabled="{Binding Operation.MultipleExposures}"
IsChecked="{Binding Operation.DontLiftSamePositionedLayers}"/>
<CheckBox
ToolTip.Tip="Sets the light-off delay to zero for each sequential layers with no lift's to save that additional time.
&#x0a;Note that without a lift and a delay the UV LED and LCD will be almost always ON, that can lead to overheat and wear the LCD faster."
Content="Also set light-off delay to zero"
IsEnabled="{Binding Operation.DontLiftSamePositionedLayers}"
IsChecked="{Binding Operation.ZeroLightOffSamePositionedLayers}"/>
!-->
</StackPanel>
</StackPanel>
</Expander>
<Expander
Header="Pattern loaded model"
IsExpanded="False" IsVisible="{Binding Operation.CanPatternModel}">
<StackPanel Spacing="10">
<TextBlock Text="This option will pattern the current loaded model and generate multiple exposure tests with it.
&#x0a;Only few printers support this, make sure your is supported or else it will print a malformed model.
&#x0a;After this, do not apply any modification which reconstruct the z positions of the layers."/>
<CheckBox
Content="Enable - For advanced users only!"
IsChecked="{Binding Operation.PatternModel}"/>
<CheckBox
Content="Glue bottom layers to merge the model into one piece"
ToolTip.Tip="If enabled, it will turn the bottom layers within the model area with solid white to merge all clones into one merged piece.
&#x0a;Requires 'Part margin = 0' for effectively merge the models"
IsEnabled="{Binding Operation.PatternModel}"
IsChecked="{Binding Operation.PatternModelGlueBottomLayers}"/>
<CheckBox
Content="Intrude text in bottom layers with the model parameters"
ToolTip.Tip="If enabled, it will intrude text on each model bottom layers with information about the parameters"
IsEnabled="{Binding Operation.PatternModel}"
IsChecked="{Binding Operation.PatternModelTextEnabled}"/>
<!--
<Grid RowDefinitions="Auto"
ColumnDefinitions="Auto,10,Auto,5,Auto,20,Auto,10,Auto,5,Auto,20,Auto,10,Auto,5,Auto"
IsEnabled="{Binding Operation.MultipleLayerHeight}">
<TextBlock Grid.Row="0" Grid.Column="0"
Text="Start layer height:"
VerticalAlignment="Center"/>
<NumericUpDown Grid.Row="0" Grid.Column="2"
Increment="0.01"
Minimum="0.01"
Maximum="0.30"
FormatString="F3"
Value="{Binding Operation.LayerHeight}"/>
<TextBlock Grid.Row="0" Grid.Column="4"
VerticalAlignment="Center"
Text="mm"/>
<TextBlock Grid.Row="0" Grid.Column="6"
Text="Increment step:"
VerticalAlignment="Center"/>
<NumericUpDown Grid.Row="0" Grid.Column="8"
Increment="0.01"
Minimum="0.01"
Maximum="0.1"
FormatString="F3"
Value="{Binding Operation.MultipleLayerHeightStep}"/>
<TextBlock Grid.Row="0" Grid.Column="10"
VerticalAlignment="Center"
Text="mm"/>
<TextBlock Grid.Row="0" Grid.Column="12"
Text="Maximum layer height:"
VerticalAlignment="Center"/>
<NumericUpDown Grid.Row="0" Grid.Column="14"
Increment="0.01"
Minimum="{Binding Operation.LayerHeight}"
Maximum="0.3"
FormatString="F3"
Value="{Binding Operation.MultipleLayerHeightMaximum}"/>
<TextBlock Grid.Row="0" Grid.Column="16"
VerticalAlignment="Center"
Text="mm"/>
</Grid>
!-->
</StackPanel>
</Expander>
</StackPanel>
<Image Grid.Column="2"
HorizontalAlignment="Center"
VerticalAlignment="Top"
MaxHeight="600"
Stretch="Uniform"
Source="{Binding PreviewImage}"/>
</Grid>
</UserControl>