Files
Tiago Conceição d709cdda41 v0.8.6.0
* (Change) Island detection system:
  * **Before**: A island is consider safe by just have a static amount of pixels, this mean it's possible to have a mass with 100000px supported by only 10px (If safe pixels are configured to this value), so there's no relation with island size and it supporting size. This leads to a big problem and not detecting some potential/unsafe islands.
  * **Now:** Instead of a static number of safe pixels, now there's a multiplier value, which will multiply the island total pixels per the multiplier, the supporting pixels count must be higher than the result of the multiplication.
    *  **Formula:** Supporting pixels >= Island pixels * multiplier
    *  **Example:** Multiplier of 0.25, an island with 1000px * 0.25 = 250px, so this island will not be considered if below exists at least 250px to support it, otherwise will be flagged as an island.
    *  **Notes:** This is a much more fair system but still not optimal, bridges and big planes with micro supports can trigger false islands. While this is a improvement over old system it's not perfect and you probably will have islands which you must ignore. Renember that you not have to clear out the issue list! Simply step over and ignore the issues you think are false-positives.
2020-10-17 04:34:17 +01:00

342 lines
22 KiB
C#

using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Windows.Forms;
using UVtools.Core.FileFormats;
using UVtools.GUI.Properties;
namespace UVtools.GUI.Forms
{
public partial class FrmSettings : Form
{
public FrmSettings()
{
InitializeComponent();
Text = $"UVtools - Settings [v{FrmAbout.AssemblyVersion}]";
var fileFormats = new List<string>
{
FileFormat.AllSlicerFiles.Replace("*", string.Empty)
};
fileFormats.AddRange(from format in FileFormat.AvaliableFormats from extension in format.FileExtensions select $"{extension.Description} (.{extension.Extension})");
cbDefaultOpenFileExtension.Items.AddRange(fileFormats.ToArray());
// Derive strings for the zoom lock and crosshair fade combo-boxes from the
// ZoomLevels constant array, and add those strings to the comboboxes.
var zoomRange = FrmMain.ZoomLevels.Skip(FrmMain.ZoomLevelSkipCount).Select(
s => Convert.ToString((double)s / 100, CultureInfo.InvariantCulture) + "x").ToArray();
cbZoomLockLevel.Items.AddRange(zoomRange);
cbCrosshairFadeLevel.Items.AddRange(zoomRange);
Init();
}
public void Init()
{
try
{
// General
cbStartMaximized.Checked = Settings.Default.StartMaximized;
cbCheckForUpdatesOnStartup.Checked = Settings.Default.CheckForUpdatesOnStartup;
cbLoadDemoFileOnStartup.Checked = Settings.Default.LoadDemoFileOnStartup;
cbDefaultOpenFileExtension.SelectedIndex = Settings.Default.DefaultOpenFileExtension;
tbFileOpenDefaultDirectory.Text = Settings.Default.FileOpenDefaultDirectory;
tbFileSaveDefaultDirectory.Text = Settings.Default.FileSaveDefaultDirectory;
tbFileExtractDefaultDirectory.Text = Settings.Default.FileExtractDefaultDirectory;
tbFileConvertDefaultDirectory.Text = Settings.Default.FileConvertDefaultDirectory;
cbFileSavePromptOverwrite.Checked = Settings.Default.FileSavePromptOverwrite;
tbFileSaveNamePreffix.Text = Settings.Default.FileSaveNamePreffix;
tbFileSaveNameSuffix.Text = Settings.Default.FileSaveNameSuffix;
// Layer Preview
btnLayerTooltipOverlayColor.BackColor = Settings.Default.LayerTooltipOverlayColor;
nmLayerTooltipOverlayOpacity.Value = Settings.Default.LayerTooltipOverlayOpacity;
cbLayerTooltipOverlay.Checked = Settings.Default.LayerTooltipOverlay;
btnPreviousNextLayerColor.BackColor = Settings.Default.PreviousNextLayerColor;
btnPreviousLayerColor.BackColor = Settings.Default.PreviousLayerColor;
btnNextLayerColor.BackColor = Settings.Default.NextLayerColor;
btnIslandColor.BackColor = Settings.Default.IslandColor;
btnIslandHLColor.BackColor = Settings.Default.IslandHLColor;
btnOverhangColor.BackColor = Settings.Default.OverhangColor;
btnOverhangHLColor.BackColor = Settings.Default.OverhangHLColor;
btnResinTrapColor.BackColor = Settings.Default.ResinTrapColor;
btnResinTrapHLColor.BackColor = Settings.Default.ResinTrapHLColor;
btnTouchingBoundsColor.BackColor = Settings.Default.TouchingBoundsColor;
btnCrosshairColor.BackColor = Settings.Default.CrosshairColor;
btnOutlinePrintVolumeBoundsColor.BackColor = Settings.Default.OutlinePrintVolumeBoundsColor;
btnOutlineLayerBoundsColor.BackColor = Settings.Default.OutlineLayerBoundsColor;
btnOutlineHollowAreasColor.BackColor = Settings.Default.OutlineHollowAreasColor;
nmOutlinePrintVolumeBoundsLineThickness.Value = Settings.Default.OutlinePrintVolumeBoundsLineThickness;
nmOutlineLayerBoundsLineThickness.Value = Settings.Default.OutlineLayerBoundsLineThickness;
nmOutlineHollowAreasLineThickness.Value = Settings.Default.OutlineHollowAreasLineThickness;
cbOutlinePrintVolumeBounds.Checked = Settings.Default.OutlinePrintVolumeBounds;
cbOutlineLayerBounds.Checked = Settings.Default.OutlineLayerBounds;
cbOutlineHollowAreas.Checked = Settings.Default.OutlineHollowAreas;
cbLayerAutoRotateBestView.Checked = Settings.Default.LayerAutoRotateBestView;
cbLayerZoomToFit.Checked = Settings.Default.LayerZoomToFit;
cbZoomToFit.SelectedIndex = Settings.Default.ZoomToFitPrintVolumeBounds == true ? 0 : 1;
cbZoomIssues.Checked = Settings.Default.ZoomIssues;
cbZoomLockLevel.SelectedIndex = Settings.Default.ZoomLockLevel;
cbLayerDifferenceDefault.Checked = Settings.Default.LayerDifferenceDefault;
cbCrosshairShowOnlyOnSelectedIssues.Checked = Settings.Default.CrosshairShowOnlyOnSelectedIssues;
cbCrosshairFadeLevel.SelectedIndex = Settings.Default.CrosshairFadeLevel;
nmCrosshairLineLength.Value = Settings.Default.CrosshairLineLength;
nmCrosshairLineMargin.Value = Settings.Default.CrosshairLineMargin;
// Issues
cbComputeIssuesOnLoad.Checked = Settings.Default.ComputeIssuesOnLoad;
cbAutoComputeIssuesClickOnTab.Checked = Settings.Default.AutoComputeIssuesClickOnTab;
cbComputeIslands.Checked = Settings.Default.ComputeIslands;
cbComputeOverhangs.Checked = Settings.Default.ComputeOverhangs;
cbComputeResinTraps.Checked = Settings.Default.ComputeResinTraps;
cbComputeTouchingBounds.Checked = Settings.Default.ComputeTouchingBounds;
cbComputeEmptyLayers.Checked = Settings.Default.ComputeEmptyLayers;
cbIslandAllowDiagonalBonds.Checked = Settings.Default.IslandAllowDiagonalBonds;
nmIslandBinaryThreshold.Value = Settings.Default.IslandBinaryThreshold;
nmIslandRequiredAreaToProcessCheck.Value = Settings.Default.IslandRequiredAreaToProcessCheck;
nmIslandRequiredPixelBrightnessToProcessCheck.Value = Settings.Default.IslandRequiredPixelBrightnessToProcessCheck;
nmIslandRequiredPixelsToSupportMultiplier.Value = Settings.Default.IslandRequiredPixelsToSupportMultiplier;
nmIslandRequiredPixelBrightnessToSupport.Value = Settings.Default.IslandRequiredPixelBrightnessToSupport;
cbOverhangIndependentFromIslands.Checked = Settings.Default.OverhangIndependentFromIslands;
nmOverhangErodeIterations.Value = Settings.Default.OverhangErodeIterations;
nmResinTrapBinaryThreshold.Value = Settings.Default.ResinTrapBinaryThreshold;
nmResinTrapRequiredAreaToProcessCheck.Value = Settings.Default.ResinTrapRequiredAreaToProcessCheck;
nmResinTrapRequiredBlackPixelsToDrain.Value = Settings.Default.ResinTrapRequiredBlackPixelsToDrain;
nmResinTrapMaximumPixelBrightnessToDrain.Value = Settings.Default.ResinTrapMaximumPixelBrightnessToDrain;
// Pixel Editor
btnPixelEditorAddPixelColor.BackColor = Settings.Default.PixelEditorAddPixelColor;
btnPixelEditorAddPixelHLColor.BackColor = Settings.Default.PixelEditorAddPixelHLColor;
btnPixelEditorRemovePixelColor.BackColor = Settings.Default.PixelEditorRemovePixelColor;
btnPixelEditorRemovePixelHLColor.BackColor = Settings.Default.PixelEditorRemovePixelHLColor;
btnPixelEditorSupportColor.BackColor = Settings.Default.PixelEditorSupportColor;
btnPixelEditorSupportHLColor.BackColor = Settings.Default.PixelEditorSupportHLColor;
btnPixelEditorDrainHoleColor.BackColor = Settings.Default.PixelEditorDrainHoleColor;
btnPixelEditorDrainHoleHLColor.BackColor = Settings.Default.PixelEditorDrainHoleHLColor;
cbPartialUpdateIslandsOnEditing.Checked = Settings.Default.PartialUpdateIslandsOnEditing;
cbCloseEditOnApply.Checked = Settings.Default.CloseEditOnApply;
// Layer Repair
nmLayerRepairDefaultClosingIterations.Value = Settings.Default.LayerRepairDefaultClosingIterations;
nmLayerRepairDefaultOpeningIterations.Value = Settings.Default.LayerRepairDefaultOpeningIterations;
nmLayerRepairRemoveIslandsBelowEqualPixelsDefault.Value = Settings.Default.LayerRepairRemoveIslandsBelowEqualPixelsDefault;
cbLayerRepairLayersIslands.Checked = Settings.Default.LayerRepairLayersIslands;
cbLayerRepairRemoveEmptyLayers.Checked = Settings.Default.LayerRepairRemoveEmptyLayers;
cbLayerRepairResinTraps.Checked = Settings.Default.LayerRepairResinTraps;
}
catch (Exception ex)
{
MessageBox.Show($"Unable to use current settings, a reset will be performed.\n{ex.Message}",
"Unable to use current settings", MessageBoxButtons.OK, MessageBoxIcon.Error);
Settings.Default.Reset();
Settings.Default.Save();
Init();
}
}
private void EventClick(object sender, EventArgs e)
{
if (
ReferenceEquals(sender, btnPreviousNextLayerColor) ||
ReferenceEquals(sender, btnPreviousLayerColor) ||
ReferenceEquals(sender, btnNextLayerColor) ||
ReferenceEquals(sender, btnIslandColor) ||
ReferenceEquals(sender, btnIslandHLColor) ||
ReferenceEquals(sender, btnOverhangColor) ||
ReferenceEquals(sender, btnOverhangHLColor) ||
ReferenceEquals(sender, btnResinTrapColor) ||
ReferenceEquals(sender, btnResinTrapHLColor) ||
ReferenceEquals(sender, btnTouchingBoundsColor) ||
ReferenceEquals(sender, btnCrosshairColor) ||
ReferenceEquals(sender, btnLayerTooltipOverlayColor) ||
ReferenceEquals(sender, btnOutlinePrintVolumeBoundsColor) ||
ReferenceEquals(sender, btnOutlineLayerBoundsColor) ||
ReferenceEquals(sender, btnOutlineHollowAreasColor) ||
ReferenceEquals(sender, btnPixelEditorAddPixelColor) ||
ReferenceEquals(sender, btnPixelEditorAddPixelHLColor) ||
ReferenceEquals(sender, btnPixelEditorRemovePixelColor) ||
ReferenceEquals(sender, btnPixelEditorRemovePixelHLColor) ||
ReferenceEquals(sender, btnPixelEditorSupportColor) ||
ReferenceEquals(sender, btnPixelEditorDrainHoleColor) ||
ReferenceEquals(sender, btnPixelEditorSupportHLColor) ||
ReferenceEquals(sender, btnPixelEditorDrainHoleHLColor)
)
{
Button btn = sender as Button;
colorDialog.Color = btn.BackColor;
if (colorDialog.ShowDialog() != DialogResult.OK) return;
btn.BackColor = colorDialog.Color;
return;
}
if (ReferenceEquals(sender, btnFileOpenDefaultDirectorySearch) || ReferenceEquals(sender, btnFileSaveDefaultDirectorySearch) || ReferenceEquals(sender, btnFileConvertDefaultDirectorySearch) || ReferenceEquals(sender, btnFileExtractDefaultDirectorySearch))
{
using (FolderBrowserDialog folder = new FolderBrowserDialog())
{
if (folder.ShowDialog() != DialogResult.OK) return;
if (ReferenceEquals(sender, btnFileOpenDefaultDirectorySearch)) tbFileOpenDefaultDirectory.Text = folder.SelectedPath;
else if (ReferenceEquals(sender, btnFileSaveDefaultDirectorySearch)) tbFileSaveDefaultDirectory.Text = folder.SelectedPath;
else if (ReferenceEquals(sender, btnFileExtractDefaultDirectorySearch)) tbFileExtractDefaultDirectory.Text = folder.SelectedPath;
else if (ReferenceEquals(sender, btnFileConvertDefaultDirectorySearch)) tbFileConvertDefaultDirectory.Text = folder.SelectedPath;
}
return;
}
if (ReferenceEquals(sender, btnFileOpenDefaultDirectoryClear))
{
tbFileOpenDefaultDirectory.Text = string.Empty;
return;
}
if (ReferenceEquals(sender, btnFileSaveDefaultDirectoryClear))
{
tbFileSaveDefaultDirectory.Text = string.Empty;
return;
}
if (ReferenceEquals(sender, btnFileExtractDefaultDirectoryClear))
{
tbFileExtractDefaultDirectory.Text = string.Empty;
return;
}
if (ReferenceEquals(sender, btnFileConvertDefaultDirectoryClear))
{
tbFileConvertDefaultDirectory.Text = string.Empty;
return;
}
if (ReferenceEquals(sender, btnReset))
{
if (MessageBox.Show("Are you sure you want to reset the settings to the default values?",
"Reset settings?", MessageBoxButtons.YesNo, MessageBoxIcon.Question) !=
DialogResult.Yes) return;
Settings.Default.Reset();
Settings.Default.UpgradeSettings = false;
Init();
return;
}
if (ReferenceEquals(sender, btnSave))
{
// General
Settings.Default.StartMaximized = cbStartMaximized.Checked;
Settings.Default.CheckForUpdatesOnStartup = cbCheckForUpdatesOnStartup.Checked;
Settings.Default.LoadDemoFileOnStartup = cbLoadDemoFileOnStartup.Checked;
Settings.Default.DefaultOpenFileExtension = (byte) cbDefaultOpenFileExtension.SelectedIndex;
Settings.Default.FileOpenDefaultDirectory = tbFileOpenDefaultDirectory.Text;
Settings.Default.FileSaveDefaultDirectory = tbFileSaveDefaultDirectory.Text;
Settings.Default.FileExtractDefaultDirectory = tbFileExtractDefaultDirectory.Text;
Settings.Default.FileConvertDefaultDirectory = tbFileConvertDefaultDirectory.Text;
Settings.Default.FileSavePromptOverwrite = cbFileSavePromptOverwrite.Checked;
Settings.Default.FileSaveNamePreffix = tbFileSaveNamePreffix.Text.Trim();
Settings.Default.FileSaveNameSuffix = tbFileSaveNameSuffix.Text.Trim();
// Layer Preview
Program.FrmMain.lbLayerImageTooltipOverlay.TransparentBackColor = Settings.Default.LayerTooltipOverlayColor = btnLayerTooltipOverlayColor.BackColor;
Program.FrmMain.lbLayerImageTooltipOverlay.Opacity = Settings.Default.LayerTooltipOverlayOpacity = (byte) nmLayerTooltipOverlayOpacity.Value;
Settings.Default.LayerTooltipOverlay = cbLayerTooltipOverlay.Checked;
Settings.Default.PreviousNextLayerColor = btnPreviousNextLayerColor.BackColor;
Settings.Default.PreviousLayerColor = btnPreviousLayerColor.BackColor;
Settings.Default.NextLayerColor = btnNextLayerColor.BackColor;
Settings.Default.IslandColor = btnIslandColor.BackColor;
Settings.Default.IslandHLColor = btnIslandHLColor.BackColor;
Settings.Default.OverhangColor = btnOverhangColor.BackColor;
Settings.Default.OverhangHLColor = btnOverhangHLColor.BackColor;
Settings.Default.ResinTrapColor = btnResinTrapColor.BackColor;
Settings.Default.ResinTrapHLColor = btnResinTrapHLColor.BackColor;
Settings.Default.TouchingBoundsColor = btnTouchingBoundsColor.BackColor;
Settings.Default.CrosshairColor = btnCrosshairColor.BackColor;
Settings.Default.OutlinePrintVolumeBoundsColor = btnOutlinePrintVolumeBoundsColor.BackColor;
Settings.Default.OutlineLayerBoundsColor = btnOutlineLayerBoundsColor.BackColor;
Settings.Default.OutlineHollowAreasColor = btnOutlineHollowAreasColor.BackColor;
Settings.Default.OutlinePrintVolumeBoundsLineThickness = (byte) nmOutlinePrintVolumeBoundsLineThickness.Value;
Settings.Default.OutlineLayerBoundsLineThickness = (byte) nmOutlineLayerBoundsLineThickness.Value;
Settings.Default.OutlineHollowAreasLineThickness = (sbyte) nmOutlineHollowAreasLineThickness.Value;
Settings.Default.OutlinePrintVolumeBounds = cbOutlinePrintVolumeBounds.Checked;
Settings.Default.OutlineLayerBounds = cbOutlineLayerBounds.Checked;
Settings.Default.OutlineHollowAreas = cbOutlineHollowAreas.Checked;
Settings.Default.LayerAutoRotateBestView = cbLayerAutoRotateBestView.Checked;
Settings.Default.LayerZoomToFit = cbLayerZoomToFit.Checked;
Settings.Default.ZoomToFitPrintVolumeBounds = cbZoomToFit.SelectedIndex == 0;
Settings.Default.ZoomIssues = cbZoomIssues.Checked;
Settings.Default.ZoomLockLevel = (byte)cbZoomLockLevel.SelectedIndex;
Settings.Default.LayerDifferenceDefault = cbLayerDifferenceDefault.Checked;
Settings.Default.CrosshairShowOnlyOnSelectedIssues = cbCrosshairShowOnlyOnSelectedIssues.Checked;
Settings.Default.CrosshairFadeLevel = (byte)cbCrosshairFadeLevel.SelectedIndex;
Settings.Default.CrosshairLineLength = (uint)nmCrosshairLineLength.Value;
Settings.Default.CrosshairLineMargin = (byte)nmCrosshairLineMargin.Value;
// Issues
Settings.Default.ComputeIssuesOnLoad = cbComputeIssuesOnLoad.Checked;
Settings.Default.AutoComputeIssuesClickOnTab = cbAutoComputeIssuesClickOnTab.Checked;
Settings.Default.ComputeIslands = cbComputeIslands.Checked;
Settings.Default.ComputeOverhangs = cbComputeOverhangs.Checked;
Settings.Default.ComputeResinTraps = cbComputeResinTraps.Checked;
Settings.Default.ComputeTouchingBounds = cbComputeTouchingBounds.Checked;
Settings.Default.ComputeEmptyLayers = cbComputeEmptyLayers.Checked;
Settings.Default.IslandAllowDiagonalBonds = cbIslandAllowDiagonalBonds.Checked;
Settings.Default.IslandBinaryThreshold = (byte)nmIslandBinaryThreshold.Value;
Settings.Default.IslandRequiredAreaToProcessCheck = (byte) nmIslandRequiredAreaToProcessCheck.Value;
Settings.Default.IslandRequiredPixelBrightnessToProcessCheck = (byte)nmIslandRequiredPixelBrightnessToProcessCheck.Value;
Settings.Default.IslandRequiredPixelsToSupportMultiplier = nmIslandRequiredPixelsToSupportMultiplier.Value;
Settings.Default.IslandRequiredPixelBrightnessToSupport = (byte)nmIslandRequiredPixelBrightnessToSupport.Value;
Settings.Default.OverhangIndependentFromIslands = cbOverhangIndependentFromIslands.Checked;
Settings.Default.OverhangErodeIterations = (byte)nmOverhangErodeIterations.Value;
Settings.Default.ResinTrapBinaryThreshold = (byte) nmResinTrapBinaryThreshold.Value;
Settings.Default.ResinTrapRequiredAreaToProcessCheck = (byte)nmResinTrapRequiredAreaToProcessCheck.Value;
Settings.Default.ResinTrapRequiredBlackPixelsToDrain = (byte)nmResinTrapRequiredBlackPixelsToDrain.Value;
Settings.Default.ResinTrapMaximumPixelBrightnessToDrain = (byte)nmResinTrapMaximumPixelBrightnessToDrain.Value;
// Pixel Editor
Settings.Default.PixelEditorAddPixelColor = btnPixelEditorAddPixelColor.BackColor;
Settings.Default.PixelEditorAddPixelHLColor = btnPixelEditorAddPixelHLColor.BackColor;
Settings.Default.PixelEditorRemovePixelColor = btnPixelEditorRemovePixelColor.BackColor;
Settings.Default.PixelEditorRemovePixelHLColor = btnPixelEditorRemovePixelHLColor.BackColor;
Settings.Default.PixelEditorSupportColor = btnPixelEditorSupportColor.BackColor;
Settings.Default.PixelEditorDrainHoleColor = btnPixelEditorDrainHoleColor.BackColor;
Settings.Default.PixelEditorSupportHLColor = btnPixelEditorSupportHLColor.BackColor;
Settings.Default.PixelEditorDrainHoleHLColor = btnPixelEditorDrainHoleHLColor.BackColor;
Settings.Default.PartialUpdateIslandsOnEditing = cbPartialUpdateIslandsOnEditing.Checked;
Settings.Default.CloseEditOnApply = cbCloseEditOnApply.Checked;
// Layer Repair
Settings.Default.LayerRepairDefaultClosingIterations = (byte) nmLayerRepairDefaultClosingIterations.Value;
Settings.Default.LayerRepairDefaultOpeningIterations = (byte) nmLayerRepairDefaultOpeningIterations.Value;
Settings.Default.LayerRepairRemoveIslandsBelowEqualPixelsDefault = (byte) nmLayerRepairRemoveIslandsBelowEqualPixelsDefault.Value;
Settings.Default.LayerRepairLayersIslands = cbLayerRepairLayersIslands.Checked;
Settings.Default.LayerRepairRemoveEmptyLayers = cbLayerRepairRemoveEmptyLayers.Checked;
Settings.Default.LayerRepairResinTraps = cbLayerRepairResinTraps.Checked;
Settings.Default.Save();
DialogResult = DialogResult.OK;
return;
}
}
}
}