mirror of
https://github.com/riegera2412/UVtools.git
synced 2026-07-13 20:07:40 +02:00
0ba61780b7
* (Upgrade) EmguCV/OpenCV to v4.5.1
* (Upgrade) AvaloniaUI to 1.0
* (Improvement) GUI re-touched
* (Improvement) Make pixel editor tab to disappear when pixel editor is disabled
* (Improvement) Simplify the output filename from PrusaSlicer profiles
* (Improvement) All operations require a slicer file at constructor rather than on execute, this allow exposure the open file to the operation before run it
* (Improvement) Calibrations: Auto set "Mirror Output" if open file have MirrorDisplay set
* (Change) Tool - Redraw model/supports icon
* (Change) photon and cbddlp to use version 3 by default
* (Add) Tool - Dynamic layer height: Analyze and optimize the model with dynamic layer heights, larger angles will slice at lower layer height
while more straight angles will slice larger layer height. (#131)
* (Add) Calibration - Exposure time finder: Generates test models with various strategies and increments to verify the best exposure time for a given layer height
* (Add) File load checks, trigger error when a file have critical errors and attempt to fix non-critical errors
* Layers must have an valid image, otherwise trigger an error
* Layers must have a incremental or equal position Z than it previous, otherwise trigger an error
* If layer 0 starts at 0mm it will auto fix all layers, it will add Layer Height to the current z at every layer
* (Add) Tool - Edit print parameters: Allow set parameters to each x layers and skip n layers inside the given range.
This allow the use of optimizations in a layer pattern, for example, to set 3s for a layer but 2.5s for the next.
* (Add) Layer height property to "Layer Data" table: Shows layer height for the slice
* (Fix) When automations applied and file is saved, it will not warn user about file overwrite for the first time save
* (Fix) Tool - Redraw model/supports: Disable apply button when no file selected
* (Fix) Tool - Infill: Lack of equality member to test if same infill profile already exists
* (Fix) Auto converted files from SL1 where clipping filename at first dot (.), now it only strips known extensions
* (Fix) SL1 encoded files wasn't generating the right information and lead to printer crash
* (Fix) PrusaSlicer printer "Anycubic Photon S" LiftSpeed was missing and contains a typo (#135)
* (Fix) PrusaSlicer profile manager wasnt marking missing profiles to be installed (#135)
* (Fix) PrusaSlicer folder search on linux to also look at %HOME%/.config/PrusaSlicer (#135, #136)
* (Fix) Operations were revised and some bug fixed, most about can't cancel the progress
* (Fix) Some typos on tooltips
* (Fix) Prevent PhotonS from enconding, it will trigger error now as this format is read-only
* **(Fix) Ctrl + Shift + Z to redo the last operation:**
* The layer range is reseted instead of pull the used values
* Tool - Arithmetic always disabled
* Action - Layer import didn't generate info and always disabled
139 lines
4.6 KiB
PowerShell
139 lines
4.6 KiB
PowerShell
# UVtools Script
|
|
########################
|
|
# Script Configuration #
|
|
########################
|
|
$_TITLE = 'Erode Bottom'
|
|
$_DESCRIPTION = 'Erodes bottom layers with a given iteration'
|
|
$_AUTHOR = 'Tiago Conceição'
|
|
$_VERSION = 1
|
|
$_CORE_PATH = '' # Input folder path to 'UVtools.Core.dll' if unable to work with env variables
|
|
#eg: [System.Environment]::SetEnvironmentVariable('UVTOOLS_PATH','C:\Program Files (x86)\UVtools', [System.EnvironmentVariableTarget]::User)
|
|
|
|
##############
|
|
# Dont touch #
|
|
##############
|
|
# Sets the culture
|
|
$currentThread = [System.Threading.Thread]::CurrentThread
|
|
$culture = [System.Globalization.CultureInfo]::InvariantCulture
|
|
$currentThread.CurrentCulture = $culture
|
|
$currentThread.CurrentUICulture = $culture
|
|
|
|
##############
|
|
# Dont touch #
|
|
##############
|
|
# Usefull Variables
|
|
$dirSeparator = [IO.Path]::DirectorySeparatorChar
|
|
$scriptPath = $MyInvocation.MyCommand.Name
|
|
$scriptFilenameNoExt = [System.IO.Path]::GetFileNameWithoutExtension($scriptPath);
|
|
$coreDll = 'UVtools.Core.dll'
|
|
$inputFile = $null
|
|
$slicerFile = $null
|
|
|
|
##############
|
|
# Dont touch #
|
|
##############
|
|
# Script information
|
|
Write-Output "###############################################"
|
|
Write-Output "UVtools Script: ${scriptFilenameNoExt}.ps1"
|
|
Write-Output "Title: $_TITLE"
|
|
Write-Output $_DESCRIPTION
|
|
Write-Output "Author: $_AUTHOR"
|
|
Write-Output "Version: $_VERSION"
|
|
Write-Output "###############################################"
|
|
|
|
try{
|
|
if(Test-Path "$Env:UVTOOLS_PATH${dirSeparator}${coreDll}" -PathType Leaf){
|
|
Add-Type -Path "$Env:UVTOOLS_PATH${dirSeparator}${coreDll}"
|
|
}
|
|
elseif(Test-Path "${_CORE_PATH}${dirSeparator}${coreDll}" -PathType Leaf) {
|
|
Add-Type -Path "${_CORE_PATH}${dirSeparator}${coreDll}"
|
|
} else {
|
|
Write-Error "Unable to find $coreDll, solutions are:
|
|
1) Open powershell with admin and run: [System.Environment]::SetEnvironmentVariable('UVTOOLS_PATH','FOLDER/PATH/TO/UVTOOLS', [System.EnvironmentVariableTarget]::User)
|
|
2) Edit the script and set the _CORE_PATH variable with the FOLDER/PATH/TO/UVTOOLS
|
|
Path example: 'C:\Program Files (x86)\UVtools'
|
|
Exiting now!"
|
|
return
|
|
}
|
|
|
|
# Progress variable, not really used here but require with some methods
|
|
$progress = New-Object UVtools.Core.Operations.OperationProgress
|
|
|
|
##############
|
|
# Dont touch #
|
|
##############
|
|
# Input file and validation
|
|
while ($null -eq $inputFile){ # Keep asking for a file if the input is invalid
|
|
$inputFile = read-host "Enter input file"
|
|
if($inputFile -eq 'q' -or $inputFile -eq 'e' -or $inputFile -eq 'exit')
|
|
{
|
|
return;
|
|
}
|
|
if (-not(test-path $inputFile)){
|
|
Write-host "Invalid file path, re-enter."
|
|
$inputFile = $null
|
|
}
|
|
elseif ((get-item $inputFile).psiscontainer){
|
|
Write-host "Input file must be an valid file, re-enter."
|
|
$inputFile = $null
|
|
}
|
|
else {
|
|
$slicerFile = [UVtools.Core.FileFormats.FileFormat]::FindByExtension($inputFile, $true, $true)
|
|
if(!$slicerFile){
|
|
Write-host "Invalid file format, re-enter."
|
|
$inputFile = $null
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
######################################
|
|
# All user inputs should be put here #
|
|
######################################
|
|
# Input iterations number
|
|
[int]$iterations = 0;
|
|
while ($iterations -le 0) { # Keep asking for a number if the input is invalid
|
|
[int]$iterations = Read-Host "Number of bottom erode iterations"
|
|
}
|
|
|
|
##############
|
|
# Dont touch #
|
|
##############
|
|
# Decode the file
|
|
Write-Output "Decoding, please wait..."
|
|
$slicerFile.Decode($inputFile, $progress);
|
|
|
|
###################################################
|
|
# All operations over the file should be put here #
|
|
###################################################
|
|
# Morph bottom erode
|
|
Write-Output "Eroding bottoms with ${iterations} iterations, please wait..."
|
|
$morph = [UVtools.Core.Operations.OperationMorph]::new($slicerFile)
|
|
$morph.MorphOperation = [Emgu.CV.CvEnum.MorphOp]::Erode
|
|
$morph.IterationsStart = $iterations
|
|
$morph.SelectBottomLayers()
|
|
if(!$morph.Execute($progress)){ return; }
|
|
|
|
|
|
##############
|
|
# Dont touch #
|
|
##############
|
|
# Save file with _modified name appended
|
|
$filePath = [System.IO.Path]::GetDirectoryName($inputFile)
|
|
$fileExt = [System.IO.Path]::GetExtension($inputFile)
|
|
$fileNoExt = [System.IO.Path]::GetFileNameWithoutExtension($inputFile)
|
|
$fileOutput = "${filePath}${dirSeparator}${fileNoExt}_modified${fileExt}"
|
|
Write-Output "Saving as ${fileNoExt}_modified${fileExt}, please wait..."
|
|
$slicerFile.SaveAs("$fileOutput", $progress)
|
|
Write-Output "$fileOutput"
|
|
Write-Output "Finished!"
|
|
}
|
|
catch{
|
|
# Catch errors
|
|
Write-Error "An error occurred:"
|
|
Write-Error $_.ScriptStackTrace
|
|
Write-Error $_.Exception.Message
|
|
Write-Error $_.Exception.ItemName
|
|
} |