Files
UVtools/UVtools.WPF/Controls/Tools/ToolDoubleExposureControl.axaml
Tiago Conceição 957729525d v2.27.0
- **Tool - Morph:**
   - (Add) Operator: White tophat - Removes small isolated pixels and only return its affected pixels (Image - Noise removal)
   - (Add) Operator: Black tophat - Closes small holes inside the objects and only return its affected pixels (Gap closing - Image)
   - (Add) Operator: Hit or miss - Finds pixels in a given kernel pattern
   - (Remove) Operator: 'Isolate features' as that is the same as the 'White tophat' and is already inbuilt into OpenCV
- **Kernels:**
   - (Add) Option: Use dynamic kernel to enhancement the quality of the borders (#367)
   - (Add) Kernels are now saved with the operation profile
- **PrusaSlicer:**
   - (Add) Support to slice files to be converted for encrypted CTB format
   - (Add) Printer: Elegoo Mars 3 (#370)
   - (Add) Printer: EPAX E10 5K
   - (Add) Printer: EPAX X10 5K
   - (Add) Printer: Phrozen Sonic Mini 8K
   - (Add) Printer: Phrozen Sonic Mega 8K
   - (Fix) Printer: AnyCubic Photon Mono 4K - display size (#369)
   - (Fix) Printer: AnyCubic Photon Mono X 6K - display size (#369)
- (Add) Tool - Double exposure: Kernel configuration
- (Add) Tool - Pixel arithmetic: Kernel configuration
- (Add) Calibration - Elephant foot: Use dynamic kernel to enhancement the quality of the borders (#367)
- (Fix) Calibrate - Elephant foot: Redo (Ctrl + Z) the operation was crashing the application
- (Fix) CTB, PHZ, FDG: Converting files with a null machine name would cause a exception
- (Fix) Anycubic files: Bottom lift and speed were showing default values instead of real used value
2021-12-18 01:06:06 +00:00

203 lines
10 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.Tools.ToolDoubleExposureControl">
<StackPanel Spacing="10">
<Grid RowDefinitions="Auto,10,Auto,10,Auto,10,Auto,10,Auto"
ColumnDefinitions="Auto,10,Auto,40,Auto">
<TextBlock Grid.Row="0" Grid.Column="2"
VerticalAlignment="Center"
HorizontalAlignment="Center"
FontWeight="Bold"
IsEnabled="{Binding Operation.LayerRangeHaveBottoms}"
Text="Bottom layers"/>
<TextBlock Grid.Row="0" Grid.Column="4"
VerticalAlignment="Center"
HorizontalAlignment="Center"
FontWeight="Bold"
IsEnabled="{Binding Operation.LayerRangeHaveNormals}"
Text="Normal layers"/>
<TextBlock Grid.Row="2" Grid.Column="0"
VerticalAlignment="Center"
Text="1º exposure:"/>
<NumericUpDown Grid.Row="2" Grid.Column="2"
Classes="ValueLabel ValueLabel_s"
IsEnabled="{Binding Operation.LayerRangeHaveBottoms}"
VerticalAlignment="Center"
Minimum="0.01"
Maximum="1000"
Increment="0.5"
Value="{Binding Operation.FirstBottomExposure}"/>
<NumericUpDown Grid.Row="2" Grid.Column="4"
Classes="ValueLabel ValueLabel_s"
IsEnabled="{Binding Operation.LayerRangeHaveNormals}"
VerticalAlignment="Center"
Minimum="0.01"
Maximum="1000"
Increment="0.5"
Value="{Binding Operation.FirstNormalExposure}"/>
<TextBlock Grid.Row="4" Grid.Column="0"
VerticalAlignment="Center"
Text="1º erode iterations:"/>
<NumericUpDown Grid.Row="4" Grid.Column="2"
Classes="ValueLabel ValueLabel_px"
IsEnabled="{Binding Operation.LayerRangeHaveBottoms}"
VerticalAlignment="Center"
Minimum="0"
Maximum="255"
Increment="1"
Value="{Binding Operation.FirstBottomErodeIterations}"/>
<NumericUpDown Grid.Row="4" Grid.Column="4"
Classes="ValueLabel ValueLabel_px"
IsEnabled="{Binding Operation.LayerRangeHaveNormals}"
VerticalAlignment="Center"
Minimum="0"
Maximum="255"
Increment="1"
Value="{Binding Operation.FirstNormalErodeIterations}"/>
<TextBlock Grid.Row="6" Grid.Column="0"
VerticalAlignment="Center"
Text="2º exposure:"/>
<NumericUpDown Grid.Row="6" Grid.Column="2"
Classes="ValueLabel ValueLabel_s"
IsEnabled="{Binding Operation.LayerRangeHaveBottoms}"
VerticalAlignment="Center"
Minimum="0.01"
Maximum="1000"
Increment="0.5"
Value="{Binding Operation.SecondBottomExposure}"/>
<NumericUpDown Grid.Row="6" Grid.Column="4"
Classes="ValueLabel ValueLabel_s"
VerticalAlignment="Center"
IsEnabled="{Binding Operation.LayerRangeHaveNormals}"
Minimum="0.01"
Maximum="1000"
Increment="0.5"
Value="{Binding Operation.SecondNormalExposure}"/>
<TextBlock Grid.Row="8" Grid.Column="0"
VerticalAlignment="Center"
Text="2º erode iterations:"/>
<NumericUpDown Grid.Row="8" Grid.Column="2"
Classes="ValueLabel ValueLabel_px"
IsEnabled="{Binding Operation.LayerRangeHaveBottoms}"
VerticalAlignment="Center"
Minimum="0"
Maximum="255"
Increment="1"
Value="{Binding Operation.SecondBottomErodeIterations}"/>
<NumericUpDown Grid.Row="8" Grid.Column="4"
Classes="ValueLabel ValueLabel_px"
VerticalAlignment="Center"
IsEnabled="{Binding Operation.LayerRangeHaveNormals}"
Minimum="0"
Maximum="255"
Increment="1"
Value="{Binding Operation.SecondNormalErodeIterations}"/>
</Grid>
<ToggleSwitch
OffContent="Exposure the whole image for the second layer"
OnContent="Exposure the difference between first and second layer for the second layer"
IsChecked="{Binding Operation.SecondLayerDifference}"/>
<Grid RowDefinitions="Auto"
ColumnDefinitions="Auto,10,Auto">
<TextBlock Grid.Row="0" Grid.Column="0"
VerticalAlignment="Center"
IsEnabled="{Binding Operation.SecondLayerDifference}"
ToolTip.Tip="When the 'Exposure the difference between first and second layer for the second layer' is active,
this setting will further erode the layer producing a overlap of n pixel perimeters over the previous layer"
Text="Difference overlap by:"/>
<NumericUpDown Grid.Row="0" Grid.Column="2"
Classes="ValueLabel ValueLabel_px"
VerticalAlignment="Center"
IsEnabled="{Binding Operation.SecondLayerDifference}"
Minimum="0"
Maximum="255"
Increment="1"
Value="{Binding Operation.SecondLayerDifferenceOverlapErodeIterations}"/>
</Grid>
<CheckBox
ToolTip.Tip="Change some defined settings for the second layers"
Content="Use different settings for the second layer:"
IsChecked="{Binding Operation.DifferentSettingsForSecondLayer}"/>
<Grid RowDefinitions="Auto,10,Auto" ColumnDefinitions="Auto,10,Auto"
IsEnabled="{Binding Operation.DifferentSettingsForSecondLayer}">
<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.SecondLayerLiftHeightEnabled}"
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.SecondLayerLiftHeightEnabled}"
Value="{Binding Operation.SecondLayerLiftHeight}"/>
<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.SecondLayerWaitTimeBeforeCureEnabled}"
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.SecondLayerWaitTimeBeforeCureEnabled}"
Value="{Binding Operation.SecondLayerWaitTimeBeforeCure}">
<NumericUpDown.IsVisible>
<MultiBinding Converter="{x:Static BoolConverters.Or}">
<Binding Path="SlicerFile.CanUseLayerLightOffDelay"/>
<Binding Path="SlicerFile.CanUseLayerWaitTimeBeforeCure"/>
</MultiBinding>
</NumericUpDown.IsVisible>
</NumericUpDown>
</Grid>
<Expander
Header="Kernel - Advanced options (Click to expand)" Margin="0,10,0,0">
<controls:KernelControl
Name="KernelCtrl"
Kernel="{Binding $parent[UserControl].DataContext.Operation.Kernel}"
Margin="0,10,0,0"/>
</Expander>
</StackPanel>
</UserControl>