Compare commits

...

22 Commits

Author SHA1 Message Date
sunsets
d9c7898876 Machine_List applies to Linux and MacOS 2023-12-07 13:37:35 +08:00
sunsets
c08509a354 Update MainFrame.cpp 2023-12-07 09:06:51 +08:00
sunsets
c2d45c696e V1.0.8 and fix some bugs in machine list 2023-12-06 15:28:31 +08:00
sunsets
9f5d69a0a6 Device_Machine_List_Button 2023-12-04 14:10:31 +08:00
sunsets
45d2bf40e2 Machine_List applies to Linux and MacOS 2023-11-29 16:16:00 +08:00
QIDI TECH
ca4e3f3824 Update QIDITechnology.ini 2023-11-28 09:03:22 +08:00
sunsets
1c1786d922 Update MainFrame.cpp 2023-11-27 13:33:04 +08:00
sunsets
7d152a9d82 Device_Machine_List 2023-11-27 11:29:19 +08:00
Wang YB
0e56a49501 update xy compensation 2023-11-23 13:52:00 +08:00
Wang YB
ef74fffcba update xy compensation 2023-11-22 13:23:00 +08:00
Wang YB
8656b2408f update Detect narrow internal solid infill 2023-11-13 14:39:36 +08:00
Wang YB
b3cd2d72cf add Detect narrow internal solid infill 2023-11-11 13:43:33 +08:00
Wang YB
352ac5ab2d Revert "add Detect narrow internal solid infill"
This reverts commit ea99e07679.
2023-11-11 13:39:30 +08:00
Wang YB
ea99e07679 add Detect narrow internal solid infill 2023-11-11 13:26:38 +08:00
QIDI TECH
01d319ed8a Add a Select All button in the right-click menu bar 2023-11-10 11:03:38 +08:00
QIDI TECH
34cd2c69ce Fixed errors caused by mesh bed alignment model names 2023-11-09 11:03:05 +08:00
QIDI TECH
73860b7625 Revert "Update Plater.cpp"
This reverts commit 8594787d58.
2023-11-09 10:58:26 +08:00
QIDI TECH
578400753e Merge branch 'main' of https://github.com/QIDITECH/QIDISlicer 2023-11-09 10:56:41 +08:00
QIDI TECH
edb08f521d Fix bug of calibration and other bugs 2023-11-09 10:56:33 +08:00
Wang YB
5d9f6cd345 reduce solid infill 2023-11-09 10:35:16 +08:00
sunsets
aa434bbef0 Update GCode.cpp 2023-11-04 14:10:55 +08:00
sunsets
8594787d58 Update Plater.cpp 2023-11-03 18:43:18 +08:00
42 changed files with 2194 additions and 75 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 25.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="图层_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
width="24px" height="24px" viewBox="0 0 24 24" enable-background="new 0 0 24 24" xml:space="preserve">
<path fill="#4EC256" d="M11,11V5h2v6h6v2h-6v6h-2v-6H5v-2H11z"/>
</svg>

After

Width:  |  Height:  |  Size: 437 B

View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 25.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="图层_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
width="24px" height="24px" viewBox="0 0 24 24" enable-background="new 0 0 24 24" xml:space="preserve">
<path fill="#ADADAF" d="M15.8,17l-1.4,1.4L8,12l6.4-6.3l1.4,1.4l-5,4.9L15.8,17z"/>
</svg>

After

Width:  |  Height:  |  Size: 455 B

View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 25.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="图层_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
width="24px" height="24px" viewBox="0 0 24 24" enable-background="new 0 0 24 24" xml:space="preserve">
<path fill="#ADADAF" d="M13.2,12l-5-4.9l1.4-1.4L16,12l-6.4,6.4L8.2,17L13.2,12z"/>
</svg>

After

Width:  |  Height:  |  Size: 455 B

View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 25.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="图层_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
width="24px" height="24px" viewBox="0 0 24 24" enable-background="new 0 0 24 24" xml:space="preserve">
<path fill="#FC5151" d="M5,13v-2h14v2H5z"/>
</svg>

After

Width:  |  Height:  |  Size: 417 B

View File

@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 25.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="图层_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
width="24px" height="24px" viewBox="0 0 24 24" enable-background="new 0 0 24 24" xml:space="preserve">
<path fill="#ADADAF" d="M16.8,3l-2,2H5v14h14V9.2l2-2V20c0,0.6-0.4,1-1,1H4c-0.6,0-1-0.4-1-1V4c0-0.6,0.4-1,1-1H16.8z M20.5,2.1
l1.4,1.4l-9.2,9.2l-1.4,0l0-1.4L20.5,2.1z"/>
</svg>

After

Width:  |  Height:  |  Size: 543 B

View File

@@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 25.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="图层_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
width="24px" height="24px" viewBox="0 0 24 24" enable-background="new 0 0 24 24" xml:space="preserve">
<g>
<path fill="#ADADAF" d="M19.4,1.9H4.6C3.2,1.9,2,3.1,2,4.5v6.4h4v-4h12v4h4V4.5C22,3.1,20.8,1.9,19.4,1.9z M19,5.9
c-0.6,0-1-0.4-1-1c0-0.6,0.4-1,1-1c0.6,0,1,0.4,1,1C20,5.5,19.6,5.9,19,5.9z"/>
<path fill="#ADADAF" d="M6,12.4v6.3l6.2,3.3l5.9-3.3v-6.3l-6-3.1L6,12.4z M11,19.2l-3-1.6v-2.9l3,1.6V19.2z M16,17.6l-3,1.7v-3
l3-1.8V17.6z M12,14.6L9.2,13l2.9-1.5l2.7,1.4L12,14.6z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 758 B

View File

@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 25.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="图层_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
width="24px" height="24px" viewBox="0 0 24 24" enable-background="new 0 0 24 24" xml:space="preserve">
<path fill="#ADADAF" d="M5.5,4.4C7.2,2.9,9.5,2,12,2c5.5,0,10,4.5,10,10c0,2.1-0.7,4.1-1.8,5.7L17,12h3c0-4.4-3.6-8-8-8
C9.8,4,7.9,4.8,6.5,6.2L5.5,4.4z M18.5,19.6c-1.8,1.5-4,2.4-6.5,2.4C6.5,22,2,17.5,2,12c0-2.1,0.7-4.1,1.8-5.7L7,12H4
c0,4.4,3.6,8,8,8c2.2,0,4.1-0.8,5.5-2.2L18.5,19.6z"/>
</svg>

After

Width:  |  Height:  |  Size: 659 B

View File

@@ -1,3 +1,5 @@
min_slic3r_version = 1.0.8
1.0.8 Optimize parameters
min_slic3r_version = 1.0.7
1.0.7 Optimize parameters
min_slic3r_version = 1.0.6

View File

@@ -5,7 +5,7 @@
name = QIDI Technology
# Configuration version of this file. Config file will only be installed, if the config_version differs.
# This means, the server may force the QIDISlicer configuration to be downgraded.
config_version = 1.0.7
config_version = 1.0.8
# Where to get the updates from?
config_update_url = https://github.com/QIDITECH/QIDISlicer/releases/download/QIDITechnology/
changelog_url = https://qidi3d.com/pages/software-firmware
@@ -16,7 +16,7 @@ changelog_url = https://qidi3d.com/pages/software-firmware
[printer_model:X-MAX 3]
name = X-MAX 3
variants = 0.4; 0.2
variants = 0.4; 0.2; 0.6; 0.8
technology = FFF
family = X
bed_model = X-MAX 3_bed.stl
@@ -25,7 +25,7 @@ default_materials = QIDI ABS Odorless @X-MAX 3 0.4 nozzle; QIDI ABS Rapido @X-MA
[printer_model:X-Plus 3]
name = X-Plus 3
variants = 0.4; 0.2
variants = 0.4; 0.2; 0.6; 0.8
technology = FFF
family = X
bed_model = X-Plus 3_bed.stl
@@ -34,7 +34,7 @@ default_materials = QIDI ABS Odorless @X-Plus 3 0.4 nozzle; QIDI ABS Rapido @X-P
[printer_model:X-smart 3]
name = X-smart 3
variants = 0.4; 0.2
variants = 0.4; 0.2; 0.6; 0.8
technology = FFF
family = X
bed_model = X-smart 3_bed.stl
@@ -65,7 +65,7 @@ complete_objects = 0
default_acceleration = 10000
dont_support_bridges = 0
draft_shield = disabled
elefant_foot_compensation = 0.15
elefant_foot_compensation = 0
enable_dynamic_overhang_speeds = 1
external_perimeter_acceleration = 3000
external_perimeter_extrusion_width = 0.42
@@ -122,7 +122,7 @@ min_feature_size = 25%
min_skirt_length = 5
mmu_segmented_region_max_width = 0
notes =
only_retract_when_crossing_perimeters = 1
only_retract_when_crossing_perimeters = 0
ooze_prevention = 0
output_filename_format = [input_filename_base].gcode
overhang_speed_0 = 10
@@ -202,7 +202,7 @@ top_infill_extrusion_width = 0.42
top_solid_infill_acceleration = 2000
top_solid_infill_speed = 200
top_solid_layers = 4
top_solid_min_thickness = 0.6
top_solid_min_thickness = 0.8
travel_acceleration = 10000
travel_speed = 500
travel_speed_z = 10
@@ -236,7 +236,6 @@ inherits = *common*
# Nozzle Print preset
[print:*0.2 nozzle*]
bottom_solid_layers = 5
elefant_foot_compensation = 0
external_perimeter_extrusion_width = 0.22
external_perimeter_speed = 120
extrusion_width = 0.22
@@ -255,9 +254,54 @@ solid_infill_speed = 150
support_material_extrusion_width = 0.22
top_infill_extrusion_width = 0.22
top_solid_infill_speed = 150
top_solid_min_thickness = 0.8
[print:*0.4 nozzle*]
elefant_foot_compensation = 0.15
[print:*0.6 nozzle*]
bridge_speed = 30
external_perimeter_extrusion_width = 0.62
external_perimeter_speed = 120
extrusion_width = 0.62
first_layer_extrusion_width = 0.62
first_layer_height = 0.3
first_layer_infill_speed = 55
first_layer_speed = 35
gap_fill_speed = 50
infill_extrusion_width = 0.62
infill_speed = 100
overhang_speed_1 = 15
perimeter_extrusion_width = 0.62
perimeter_speed = 150
solid_infill_extrusion_width = 0.62
solid_infill_speed = 150
support_material_extrusion_width = 0.62
top_infill_extrusion_width = 0.62
top_solid_infill_speed = 150
[print:*0.8 nozzle*]
bridge_speed = 30
external_perimeter_extrusion_width = 0.82
external_perimeter_speed = 120
extrusion_width = 0.82
first_layer_extrusion_width = 0.82
first_layer_height = 0.4
first_layer_infill_speed = 55
first_layer_speed = 35
gap_fill_speed = 50
infill_extrusion_width = 0.82
infill_speed = 100
overhang_speed_0 = 5
overhang_speed_1 = 25
perimeter_extrusion_width = 0.82
perimeter_speed = 150
solid_infill_extrusion_width = 0.82
solid_infill_speed = 150
support_material_extrusion_width = 0.82
support_tree_tip_diameter = 1.6
top_fill_pattern = monotonic
top_infill_extrusion_width = 0.82
top_solid_infill_speed = 150
# Layer Hight Print preset
# 0.2 nozzle
@@ -283,7 +327,7 @@ overhang_speed_1 = 10
overhang_speed_2 = 30
overhang_speed_3 = 60
perimeter_speed = 350
solid_infill_speed = 320
solid_infill_speed = 300
top_solid_layers = 6
[print:*0.16mm High*]
@@ -296,7 +340,7 @@ overhang_speed_0 = 10
overhang_speed_1 = 10
overhang_speed_2 = 30
overhang_speed_3 = 60
solid_infill_speed = 270
solid_infill_speed = 250
top_solid_layers = 5
[print:*0.20mm Fine*]
@@ -314,7 +358,33 @@ gap_fill_speed = 230
infill_speed = 220
layer_height = 0.24
perimeter_speed = 230
solid_infill_speed = 230
solid_infill_speed = 200
# 0.6 nozzle
[print:*0.24mm High*]
inherits = *0.6 nozzle*
layer_height = 0.24
[print:*0.30mm Fine*]
inherits = *0.6 nozzle*
layer_height = 0.3
[print:*0.36mm Quick*]
inherits = *0.6 nozzle*
layer_height = 0.36
# 0.8 nozzle
[print:*0.32mm High*]
inherits = *0.8 nozzle*
layer_height = 0.32
[print:*0.40mm Fine*]
inherits = *0.8 nozzle*
layer_height = 0.4
[print:*0.48mm Quick*]
inherits = *0.8 nozzle*
layer_height = 0.48
# Print preset
# X-MAX 3 0.2 nozzle Print preset
@@ -347,6 +417,32 @@ compatible_printers_condition = printer_model=="X-MAX 3" and nozzle_diameter[0]=
inherits = *X-MAX 3*; *0.24mm Quick*
compatible_printers_condition = printer_model=="X-MAX 3" and nozzle_diameter[0]==0.4
# X-MAX 3 0.6 nozzle Print preset
[print:0.24mm High @X-MAX 3 0.6 nozzle]
inherits = *X-MAX 3*; *0.24mm High*
compatible_printers_condition = printer_model=="X-MAX 3" and nozzle_diameter[0]==0.6
[print:0.30mm Fine @X-MAX 3 0.6 nozzle]
inherits = *X-MAX 3*; *0.30mm Fine*
compatible_printers_condition = printer_model=="X-MAX 3" and nozzle_diameter[0]==0.6
[print:0.36mm Fine @X-MAX 3 0.6 nozzle]
inherits = *X-MAX 3*; *0.36mm Quick*
compatible_printers_condition = printer_model=="X-MAX 3" and nozzle_diameter[0]==0.6
# X-MAX 3 0.8 nozzle Print preset
[print:0.32mm High @X-MAX 3 0.8 nozzle]
inherits = *X-MAX 3*; *0.32mm High*
compatible_printers_condition = printer_model=="X-MAX 3" and nozzle_diameter[0]==0.8
[print:0.40mm Fine @X-MAX 3 0.8 nozzle]
inherits = *X-MAX 3*; *0.40mm Fine*
compatible_printers_condition = printer_model=="X-MAX 3" and nozzle_diameter[0]==0.8
[print:0.48mm Fine @X-MAX 3 0.8 nozzle]
inherits = *X-MAX 3*; *0.48mm Quick*
compatible_printers_condition = printer_model=="X-MAX 3" and nozzle_diameter[0]==0.8
# X-Plus 3 0.2 nozzle Print preset
[print:0.08mm Extra High @X-Plus 3 0.2 nozzle]
inherits = *X-Plus 3*; *0.08mm Extra High*
@@ -377,6 +473,32 @@ compatible_printers_condition = printer_model=="X-Plus 3" and nozzle_diameter[0]
inherits = *X-Plus 3*; *0.24mm Quick*
compatible_printers_condition = printer_model=="X-Plus 3" and nozzle_diameter[0]==0.4
# X-Plus 3 0.6 nozzle Print preset
[print:0.24mm High @X-Plus 3 0.6 nozzle]
inherits = *X-Plus 3*; *0.24mm High*
compatible_printers_condition = printer_model=="X-Plus 3" and nozzle_diameter[0]==0.6
[print:0.30mm Fine @X-Plus 3 0.6 nozzle]
inherits = *X-Plus 3*; *0.30mm Fine*
compatible_printers_condition = printer_model=="X-Plus 3" and nozzle_diameter[0]==0.6
[print:0.36mm Fine @X-Plus 3 0.6 nozzle]
inherits = *X-Plus 3*; *0.36mm Quick*
compatible_printers_condition = printer_model=="X-Plus 3" and nozzle_diameter[0]==0.6
# X-Plus 3 0.8 nozzle Print preset
[print:0.32mm High @X-Plus 3 0.8 nozzle]
inherits = *X-Plus 3*; *0.32mm High*
compatible_printers_condition = printer_model=="X-Plus 3" and nozzle_diameter[0]==0.8
[print:0.40mm Fine @X-Plus 3 0.8 nozzle]
inherits = *X-Plus 3*; *0.40mm Fine*
compatible_printers_condition = printer_model=="X-Plus 3" and nozzle_diameter[0]==0.8
[print:0.48mm Fine @X-Plus 3 0.8 nozzle]
inherits = *X-Plus 3*; *0.48mm Quick*
compatible_printers_condition = printer_model=="X-Plus 3" and nozzle_diameter[0]==0.8
# X-smart 3 0.2 nozzle Print preset
[print:0.08mm Extra High @X-smart 3 0.2 nozzle]
inherits = *X-smart 3*; *0.08mm Extra High*
@@ -407,6 +529,32 @@ compatible_printers_condition = printer_model=="X-smart 3" and nozzle_diameter[0
inherits = *X-smart 3*; *0.24mm Quick*
compatible_printers_condition = printer_model=="X-smart 3" and nozzle_diameter[0]==0.4
# X-smart 3 0.6 nozzle Print preset
[print:0.24mm High @X-smart 3 0.6 nozzle]
inherits = *X-smart 3*; *0.24mm High*
compatible_printers_condition = printer_model=="X-smart 3" and nozzle_diameter[0]==0.6
[print:0.30mm Fine @X-smart 3 0.6 nozzle]
inherits = *X-smart 3*; *0.30mm Fine*
compatible_printers_condition = printer_model=="X-smart 3" and nozzle_diameter[0]==0.6
[print:0.36mm Fine @X-smart 3 0.6 nozzle]
inherits = *X-smart 3*; *0.36mm Quick*
compatible_printers_condition = printer_model=="X-smart 3" and nozzle_diameter[0]==0.6
# X-smart 3 0.8 nozzle Print preset
[print:0.32mm High @X-smart 3 0.8 nozzle]
inherits = *X-smart 3*; *0.32mm High*
compatible_printers_condition = printer_model=="X-smart 3" and nozzle_diameter[0]==0.8
[print:0.40mm Fine @X-smart 3 0.8 nozzle]
inherits = *X-smart 3*; *0.40mm Fine*
compatible_printers_condition = printer_model=="X-smart 3" and nozzle_diameter[0]==0.8
[print:0.48mm Fine @X-smart 3 0.8 nozzle]
inherits = *X-smart 3*; *0.48mm Quick*
compatible_printers_condition = printer_model=="X-smart 3" and nozzle_diameter[0]==0.8
# Common filament preset
[filament:*common*]
advance_pressure = 0.031
@@ -438,7 +586,7 @@ filament_diameter = 1.75
filament_load_time = 0
filament_loading_speed = 28
filament_loading_speed_start = 3
filament_max_volumetric_speed = 21
filament_max_volumetric_speed = 20
filament_minimal_purge_on_wipe_tower = 15
filament_notes = ""
filament_ramming_parameters = "120 100 6.6 6.8 7.2 7.6 7.9 8.2 8.7 9.4 9.9 10.0| 0.05 6.6 0.45 6.8 0.95 7.8 1.45 8.3 1.95 9.7 2.45 10 2.95 7.6 3.45 7.6 3.95 7.6 4.45 7.6 4.95 7.6"
@@ -564,7 +712,7 @@ fan_below_layer_time = 35
filament_colour = #F0E68C
filament_density = 1.07
filament_max_volumetric_speed = 16
filament_type = ABS
filament_type = ASA
first_layer_bed_temperature = 90
first_layer_temperature = 250
max_fan_speed = 50
@@ -674,7 +822,7 @@ inherits = *common*
inherits = *common*
filament_colour = #0073E6
filament_density = 1.42
filament_max_volumetric_speed = 22
filament_max_volumetric_speed = 21
[filament:*QIDI UltraPA*]
inherits = *common*
@@ -875,6 +1023,161 @@ compatible_printers_condition = printer_model=="X-MAX 3" and nozzle_diameter[0]=
inherits = *Generic TPU 95A*
compatible_printers_condition = printer_model=="X-MAX 3" and nozzle_diameter[0]==0.4
# X-MAX 3 0.6 nozzle QIDI filament preset
[filament:QIDI ABS Odorless @X-MAX 3 0.6 nozzle]
inherits = *QIDI ABS Odorless*
advance_pressure = 0.014
compatible_printers_condition = printer_model=="X-MAX 3" and nozzle_diameter[0]==0.6
[filament:QIDI ABS Rapido @X-MAX 3 0.6 nozzle]
inherits = *QIDI ABS Rapido*
advance_pressure = 0.014
compatible_printers_condition = printer_model=="X-MAX 3" and nozzle_diameter[0]==0.6
[filament:QIDI ABS-GF @X-MAX 3 0.6 nozzle]
inherits = *QIDI ABS-GF*
compatible_printers_condition = printer_model=="X-MAX 3" and nozzle_diameter[0]==0.6
[filament:QIDI ASA @X-MAX 3 0.6 nozzle]
inherits = *QIDI ASA*
advance_pressure = 0.014
compatible_printers_condition = printer_model=="X-MAX 3" and nozzle_diameter[0]==0.6
[filament:QIDI PA12-CF @X-MAX 3 0.6 nozzle]
inherits = *QIDI PA12-CF*
compatible_printers_condition = printer_model=="X-MAX 3" and nozzle_diameter[0]==0.6
[filament:QIDI PAHT-CF @X-MAX 3 0.6 nozzle]
inherits = *QIDI PAHT-CF*
compatible_printers_condition = printer_model=="X-MAX 3" and nozzle_diameter[0]==0.6
[filament:QIDI PET-CF @X-MAX 3 0.6 nozzle]
inherits = *QIDI PET-CF*
compatible_printers_condition = printer_model=="X-MAX 3" and nozzle_diameter[0]==0.6
[filament:QIDI PETG-Tough @X-MAX 3 0.6 nozzle]
inherits = *QIDI PETG-Tough*
temperature = 240
compatible_printers_condition = printer_model=="X-MAX 3" and nozzle_diameter[0]==0.6
[filament:QIDI PLA Rapido @X-MAX 3 0.6 nozzle]
inherits = *QIDI PLA Rapido*
advance_pressure = 0.016
slowdown_below_layer_time = 6
compatible_printers_condition = printer_model=="X-MAX 3" and nozzle_diameter[0]==0.6
[filament:QIDI PLA Rapido Matte @X-MAX 3 0.6 nozzle]
inherits = *QIDI PLA Rapido Matte*
advance_pressure = 0.016
slowdown_below_layer_time = 6
compatible_printers_condition = printer_model=="X-MAX 3" and nozzle_diameter[0]==0.6
[filament:QIDI UltraPA @X-MAX 3 0.6 nozzle]
inherits = *QIDI UltraPA*
compatible_printers_condition = printer_model=="X-MAX 3" and nozzle_diameter[0]==0.6
# X-MAX 3 0.6 nozzle Generic filament preset
[filament:Generic ABS @X-MAX 3 0.6 nozzle]
inherits = *Generic ABS*
advance_pressure = 0.014
compatible_printers_condition = printer_model=="X-MAX 3" and nozzle_diameter[0]==0.6
[filament:Generic PETG @X-MAX 3 0.6 nozzle]
inherits = *Generic PETG*
temperature = 240
compatible_printers_condition = printer_model=="X-MAX 3" and nozzle_diameter[0]==0.6
[filament:Generic PLA @X-MAX 3 0.6 nozzle]
inherits = *Generic PLA*
advance_pressure = 0.016
slowdown_below_layer_time = 6
compatible_printers_condition = printer_model=="X-MAX 3" and nozzle_diameter[0]==0.6
[filament:Generic TPU 95A @X-MAX 3 0.6 nozzle]
inherits = *Generic TPU 95A*
compatible_printers_condition = printer_model=="X-MAX 3" and nozzle_diameter[0]==0.6
# X-MAX 3 0.8 nozzle QIDI filament preset
[filament:QIDI ABS Odorless @X-MAX 3 0.8 nozzle]
inherits = *QIDI ABS Odorless*
advance_pressure = 0.011
min_print_speed = 10
temperature = 260
compatible_printers_condition = printer_model=="X-MAX 3" and nozzle_diameter[0]==0.8
[filament:QIDI ABS Rapido @X-MAX 3 0.8 nozzle]
inherits = *QIDI ABS Rapido*
advance_pressure = 0.011
min_print_speed = 10
temperature = 260
compatible_printers_condition = printer_model=="X-MAX 3" and nozzle_diameter[0]==0.8
[filament:QIDI ABS-GF @X-MAX 3 0.8 nozzle]
inherits = *QIDI ABS-GF*
compatible_printers_condition = printer_model=="X-MAX 3" and nozzle_diameter[0]==0.8
[filament:QIDI ASA @X-MAX 3 0.8 nozzle]
inherits = *QIDI ASA*
advance_pressure = 0.011
min_print_speed = 10
temperature = 260
compatible_printers_condition = printer_model=="X-MAX 3" and nozzle_diameter[0]==0.8
[filament:QIDI PA12-CF @X-MAX 3 0.8 nozzle]
inherits = *QIDI PA12-CF*
compatible_printers_condition = printer_model=="X-MAX 3" and nozzle_diameter[0]==0.8
[filament:QIDI PAHT-CF @X-MAX 3 0.8 nozzle]
inherits = *QIDI PAHT-CF*
compatible_printers_condition = printer_model=="X-MAX 3" and nozzle_diameter[0]==0.8
[filament:QIDI PET-CF @X-MAX 3 0.8 nozzle]
inherits = *QIDI PET-CF*
compatible_printers_condition = printer_model=="X-MAX 3" and nozzle_diameter[0]==0.8
[filament:QIDI PETG-Tough @X-MAX 3 0.8 nozzle]
inherits = *QIDI PETG-Tough*
temperature = 240
compatible_printers_condition = printer_model=="X-MAX 3" and nozzle_diameter[0]==0.8
[filament:QIDI PLA Rapido @X-MAX 3 0.8 nozzle]
inherits = *QIDI PLA Rapido*
advance_pressure = 0.008
slowdown_below_layer_time = 6
compatible_printers_condition = printer_model=="X-MAX 3" and nozzle_diameter[0]==0.8
[filament:QIDI PLA Rapido Matte @X-MAX 3 0.8 nozzle]
inherits = *QIDI PLA Rapido Matte*
advance_pressure = 0.008
slowdown_below_layer_time = 6
compatible_printers_condition = printer_model=="X-MAX 3" and nozzle_diameter[0]==0.8
[filament:QIDI UltraPA @X-MAX 3 0.8 nozzle]
inherits = *QIDI UltraPA*
compatible_printers_condition = printer_model=="X-MAX 3" and nozzle_diameter[0]==0.8
# X-MAX 3 0.8 nozzle Generic filament preset
[filament:Generic ABS @X-MAX 3 0.8 nozzle]
inherits = *Generic ABS*
advance_pressure = 0.011
compatible_printers_condition = printer_model=="X-MAX 3" and nozzle_diameter[0]==0.8
[filament:Generic PETG @X-MAX 3 0.8 nozzle]
inherits = *Generic PETG*
temperature = 240
compatible_printers_condition = printer_model=="X-MAX 3" and nozzle_diameter[0]==0.8
[filament:Generic PLA @X-MAX 3 0.8 nozzle]
inherits = *Generic PLA*
advance_pressure = 0.008
slowdown_below_layer_time = 6
compatible_printers_condition = printer_model=="X-MAX 3" and nozzle_diameter[0]==0.8
[filament:Generic TPU 95A @X-MAX 3 0.8 nozzle]
inherits = *Generic TPU 95A*
temperature = 220
compatible_printers_condition = printer_model=="X-MAX 3" and nozzle_diameter[0]==0.8
# X-Plus 3 0.2 nozzle QIDI filament preset
[filament:QIDI ABS Odorless @X-Plus 3 0.2 nozzle]
inherits = *QIDI ABS Odorless*
@@ -987,6 +1290,161 @@ compatible_printers_condition = printer_model=="X-Plus 3" and nozzle_diameter[0]
inherits = *Generic TPU 95A*
compatible_printers_condition = printer_model=="X-Plus 3" and nozzle_diameter[0]==0.4
# X-Plus 3 0.6 nozzle QIDI filament preset
[filament:QIDI ABS Odorless @X-Plus 3 0.6 nozzle]
inherits = *QIDI ABS Odorless*
advance_pressure = 0.014
compatible_printers_condition = printer_model=="X-Plus 3" and nozzle_diameter[0]==0.6
[filament:QIDI ABS Rapido @X-Plus 3 0.6 nozzle]
inherits = *QIDI ABS Rapido*
advance_pressure = 0.014
compatible_printers_condition = printer_model=="X-Plus 3" and nozzle_diameter[0]==0.6
[filament:QIDI ABS-GF @X-Plus 3 0.6 nozzle]
inherits = *QIDI ABS-GF*
compatible_printers_condition = printer_model=="X-Plus 3" and nozzle_diameter[0]==0.6
[filament:QIDI ASA @X-Plus 3 0.6 nozzle]
inherits = *QIDI ASA*
advance_pressure = 0.014
compatible_printers_condition = printer_model=="X-Plus 3" and nozzle_diameter[0]==0.6
[filament:QIDI PA12-CF @X-Plus 3 0.6 nozzle]
inherits = *QIDI PA12-CF*
compatible_printers_condition = printer_model=="X-Plus 3" and nozzle_diameter[0]==0.6
[filament:QIDI PAHT-CF @X-Plus 3 0.6 nozzle]
inherits = *QIDI PAHT-CF*
compatible_printers_condition = printer_model=="X-Plus 3" and nozzle_diameter[0]==0.6
[filament:QIDI PET-CF @X-Plus 3 0.6 nozzle]
inherits = *QIDI PET-CF*
compatible_printers_condition = printer_model=="X-Plus 3" and nozzle_diameter[0]==0.6
[filament:QIDI PETG-Tough @X-Plus 3 0.6 nozzle]
inherits = *QIDI PETG-Tough*
temperature = 240
compatible_printers_condition = printer_model=="X-Plus 3" and nozzle_diameter[0]==0.6
[filament:QIDI PLA Rapido @X-Plus 3 0.6 nozzle]
inherits = *QIDI PLA Rapido*
advance_pressure = 0.016
slowdown_below_layer_time = 6
compatible_printers_condition = printer_model=="X-Plus 3" and nozzle_diameter[0]==0.6
[filament:QIDI PLA Rapido Matte @X-Plus 3 0.6 nozzle]
inherits = *QIDI PLA Rapido Matte*
advance_pressure = 0.016
slowdown_below_layer_time = 6
compatible_printers_condition = printer_model=="X-Plus 3" and nozzle_diameter[0]==0.6
[filament:QIDI UltraPA @X-Plus 3 0.6 nozzle]
inherits = *QIDI UltraPA*
compatible_printers_condition = printer_model=="X-Plus 3" and nozzle_diameter[0]==0.6
# X-Plus 3 0.6 nozzle Generic filament preset
[filament:Generic ABS @X-Plus 3 0.6 nozzle]
inherits = *Generic ABS*
advance_pressure = 0.014
compatible_printers_condition = printer_model=="X-Plus 3" and nozzle_diameter[0]==0.6
[filament:Generic PETG @X-Plus 3 0.6 nozzle]
inherits = *Generic PETG*
temperature = 240
compatible_printers_condition = printer_model=="X-Plus 3" and nozzle_diameter[0]==0.6
[filament:Generic PLA @X-Plus 3 0.6 nozzle]
inherits = *Generic PLA*
advance_pressure = 0.016
slowdown_below_layer_time = 6
compatible_printers_condition = printer_model=="X-Plus 3" and nozzle_diameter[0]==0.6
[filament:Generic TPU 95A @X-Plus 3 0.6 nozzle]
inherits = *Generic TPU 95A*
compatible_printers_condition = printer_model=="X-Plus 3" and nozzle_diameter[0]==0.6
# X-Plus 3 0.8 nozzle QIDI filament preset
[filament:QIDI ABS Odorless @X-Plus 3 0.8 nozzle]
inherits = *QIDI ABS Odorless*
advance_pressure = 0.011
min_print_speed = 10
temperature = 260
compatible_printers_condition = printer_model=="X-Plus 3" and nozzle_diameter[0]==0.8
[filament:QIDI ABS Rapido @X-Plus 3 0.8 nozzle]
inherits = *QIDI ABS Rapido*
advance_pressure = 0.011
min_print_speed = 10
temperature = 260
compatible_printers_condition = printer_model=="X-Plus 3" and nozzle_diameter[0]==0.8
[filament:QIDI ABS-GF @X-Plus 3 0.8 nozzle]
inherits = *QIDI ABS-GF*
compatible_printers_condition = printer_model=="X-Plus 3" and nozzle_diameter[0]==0.8
[filament:QIDI ASA @X-Plus 3 0.8 nozzle]
inherits = *QIDI ASA*
advance_pressure = 0.011
min_print_speed = 10
temperature = 260
compatible_printers_condition = printer_model=="X-Plus 3" and nozzle_diameter[0]==0.8
[filament:QIDI PA12-CF @X-Plus 3 0.8 nozzle]
inherits = *QIDI PA12-CF*
compatible_printers_condition = printer_model=="X-Plus 3" and nozzle_diameter[0]==0.8
[filament:QIDI PAHT-CF @X-Plus 3 0.8 nozzle]
inherits = *QIDI PAHT-CF*
compatible_printers_condition = printer_model=="X-Plus 3" and nozzle_diameter[0]==0.8
[filament:QIDI PET-CF @X-Plus 3 0.8 nozzle]
inherits = *QIDI PET-CF*
compatible_printers_condition = printer_model=="X-Plus 3" and nozzle_diameter[0]==0.8
[filament:QIDI PETG-Tough @X-Plus 3 0.8 nozzle]
inherits = *QIDI PETG-Tough*
temperature = 240
compatible_printers_condition = printer_model=="X-Plus 3" and nozzle_diameter[0]==0.8
[filament:QIDI PLA Rapido @X-Plus 3 0.8 nozzle]
inherits = *QIDI PLA Rapido*
advance_pressure = 0.008
slowdown_below_layer_time = 6
compatible_printers_condition = printer_model=="X-Plus 3" and nozzle_diameter[0]==0.8
[filament:QIDI PLA Rapido Matte @X-Plus 3 0.8 nozzle]
inherits = *QIDI PLA Rapido Matte*
advance_pressure = 0.008
slowdown_below_layer_time = 6
compatible_printers_condition = printer_model=="X-Plus 3" and nozzle_diameter[0]==0.8
[filament:QIDI UltraPA @X-Plus 3 0.8 nozzle]
inherits = *QIDI UltraPA*
compatible_printers_condition = printer_model=="X-Plus 3" and nozzle_diameter[0]==0.8
# X-Plus 3 0.8 nozzle Generic filament preset
[filament:Generic ABS @X-Plus 3 0.8 nozzle]
inherits = *Generic ABS*
advance_pressure = 0.011
compatible_printers_condition = printer_model=="X-Plus 3" and nozzle_diameter[0]==0.8
[filament:Generic PETG @X-Plus 3 0.8 nozzle]
inherits = *Generic PETG*
temperature = 240
compatible_printers_condition = printer_model=="X-Plus 3" and nozzle_diameter[0]==0.8
[filament:Generic PLA @X-Plus 3 0.8 nozzle]
inherits = *Generic PLA*
advance_pressure = 0.008
slowdown_below_layer_time = 6
compatible_printers_condition = printer_model=="X-Plus 3" and nozzle_diameter[0]==0.8
[filament:Generic TPU 95A @X-Plus 3 0.8 nozzle]
inherits = *Generic TPU 95A*
temperature = 220
compatible_printers_condition = printer_model=="X-Plus 3" and nozzle_diameter[0]==0.8
# X-smart 3 0.2 nozzle QIDI filament preset
[filament:QIDI ABS Odorless @X-smart 3 0.2 nozzle]
inherits = *QIDI ABS Odorless*
@@ -1120,6 +1578,161 @@ compatible_printers_condition = printer_model=="X-smart 3" and nozzle_diameter[0
inherits = *Generic TPU 95A*
compatible_printers_condition = printer_model=="X-smart 3" and nozzle_diameter[0]==0.4
# X-smart 3 0.6 nozzle QIDI filament preset
[filament:QIDI ABS Odorless @X-smart 3 0.6 nozzle]
inherits = *QIDI ABS Odorless*
advance_pressure = 0.014
compatible_printers_condition = printer_model=="X-smart 3" and nozzle_diameter[0]==0.6
[filament:QIDI ABS Rapido @X-smart 3 0.6 nozzle]
inherits = *QIDI ABS Rapido*
advance_pressure = 0.014
compatible_printers_condition = printer_model=="X-smart 3" and nozzle_diameter[0]==0.6
[filament:QIDI ABS-GF @X-smart 3 0.6 nozzle]
inherits = *QIDI ABS-GF*
compatible_printers_condition = printer_model=="X-smart 3" and nozzle_diameter[0]==0.6
[filament:QIDI ASA @X-smart 3 0.6 nozzle]
inherits = *QIDI ASA*
advance_pressure = 0.014
compatible_printers_condition = printer_model=="X-smart 3" and nozzle_diameter[0]==0.6
[filament:QIDI PA12-CF @X-smart 3 0.6 nozzle]
inherits = *QIDI PA12-CF*
compatible_printers_condition = printer_model=="X-smart 3" and nozzle_diameter[0]==0.6
[filament:QIDI PAHT-CF @X-smart 3 0.6 nozzle]
inherits = *QIDI PAHT-CF*
compatible_printers_condition = printer_model=="X-smart 3" and nozzle_diameter[0]==0.6
[filament:QIDI PET-CF @X-smart 3 0.6 nozzle]
inherits = *QIDI PET-CF*
compatible_printers_condition = printer_model=="X-smart 3" and nozzle_diameter[0]==0.6
[filament:QIDI PETG-Tough @X-smart 3 0.6 nozzle]
inherits = *QIDI PETG-Tough*
temperature = 240
compatible_printers_condition = printer_model=="X-smart 3" and nozzle_diameter[0]==0.6
[filament:QIDI PLA Rapido @X-smart 3 0.6 nozzle]
inherits = *QIDI PLA Rapido*
advance_pressure = 0.016
slowdown_below_layer_time = 6
compatible_printers_condition = printer_model=="X-smart 3" and nozzle_diameter[0]==0.6
[filament:QIDI PLA Rapido Matte @X-smart 3 0.6 nozzle]
inherits = *QIDI PLA Rapido Matte*
advance_pressure = 0.016
slowdown_below_layer_time = 6
compatible_printers_condition = printer_model=="X-smart 3" and nozzle_diameter[0]==0.6
[filament:QIDI UltraPA @X-smart 3 0.6 nozzle]
inherits = *QIDI UltraPA*
compatible_printers_condition = printer_model=="X-smart 3" and nozzle_diameter[0]==0.6
# X-smart 3 0.6 nozzle Generic filament preset
[filament:Generic ABS @X-smart 3 0.6 nozzle]
inherits = *Generic ABS*
advance_pressure = 0.014
compatible_printers_condition = printer_model=="X-smart 3" and nozzle_diameter[0]==0.6
[filament:Generic PETG @X-smart 3 0.6 nozzle]
inherits = *Generic PETG*
temperature = 240
compatible_printers_condition = printer_model=="X-smart 3" and nozzle_diameter[0]==0.6
[filament:Generic PLA @X-smart 3 0.6 nozzle]
inherits = *Generic PLA*
advance_pressure = 0.016
slowdown_below_layer_time = 6
compatible_printers_condition = printer_model=="X-smart 3" and nozzle_diameter[0]==0.6
[filament:Generic TPU 95A @X-smart 3 0.6 nozzle]
inherits = *Generic TPU 95A*
compatible_printers_condition = printer_model=="X-smart 3" and nozzle_diameter[0]==0.6
# X-smart 3 0.8 nozzle QIDI filament preset
[filament:QIDI ABS Odorless @X-smart 3 0.8 nozzle]
inherits = *QIDI ABS Odorless*
advance_pressure = 0.011
min_print_speed = 10
temperature = 260
compatible_printers_condition = printer_model=="X-smart 3" and nozzle_diameter[0]==0.8
[filament:QIDI ABS Rapido @X-smart 3 0.8 nozzle]
inherits = *QIDI ABS Rapido*
advance_pressure = 0.011
min_print_speed = 10
temperature = 260
compatible_printers_condition = printer_model=="X-smart 3" and nozzle_diameter[0]==0.8
[filament:QIDI ABS-GF @X-smart 3 0.8 nozzle]
inherits = *QIDI ABS-GF*
compatible_printers_condition = printer_model=="X-smart 3" and nozzle_diameter[0]==0.8
[filament:QIDI ASA @X-smart 3 0.8 nozzle]
inherits = *QIDI ASA*
advance_pressure = 0.011
min_print_speed = 10
temperature = 260
compatible_printers_condition = printer_model=="X-smart 3" and nozzle_diameter[0]==0.8
[filament:QIDI PA12-CF @X-smart 3 0.8 nozzle]
inherits = *QIDI PA12-CF*
compatible_printers_condition = printer_model=="X-smart 3" and nozzle_diameter[0]==0.8
[filament:QIDI PAHT-CF @X-smart 3 0.8 nozzle]
inherits = *QIDI PAHT-CF*
compatible_printers_condition = printer_model=="X-smart 3" and nozzle_diameter[0]==0.8
[filament:QIDI PET-CF @X-smart 3 0.8 nozzle]
inherits = *QIDI PET-CF*
compatible_printers_condition = printer_model=="X-smart 3" and nozzle_diameter[0]==0.8
[filament:QIDI PETG-Tough @X-smart 3 0.8 nozzle]
inherits = *QIDI PETG-Tough*
temperature = 240
compatible_printers_condition = printer_model=="X-smart 3" and nozzle_diameter[0]==0.8
[filament:QIDI PLA Rapido @X-smart 3 0.8 nozzle]
inherits = *QIDI PLA Rapido*
advance_pressure = 0.008
slowdown_below_layer_time = 6
compatible_printers_condition = printer_model=="X-smart 3" and nozzle_diameter[0]==0.8
[filament:QIDI PLA Rapido Matte @X-smart 3 0.8 nozzle]
inherits = *QIDI PLA Rapido Matte*
advance_pressure = 0.008
slowdown_below_layer_time = 6
compatible_printers_condition = printer_model=="X-smart 3" and nozzle_diameter[0]==0.8
[filament:QIDI UltraPA @X-smart 3 0.8 nozzle]
inherits = *QIDI UltraPA*
compatible_printers_condition = printer_model=="X-smart 3" and nozzle_diameter[0]==0.8
# X-smart 3 0.8 nozzle Generic filament preset
[filament:Generic ABS @X-smart 3 0.8 nozzle]
inherits = *Generic ABS*
advance_pressure = 0.011
compatible_printers_condition = printer_model=="X-smart 3" and nozzle_diameter[0]==0.8
[filament:Generic PETG @X-smart 3 0.8 nozzle]
inherits = *Generic PETG*
temperature = 240
compatible_printers_condition = printer_model=="X-smart 3" and nozzle_diameter[0]==0.8
[filament:Generic PLA @X-smart 3 0.8 nozzle]
inherits = *Generic PLA*
advance_pressure = 0.008
slowdown_below_layer_time = 6
compatible_printers_condition = printer_model=="X-smart 3" and nozzle_diameter[0]==0.8
[filament:Generic TPU 95A @X-smart 3 0.8 nozzle]
inherits = *Generic TPU 95A*
temperature = 220
compatible_printers_condition = printer_model=="X-smart 3" and nozzle_diameter[0]==0.8
# Common printer preset
[printer:*common*]
autoemit_temperature_commands = 1
@@ -1230,6 +1843,27 @@ inherits = *X-MAX 3*
default_filament_profile = Generic PLA @X-MAX 3 0.4 nozzle
default_print_profile = 0.20mm Fine @X-MAX 3 0.4 nozzle
[printer:X-MAX 3 0.6 nozzle]
inherits = *X-MAX 3*
default_filament_profile = Generic PLA @X-MAX 3 0.6 nozzle
default_print_profile = 0.30mm Fine @X-MAX 3 0.6 nozzle
max_layer_height = 0.42
min_layer_height = 0.12
nozzle_diameter = 0.6
printer_variant = 0.6
retract_before_travel = 3
retract_length = 1.4
[printer:X-MAX 3 0.8 nozzle]
inherits = *X-MAX 3*
default_filament_profile = Generic PLA @X-MAX 3 0.8 nozzle
default_print_profile = 0.40mm Fine @X-MAX 3 0.8 nozzle
max_layer_height = 0.56
min_layer_height = 0.16
nozzle_diameter = 0.8
printer_variant = 0.8
retract_length = 3
# X-Plus 3 preset
[printer:*X-Plus 3*]
inherits = *common*
@@ -1255,6 +1889,27 @@ inherits = *X-Plus 3*
default_filament_profile = Generic PLA @X-Plus 3 0.4 nozzle
default_print_profile = 0.20mm Fine @X-Plus 3 0.4 nozzle
[printer:X-Plus 3 0.6 nozzle]
inherits = *X-Plus 3*
default_filament_profile = Generic PLA @X-Plus 3 0.6 nozzle
default_print_profile = 0.30mm Fine @X-Plus 3 0.6 nozzle
max_layer_height = 0.42
min_layer_height = 0.12
nozzle_diameter = 0.6
printer_variant = 0.6
retract_before_travel = 3
retract_length = 1.4
[printer:X-Plus 3 0.8 nozzle]
inherits = *X-Plus 3*
default_filament_profile = Generic PLA @X-Plus 3 0.8 nozzle
default_print_profile = 0.40mm Fine @X-Plus 3 0.8 nozzle
max_layer_height = 0.56
min_layer_height = 0.16
nozzle_diameter = 0.8
printer_variant = 0.8
retract_length = 3
# X-smart 3 preset
[printer:*X-smart 3*]
inherits = *common*
@@ -1277,3 +1932,24 @@ retract_length = 0.4
inherits = *X-smart 3*
default_filament_profile = Generic PLA @X-smart 3 0.4 nozzle
default_print_profile = 0.20mm Fine @X-smart 3 0.4 nozzle
[printer:X-smart 3 0.6 nozzle]
inherits = *X-smart 3*
default_filament_profile = Generic PLA @X-smart 3 0.6 nozzle
default_print_profile = 0.30mm Fine @X-smart 3 0.6 nozzle
max_layer_height = 0.42
min_layer_height = 0.12
nozzle_diameter = 0.6
printer_variant = 0.6
retract_before_travel = 3
retract_length = 1.4
[printer:X-smart 3 0.8 nozzle]
inherits = *X-smart 3*
default_filament_profile = Generic PLA @X-smart 3 0.8 nozzle
default_print_profile = 0.40mm Fine @X-smart 3 0.8 nozzle
max_layer_height = 0.56
min_layer_height = 0.16
nozzle_diameter = 0.8
printer_variant = 0.8
retract_length = 3

View File

@@ -296,14 +296,20 @@
<div class="IntroduceBoard" board="X-MAX 3">
<div class="AutozoomImage"><img src="img/X-MAX3Poster.png"/></div>
<div class="IntroduceTextBold trans" tid="l0"></div>
<div class="IntroduceText">https://qidi3d.com/products/qidi-x-max-3</div>
</div>
<div class="IntroduceBoard" board="X-Plus 3">
<div class="AutozoomImage"><img src="img/X-Plus3Poster.png"/></div>
<div class="IntroduceTextBold trans" tid="l0"></div>
<div class="IntroduceText">https://qidi3d.com/products/qidi-x-plus-3</div>
</div>
<div class="IntroduceBoard" board="X-smart 3">
<div class="AutozoomImage"><img src="img/X-smart3Poster.png"/></div>
<div class="IntroduceTextBold trans" tid="l0"></div>
<div class="IntroduceText">https://qidi3d.com/products/qidi-x-smart-3</div>
</div>
<div class="IntroduceBoard" board="Filaments">
@@ -507,6 +513,8 @@
</tbody>
</table>
</div>
<div class="IntroduceTextBold trans" tid="l0"></div>
<div class="IntroduceText">https://qidi3d.com/collections/filaments</div>
</div>
<div class="IssueBoard" board="IssueReport">

View File

@@ -17,7 +17,8 @@
#include "FillConcentric.hpp"
#include "FillEnsuring.hpp"
#include "Polygon.hpp"
//w11
#define NARROW_INFILL_AREA_THRESHOLD 3
namespace Slic3r {
//static constexpr const float NarrowInfillAreaThresholdMM = 3.f;
@@ -112,7 +113,15 @@ struct SurfaceFill {
ExPolygons expolygons;
SurfaceFillParams params;
};
//w11
static bool is_narrow_infill_area(const ExPolygon &expolygon)
{
ExPolygons offsets = offset_ex(expolygon, -scale_(NARROW_INFILL_AREA_THRESHOLD));
if (offsets.empty())
return true;
return false;
}
static inline bool fill_type_monotonic(InfillPattern pattern)
{
return pattern == ipMonotonic || pattern == ipMonotonicLines;
@@ -313,7 +322,41 @@ std::vector<SurfaceFill> group_fills(const Layer &layer)
fill.params.pattern = ipEnsuring;
}
}
//w11
if (layer.object()->config().detect_narrow_internal_solid_infill) {
size_t surface_fills_size = surface_fills.size();
for (size_t i = 0; i < surface_fills_size; i++) {
if (surface_fills[i].surface.surface_type != stInternalSolid)
continue;
size_t expolygons_size = surface_fills[i].expolygons.size();
std::vector<size_t> narrow_expolygons_index;
narrow_expolygons_index.reserve(expolygons_size);
for (size_t j = 0; j < expolygons_size; j++)
if (is_narrow_infill_area(surface_fills[i].expolygons[j]))
narrow_expolygons_index.push_back(j);
if (narrow_expolygons_index.size() == 0) {
continue;
} else if (narrow_expolygons_index.size() == expolygons_size) {
// w11
surface_fills[i].params.pattern = ipConcentric;
} else {
params = surface_fills[i].params;
params.pattern = ipConcentric;
surface_fills.emplace_back(params);
surface_fills.back().region_id = surface_fills[i].region_id;
surface_fills.back().surface.surface_type = stInternalSolid;
surface_fills.back().surface.thickness = surface_fills[i].surface.thickness;
for (size_t j = 0; j < narrow_expolygons_index.size(); j++) {
surface_fills.back().expolygons.emplace_back(std::move(surface_fills[i].expolygons[narrow_expolygons_index[j]]));
}
for (int j = narrow_expolygons_index.size() - 1; j >= 0; j--) {
surface_fills[i].expolygons.erase(surface_fills[i].expolygons.begin() + narrow_expolygons_index[j]);
}
}
}
}
return surface_fills;
}

View File

@@ -14,7 +14,8 @@
#include "Polyline.hpp"
#include "SVG.hpp"
#include "libslic3r.h"
//w11
#include "../PrintConfig.hpp"
#include <algorithm>
#include <boost/log/trivial.hpp>
#include <functional>
@@ -292,9 +293,19 @@ ThickPolylines make_fill_polylines(
// svg.draw(to_lines(gaps_for_additional_filling), "green", scale_(0.2));
// svg.draw(vertical_lines, "black", scale_(0.1));
// svg.Close();
//w11
PrintObjectConfig config;
const coord_t threshold = scaled_spacing * 4.5;
for (ExPolygon &ex_poly : gaps_for_additional_filling) {
//w11
if (ex_poly.contour.length() < threshold && config.detect_narrow_internal_solid_infill) {
continue;
}
BoundingBox ex_bb = ex_poly.contour.bounding_box();
//w11
if ((ex_bb.size().x() < threshold || ex_bb.size().y() < threshold) && config.detect_narrow_internal_solid_infill) {
continue;
}
coord_t loops_count = (std::max(ex_bb.size().x(), ex_bb.size().y()) + scaled_spacing - 1) / scaled_spacing;
Polygons polygons = to_polygons(ex_poly);
Arachne::WallToolPaths wall_tool_paths(polygons, scaled_spacing, scaled_spacing, loops_count, 0, params.layer_height,

View File

@@ -3501,7 +3501,7 @@ std::string GCode::set_extruder(unsigned int extruder_id, double print_z)
return gcode;
}
//B41
std::string GCode::set_object_range(Print &print)
{
std::string gcode;
@@ -3558,6 +3558,10 @@ std::string GCode::set_object_range(Print &print)
Point center = contour.centroid();
char buffer[64];
std::replace(name.begin(), name.end(), ' ', '_');
std::replace(name.begin(), name.end(), '#', '_');
std::replace(name.begin(), name.end(), '*', '_');
std::replace(name.begin(), name.end(), ':', '_');
std::replace(name.begin(), name.end(), ';', '_');
gcode += (std::string("EXCLUDE_OBJECT_DEFINE NAME=") + name);
std::snprintf(buffer, sizeof(buffer) - 1, " CENTER=%.3f,%.3f", unscale<float>(center[0]), unscale<float>(center[1]));
gcode += buffer + std::string(" POLYGON=[");

View File

@@ -479,7 +479,8 @@ static std::vector<std::string> s_Preset_print_options {
"ooze_prevention", "standby_temperature_delta", "interface_shells", "extrusion_width", "first_layer_extrusion_width",
"perimeter_extrusion_width", "external_perimeter_extrusion_width", "infill_extrusion_width", "solid_infill_extrusion_width",
"top_infill_extrusion_width", "support_material_extrusion_width", "infill_overlap", "infill_anchor", "infill_anchor_max", "bridge_flow_ratio",
"elefant_foot_compensation", "xy_size_compensation", "threads", "resolution", "gcode_resolution", "wipe_tower", "wipe_tower_x", "wipe_tower_y",
//w12
"elefant_foot_compensation", "xy_size_compensation", "xy_contour_compensation", "xy_hole_compensation", "threads", "resolution", "gcode_resolution", "wipe_tower", "wipe_tower_x", "wipe_tower_y",
"wipe_tower_width", "wipe_tower_cone_angle", "wipe_tower_rotation_angle", "wipe_tower_brim_width", "wipe_tower_bridging", "single_extruder_multi_material_priming", "mmu_segmented_region_max_width",
"mmu_segmented_region_interlocking_depth", "wipe_tower_extruder", "wipe_tower_no_sparse_layers", "wipe_tower_extra_spacing", "compatible_printers", "compatible_printers_condition", "inherits",
"perimeter_generator", "wall_transition_length", "wall_transition_filter_deviation", "wall_transition_angle",
@@ -488,6 +489,8 @@ static std::vector<std::string> s_Preset_print_options {
,"first_layer_travel_speed"
//B37
,"first_layer_infill_speed"
//w11
,"detect_narrow_internal_solid_infill"
};
static std::vector<std::string> s_Preset_filament_options {

View File

@@ -379,6 +379,8 @@ private:
void slice_volumes();
// Has any support (not counting the raft).
//w12
ExPolygons _shrink_contour_holes(double contour_delta, double hole_delta, const ExPolygons &polys) const;
void detect_surfaces_type();
void process_external_surfaces();
void discover_vertical_shells();

View File

@@ -848,7 +848,8 @@ static PrintObjectRegions* generate_print_object_regions(
const PrintRegionConfig &default_region_config,
const Transform3d &trafo,
size_t num_extruders,
const float xy_size_compensation,
//w12
const float xy_contour_compensation,
const std::vector<unsigned int> &painting_extruders)
{
// Reuse the old object or generate a new one.
@@ -879,8 +880,9 @@ static PrintObjectRegions* generate_print_object_regions(
layer_ranges_regions.push_back({ range.layer_height_range, range.config });
}
//w12
const bool is_mm_painted = num_extruders > 1 && std::any_of(model_volumes.cbegin(), model_volumes.cend(), [](const ModelVolume *mv) { return mv->is_mm_painted(); });
update_volume_bboxes(layer_ranges_regions, out->cached_volume_ids, model_volumes, out->trafo_bboxes, is_mm_painted ? 0.f : std::max(0.f, xy_size_compensation));
update_volume_bboxes(layer_ranges_regions, out->cached_volume_ids, model_volumes, out->trafo_bboxes, is_mm_painted ? 0.f : std::max(0.f, xy_contour_compensation));
std::vector<PrintRegion*> region_set;
auto get_create_region = [&region_set, &all_regions](PrintRegionConfig &&config) -> PrintRegion* {
@@ -1403,7 +1405,8 @@ Print::ApplyStatus Print::apply(const Model &model, DynamicPrintConfig new_full_
m_default_region_config,
model_object_status.print_instances.front().trafo,
num_extruders,
print_object.is_mm_painted() ? 0.f : float(print_object.config().xy_size_compensation.value),
//w12
print_object.is_mm_painted() ? 0.f : float(print_object.config().xy_contour_compensation.value),
painting_extruders);
}
for (auto it = it_print_object; it != it_print_object_end; ++it)

View File

@@ -3386,7 +3386,7 @@ void PrintConfigDef::init_fff_params()
def->mode = comExpert;
def->set_default_value(new ConfigOptionInt(0));
def = this->add("xy_size_compensation", coFloat);
def = this->add("xy_size_compensation", coFloat);
def->label = L("XY Size Compensation");
def->category = L("Advanced");
def->tooltip = L("The object will be grown/shrunk in the XY plane by the configured value "
@@ -3395,6 +3395,26 @@ void PrintConfigDef::init_fff_params()
def->sidetext = L("mm");
def->mode = comExpert;
def->set_default_value(new ConfigOptionFloat(0));
//w12
def = this->add("xy_hole_compensation", coFloat);
def->label = L("X-Y hole compensation");
def->category = L("Advanced");
def->tooltip = L("Holes of object will be grown or shrunk in XY plane by the configured value. "
"Positive value makes holes bigger. Negative value makes holes smaller. "
"This function is used to adjust size slightly when the object has assembling issue");
def->sidetext = L("mm");
def->mode = comExpert;
def->set_default_value(new ConfigOptionFloat(0));
def = this->add("xy_contour_compensation", coFloat);
def->label = L("X-Y contour compensation");
def->category = L("Advanced");
def->tooltip = L("Contour of object will be grown or shrunk in XY plane by the configured value. "
"Positive value makes contour bigger. Negative value makes contour smaller. "
"This function is used to adjust size slightly when the object has assembling issue");
def->sidetext = L("mm");
def->mode = comExpert;
def->set_default_value(new ConfigOptionFloat(0));
def = this->add("z_offset", coFloat);
def->label = L("Z offset");
@@ -3519,6 +3539,16 @@ void PrintConfigDef::init_fff_params()
default: assert(false);
}
}
//w11
def = this->add("detect_narrow_internal_solid_infill", coBool);
def->label = L("Detect narrow internal solid infill");
def->category = L("Infill");
def->tooltip = L("This option will auto detect narrow internal solid infill area."
" If enabled, concentric pattern will be used for the area to speed printing up."
" Otherwise, rectilinear pattern is used defaultly.");
def->mode = comExpert;
def->set_default_value(new ConfigOptionBool(true));
}
void PrintConfigDef::init_extruder_option_keys()

View File

@@ -570,7 +570,12 @@ PRINT_CONFIG_CLASS_DEFINE(
// The rest
((ConfigOptionBool, thick_bridges))
((ConfigOptionFloat, xy_size_compensation))
//w12
((ConfigOptionFloat, xy_hole_compensation))
((ConfigOptionFloat, xy_contour_compensation))
((ConfigOptionBool, wipe_into_objects))
//w11
((ConfigOptionBool, detect_narrow_internal_solid_infill))
)
PRINT_CONFIG_CLASS_DEFINE(

View File

@@ -679,7 +679,10 @@ bool PrintObject::invalidate_state_by_config_options(
} else if (
opt_key == "elefant_foot_compensation"
|| opt_key == "support_material_contact_distance"
|| opt_key == "xy_size_compensation") {
//w12
|| opt_key == "xy_size_compensation"
|| opt_key == "xy_hole_compensation"
|| opt_key == "xy_contour_compensation") {
steps.emplace_back(posSlice);
} else if (opt_key == "support_material") {
steps.emplace_back(posSupportMaterial);

View File

@@ -151,7 +151,9 @@ static std::vector<VolumeSlices> slice_volumes_inner(
const size_t num_extruders = print_config.nozzle_diameter.size();
const bool is_mm_painted = num_extruders > 1 && std::any_of(model_volumes.cbegin(), model_volumes.cend(), [](const ModelVolume *mv) { return mv->is_mm_painted(); });
const auto extra_offset = is_mm_painted ? 0.f : std::max(0.f, float(print_object_config.xy_size_compensation.value));
//w12
//const auto extra_offset = is_mm_painted ? 0.f : std::max(0.f, float(print_object_config.xy_size_compensation.value));
const auto extra_offset = 0.f;
for (const ModelVolume *model_volume : model_volumes)
if (model_volume_needs_slicing(*model_volume)) {
@@ -728,7 +730,9 @@ void PrintObject::slice_volumes()
// If XY Size compensation is also enabled, notify the user that XY Size compensation
// would not be used because the object is multi-material painted.
if (m_config.xy_size_compensation.value != 0.f) {
//w12
//if (m_config.xy_size_compensation.value != 0.f) {
if (m_config.xy_hole_compensation.value != 0.f || m_config.xy_contour_compensation.value != 0.f) {
this->active_step_add_warning(
PrintStateBase::WarningLevel::CRITICAL,
_u8L("An object has enabled XY Size compensation which will not be used because it is also multi-material painted.\nXY Size "
@@ -746,6 +750,9 @@ void PrintObject::slice_volumes()
// Compensation value, scaled. Only applying the negative scaling here, as the positive scaling has already been applied during slicing.
const size_t num_extruders = print->config().nozzle_diameter.size();
const auto xy_compensation_scaled = (num_extruders > 1 && this->is_mm_painted()) ? scaled<float>(0.f) : scaled<float>(std::min(m_config.xy_size_compensation.value, 0.));
//w12
const auto xy_hole_scaled = (num_extruders > 1 && this->is_mm_painted()) ? scaled<float>(0.f) : scaled<float>(m_config.xy_hole_compensation.value);
const auto xy_contour_scaled = (num_extruders > 1 && this->is_mm_painted()) ? scaled<float>(0.f) : scaled<float>(m_config.xy_contour_compensation.value);
const float elephant_foot_compensation_scaled = (m_config.raft_layers == 0) ?
// Only enable Elephant foot compensation if printing directly on the print bed.
float(scale_(m_config.elefant_foot_compensation.value)) :
@@ -754,7 +761,9 @@ void PrintObject::slice_volumes()
ExPolygons lslices_1st_layer;
tbb::parallel_for(
tbb::blocked_range<size_t>(0, m_layers.size()),
[this, xy_compensation_scaled, elephant_foot_compensation_scaled, &lslices_1st_layer](const tbb::blocked_range<size_t>& range) {
//w12
//[this, xy_compensation_scaled, elephant_foot_compensation_scaled, &lslices_1st_layer](const tbb::blocked_range<size_t>& range) {
[this, xy_hole_scaled, xy_contour_scaled, elephant_foot_compensation_scaled, &lslices_1st_layer](const tbb::blocked_range<size_t>& range) {
for (size_t layer_id = range.begin(); layer_id < range.end(); ++ layer_id) {
m_print->throw_if_canceled();
Layer *layer = m_layers[layer_id];
@@ -767,7 +776,9 @@ void PrintObject::slice_volumes()
if (elfoot > 0) {
// Apply the elephant foot compensation and store the 1st layer slices without the Elephant foot compensation applied.
lslices_1st_layer = to_expolygons(std::move(layerm->m_slices.surfaces));
float delta = xy_compensation_scaled;
//w12
//float delta = xy_compensation_scaled;
float delta = 0.15;
if (delta > elfoot) {
delta -= elfoot;
elfoot = 0.f;
@@ -779,16 +790,45 @@ void PrintObject::slice_volumes()
(delta == 0.f) ? lslices_1st_layer : offset_ex(lslices_1st_layer, delta),
layerm->flow(frExternalPerimeter), unscale<double>(elfoot))),
stInternal);
if (xy_compensation_scaled < 0.f)
lslices_1st_layer = offset_ex(std::move(lslices_1st_layer), xy_compensation_scaled);
} else if (xy_compensation_scaled < 0.f) {
//w12
if (m_config.xy_size_compensation.value < 0.f)
lslices_1st_layer = offset_ex(std::move(lslices_1st_layer), m_config.xy_size_compensation.value);
lslices_1st_layer = to_expolygons(std::move(layerm->m_slices.surfaces));
if (xy_contour_scaled > 0 || xy_hole_scaled > 0) {
lslices_1st_layer = _shrink_contour_holes(std::max(0.f, xy_contour_scaled), std::max(0.f, xy_hole_scaled),
lslices_1st_layer);
}
if (xy_contour_scaled < 0 || xy_hole_scaled < 0) {
lslices_1st_layer = _shrink_contour_holes(std::min(0.f, xy_contour_scaled), std::min(0.f, xy_hole_scaled),
lslices_1st_layer);
}
layerm->m_slices.set(union_ex(Slic3r::elephant_foot_compensation(lslices_1st_layer,
layerm->flow(frExternalPerimeter),
unscale<double>(elfoot))),
stInternal);
} /*else (xy_compensation_scaled < 0.f) {
// Apply the XY compensation.
layerm->m_slices.set(
offset_ex(to_expolygons(std::move(layerm->m_slices.surfaces)), xy_compensation_scaled),
stInternal);
stInternal);*/
//w12
else {
if (xy_contour_scaled != 0.0f || xy_hole_scaled != 0.0f) {
ExPolygons expolygons = to_expolygons(std::move(layerm->m_slices.surfaces));
if (xy_contour_scaled > 0 || xy_hole_scaled > 0) {
expolygons = _shrink_contour_holes(std::max(0.f, xy_contour_scaled), std::max(0.f, xy_hole_scaled),
expolygons);
}
if (xy_contour_scaled < 0 || xy_hole_scaled < 0) {
expolygons = _shrink_contour_holes(std::min(0.f, xy_contour_scaled), std::min(0.f, xy_hole_scaled),
expolygons);
}
layerm->m_slices.set(std::move(expolygons), stInternal);
}
}
} else {
if (xy_compensation_scaled < 0.f || elfoot > 0.f) {
//w12
/* if (xy_compensation_scaled < 0.f || elfoot > 0.f) {
// Apply the negative XY compensation.
Polygons trimming;
static const float eps = float(scale_(m_config.slice_closing_radius.value) * 1.5);
@@ -800,7 +840,49 @@ void PrintObject::slice_volumes()
trimming = offset(layer->merged(float(SCALED_EPSILON)), xy_compensation_scaled - float(SCALED_EPSILON));
for (size_t region_id = 0; region_id < layer->m_regions.size(); ++ region_id)
layer->m_regions[region_id]->trim_surfaces(trimming);
}
}*/
float max_growth = std::max(xy_hole_scaled, xy_contour_scaled);
float min_growth = std::min(xy_hole_scaled, xy_contour_scaled);
ExPolygons merged_poly_for_holes_growing;
if (max_growth > 0) {
merged_poly_for_holes_growing = layer->merged(float(SCALED_EPSILON));
merged_poly_for_holes_growing = _shrink_contour_holes(std::max(0.f, xy_contour_scaled),
std::max(0.f, xy_hole_scaled),
union_ex(merged_poly_for_holes_growing));
Polygons processed;
for (size_t region_id = 0; region_id < layer->regions().size(); ++region_id) {
ExPolygons slices = to_expolygons(std::move(layer->m_regions[region_id]->m_slices.surfaces));
if (max_growth > 0.f) {
slices = intersection_ex(offset_ex(slices, max_growth), merged_poly_for_holes_growing);
}
if (region_id > 0)
slices = diff_ex(to_polygons(std::move(slices)), processed);
if (region_id + 1 < layer->regions().size())
polygons_append(processed, slices);
layer->m_regions[region_id]->m_slices.set(std::move(slices), stInternal);
}
}
if (min_growth < 0.f || elfoot > 0.f) {
ExPolygons trimming;
static const float eps = float(scale_(m_config.slice_closing_radius.value) * 1.5);
if (elfoot > 0.f) {
lslices_1st_layer = offset_ex(layer->merged(eps), -eps);
trimming = Slic3r::elephant_foot_compensation(lslices_1st_layer,
layer->m_regions.front()->flow(frExternalPerimeter),
unscale<double>(elfoot));
} else {
trimming = layer->merged(float(SCALED_EPSILON));
}
if (min_growth < 0.0f)
trimming = _shrink_contour_holes(std::min(0.f, xy_contour_scaled), std::min(0.f, xy_hole_scaled), trimming);
for (size_t region_id = 0; region_id < layer->regions().size(); ++region_id) {
ExPolygons contour_exp = to_expolygons(std::move(layer->regions()[region_id]->m_slices.surfaces));
layer->regions()[region_id]->m_slices.set(intersection_ex(contour_exp, to_polygons(trimming)), stInternal);
}
}
}
// Merge all regions' slices to get islands sorted topologically, chain them by a shortest path in separate index list
layer->make_slices();
@@ -821,7 +903,37 @@ void PrintObject::slice_volumes()
m_print->throw_if_canceled();
BOOST_LOG_TRIVIAL(debug) << "Slicing volumes - make_slices in parallel - end";
}
//w12
ExPolygons PrintObject::_shrink_contour_holes(double contour_delta, double hole_delta, const ExPolygons &polys) const
{
ExPolygons new_ex_polys;
for (const ExPolygon &ex_poly : polys) {
Polygons contours;
Polygons holes;
for (const Polygon &hole : ex_poly.holes) {
if (hole_delta != 0) {
for (Polygon &newHole : offset(hole, -hole_delta)) {
newHole.make_counter_clockwise();
holes.emplace_back(std::move(newHole));
}
} else {
holes.push_back(hole);
holes.back().make_counter_clockwise();
}
}
if (contour_delta != 0) {
Polygons new_contours = offset(ex_poly.contour, contour_delta);
if (new_contours.size() == 0)
continue;
contours.insert(contours.end(), std::make_move_iterator(new_contours.begin()), std::make_move_iterator(new_contours.end()));
} else {
contours.push_back(ex_poly.contour);
}
ExPolygons temp = diff_ex(union_(contours), union_(holes));
new_ex_polys.insert(new_ex_polys.end(), std::make_move_iterator(temp.begin()), std::make_move_iterator(temp.end()));
}
return union_ex(new_ex_polys);
}
std::vector<Polygons> PrintObject::slice_support_volumes(const ModelVolumeType model_volume_type) const
{
auto it_volume = this->model_object()->volumes.begin();

View File

@@ -181,6 +181,35 @@ void ConfigManipulation::update_print_fff_config(DynamicPrintConfig* config, con
m_support_material_overhangs_queried = false;
}
//w12
if (abs(config->option<ConfigOptionFloat>("xy_hole_compensation")->value) > 2) {
const wxString msg_text = _(L("This setting is only used for model size tunning with small value in some cases.\n"
"For example, when model size has small error and hard to be assembled.\n"
"For large size tuning, please use model scale function.\n\n"
"The value will be reset to 0."));
MessageDialog dialog(m_msg_dlg_parent, msg_text, "", wxICON_WARNING | wxOK);
DynamicPrintConfig new_conf = *config;
is_msg_dlg_already_exist = true;
dialog.ShowModal();
new_conf.set_key_value("xy_hole_compensation", new ConfigOptionFloat(0));
apply(config, &new_conf);
is_msg_dlg_already_exist = false;
}
if (abs(config->option<ConfigOptionFloat>("xy_contour_compensation")->value) > 2) {
const wxString msg_text = _(L("This setting is only used for model size tunning with small value in some cases.\n"
"For example, when model size has small error and hard to be assembled.\n"
"For large size tuning, please use model scale function.\n\n"
"The value will be reset to 0."));
MessageDialog dialog(m_msg_dlg_parent, msg_text, "", wxICON_WARNING | wxOK);
DynamicPrintConfig new_conf = *config;
is_msg_dlg_already_exist = true;
dialog.ShowModal();
new_conf.set_key_value("xy_contour_compensation", new ConfigOptionFloat(0));
apply(config, &new_conf);
is_msg_dlg_already_exist = false;
}
if (config->option<ConfigOptionPercent>("fill_density")->value == 100) {
const int fill_pattern = config->option<ConfigOptionEnum<InfillPattern>>("fill_pattern")->value;
if (bool correct_100p_fill = config->option_def("top_fill_pattern")->enum_def->enum_to_index(fill_pattern).has_value();

View File

@@ -1026,8 +1026,24 @@ MenuFactory::MenuFactory()
void MenuFactory::create_default_menu()
{
wxMenu* sub_menu = append_submenu_add_generic(&m_default_menu, ModelVolumeType::INVALID);
append_submenu(&m_default_menu, sub_menu, wxID_ANY, _L("Add Shape"), "", "add_part",
//Y17
wxMenu* menu = &m_default_menu;
append_menu_item(menu, wxID_ANY, _L("Select All"), _L("Selects all objects"),
[](wxCommandEvent&) { plater()->select_all(); }, "", nullptr,
[](){return (plater() != nullptr) && !plater()->model().objects.empty(); }, m_parent);
append_menu_item(menu, wxID_ANY, _L("Delete All"), _L("Deletes all objects"),
[](wxCommandEvent&) { plater()->reset(); }, "", nullptr,
[]() {return (plater() != nullptr) && !plater()->model().objects.empty(); }, m_parent);
append_menu_item(menu, wxID_ANY, _L("Arrange"), _L("Arrange all objects"),
[](wxCommandEvent&) { plater()->arrange(); }, "", nullptr,
[]() {return plater()->can_arrange(); }, m_parent);
m_default_menu.SetFirstSeparator();
wxMenu* sub_menu = append_submenu_add_generic(menu, ModelVolumeType::INVALID);
append_submenu(menu, sub_menu, wxID_ANY, _L("Add Shape"), "", "add_part",
[]() {return true; }, m_parent);
}
@@ -1296,9 +1312,14 @@ void MenuFactory::update_objects_menu()
void MenuFactory::update_default_menu()
{
const auto menu_item_id = m_default_menu.FindItem(_("Add Shape"));
if (menu_item_id != wxNOT_FOUND)
m_default_menu.Destroy(menu_item_id);
//Y17
for (auto& name : { _L("Select All"), _L("Delete All"), _L("Arrange"), _L("Add Shape") }) {
const auto menu_item_id = m_default_menu.FindItem(name);
if (menu_item_id != wxNOT_FOUND)
m_default_menu.Destroy(menu_item_id);
}
m_default_menu.DestroySeparators();
create_default_menu();
}

View File

@@ -320,10 +320,13 @@ void GLGizmoEmboss::create_volume(ModelVolumeType volume_type, const Vec2d &mous
m_raycast_manager.actualize(*obj, &cond, &meshes);
std::optional<RaycastManager::Hit> hit = ray_from_camera(m_raycast_manager, coor, camera, &cond);
Transform3d surface_trmat = create_transformation_onto_surface(Vec3d(mouse_pos.x(), mouse_pos.y(), 0.2),
DynamicPrintConfig *print_config = &wxGetApp().preset_bundle->prints.get_edited_preset().config;
double pa_first_layer_height = print_config->get_abs_value("first_layer_height");
double pa_layer_height = print_config->get_abs_value("layer_height");
Transform3d surface_trmat = create_transformation_onto_surface(Vec3d(mouse_pos.x(), mouse_pos.y(), pa_first_layer_height),
hit->normal,
priv::up_limit);
emboss_data.text_configuration.style.prop.emboss = 0.2;
emboss_data.text_configuration.style.prop.emboss = pa_layer_height;
emboss_data.text_configuration.style.prop.size_in_mm = 7;
const FontProp &font_prop = emboss_data.text_configuration.style.prop;

View File

@@ -55,11 +55,18 @@
#include <shlobj.h>
#endif // _WIN32
//B45
#include <regex>
#include <wx/regex.h>
namespace Slic3r {
namespace GUI {
wxDEFINE_EVENT(EVT_LOAD_URL, wxCommandEvent);
wxDEFINE_EVENT(EVT_LOAD_PRINTER_URL, wxCommandEvent);
int count = 0;
enum class ERescaleTarget
{
Mainframe,
@@ -743,6 +750,10 @@ void MainFrame::init_tabpanel()
#else
m_tabpanel->Bind(wxEVT_NOTEBOOK_PAGE_CHANGED, [this](wxBookCtrlEvent& e) {
#endif
//B45
#if defined(__WIN32__) || defined(__WXMAC__)
m_printer_view->PauseButton();
#endif
if (int old_selection = e.GetOldSelection();
old_selection != wxNOT_FOUND && old_selection < static_cast<int>(m_tabpanel->GetPageCount())) {
Tab* old_tab = dynamic_cast<Tab*>(m_tabpanel->GetPage(old_selection));
@@ -886,7 +897,34 @@ void MainFrame::create_preset_tabs()
else
#endif
m_tabpanel->AddPage(m_guide_view, _L("Guide"));
//B45
m_printer_view->SetUpdateHandler([this](wxCommandEvent &event) {
wxGetApp().get_tab(Preset::TYPE_PRINTER)->update_preset_choice();
wxGetApp().get_tab(Preset::TYPE_PRINTER)->update_btns_enabling();
wxGetApp().plater()->sidebar().update_presets(Preset::TYPE_PRINTER);
});
//m_printer_view->SetDeleteHandler([this](wxCommandEvent &event) {
// PresetBundle &preset_bundle = *wxGetApp().preset_bundle;
// const std::string &printer_name = preset_bundle.physical_printers.get_selected_full_printer_name();
// if (printer_name.empty())
// return false;
// wxString msg;
// //if (!note_string.IsEmpty())
// // msg += note_string + "\n";
// msg += format_wxstr(_L("Are you sure you want to delete \"%1%\" printer?"), printer_name);
// if (MessageDialog(this, msg, _L("Delete Physical Printer"), wxYES_NO | wxNO_DEFAULT | wxICON_QUESTION).ShowModal() != wxID_YES)
// return false;
// preset_bundle.physical_printers.delete_selected_printer();
//});
// #if defined(__WIN32__)
// m_tabpanel->Bind(wxCUSTOMEVT_NOTEBOOK_SEL_CHANGED, &MainFrame::OnTabPanelSelectionChanged, this);
// #endif
}
void MainFrame::add_created_tab(Tab* panel, const std::string& bmp_name /*= ""*/)
@@ -2097,23 +2135,141 @@ void MainFrame::select_tab(Tab* tab)
page_idx++;
select_tab(size_t(page_idx));
}
//B45
// void MainFrame::OnTabPanelSelectionChanged(wxCommandEvent &event)
// {
// m_printer_view->PauseButton();
// event.Skip();
// }
//B4
//B45
void MainFrame::select_tab(size_t tab/* = size_t(-1)*/)
{
bool tabpanel_was_hidden = false;
// Controls on page are created on active page of active tab now.
// We should select/activate tab before its showing to avoid an UI-flickering
//B45
auto select = [this, tab](bool was_hidden) {
// when tab == -1, it means we should show the last selected tab
size_t new_selection = tab == (size_t)(-1) ? m_last_selected_tab : (m_layout == ESettingsLayout::Dlg && tab != 0) ? tab - 1 : tab;
//B4
if (m_tabpanel->GetSelection() == 4) {
// B45
PresetBundle &preset_bundle = *wxGetApp().preset_bundle;
const PhysicalPrinterCollection &ph_printers = preset_bundle.physical_printers;
struct PhysicalPrinterPresetData
{
wxString lower_name; // just for sorting
wxString name; // preset_name
wxString fullname; // full name
bool selected; // is selected
std::string model_id;
};
std::vector<PhysicalPrinterPresetData> preset_data;
for (PhysicalPrinterCollection::ConstIterator it = ph_printers.begin(); it != ph_printers.end(); ++it) {
for (const std::string &preset_name : it->get_preset_names()) {
Preset *preset = wxGetApp().preset_bundle->printers.find_preset(preset_name);
if (preset != nullptr) {
std::string model_id = preset->config.opt_string("printer_model");
preset_data.push_back({wxString::FromUTF8(it->get_full_name(preset_name)).Lower(), wxString::FromUTF8(preset_name),
wxString::FromUTF8(it->get_full_name(preset_name)), ph_printers.is_selected(it, preset_name),
model_id});
}
}
}
m_collection = &preset_bundle.printers;
std::vector<const PhysicalPrinterPresetData *> missingPresets;
std::vector<MachineListButton *> m_buttons = (m_printer_view->GetButton());
for (auto it = m_buttons.begin(); it != m_buttons.end();) {
bool foundPreset = false;
for (const PhysicalPrinterPresetData &data : preset_data) {
if ((*it)->getLabel() == data.fullname) {
foundPreset = true;
break;
}
}
if (!foundPreset) {
(*it)->StopStatusThread();
delete *it;
it = m_buttons.erase(it);
m_printer_view->SetButtons(m_buttons);
m_printer_view->UpdateLayout();
} else {
++it;
}
}
for (const PhysicalPrinterPresetData &data : preset_data) {
bool foundButton = false;
for (MachineListButton *button : m_buttons) {
if (button->getLabel() == data.fullname) {
foundButton = true;
break;
}
}
if (!foundButton) {
missingPresets.push_back(&data);
}
}
for (const PhysicalPrinterPresetData *data : missingPresets) {
Preset *preset = m_collection->find_preset((data->name).ToStdString());
if (!preset || !preset->is_visible)
continue;
wxStringTokenizer tokenizer((data->fullname), "*");
std::string tem_name = (into_u8(tokenizer.GetNextToken().Trim().mb_str()));
auto * printer = preset_bundle.physical_printers.find_printer(tem_name);
if (printer != nullptr) {
wxString host = (printer->config.opt_string("print_host"));
std::regex ipRegex(R"(\b(?:\d{1,3}\.){3}\d{1,3}\b)");
bool isValidIPAddress = std::regex_match(host.ToStdString(), ipRegex);
DynamicPrintConfig *cfg_t = &(printer->config);
wxStringTokenizer tokenizer3((data->lower_name), wxT("*"), wxTOKEN_RET_EMPTY_ALL);
wxString printer_name = tokenizer3.GetNextToken();
if (isValidIPAddress) {
m_printer_view->AddButton(
printer_name, host, (data->model_id), (data->fullname),
[host, this](wxMouseEvent &event) {
wxString formattedHost = wxString::Format("http://%s", host);
if (!host.Lower().starts_with("http"))
wxString formattedHost = wxString::Format("http://%s", host);
if (!formattedHost.Lower().ends_with("10088"))
formattedHost = wxString::Format("%s:10088", formattedHost);
this->m_printer_view->load_url(formattedHost);
},
(data->selected), cfg_t);
}
}
}
#if defined(__WIN32__) || defined(__WXMAC__)
m_printer_view->ResumeButton();
#endif
if (const DynamicPrintConfig *cfg = wxGetApp().preset_bundle->physical_printers.get_selected_printer_config(); cfg) {
PresetBundle & preset_bundle = *wxGetApp().preset_bundle;
const PhysicalPrinter &pp = preset_bundle.physical_printers.get_selected_printer();
wxString host = pp.config.opt_string("print_host");
if (host.empty()) {
//B45
std::regex ipRegex(R"(\b(?:\d{1,3}\.){3}\d{1,3}\b)");
bool isValidIPAddress = std::regex_match(host.ToStdString(), ipRegex);
if (host.empty() || !isValidIPAddress) {
tem_host = "";
host = wxString::Format("file://%s/web/qidi/missing_connection.html", from_u8(resources_dir()));
}
@@ -2124,10 +2280,10 @@ void MainFrame::select_tab(size_t tab/* = size_t(-1)*/)
host = wxString::Format("%s:10088", host);
}
if (tem_host != host) {
//B45
m_printer_view->load_url(host);
tem_host = host;
}
} else {
tem_host = "";
wxString url = wxString::Format("file://%s/web/qidi/missing_connection.html", from_u8(resources_dir()));

View File

@@ -196,6 +196,9 @@ public:
// When tab == -1, will be selected last selected tab
void select_tab(Tab* tab);
void select_tab(size_t tab = size_t(-1));
//B45
//void OnTabPanelSelectionChanged(wxCommandEvent &event);
void select_view(const std::string& direction);
// Propagate changed configuration from the Tab to the Plater and save changes to the AppConfig
void on_config_changed(DynamicPrintConfig* cfg) const ;
@@ -220,6 +223,10 @@ public:
PrinterWebView * m_printer_view{nullptr};
//B28
GuideWebView * m_guide_view{nullptr};
//B45
PresetCollection *m_collection{nullptr};
wxBookCtrlBase * m_tabpanel{nullptr};
SettingsDialog m_settings_dialog;
DiffPresetDialog diff_dialog;

View File

@@ -12,17 +12,185 @@
#include <slic3r/GUI/Widgets/WebView.hpp>
#include "PhysicalPrinterDialog.hpp"
//B45
#include <wx/regex.h>
#include <boost/regex.hpp>
namespace pt = boost::property_tree;
namespace Slic3r {
namespace GUI {
wxBEGIN_EVENT_TABLE(MachineListButton, wxButton) EVT_PAINT(MachineListButton::OnPaint) EVT_ENTER_WINDOW(MachineListButton::OnMouseEnter)
EVT_LEAVE_WINDOW(MachineListButton::OnMouseLeave) EVT_LEFT_DOWN(MachineListButton::OnMouseLeftDown) EVT_LEFT_UP(MachineListButton::OnMouseLeftUp)
wxEND_EVENT_TABLE()
void MachineListButton::OnPaint(wxPaintEvent &event)
{
wxPaintDC dc(this);
//m_bitmap = get_bmp_bundle("X-MAX 3_thumbnail", 80)->GetBitmapFor(this);
if (m_isSimpleMode) {
dc.SetFont(wxFont(15, wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD));
dc.SetTextForeground(wxColour(230, 230, 230));
dc.DrawText(m_name_text, 10 , 10);
//wxSize textSize = dc.GetTextExtent(m_name_text);
//int x = (dc.GetSize().GetWidth() - textSize.GetWidth()) / 2;
//int y = (dc.GetSize().GetHeight() - textSize.GetHeight()) / 2;
//dc.DrawText(m_name_text, x, y);
} else {
dc.DrawBitmap(m_bitmap, 10, (GetSize().GetHeight() - m_bitmap.GetHeight()) / 2, true);
dc.SetFont(wxFont(15, wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD));
dc.SetTextForeground(wxColour(230, 230, 230));
dc.DrawText(m_name_text, 10 + m_bitmap.GetWidth() + 10, 10);
dc.SetFont(wxFont(10, wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD));
dc.SetTextForeground(wxColour(174, 174, 174));
dc.DrawText("IP:" + m_ip_text, 10 + m_bitmap.GetWidth() + 10, 40);
wxBitmap m_bitmap_state = get_bmp_bundle("printer_state", 20)->GetBitmapFor(this);
dc.DrawBitmap(m_bitmap_state, 10 + m_bitmap.GetWidth() + 10, 55, true);
dc.SetFont(wxFont(10, wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD));
dc.SetTextForeground(wxColour(174, 174, 174));
dc.DrawText(m_state_text, 10 + m_bitmap.GetWidth() + m_bitmap_state.GetWidth() + 15, 60);
if (m_state_text == "printing") {
dc.SetFont(wxFont(10, wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD));
dc.SetTextForeground(wxColour(33, 148, 239));
dc.DrawText(m_progress_text, 10 + m_bitmap.GetWidth() + m_bitmap_state.GetWidth() + 77, 62);
}
}
}
void MachineListButton::OnMouseEnter(wxMouseEvent &event)
{
SetBackgroundColour(wxColour(100, 100, 105));
Refresh();
}
void MachineListButton::OnMouseLeave(wxMouseEvent &event)
{
if (m_isSelected)
SetBackgroundColour(wxColour(100, 100, 105));
else
SetBackgroundColour(wxColour(67, 67, 71));
Refresh();
}
void MachineListButton::OnMouseLeftDown(wxMouseEvent &event)
{
SetBackgroundColour(wxColour(120, 120, 125));
Refresh();
}
void MachineListButton::OnMouseLeftUp(wxMouseEvent &event)
{
SetBackgroundColour(wxColour(100, 100, 105));
if (m_handlerl) {
m_handlerl(event);
}
Refresh();
}
//B45
PrinterWebView::PrinterWebView(wxWindow *parent)
: wxPanel(parent, wxID_ANY, wxDefaultPosition, wxDefaultSize)
{
wxBoxSizer* topsizer = new wxBoxSizer(wxVERTICAL);
// Create the webview
#if defined(__WIN32__) || defined(__WXMAC__)
int leftsizerWidth = 300;
#else
int leftsizerWidth = 210;
#endif
topsizer = new wxBoxSizer(wxHORIZONTAL);
leftScrolledWindow = new wxScrolledWindow(this, wxID_ANY);
leftScrolledWindow->SetBackgroundColour(wxColour(45, 45, 48));
leftsizer = new wxBoxSizer(wxVERTICAL);
wxFont font(wxFontInfo().Bold());
wxBoxSizer *titlesizer = new wxBoxSizer(wxHORIZONTAL);
text_static = new wxStaticText(leftScrolledWindow, wxID_ANY, "MACHINE LIST", wxDefaultPosition, wxDefaultSize);
text_static->SetForegroundColour(wxColour(255, 255, 255));
text_static->SetFont(wxFont(wxFontInfo(18).Bold()));
#if defined __linux__
text_static->SetMinSize(wxSize(200, 40));
text_static->SetFont(wxFont(wxFontInfo(12).Bold()));
#endif
titlesizer->Add(text_static, wxSizerFlags().Align(wxALIGN_LEFT).Border(wxALL, 5));
titlesizer->AddStretchSpacer();
wxBoxSizer *buttonsizer = new wxBoxSizer(wxHORIZONTAL);
//wxBU_EXACTFIT wxBORDER_NONE
#if defined(__WIN32__) || defined(__WXMAC__)
wxButton *add_button = new wxButton(leftScrolledWindow, wxID_ANY, "", wxDefaultPosition, wxSize(20, 20), wxBORDER_NONE);
add_button->SetBackgroundColour(wxColour(100, 100, 105));
//add_button->SetForegroundColour(leftScrolledWindow->GetBackgroundColour());
add_button->SetMinSize(wxSize(40, -1));
add_button->SetBitmap(*get_bmp_bundle("add_machine_list", 20));
buttonsizer->Add(add_button, wxSizerFlags().Align(wxALIGN_LEFT).CenterVertical().Border(wxALL, 2));
add_button->Bind(wxEVT_BUTTON, &PrinterWebView::OnAddButtonClick, this);
wxButton *delete_button = new wxButton(leftScrolledWindow, wxID_ANY, "", wxDefaultPosition, wxSize(20, 20), wxBORDER_NONE);
delete_button->SetBackgroundColour(wxColour(100, 100, 105));
//delete_button->SetForegroundColour(leftScrolledWindow->GetBackgroundColour());
delete_button->SetMinSize(wxSize(40, -1));
delete_button->SetBitmap(*get_bmp_bundle("delete_machine_list", 20));
buttonsizer->Add(delete_button, wxSizerFlags().Align(wxALIGN_LEFT).CenterVertical().Border(wxALL, 2));
delete_button->Bind(wxEVT_BUTTON, &PrinterWebView::OnDeleteButtonClick, this);
wxButton *edit_button = new wxButton(leftScrolledWindow, wxID_ANY, "", wxDefaultPosition, wxSize(20, 20), wxBORDER_NONE);
edit_button->SetBackgroundColour(wxColour(100, 100, 105));
//edit_button->SetForegroundColour(leftScrolledWindow->GetBackgroundColour());
edit_button->SetMinSize(wxSize(40, -1));
edit_button->SetBitmap(*get_bmp_bundle("edit_machine_list", 20));
buttonsizer->Add(edit_button, wxSizerFlags().Align(wxALIGN_LEFT).CenterVertical().Border(wxALL, 2));
edit_button->Bind(wxEVT_BUTTON, &PrinterWebView::OnEditButtonClick, this);
wxButton *refresh_button = new wxButton(leftScrolledWindow, wxID_ANY, "", wxDefaultPosition, wxSize(20, 20), wxBORDER_NONE);
refresh_button->SetBackgroundColour(wxColour(100, 100, 105));
//refresh_button->SetForegroundColour(leftScrolledWindow->GetBackgroundColour());
refresh_button->SetMinSize(wxSize(40, -1));
refresh_button->SetBitmap(*get_bmp_bundle("refresh-line", 20));
buttonsizer->Add(refresh_button, wxSizerFlags().Align(wxALIGN_LEFT).CenterVertical().Border(wxALL, 2));
refresh_button->Bind(wxEVT_BUTTON, &PrinterWebView::OnRightButtonClick, this);
arrow_button = new wxButton(leftScrolledWindow, wxID_ANY, "", wxDefaultPosition, wxSize(20, 20), wxBORDER_NONE);
arrow_button->SetFont(font);
arrow_button->SetBackgroundColour(leftScrolledWindow->GetBackgroundColour());
arrow_button->SetForegroundColour(leftScrolledWindow->GetBackgroundColour());
arrow_button->SetMinSize(wxSize(40, -1));
arrow_button->SetBitmap(*get_bmp_bundle("arrow-left-s-line", 20));
titlesizer->Add(arrow_button, wxSizerFlags().Align(wxALIGN_LEFT).CenterVertical().Border(wxALL, 2));
arrow_button->Bind(wxEVT_BUTTON, &PrinterWebView::OnLeftButtonClick, this);
#endif
titlesizer->Layout();
buttonsizer->Layout();
leftsizer->Add(titlesizer, wxSizerFlags().Expand().Align(wxALIGN_TOP).Border(wxALL, 0));
leftsizer->Add(buttonsizer, wxSizerFlags().Expand().Align(wxALIGN_TOP).Border(wxALL, 0));
leftsizer->Layout();
leftScrolledWindow->SetSizer(leftsizer);
leftScrolledWindow->SetScrollRate(10, 10);
leftScrolledWindow->SetMinSize(wxSize(leftsizerWidth, -1));
leftScrolledWindow->FitInside();
m_browser = WebView::CreateWebView(this, "");
if (m_browser == nullptr) {
wxLogError("Could not init m_browser");
@@ -31,33 +199,395 @@ PrinterWebView::PrinterWebView(wxWindow *parent)
SetSizer(topsizer);
topsizer->Add(m_browser, wxSizerFlags().Expand().Proportion(1));
topsizer->Add(leftScrolledWindow, wxSizerFlags(0).Expand());
topsizer->Add(m_browser, wxSizerFlags(1).Expand().Border(wxALL, 0));
// Log backend information
//if (wxGetApp().get_mode() == comDevelop) {
// wxLogMessage(wxWebView::GetBackendVersionInfo().ToString());
// wxLogMessage("Backend: %s Version: %s", m_browser->GetClassInfo()->GetClassName(),
// wxWebView::GetBackendVersionInfo().ToString());
// wxLogMessage("User Agent: %s", m_browser->GetUserAgent());
//}
//Zoom
// Zoom
m_zoomFactor = 100;
leftScrolledWindow->Bind(wxEVT_SCROLLWIN_TOP, &PrinterWebView::OnScroll, this);
leftScrolledWindow->Bind(wxEVT_SCROLLWIN_BOTTOM, &PrinterWebView::OnScroll, this);
leftScrolledWindow->Bind(wxEVT_SCROLLWIN_LINEUP, &PrinterWebView::OnScroll, this);
leftScrolledWindow->Bind(wxEVT_SCROLLWIN_LINEDOWN, &PrinterWebView::OnScroll, this);
leftScrolledWindow->Bind(wxEVT_SCROLLWIN_PAGEUP, &PrinterWebView::OnScroll, this);
leftScrolledWindow->Bind(wxEVT_SCROLLWIN_PAGEDOWN, &PrinterWebView::OnScroll, this);
//B45
Bind(wxEVT_WEBVIEW_SCRIPT_MESSAGE_RECEIVED, &PrinterWebView::OnScriptMessage, this);
//Connect the idle events
Bind(wxEVT_CLOSE_WINDOW, &PrinterWebView::OnClose, this);
}
PrinterWebView::~PrinterWebView()
{
BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << " Start";
SetEvtHandlerEnabled(false);
BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << " End";
void PrinterWebView::AddButton(const wxString & device_name,
const wxString & ip,
const wxString & machine_type,
const wxString & fullname,
const std::function<void(wxMouseEvent &)> &handler,
bool isSelected,
DynamicPrintConfig * cfg_t)
{
wxString Machine_Name = Machine_Name.Format("%s%s", machine_type, "_thumbnail");
MachineListButton *customButton = new MachineListButton(leftScrolledWindow, wxID_ANY, device_name,
fullname,
wxDefaultPosition,
wxDefaultSize, wxBU_LEFT,
wxDefaultValidator, wxButtonNameStr, isSelected);
//customButton->SetMinSize(wxSize(80, -1));
#if defined(__WIN32__) || defined(__WXMAC__)
customButton->SetBitmap(*get_bmp_bundle(std::string(Machine_Name.mb_str()), 80));
#endif
customButton->SetBitMap(get_bmp_bundle(std::string(Machine_Name.mb_str()), 80)->GetBitmapFor(this));
customButton->SetForegroundColour(wxColour(255, 255, 255));
customButton->SetNameText(device_name);
customButton->SetIPText(ip);
customButton->SetStateText("standby");
customButton->SetProgressText("(0%)");
//customButton->SetMinSize(wxSize(200, -1));
customButton->SetClickHandler(handler);
#if defined(__WIN32__) || defined(__WXMAC__)
customButton->SetStatusThread(std::move(customButton->CreatThread(device_name,ip, cfg_t)));
#else
customButton->SetSize(wxSize(200, -1));
#endif
customButton->SetSimpleMode(false);
leftsizer->Add(customButton, wxSizerFlags().Border(wxALL, 1).Expand());
leftsizer->Layout();
m_buttons.push_back(customButton);
}
//B45
void PrinterWebView::PauseButton()
{
//BOOST_LOG_TRIVIAL(error) << " Pause";
if (m_buttons.empty()) {
BOOST_LOG_TRIVIAL(info) << " empty";
} else {
for (MachineListButton *button : m_buttons) {
button->PauseStatusThread();
}
}
}
//B45
void PrinterWebView::ResumeButton()
{
//BOOST_LOG_TRIVIAL(error) << " Resume";
if (m_buttons.empty()) {
BOOST_LOG_TRIVIAL(info) << " empty";
} else {
for (MachineListButton *button : m_buttons) {
button->ResumeStatusThread();
}
}
}
// B45
void PrinterWebView::UnSelectedButton()
{
// BOOST_LOG_TRIVIAL(error) << " Resume";
if (m_buttons.empty()) {
BOOST_LOG_TRIVIAL(info) << " empty";
} else {
for (MachineListButton *button : m_buttons) {
button->SetSelect(false);
}
}
}
//B45
void PrinterWebView::DeleteButton()
{
if (m_buttons.empty()) {
BOOST_LOG_TRIVIAL(info) <<" empty";
} else {
for (MachineListButton *button : m_buttons) {
button->StopStatusThread();
delete button;
}
m_buttons.clear();
}
}
// B45
void PrinterWebView::SetButtons(std::vector<MachineListButton *> buttons) { m_buttons = buttons; }
PrinterWebView::~PrinterWebView()
{
BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << " Start";
SetEvtHandlerEnabled(false);
BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << " End";
}
void PrinterWebView::OnLeftButtonClick(wxCommandEvent &event)
{
m_isSimpleMode = !m_isSimpleMode;
if (!m_isSimpleMode) {
leftsizer->SetMinSize(wxSize(300, -1));
leftScrolledWindow->SetMinSize(wxSize(300, -1));
arrow_button->SetBitmap(*get_bmp_bundle("arrow-left-s-line", 20));
text_static->SetFont(wxFont(wxFontInfo(18).Bold()));
for (MachineListButton *button : m_buttons) {
button->SetBitmap(*get_bmp_bundle(std::string("X-MAX 3_thumbnail"), 80));
button->SetSimpleMode(m_isSimpleMode);
button->SetSize(wxSize(300, -1));
}
}
else {
arrow_button->SetBitmap(*get_bmp_bundle("arrow-right-s-line", 20));
leftsizer->SetMinSize(wxSize(210, -1));
leftScrolledWindow->SetMinSize(wxSize(210, -1));
text_static->SetFont(wxFont(wxFontInfo(12).Bold()));
for (MachineListButton *button : m_buttons) {
button->SetBitmap(*get_bmp_bundle(std::string("X-MAX 3_thumbnail"), 30));
button->SetSimpleMode(m_isSimpleMode);
button->SetSize(wxSize(200, -1));
}
}
leftsizer->Layout();
leftScrolledWindow->Layout();
topsizer->Layout();
//UpdateLayout();
}
void PrinterWebView::OnRightButtonClick(wxCommandEvent &event)
{
for (MachineListButton *button : m_buttons) {
button->ResumeStatusThread();
}
}
void PrinterWebView::OnAddButtonClick(wxCommandEvent &event)
{
PhysicalPrinterDialog dlg(this->GetParent(), wxEmptyString);
if (dlg.ShowModal() == wxID_OK) {
if (m_handlerl) {
m_handlerl(event);
}
PresetBundle &preset_bundle = *wxGetApp().preset_bundle;
auto printer = preset_bundle.physical_printers.get_selected_printer();
std::string printer_name = printer.name;
wxString host = printer.config.opt_string("print_host");
wxString formattedHost = wxString::Format("http://%s", host);
if (!host.Lower().starts_with("http"))
wxString formattedHost = wxString::Format("http://%s", host);
if (!formattedHost.Lower().ends_with("10088"))
formattedHost = wxString::Format("%s:10088", formattedHost);
std::string fullname = preset_bundle.physical_printers.get_selected_full_printer_name();
std::string preset_name = printer.get_preset_name(fullname);
Preset * preset = wxGetApp().preset_bundle->printers.find_preset(preset_name);
std::string model_id = "X-MAX 3";
if (preset != nullptr) {
model_id = preset->config.opt_string("printer_model");
}
boost::regex ipRegex(R"(\b(?:\d{1,3}\.){3}\d{1,3}\b)");
bool isValidIPAddress = boost::regex_match(host.ToStdString(), ipRegex);
DynamicPrintConfig *cfg_t = &(printer.config);
UnSelectedButton();
if (isValidIPAddress)
AddButton(
printer_name, host, model_id, fullname,
[formattedHost, this](wxMouseEvent &event) {
wxString host = formattedHost;
load_url(host);
},
true, cfg_t);
load_url(formattedHost);
UpdateLayout();
Refresh();
}
}
void PrinterWebView::OnDeleteButtonClick(wxCommandEvent &event) {
PresetBundle &preset_bundle = *wxGetApp().preset_bundle;
for (MachineListButton *button : m_buttons) {
if ((button->GetSelected())) {
wxString msg;
//if (!note_string.IsEmpty())
// msg += note_string + "\n";
#if defined(__WIN32__) || defined(__WXMAC__)
msg += format_wxstr(_L("Are you sure you want to delete \"%1%\" printer?"), (button->getLabel()));
#else
msg += _L("Are you sure you want to delete ") + (button->getLabel()) + _L("printer?");
#endif
if (MessageDialog(this, msg, _L("Delete Physical Printer"), wxYES_NO | wxNO_DEFAULT | wxICON_QUESTION).ShowModal() != wxID_YES)
return ;
button->StopStatusThread();
preset_bundle.physical_printers.select_printer((button->getLabel()).ToStdString());
preset_bundle.physical_printers.delete_selected_printer();
auto it = std::find(m_buttons.begin(), m_buttons.end(), button);
delete button;
if (it != m_buttons.end()) {
m_buttons.erase(it);
}
leftsizer->Detach(button);
if (!m_buttons.empty())
for (MachineListButton *button : m_buttons) {
button->SetSelect(true);
wxString formattedHost = wxString::Format("http://%s:10088", button->getIPLabel());
load_url(formattedHost);
preset_bundle.physical_printers.select_printer((button->getLabel()).ToStdString());
break;
}
else {
wxString host = wxString::Format("file://%s/web/qidi/missing_connection.html", from_u8(resources_dir()));
load_url(host);
}
UpdateLayout();
Refresh();
break;
}
}
if (m_handlerl) {
m_handlerl(event);
}
}
void PrinterWebView::OnEditButtonClick(wxCommandEvent &event) {
for (MachineListButton *button : m_buttons) {
if ((button->GetSelected())) {
PhysicalPrinterDialog dlg(this->GetParent(), (wxString::FromUTF8((button->getLabel()).ToStdString())));
//BOOST_LOG_TRIVIAL(error) << __FUNCTION__ << (button->getLabel());
//BOOST_LOG_TRIVIAL(error) << __FUNCTION__ << wxString::FromUTF8((button->getLabel()).ToStdString());
if (dlg.ShowModal() == wxID_OK) {
if (m_handlerl) {
m_handlerl(event);
}
PresetBundle &preset_bundle = *wxGetApp().preset_bundle;
auto printer = preset_bundle.physical_printers.get_selected_printer();
std::string printer_name = printer.name;
wxString host = printer.config.opt_string("print_host");
std::string fullname = preset_bundle.physical_printers.get_selected_full_printer_name();
std::string preset_name = printer.get_preset_name(fullname);
Preset * preset = wxGetApp().preset_bundle->printers.find_preset(preset_name);
std::string model_id = "X-MAX 3";
if (preset != nullptr) {
model_id = preset->config.opt_string("printer_model");
}
DynamicPrintConfig *cfg_t = &(printer.config);
button->SetNameText((wxString::FromUTF8(printer_name)));
button->SetIPText(host);
button->SetLabel(fullname);
wxString Machine_Name = Machine_Name.Format("%s%s", model_id, "_thumbnail");
button->SetBitMap(get_bmp_bundle(std::string(Machine_Name.mb_str()), 80)->GetBitmapFor(this));
UpdateLayout();
Refresh();
}
break;
}
}
}
//void PrinterWebView::SendRecentList(int images)
//{
// boost::property_tree::wptree req;
// boost::property_tree::wptree data;
// //wxGetApp().mainframe->get_recent_projects(data, images);
// req.put(L"sequence_id", "");
// req.put(L"command", L"studio_set_mallurl");
// //req.put_child(L"response", data);
// std::wostringstream oss;
// pt::write_json(oss, req, false);
// RunScript(wxString::Format("window.postMessage(%s)", oss.str()));
//}
void PrinterWebView::OnScriptMessage(wxWebViewEvent &evt)
{
wxLogMessage("Script message received; value = %s, handler = %s", evt.GetString(), evt.GetMessageHandler());
//std::string response = wxGetApp().handle_web_request(evt.GetString().ToUTF8().data());
//if (response.empty())
// return;
//SendRecentList(1);
///* remove \n in response string */
//response.erase(std::remove(response.begin(), response.end(), '\n'), response.end());
//if (!response.empty()) {
// m_response_js = wxString::Format("window.postMessage('%s')", response);
// wxCommandEvent *event = new wxCommandEvent(EVT_RESPONSE_MESSAGE, this->GetId());
// wxQueueEvent(this, event);
//} else {
// m_response_js.clear();
//}
}
void PrinterWebView::UpdateLayout()
{
//leftScrolledWindow->SetVirtualSize(leftsizer->GetMinSize());
leftsizer->Layout();
leftScrolledWindow->Layout();
leftScrolledWindow->FitInside();
topsizer->Layout();
if (!m_buttons.empty()) {
for (MachineListButton *button : m_buttons) {
button->Layout();
button->Refresh();
}
}
}
void PrinterWebView::OnScroll(wxScrollWinEvent &event)
{
UpdateLayout();
event.Skip();
}
//B45
void PrinterWebView::load_url(wxString& url)
{
// this->Show();
@@ -65,6 +595,25 @@ void PrinterWebView::load_url(wxString& url)
if (m_browser == nullptr)
return;
m_browser->LoadURL(url);
url.Remove(0, 7);
url.Remove(url.length() - 6);
for (MachineListButton *button : m_buttons) {
if (url == (button->getIPLabel()))
button->SetSelect(true);
else
button->SetSelect(false);
}
//const char *data = "Hello from C++!";
//std::string switch_dark_mode_script = "SwitchDarkMode(";
//switch_dark_mode_script += wxGetApp().app_config->get("dark_color_mode") == "1" ? "true" : "false";
//switch_dark_mode_script += ");";
//RunScript("var valueFromCpp = '" + std::string(data) + "';");
//m_browser->RunScript(switch_dark_mode_script);
//m_browser->SetFocus();
UpdateState();
}
@@ -82,6 +631,14 @@ void PrinterWebView::OnClose(wxCloseEvent& evt)
this->Hide();
}
void PrinterWebView::RunScript(const wxString &javascript)
{
// Remember the script we run in any case, so the next time the user opens
// the "Run Script" dialog box, it is shown there for convenient updating.
WebView::RunScript(m_browser, javascript);
}
} // GUI

View File

@@ -26,14 +26,188 @@
#include <wx/timer.h>
//B35
//B45
#if defined __linux__
#include <boost/log/trivial.hpp>
#include <wx/wx.h>
#include <thread>
#include <boost/format.hpp>
#endif
//B45
#include "PrintHostDialogs.hpp"
#include <wx/tokenzr.h>
namespace Slic3r {
namespace GUI {
class MachineListButton : public wxButton
{
public:
MachineListButton(wxWindow * parent,
wxWindowID id,
const wxString & label,
const wxString &fullname,
const wxPoint & pos = wxDefaultPosition,
const wxSize & size = wxDefaultSize,
long style = wxBORDER_DOUBLE,
const wxValidator &validator = wxDefaultValidator,
const wxString & name = wxButtonNameStr,
bool isSelected = false)
: wxButton(parent, id, label, pos, size, style, validator, name)
{
full_label = fullname;
m_isSelected = isSelected;
if (isSelected)
SetBackgroundColour(wxColour(100, 100, 105));
else
SetBackgroundColour(wxColour(67, 67, 71));
//Bind(wxEVT_BUTTON, &MachineListButton::OnMouseLeftUp, this);
}
void SetLabel(const wxString &fullname) { full_label = fullname; }
wxString getLabel() { return full_label; }
wxString getIPLabel() { return m_ip_text; }
void SetBitMap(const wxBitmap &bitmap)
{
m_bitmap = bitmap;
Refresh();
}
void SetNameText(const wxString &text)
{
m_name_text = text;
Refresh();
}
wxString GetNameText()
{
return m_name_text;
}
void SetIPText(const wxString &text)
{
m_ip_text = text;
Refresh();
}
void SetStateText(const wxString &text)
{
m_state_text = text;
Refresh();
}
void SetProgressText(const wxString &text)
{
m_progress_text = text;
Refresh();
}
void SetSelect(bool isselectd)
{
m_isSelected = isselectd;
if (m_isSelected)
SetBackgroundColour(wxColour(100, 100, 105));
else
SetBackgroundColour(wxColour(67, 67, 71));
Refresh();
}
bool GetSelected() { return m_isSelected;}
void SetSimpleMode(bool issimplemode)
{
m_isSimpleMode = issimplemode;
//if (m_isSelected)
// SetBackgroundColour(wxColour(100, 100, 105));
//else
// SetBackgroundColour(wxColour(67, 67, 71));
Refresh();
}
void SetClickHandler(const std::function<void(wxMouseEvent &)> &handler) { m_handlerl = handler; }
void PauseStatusThread() { m_pauseThread = true; }
void ResumeStatusThread() { m_pauseThread = false; }
void StopStatusThread()
{
m_stopThread = true;
if (m_statusThread.joinable()) {
m_statusThread.join();
}
}
void OnPaint(wxPaintEvent &event);
void OnMouseEnter(wxMouseEvent &event);
void OnMouseLeave(wxMouseEvent &event);
void OnMouseLeftDown(wxMouseEvent &event);
void OnMouseLeftUp(wxMouseEvent &event);
void OnClickHandler(wxCommandEvent &event);
void SetStatusThread(std::thread thread) { m_statusThread = std::move(thread); }
std::thread CreatThread(const wxString &buttonText, const wxString &ip, DynamicPrintConfig *cfg_t)
{
std::thread thread([this, buttonText,ip, cfg_t]() {
std::unique_ptr<PrintHost> printhost(PrintHost::get_print_host(cfg_t));
if (!printhost) {
BOOST_LOG_TRIVIAL(error) << ("Could not get a valid Printer Host reference");
return;
}
wxString msg;
std::string state = "standby";
float progress = 0;
while (true) {
if (!m_pauseThread) {
state = printhost->get_status(msg);
if (state == "offline") {
BOOST_LOG_TRIVIAL(info) << boost::format("%1%Got state: %2%") % buttonText % state;
SetStateText(state);
m_pauseThread = true;
}
BOOST_LOG_TRIVIAL(info) << boost::format("%1%Got state: %2%") % buttonText % state;
SetStateText(state);
if (state == "printing") {
progress = (printhost->get_progress(msg)) * 100;
int progressInt = static_cast<int>(progress);
SetProgressText(wxString::Format(wxT("(%d%%)"), progressInt));
BOOST_LOG_TRIVIAL(info) << boost::format("%1%Got progress: %2%") % buttonText % progress;
}
} else
std::this_thread::sleep_for(std::chrono::seconds(3));
if (m_stopThread)
break;
}
});
return thread;
}
private:
std::atomic<bool> m_stopThread{false};
std::atomic<bool> m_pauseThread{false};
bool m_isSimpleMode;
bool m_isSelected;
std::thread m_statusThread;
wxBitmap m_bitmap;
bool m_isHovered;
wxString full_label;
wxString m_name_text;
wxString m_ip_text;
wxString m_state_text;
wxString m_progress_text;
std::function<void(wxMouseEvent &)> m_handlerl;
wxDECLARE_EVENT_TABLE();
//wxDECLARE_EVENT_TABLE();
};
class PrinterWebView : public wxPanel {
public:
@@ -44,7 +218,60 @@ public:
void UpdateState();
void OnClose(wxCloseEvent& evt);
//B45
void OnLeftButtonClick(wxCommandEvent &event);
void OnRightButtonClick(wxCommandEvent &event);
void OnAddButtonClick(wxCommandEvent &event);
void OnDeleteButtonClick(wxCommandEvent &event);
void OnEditButtonClick(wxCommandEvent &event);
void RunScript(const wxString &javascript);
//void OnScriptMessageReceived(wxWebViewEvent &event);
void OnScriptMessage(wxWebViewEvent &evt);
void UpdateLayout();
void OnScroll(wxScrollWinEvent &event);
void SetUpdateHandler(const std::function<void(wxCommandEvent &)> &handler) { m_handlerl = handler; }
void SetDeleteHandler(const std::function<void(wxCommandEvent &)> &handler) { m_delete_handlerl = handler; }
//B45
//void SendRecentList(int images);
void SetButtons(std::vector<MachineListButton *> buttons);
void AddButton(const wxString & device_name,
const wxString & ip,
const wxString & machine_type,
const wxString & fullname,
const std::function<void(wxMouseEvent &)> &handler,
bool isSelected,
DynamicPrintConfig * cfg_t);
void DeleteButton();
void PauseButton();
void ResumeButton();
void UnSelectedButton();
std::vector<MachineListButton *> GetButton() { return m_buttons; };
private:
//B45
wxBoxSizer *leftallsizer;
wxBoxSizer *leftsizer;
wxBoxSizer *topsizer;
bool m_isSimpleMode = false;
wxButton *arrow_button;
wxStaticText * text_static;
std::function<void(wxCommandEvent &)> m_handlerl;
std::function<void(wxCommandEvent &)> m_delete_handlerl;
wxScrolledWindow * leftScrolledWindow;
wxPanel * leftPanel;
std::vector<MachineListButton *> m_buttons;
wxWebView* m_browser;
long m_zoomFactor;
@@ -52,6 +279,8 @@ private:
// DECLARE_EVENT_TABLE()
};
} // GUI
} // Slic3r

View File

@@ -1487,6 +1487,8 @@ void TabPrint::build()
optgroup->append_single_option_line("bridge_angle");
optgroup->append_single_option_line("only_retract_when_crossing_perimeters");
optgroup->append_single_option_line("infill_first");
//w11
optgroup->append_single_option_line("detect_narrow_internal_solid_infill");
page = add_options_page(L("Skirt and brim"), "skirt+brim");
category_path = "skirt-and-brim_133969#";
@@ -1653,7 +1655,10 @@ void TabPrint::build()
optgroup->append_single_option_line("slicing_mode");
optgroup->append_single_option_line("resolution");
optgroup->append_single_option_line("gcode_resolution");
optgroup->append_single_option_line("xy_size_compensation");
//w12
//optgroup->append_single_option_line("xy_size_compensation");
optgroup->append_single_option_line("xy_hole_compensation");
optgroup->append_single_option_line("xy_contour_compensation");
optgroup->append_single_option_line("elefant_foot_compensation", "elephant-foot-compensation_114487");
optgroup = page->new_optgroup(L("Arachne perimeter generator"));
@@ -2283,6 +2288,12 @@ void TabFilament::toggle_options()
bool chamber_fan = printer_config->opt_bool("chamber_fan");
toggle_option("enable_volume_fan", chamber_fan);
int auxiliary_fan_speed = m_config->opt_int("enable_auxiliary_fan", 0);
if (auxiliary_fan_speed == 0)
toggle_option("disable_rapid_cooling_fan_first_layers", false);
else
toggle_option("disable_rapid_cooling_fan_first_layers", true);
}
}

View File

@@ -5,7 +5,6 @@
#include <wx/dcgraph.h>
#include "MainFrame.hpp"
#include <string>
#include <sstream>
#include <iomanip>
namespace Slic3r {
namespace GUI {
@@ -31,9 +30,7 @@ FRF_Calibration_Dlg::FRF_Calibration_Dlg(wxWindow* parent, wxWindowID id, Plater
// extru
auto filament_config = &wxGetApp().preset_bundle->filaments.get_edited_preset().config;
auto read_extrusion_multiplier = filament_config->opt_float("extrusion_multiplier", 0);
std::stringstream ss;
ss << read_extrusion_multiplier;
m_tc_extrusion_multiplier = new wxTextCtrl(this, wxID_ANY, ss.str(), wxDefaultPosition, wxSize(100, -1), wxBORDER_SIMPLE);
m_tc_extrusion_multiplier = new wxTextCtrl(this, wxID_ANY, wxString::FromDouble(read_extrusion_multiplier), wxDefaultPosition, wxSize(100, -1), wxBORDER_SIMPLE);
m_tc_extrusion_multiplier->SetValidator(wxTextValidator(wxFILTER_NUMERIC));
settings_sizer->Add(m_tc_extrusion_multiplier, 0, wxRIGHT | wxALIGN_RIGHT, 0);
@@ -104,7 +101,7 @@ PA_Calibration_Dlg::PA_Calibration_Dlg(wxWindow* parent, wxWindowID id, Plater*
auto start_pa_text = new wxStaticText(this, wxID_ANY, _L("Start PA: "), wxDefaultPosition, wxSize(80, -1), wxALIGN_LEFT);
start_PA_sizer->Add(start_pa_text, 0, wxALL | wxALIGN_CENTER_VERTICAL, 2);
m_tcStartPA = new wxTextCtrl(this, wxID_ANY, "0", wxDefaultPosition, wxSize(100, -1), wxBORDER_SIMPLE);
m_tcStartPA = new wxTextCtrl(this, wxID_ANY, wxString::FromDouble(0.0), wxDefaultPosition, wxSize(100, -1), wxBORDER_SIMPLE);
m_tcStartPA->SetValidator(wxTextValidator(wxFILTER_NUMERIC));
start_PA_sizer->Add(m_tcStartPA, 0, wxALL | wxALIGN_CENTER_VERTICAL, 2);
settings_sizer->Add(start_PA_sizer);
@@ -114,7 +111,7 @@ PA_Calibration_Dlg::PA_Calibration_Dlg(wxWindow* parent, wxWindowID id, Plater*
auto end_pa_text = new wxStaticText(this, wxID_ANY, _L("End PA: "), wxDefaultPosition, wxSize(80, -1), wxALIGN_LEFT);
end_PA_sizer->Add(end_pa_text, 0, wxALL | wxALIGN_CENTER_VERTICAL, 2);
m_tcEndPA = new wxTextCtrl(this, wxID_ANY, "0.04", wxDefaultPosition, wxSize(100, -1), wxBORDER_SIMPLE);
m_tcEndPA = new wxTextCtrl(this, wxID_ANY, wxString::FromDouble(0.04), wxDefaultPosition, wxSize(100, -1), wxBORDER_SIMPLE);
m_tcStartPA->SetValidator(wxTextValidator(wxFILTER_NUMERIC));
end_PA_sizer->Add(m_tcEndPA, 0, wxALL | wxALIGN_CENTER_VERTICAL, 2);
settings_sizer->Add(end_PA_sizer);
@@ -124,7 +121,7 @@ PA_Calibration_Dlg::PA_Calibration_Dlg(wxWindow* parent, wxWindowID id, Plater*
auto PA_step_text = new wxStaticText(this, wxID_ANY, _L("PA step: "), wxDefaultPosition, wxSize(80, -1), wxALIGN_LEFT);
PA_step_sizer->Add(PA_step_text, 0, wxALL | wxALIGN_CENTER_VERTICAL, 2);
m_tcPAStep = new wxTextCtrl(this, wxID_ANY, "0.002", wxDefaultPosition, wxSize(100, -1), wxBORDER_SIMPLE);
m_tcPAStep = new wxTextCtrl(this, wxID_ANY, wxString::FromDouble(0.002), wxDefaultPosition, wxSize(100, -1), wxBORDER_SIMPLE);
m_tcStartPA->SetValidator(wxTextValidator(wxFILTER_NUMERIC));
PA_step_sizer->Add(m_tcPAStep, 0, wxALL | wxALIGN_CENTER_VERTICAL, 2);
settings_sizer->Add(PA_step_sizer);

View File

@@ -21,6 +21,11 @@ public:
const char* get_name() const override;
bool test(wxString &curl_msg) const override;
//B45
virtual std::string get_status(wxString &curl_msg) const override { return "1"; };
virtual float get_progress(wxString &curl_msg) const override { return 1; };
wxString get_test_ok_msg () const override;
wxString get_test_failed_msg (wxString &msg) const override;
bool upload(PrintHostUpload upload_data, ProgressFn prorgess_fn, ErrorFn error_fn, InfoFn info_fn) const override;

View File

@@ -20,6 +20,10 @@ public:
const char* get_name() const override;
bool test(wxString &curl_msg) const override;
//B45
virtual std::string get_status(wxString &curl_msg) const override { return "1"; };
virtual float get_progress(wxString &curl_msg) const override { return 1; };
wxString get_test_ok_msg() const override;
wxString get_test_failed_msg(wxString &msg) const override;
bool upload(PrintHostUpload upload_data, ProgressFn prorgess_fn, ErrorFn error_fn, InfoFn info_fn) const override;

View File

@@ -21,6 +21,11 @@ public:
const char* get_name() const override;
bool test(wxString &curl_msg) const override;
//B45
virtual std::string get_status(wxString &curl_msg) const override { return "1"; };
virtual float get_progress(wxString &curl_msg) const override { return 1; };
wxString get_test_ok_msg() const override;
wxString get_test_failed_msg(wxString &msg) const override;
bool upload(PrintHostUpload upload_data, ProgressFn prorgess_fn, ErrorFn error_fn, InfoFn info_fn) const override;

View File

@@ -20,6 +20,11 @@ public:
const char* get_name() const override;
bool test(wxString& curl_msg) const override;
//B45
virtual std::string get_status(wxString &curl_msg) const override { return "1"; };
virtual float get_progress(wxString &curl_msg) const override { return 1; };
wxString get_test_ok_msg() const override;
wxString get_test_failed_msg(wxString& msg) const override;
bool upload(PrintHostUpload upload_data, ProgressFn prorgess_fn, ErrorFn error_fn, InfoFn info_fn) const override;

View File

@@ -142,6 +142,129 @@ bool Moonraker::test(wxString& msg) const
return res;
}
//B45
std::string Moonraker::get_status(wxString &msg) const
{
// GET /server/info
// Since the request is performed synchronously here,
// it is ok to refer to `msg` from within the closure
const char *name = get_name();
bool res = true;
std::string print_state = "standby";
auto url = make_url("printer/objects/query?print_stats=state");
BOOST_LOG_TRIVIAL(info) << boost::format("%1%: Get version at: %2%") % name % url;
auto http = Http::get(std::move(url));
set_auth(http);
http.on_error([&](std::string body, std::string error, unsigned status) {
BOOST_LOG_TRIVIAL(error) << boost::format("%1%: Error getting version: %2%, HTTP %3%, body: `%4%`") % name % error % status %
body;
print_state = "offline";
msg = format_error(body, error, status);
})
.on_complete([&](std::string body, unsigned) {
BOOST_LOG_TRIVIAL(debug) << boost::format("%1%: Got print_stats: %2%") % name % body;
try {
// All successful HTTP requests will return a json encoded object in the form of :
// {result: <response data>}
std::stringstream ss(body);
pt::ptree ptree;
pt::read_json(ss, ptree);
if (ptree.front().first != "result") {
msg = "Could not parse server response";
print_state = "offline";
return;
}
if (!ptree.front().second.get_optional<std::string>("status")) {
msg = "Could not parse server response";
print_state = "offline";
return;
}
print_state = ptree.get<std::string>("result.status.print_stats.state");
BOOST_LOG_TRIVIAL(info) << boost::format("%1%: Got state: %2%") % name % print_state;
;
} catch (const std::exception &) {
print_state = "offline";
msg = "Could not parse server response";
}
})
#ifdef _WIN32
.ssl_revoke_best_effort(m_ssl_revoke_best_effort)
.on_ip_resolve([&](std::string address) {
// Workaround for Windows 10/11 mDNS resolve issue, where two mDNS resolves in succession fail.
// Remember resolved address to be reused at successive REST API call.
msg = GUI::from_u8(address);
})
#endif // _WIN32
.perform_sync();
return print_state;
}
float Moonraker::get_progress(wxString &msg) const
{
// GET /server/info
// Since the request is performed synchronously here,
// it is ok to refer to `msg` from within the closure
const char *name = get_name();
bool res = true;
auto url = make_url("printer/objects/query?display_status=progress");
float process = 0;
BOOST_LOG_TRIVIAL(info) << boost::format("%1%: Get version at: %2%") % name % url;
auto http = Http::get(std::move(url));
set_auth(http);
http.on_error([&](std::string body, std::string error, unsigned status) {
BOOST_LOG_TRIVIAL(error) << boost::format("%1%: Error getting version: %2%, HTTP %3%, body: `%4%`") % name % error % status %
body;
res = false;
msg = format_error(body, error, status);
})
.on_complete([&](std::string body, unsigned) {
BOOST_LOG_TRIVIAL(debug) << boost::format("%1%: Got display_status: %2%") % name % body;
try {
// All successful HTTP requests will return a json encoded object in the form of :
// {result: <response data>}
std::stringstream ss(body);
pt::ptree ptree;
pt::read_json(ss, ptree);
if (ptree.front().first != "result") {
msg = "Could not parse server response";
res = false;
return;
}
if (!ptree.front().second.get_optional<std::string>("status")) {
msg = "Could not parse server response";
res = false;
return;
}
process = std::stof(ptree.get<std::string>("result.status.display_status.progress"));
BOOST_LOG_TRIVIAL(info) << boost::format("%1%: Got state: %2%") % name % process;
} catch (const std::exception &) {
res = false;
msg = "Could not parse server response";
}
})
#ifdef _WIN32
.ssl_revoke_best_effort(m_ssl_revoke_best_effort)
.on_ip_resolve([&](std::string address) {
// Workaround for Windows 10/11 mDNS resolve issue, where two mDNS resolves in succession fail.
// Remember resolved address to be reused at successive REST API call.
msg = GUI::from_u8(address);
})
#endif // _WIN32
.perform_sync();
return process;
}
bool Moonraker::upload(PrintHostUpload upload_data, ProgressFn prorgess_fn, ErrorFn error_fn, InfoFn info_fn) const
{
// POST /server/files/upload

View File

@@ -25,6 +25,11 @@ public:
const char* get_name() const override;
virtual bool test(wxString &curl_msg) const override;
//B45
virtual std::string get_status(wxString &curl_msg) const override;
virtual float get_progress(wxString &curl_msg) const override;
wxString get_test_ok_msg () const override;
wxString get_test_failed_msg (wxString &msg) const override;
bool upload(PrintHostUpload upload_data, ProgressFn prorgess_fn, ErrorFn error_fn, InfoFn info_fn) const override;

View File

@@ -24,6 +24,10 @@ public:
const char* get_name() const override;
virtual bool test(wxString &curl_msg) const override;
//B45
virtual std::string get_status(wxString &curl_msg) const override { return "1"; };
virtual float get_progress(wxString &curl_msg) const override { return 1; };
wxString get_test_ok_msg () const override;
wxString get_test_failed_msg (wxString &msg) const override;
bool upload(PrintHostUpload upload_data, ProgressFn prorgess_fn, ErrorFn error_fn, InfoFn info_fn) const override;

View File

@@ -50,6 +50,9 @@ public:
virtual const char* get_name() const = 0;
virtual bool test(wxString &curl_msg) const = 0;
//B45
virtual std::string get_status(wxString &curl_msg) const = 0;
virtual float get_progress(wxString &curl_msg) const = 0;
virtual wxString get_test_ok_msg () const = 0;
virtual wxString get_test_failed_msg (wxString &msg) const = 0;
virtual bool upload(PrintHostUpload upload_data, ProgressFn prorgess_fn, ErrorFn error_fn, InfoFn info_fn) const = 0;

View File

@@ -21,6 +21,9 @@ public:
const char* get_name() const override;
bool test(wxString &curl_msg) const override;
//B45
virtual std::string get_status(wxString &curl_msg) const override { return "1"; };
virtual float get_progress(wxString &curl_msg) const override { return 1; };
wxString get_test_ok_msg () const override;
wxString get_test_failed_msg (wxString &msg) const override;
bool upload(PrintHostUpload upload_data, ProgressFn prorgess_fn, ErrorFn error_fn, InfoFn info_fn) const override;

View File

@@ -3,7 +3,7 @@
set(SLIC3R_APP_NAME "QIDISlicer")
set(SLIC3R_APP_KEY "QIDISlicer")
set(SLIC3R_VERSION "1.0.7")
set(SLIC3R_VERSION "1.0.8")
set(SLIC3R_BUILD_ID "QIDISlicer-${SLIC3R_VERSION}+Win64")
set(SLIC3R_RC_VERSION "1,0,7,0")
set(SLIC3R_RC_VERSION_DOTS "1.0.7.0")
set(SLIC3R_RC_VERSION "1,0,8,0")
set(SLIC3R_RC_VERSION_DOTS "1.0.8.0")