mirror of
https://github.com/riegera2412/UVtools.git
synced 2026-07-08 17:42:31 +02:00
v2.20.0
- **File formats:** - (Add) FlashForge SVGX format of FlashDLPrint - (Improvement) Change `DisplayMirror` from `bool` to a `FlipDirection` enumeration, to be able to identify the exact mirror direction - **(Add) PrusaSlicer Printers:** - FlashForge Explorer MAX - FlashForge Focus 8.9 - FlashForge Focus 13.3 - FlashForge Foto 6.0 - FlashForge Foto 8.9 - FlashForge Foto 13.3 - AnyCubic Photon Mono SQ - AnyCubic Photon Ultra - (Add) Pixel arithmetic: Preset "Elephant foot compensation"
This commit is contained in:
@@ -1,5 +1,28 @@
|
||||
# Changelog
|
||||
|
||||
## 24/08/2021 - v2.20.0
|
||||
|
||||
- **File formats:**
|
||||
- (Add) FlashForge SVGX format of FlashDLPrint
|
||||
- (Improvement) Change `DisplayMirror` from `bool` to a `FlipDirection` enumeration, to be able to identify the exact mirror direction
|
||||
- **(Add) PrusaSlicer Printers:**
|
||||
- FlashForge Explorer MAX
|
||||
- FlashForge Focus 8.9
|
||||
- FlashForge Focus 13.3
|
||||
- FlashForge Foto 6.0
|
||||
- FlashForge Foto 8.9
|
||||
- FlashForge Foto 13.3
|
||||
- AnyCubic Photon Mono SQ
|
||||
- AnyCubic Photon Ultra
|
||||
- (Add) Pixel arithmetic: Preset "Elephant foot compensation"
|
||||
<!--
|
||||
- **FileFormat PhotonWorkshop:**
|
||||
- (Add) Compability with version 515
|
||||
- (Add) Support for Photon Mono SQ (PMSQ)
|
||||
- (Add) Support for Photon Ultra (DLP)
|
||||
|
||||
!-->
|
||||
|
||||
## 22/08/2021 - v2.19.5
|
||||
|
||||
- **(Fix) CTB:**
|
||||
|
||||
@@ -0,0 +1,38 @@
|
||||
# generated by PrusaSlicer 2.3.1+win64 on 2021-08-23 at 15:24:23 UTC
|
||||
absolute_correction = 0
|
||||
area_fill = 50
|
||||
bed_custom_model =
|
||||
bed_custom_texture =
|
||||
bed_shape = 0x0,120x0,120x128,0x128
|
||||
default_sla_material_profile = Prusa Orange Tough 0.05
|
||||
default_sla_print_profile = 0.05 Normal
|
||||
display_height = 128
|
||||
display_mirror_x = 1
|
||||
display_mirror_y = 0
|
||||
display_orientation = landscape
|
||||
display_pixels_x = 2400
|
||||
display_pixels_y = 2560
|
||||
display_width = 120
|
||||
elefant_foot_compensation = 0.2
|
||||
elefant_foot_min_width = 0.2
|
||||
fast_tilt_time = 5
|
||||
gamma_correction = 1
|
||||
host_type = octoprint
|
||||
inherits = Original Prusa SL1
|
||||
max_exposure_time = 120
|
||||
max_initial_exposure_time = 300
|
||||
max_print_height = 200
|
||||
min_exposure_time = 1
|
||||
min_initial_exposure_time = 1
|
||||
print_host =
|
||||
printer_model = SL1
|
||||
printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_PRUSA3D\nPRINTER_MODEL_SL1\nPRINTER_VENDOR_ANYCUBIC\nPRINTER_MODEL_PHOTON_MONO_SQ\nFILEFORMAT_PMSQ\n\nSTART_CUSTOM_VALUES\nLightOffDelay_0\nBottomLightOffDelay_0\nBottomLiftHeight_8\nLiftHeight_8\nBottomLiftSpeed_150\nLiftSpeed_150\nRetractSpeed_150\nBottomLightPWM_255\nLightPWM_255\nEND_CUSTOM_VALUES
|
||||
printer_settings_id =
|
||||
printer_technology = SLA
|
||||
printer_variant = default
|
||||
printer_vendor =
|
||||
printhost_apikey =
|
||||
printhost_cafile =
|
||||
relative_correction = 1,1
|
||||
slow_tilt_time = 8
|
||||
thumbnails = 400x400,800x480
|
||||
@@ -0,0 +1,38 @@
|
||||
# generated by PrusaSlicer 2.3.1+win64 on 2021-08-23 at 15:46:01 UTC
|
||||
absolute_correction = 0
|
||||
area_fill = 50
|
||||
bed_custom_model =
|
||||
bed_custom_texture =
|
||||
bed_shape = 0x0,102.4x0,102.4x57.6,0x57.6
|
||||
default_sla_material_profile = Prusa Orange Tough 0.05
|
||||
default_sla_print_profile = 0.05 Normal
|
||||
display_height = 57.6
|
||||
display_mirror_x = 1
|
||||
display_mirror_y = 0
|
||||
display_orientation = landscape
|
||||
display_pixels_x = 1280
|
||||
display_pixels_y = 720
|
||||
display_width = 102.4
|
||||
elefant_foot_compensation = 0.2
|
||||
elefant_foot_min_width = 0.2
|
||||
fast_tilt_time = 5
|
||||
gamma_correction = 1
|
||||
host_type = octoprint
|
||||
inherits = Original Prusa SL1
|
||||
max_exposure_time = 120
|
||||
max_initial_exposure_time = 300
|
||||
max_print_height = 165
|
||||
min_exposure_time = 1
|
||||
min_initial_exposure_time = 1
|
||||
print_host =
|
||||
printer_model = SL1
|
||||
printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_PRUSA3D\nPRINTER_MODEL_SL1\nPRINTER_VENDOR_ANYCUBIC\nPRINTER_MODEL_PHOTON_ULTRA\nFILEFORMAT_DLP\n\nSTART_CUSTOM_VALUES\nLightOffDelay_0\nBottomLightOffDelay_0\nBottomLiftHeight_6\nLiftHeight_5\nBottomLiftSpeed_150\nLiftSpeed_150\nRetractSpeed_150\nBottomLightPWM_255\nLightPWM_255\nEND_CUSTOM_VALUES
|
||||
printer_settings_id =
|
||||
printer_technology = SLA
|
||||
printer_variant = default
|
||||
printer_vendor =
|
||||
printhost_apikey =
|
||||
printhost_cafile =
|
||||
relative_correction = 1,1
|
||||
slow_tilt_time = 8
|
||||
thumbnails = 400x400,800x480
|
||||
@@ -0,0 +1,38 @@
|
||||
# generated by PrusaSlicer 2.3.1+win64 on 2021-08-24 at 03:12:51 UTC
|
||||
absolute_correction = 0
|
||||
area_fill = 50
|
||||
bed_custom_model =
|
||||
bed_custom_texture =
|
||||
bed_shape = 0x0,192x0,192x120,0x120
|
||||
default_sla_material_profile = Prusa Orange Tough 0.05
|
||||
default_sla_print_profile = 0.05 Normal
|
||||
display_height = 120
|
||||
display_mirror_x = 0
|
||||
display_mirror_y = 1
|
||||
display_orientation = landscape
|
||||
display_pixels_x = 2560
|
||||
display_pixels_y = 1600
|
||||
display_width = 192
|
||||
elefant_foot_compensation = 0.2
|
||||
elefant_foot_min_width = 0.2
|
||||
fast_tilt_time = 5
|
||||
gamma_correction = 1
|
||||
host_type = octoprint
|
||||
inherits = Original Prusa SL1
|
||||
max_exposure_time = 120
|
||||
max_initial_exposure_time = 300
|
||||
max_print_height = 200
|
||||
min_exposure_time = 1
|
||||
min_initial_exposure_time = 1
|
||||
print_host =
|
||||
printer_model = SL1
|
||||
printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_PRUSA3D\nPRINTER_MODEL_SL1\nPRINTER_VENDOR_FLASHFORGE\nPRINTER_MODEL_EXPLORER_MAX\nFILEFORMAT_SVGX\n\nSTART_CUSTOM_VALUES\nEND_CUSTOM_VALUES
|
||||
printer_settings_id =
|
||||
printer_technology = SLA
|
||||
printer_variant = default
|
||||
printer_vendor =
|
||||
printhost_apikey =
|
||||
printhost_cafile =
|
||||
relative_correction = 1,1
|
||||
slow_tilt_time = 8
|
||||
thumbnails = 400x400,800x480
|
||||
@@ -0,0 +1,38 @@
|
||||
# generated by PrusaSlicer 2.3.1+win64 on 2021-08-24 at 03:10:40 UTC
|
||||
absolute_correction = 0
|
||||
area_fill = 50
|
||||
bed_custom_model =
|
||||
bed_custom_texture =
|
||||
bed_shape = 0x0,292x0,292x165,0x165
|
||||
default_sla_material_profile = Prusa Orange Tough 0.05
|
||||
default_sla_print_profile = 0.05 Normal
|
||||
display_height = 165
|
||||
display_mirror_x = 0
|
||||
display_mirror_y = 1
|
||||
display_orientation = landscape
|
||||
display_pixels_x = 3842
|
||||
display_pixels_y = 2171
|
||||
display_width = 292
|
||||
elefant_foot_compensation = 0.2
|
||||
elefant_foot_min_width = 0.2
|
||||
fast_tilt_time = 5
|
||||
gamma_correction = 1
|
||||
host_type = octoprint
|
||||
inherits = Original Prusa SL1
|
||||
max_exposure_time = 120
|
||||
max_initial_exposure_time = 300
|
||||
max_print_height = 400
|
||||
min_exposure_time = 1
|
||||
min_initial_exposure_time = 1
|
||||
print_host =
|
||||
printer_model = SL1
|
||||
printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_PRUSA3D\nPRINTER_MODEL_SL1\nPRINTER_VENDOR_FLASHFORGE\nPRINTER_MODEL_FOCUS_13.3\nFILEFORMAT_SVGX\n\nSTART_CUSTOM_VALUES\nEND_CUSTOM_VALUES
|
||||
printer_settings_id =
|
||||
printer_technology = SLA
|
||||
printer_variant = default
|
||||
printer_vendor =
|
||||
printhost_apikey =
|
||||
printhost_cafile =
|
||||
relative_correction = 1,1
|
||||
slow_tilt_time = 8
|
||||
thumbnails = 400x400,800x480
|
||||
@@ -0,0 +1,38 @@
|
||||
# generated by PrusaSlicer 2.3.1+win64 on 2021-08-24 at 03:10:45 UTC
|
||||
absolute_correction = 0
|
||||
area_fill = 50
|
||||
bed_custom_model =
|
||||
bed_custom_texture =
|
||||
bed_shape = 0x0,192x0,192x120,0x120
|
||||
default_sla_material_profile = Prusa Orange Tough 0.05
|
||||
default_sla_print_profile = 0.05 Normal
|
||||
display_height = 120
|
||||
display_mirror_x = 0
|
||||
display_mirror_y = 1
|
||||
display_orientation = landscape
|
||||
display_pixels_x = 3840
|
||||
display_pixels_y = 2400
|
||||
display_width = 192
|
||||
elefant_foot_compensation = 0.2
|
||||
elefant_foot_min_width = 0.2
|
||||
fast_tilt_time = 5
|
||||
gamma_correction = 1
|
||||
host_type = octoprint
|
||||
inherits = Original Prusa SL1
|
||||
max_exposure_time = 120
|
||||
max_initial_exposure_time = 300
|
||||
max_print_height = 200
|
||||
min_exposure_time = 1
|
||||
min_initial_exposure_time = 1
|
||||
print_host =
|
||||
printer_model = SL1
|
||||
printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_PRUSA3D\nPRINTER_MODEL_SL1\nPRINTER_VENDOR_FLASHFORGE\nPRINTER_MODEL_FOCUS_8.9\nFILEFORMAT_SVGX\n\nSTART_CUSTOM_VALUES\nEND_CUSTOM_VALUES
|
||||
printer_settings_id =
|
||||
printer_technology = SLA
|
||||
printer_variant = default
|
||||
printer_vendor =
|
||||
printhost_apikey =
|
||||
printhost_cafile =
|
||||
relative_correction = 1,1
|
||||
slow_tilt_time = 8
|
||||
thumbnails = 400x400,800x480
|
||||
@@ -0,0 +1,38 @@
|
||||
# generated by PrusaSlicer 2.3.1+win64 on 2021-08-24 at 03:10:50 UTC
|
||||
absolute_correction = 0
|
||||
area_fill = 50
|
||||
bed_custom_model =
|
||||
bed_custom_texture =
|
||||
bed_shape = 0x0,292x0,292x165,0x165
|
||||
default_sla_material_profile = Prusa Orange Tough 0.05
|
||||
default_sla_print_profile = 0.05 Normal
|
||||
display_height = 165
|
||||
display_mirror_x = 0
|
||||
display_mirror_y = 1
|
||||
display_orientation = landscape
|
||||
display_pixels_x = 3842
|
||||
display_pixels_y = 2171
|
||||
display_width = 292
|
||||
elefant_foot_compensation = 0.2
|
||||
elefant_foot_min_width = 0.2
|
||||
fast_tilt_time = 5
|
||||
gamma_correction = 1
|
||||
host_type = octoprint
|
||||
inherits = Original Prusa SL1
|
||||
max_exposure_time = 120
|
||||
max_initial_exposure_time = 300
|
||||
max_print_height = 400
|
||||
min_exposure_time = 1
|
||||
min_initial_exposure_time = 1
|
||||
print_host =
|
||||
printer_model = SL1
|
||||
printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_PRUSA3D\nPRINTER_MODEL_SL1\nPRINTER_VENDOR_FLASHFORGE\nPRINTER_MODEL_FOTO_13.3\nFILEFORMAT_SVGX\n\nSTART_CUSTOM_VALUES\nEND_CUSTOM_VALUES
|
||||
printer_settings_id =
|
||||
printer_technology = SLA
|
||||
printer_variant = default
|
||||
printer_vendor =
|
||||
printhost_apikey =
|
||||
printhost_cafile =
|
||||
relative_correction = 1,1
|
||||
slow_tilt_time = 8
|
||||
thumbnails = 400x400,800x480
|
||||
@@ -0,0 +1,38 @@
|
||||
# generated by PrusaSlicer 2.3.1+win64 on 2021-08-24 at 03:10:53 UTC
|
||||
absolute_correction = 0
|
||||
area_fill = 50
|
||||
bed_custom_model =
|
||||
bed_custom_texture =
|
||||
bed_shape = 0x0,130x0,130x78,0x78
|
||||
default_sla_material_profile = Prusa Orange Tough 0.05
|
||||
default_sla_print_profile = 0.05 Normal
|
||||
display_height = 78
|
||||
display_mirror_x = 0
|
||||
display_mirror_y = 1
|
||||
display_orientation = landscape
|
||||
display_pixels_x = 2600
|
||||
display_pixels_y = 1560
|
||||
display_width = 130
|
||||
elefant_foot_compensation = 0.2
|
||||
elefant_foot_min_width = 0.2
|
||||
fast_tilt_time = 5
|
||||
gamma_correction = 1
|
||||
host_type = octoprint
|
||||
inherits = Original Prusa SL1
|
||||
max_exposure_time = 120
|
||||
max_initial_exposure_time = 300
|
||||
max_print_height = 155
|
||||
min_exposure_time = 1
|
||||
min_initial_exposure_time = 1
|
||||
print_host =
|
||||
printer_model = SL1
|
||||
printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_PRUSA3D\nPRINTER_MODEL_SL1\nPRINTER_VENDOR_FLASHFORGE\nPRINTER_MODEL_FOTO_6.0\nFILEFORMAT_SVGX\n\nSTART_CUSTOM_VALUES\nEND_CUSTOM_VALUES
|
||||
printer_settings_id =
|
||||
printer_technology = SLA
|
||||
printer_variant = default
|
||||
printer_vendor =
|
||||
printhost_apikey =
|
||||
printhost_cafile =
|
||||
relative_correction = 1,1
|
||||
slow_tilt_time = 8
|
||||
thumbnails = 400x400,800x480
|
||||
@@ -0,0 +1,38 @@
|
||||
# generated by PrusaSlicer 2.3.1+win64 on 2021-08-24 at 03:10:57 UTC
|
||||
absolute_correction = 0
|
||||
area_fill = 50
|
||||
bed_custom_model =
|
||||
bed_custom_texture =
|
||||
bed_shape = 0x0,192x0,192x120,0x120
|
||||
default_sla_material_profile = Prusa Orange Tough 0.05
|
||||
default_sla_print_profile = 0.05 Normal
|
||||
display_height = 120
|
||||
display_mirror_x = 0
|
||||
display_mirror_y = 1
|
||||
display_orientation = landscape
|
||||
display_pixels_x = 3840
|
||||
display_pixels_y = 2400
|
||||
display_width = 192
|
||||
elefant_foot_compensation = 0.2
|
||||
elefant_foot_min_width = 0.2
|
||||
fast_tilt_time = 5
|
||||
gamma_correction = 1
|
||||
host_type = octoprint
|
||||
inherits = Original Prusa SL1
|
||||
max_exposure_time = 120
|
||||
max_initial_exposure_time = 300
|
||||
max_print_height = 200
|
||||
min_exposure_time = 1
|
||||
min_initial_exposure_time = 1
|
||||
print_host =
|
||||
printer_model = SL1
|
||||
printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_PRUSA3D\nPRINTER_MODEL_SL1\nPRINTER_VENDOR_FLASHFORGE\nPRINTER_MODEL_FOTO_8.9\nFILEFORMAT_SVGX\n\nSTART_CUSTOM_VALUES\nEND_CUSTOM_VALUES
|
||||
printer_settings_id =
|
||||
printer_technology = SLA
|
||||
printer_variant = default
|
||||
printer_vendor =
|
||||
printhost_apikey =
|
||||
printhost_cafile =
|
||||
relative_correction = 1,1
|
||||
slow_tilt_time = 8
|
||||
thumbnails = 400x400,800x480
|
||||
@@ -0,0 +1,38 @@
|
||||
# generated by PrusaSlicer 2.3.1+win64 on 2021-08-24 at 03:11:04 UTC
|
||||
absolute_correction = 0
|
||||
area_fill = 50
|
||||
bed_custom_model =
|
||||
bed_custom_texture =
|
||||
bed_shape = 0x0,120x0,120x67.5,0x67.5
|
||||
default_sla_material_profile = Prusa Orange Tough 0.05
|
||||
default_sla_print_profile = 0.05 Normal
|
||||
display_height = 67.5
|
||||
display_mirror_x = 0
|
||||
display_mirror_y = 1
|
||||
display_orientation = landscape
|
||||
display_pixels_x = 1920
|
||||
display_pixels_y = 1080
|
||||
display_width = 120
|
||||
elefant_foot_compensation = 0.2
|
||||
elefant_foot_min_width = 0.2
|
||||
fast_tilt_time = 5
|
||||
gamma_correction = 1
|
||||
host_type = octoprint
|
||||
inherits = Original Prusa SL1
|
||||
max_exposure_time = 120
|
||||
max_initial_exposure_time = 300
|
||||
max_print_height = 150
|
||||
min_exposure_time = 1
|
||||
min_initial_exposure_time = 1
|
||||
print_host =
|
||||
printer_model = SL1
|
||||
printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_PRUSA3D\nPRINTER_MODEL_SL1\nPRINTER_VENDOR_FLASHFORGE\nPRINTER_MODEL_HUNTER\nFILEFORMAT_SVGX\n\nSTART_CUSTOM_VALUES\nEND_CUSTOM_VALUES
|
||||
printer_settings_id =
|
||||
printer_technology = SLA
|
||||
printer_variant = default
|
||||
printer_vendor =
|
||||
printhost_apikey =
|
||||
printhost_cafile =
|
||||
relative_correction = 1,1
|
||||
slow_tilt_time = 8
|
||||
thumbnails = 400x400,800x480
|
||||
@@ -9,12 +9,12 @@ LittleEndian();
|
||||
|
||||
struct FILEMARK {
|
||||
char Mark[12] <fgcolor=cBlack, bgcolor=cRed>;
|
||||
uint Version <fgcolor=cBlack, bgcolor=cRed>;
|
||||
uint Version <fgcolor=cBlack, bgcolor=cRed>; // 1 or 515
|
||||
uint AreaNum <fgcolor=cBlack, bgcolor=cRed>;
|
||||
uint HeaderAddress <fgcolor=cBlack, bgcolor=cRed>;
|
||||
uint Padding1 <fgcolor=cBlack, bgcolor=cRed>;
|
||||
uint PreviewAddress <fgcolor=cBlack, bgcolor=cRed>;
|
||||
uint Padding2 <fgcolor=cBlack, bgcolor=cRed>;
|
||||
uint PreviewEndAddress <fgcolor=cBlack, bgcolor=cRed>; // Version 515 only
|
||||
uint LayerDefinitionAddress <fgcolor=cBlack, bgcolor=cRed>;
|
||||
uint Padding3 <fgcolor=cBlack, bgcolor=cRed>;
|
||||
uint LayerImageAddress <fgcolor=cBlack, bgcolor=cRed>;
|
||||
@@ -62,12 +62,13 @@ struct PREVIEW {
|
||||
uint ResolutionX <fgcolor=cBlack, bgcolor=cRed>;
|
||||
uint DpiResolution <fgcolor=cBlack, bgcolor=cRed>;
|
||||
uint ResolutionY <fgcolor=cBlack, bgcolor=cRed>;
|
||||
uint Unknown1 <fgcolor=cBlack, bgcolor=cRed>;
|
||||
|
||||
ubyte Data[ResolutionX*ResolutionY*2] <fgcolor=cBlack, bgcolor=cGreen>;
|
||||
|
||||
/*uint Unknown1 <fgcolor=cBlack, bgcolor=cRed>;
|
||||
uint Unknown2 <fgcolor=cBlack, bgcolor=cRed>;
|
||||
uint Unknown3 <fgcolor=cBlack, bgcolor=cRed>;
|
||||
uint Unknown4 <fgcolor=cBlack, bgcolor=cRed>;
|
||||
|
||||
ubyte Data[ResolutionX*ResolutionY*2] <fgcolor=cBlack, bgcolor=cGreen>;
|
||||
uint Unknown4 <fgcolor=cBlack, bgcolor=cRed>;*/
|
||||
};
|
||||
|
||||
if(fileMark.PreviewAddress > 0){
|
||||
@@ -97,7 +98,7 @@ struct LAYER_DEF {
|
||||
|
||||
local uint currentPos = FTell();
|
||||
FSeek(DataAddress);
|
||||
ubyte RLE[DataLength];
|
||||
ubyte RLE[DataLength] <fgcolor=cWhite, bgcolor=cBlack>;
|
||||
FSeek(currentPos);
|
||||
};
|
||||
|
||||
|
||||
@@ -0,0 +1,50 @@
|
||||
//------------------------------------------------
|
||||
//--- 010 Editor v8.0.1 Binary Template
|
||||
//
|
||||
// File: FlashForge SVGX
|
||||
// Authors: Tiago Conceição
|
||||
//------------------------------------------------
|
||||
|
||||
LittleEndian();
|
||||
|
||||
struct HEADER {
|
||||
char Identifier[16] <fgcolor=cBlack, bgcolor=cRed>;
|
||||
uint Preview1Address <fgcolor=cBlack, bgcolor=cRed>;
|
||||
uint Preview2Address <fgcolor=cBlack, bgcolor=cRed>;
|
||||
uint SVGDocumentAddress <fgcolor=cBlack, bgcolor=cRed>;
|
||||
} header;
|
||||
|
||||
|
||||
struct PREVIEW {
|
||||
char Identifier[2] <fgcolor=cBlack, bgcolor=cGreen>; // BM (Bitmap?)
|
||||
uint TableSize <fgcolor=cBlack, bgcolor=cGreen>; // This table + RGB Data
|
||||
uint Padding1 <fgcolor=cBlack, bgcolor=cGreen>;
|
||||
uint dpiX <fgcolor=cBlack, bgcolor=cGreen>; // 54
|
||||
uint dpiY <fgcolor=cBlack, bgcolor=cGreen>; // 40
|
||||
uint ResolutionX <fgcolor=cBlack, bgcolor=cGreen>;
|
||||
uint ResolutionY <fgcolor=cBlack, bgcolor=cGreen>;
|
||||
|
||||
uint Unknown1 <fgcolor=cBlack, bgcolor=cGreen>; // 1572865
|
||||
uint Padding2 <fgcolor=cBlack, bgcolor=cGreen>;
|
||||
uint DataSize <fgcolor=cBlack, bgcolor=cGreen>;
|
||||
uint Unknown2 <fgcolor=cBlack, bgcolor=cGreen>; // 3780
|
||||
uint Unknown3 <fgcolor=cBlack, bgcolor=cGreen>; // 3780
|
||||
uint Padding3 <fgcolor=cBlack, bgcolor=cGreen>;
|
||||
uint Padding4 <fgcolor=cBlack, bgcolor=cGreen>;
|
||||
|
||||
ubyte BGR[DataSize] <fgcolor=cBlack, bgcolor=cPurple>; // ResolutionX*ResolutionY*3 ?
|
||||
};
|
||||
|
||||
if(header.Preview1Address > 0){
|
||||
FSeek(header.Preview1Address);
|
||||
PREVIEW preview;
|
||||
}
|
||||
|
||||
if(header.Preview2Address > 0){
|
||||
FSeek(header.Preview2Address);
|
||||
PREVIEW preview;
|
||||
}
|
||||
|
||||
|
||||
FSeek(header.SVGDocumentAddress);
|
||||
string SVGDocument <fgcolor=cWhite, bgcolor=cBlack>;
|
||||
@@ -31,52 +31,61 @@ SET files[20]=AnyCubic Photon.ini
|
||||
SET files[21]=AnyCubic Photon S.ini
|
||||
SET files[22]=AnyCubic Photon Zero.ini
|
||||
SET files[23]=AnyCubic Photon X.ini
|
||||
SET files[24]=AnyCubic Photon Mono.ini
|
||||
SET files[25]=AnyCubic Photon Mono SE.ini
|
||||
SET files[26]=AnyCubic Photon Mono X.ini
|
||||
SET files[27]=Elegoo Mars.ini
|
||||
SET files[28]=Elegoo Mars 2 Pro.ini
|
||||
SET files[29]=Elegoo Mars C.ini
|
||||
SET files[30]=Elegoo Saturn.ini
|
||||
SET files[31]=Peopoly Phenom.ini
|
||||
SET files[32]=Peopoly Phenom L.ini
|
||||
SET files[33]=Peopoly Phenom Noir.ini
|
||||
SET files[34]=Peopoly Phenom XXL.ini
|
||||
SET files[35]=QIDI Shadow5.5.ini
|
||||
SET files[36]=QIDI Shadow6.0 Pro.ini
|
||||
SET files[37]=QIDI S-Box.ini
|
||||
SET files[38]=QIDI I-Box Mono.ini
|
||||
SET files[39]=Phrozen Shuffle.ini
|
||||
SET files[40]=Phrozen Shuffle Lite.ini
|
||||
SET files[41]=Phrozen Shuffle XL.ini
|
||||
SET files[42]=Phrozen Shuffle XL Lite.ini
|
||||
SET files[43]=Phrozen Shuffle 16.ini
|
||||
SET files[44]=Phrozen Shuffle 4K.ini
|
||||
SET files[45]=Phrozen Sonic.ini
|
||||
SET files[46]=Phrozen Sonic 4K.ini
|
||||
SET files[47]=Phrozen Sonic Mighty 4K.ini
|
||||
SET files[48]=Phrozen Sonic Mini.ini
|
||||
SET files[49]=Phrozen Sonic Mini 4K.ini
|
||||
SET files[50]=Phrozen Transform.ini
|
||||
SET files[51]=Kelant S400.ini
|
||||
SET files[52]=Wanhao D7.ini
|
||||
SET files[53]=Wanhao D8.ini
|
||||
SET files[54]=Wanhao CGR Mini Mono.ini
|
||||
SET files[55]=Wanhao CGR Mono.ini
|
||||
SET files[56]=Creality LD-002R.ini
|
||||
SET files[57]=Creality LD-002H.ini
|
||||
SET files[58]=Creality LD-006.ini
|
||||
SET files[59]=Creality HALOT-ONE CL-60.ini
|
||||
SET files[60]=Creality HALOT-SKY CL-89.ini
|
||||
SET files[61]=Creality HALOT-MAX CL-133.ini
|
||||
SET files[62]=Voxelab Polaris 5.5.ini
|
||||
SET files[63]=Voxelab Proxima 6.ini
|
||||
SET files[64]=Voxelab Ceres 8.9.ini
|
||||
SET files[65]=Longer Orange 10.ini
|
||||
SET files[66]=Longer Orange 30.ini
|
||||
SET files[67]=Longer Orange 120.ini
|
||||
SET files[68]=Longer Orange 4K.ini
|
||||
SET files[69]=Uniz IBEE.ini
|
||||
SET files[24]=AnyCubic Photon Ultra.ini
|
||||
SET files[25]=AnyCubic Photon Mono.ini
|
||||
SET files[26]=AnyCubic Photon Mono SE.ini
|
||||
SET files[27]=AnyCubic Photon Mono X.ini
|
||||
SET files[28]=AnyCubic Photon Mono SQ.ini
|
||||
SET files[29]=Elegoo Mars.ini
|
||||
SET files[30]=Elegoo Mars 2 Pro.ini
|
||||
SET files[31]=Elegoo Mars C.ini
|
||||
SET files[32]=Elegoo Saturn.ini
|
||||
SET files[33]=Peopoly Phenom.ini
|
||||
SET files[34]=Peopoly Phenom L.ini
|
||||
SET files[35]=Peopoly Phenom Noir.ini
|
||||
SET files[36]=Peopoly Phenom XXL.ini
|
||||
SET files[37]=QIDI Shadow5.5.ini
|
||||
SET files[38]=QIDI Shadow6.0 Pro.ini
|
||||
SET files[39]=QIDI S-Box.ini
|
||||
SET files[40]=QIDI I-Box Mono.ini
|
||||
SET files[41]=Phrozen Shuffle.ini
|
||||
SET files[42]=Phrozen Shuffle Lite.ini
|
||||
SET files[43]=Phrozen Shuffle XL.ini
|
||||
SET files[44]=Phrozen Shuffle XL Lite.ini
|
||||
SET files[45]=Phrozen Shuffle 16.ini
|
||||
SET files[46]=Phrozen Shuffle 4K.ini
|
||||
SET files[47]=Phrozen Sonic.ini
|
||||
SET files[48]=Phrozen Sonic 4K.ini
|
||||
SET files[49]=Phrozen Sonic Mighty 4K.ini
|
||||
SET files[50]=Phrozen Sonic Mini.ini
|
||||
SET files[51]=Phrozen Sonic Mini 4K.ini
|
||||
SET files[52]=Phrozen Transform.ini
|
||||
SET files[53]=Kelant S400.ini
|
||||
SET files[54]=Wanhao D7.ini
|
||||
SET files[55]=Wanhao D8.ini
|
||||
SET files[56]=Wanhao CGR Mini Mono.ini
|
||||
SET files[57]=Wanhao CGR Mono.ini
|
||||
SET files[58]=Creality LD-002R.ini
|
||||
SET files[59]=Creality LD-002H.ini
|
||||
SET files[60]=Creality LD-006.ini
|
||||
SET files[61]=Creality HALOT-ONE CL-60.ini
|
||||
SET files[62]=Creality HALOT-SKY CL-89.ini
|
||||
SET files[63]=Creality HALOT-MAX CL-133.ini
|
||||
SET files[64]=Voxelab Polaris 5.5.ini
|
||||
SET files[65]=Voxelab Proxima 6.ini
|
||||
SET files[66]=Voxelab Ceres 8.9.ini
|
||||
SET files[67]=Longer Orange 10.ini
|
||||
SET files[68]=Longer Orange 30.ini
|
||||
SET files[69]=Longer Orange 120.ini
|
||||
SET files[70]=Longer Orange 4K.ini
|
||||
SET files[71]=Uniz IBEE.ini
|
||||
SET files[72]=FlashForge Explorer MAX.ini
|
||||
SET files[73]=FlashForge Focus 8.9.ini
|
||||
SET files[74]=FlashForge Focus 13.3.ini
|
||||
SET files[75]=FlashForge Foto 6.0.ini
|
||||
SET files[76]=FlashForge Foto 8.9.ini
|
||||
SET files[77]=FlashForge Foto 13.3.ini
|
||||
SET files[78]=FlashForge Hunter.ini
|
||||
|
||||
echo PrusaSlicer Printers Instalation
|
||||
echo This will replace printers, all changes will be discarded
|
||||
|
||||
@@ -8,6 +8,7 @@
|
||||
|
||||
using System;
|
||||
using System.IO;
|
||||
using System.Text;
|
||||
|
||||
namespace UVtools.Core.Extensions
|
||||
{
|
||||
@@ -28,6 +29,16 @@ namespace UVtools.Core.Extensions
|
||||
public static byte[] ReadBytes(this FileStream fs, uint length, int offset = 0)
|
||||
=> fs.ReadBytes((int)length, offset);
|
||||
|
||||
/// <summary>
|
||||
/// Read from current position to the end of the file
|
||||
/// </summary>
|
||||
/// <param name="fs"></param>
|
||||
/// <returns></returns>
|
||||
public static byte[] ReadToEnd(this FileStream fs)
|
||||
{
|
||||
return fs.ReadBytes((uint)(fs.Length - fs.Position));
|
||||
}
|
||||
|
||||
public static uint ReadUShortLittleEndian(this FileStream fs, int offset = 0)
|
||||
{
|
||||
return BitExtensions.ToUShortLittleEndian(fs.ReadBytes(2, offset));
|
||||
@@ -85,6 +96,16 @@ namespace UVtools.Core.Extensions
|
||||
return (uint)bytes.Length;
|
||||
}
|
||||
|
||||
public static uint WriteString(this FileStream fs, string text, int offset = 0)
|
||||
=> fs.WriteString(text, Encoding.UTF8, offset);
|
||||
|
||||
public static uint WriteString(this FileStream fs, string text, Encoding encoding, int offset = 0)
|
||||
{
|
||||
var bytes = encoding.GetBytes(text);
|
||||
fs.Write(bytes, offset, bytes.Length);
|
||||
return (uint)bytes.Length;
|
||||
}
|
||||
|
||||
public static uint WriteSerialize(this FileStream fs, object data, int offset = 0)
|
||||
{
|
||||
return Helpers.SerializeWriteFileStream(fs, data, offset);
|
||||
|
||||
@@ -84,7 +84,7 @@ namespace UVtools.Core.Extensions
|
||||
|
||||
public static Size Half(this Size size) => new(size.Width / 2, size.Height / 2);
|
||||
|
||||
public static SizeF Half(this SizeF size) => new(size.Width / 2, size.Height / 2);
|
||||
public static SizeF Half(this SizeF size) => new(size.Width / 2f, size.Height / 2f);
|
||||
|
||||
public static Point ToPoint(this Size size) => new(size.Width, size.Height);
|
||||
public static PointF ToPoint(this SizeF size) => new(size.Width, size.Height);
|
||||
|
||||
@@ -0,0 +1,64 @@
|
||||
/*
|
||||
* GNU AFFERO GENERAL PUBLIC LICENSE
|
||||
* Version 3, 19 November 2007
|
||||
* Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
|
||||
* Everyone is permitted to copy and distribute verbatim copies
|
||||
* of this license document, but changing it is not allowed.
|
||||
*/
|
||||
using System.IO;
|
||||
using System.Text;
|
||||
using System.Xml;
|
||||
using System.Xml.Serialization;
|
||||
|
||||
namespace UVtools.Core.Extensions
|
||||
{
|
||||
public static class XmlExtensions
|
||||
{
|
||||
public static string SerializeObject(object toSerialize)
|
||||
{
|
||||
var xmlSerializer = new XmlSerializer(toSerialize.GetType());
|
||||
|
||||
using var textWriter = new StringWriter();
|
||||
xmlSerializer.Serialize(textWriter, toSerialize);
|
||||
return textWriter.ToString();
|
||||
}
|
||||
|
||||
public static string SerializeObject(object toSerialize, XmlWriterSettings settings, bool standalone = false)
|
||||
{
|
||||
settings.CloseOutput = false;
|
||||
|
||||
using var ms = new MemoryStream();
|
||||
using (var xw = XmlWriter.Create(ms, settings))
|
||||
{
|
||||
xw.WriteStartDocument(standalone); // that bool parameter is called "standalone"
|
||||
|
||||
var s = new XmlSerializer(toSerialize.GetType());
|
||||
s.Serialize(xw, toSerialize);
|
||||
}
|
||||
|
||||
return settings.Encoding.GetString(ms.ToArray());
|
||||
}
|
||||
|
||||
public static string SerializeObject(object toSerialize, Encoding encoding, bool indent = true, bool omitXmlDeclaration = false, bool standalone = false)
|
||||
{
|
||||
var settings = new XmlWriterSettings
|
||||
{
|
||||
// If set to true XmlWriter would close MemoryStream automatically and using would then do double dispose
|
||||
// Code analysis does not understand that. That's why there is a suppress message.
|
||||
CloseOutput = false,
|
||||
Encoding = encoding,
|
||||
OmitXmlDeclaration = omitXmlDeclaration,
|
||||
Indent = indent,
|
||||
};
|
||||
return SerializeObject(toSerialize, settings, standalone);
|
||||
}
|
||||
|
||||
public static T DeserializeObject<T>(string text)
|
||||
{
|
||||
var serializer = new XmlSerializer(typeof(T));
|
||||
using TextReader reader = new StringReader(text);
|
||||
return (T)serializer.Deserialize(reader);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -719,12 +719,12 @@ namespace UVtools.Core.FileFormats
|
||||
set => base.MachineZ = Settings.MachineZ = (float)Math.Round(value, 2);
|
||||
}
|
||||
|
||||
public override bool DisplayMirror
|
||||
public override Enumerations.FlipDirection DisplayMirror
|
||||
{
|
||||
get => Settings.ProjectorType > 0;
|
||||
get => Settings.ProjectorType == 0 ? Enumerations.FlipDirection.None : Enumerations.FlipDirection.Horizontally;
|
||||
set
|
||||
{
|
||||
Settings.ProjectorType = value ? 1u : 0;
|
||||
Settings.ProjectorType = value == Enumerations.FlipDirection.None ? 0u : 1;
|
||||
RaisePropertyChanged();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -410,13 +410,19 @@ namespace UVtools.Core.FileFormats
|
||||
set => base.MachineZ = OutputSettings.PlatformZSize = (float)Math.Round(value, 2);
|
||||
}
|
||||
|
||||
public override bool DisplayMirror
|
||||
public override Enumerations.FlipDirection DisplayMirror
|
||||
{
|
||||
get => OutputSettings.FlipX;
|
||||
get
|
||||
{
|
||||
if (OutputSettings.FlipX && OutputSettings.FlipY) return Enumerations.FlipDirection.Both;
|
||||
if (OutputSettings.FlipX) return Enumerations.FlipDirection.Horizontally;
|
||||
if (OutputSettings.FlipY) return Enumerations.FlipDirection.Vertically;
|
||||
return Enumerations.FlipDirection.None;
|
||||
}
|
||||
set
|
||||
{
|
||||
OutputSettings.FlipX = value;
|
||||
OutputSettings.FlipY = false;
|
||||
OutputSettings.FlipX = value is Enumerations.FlipDirection.Horizontally or Enumerations.FlipDirection.Both;
|
||||
OutputSettings.FlipY = value is Enumerations.FlipDirection.Vertically or Enumerations.FlipDirection.Both;
|
||||
RaisePropertyChanged();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1246,12 +1246,12 @@ namespace UVtools.Core.FileFormats
|
||||
set => base.MachineZ = HeaderSettings.BedSizeZ = (float)Math.Round(value, 2);
|
||||
}
|
||||
|
||||
public override bool DisplayMirror
|
||||
public override Enumerations.FlipDirection DisplayMirror
|
||||
{
|
||||
get => HeaderSettings.ProjectorType > 0;
|
||||
get => HeaderSettings.ProjectorType == 0 ? Enumerations.FlipDirection.None : Enumerations.FlipDirection.Horizontally;
|
||||
set
|
||||
{
|
||||
HeaderSettings.ProjectorType = value ? 1u : 0;
|
||||
HeaderSettings.ProjectorType = value == Enumerations.FlipDirection.None ? 0u : 1;
|
||||
RaisePropertyChanged();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -184,13 +184,13 @@ namespace UVtools.Core.FileFormats
|
||||
set => base.MachineZ = HeaderSettings.MachineZ = (float)Math.Round(value, 2);
|
||||
}
|
||||
|
||||
public override bool DisplayMirror
|
||||
public override Enumerations.FlipDirection DisplayMirror
|
||||
{
|
||||
get => HeaderSettings.Mirror > 0;
|
||||
get => HeaderSettings.Mirror == 0 ? Enumerations.FlipDirection.None : Enumerations.FlipDirection.Horizontally;
|
||||
set
|
||||
{
|
||||
HeaderSettings.ProjectType = value ? "LCD_mirror" : "Normal";
|
||||
HeaderSettings.Mirror = (byte)(value ? 1 : 0);
|
||||
HeaderSettings.ProjectType = value == Enumerations.FlipDirection.None ? "Normal" : "LCD_mirror";
|
||||
HeaderSettings.Mirror = (byte)(value == Enumerations.FlipDirection.None ? 0 : 1);
|
||||
RaisePropertyChanged();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -705,12 +705,12 @@ namespace UVtools.Core.FileFormats
|
||||
set => base.MachineZ = HeaderSettings.BedSizeZ = (float)Math.Round(value, 2);
|
||||
}
|
||||
|
||||
public override bool DisplayMirror
|
||||
public override Enumerations.FlipDirection DisplayMirror
|
||||
{
|
||||
get => HeaderSettings.ProjectorType > 0;
|
||||
get => HeaderSettings.ProjectorType == 0 ? Enumerations.FlipDirection.None : Enumerations.FlipDirection.Horizontally;
|
||||
set
|
||||
{
|
||||
HeaderSettings.ProjectorType = value ? 1u : 0;
|
||||
HeaderSettings.ProjectorType = value == Enumerations.FlipDirection.None ? 0u : 1;
|
||||
RaisePropertyChanged();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -294,6 +294,7 @@ namespace UVtools.Core.FileFormats
|
||||
//new CXDLPv1File(), // Creality Box v1
|
||||
new CXDLPFile(), // Creality Box
|
||||
new LGSFile(), // LGS, LGS30
|
||||
new FlashForgeSVGXFile(), // SVGX
|
||||
new VDAFile(), // VDA
|
||||
new VDTFile(), // VDT
|
||||
new UVJFile(), // UVJ
|
||||
@@ -596,7 +597,8 @@ namespace UVtools.Core.FileFormats
|
||||
var mat = new Mat(resolution, DepthType.Cv8U, 3);
|
||||
var span = mat.GetDataByteSpan();
|
||||
var pixel = 0;
|
||||
for (int i = 0; i < bytes.Length;)
|
||||
int i = 0;
|
||||
while (i < bytes.Length && pixel < span.Length)
|
||||
{
|
||||
switch (dataType)
|
||||
{
|
||||
@@ -675,6 +677,12 @@ namespace UVtools.Core.FileFormats
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
for (; pixel < span.Length; pixel++) // Fill leftovers
|
||||
{
|
||||
span[pixel] = 0;
|
||||
}
|
||||
|
||||
return mat;
|
||||
}
|
||||
|
||||
@@ -996,7 +1004,7 @@ namespace UVtools.Core.FileFormats
|
||||
/// <summary>
|
||||
/// Gets or sets if images need to be mirrored on lcd to print on the correct orientation
|
||||
/// </summary>
|
||||
public virtual bool DisplayMirror { get; set; }
|
||||
public virtual Enumerations.FlipDirection DisplayMirror { get; set; } = Enumerations.FlipDirection.None;
|
||||
|
||||
/// <summary>
|
||||
/// Gets if the display is in portrait mode
|
||||
@@ -3534,7 +3542,7 @@ namespace UVtools.Core.FileFormats
|
||||
public void UpdatePrintTime()
|
||||
{
|
||||
PrintTime = PrintTimeComputed;
|
||||
Debug.WriteLine($"Time updated: {_printTime}s");
|
||||
//Debug.WriteLine($"Time updated: {_printTime}s");
|
||||
}
|
||||
|
||||
public void UpdatePrintTimeQueued()
|
||||
@@ -3546,6 +3554,50 @@ namespace UVtools.Core.FileFormats
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// From a pixel position get the equivalent position on the display
|
||||
/// </summary>
|
||||
/// <param name="x">X position in pixels</param>
|
||||
/// <returns>Display position in millimeters</returns>
|
||||
public float PixelToDisplayPositionX(int x) => (float)Math.Round(PixelWidth * x, 3);
|
||||
|
||||
/// <summary>
|
||||
/// From a pixel position get the equivalent position on the display
|
||||
/// </summary>
|
||||
/// <param name="y">Y position in pixels</param>
|
||||
/// <returns>Display position in millimeters</returns>
|
||||
public float PixelToDisplayPositionY(int y) => (float)Math.Round(PixelHeight * y, 3);
|
||||
|
||||
/// <summary>
|
||||
/// From a pixel position get the equivalent position on the display
|
||||
/// </summary>
|
||||
/// <param name="x">X position in pixels</param>
|
||||
/// <param name="y">Y position in pixels</param>
|
||||
/// <returns>Resolution position in pixels</returns>
|
||||
public PointF PixelToDisplayPosition(int x, int y) =>new(PixelToDisplayPositionX(x), PixelToDisplayPositionY(y));
|
||||
|
||||
/// <summary>
|
||||
/// From a pixel position get the equivalent position on the display
|
||||
/// </summary>
|
||||
/// <param name="x">X position in millimeters</param>
|
||||
/// <returns>Resolution position in pixels</returns>
|
||||
public int DisplayToPixelPositionX(float x) => (int)(x * Xppmm);
|
||||
|
||||
/// <summary>
|
||||
/// From a pixel position get the equivalent position on the display
|
||||
/// </summary>
|
||||
/// <param name="y">Y position in millimeters</param>
|
||||
/// <returns>Resolution position in pixels</returns>
|
||||
public int DisplayToPixelPositionY(float y) => (int)(y * Yppmm);
|
||||
|
||||
/// <summary>
|
||||
/// From a pixel position get the equivalent position on the display
|
||||
/// </summary>
|
||||
/// <param name="x">X position in millimeters</param>
|
||||
/// <param name="y">Y position in millimeters</param>
|
||||
/// <returns>Resolution position in pixels</returns>
|
||||
public Point DisplayToPixelPosition(float x, float y) => new(DisplayToPixelPositionX(x), DisplayToPixelPositionY(y));
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,762 @@
|
||||
/*
|
||||
* GNU AFFERO GENERAL PUBLIC LICENSE
|
||||
* Version 3, 19 November 2007
|
||||
* Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
|
||||
* Everyone is permitted to copy and distribute verbatim copies
|
||||
* of this license document, but changing it is not allowed.
|
||||
*/
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
using System.Drawing;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
using System.Xml;
|
||||
using System.Xml.Serialization;
|
||||
using BinarySerialization;
|
||||
using Emgu.CV;
|
||||
using Emgu.CV.CvEnum;
|
||||
using Emgu.CV.Util;
|
||||
using UVtools.Core.Extensions;
|
||||
using UVtools.Core.Operations;
|
||||
|
||||
namespace UVtools.Core.FileFormats
|
||||
{
|
||||
[XmlRoot(ElementName = "svg", Namespace = "http://www.w3.org/2000/svg")]
|
||||
|
||||
public class FlashForgeSVGXSvg
|
||||
{
|
||||
//public string Xmlns { get; set; } = "http://www.w3.org/2000/svg";
|
||||
|
||||
//[XmlAttribute("svg", Namespace = "http://www.w3.org/2000/svg")] public string Svg { get; set; } = "http://www.w3.org/2000/svg";
|
||||
[XmlAttribute("version")] public string Version { get; set; } = "1.1";
|
||||
|
||||
[XmlElement("printparams")] public FlashForgeSVGXSvgPrintParams PrintParameters { get; set; } = new();
|
||||
|
||||
[XmlElement("g")] public List<FlashForgeSVGXSvgGroup> Groups { get; set; } = new();
|
||||
|
||||
public override string ToString()
|
||||
{
|
||||
return $"{nameof(Version)}: {Version}, {nameof(PrintParameters)}: {PrintParameters}, {nameof(Groups)}: {Groups.Count}";
|
||||
}
|
||||
|
||||
public string SerializeToString()
|
||||
{
|
||||
var settings = new XmlWriterSettings
|
||||
{
|
||||
// If set to true XmlWriter would close MemoryStream automatically and using would then do double dispose
|
||||
// Code analysis does not understand that. That's why there is a suppress message.
|
||||
CloseOutput = false,
|
||||
Encoding = new UTF8Encoding(false),
|
||||
Indent = true,
|
||||
NewLineChars = "\n"
|
||||
};
|
||||
|
||||
var svg = XmlExtensions.SerializeObject(this, settings);
|
||||
return svg.Replace(" ", string.Empty)
|
||||
.Replace("<g id=\"background\" area=\"0\" perimeter=\"0\" />", "<g id=\"background\">\n</g>")
|
||||
+ '\n';
|
||||
}
|
||||
}
|
||||
|
||||
[XmlRoot("printparams")]
|
||||
public class FlashForgeSVGXSvgPrintParams
|
||||
{
|
||||
[XmlAttribute("machinename")] public string MachineName { get; set; } = "Unknown";
|
||||
[XmlAttribute("materialname")] public string MaterialName { get; set; } = "Unknown";
|
||||
[XmlAttribute("layerheight")] public float LayerHeight { get; set; }
|
||||
[XmlAttribute("volume")] public float MaterialMilliliters { get; set; }
|
||||
[XmlAttribute("layercount")] public uint LayerCount { get; set; }
|
||||
[XmlAttribute("lightintensity")] public float LightIntensity { get; set; } = 1;
|
||||
[XmlAttribute("resolutionx")] public uint ResolutionX { get; set; }
|
||||
[XmlAttribute("resolutiony")] public uint ResolutionY { get; set; }
|
||||
[XmlAttribute("displaywidth")] public float DisplayWidth { get; set; }
|
||||
[XmlAttribute("displayheight")] public float DisplayHeight { get; set; }
|
||||
[XmlAttribute("machinez")] public float MachineZ { get; set; }
|
||||
|
||||
[XmlElement("projectiontime")] public FlashForgeSVGXSvgProjectionTime ProjectionTime { get; set; } = new();
|
||||
[XmlElement("projectionadjust")] public FlashForgeSVGXSvgProjectionAdjust ProjectionAdjust { get; set; } = new();
|
||||
[XmlElement("printrange")] public FlashForgeSVGXSvgPrintRange PrintRange { get; set; } = new();
|
||||
|
||||
public override string ToString()
|
||||
{
|
||||
return $"{nameof(MaterialName)}: {MaterialName}, {nameof(LayerHeight)}: {LayerHeight}, {nameof(MaterialMilliliters)}: {MaterialMilliliters}, {nameof(LayerCount)}: {LayerCount}, {nameof(LightIntensity)}: {LightIntensity}, {nameof(ResolutionX)}: {ResolutionX}, {nameof(ResolutionY)}: {ResolutionY}, {nameof(DisplayWidth)}: {DisplayWidth}, {nameof(DisplayHeight)}: {DisplayHeight}, {nameof(MachineZ)}: {MachineZ}, {nameof(ProjectionTime)}: {ProjectionTime}, {nameof(ProjectionAdjust)}: {ProjectionAdjust}, {nameof(PrintRange)}: {PrintRange}";
|
||||
}
|
||||
}
|
||||
|
||||
[XmlRoot("projectiontime")]
|
||||
public class FlashForgeSVGXSvgProjectionTime
|
||||
{
|
||||
[XmlAttribute("attachlayer")] public ushort BottomLayerCount { get; set; } = 3;
|
||||
[XmlAttribute("buildinlayer")] public ushort TransitionLayerCount { get; set; } = 5;
|
||||
[XmlAttribute("attachtime")] public float BottomExposureTime { get; set; }
|
||||
[XmlAttribute("basetime")] public float ExposureTime { get; set; }
|
||||
|
||||
public override string ToString()
|
||||
{
|
||||
return $"{nameof(BottomLayerCount)}: {BottomLayerCount}, {nameof(TransitionLayerCount)}: {TransitionLayerCount}, {nameof(BottomExposureTime)}: {BottomExposureTime}, {nameof(ExposureTime)}: {ExposureTime}";
|
||||
}
|
||||
}
|
||||
|
||||
[XmlRoot("projectionadjust")]
|
||||
public class FlashForgeSVGXSvgProjectionAdjust
|
||||
{
|
||||
[XmlAttribute("x")] public float X { get; set; } = 100;
|
||||
[XmlAttribute("y")] public float Y { get; set; } = 100;
|
||||
|
||||
public override string ToString()
|
||||
{
|
||||
return $"{nameof(X)}: {X}, {nameof(Y)}: {Y}";
|
||||
}
|
||||
}
|
||||
|
||||
[XmlRoot("printrange")]
|
||||
public class FlashForgeSVGXSvgPrintRange
|
||||
{
|
||||
[XmlAttribute("minx")] public float MinX { get; set; }
|
||||
[XmlAttribute("miny")] public float MinY { get; set; }
|
||||
[XmlAttribute("minz")] public float MinZ { get; set; }
|
||||
[XmlAttribute("maxx")] public float MaxX { get; set; }
|
||||
[XmlAttribute("maxy")] public float MaxY { get; set; }
|
||||
[XmlAttribute("maxz")] public float MaxZ { get; set; }
|
||||
|
||||
public override string ToString()
|
||||
{
|
||||
return $"{nameof(MinX)}: {MinX}, {nameof(MinY)}: {MinY}, {nameof(MinZ)}: {MinZ}, {nameof(MaxX)}: {MaxX}, {nameof(MaxY)}: {MaxY}, {nameof(MaxZ)}: {MaxZ}";
|
||||
}
|
||||
}
|
||||
|
||||
[XmlRoot("g")]
|
||||
public class FlashForgeSVGXSvgGroup
|
||||
{
|
||||
[XmlAttribute("id")] public string Id { get; set; }
|
||||
[XmlAttribute("area")] public float Area { get; set; }
|
||||
[XmlAttribute("perimeter")] public float Perimeter { get; set; }
|
||||
[XmlElement("path")] public List<FlashForgeSVGXSvgPath> Paths { get; set; } = new();
|
||||
|
||||
public FlashForgeSVGXSvgGroup() { }
|
||||
|
||||
public FlashForgeSVGXSvgGroup(string id, float area = 0, float perimeter = 0)
|
||||
{
|
||||
Id = id;
|
||||
Area = area;
|
||||
Perimeter = perimeter;
|
||||
}
|
||||
|
||||
public override string ToString()
|
||||
{
|
||||
return $"{nameof(Id)}: {Id}, {nameof(Area)}: {Area}, {nameof(Perimeter)}: {Perimeter}, {nameof(Paths)}: {Paths}";
|
||||
}
|
||||
}
|
||||
|
||||
[XmlRoot("path")]
|
||||
public class FlashForgeSVGXSvgPath
|
||||
{
|
||||
[XmlAttribute("d")] public string Value { get; set; }
|
||||
[XmlAttribute("style")] public string Style { get; set; } = "fill:white";
|
||||
[XmlAttribute("fill-rule")] public string FillRule { get; set; } = "evenodd";
|
||||
|
||||
public FlashForgeSVGXSvgPath() { }
|
||||
|
||||
public FlashForgeSVGXSvgPath(string value)
|
||||
{
|
||||
Value = value;
|
||||
}
|
||||
|
||||
public override string ToString()
|
||||
{
|
||||
return $"{nameof(Value)}: {Value}, {nameof(Style)}: {Style}, {nameof(FillRule)}: {FillRule}";
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public class FlashForgeSVGXFile : FileFormat
|
||||
{
|
||||
#region Constants
|
||||
#endregion
|
||||
|
||||
#region Sub Classes
|
||||
#region Header
|
||||
public class Header
|
||||
{
|
||||
public const byte IdentifierLength = 16;
|
||||
public const string IdentifierText = "DLP-II 1.1\n";
|
||||
|
||||
[FieldOrder(0)] [FieldLength(IdentifierLength)] [SerializeAs(SerializedType.TerminatedString)] public string Identifier { get; set; } = IdentifierText;
|
||||
[FieldOrder(1)] public uint Preview1Address { get; set; }
|
||||
[FieldOrder(2)] public uint Preview2Address { get; set; }
|
||||
[FieldOrder(3)] public uint SVGDocumentAddress { get; set; }
|
||||
|
||||
public override string ToString()
|
||||
{
|
||||
return $"{nameof(Identifier)}: {Identifier}, {nameof(Preview1Address)}: {Preview1Address}, {nameof(Preview2Address)}: {Preview2Address}, {nameof(SVGDocumentAddress)}: {SVGDocumentAddress}";
|
||||
}
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region Preview
|
||||
/// <summary>
|
||||
/// The files contain two preview images.
|
||||
/// These are shown on the printer display when choosing which file to print, sparing the poor printer from needing to render a 3D image from scratch.
|
||||
/// </summary>
|
||||
public class Preview
|
||||
{
|
||||
public const byte IdentifierLength = 2;
|
||||
public const string IdentifierText = "BM";
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets the identifier, BM = bitmap?
|
||||
/// </summary>
|
||||
[FieldOrder(0)] [FieldLength(IdentifierLength)] public string Identifier { get; set; } = IdentifierText;
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets the table total size
|
||||
/// </summary>
|
||||
[FieldOrder(1)] public uint TableSize { get; set; }
|
||||
[FieldOrder(2)] public uint Padding1 { get; set; }
|
||||
[FieldOrder(3)] public uint DpiX { get; set; } = 54;
|
||||
[FieldOrder(4)] public uint DpiY { get; set; } = 40;
|
||||
|
||||
[FieldOrder(5)] public uint ResolutionX { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets the Y dimension of the preview image, in pixels.
|
||||
/// </summary>
|
||||
[FieldOrder(6)] public uint ResolutionY { get; set; }
|
||||
|
||||
[FieldOrder(7)] public uint Unknown1 { get; set; } = 0x180001;
|
||||
[FieldOrder(8)] public uint Padding2 { get; set; }
|
||||
[FieldOrder(9)] public uint DataSize { get; set; }
|
||||
[FieldOrder(10)] public uint Unknown2 { get; set; } = 3780;
|
||||
[FieldOrder(11)] public uint Unknown3 { get; set; } = 3780;
|
||||
[FieldOrder(12)] public uint Padding3 { get; set; }
|
||||
[FieldOrder(13)] public uint Padding4 { get; set; }
|
||||
|
||||
[FieldOrder(14)] [FieldLength(nameof(DataSize))] public byte[] BGR { get; set; }
|
||||
|
||||
public override string ToString()
|
||||
{
|
||||
return $"{nameof(Identifier)}: {Identifier}, {nameof(TableSize)}: {TableSize}, {nameof(Padding1)}: {Padding1}, {nameof(DpiX)}: {DpiX}, {nameof(DpiY)}: {DpiY}, {nameof(ResolutionX)}: {ResolutionX}, {nameof(ResolutionY)}: {ResolutionY}, {nameof(Unknown1)}: {Unknown1}, {nameof(Padding2)}: {Padding2}, {nameof(DataSize)}: {DataSize}, {nameof(Unknown2)}: {Unknown2}, {nameof(Unknown3)}: {Unknown3}, {nameof(Padding3)}: {Padding3}, {nameof(Padding4)}: {Padding4}, {nameof(BGR)}: {BGR.Length}";
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#endregion
|
||||
|
||||
#region Properties
|
||||
|
||||
public Header HeaderSettings { get; protected internal set; } = new();
|
||||
|
||||
public FlashForgeSVGXSvg SVGDocument { get; protected internal set; } = new();
|
||||
|
||||
public override FileFormatType FileType => FileFormatType.Binary;
|
||||
|
||||
public override FileExtension[] FileExtensions { get; } = {
|
||||
new (typeof(FlashForgeSVGXFile), "svgx", "Flashforge SVGX"),
|
||||
};
|
||||
|
||||
public override PrintParameterModifier[] PrintParameterModifiers { get; } =
|
||||
{
|
||||
PrintParameterModifier.BottomLayerCount,
|
||||
PrintParameterModifier.BottomExposureTime,
|
||||
PrintParameterModifier.ExposureTime,
|
||||
//PrintParameterModifier.LightPWM,
|
||||
};
|
||||
|
||||
public override Size[] ThumbnailsOriginalSize { get; } =
|
||||
{
|
||||
new(128, 128),
|
||||
new(200, 240)
|
||||
};
|
||||
|
||||
public override uint ResolutionX
|
||||
{
|
||||
get => SVGDocument.PrintParameters.ResolutionX;
|
||||
set
|
||||
{
|
||||
SVGDocument.PrintParameters.ResolutionX = value;
|
||||
RaisePropertyChanged();
|
||||
}
|
||||
}
|
||||
|
||||
public override uint ResolutionY
|
||||
{
|
||||
get => SVGDocument.PrintParameters.ResolutionY;
|
||||
set
|
||||
{
|
||||
SVGDocument.PrintParameters.ResolutionY = value;
|
||||
RaisePropertyChanged();
|
||||
}
|
||||
}
|
||||
|
||||
public override float DisplayWidth
|
||||
{
|
||||
get => SVGDocument.PrintParameters.DisplayWidth;
|
||||
set
|
||||
{
|
||||
SVGDocument.PrintParameters.DisplayWidth = (float)Math.Round(value, 2);
|
||||
RaisePropertyChanged();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public override float DisplayHeight
|
||||
{
|
||||
get => SVGDocument.PrintParameters.DisplayHeight;
|
||||
set
|
||||
{
|
||||
SVGDocument.PrintParameters.DisplayHeight = (float)Math.Round(value, 2);
|
||||
RaisePropertyChanged();
|
||||
}
|
||||
}
|
||||
|
||||
public override Enumerations.FlipDirection DisplayMirror
|
||||
{
|
||||
get => Enumerations.FlipDirection.Vertically;
|
||||
set {}
|
||||
}
|
||||
|
||||
public override float MachineZ
|
||||
{
|
||||
get => SVGDocument.PrintParameters.MachineZ > 0 ? SVGDocument.PrintParameters.MachineZ : base.MachineZ;
|
||||
set => base.MachineZ = SVGDocument.PrintParameters.MachineZ = (float)Math.Round(value, 2);
|
||||
}
|
||||
|
||||
public override float LayerHeight
|
||||
{
|
||||
get => SVGDocument.PrintParameters.LayerHeight;
|
||||
set
|
||||
{
|
||||
SVGDocument.PrintParameters.LayerHeight = Layer.RoundHeight(value);
|
||||
RaisePropertyChanged();
|
||||
}
|
||||
}
|
||||
|
||||
public override float PrintHeight
|
||||
{
|
||||
get => base.PrintHeight;
|
||||
set => base.PrintHeight = SVGDocument.PrintParameters.PrintRange.MaxZ = base.PrintHeight;
|
||||
}
|
||||
|
||||
public override uint LayerCount
|
||||
{
|
||||
get => base.LayerCount;
|
||||
set => SVGDocument.PrintParameters.LayerCount = base.LayerCount;
|
||||
}
|
||||
|
||||
public override ushort BottomLayerCount
|
||||
{
|
||||
get => SVGDocument.PrintParameters.ProjectionTime.BottomLayerCount;
|
||||
set => base.BottomLayerCount = SVGDocument.PrintParameters.ProjectionTime.BottomLayerCount = value;
|
||||
}
|
||||
|
||||
public override float BottomExposureTime
|
||||
{
|
||||
get => SVGDocument.PrintParameters.ProjectionTime.BottomExposureTime;
|
||||
set => base.BottomExposureTime = SVGDocument.PrintParameters.ProjectionTime.BottomExposureTime = (float)Math.Round(value, 2);
|
||||
}
|
||||
|
||||
|
||||
public override float ExposureTime
|
||||
{
|
||||
get => SVGDocument.PrintParameters.ProjectionTime.ExposureTime;
|
||||
set => base.ExposureTime = SVGDocument.PrintParameters.ProjectionTime.ExposureTime = (float)Math.Round(value, 2);
|
||||
}
|
||||
|
||||
/*public override float BottomLiftHeight
|
||||
{
|
||||
get => HeaderSettings.BottomLiftHeight;
|
||||
set => base.BottomLiftHeight = HeaderSettings.BottomLiftHeight = (float)Math.Round(value, 2);
|
||||
}
|
||||
|
||||
public override float LiftHeight
|
||||
{
|
||||
get => HeaderSettings.LiftHeight;
|
||||
set => base.LiftHeight = HeaderSettings.LiftHeight = (float)Math.Round(value, 2);
|
||||
}
|
||||
|
||||
public override float BottomLiftSpeed
|
||||
{
|
||||
get => HeaderSettings.BottomLiftSpeed;
|
||||
set => base.BottomLiftSpeed = HeaderSettings.BottomLiftSpeed = (float)Math.Round(value, 2);
|
||||
}
|
||||
|
||||
public override float LiftSpeed
|
||||
{
|
||||
get => HeaderSettings.LiftSpeed;
|
||||
set => base.LiftSpeed = HeaderSettings.LiftSpeed = (float)Math.Round(value, 2);
|
||||
}
|
||||
|
||||
public override float BottomRetractSpeed => RetractSpeed;
|
||||
|
||||
public override float RetractSpeed
|
||||
{
|
||||
get => HeaderSettings.RetractSpeed;
|
||||
set => base.RetractSpeed = HeaderSettings.RetractSpeed = (float)Math.Round(value, 2);
|
||||
}
|
||||
|
||||
public override byte BottomLightPWM
|
||||
{
|
||||
get => (byte) HeaderSettings.BottomLightPWM;
|
||||
set => base.BottomLightPWM = (byte) (HeaderSettings.BottomLightPWM = value);
|
||||
}
|
||||
|
||||
public override byte LightPWM
|
||||
{
|
||||
get => (byte) HeaderSettings.LightPWM;
|
||||
set => base.LightPWM = (byte) (HeaderSettings.LightPWM = value);
|
||||
}*/
|
||||
|
||||
public override float MaterialMilliliters
|
||||
{
|
||||
get => SVGDocument.PrintParameters.MaterialMilliliters;
|
||||
set
|
||||
{
|
||||
base.MaterialMilliliters = value;
|
||||
SVGDocument.PrintParameters.MaterialMilliliters = base.MaterialMilliliters;
|
||||
}
|
||||
}
|
||||
|
||||
public override string MaterialName
|
||||
{
|
||||
get => SVGDocument.PrintParameters.MaterialName;
|
||||
set => base.MaterialName = SVGDocument.PrintParameters.MaterialName = value;
|
||||
}
|
||||
|
||||
public override string MachineName
|
||||
{
|
||||
get => SVGDocument.PrintParameters.MachineName;
|
||||
set => base.MachineName = SVGDocument.PrintParameters.MachineName = value;
|
||||
}
|
||||
|
||||
public override object[] Configs => new object[] { HeaderSettings, SVGDocument.PrintParameters, SVGDocument.PrintParameters.ProjectionAdjust, SVGDocument.PrintParameters.PrintRange, SVGDocument.PrintParameters.ProjectionTime };
|
||||
|
||||
#endregion
|
||||
|
||||
#region Constructors
|
||||
public FlashForgeSVGXFile()
|
||||
{
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region Methods
|
||||
protected override void EncodeInternally(string fileFullPath, OperationProgress progress)
|
||||
{
|
||||
if (SVGDocument.PrintParameters.ResolutionX == 0 || SVGDocument.PrintParameters.ResolutionY == 0 ||
|
||||
SVGDocument.PrintParameters.DisplayWidth == 0 || SVGDocument.PrintParameters.DisplayHeight == 0)
|
||||
{
|
||||
throw new FileLoadException("This file does not contain a resolution and/or display size information needed to generate the layer images.\n" +
|
||||
"Note that FlashDLPrint slicer is unable to output files with the required information to load in here.\n" +
|
||||
"Please use other compatible slicer capable of output the correct information to load the file in here.", fileFullPath);
|
||||
}
|
||||
|
||||
using var outputFile = new FileStream(fileFullPath, FileMode.Create, FileAccess.Write);
|
||||
outputFile.Seek(Helpers.Serializer.SizeOf(HeaderSettings), SeekOrigin.Begin);
|
||||
|
||||
HeaderSettings.Preview1Address = 0;
|
||||
HeaderSettings.Preview2Address = 0;
|
||||
|
||||
progress.Reset(OperationProgress.StatusEncodePreviews, (uint)ThumbnailsOriginalSize.Length);
|
||||
if (Thumbnails is not null)
|
||||
{
|
||||
foreach (var mat in Thumbnails)
|
||||
{
|
||||
if (HeaderSettings.Preview2Address > 0) break;
|
||||
if(mat is null) continue;
|
||||
|
||||
var preview = new Preview
|
||||
{
|
||||
ResolutionX = (uint)mat.Width,
|
||||
ResolutionY = (uint)mat.Height
|
||||
};
|
||||
|
||||
using var matFlip = new Mat();
|
||||
CvInvoke.Flip(mat, matFlip, FlipType.Vertical);
|
||||
|
||||
var bytes = EncodeImage(DATATYPE_BGR888, matFlip);
|
||||
preview.BGR = bytes;
|
||||
preview.DataSize = (uint)bytes.Length;
|
||||
preview.TableSize = (uint)Helpers.Serializer.SizeOf(preview);
|
||||
|
||||
if (HeaderSettings.Preview1Address == 0)
|
||||
{
|
||||
HeaderSettings.Preview1Address = (uint)outputFile.Position;
|
||||
}
|
||||
else
|
||||
{
|
||||
HeaderSettings.Preview2Address = (uint)outputFile.Position;
|
||||
}
|
||||
|
||||
outputFile.WriteSerialize(preview);
|
||||
progress++;
|
||||
}
|
||||
}
|
||||
|
||||
var halfDisplay = Display.Half();
|
||||
var ppmm = Ppmm;
|
||||
var pixelUm = PixelSizeMicronsMax;
|
||||
|
||||
progress.Reset(OperationProgress.StatusEncodeLayers, LayerCount);
|
||||
SVGDocument.Groups = new List<FlashForgeSVGXSvgGroup> { new("background") };
|
||||
var groups = new FlashForgeSVGXSvgGroup[LayerCount];
|
||||
|
||||
Parallel.For(0, LayerCount, /*new ParallelOptions{MaxDegreeOfParallelism = 1},*/ layerIndex =>
|
||||
{
|
||||
if (progress.Token.IsCancellationRequested) return;
|
||||
|
||||
groups[layerIndex] = new FlashForgeSVGXSvgGroup($"layer-{layerIndex}");
|
||||
|
||||
using var mat = this[layerIndex].LayerMat;
|
||||
//CvInvoke.Threshold(mat, mat, 127, 255, ThresholdType.Binary); // no AA
|
||||
|
||||
using var contours = new VectorOfVectorOfPoint();
|
||||
using var hierarchy = new Mat();
|
||||
CvInvoke.FindContours(mat, contours, hierarchy, RetrType.Tree, ChainApproxMethod.ChainApproxSimple);
|
||||
var hierarchyJagged = hierarchy.GetData();
|
||||
|
||||
float minx = SVGDocument.PrintParameters.PrintRange.MinX;
|
||||
float miny = SVGDocument.PrintParameters.PrintRange.MinY;
|
||||
float maxx = SVGDocument.PrintParameters.PrintRange.MaxX;
|
||||
float maxy = SVGDocument.PrintParameters.PrintRange.MaxY;
|
||||
|
||||
var path = new StringBuilder();
|
||||
for (int i = 0; i < contours.Size; i++)
|
||||
{
|
||||
if (contours[i].Size == 0) continue;
|
||||
if ((int)hierarchyJagged.GetValue(0, i, 3) == -1) // Top hierarchy
|
||||
{
|
||||
if (path.Length > 0)
|
||||
{
|
||||
groups[layerIndex].Paths.Add(new FlashForgeSVGXSvgPath(path.ToString()));
|
||||
}
|
||||
path.Clear();
|
||||
|
||||
groups[layerIndex].Area = (float)Math.Round(Math.Cbrt(CvInvoke.ContourArea(contours[i]) / pixelUm), 3);
|
||||
groups[layerIndex].Perimeter = (float)Math.Round(CvInvoke.ArcLength(contours[i], true) / pixelUm, 3);
|
||||
}
|
||||
else
|
||||
{
|
||||
path.Append(' ');
|
||||
}
|
||||
|
||||
var mmX = (float)Math.Round(contours[i][0].X / ppmm.Width - halfDisplay.Width, 3);
|
||||
var mmY = (float)Math.Round(contours[i][0].Y / ppmm.Height - halfDisplay.Height, 3);
|
||||
|
||||
minx = Math.Min(minx, mmX);
|
||||
miny = Math.Min(miny, mmY);
|
||||
maxx = Math.Max(maxx, mmX);
|
||||
maxy = Math.Max(maxy, mmY);
|
||||
|
||||
path.Append($"M {mmX} {mmY} L");
|
||||
for (int x = 1; x < contours[i].Size; x++)
|
||||
{
|
||||
mmX = (float)Math.Round(contours[i][x].X / ppmm.Width - halfDisplay.Width, 3);
|
||||
mmY = (float)Math.Round(contours[i][x].Y / ppmm.Height - halfDisplay.Height, 3);
|
||||
path.Append($" {mmX} {mmY}");
|
||||
|
||||
minx = Math.Min(minx, mmX);
|
||||
miny = Math.Min(miny, mmY);
|
||||
maxx = Math.Max(maxx, mmX);
|
||||
maxy = Math.Max(maxy, mmY);
|
||||
}
|
||||
path.Append(" Z");
|
||||
}
|
||||
|
||||
if (path.Length > 0) // Left over
|
||||
{
|
||||
groups[layerIndex].Paths.Add(new FlashForgeSVGXSvgPath(path.ToString()));
|
||||
}
|
||||
|
||||
lock (progress.Mutex)
|
||||
{
|
||||
SVGDocument.PrintParameters.PrintRange.MinX = Math.Min(SVGDocument.PrintParameters.PrintRange.MinX, minx);
|
||||
SVGDocument.PrintParameters.PrintRange.MinY = Math.Min(SVGDocument.PrintParameters.PrintRange.MinY, miny);
|
||||
SVGDocument.PrintParameters.PrintRange.MaxX = Math.Max(SVGDocument.PrintParameters.PrintRange.MaxX, maxx);
|
||||
SVGDocument.PrintParameters.PrintRange.MaxY = Math.Max(SVGDocument.PrintParameters.PrintRange.MaxY, maxy);
|
||||
progress++;
|
||||
}
|
||||
});
|
||||
|
||||
SVGDocument.Groups.AddRange(groups);
|
||||
|
||||
HeaderSettings.SVGDocumentAddress = (uint)outputFile.Position;
|
||||
|
||||
outputFile.WriteString(SVGDocument.SerializeToString());
|
||||
|
||||
outputFile.Seek(0, SeekOrigin.Begin);
|
||||
outputFile.WriteSerialize(HeaderSettings);
|
||||
|
||||
Debug.WriteLine("Encode Results:");
|
||||
Debug.WriteLine(HeaderSettings);
|
||||
Debug.WriteLine(SVGDocument);
|
||||
Debug.WriteLine("-End-");
|
||||
}
|
||||
|
||||
protected override void DecodeInternally(string fileFullPath, OperationProgress progress)
|
||||
{
|
||||
using var inputFile = new FileStream(fileFullPath, FileMode.Open, FileAccess.Read);
|
||||
HeaderSettings = Helpers.Deserialize<Header>(inputFile);
|
||||
if (HeaderSettings.Identifier != Header.IdentifierText)
|
||||
{
|
||||
throw new FileLoadException("Not a valid Flashforge SVGX file!", fileFullPath);
|
||||
}
|
||||
|
||||
progress.Reset(OperationProgress.StatusDecodePreviews, ThumbnailsCount);
|
||||
Debug.Write("Header -> ");
|
||||
Debug.WriteLine(HeaderSettings);
|
||||
|
||||
byte thumbnailCount = 0;
|
||||
if (HeaderSettings.Preview1Address > 0)
|
||||
{
|
||||
inputFile.Seek(HeaderSettings.Preview1Address, SeekOrigin.Begin);
|
||||
var preview = Helpers.Deserialize<Preview>(inputFile);
|
||||
Thumbnails[thumbnailCount] = DecodeImage(DATATYPE_BGR888, preview.BGR, preview.ResolutionX, preview.ResolutionY);
|
||||
CvInvoke.Flip(Thumbnails[thumbnailCount], Thumbnails[thumbnailCount], FlipType.Vertical);
|
||||
Debug.Write($"Preview[{thumbnailCount}] -> ");
|
||||
Debug.WriteLine(preview);
|
||||
thumbnailCount++;
|
||||
|
||||
}
|
||||
progress++;
|
||||
if (HeaderSettings.Preview2Address > 0)
|
||||
{
|
||||
inputFile.Seek(HeaderSettings.Preview2Address, SeekOrigin.Begin);
|
||||
var preview = Helpers.Deserialize<Preview>(inputFile);
|
||||
Thumbnails[thumbnailCount] = DecodeImage(DATATYPE_BGR888, preview.BGR, preview.ResolutionX, preview.ResolutionY);
|
||||
CvInvoke.Flip(Thumbnails[thumbnailCount], Thumbnails[thumbnailCount], FlipType.Vertical);
|
||||
Debug.Write($"Preview[{thumbnailCount}] -> ");
|
||||
Debug.WriteLine(preview);
|
||||
thumbnailCount++;
|
||||
|
||||
}
|
||||
progress++;
|
||||
|
||||
inputFile.Seek(HeaderSettings.SVGDocumentAddress, SeekOrigin.Begin);
|
||||
string svgDocument = Encoding.UTF8.GetString(inputFile.ReadToEnd());
|
||||
SVGDocument = XmlExtensions.DeserializeObject<FlashForgeSVGXSvg>(svgDocument);
|
||||
|
||||
Debug.WriteLine(SVGDocument);
|
||||
|
||||
if (SVGDocument.PrintParameters.ResolutionX == 0 || SVGDocument.PrintParameters.ResolutionY == 0 ||
|
||||
SVGDocument.PrintParameters.DisplayWidth == 0 || SVGDocument.PrintParameters.DisplayHeight == 0)
|
||||
{
|
||||
throw new FileLoadException("This file does not contain a resolution and/or display size information needed to generate the layer images.\n" +
|
||||
"Note that FlashDLPrint slicer is unable to output files with the required information to load in here.\n" +
|
||||
"Please use other compatible slicer capable of output the correct information to load the file in here.", fileFullPath);
|
||||
}
|
||||
|
||||
var halfDisplay = Display.Half();
|
||||
var ppmm = Ppmm;
|
||||
|
||||
LayerManager.Init(SVGDocument.PrintParameters.LayerCount);
|
||||
progress.Reset(OperationProgress.StatusDecodeLayers, LayerCount);
|
||||
|
||||
Parallel.For(0, LayerCount, /*new ParallelOptions{MaxDegreeOfParallelism = 1},*/ layerIndex =>
|
||||
{
|
||||
if (progress.Token.IsCancellationRequested) return;
|
||||
|
||||
var mat = EmguExtensions.InitMat(Resolution);
|
||||
|
||||
var group = SVGDocument.Groups.FirstOrDefault(g => g.Id == $"layer-{layerIndex}");
|
||||
|
||||
if (group is not null)
|
||||
{
|
||||
var pointsOfPoints = new List<Point[]>();
|
||||
var points = new List<Point>();
|
||||
foreach (var path in group.Paths)
|
||||
{
|
||||
if (progress.Token.IsCancellationRequested) break;
|
||||
var spaceSplit = path.Value.Split(' ', StringSplitOptions.TrimEntries | StringSplitOptions.RemoveEmptyEntries);
|
||||
|
||||
for (int i = 0; i < spaceSplit.Length; i++)
|
||||
{
|
||||
if (spaceSplit[i] == "M")
|
||||
{
|
||||
if (points.Count > 0)
|
||||
{
|
||||
pointsOfPoints.Add(points.ToArray());
|
||||
points.Clear();
|
||||
}
|
||||
continue;
|
||||
}
|
||||
if (spaceSplit[i] == "Z")
|
||||
{
|
||||
if (points.Count > 0)
|
||||
{
|
||||
pointsOfPoints.Add(points.ToArray());
|
||||
points.Clear();
|
||||
}
|
||||
continue;
|
||||
}
|
||||
if (spaceSplit[i].Length == 1 && !char.IsDigit(spaceSplit[i][0])) continue; // Ignore any other not processed 1 char that's not a digit (L)
|
||||
|
||||
if (i + 1 >= spaceSplit.Length) break; // No more to see
|
||||
|
||||
|
||||
if (!float.TryParse(spaceSplit[i], out var mmX)) continue;
|
||||
if (!float.TryParse(spaceSplit[++i], out var mmY)) continue;
|
||||
|
||||
|
||||
var mmAbsX = Math.Clamp(halfDisplay.Width + mmX, 0, DisplayWidth);
|
||||
var mmAbsY = Math.Clamp(halfDisplay.Height + mmY, 0, DisplayHeight);
|
||||
|
||||
int x = (int)(mmAbsX * ppmm.Width);
|
||||
int y = (int)(mmAbsY * ppmm.Height);
|
||||
|
||||
points.Add(new Point(x, y));
|
||||
}
|
||||
|
||||
if (points.Count > 0) // Leftovers, still this should never happen!
|
||||
{
|
||||
pointsOfPoints.Add(points.ToArray());
|
||||
points.Clear();
|
||||
}
|
||||
}
|
||||
|
||||
if (pointsOfPoints.Count > 0)
|
||||
{
|
||||
using var vecPoints = new VectorOfVectorOfPoint(pointsOfPoints.ToArray());
|
||||
CvInvoke.DrawContours(mat, vecPoints, -1, EmguExtensions.WhiteColor, -1);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
progress.Token.ThrowIfCancellationRequested();
|
||||
|
||||
this[layerIndex] = new Layer((uint)layerIndex, mat, this);
|
||||
progress.LockAndIncrement();
|
||||
});
|
||||
}
|
||||
|
||||
public override void SaveAs(string filePath = null, OperationProgress progress = null)
|
||||
{
|
||||
if (RequireFullEncode)
|
||||
{
|
||||
if (!string.IsNullOrEmpty(filePath))
|
||||
{
|
||||
FileFullPath = filePath;
|
||||
}
|
||||
Encode(FileFullPath, progress);
|
||||
return;
|
||||
}
|
||||
|
||||
if (!string.IsNullOrEmpty(filePath))
|
||||
{
|
||||
File.Copy(FileFullPath, filePath, true);
|
||||
FileFullPath = filePath;
|
||||
}
|
||||
|
||||
using var outputFile = new FileStream(FileFullPath, FileMode.Open, FileAccess.Write);
|
||||
outputFile.Seek(HeaderSettings.SVGDocumentAddress, SeekOrigin.Begin);
|
||||
outputFile.SetLength(outputFile.Position);
|
||||
outputFile.WriteString(SVGDocument.SerializeToString());
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
@@ -230,7 +230,7 @@ namespace UVtools.Core.FileFormats
|
||||
}
|
||||
}
|
||||
|
||||
public override bool DisplayMirror { get; set; }
|
||||
public override Enumerations.FlipDirection DisplayMirror { get; set; }
|
||||
|
||||
public override float LayerHeight
|
||||
{
|
||||
|
||||
@@ -66,12 +66,6 @@ namespace UVtools.Core.FileFormats
|
||||
}
|
||||
}
|
||||
|
||||
public override bool DisplayMirror
|
||||
{
|
||||
get => false;
|
||||
set { }
|
||||
}
|
||||
|
||||
public override float LayerHeight { get; set; } = 0.01f;
|
||||
/*public override float PrintTime { get; } = 0;
|
||||
public override float UsedMaterial { get; } = 0;
|
||||
|
||||
@@ -344,9 +344,9 @@ namespace UVtools.Core.FileFormats
|
||||
set => base.MachineZ = HeaderSettings.MachineZ = (float)Math.Round(value, 2);
|
||||
}
|
||||
|
||||
public override bool DisplayMirror
|
||||
public override Enumerations.FlipDirection DisplayMirror
|
||||
{
|
||||
get => true;
|
||||
get => Enumerations.FlipDirection.Horizontally;
|
||||
set { }
|
||||
}
|
||||
|
||||
|
||||
@@ -234,7 +234,7 @@ namespace UVtools.Core.FileFormats
|
||||
}
|
||||
}
|
||||
|
||||
public override bool DisplayMirror { get; set; }
|
||||
public override Enumerations.FlipDirection DisplayMirror { get; set; }
|
||||
public override float LayerHeight
|
||||
{
|
||||
get => float.Parse(Encoding.ASCII.GetString(SlicerInfoSettings.LayerHeightBytes.Where(b => b != 0).ToArray()));
|
||||
|
||||
@@ -365,12 +365,12 @@ namespace UVtools.Core.FileFormats
|
||||
}
|
||||
}
|
||||
|
||||
public override bool DisplayMirror
|
||||
public override Enumerations.FlipDirection DisplayMirror
|
||||
{
|
||||
get => HeaderSettings.DisplayMirror is >= 1 and <= 3;
|
||||
get => (Enumerations.FlipDirection)HeaderSettings.DisplayMirror;
|
||||
set
|
||||
{
|
||||
HeaderSettings.DisplayMirror = value ? (byte)1 : (byte)0;
|
||||
HeaderSettings.DisplayMirror = (byte)value;
|
||||
RaisePropertyChanged();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -728,12 +728,12 @@ namespace UVtools.Core.FileFormats
|
||||
}
|
||||
}
|
||||
|
||||
public override bool DisplayMirror
|
||||
public override Enumerations.FlipDirection DisplayMirror
|
||||
{
|
||||
get => HeaderSettings.ProjectorType > 0;
|
||||
get => HeaderSettings.ProjectorType == 0 ? Enumerations.FlipDirection.None : Enumerations.FlipDirection.Horizontally;
|
||||
set
|
||||
{
|
||||
HeaderSettings.ProjectorType = value ? 1u : 0;
|
||||
HeaderSettings.ProjectorType = value == Enumerations.FlipDirection.None ? 0u : 1;
|
||||
RaisePropertyChanged();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -308,9 +308,9 @@ namespace UVtools.Core.FileFormats
|
||||
set { }
|
||||
}
|
||||
|
||||
public override bool DisplayMirror
|
||||
public override Enumerations.FlipDirection DisplayMirror
|
||||
{
|
||||
get => true;
|
||||
get => Enumerations.FlipDirection.Horizontally;
|
||||
set { }
|
||||
}
|
||||
|
||||
|
||||
@@ -14,6 +14,7 @@ using System.IO;
|
||||
using System.Threading.Tasks;
|
||||
using BinarySerialization;
|
||||
using Emgu.CV;
|
||||
using Emgu.CV.CvEnum;
|
||||
using UVtools.Core.Extensions;
|
||||
using UVtools.Core.Operations;
|
||||
|
||||
@@ -22,6 +23,9 @@ namespace UVtools.Core.FileFormats
|
||||
public class PhotonWorkshopFile : FileFormat
|
||||
{
|
||||
#region Constants
|
||||
public const byte VERSION_1 = 1;
|
||||
public const ushort VERSION_515 = 515;
|
||||
|
||||
public const byte MarkSize = 12;
|
||||
public const byte RLE1EncodingLimit = 0x7d; // 125;
|
||||
public const ushort RLE4EncodingLimit = 0xfff; // 4095;
|
||||
@@ -76,9 +80,11 @@ namespace UVtools.Core.FileFormats
|
||||
AnyCubicPhotonS,
|
||||
AnyCubicPhotonZero,
|
||||
AnyCubicPhotonX,
|
||||
AnyCubicPhotonUltra,
|
||||
AnyCubicPhotonMono,
|
||||
AnyCubicPhotonMonoSE,
|
||||
AnyCubicPhotonMonoX,
|
||||
AnyCubicPhotonMonoSQ,
|
||||
}
|
||||
#endregion
|
||||
|
||||
@@ -103,7 +109,7 @@ namespace UVtools.Core.FileFormats
|
||||
/// Gets the file format version
|
||||
/// 0C
|
||||
/// </summary>
|
||||
[FieldOrder(1)] public uint Version { get; set; } = 1;
|
||||
[FieldOrder(1)] public uint Version { get; set; } = VERSION_1;
|
||||
|
||||
/// <summary>
|
||||
/// Gets the area num
|
||||
@@ -129,9 +135,9 @@ namespace UVtools.Core.FileFormats
|
||||
[FieldOrder(5)] public uint PreviewAddress { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 20
|
||||
/// 20, Spoted on version 515 only
|
||||
/// </summary>
|
||||
[FieldOrder(6)] public uint Padding2 { get; set; }
|
||||
[FieldOrder(6)] public uint PreviewEndAddress { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets the layer definition start address
|
||||
@@ -142,7 +148,7 @@ namespace UVtools.Core.FileFormats
|
||||
/// <summary>
|
||||
/// 28
|
||||
/// </summary>
|
||||
[FieldOrder(8)] public uint Padding3 { get; set; }
|
||||
[FieldOrder(8)] public uint Padding2 { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets layer image start address
|
||||
@@ -152,7 +158,7 @@ namespace UVtools.Core.FileFormats
|
||||
|
||||
public override string ToString()
|
||||
{
|
||||
return $"{nameof(Mark)}: {Mark}, {nameof(Version)}: {Version}, {nameof(AreaNum)}: {AreaNum}, {nameof(HeaderAddress)}: {HeaderAddress}, {nameof(Padding1)}: {Padding1}, {nameof(PreviewAddress)}: {PreviewAddress}, {nameof(Padding2)}: {Padding2}, {nameof(LayerDefinitionAddress)}: {LayerDefinitionAddress}, {nameof(Padding3)}: {Padding3}, {nameof(LayerImageAddress)}: {LayerImageAddress}";
|
||||
return $"{nameof(Mark)}: {Mark}, {nameof(Version)}: {Version}, {nameof(AreaNum)}: {AreaNum}, {nameof(HeaderAddress)}: {HeaderAddress}, {nameof(Padding1)}: {Padding1}, {nameof(PreviewAddress)}: {PreviewAddress}, {nameof(PreviewEndAddress)}: {PreviewEndAddress}, {nameof(LayerDefinitionAddress)}: {LayerDefinitionAddress}, {nameof(Padding2)}: {Padding2}, {nameof(LayerImageAddress)}: {LayerImageAddress}";
|
||||
}
|
||||
}
|
||||
#endregion
|
||||
@@ -395,10 +401,10 @@ namespace UVtools.Core.FileFormats
|
||||
/// </summary>
|
||||
[FieldOrder(3)] public uint ResolutionY { get; set; } = 168;
|
||||
|
||||
[FieldOrder(4)] public uint Unknown1 { get; set; }
|
||||
/*[FieldOrder(4)] public uint Unknown1 { get; set; }
|
||||
[FieldOrder(5)] public uint Unknown2 { get; set; }
|
||||
[FieldOrder(6)] public uint Unknown3 { get; set; }
|
||||
[FieldOrder(7)] public uint Unknown4 { get; set; }
|
||||
[FieldOrder(7)] public uint Unknown4 { get; set; }*/
|
||||
|
||||
[Ignore] public uint DataSize => ResolutionX * ResolutionY * 2;
|
||||
|
||||
@@ -422,7 +428,7 @@ namespace UVtools.Core.FileFormats
|
||||
|
||||
/*public unsafe Mat Decode(bool consumeData = true)
|
||||
{
|
||||
Mat image = new(new Size((int) Width, (int) Height), DepthType.Cv8U, 3);
|
||||
Mat image = new(new Size((int)ResolutionX, (int)ResolutionY), DepthType.Cv8U, 3);
|
||||
var span = image.GetBytePointer();
|
||||
|
||||
int pixel = 0;
|
||||
@@ -467,8 +473,8 @@ namespace UVtools.Core.FileFormats
|
||||
}
|
||||
|
||||
return preview;
|
||||
}
|
||||
*/
|
||||
}*/
|
||||
|
||||
public override string ToString()
|
||||
{
|
||||
return $"{nameof(Section)}: {Section}, {nameof(ResolutionX)}: {ResolutionX}, {nameof(DpiResolution)}: {DpiResolution}, {nameof(ResolutionY)}: {ResolutionY}, {nameof(Data)}: {Data?.Length ?? 0}";
|
||||
@@ -922,12 +928,15 @@ namespace UVtools.Core.FileFormats
|
||||
|
||||
public override FileExtension[] FileExtensions { get; } = {
|
||||
|
||||
new(typeof(PhotonWorkshopFile), "pws", "Photon / Photon S (PWS)"),
|
||||
new(typeof(PhotonWorkshopFile), "pw0", "Photon Zero (PW0)"),
|
||||
new(typeof(PhotonWorkshopFile), "pwx", "Photon X (PWX)"),
|
||||
new(typeof(PhotonWorkshopFile), "dlp", "Photon Ultra (DLP)", false, false),
|
||||
new(typeof(PhotonWorkshopFile), "pwmx", "Photon Mono X (PWMX)"),
|
||||
new(typeof(PhotonWorkshopFile), "pwms", "Photon Mono SE (PWMS)"),
|
||||
new(typeof(PhotonWorkshopFile), "pwmo", "Photon Mono (PWMO)"),
|
||||
new(typeof(PhotonWorkshopFile), "pwx", "Photon X (PWX)"),
|
||||
new(typeof(PhotonWorkshopFile), "pws", "Photon / Photon S (PWS)"),
|
||||
new(typeof(PhotonWorkshopFile), "pw0", "Photon Zero (PW0)"),
|
||||
new(typeof(PhotonWorkshopFile), "pmsq", "Photon Mono SQ (PMSQ)", false, false),
|
||||
|
||||
|
||||
};
|
||||
|
||||
@@ -980,23 +989,18 @@ namespace UVtools.Core.FileFormats
|
||||
{
|
||||
get
|
||||
{
|
||||
switch (PrinterModel)
|
||||
return PrinterModel switch
|
||||
{
|
||||
case AnyCubicMachine.AnyCubicPhotonS:
|
||||
return 68.04f;
|
||||
case AnyCubicMachine.AnyCubicPhotonZero:
|
||||
return 55.44f;
|
||||
case AnyCubicMachine.AnyCubicPhotonX:
|
||||
return 192;
|
||||
case AnyCubicMachine.AnyCubicPhotonMono:
|
||||
return 82.62f;
|
||||
case AnyCubicMachine.AnyCubicPhotonMonoSE:
|
||||
return 82.62f;
|
||||
case AnyCubicMachine.AnyCubicPhotonMonoX:
|
||||
return 192;
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
AnyCubicMachine.AnyCubicPhotonS => 68.04f,
|
||||
AnyCubicMachine.AnyCubicPhotonZero => 55.44f,
|
||||
AnyCubicMachine.AnyCubicPhotonX => 192,
|
||||
AnyCubicMachine.AnyCubicPhotonUltra => 102.40f,
|
||||
AnyCubicMachine.AnyCubicPhotonMono => 82.62f,
|
||||
AnyCubicMachine.AnyCubicPhotonMonoSE => 82.62f,
|
||||
AnyCubicMachine.AnyCubicPhotonMonoX => 192,
|
||||
AnyCubicMachine.AnyCubicPhotonMonoSQ => 120,
|
||||
_ => 0
|
||||
};
|
||||
}
|
||||
set { }
|
||||
}
|
||||
@@ -1004,23 +1008,18 @@ namespace UVtools.Core.FileFormats
|
||||
{
|
||||
get
|
||||
{
|
||||
switch (PrinterModel)
|
||||
return PrinterModel switch
|
||||
{
|
||||
case AnyCubicMachine.AnyCubicPhotonS:
|
||||
return 120.96f;
|
||||
case AnyCubicMachine.AnyCubicPhotonZero:
|
||||
return 98.637f;
|
||||
case AnyCubicMachine.AnyCubicPhotonX:
|
||||
return 120;
|
||||
case AnyCubicMachine.AnyCubicPhotonMono:
|
||||
return 130.56f;
|
||||
case AnyCubicMachine.AnyCubicPhotonMonoSE:
|
||||
return 130.56f;
|
||||
case AnyCubicMachine.AnyCubicPhotonMonoX:
|
||||
return 120;
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
AnyCubicMachine.AnyCubicPhotonS => 120.96f,
|
||||
AnyCubicMachine.AnyCubicPhotonZero => 98.637f,
|
||||
AnyCubicMachine.AnyCubicPhotonX => 120,
|
||||
AnyCubicMachine.AnyCubicPhotonUltra => 57.60f,
|
||||
AnyCubicMachine.AnyCubicPhotonMono => 130.56f,
|
||||
AnyCubicMachine.AnyCubicPhotonMonoSE => 130.56f,
|
||||
AnyCubicMachine.AnyCubicPhotonMonoX => 120,
|
||||
AnyCubicMachine.AnyCubicPhotonMonoSQ => 128,
|
||||
_ => 0
|
||||
};
|
||||
}
|
||||
set { }
|
||||
}
|
||||
@@ -1029,30 +1028,25 @@ namespace UVtools.Core.FileFormats
|
||||
{
|
||||
get
|
||||
{
|
||||
switch (PrinterModel)
|
||||
return PrinterModel switch
|
||||
{
|
||||
case AnyCubicMachine.AnyCubicPhotonS:
|
||||
return 165;
|
||||
case AnyCubicMachine.AnyCubicPhotonZero:
|
||||
return 150;
|
||||
case AnyCubicMachine.AnyCubicPhotonX:
|
||||
return 245;
|
||||
case AnyCubicMachine.AnyCubicPhotonMono:
|
||||
return 165;
|
||||
case AnyCubicMachine.AnyCubicPhotonMonoSE:
|
||||
return 160;
|
||||
case AnyCubicMachine.AnyCubicPhotonMonoX:
|
||||
return 245;
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
AnyCubicMachine.AnyCubicPhotonS => 165,
|
||||
AnyCubicMachine.AnyCubicPhotonZero => 150,
|
||||
AnyCubicMachine.AnyCubicPhotonX => 245,
|
||||
AnyCubicMachine.AnyCubicPhotonUltra => 165,
|
||||
AnyCubicMachine.AnyCubicPhotonMono => 165,
|
||||
AnyCubicMachine.AnyCubicPhotonMonoSE => 160,
|
||||
AnyCubicMachine.AnyCubicPhotonMonoX => 245,
|
||||
AnyCubicMachine.AnyCubicPhotonMonoSQ => 200,
|
||||
_ => 0
|
||||
};
|
||||
}
|
||||
set { }
|
||||
}
|
||||
|
||||
public override bool DisplayMirror
|
||||
public override Enumerations.FlipDirection DisplayMirror
|
||||
{
|
||||
get => true;
|
||||
get => Enumerations.FlipDirection.Horizontally;
|
||||
set {}
|
||||
}
|
||||
|
||||
@@ -1198,23 +1192,18 @@ namespace UVtools.Core.FileFormats
|
||||
{
|
||||
get
|
||||
{
|
||||
switch (PrinterModel)
|
||||
return PrinterModel switch
|
||||
{
|
||||
case AnyCubicMachine.AnyCubicPhotonS:
|
||||
return "AnyCubic Photon S";
|
||||
case AnyCubicMachine.AnyCubicPhotonZero:
|
||||
return "AnyCubic Photon Zero";
|
||||
case AnyCubicMachine.AnyCubicPhotonX:
|
||||
return "AnyCubic Photon X";
|
||||
case AnyCubicMachine.AnyCubicPhotonMono:
|
||||
return "AnyCubic Photon Mono";
|
||||
case AnyCubicMachine.AnyCubicPhotonMonoSE:
|
||||
return "AnyCubic Photon Mono SE";
|
||||
case AnyCubicMachine.AnyCubicPhotonMonoX:
|
||||
return "AnyCubic Photon Mono X";
|
||||
default:
|
||||
return base.MachineName;
|
||||
}
|
||||
AnyCubicMachine.AnyCubicPhotonS => "AnyCubic Photon S",
|
||||
AnyCubicMachine.AnyCubicPhotonZero => "AnyCubic Photon Zero",
|
||||
AnyCubicMachine.AnyCubicPhotonX => "AnyCubic Photon X",
|
||||
AnyCubicMachine.AnyCubicPhotonUltra => "AnyCubic Photon Ultra",
|
||||
AnyCubicMachine.AnyCubicPhotonMono => "AnyCubic Photon Mono",
|
||||
AnyCubicMachine.AnyCubicPhotonMonoSE => "AnyCubic Photon Mono SE",
|
||||
AnyCubicMachine.AnyCubicPhotonMonoX => "AnyCubic Photon Mono X",
|
||||
AnyCubicMachine.AnyCubicPhotonMonoSQ => "AnyCubic Photon Mono SQ",
|
||||
_ => base.MachineName
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1244,6 +1233,11 @@ namespace UVtools.Core.FileFormats
|
||||
return AnyCubicMachine.AnyCubicPhotonX;
|
||||
}
|
||||
|
||||
if (FileEndsWith(".dlp"))
|
||||
{
|
||||
return AnyCubicMachine.AnyCubicPhotonUltra;
|
||||
}
|
||||
|
||||
if (FileEndsWith(".pwmo"))
|
||||
{
|
||||
return AnyCubicMachine.AnyCubicPhotonMono;
|
||||
@@ -1259,6 +1253,11 @@ namespace UVtools.Core.FileFormats
|
||||
return AnyCubicMachine.AnyCubicPhotonMonoX;
|
||||
}
|
||||
|
||||
if (FileEndsWith(".pmsq"))
|
||||
{
|
||||
return AnyCubicMachine.AnyCubicPhotonMonoSQ;
|
||||
}
|
||||
|
||||
return AnyCubicMachine.AnyCubicPhotonS;
|
||||
}
|
||||
}
|
||||
@@ -1280,30 +1279,20 @@ namespace UVtools.Core.FileFormats
|
||||
|
||||
protected override void EncodeInternally(string fileFullPath, OperationProgress progress)
|
||||
{
|
||||
switch (PrinterModel)
|
||||
HeaderSettings.PixelSizeUm = PixelSizeMicronsMax;
|
||||
|
||||
/*PrinterModel switch
|
||||
{
|
||||
case AnyCubicMachine.AnyCubicPhotonS:
|
||||
HeaderSettings.PixelSizeUm = 47.25f;
|
||||
break;
|
||||
case AnyCubicMachine.AnyCubicPhotonZero:
|
||||
HeaderSettings.PixelSizeUm = 115.5f;
|
||||
break;
|
||||
case AnyCubicMachine.AnyCubicPhotonX:
|
||||
HeaderSettings.PixelSizeUm = 75;
|
||||
break;
|
||||
case AnyCubicMachine.AnyCubicPhotonMono:
|
||||
HeaderSettings.PixelSizeUm = 51;
|
||||
break;
|
||||
case AnyCubicMachine.AnyCubicPhotonMonoSE:
|
||||
HeaderSettings.PixelSizeUm = 51;
|
||||
break;
|
||||
case AnyCubicMachine.AnyCubicPhotonMonoX:
|
||||
HeaderSettings.PixelSizeUm = 50;
|
||||
break;
|
||||
default:
|
||||
HeaderSettings.PixelSizeUm = 47.25f;
|
||||
break;
|
||||
}
|
||||
AnyCubicMachine.AnyCubicPhotonS => 47.25f,
|
||||
AnyCubicMachine.AnyCubicPhotonZero => 115.5f,
|
||||
AnyCubicMachine.AnyCubicPhotonX => 75,
|
||||
AnyCubicMachine.AnyCubicPhotonUltra => 80,
|
||||
AnyCubicMachine.AnyCubicPhotonMono => 51,
|
||||
AnyCubicMachine.AnyCubicPhotonMonoSE => 51,
|
||||
AnyCubicMachine.AnyCubicPhotonMonoX => 50,
|
||||
AnyCubicMachine.AnyCubicPhotonMonoSQ => 50,
|
||||
_ => 47.25f
|
||||
};*/
|
||||
|
||||
HeaderSettings.PerLayerOverride = (byte)(LayerManager.AllLayersAreUsingGlobalParameters ? 0 : 1);
|
||||
|
||||
@@ -1323,6 +1312,7 @@ namespace UVtools.Core.FileFormats
|
||||
};
|
||||
Helpers.SerializeWriteFileStream(outputFile, preview);
|
||||
outputFile.WriteBytes(preview.Data);
|
||||
FileMarkSettings.PreviewEndAddress = (uint)outputFile.Position;
|
||||
}
|
||||
|
||||
progress.Reset(OperationProgress.StatusEncodeLayers, LayerCount);
|
||||
@@ -1393,9 +1383,9 @@ namespace UVtools.Core.FileFormats
|
||||
$"Invalid Filemark {FileMarkSettings.Mark}, expected {FileMark.SectionMarkFile}", fileFullPath);
|
||||
}
|
||||
|
||||
if (FileMarkSettings.Version != 1)
|
||||
if (FileMarkSettings.Version is not VERSION_1 and not VERSION_515)
|
||||
{
|
||||
throw new FileLoadException($"Invalid Version {FileMarkSettings.Version}, expected 1",
|
||||
throw new FileLoadException($"Invalid Version {FileMarkSettings.Version}, expected {VERSION_1} or {VERSION_515}",
|
||||
fileFullPath);
|
||||
}
|
||||
|
||||
@@ -1423,6 +1413,7 @@ namespace UVtools.Core.FileFormats
|
||||
inputFile.ReadBytes(PreviewSettings.Data);
|
||||
|
||||
Thumbnails[0] = DecodeImage(DATATYPE_RGB565, PreviewSettings.Data, PreviewSettings.ResolutionX, PreviewSettings.ResolutionY);
|
||||
//Thumbnails[0] = PreviewSettings.Decode();
|
||||
PreviewSettings.Data = null;
|
||||
}
|
||||
|
||||
|
||||
@@ -384,13 +384,19 @@ namespace UVtools.Core.FileFormats
|
||||
}
|
||||
}
|
||||
|
||||
public override bool DisplayMirror
|
||||
public override Enumerations.FlipDirection DisplayMirror
|
||||
{
|
||||
get => PrinterSettings.DisplayMirrorX || PrinterSettings.DisplayMirrorY;
|
||||
get
|
||||
{
|
||||
if (PrinterSettings.DisplayMirrorX && PrinterSettings.DisplayMirrorY) return Enumerations.FlipDirection.Both;
|
||||
if (PrinterSettings.DisplayMirrorX) return Enumerations.FlipDirection.Horizontally;
|
||||
if (PrinterSettings.DisplayMirrorY) return Enumerations.FlipDirection.Vertically;
|
||||
return Enumerations.FlipDirection.None;
|
||||
}
|
||||
set
|
||||
{
|
||||
PrinterSettings.DisplayMirrorX = value;
|
||||
PrinterSettings.DisplayMirrorY = false;
|
||||
PrinterSettings.DisplayMirrorX = value is Enumerations.FlipDirection.Horizontally or Enumerations.FlipDirection.Both;
|
||||
PrinterSettings.DisplayMirrorY = value is Enumerations.FlipDirection.Vertically or Enumerations.FlipDirection.Both;
|
||||
RaisePropertyChanged();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -211,7 +211,7 @@ namespace UVtools.Core.FileFormats
|
||||
}
|
||||
}
|
||||
|
||||
public override bool DisplayMirror { get; set; }
|
||||
public override Enumerations.FlipDirection DisplayMirror { get; set; }
|
||||
|
||||
public override byte AntiAliasing
|
||||
{
|
||||
|
||||
@@ -283,7 +283,22 @@ namespace UVtools.Core.FileFormats
|
||||
}
|
||||
}
|
||||
|
||||
public override bool DisplayMirror => ManifestFile.Machine.XMirror || ManifestFile.Machine.YMirror;
|
||||
public override Enumerations.FlipDirection DisplayMirror
|
||||
{
|
||||
get
|
||||
{
|
||||
if (ManifestFile.Machine.XMirror && ManifestFile.Machine.YMirror) return Enumerations.FlipDirection.Both;
|
||||
if (ManifestFile.Machine.XMirror) return Enumerations.FlipDirection.Horizontally;
|
||||
if (ManifestFile.Machine.YMirror) return Enumerations.FlipDirection.Vertically;
|
||||
return Enumerations.FlipDirection.None;
|
||||
}
|
||||
set
|
||||
{
|
||||
ManifestFile.Machine.XMirror = value is Enumerations.FlipDirection.Horizontally or Enumerations.FlipDirection.Both;
|
||||
ManifestFile.Machine.YMirror = value is Enumerations.FlipDirection.Vertically or Enumerations.FlipDirection.Both;
|
||||
RaisePropertyChanged();
|
||||
}
|
||||
}
|
||||
|
||||
public override byte AntiAliasing
|
||||
{
|
||||
|
||||
@@ -276,7 +276,7 @@ namespace UVtools.Core.FileFormats
|
||||
}
|
||||
}
|
||||
|
||||
public override bool DisplayMirror => true;
|
||||
public override Enumerations.FlipDirection DisplayMirror => Enumerations.FlipDirection.Vertically;
|
||||
|
||||
public override byte AntiAliasing
|
||||
{
|
||||
|
||||
@@ -207,9 +207,9 @@ namespace UVtools.Core.FileFormats
|
||||
set { }
|
||||
}
|
||||
|
||||
public override bool DisplayMirror
|
||||
public override Enumerations.FlipDirection DisplayMirror
|
||||
{
|
||||
get => true;
|
||||
get => Enumerations.FlipDirection.Horizontally;
|
||||
set { }
|
||||
}
|
||||
|
||||
|
||||
@@ -370,7 +370,7 @@ namespace UVtools.Core.Operations
|
||||
if (_bottomLayers <= 0) _bottomLayers = (ushort) Slicer.Slicer.MillimetersToLayers(1M, _layerHeight);
|
||||
if (_normalLayers <= 0) _normalLayers = (ushort) Slicer.Slicer.MillimetersToLayers(3.5M, _layerHeight);
|
||||
|
||||
_mirrorOutput = SlicerFile.DisplayMirror;
|
||||
_mirrorOutput = SlicerFile.DisplayMirror != Enumerations.FlipDirection.None;
|
||||
}
|
||||
|
||||
#endregion
|
||||
@@ -659,7 +659,9 @@ namespace UVtools.Core.Operations
|
||||
|
||||
if (_mirrorOutput)
|
||||
{
|
||||
Parallel.ForEach(layers, mat => CvInvoke.Flip(mat, mat, FlipType.Horizontal));
|
||||
var flip = SlicerFile.DisplayMirror;
|
||||
if (flip == Enumerations.FlipDirection.None) flip = Enumerations.FlipDirection.Horizontally;
|
||||
Parallel.ForEach(layers, mat => CvInvoke.Flip(mat, mat, Enumerations.ToOpenCVFlipType(flip)));
|
||||
}
|
||||
|
||||
// Preview
|
||||
|
||||
@@ -1155,7 +1155,7 @@ namespace UVtools.Core.Operations
|
||||
{
|
||||
base.InitWithSlicerFile();
|
||||
|
||||
_mirrorOutput = SlicerFile.DisplayMirror;
|
||||
_mirrorOutput = SlicerFile.DisplayMirror != Enumerations.FlipDirection.None;
|
||||
|
||||
if (SlicerFile.DisplayWidth > 0)
|
||||
DisplayWidth = (decimal)SlicerFile.DisplayWidth;
|
||||
@@ -2232,7 +2232,9 @@ namespace UVtools.Core.Operations
|
||||
|
||||
if (_mirrorOutput)
|
||||
{
|
||||
new OperationFlip(SlicerFile) { FlipDirection = FlipType.Horizontal }.Execute(progress);
|
||||
var flip = SlicerFile.DisplayMirror;
|
||||
if (flip == Enumerations.FlipDirection.None) flip = Enumerations.FlipDirection.Horizontally;
|
||||
new OperationFlip(SlicerFile) { FlipDirection = Enumerations.ToOpenCVFlipType(flip) }.Execute(progress);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -112,7 +112,7 @@ namespace UVtools.Core.Operations
|
||||
if(_bottomLayers <= 0) _bottomLayers = SlicerFile.BottomLayerCount;
|
||||
if(_bottomExposure <= 0) _bottomExposure = (decimal)SlicerFile.BottomExposureTime;
|
||||
if(_normalExposure <= 0) _normalExposure = (decimal)SlicerFile.ExposureTime;
|
||||
_mirrorOutput = SlicerFile.DisplayMirror;
|
||||
_mirrorOutput = SlicerFile.DisplayMirror != Enumerations.FlipDirection.None;
|
||||
}
|
||||
|
||||
#endregion
|
||||
@@ -447,7 +447,9 @@ namespace UVtools.Core.Operations
|
||||
|
||||
if (_mirrorOutput)
|
||||
{
|
||||
Parallel.ForEach(layers, mat => CvInvoke.Flip(mat, mat, FlipType.Horizontal));
|
||||
var flip = SlicerFile.DisplayMirror;
|
||||
if (flip == Enumerations.FlipDirection.None) flip = Enumerations.FlipDirection.Horizontally;
|
||||
Parallel.ForEach(layers, mat => CvInvoke.Flip(mat, mat, Enumerations.ToOpenCVFlipType(flip)));
|
||||
}
|
||||
|
||||
return layers;
|
||||
|
||||
@@ -111,7 +111,7 @@ namespace UVtools.Core.Operations
|
||||
if(_bottomLayers <= 0) _bottomLayers = SlicerFile.BottomLayerCount;
|
||||
if(_bottomExposure <= 0) _bottomExposure = (decimal)SlicerFile.BottomExposureTime;
|
||||
if(_normalExposure <= 0) _normalExposure = (decimal)SlicerFile.ExposureTime;
|
||||
_mirrorOutput = SlicerFile.DisplayMirror;
|
||||
_mirrorOutput = SlicerFile.DisplayMirror != Enumerations.FlipDirection.None;
|
||||
|
||||
if (SlicerFile.DisplayWidth > 0)
|
||||
DisplayWidth = (decimal)SlicerFile.DisplayWidth;
|
||||
@@ -385,7 +385,9 @@ namespace UVtools.Core.Operations
|
||||
|
||||
if (_mirrorOutput)
|
||||
{
|
||||
Parallel.ForEach(layers, mat => CvInvoke.Flip(mat, mat, FlipType.Horizontal));
|
||||
var flip = SlicerFile.DisplayMirror;
|
||||
if (flip == Enumerations.FlipDirection.None) flip = Enumerations.FlipDirection.Horizontally;
|
||||
Parallel.ForEach(layers, mat => CvInvoke.Flip(mat, mat, Enumerations.ToOpenCVFlipType(flip)));
|
||||
}
|
||||
|
||||
return layers;
|
||||
|
||||
@@ -431,7 +431,7 @@ namespace UVtools.Core.Operations
|
||||
if (_bottomLayers <= 0) _bottomLayers = SlicerFile.BottomLayerCount;
|
||||
if (_bottomExposure <= 0) _bottomExposure = (decimal)SlicerFile.BottomExposureTime;
|
||||
if (_normalExposure <= 0) _normalExposure = (decimal)SlicerFile.ExposureTime;
|
||||
_mirrorOutput = SlicerFile.DisplayMirror;
|
||||
_mirrorOutput = SlicerFile.DisplayMirror != Enumerations.FlipDirection.None;
|
||||
|
||||
if (SlicerFile.DisplayWidth > 0)
|
||||
DisplayWidth = (decimal)SlicerFile.DisplayWidth;
|
||||
@@ -686,7 +686,9 @@ namespace UVtools.Core.Operations
|
||||
|
||||
if (_mirrorOutput)
|
||||
{
|
||||
Parallel.ForEach(layers, mat => CvInvoke.Flip(mat, mat, FlipType.Horizontal));
|
||||
var flip = SlicerFile.DisplayMirror;
|
||||
if (flip == Enumerations.FlipDirection.None) flip = Enumerations.FlipDirection.Horizontally;
|
||||
Parallel.ForEach(layers, mat => CvInvoke.Flip(mat, mat, Enumerations.ToOpenCVFlipType(flip)));
|
||||
}
|
||||
|
||||
return layers;
|
||||
|
||||
@@ -463,7 +463,7 @@ namespace UVtools.Core.Operations
|
||||
if (_bottomLayers <= 0) _bottomLayers = SlicerFile.BottomLayerCount;
|
||||
if (_bottomExposure <= 0) _bottomExposure = (decimal)SlicerFile.BottomExposureTime;
|
||||
if (_normalExposure <= 0) _normalExposure = (decimal)SlicerFile.ExposureTime;
|
||||
_mirrorOutput = SlicerFile.DisplayMirror;
|
||||
_mirrorOutput = SlicerFile.DisplayMirror != Enumerations.FlipDirection.None;
|
||||
|
||||
if (SlicerFile.DisplayWidth > 0)
|
||||
DisplayWidth = (decimal)SlicerFile.DisplayWidth;
|
||||
@@ -719,7 +719,9 @@ namespace UVtools.Core.Operations
|
||||
|
||||
if (_mirrorOutput)
|
||||
{
|
||||
Parallel.ForEach(layers, mat => CvInvoke.Flip(mat, mat, FlipType.Horizontal));
|
||||
var flip = SlicerFile.DisplayMirror;
|
||||
if (flip == Enumerations.FlipDirection.None) flip = Enumerations.FlipDirection.Horizontally;
|
||||
Parallel.ForEach(layers, mat => CvInvoke.Flip(mat, mat, Enumerations.ToOpenCVFlipType(flip)));
|
||||
}
|
||||
|
||||
return layers;
|
||||
|
||||
@@ -7,7 +7,6 @@
|
||||
*/
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel;
|
||||
using System.IO;
|
||||
using System.Threading.Tasks;
|
||||
@@ -274,10 +273,10 @@ namespace UVtools.Core.Operations
|
||||
tw.Write(" ");
|
||||
}
|
||||
|
||||
tw.Write($"M{contours[i][0].X} {contours[i][0].Y}");
|
||||
tw.Write($"M {contours[i][0].X} {contours[i][0].Y} L");
|
||||
for (int x = 1; x < contours[i].Size; x++)
|
||||
{
|
||||
tw.Write($" L{contours[i][x].X} {contours[i][x].Y}");
|
||||
tw.Write($" {contours[i][x].X} {contours[i][x].Y}");
|
||||
}
|
||||
tw.Write(" Z");
|
||||
}
|
||||
|
||||
@@ -794,11 +794,22 @@ namespace UVtools.Core.Operations
|
||||
and not PixelArithmeticOperators.KeepRegion
|
||||
and not PixelArithmeticOperators.DiscardRegion ? EmguExtensions.InitMat(HaveROI ? ROI.Size : SlicerFile.Resolution, new MCvScalar(_value)) : null;
|
||||
|
||||
public void PresetElephantFootCompensation()
|
||||
{
|
||||
SelectBottomLayers();
|
||||
Operator = PixelArithmeticOperators.Set;
|
||||
ApplyMethod = PixelArithmeticApplyMethod.ModelWalls;
|
||||
//Value = 190;
|
||||
//WallThickness = 20;
|
||||
WallChamfer = false;
|
||||
UsePattern = false;
|
||||
}
|
||||
|
||||
public void PresetPixelDimming()
|
||||
{
|
||||
Operator = PixelArithmeticOperators.Subtract;
|
||||
ApplyMethod = PixelArithmeticApplyMethod.ModelInner;
|
||||
WallThickness = 20;
|
||||
//WallThickness = 20;
|
||||
WallChamfer = false;
|
||||
UsePattern = true;
|
||||
}
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
<RepositoryUrl>https://github.com/sn4k3/UVtools</RepositoryUrl>
|
||||
<PackageProjectUrl>https://github.com/sn4k3/UVtools</PackageProjectUrl>
|
||||
<Description>MSLA/DLP, file analysis, calibration, repair, conversion and manipulation</Description>
|
||||
<Version>2.19.5</Version>
|
||||
<Version>2.20.0</Version>
|
||||
<Copyright>Copyright © 2020 PTRTECH</Copyright>
|
||||
<PackageIcon>UVtools.png</PackageIcon>
|
||||
<Platforms>AnyCPU;x64</Platforms>
|
||||
|
||||
@@ -882,214 +882,241 @@
|
||||
<Directory Id="owd9F9F77C9E3C3E4DA718760164D5303B8" Name="Assets">
|
||||
<Directory Id="owd09EA423812736FC896B5C82AE8837139" Name="PrusaSlicer">
|
||||
<Directory Id="owd44E5BD2F3F078D3F66FB8FE12300C21C" Name="printer">
|
||||
<Component Id="owcB1F9239297148807EDD6F0AD6A16F055" Guid="319838b0-55af-2be6-09e9-f97a8270196b">
|
||||
<Component Id="owcB1F9239297148807EDD6F0AD6A16F055" Guid="319838b0-55af-2be6-09e9-f97a8270196b" Win64="yes">
|
||||
<File Id="owfB1F9239297148807EDD6F0AD6A16F055" Source="$(var.SourceDir)\Assets\PrusaSlicer\printer\AnyCubic Photon Mono SE.ini" KeyPath="yes" />
|
||||
</Component>
|
||||
<Component Id="owc5438DE5556A7860A5A4B999D2C8549E6" Guid="18d012cf-f45e-421f-9e5f-f2530fd82cdf">
|
||||
<Component Id="owc67D0DCEBE8B3912065D33D90635862C5" Guid="321b01b8-d6da-009e-ab2e-a78fc841fcf7" Win64="yes">
|
||||
<File Id="owf67D0DCEBE8B3912065D33D90635862C5" Source="$(var.SourceDir)\Assets\PrusaSlicer\printer\AnyCubic Photon Mono SQ.ini" KeyPath="yes" />
|
||||
</Component>
|
||||
<Component Id="owc5438DE5556A7860A5A4B999D2C8549E6" Guid="18d012cf-f45e-421f-9e5f-f2530fd82cdf" Win64="yes">
|
||||
<File Id="owf5438DE5556A7860A5A4B999D2C8549E6" Source="$(var.SourceDir)\Assets\PrusaSlicer\printer\AnyCubic Photon Mono X.ini" KeyPath="yes" />
|
||||
</Component>
|
||||
<Component Id="owc6D301112F11F080C920F7E769AA8DAAC" Guid="1a7ba221-3475-f546-3fe9-a713f4bf856c">
|
||||
<Component Id="owc6D301112F11F080C920F7E769AA8DAAC" Guid="1a7ba221-3475-f546-3fe9-a713f4bf856c" Win64="yes">
|
||||
<File Id="owf6D301112F11F080C920F7E769AA8DAAC" Source="$(var.SourceDir)\Assets\PrusaSlicer\printer\AnyCubic Photon Mono.ini" KeyPath="yes" />
|
||||
</Component>
|
||||
<Component Id="owc2EABADD977D38E081AEBDA1E4F66ABAC" Guid="21cff034-fa0c-8768-77a8-0466b9adfa34">
|
||||
<Component Id="owc2EABADD977D38E081AEBDA1E4F66ABAC" Guid="21cff034-fa0c-8768-77a8-0466b9adfa34" Win64="yes">
|
||||
<File Id="owf2EABADD977D38E081AEBDA1E4F66ABAC" Source="$(var.SourceDir)\Assets\PrusaSlicer\printer\AnyCubic Photon S.ini" KeyPath="yes" />
|
||||
</Component>
|
||||
<Component Id="owc72EDAE2CA5207EAC641C69AFC492E534" Guid="4eadef64-b635-98bc-ce76-a48433cf88be">
|
||||
<Component Id="owcA64FD5D7EAD5BF50561391F76DD15503" Guid="922d89ca-ea1d-0d0c-27bb-a0adf6a2e9da" Win64="yes">
|
||||
<File Id="owfA64FD5D7EAD5BF50561391F76DD15503" Source="$(var.SourceDir)\Assets\PrusaSlicer\printer\AnyCubic Photon Ultra.ini" KeyPath="yes" />
|
||||
</Component>
|
||||
<Component Id="owc72EDAE2CA5207EAC641C69AFC492E534" Guid="4eadef64-b635-98bc-ce76-a48433cf88be" Win64="yes">
|
||||
<File Id="owf72EDAE2CA5207EAC641C69AFC492E534" Source="$(var.SourceDir)\Assets\PrusaSlicer\printer\AnyCubic Photon X.ini" KeyPath="yes" />
|
||||
</Component>
|
||||
<Component Id="owc52FABCDB07DFFBA3A0BA85FC86A4E849" Guid="8d9ec4f5-bf5c-b1ec-16d2-704dfcb6e5ee">
|
||||
<Component Id="owc52FABCDB07DFFBA3A0BA85FC86A4E849" Guid="8d9ec4f5-bf5c-b1ec-16d2-704dfcb6e5ee" Win64="yes">
|
||||
<File Id="owf52FABCDB07DFFBA3A0BA85FC86A4E849" Source="$(var.SourceDir)\Assets\PrusaSlicer\printer\AnyCubic Photon Zero.ini" KeyPath="yes" />
|
||||
</Component>
|
||||
<Component Id="owc1C3DE0BEF10A5791E37D4C3D97AED5E1" Guid="b1851a14-1200-d448-1acd-b229bf6ac918">
|
||||
<Component Id="owc1C3DE0BEF10A5791E37D4C3D97AED5E1" Guid="b1851a14-1200-d448-1acd-b229bf6ac918" Win64="yes">
|
||||
<File Id="owf1C3DE0BEF10A5791E37D4C3D97AED5E1" Source="$(var.SourceDir)\Assets\PrusaSlicer\printer\AnyCubic Photon.ini" KeyPath="yes" />
|
||||
</Component>
|
||||
<Component Id="owcD9B52941C3B939A8B3215DD20CF242D0" Guid="19f42433-a592-01d2-ece1-41f37945261d">
|
||||
<Component Id="owcD9B52941C3B939A8B3215DD20CF242D0" Guid="19f42433-a592-01d2-ece1-41f37945261d" Win64="yes">
|
||||
<File Id="owfD9B52941C3B939A8B3215DD20CF242D0" Source="$(var.SourceDir)\Assets\PrusaSlicer\printer\Creality HALOT-MAX CL-133.ini" KeyPath="yes" />
|
||||
</Component>
|
||||
<Component Id="owc64BDFB521E8E34CAE3547B3D1B8F3996" Guid="71d86e2a-c6b7-884a-65ff-2260e4edd56f">
|
||||
<Component Id="owc64BDFB521E8E34CAE3547B3D1B8F3996" Guid="71d86e2a-c6b7-884a-65ff-2260e4edd56f" Win64="yes">
|
||||
<File Id="owf64BDFB521E8E34CAE3547B3D1B8F3996" Source="$(var.SourceDir)\Assets\PrusaSlicer\printer\Creality HALOT-ONE CL-60.ini" KeyPath="yes" />
|
||||
</Component>
|
||||
<Component Id="owc88F58B3D3A8E53CEFC3FE84F6C20FAB8" Guid="8f66ab9b-8ff1-f324-9ec5-5cbb688dd5f6">
|
||||
<Component Id="owc88F58B3D3A8E53CEFC3FE84F6C20FAB8" Guid="8f66ab9b-8ff1-f324-9ec5-5cbb688dd5f6" Win64="yes">
|
||||
<File Id="owf88F58B3D3A8E53CEFC3FE84F6C20FAB8" Source="$(var.SourceDir)\Assets\PrusaSlicer\printer\Creality HALOT-SKY CL-89.ini" KeyPath="yes" />
|
||||
</Component>
|
||||
<Component Id="owc0402794BACCC21B2ADA93D76665B1076" Guid="f9949f30-9613-fe85-e9f8-432d4764ed1f">
|
||||
<Component Id="owc0402794BACCC21B2ADA93D76665B1076" Guid="f9949f30-9613-fe85-e9f8-432d4764ed1f" Win64="yes">
|
||||
<File Id="owf0402794BACCC21B2ADA93D76665B1076" Source="$(var.SourceDir)\Assets\PrusaSlicer\printer\Creality LD-002H.ini" KeyPath="yes" />
|
||||
</Component>
|
||||
<Component Id="owcA366EE5E18C0300113B84236C2D5827D" Guid="3c683456-5a2b-319a-ad7f-931df564c0da">
|
||||
<Component Id="owcA366EE5E18C0300113B84236C2D5827D" Guid="3c683456-5a2b-319a-ad7f-931df564c0da" Win64="yes">
|
||||
<File Id="owfA366EE5E18C0300113B84236C2D5827D" Source="$(var.SourceDir)\Assets\PrusaSlicer\printer\Creality LD-002R.ini" KeyPath="yes" />
|
||||
</Component>
|
||||
<Component Id="owc8304FE0C53C6793457DFBC941289A9EB" Guid="91d411b9-d7a0-e718-f688-83a34880ebcb">
|
||||
<Component Id="owc8304FE0C53C6793457DFBC941289A9EB" Guid="91d411b9-d7a0-e718-f688-83a34880ebcb" Win64="yes">
|
||||
<File Id="owf8304FE0C53C6793457DFBC941289A9EB" Source="$(var.SourceDir)\Assets\PrusaSlicer\printer\Creality LD-006.ini" KeyPath="yes" />
|
||||
</Component>
|
||||
<Component Id="owcAB1BB9D30236925105FC2E5CE2ED6D1A" Guid="8ba56c46-b915-5a96-dde6-e9c2084379d8">
|
||||
<Component Id="owcAB1BB9D30236925105FC2E5CE2ED6D1A" Guid="8ba56c46-b915-5a96-dde6-e9c2084379d8" Win64="yes">
|
||||
<File Id="owfAB1BB9D30236925105FC2E5CE2ED6D1A" Source="$(var.SourceDir)\Assets\PrusaSlicer\printer\Elegoo Mars 2 Pro.ini" KeyPath="yes" />
|
||||
</Component>
|
||||
<Component Id="owc99BA1976940D6CE22287790F6985BB6A" Guid="ce2d1d6b-39d2-a53b-8702-6412a7c5afc0">
|
||||
<Component Id="owc99BA1976940D6CE22287790F6985BB6A" Guid="ce2d1d6b-39d2-a53b-8702-6412a7c5afc0" Win64="yes">
|
||||
<File Id="owf99BA1976940D6CE22287790F6985BB6A" Source="$(var.SourceDir)\Assets\PrusaSlicer\printer\Elegoo Mars C.ini" KeyPath="yes" />
|
||||
</Component>
|
||||
<Component Id="owc0E234E55CBA190E83DA52025540F8A3D" Guid="b1a97eca-4b0e-9d3f-f196-ea03f123fc3d">
|
||||
<Component Id="owc0E234E55CBA190E83DA52025540F8A3D" Guid="b1a97eca-4b0e-9d3f-f196-ea03f123fc3d" Win64="yes">
|
||||
<File Id="owf0E234E55CBA190E83DA52025540F8A3D" Source="$(var.SourceDir)\Assets\PrusaSlicer\printer\Elegoo Mars.ini" KeyPath="yes" />
|
||||
</Component>
|
||||
<Component Id="owc87C1B7E42025B6AC6C87D1D36775BBDE" Guid="b9b191bf-dadb-4140-1220-41a04f4cbc28">
|
||||
<Component Id="owc87C1B7E42025B6AC6C87D1D36775BBDE" Guid="b9b191bf-dadb-4140-1220-41a04f4cbc28" Win64="yes">
|
||||
<File Id="owf87C1B7E42025B6AC6C87D1D36775BBDE" Source="$(var.SourceDir)\Assets\PrusaSlicer\printer\Elegoo Saturn.ini" KeyPath="yes" />
|
||||
</Component>
|
||||
<Component Id="owc4C4D2614316012195906A5E4914A2378" Guid="47ad31b3-87d5-b2bb-ba98-e95100744f0b">
|
||||
<Component Id="owc4C4D2614316012195906A5E4914A2378" Guid="47ad31b3-87d5-b2bb-ba98-e95100744f0b" Win64="yes">
|
||||
<File Id="owf4C4D2614316012195906A5E4914A2378" Source="$(var.SourceDir)\Assets\PrusaSlicer\printer\EPAX E10 Mono.ini" KeyPath="yes" />
|
||||
</Component>
|
||||
<Component Id="owc34F4D06FF0857772BE25072A0237697F" Guid="5cba601d-e3b6-39ac-bd29-0dea035b868f">
|
||||
<Component Id="owc34F4D06FF0857772BE25072A0237697F" Guid="5cba601d-e3b6-39ac-bd29-0dea035b868f" Win64="yes">
|
||||
<File Id="owf34F4D06FF0857772BE25072A0237697F" Source="$(var.SourceDir)\Assets\PrusaSlicer\printer\EPAX E6 Mono.ini" KeyPath="yes" />
|
||||
</Component>
|
||||
<Component Id="owc0706B6998D6F521C34E62ABB5D993AB8" Guid="8d4ca610-f357-9fcb-8fca-2c08cc940e8e">
|
||||
<Component Id="owc0706B6998D6F521C34E62ABB5D993AB8" Guid="8d4ca610-f357-9fcb-8fca-2c08cc940e8e" Win64="yes">
|
||||
<File Id="owf0706B6998D6F521C34E62ABB5D993AB8" Source="$(var.SourceDir)\Assets\PrusaSlicer\printer\EPAX X1.ini" KeyPath="yes" />
|
||||
</Component>
|
||||
<Component Id="owc6CD1D731C774A9FC303E119C78FDD2CD" Guid="e75de2d4-c7e2-71ee-338a-0ffcc7da4607">
|
||||
<Component Id="owc6CD1D731C774A9FC303E119C78FDD2CD" Guid="e75de2d4-c7e2-71ee-338a-0ffcc7da4607" Win64="yes">
|
||||
<File Id="owf6CD1D731C774A9FC303E119C78FDD2CD" Source="$(var.SourceDir)\Assets\PrusaSlicer\printer\EPAX X10 4K Mono.ini" KeyPath="yes" />
|
||||
</Component>
|
||||
<Component Id="owcAAF100D9FA50AAFA27C478251BD36C84" Guid="5e816d43-7553-1fe3-d9f9-d1bb491c0c89">
|
||||
<Component Id="owcAAF100D9FA50AAFA27C478251BD36C84" Guid="5e816d43-7553-1fe3-d9f9-d1bb491c0c89" Win64="yes">
|
||||
<File Id="owfAAF100D9FA50AAFA27C478251BD36C84" Source="$(var.SourceDir)\Assets\PrusaSlicer\printer\EPAX X10.ini" KeyPath="yes" />
|
||||
</Component>
|
||||
<Component Id="owcEBD7F25427880807A3B22D07EFDFE10A" Guid="ca8ac24d-39e2-79bb-d596-207c58c8b996">
|
||||
<Component Id="owcEBD7F25427880807A3B22D07EFDFE10A" Guid="ca8ac24d-39e2-79bb-d596-207c58c8b996" Win64="yes">
|
||||
<File Id="owfEBD7F25427880807A3B22D07EFDFE10A" Source="$(var.SourceDir)\Assets\PrusaSlicer\printer\EPAX X133 4K Mono.ini" KeyPath="yes" />
|
||||
</Component>
|
||||
<Component Id="owcABD51FD4BD0E86B40C3E60EF1FFF2652" Guid="63b5c52b-f496-6709-076f-593ba96acde3">
|
||||
<Component Id="owcABD51FD4BD0E86B40C3E60EF1FFF2652" Guid="63b5c52b-f496-6709-076f-593ba96acde3" Win64="yes">
|
||||
<File Id="owfABD51FD4BD0E86B40C3E60EF1FFF2652" Source="$(var.SourceDir)\Assets\PrusaSlicer\printer\EPAX X156 4K Color.ini" KeyPath="yes" />
|
||||
</Component>
|
||||
<Component Id="owcF60AE43E2FCAA44993EA41F9AAF52544" Guid="2a01f334-9752-ff6c-f433-5906b10abdd0">
|
||||
<Component Id="owcF60AE43E2FCAA44993EA41F9AAF52544" Guid="2a01f334-9752-ff6c-f433-5906b10abdd0" Win64="yes">
|
||||
<File Id="owfF60AE43E2FCAA44993EA41F9AAF52544" Source="$(var.SourceDir)\Assets\PrusaSlicer\printer\EPAX X1K 2K Mono.ini" KeyPath="yes" />
|
||||
</Component>
|
||||
<Component Id="owcC00A40A7EB735EEF0CDE42F7CB633263" Guid="f1e176aa-405d-b293-f693-46886a0cda3e">
|
||||
<Component Id="owcEF8BD2356BD06AA244EA107DE9D5FB7C" Guid="0a7bd249-ec9c-6cd9-6d01-7cb83be92f49" Win64="yes">
|
||||
<File Id="owfEF8BD2356BD06AA244EA107DE9D5FB7C" Source="$(var.SourceDir)\Assets\PrusaSlicer\printer\FlashForge Explorer MAX.ini" KeyPath="yes" />
|
||||
</Component>
|
||||
<Component Id="owcCAAA2D69B75A2B0629D60B64711DF959" Guid="f91c305e-8951-0bc4-866e-5cc0c5779184" Win64="yes">
|
||||
<File Id="owfCAAA2D69B75A2B0629D60B64711DF959" Source="$(var.SourceDir)\Assets\PrusaSlicer\printer\FlashForge Focus 13.3.ini" KeyPath="yes" />
|
||||
</Component>
|
||||
<Component Id="owcF34A5CF1DA6FEE69E4B43AF6D37C83F2" Guid="dac273d1-8130-b1f1-3bcb-9dacb58d2771" Win64="yes">
|
||||
<File Id="owfF34A5CF1DA6FEE69E4B43AF6D37C83F2" Source="$(var.SourceDir)\Assets\PrusaSlicer\printer\FlashForge Focus 8.9.ini" KeyPath="yes" />
|
||||
</Component>
|
||||
<Component Id="owc61913D8BD21FFEEA0D00630647648655" Guid="a6fa37c1-ce4c-5021-d63d-9e24be5b2761" Win64="yes">
|
||||
<File Id="owf61913D8BD21FFEEA0D00630647648655" Source="$(var.SourceDir)\Assets\PrusaSlicer\printer\FlashForge Foto 13.3.ini" KeyPath="yes" />
|
||||
</Component>
|
||||
<Component Id="owc3301611D5674767924C4BE1087CAF1AC" Guid="331d0c79-c84e-c635-5fc3-f98577aa86bb" Win64="yes">
|
||||
<File Id="owf3301611D5674767924C4BE1087CAF1AC" Source="$(var.SourceDir)\Assets\PrusaSlicer\printer\FlashForge Foto 6.0.ini" KeyPath="yes" />
|
||||
</Component>
|
||||
<Component Id="owc5AF5BE9835C2474140785D99DEA9D986" Guid="73479a36-a961-0be2-aa1e-28d0c7980f71" Win64="yes">
|
||||
<File Id="owf5AF5BE9835C2474140785D99DEA9D986" Source="$(var.SourceDir)\Assets\PrusaSlicer\printer\FlashForge Foto 8.9.ini" KeyPath="yes" />
|
||||
</Component>
|
||||
<Component Id="owc9876364C59233BDE29C2D64C8A8664E5" Guid="8c94b7f9-1fdb-2236-a8e6-c1d4c73957f6" Win64="yes">
|
||||
<File Id="owf9876364C59233BDE29C2D64C8A8664E5" Source="$(var.SourceDir)\Assets\PrusaSlicer\printer\FlashForge Hunter.ini" KeyPath="yes" />
|
||||
</Component>
|
||||
<Component Id="owcC00A40A7EB735EEF0CDE42F7CB633263" Guid="f1e176aa-405d-b293-f693-46886a0cda3e" Win64="yes">
|
||||
<File Id="owfC00A40A7EB735EEF0CDE42F7CB633263" Source="$(var.SourceDir)\Assets\PrusaSlicer\printer\Kelant S400.ini" KeyPath="yes" />
|
||||
</Component>
|
||||
<Component Id="owc7B488E0A9D9B2656D06620E0CEEFDA13" Guid="7c2fe9e4-adb9-72d1-c0f4-ee7311cabadf">
|
||||
<Component Id="owc7B488E0A9D9B2656D06620E0CEEFDA13" Guid="7c2fe9e4-adb9-72d1-c0f4-ee7311cabadf" Win64="yes">
|
||||
<File Id="owf7B488E0A9D9B2656D06620E0CEEFDA13" Source="$(var.SourceDir)\Assets\PrusaSlicer\printer\Longer Orange 10.ini" KeyPath="yes" />
|
||||
</Component>
|
||||
<Component Id="owc81404C7F01EDBA07B087B424DAA40376" Guid="aaee9d27-478d-5d85-c09b-e2b2c8f61633">
|
||||
<Component Id="owc81404C7F01EDBA07B087B424DAA40376" Guid="aaee9d27-478d-5d85-c09b-e2b2c8f61633" Win64="yes">
|
||||
<File Id="owf81404C7F01EDBA07B087B424DAA40376" Source="$(var.SourceDir)\Assets\PrusaSlicer\printer\Longer Orange 120.ini" KeyPath="yes" />
|
||||
</Component>
|
||||
<Component Id="owc227006E17D85BD8103B64C6480AF8A6F" Guid="33dff0a8-a2a6-7ad5-51b1-a91bc258b227">
|
||||
<Component Id="owc227006E17D85BD8103B64C6480AF8A6F" Guid="33dff0a8-a2a6-7ad5-51b1-a91bc258b227" Win64="yes">
|
||||
<File Id="owf227006E17D85BD8103B64C6480AF8A6F" Source="$(var.SourceDir)\Assets\PrusaSlicer\printer\Longer Orange 30.ini" KeyPath="yes" />
|
||||
</Component>
|
||||
<Component Id="owc6FE42BDB3CE927703AA1E9971366D810" Guid="b3fd97c9-d3b8-b5db-942f-f7ab9d2195e5">
|
||||
<Component Id="owc6FE42BDB3CE927703AA1E9971366D810" Guid="b3fd97c9-d3b8-b5db-942f-f7ab9d2195e5" Win64="yes">
|
||||
<File Id="owf6FE42BDB3CE927703AA1E9971366D810" Source="$(var.SourceDir)\Assets\PrusaSlicer\printer\Longer Orange 4K.ini" KeyPath="yes" />
|
||||
</Component>
|
||||
<Component Id="owc60E90B40E8992C21339B84C28DFE9891" Guid="e8e24d92-2cb1-0bec-3963-817532a4c171">
|
||||
<Component Id="owc60E90B40E8992C21339B84C28DFE9891" Guid="e8e24d92-2cb1-0bec-3963-817532a4c171" Win64="yes">
|
||||
<File Id="owf60E90B40E8992C21339B84C28DFE9891" Source="$(var.SourceDir)\Assets\PrusaSlicer\printer\Nova3D Bene4 Mono.ini" KeyPath="yes" />
|
||||
</Component>
|
||||
<Component Id="owcC502436F48FF41D38156813AD32AAC8D" Guid="89478893-b2a3-a64b-c27a-0d99e3dce4d8">
|
||||
<Component Id="owcC502436F48FF41D38156813AD32AAC8D" Guid="89478893-b2a3-a64b-c27a-0d99e3dce4d8" Win64="yes">
|
||||
<File Id="owfC502436F48FF41D38156813AD32AAC8D" Source="$(var.SourceDir)\Assets\PrusaSlicer\printer\Nova3D Bene4.ini" KeyPath="yes" />
|
||||
</Component>
|
||||
<Component Id="owc99B5CFB726FA398251B212CEECF36083" Guid="f94cafa3-bc47-9bc0-350b-5eeb40679c36">
|
||||
<Component Id="owc99B5CFB726FA398251B212CEECF36083" Guid="f94cafa3-bc47-9bc0-350b-5eeb40679c36" Win64="yes">
|
||||
<File Id="owf99B5CFB726FA398251B212CEECF36083" Source="$(var.SourceDir)\Assets\PrusaSlicer\printer\Nova3D Bene5.ini" KeyPath="yes" />
|
||||
</Component>
|
||||
<Component Id="owc2D13CB27790279041B7046CCA000768B" Guid="c27b7fdd-753f-0d08-6310-6ecef6ae4fa4">
|
||||
<Component Id="owc2D13CB27790279041B7046CCA000768B" Guid="c27b7fdd-753f-0d08-6310-6ecef6ae4fa4" Win64="yes">
|
||||
<File Id="owf2D13CB27790279041B7046CCA000768B" Source="$(var.SourceDir)\Assets\PrusaSlicer\printer\Nova3D Elfin.ini" KeyPath="yes" />
|
||||
</Component>
|
||||
<Component Id="owc5012419DCAC6A0DF4B7E37C7691031EB" Guid="ddeea951-7f98-641a-9af5-fc8371c1aef0">
|
||||
<Component Id="owc5012419DCAC6A0DF4B7E37C7691031EB" Guid="ddeea951-7f98-641a-9af5-fc8371c1aef0" Win64="yes">
|
||||
<File Id="owf5012419DCAC6A0DF4B7E37C7691031EB" Source="$(var.SourceDir)\Assets\PrusaSlicer\printer\Nova3D Elfin2 Mono SE.ini" KeyPath="yes" />
|
||||
</Component>
|
||||
<Component Id="owc25A67BA4D2E63BC50D256F00A5E60BA2" Guid="8158f079-73e1-238f-4b6b-fcee7f48c8ce">
|
||||
<Component Id="owc25A67BA4D2E63BC50D256F00A5E60BA2" Guid="8158f079-73e1-238f-4b6b-fcee7f48c8ce" Win64="yes">
|
||||
<File Id="owf25A67BA4D2E63BC50D256F00A5E60BA2" Source="$(var.SourceDir)\Assets\PrusaSlicer\printer\Nova3D Elfin2.ini" KeyPath="yes" />
|
||||
</Component>
|
||||
<Component Id="owcAAD60F81138D7049AF41740104BCAB41" Guid="090fee7f-9e2b-d016-c83b-7b98e33999b5">
|
||||
<Component Id="owcAAD60F81138D7049AF41740104BCAB41" Guid="090fee7f-9e2b-d016-c83b-7b98e33999b5" Win64="yes">
|
||||
<File Id="owfAAD60F81138D7049AF41740104BCAB41" Source="$(var.SourceDir)\Assets\PrusaSlicer\printer\Nova3D Elfin3 Mini.ini" KeyPath="yes" />
|
||||
</Component>
|
||||
<Component Id="owcA250307D58F323E1C6DC46EA020395EE" Guid="c83aaa8a-e13b-ac0e-7640-4d50b88a60ef">
|
||||
<Component Id="owcA250307D58F323E1C6DC46EA020395EE" Guid="c83aaa8a-e13b-ac0e-7640-4d50b88a60ef" Win64="yes">
|
||||
<File Id="owfA250307D58F323E1C6DC46EA020395EE" Source="$(var.SourceDir)\Assets\PrusaSlicer\printer\Nova3D Whale.ini" KeyPath="yes" />
|
||||
</Component>
|
||||
<Component Id="owcDCAE3DE6C60367FB788A82F49EEE1A5A" Guid="c3be403f-2f35-cbf7-d36c-948f227dce15">
|
||||
<Component Id="owcDCAE3DE6C60367FB788A82F49EEE1A5A" Guid="c3be403f-2f35-cbf7-d36c-948f227dce15" Win64="yes">
|
||||
<File Id="owfDCAE3DE6C60367FB788A82F49EEE1A5A" Source="$(var.SourceDir)\Assets\PrusaSlicer\printer\Nova3D Whale2.ini" KeyPath="yes" />
|
||||
</Component>
|
||||
<Component Id="owc66B3B56E9ED020CAA7BBA3FAC953C136" Guid="cffd69b2-fd9b-7837-4f02-4bf3f71ec59f">
|
||||
<Component Id="owc66B3B56E9ED020CAA7BBA3FAC953C136" Guid="cffd69b2-fd9b-7837-4f02-4bf3f71ec59f" Win64="yes">
|
||||
<File Id="owf66B3B56E9ED020CAA7BBA3FAC953C136" Source="$(var.SourceDir)\Assets\PrusaSlicer\printer\Peopoly Phenom L.ini" KeyPath="yes" />
|
||||
</Component>
|
||||
<Component Id="owc13438B96466244BCB8EEF225433BC787" Guid="99b981b3-c851-900a-abaa-a18535df5331">
|
||||
<Component Id="owc13438B96466244BCB8EEF225433BC787" Guid="99b981b3-c851-900a-abaa-a18535df5331" Win64="yes">
|
||||
<File Id="owf13438B96466244BCB8EEF225433BC787" Source="$(var.SourceDir)\Assets\PrusaSlicer\printer\Peopoly Phenom Noir.ini" KeyPath="yes" />
|
||||
</Component>
|
||||
<Component Id="owc1FC1979B98DE233286C3B4804929A5FC" Guid="1ca2aa61-eb0a-2449-1c6f-07fa9749bce8">
|
||||
<Component Id="owc1FC1979B98DE233286C3B4804929A5FC" Guid="1ca2aa61-eb0a-2449-1c6f-07fa9749bce8" Win64="yes">
|
||||
<File Id="owf1FC1979B98DE233286C3B4804929A5FC" Source="$(var.SourceDir)\Assets\PrusaSlicer\printer\Peopoly Phenom XXL.ini" KeyPath="yes" />
|
||||
</Component>
|
||||
<Component Id="owcA1B48C5E1FE8B630F74308849833290E" Guid="4d77c8e5-87d3-b989-e9ea-e5500471a42b">
|
||||
<Component Id="owcA1B48C5E1FE8B630F74308849833290E" Guid="4d77c8e5-87d3-b989-e9ea-e5500471a42b" Win64="yes">
|
||||
<File Id="owfA1B48C5E1FE8B630F74308849833290E" Source="$(var.SourceDir)\Assets\PrusaSlicer\printer\Peopoly Phenom.ini" KeyPath="yes" />
|
||||
</Component>
|
||||
<Component Id="owc15A71F3BB1B2AEB10916D29E37F38D12" Guid="e0fb086d-6925-6100-dc4c-39a463226be2">
|
||||
<Component Id="owc15A71F3BB1B2AEB10916D29E37F38D12" Guid="e0fb086d-6925-6100-dc4c-39a463226be2" Win64="yes">
|
||||
<File Id="owf15A71F3BB1B2AEB10916D29E37F38D12" Source="$(var.SourceDir)\Assets\PrusaSlicer\printer\Phrozen Shuffle 16.ini" KeyPath="yes" />
|
||||
</Component>
|
||||
<Component Id="owcE8409009BD6763D828E850D38FA8BD82" Guid="2382b129-458a-d22d-da5e-184f4acca3dd">
|
||||
<Component Id="owcE8409009BD6763D828E850D38FA8BD82" Guid="2382b129-458a-d22d-da5e-184f4acca3dd" Win64="yes">
|
||||
<File Id="owfE8409009BD6763D828E850D38FA8BD82" Source="$(var.SourceDir)\Assets\PrusaSlicer\printer\Phrozen Shuffle 4K.ini" KeyPath="yes" />
|
||||
</Component>
|
||||
<Component Id="owc11A60D48E52212F18E2C477C8578E239" Guid="256837b3-d391-abbd-5adf-21f67c78aefa">
|
||||
<Component Id="owc11A60D48E52212F18E2C477C8578E239" Guid="256837b3-d391-abbd-5adf-21f67c78aefa" Win64="yes">
|
||||
<File Id="owf11A60D48E52212F18E2C477C8578E239" Source="$(var.SourceDir)\Assets\PrusaSlicer\printer\Phrozen Shuffle Lite.ini" KeyPath="yes" />
|
||||
</Component>
|
||||
<Component Id="owcC03ED35E13CDFC9FBEB4F599236CB5FD" Guid="04521b5a-c5d5-f767-819b-af64f8e04110">
|
||||
<Component Id="owcC03ED35E13CDFC9FBEB4F599236CB5FD" Guid="04521b5a-c5d5-f767-819b-af64f8e04110" Win64="yes">
|
||||
<File Id="owfC03ED35E13CDFC9FBEB4F599236CB5FD" Source="$(var.SourceDir)\Assets\PrusaSlicer\printer\Phrozen Shuffle XL Lite.ini" KeyPath="yes" />
|
||||
</Component>
|
||||
<Component Id="owcCD40C11D90FC0E69173DC0CA0331A4F7" Guid="b319eb54-612a-50cd-c1ac-0fb29a76ccc0">
|
||||
<Component Id="owcCD40C11D90FC0E69173DC0CA0331A4F7" Guid="b319eb54-612a-50cd-c1ac-0fb29a76ccc0" Win64="yes">
|
||||
<File Id="owfCD40C11D90FC0E69173DC0CA0331A4F7" Source="$(var.SourceDir)\Assets\PrusaSlicer\printer\Phrozen Shuffle XL.ini" KeyPath="yes" />
|
||||
</Component>
|
||||
<Component Id="owc24E8828277D098684F005D40D8EE197A" Guid="8102e631-084a-0997-df55-0a1ba6683205">
|
||||
<Component Id="owc24E8828277D098684F005D40D8EE197A" Guid="8102e631-084a-0997-df55-0a1ba6683205" Win64="yes">
|
||||
<File Id="owf24E8828277D098684F005D40D8EE197A" Source="$(var.SourceDir)\Assets\PrusaSlicer\printer\Phrozen Shuffle.ini" KeyPath="yes" />
|
||||
</Component>
|
||||
<Component Id="owcD15E0DC3059CA06E77AAFA92F637FC45" Guid="2445b075-6cd5-7cac-0619-61929f0bbf89">
|
||||
<Component Id="owcD15E0DC3059CA06E77AAFA92F637FC45" Guid="2445b075-6cd5-7cac-0619-61929f0bbf89" Win64="yes">
|
||||
<File Id="owfD15E0DC3059CA06E77AAFA92F637FC45" Source="$(var.SourceDir)\Assets\PrusaSlicer\printer\Phrozen Sonic 4K.ini" KeyPath="yes" />
|
||||
</Component>
|
||||
<Component Id="owc36D6BBE9B18A4A65DFD3D79CF21B429B" Guid="2596c453-e070-b45d-df5c-9669e1a8c625">
|
||||
<Component Id="owc36D6BBE9B18A4A65DFD3D79CF21B429B" Guid="2596c453-e070-b45d-df5c-9669e1a8c625" Win64="yes">
|
||||
<File Id="owf36D6BBE9B18A4A65DFD3D79CF21B429B" Source="$(var.SourceDir)\Assets\PrusaSlicer\printer\Phrozen Sonic Mighty 4K.ini" KeyPath="yes" />
|
||||
</Component>
|
||||
<Component Id="owc89B07C29965B83AB351559075302123F" Guid="678cf4a8-183b-35b9-47fa-ab71d6ec8723">
|
||||
<Component Id="owc89B07C29965B83AB351559075302123F" Guid="678cf4a8-183b-35b9-47fa-ab71d6ec8723" Win64="yes">
|
||||
<File Id="owf89B07C29965B83AB351559075302123F" Source="$(var.SourceDir)\Assets\PrusaSlicer\printer\Phrozen Sonic Mini 4K.ini" KeyPath="yes" />
|
||||
</Component>
|
||||
<Component Id="owc62BB0F9A288719E16F573299E1D996F7" Guid="f1f6e606-dfa0-07b5-2cae-26f89b424056">
|
||||
<Component Id="owc62BB0F9A288719E16F573299E1D996F7" Guid="f1f6e606-dfa0-07b5-2cae-26f89b424056" Win64="yes">
|
||||
<File Id="owf62BB0F9A288719E16F573299E1D996F7" Source="$(var.SourceDir)\Assets\PrusaSlicer\printer\Phrozen Sonic Mini.ini" KeyPath="yes" />
|
||||
</Component>
|
||||
<Component Id="owc51A8602AF8B1F794D75D755035BCA481" Guid="c6a1905b-627c-c872-cf21-d2b69c84db8d">
|
||||
<Component Id="owc51A8602AF8B1F794D75D755035BCA481" Guid="c6a1905b-627c-c872-cf21-d2b69c84db8d" Win64="yes">
|
||||
<File Id="owf51A8602AF8B1F794D75D755035BCA481" Source="$(var.SourceDir)\Assets\PrusaSlicer\printer\Phrozen Sonic.ini" KeyPath="yes" />
|
||||
</Component>
|
||||
<Component Id="owcFE299618D4ED99513A75713869AEB4B2" Guid="7e76d3e8-e561-5fcc-e266-d43e670840c2">
|
||||
<Component Id="owcFE299618D4ED99513A75713869AEB4B2" Guid="7e76d3e8-e561-5fcc-e266-d43e670840c2" Win64="yes">
|
||||
<File Id="owfFE299618D4ED99513A75713869AEB4B2" Source="$(var.SourceDir)\Assets\PrusaSlicer\printer\Phrozen Transform.ini" KeyPath="yes" />
|
||||
</Component>
|
||||
<Component Id="owc06E606590D5C2186D26EF1DDD7A361B7" Guid="578ba680-240d-d850-8372-b8c261fbe053">
|
||||
<Component Id="owc06E606590D5C2186D26EF1DDD7A361B7" Guid="578ba680-240d-d850-8372-b8c261fbe053" Win64="yes">
|
||||
<File Id="owf06E606590D5C2186D26EF1DDD7A361B7" Source="$(var.SourceDir)\Assets\PrusaSlicer\printer\QIDI I-Box Mono.ini" KeyPath="yes" />
|
||||
</Component>
|
||||
<Component Id="owcACB41397AF3AAB714FF18711FC3D3D1B" Guid="a47810c7-ddf5-3a76-3113-c0cdab0551bf">
|
||||
<Component Id="owcACB41397AF3AAB714FF18711FC3D3D1B" Guid="a47810c7-ddf5-3a76-3113-c0cdab0551bf" Win64="yes">
|
||||
<File Id="owfACB41397AF3AAB714FF18711FC3D3D1B" Source="$(var.SourceDir)\Assets\PrusaSlicer\printer\QIDI S-Box.ini" KeyPath="yes" />
|
||||
</Component>
|
||||
<Component Id="owcF5CA849F66CC478E38B67212127BE7A2" Guid="cdecb062-fe09-44e6-db2d-a4b81fcf4c73">
|
||||
<Component Id="owcF5CA849F66CC478E38B67212127BE7A2" Guid="cdecb062-fe09-44e6-db2d-a4b81fcf4c73" Win64="yes">
|
||||
<File Id="owfF5CA849F66CC478E38B67212127BE7A2" Source="$(var.SourceDir)\Assets\PrusaSlicer\printer\QIDI Shadow5.5.ini" KeyPath="yes" />
|
||||
</Component>
|
||||
<Component Id="owc696F0AF8084A6AA7624CA0947E245A47" Guid="6aa7d092-d68b-a44d-f2c7-0a590404b19f">
|
||||
<Component Id="owc696F0AF8084A6AA7624CA0947E245A47" Guid="6aa7d092-d68b-a44d-f2c7-0a590404b19f" Win64="yes">
|
||||
<File Id="owf696F0AF8084A6AA7624CA0947E245A47" Source="$(var.SourceDir)\Assets\PrusaSlicer\printer\QIDI Shadow6.0 Pro.ini" KeyPath="yes" />
|
||||
</Component>
|
||||
<Component Id="owc58F08D198616611A088F5E8CA9BAB684" Guid="f0f9d4c3-c4d4-ab8b-ff79-f93dc13fbbbb">
|
||||
<Component Id="owc58F08D198616611A088F5E8CA9BAB684" Guid="f0f9d4c3-c4d4-ab8b-ff79-f93dc13fbbbb" Win64="yes">
|
||||
<File Id="owf58F08D198616611A088F5E8CA9BAB684" Source="$(var.SourceDir)\Assets\PrusaSlicer\printer\Uniz IBEE.ini" KeyPath="yes" />
|
||||
</Component>
|
||||
<Component Id="owcD0FD9259BE924EB58AE9F7A85AE0A9E8" Guid="360b089c-8765-92db-0c8f-367d80202d8f">
|
||||
<Component Id="owcD0FD9259BE924EB58AE9F7A85AE0A9E8" Guid="360b089c-8765-92db-0c8f-367d80202d8f" Win64="yes">
|
||||
<File Id="owfD0FD9259BE924EB58AE9F7A85AE0A9E8" Source="$(var.SourceDir)\Assets\PrusaSlicer\printer\UVtools Prusa SL1.ini" KeyPath="yes" />
|
||||
</Component>
|
||||
<Component Id="owc92527EBFC9C5B568C8D66A882C08D0B5" Guid="dcca948b-ff91-af94-7363-d77b50dde1a5">
|
||||
<Component Id="owc92527EBFC9C5B568C8D66A882C08D0B5" Guid="dcca948b-ff91-af94-7363-d77b50dde1a5" Win64="yes">
|
||||
<File Id="owf92527EBFC9C5B568C8D66A882C08D0B5" Source="$(var.SourceDir)\Assets\PrusaSlicer\printer\UVtools Prusa SL1S SPEED.ini" KeyPath="yes" />
|
||||
</Component>
|
||||
<Component Id="owc2D767EDC65A9490BE5587F5807220F67" Guid="1b34ea21-cadd-c887-3f4e-8655903ef11a">
|
||||
<Component Id="owc2D767EDC65A9490BE5587F5807220F67" Guid="1b34ea21-cadd-c887-3f4e-8655903ef11a" Win64="yes">
|
||||
<File Id="owf2D767EDC65A9490BE5587F5807220F67" Source="$(var.SourceDir)\Assets\PrusaSlicer\printer\Voxelab Ceres 8.9.ini" KeyPath="yes" />
|
||||
</Component>
|
||||
<Component Id="owc90539A9197EF7BEC5C7BE8507C05CAB3" Guid="9dc6bfc4-de9d-312e-d562-bf3574c4f527">
|
||||
<Component Id="owc90539A9197EF7BEC5C7BE8507C05CAB3" Guid="9dc6bfc4-de9d-312e-d562-bf3574c4f527" Win64="yes">
|
||||
<File Id="owf90539A9197EF7BEC5C7BE8507C05CAB3" Source="$(var.SourceDir)\Assets\PrusaSlicer\printer\Voxelab Polaris 5.5.ini" KeyPath="yes" />
|
||||
</Component>
|
||||
<Component Id="owc1F3FB53972C06D8DF37D9F829AC83D16" Guid="d245e99b-d664-d9f6-351f-d8cf26532427">
|
||||
<Component Id="owc1F3FB53972C06D8DF37D9F829AC83D16" Guid="d245e99b-d664-d9f6-351f-d8cf26532427" Win64="yes">
|
||||
<File Id="owf1F3FB53972C06D8DF37D9F829AC83D16" Source="$(var.SourceDir)\Assets\PrusaSlicer\printer\Voxelab Proxima 6.ini" KeyPath="yes" />
|
||||
</Component>
|
||||
<Component Id="owc7C7E45D1C452D2676768409E4CA9CC60" Guid="860c70fe-c0a8-cd0a-e957-f1a6a9430509">
|
||||
<Component Id="owc7C7E45D1C452D2676768409E4CA9CC60" Guid="860c70fe-c0a8-cd0a-e957-f1a6a9430509" Win64="yes">
|
||||
<File Id="owf7C7E45D1C452D2676768409E4CA9CC60" Source="$(var.SourceDir)\Assets\PrusaSlicer\printer\Wanhao CGR Mini Mono.ini" KeyPath="yes" />
|
||||
</Component>
|
||||
<Component Id="owcF9E5AF8C32ABDFCF9A192B1CDDF75FE7" Guid="bc420f43-9332-7e19-13d8-1704b3931172">
|
||||
<Component Id="owcF9E5AF8C32ABDFCF9A192B1CDDF75FE7" Guid="bc420f43-9332-7e19-13d8-1704b3931172" Win64="yes">
|
||||
<File Id="owfF9E5AF8C32ABDFCF9A192B1CDDF75FE7" Source="$(var.SourceDir)\Assets\PrusaSlicer\printer\Wanhao CGR Mono.ini" KeyPath="yes" />
|
||||
</Component>
|
||||
<Component Id="owcADA4A8BCF46DF0463053836AF5844507" Guid="a0052256-a256-d7c2-e8ab-fa76b6405a56">
|
||||
<Component Id="owcADA4A8BCF46DF0463053836AF5844507" Guid="a0052256-a256-d7c2-e8ab-fa76b6405a56" Win64="yes">
|
||||
<File Id="owfADA4A8BCF46DF0463053836AF5844507" Source="$(var.SourceDir)\Assets\PrusaSlicer\printer\Wanhao D7.ini" KeyPath="yes" />
|
||||
</Component>
|
||||
<Component Id="owcA5775C19FF4675471A8C0D8A95A8FD99" Guid="61438068-0851-2e9b-2d6a-49cf5d31931f">
|
||||
<Component Id="owcA5775C19FF4675471A8C0D8A95A8FD99" Guid="61438068-0851-2e9b-2d6a-49cf5d31931f" Win64="yes">
|
||||
<File Id="owfA5775C19FF4675471A8C0D8A95A8FD99" Source="$(var.SourceDir)\Assets\PrusaSlicer\printer\Wanhao D8.ini" KeyPath="yes" />
|
||||
</Component>
|
||||
<Component Id="owc5A0969A08E1AC292A7F06D07A9C219FC" Guid="c767b03e-f767-4482-621d-04b79c6735f9">
|
||||
<Component Id="owc5A0969A08E1AC292A7F06D07A9C219FC" Guid="c767b03e-f767-4482-621d-04b79c6735f9" Win64="yes">
|
||||
<File Id="owf5A0969A08E1AC292A7F06D07A9C219FC" Source="$(var.SourceDir)\Assets\PrusaSlicer\printer\Zortrax Inkspire.ini" KeyPath="yes" />
|
||||
</Component>
|
||||
</Directory>
|
||||
|
||||
@@ -141,7 +141,7 @@ namespace UVtools.WPF
|
||||
return true;
|
||||
}
|
||||
|
||||
if (args[0] is "--crypt-ctb" or "--encrypt-ctb" or "--decrypt-ctb")
|
||||
if (args[0] == "--crypt-ctb")
|
||||
{
|
||||
if (!File.Exists(args[1]))
|
||||
{
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
using System.Diagnostics;
|
||||
using System.Threading.Tasks;
|
||||
using System.Threading.Tasks;
|
||||
using Avalonia.Markup.Xaml;
|
||||
using UVtools.Core.Objects;
|
||||
using UVtools.Core.Operations;
|
||||
|
||||
@@ -137,14 +137,23 @@
|
||||
Grid.ColumnSpan="9"
|
||||
VerticalAlignment="Center"
|
||||
Orientation="Horizontal" Spacing="5">
|
||||
|
||||
<Button
|
||||
Command="{Binding PresetElephantFootCompensation}"
|
||||
ToolTip.Tip="This preset will dim/darken wall pixels at a given thickness and brightness.
|
||||

After pick the best looking model from the calibration test, fill the value/brightness with (B) and wall thickness with (W) found on the model."
|
||||
Content="Elephant foot compensation"/>
|
||||
|
||||
<Button
|
||||
Command="{Binding Operation.PresetPixelDimming}"
|
||||
ToolTip.Tip="This preset will dim/darken pixels with a pattern, on the pattern put the brightness values you want to subtract to each pixel"
|
||||
Content="Pixel dimming"/>
|
||||
|
||||
<Button
|
||||
Command="{Binding Operation.PresetPixelLightening}"
|
||||
ToolTip.Tip="This preset will lightening pixels with a pattern, on the pattern put the brightness values you want to add to each pixel"
|
||||
Content="Pixel lightening"/>
|
||||
|
||||
|
||||
<Button
|
||||
Command="{Binding Operation.PresetStripAntiAliasing}"
|
||||
Content="Strip anti-aliasing"/>
|
||||
|
||||
@@ -21,6 +21,12 @@ namespace UVtools.WPF.Controls.Tools
|
||||
AvaloniaXamlLoader.Load(this);
|
||||
}
|
||||
|
||||
public void PresetElephantFootCompensation()
|
||||
{
|
||||
ParentWindow.SelectBottomLayers();
|
||||
Operation.PresetElephantFootCompensation();
|
||||
}
|
||||
|
||||
public async void LoadPatternFromImage(bool isAlternatePattern = false)
|
||||
{
|
||||
var dialog = new OpenFileDialog
|
||||
|
||||
@@ -1266,9 +1266,11 @@ namespace UVtools.WPF
|
||||
_showLayerImageRotated = mat.Height > mat.Width;
|
||||
}
|
||||
|
||||
if (SlicerFile.DisplayMirror)
|
||||
if (SlicerFile.DisplayMirror != Enumerations.FlipDirection.None)
|
||||
{
|
||||
_showLayerImageFlipped = true;
|
||||
_showLayerImageFlippedHorizontally = SlicerFile.DisplayMirror is Enumerations.FlipDirection.Horizontally or Enumerations.FlipDirection.Both;
|
||||
_showLayerImageFlippedVertically = SlicerFile.DisplayMirror is Enumerations.FlipDirection.Vertically or Enumerations.FlipDirection.Both;
|
||||
}
|
||||
|
||||
ResetDataContext();
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
<PackageLicenseFile>LICENSE</PackageLicenseFile>
|
||||
<RepositoryUrl>https://github.com/sn4k3/UVtools</RepositoryUrl>
|
||||
<RepositoryType>Git</RepositoryType>
|
||||
<Version>2.19.5</Version>
|
||||
<Version>2.20.0</Version>
|
||||
</PropertyGroup>
|
||||
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
|
||||
|
||||
Reference in New Issue
Block a user