mirror of
https://git.mirrors.martin98.com/https://github.com/prusa3d/PrusaSlicer.git
synced 2025-07-31 20:52:01 +08:00
Merge branch 'master' of https://github.com/Prusa-Development/PrusaSlicerPrivate into et_transformations
This commit is contained in:
commit
542b60531f
@ -1,7 +1,9 @@
|
|||||||
min_slic3r_version = 2.6.0-alpha1
|
min_slic3r_version = 2.6.0-alpha1
|
||||||
|
1.6.0-alpha2 Added profile for Prusament PETG Carbon Fiber and Fiberthree F3 PA-GF30 Pro. Updated acceleration settings for Prusa MINI.
|
||||||
1.6.0-alpha1 Updated FW version notification. Decreased min layer time for PLA.
|
1.6.0-alpha1 Updated FW version notification. Decreased min layer time for PLA.
|
||||||
1.6.0-alpha0 Default top fill set to monotonic lines. Updated infill/perimeter overlap values. Updated output filename format. Enabled dynamic overhang speeds.
|
1.6.0-alpha0 Default top fill set to monotonic lines. Updated infill/perimeter overlap values. Updated output filename format. Enabled dynamic overhang speeds.
|
||||||
min_slic3r_version = 2.5.0-alpha0
|
min_slic3r_version = 2.5.0-alpha0
|
||||||
|
1.5.7 Added filament profile for Prusament PETG Carbon Fiber and Fiberthree F3 PA-GF30 Pro.
|
||||||
1.5.6 Updated FW version notification (MK2.5/MK3 family). Added filament profile for Kimya PEBA-S.
|
1.5.6 Updated FW version notification (MK2.5/MK3 family). Added filament profile for Kimya PEBA-S.
|
||||||
1.5.5 Added new Prusament Resin material profiles. Enabled g-code thumbnails for MK2.5 family printers.
|
1.5.5 Added new Prusament Resin material profiles. Enabled g-code thumbnails for MK2.5 family printers.
|
||||||
1.5.4 Added material profiles for Prusament Resin BioBased60.
|
1.5.4 Added material profiles for Prusament Resin BioBased60.
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
name = Prusa Research
|
name = Prusa Research
|
||||||
# Configuration version of this file. Config file will only be installed, if the config_version differs.
|
# Configuration version of this file. Config file will only be installed, if the config_version differs.
|
||||||
# This means, the server may force the PrusaSlicer configuration to be downgraded.
|
# This means, the server may force the PrusaSlicer configuration to be downgraded.
|
||||||
config_version = 1.6.0-alpha1
|
config_version = 1.6.0-alpha2
|
||||||
# Where to get the updates from?
|
# Where to get the updates from?
|
||||||
config_update_url = https://files.prusa3d.com/wp-content/uploads/repository/PrusaSlicer-settings-master/live/PrusaResearch/
|
config_update_url = https://files.prusa3d.com/wp-content/uploads/repository/PrusaSlicer-settings-master/live/PrusaResearch/
|
||||||
changelog_url = https://files.prusa3d.com/?latest=slicer-profiles&lng=%1%
|
changelog_url = https://files.prusa3d.com/?latest=slicer-profiles&lng=%1%
|
||||||
@ -145,7 +145,6 @@ bridge_flow_ratio = 1
|
|||||||
bridge_speed = 25
|
bridge_speed = 25
|
||||||
brim_width = 0
|
brim_width = 0
|
||||||
brim_separation = 0.1
|
brim_separation = 0.1
|
||||||
clip_multipart_objects = 1
|
|
||||||
compatible_printers =
|
compatible_printers =
|
||||||
complete_objects = 0
|
complete_objects = 0
|
||||||
default_acceleration = 1000
|
default_acceleration = 1000
|
||||||
@ -268,8 +267,10 @@ fill_pattern = grid
|
|||||||
travel_speed = 150
|
travel_speed = 150
|
||||||
wipe_tower = 0
|
wipe_tower = 0
|
||||||
default_acceleration = 1000
|
default_acceleration = 1000
|
||||||
first_layer_acceleration = 800
|
first_layer_acceleration = 600
|
||||||
infill_acceleration = 1000
|
infill_acceleration = 1500
|
||||||
|
solid_infill_acceleration = 1500
|
||||||
|
top_solid_infill_acceleration = 800
|
||||||
bridge_acceleration = 1000
|
bridge_acceleration = 1000
|
||||||
support_material_speed = 40
|
support_material_speed = 40
|
||||||
max_print_speed = 150
|
max_print_speed = 150
|
||||||
@ -373,7 +374,9 @@ fill_pattern = gyroid
|
|||||||
fill_density = 15%
|
fill_density = 15%
|
||||||
travel_speed = 150
|
travel_speed = 150
|
||||||
perimeter_acceleration = 800
|
perimeter_acceleration = 800
|
||||||
infill_acceleration = 1000
|
infill_acceleration = 1500
|
||||||
|
solid_infill_acceleration = 1500
|
||||||
|
top_solid_infill_acceleration = 800
|
||||||
bridge_acceleration = 1000
|
bridge_acceleration = 1000
|
||||||
first_layer_acceleration = 800
|
first_layer_acceleration = 800
|
||||||
default_acceleration = 1250
|
default_acceleration = 1250
|
||||||
@ -1283,6 +1286,10 @@ support_material_extrusion_width = 0.35
|
|||||||
bridge_acceleration = 300
|
bridge_acceleration = 300
|
||||||
support_material_contact_distance = 0.1
|
support_material_contact_distance = 0.1
|
||||||
raft_contact_distance = 0.1
|
raft_contact_distance = 0.1
|
||||||
|
infill_acceleration = 1000
|
||||||
|
solid_infill_acceleration = 1000
|
||||||
|
top_solid_infill_acceleration = 800
|
||||||
|
external_perimeter_acceleration = 300
|
||||||
|
|
||||||
[print:0.07mm ULTRADETAIL @MINI]
|
[print:0.07mm ULTRADETAIL @MINI]
|
||||||
inherits = *0.07mm*; *MINI*
|
inherits = *0.07mm*; *MINI*
|
||||||
@ -1298,6 +1305,10 @@ support_material_extrusion_width = 0.35
|
|||||||
bridge_acceleration = 300
|
bridge_acceleration = 300
|
||||||
support_material_contact_distance = 0.1
|
support_material_contact_distance = 0.1
|
||||||
raft_contact_distance = 0.1
|
raft_contact_distance = 0.1
|
||||||
|
infill_acceleration = 1000
|
||||||
|
solid_infill_acceleration = 1000
|
||||||
|
top_solid_infill_acceleration = 800
|
||||||
|
external_perimeter_acceleration = 300
|
||||||
|
|
||||||
[print:0.10mm DETAIL @MINI]
|
[print:0.10mm DETAIL @MINI]
|
||||||
inherits = *0.10mm*; *MINI*
|
inherits = *0.10mm*; *MINI*
|
||||||
@ -1314,6 +1325,11 @@ fill_pattern = gyroid
|
|||||||
fill_density = 15%
|
fill_density = 15%
|
||||||
perimeters = 3
|
perimeters = 3
|
||||||
support_material_xy_spacing = 60%
|
support_material_xy_spacing = 60%
|
||||||
|
infill_acceleration = 1200
|
||||||
|
solid_infill_acceleration = 1000
|
||||||
|
top_solid_infill_acceleration = 800
|
||||||
|
perimeter_acceleration = 700
|
||||||
|
external_perimeter_acceleration = 600
|
||||||
|
|
||||||
[print:0.15mm QUALITY @MINI]
|
[print:0.15mm QUALITY @MINI]
|
||||||
inherits = *0.15mm*; *MINI*
|
inherits = *0.15mm*; *MINI*
|
||||||
@ -1326,6 +1342,8 @@ top_solid_infill_speed = 40
|
|||||||
fill_pattern = gyroid
|
fill_pattern = gyroid
|
||||||
fill_density = 15%
|
fill_density = 15%
|
||||||
support_material_xy_spacing = 60%
|
support_material_xy_spacing = 60%
|
||||||
|
perimeter_acceleration = 900
|
||||||
|
external_perimeter_acceleration = 800
|
||||||
|
|
||||||
[print:0.15mm SPEED @MINI]
|
[print:0.15mm SPEED @MINI]
|
||||||
inherits = *0.15mm*; *MINI*
|
inherits = *0.15mm*; *MINI*
|
||||||
@ -1336,6 +1354,8 @@ infill_speed = 140
|
|||||||
solid_infill_speed = 140
|
solid_infill_speed = 140
|
||||||
top_solid_infill_speed = 40
|
top_solid_infill_speed = 40
|
||||||
support_material_xy_spacing = 60%
|
support_material_xy_spacing = 60%
|
||||||
|
perimeter_acceleration = 1000
|
||||||
|
external_perimeter_acceleration = 800
|
||||||
|
|
||||||
[print:0.20mm QUALITY @MINI]
|
[print:0.20mm QUALITY @MINI]
|
||||||
inherits = *0.20mm*; *MINI*
|
inherits = *0.20mm*; *MINI*
|
||||||
@ -1348,6 +1368,8 @@ top_solid_infill_speed = 40
|
|||||||
fill_pattern = gyroid
|
fill_pattern = gyroid
|
||||||
fill_density = 15%
|
fill_density = 15%
|
||||||
support_material_xy_spacing = 60%
|
support_material_xy_spacing = 60%
|
||||||
|
perimeter_acceleration = 900
|
||||||
|
external_perimeter_acceleration = 800
|
||||||
|
|
||||||
[print:0.20mm SPEED @MINI]
|
[print:0.20mm SPEED @MINI]
|
||||||
inherits = *0.20mm*; *MINI*
|
inherits = *0.20mm*; *MINI*
|
||||||
@ -1359,6 +1381,8 @@ max_print_speed = 150
|
|||||||
solid_infill_speed = 140
|
solid_infill_speed = 140
|
||||||
top_solid_infill_speed = 40
|
top_solid_infill_speed = 40
|
||||||
support_material_xy_spacing = 60%
|
support_material_xy_spacing = 60%
|
||||||
|
perimeter_acceleration = 1000
|
||||||
|
external_perimeter_acceleration = 800
|
||||||
|
|
||||||
[print:0.25mm DRAFT @MINI]
|
[print:0.25mm DRAFT @MINI]
|
||||||
inherits = *0.25mm*; *MINI*
|
inherits = *0.25mm*; *MINI*
|
||||||
@ -1378,6 +1402,8 @@ top_infill_extrusion_width = 0.4
|
|||||||
support_material_xy_spacing = 60%
|
support_material_xy_spacing = 60%
|
||||||
support_material_contact_distance = 0.2
|
support_material_contact_distance = 0.2
|
||||||
raft_contact_distance = 0.2
|
raft_contact_distance = 0.2
|
||||||
|
perimeter_acceleration = 1000
|
||||||
|
external_perimeter_acceleration = 800
|
||||||
|
|
||||||
# MINI - 0.25mm nozzle
|
# MINI - 0.25mm nozzle
|
||||||
|
|
||||||
@ -1389,6 +1415,10 @@ fill_density = 20%
|
|||||||
support_material_speed = 30
|
support_material_speed = 30
|
||||||
support_material_contact_distance = 0.07
|
support_material_contact_distance = 0.07
|
||||||
raft_contact_distance = 0.07
|
raft_contact_distance = 0.07
|
||||||
|
infill_acceleration = 1000
|
||||||
|
solid_infill_acceleration = 1000
|
||||||
|
top_solid_infill_acceleration = 800
|
||||||
|
external_perimeter_acceleration = 300
|
||||||
|
|
||||||
[print:0.07mm ULTRADETAIL @0.25 nozzle MINI]
|
[print:0.07mm ULTRADETAIL @0.25 nozzle MINI]
|
||||||
inherits = *0.07mm*; *0.25nozzle*; *MINI*
|
inherits = *0.07mm*; *0.25nozzle*; *MINI*
|
||||||
@ -1401,6 +1431,10 @@ fill_pattern = grid
|
|||||||
fill_density = 20%
|
fill_density = 20%
|
||||||
support_material_contact_distance = 0.07
|
support_material_contact_distance = 0.07
|
||||||
raft_contact_distance = 0.07
|
raft_contact_distance = 0.07
|
||||||
|
infill_acceleration = 1000
|
||||||
|
solid_infill_acceleration = 1000
|
||||||
|
top_solid_infill_acceleration = 800
|
||||||
|
external_perimeter_acceleration = 300
|
||||||
|
|
||||||
[print:0.10mm DETAIL @0.25 nozzle MINI]
|
[print:0.10mm DETAIL @0.25 nozzle MINI]
|
||||||
inherits = *0.10mm*; *0.25nozzleMINI*; *MINI*
|
inherits = *0.10mm*; *0.25nozzleMINI*; *MINI*
|
||||||
@ -1409,6 +1443,10 @@ fill_pattern = grid
|
|||||||
fill_density = 20%
|
fill_density = 20%
|
||||||
support_material_contact_distance = 0.07
|
support_material_contact_distance = 0.07
|
||||||
raft_contact_distance = 0.07
|
raft_contact_distance = 0.07
|
||||||
|
infill_acceleration = 1200
|
||||||
|
solid_infill_acceleration = 1000
|
||||||
|
top_solid_infill_acceleration = 800
|
||||||
|
external_perimeter_acceleration = 500
|
||||||
|
|
||||||
[print:0.15mm QUALITY @0.25 nozzle MINI]
|
[print:0.15mm QUALITY @0.25 nozzle MINI]
|
||||||
inherits = *0.15mm*; *0.25nozzleMINI*; *MINI*
|
inherits = *0.15mm*; *0.25nozzleMINI*; *MINI*
|
||||||
@ -1421,6 +1459,10 @@ perimeter_extrusion_width = 0.27
|
|||||||
external_perimeter_extrusion_width = 0.27
|
external_perimeter_extrusion_width = 0.27
|
||||||
infill_extrusion_width = 0.27
|
infill_extrusion_width = 0.27
|
||||||
solid_infill_extrusion_width = 0.27
|
solid_infill_extrusion_width = 0.27
|
||||||
|
infill_acceleration = 1500
|
||||||
|
solid_infill_acceleration = 1000
|
||||||
|
top_solid_infill_acceleration = 800
|
||||||
|
external_perimeter_acceleration = 500
|
||||||
|
|
||||||
# MINI - 0.6mm nozzle
|
# MINI - 0.6mm nozzle
|
||||||
|
|
||||||
@ -1433,11 +1475,17 @@ max_print_speed = 100
|
|||||||
perimeter_speed = 45
|
perimeter_speed = 45
|
||||||
solid_infill_speed = 70
|
solid_infill_speed = 70
|
||||||
top_solid_infill_speed = 45
|
top_solid_infill_speed = 45
|
||||||
infill_extrusion_width = 0.65
|
perimeter_extrusion_width = 0.6
|
||||||
solid_infill_extrusion_width = 0.65
|
external_perimeter_extrusion_width = 0.6
|
||||||
|
infill_extrusion_width = 0.6
|
||||||
|
solid_infill_extrusion_width = 0.6
|
||||||
|
top_infill_extrusion_width = 0.5
|
||||||
support_material_contact_distance = 0.22
|
support_material_contact_distance = 0.22
|
||||||
raft_contact_distance = 0.22
|
raft_contact_distance = 0.22
|
||||||
bridge_flow_ratio = 1
|
bridge_flow_ratio = 1
|
||||||
|
top_solid_infill_acceleration = 800
|
||||||
|
perimeter_acceleration = 900
|
||||||
|
external_perimeter_acceleration = 800
|
||||||
|
|
||||||
[print:0.20mm DETAIL @0.6 nozzle MINI]
|
[print:0.20mm DETAIL @0.6 nozzle MINI]
|
||||||
inherits = *0.20mm*; *0.6nozzleMINI*
|
inherits = *0.20mm*; *0.6nozzleMINI*
|
||||||
@ -1448,11 +1496,16 @@ max_print_speed = 100
|
|||||||
perimeter_speed = 45
|
perimeter_speed = 45
|
||||||
solid_infill_speed = 70
|
solid_infill_speed = 70
|
||||||
top_solid_infill_speed = 45
|
top_solid_infill_speed = 45
|
||||||
infill_extrusion_width = 0.65
|
perimeter_extrusion_width = 0.6
|
||||||
solid_infill_extrusion_width = 0.65
|
external_perimeter_extrusion_width = 0.6
|
||||||
|
infill_extrusion_width = 0.6
|
||||||
|
solid_infill_extrusion_width = 0.6
|
||||||
|
top_infill_extrusion_width = 0.5
|
||||||
support_material_contact_distance = 0.22
|
support_material_contact_distance = 0.22
|
||||||
raft_contact_distance = 0.22
|
raft_contact_distance = 0.22
|
||||||
bridge_flow_ratio = 1
|
bridge_flow_ratio = 1
|
||||||
|
perimeter_acceleration = 900
|
||||||
|
external_perimeter_acceleration = 800
|
||||||
|
|
||||||
[print:0.30mm QUALITY @0.6 nozzle MINI]
|
[print:0.30mm QUALITY @0.6 nozzle MINI]
|
||||||
inherits = *0.30mm*; *0.6nozzleMINI*
|
inherits = *0.30mm*; *0.6nozzleMINI*
|
||||||
@ -1465,9 +1518,12 @@ solid_infill_speed = 65
|
|||||||
top_solid_infill_speed = 45
|
top_solid_infill_speed = 45
|
||||||
external_perimeter_extrusion_width = 0.68
|
external_perimeter_extrusion_width = 0.68
|
||||||
perimeter_extrusion_width = 0.68
|
perimeter_extrusion_width = 0.68
|
||||||
|
top_infill_extrusion_width = 0.55
|
||||||
support_material_contact_distance = 0.25
|
support_material_contact_distance = 0.25
|
||||||
raft_contact_distance = 0.25
|
raft_contact_distance = 0.25
|
||||||
bridge_flow_ratio = 1
|
bridge_flow_ratio = 1
|
||||||
|
perimeter_acceleration = 900
|
||||||
|
external_perimeter_acceleration = 800
|
||||||
|
|
||||||
[print:0.35mm SPEED @0.6 nozzle MINI]
|
[print:0.35mm SPEED @0.6 nozzle MINI]
|
||||||
inherits = *0.35mm*; *0.6nozzleMINI*
|
inherits = *0.35mm*; *0.6nozzleMINI*
|
||||||
@ -1483,6 +1539,8 @@ perimeter_extrusion_width = 0.68
|
|||||||
support_material_contact_distance = 0.25
|
support_material_contact_distance = 0.25
|
||||||
raft_contact_distance = 0.25
|
raft_contact_distance = 0.25
|
||||||
bridge_flow_ratio = 0.95
|
bridge_flow_ratio = 0.95
|
||||||
|
perimeter_acceleration = 1000
|
||||||
|
external_perimeter_acceleration = 800
|
||||||
|
|
||||||
[print:0.40mm DRAFT @0.6 nozzle MINI]
|
[print:0.40mm DRAFT @0.6 nozzle MINI]
|
||||||
inherits = *0.40mm*; *0.6nozzleMINI*
|
inherits = *0.40mm*; *0.6nozzleMINI*
|
||||||
@ -1500,6 +1558,8 @@ solid_infill_extrusion_width = 0.68
|
|||||||
support_material_contact_distance = 0.25
|
support_material_contact_distance = 0.25
|
||||||
raft_contact_distance = 0.25
|
raft_contact_distance = 0.25
|
||||||
bridge_flow_ratio = 0.95
|
bridge_flow_ratio = 0.95
|
||||||
|
perimeter_acceleration = 1000
|
||||||
|
external_perimeter_acceleration = 800
|
||||||
|
|
||||||
# MINI - 0.8mm nozzle
|
# MINI - 0.8mm nozzle
|
||||||
|
|
||||||
@ -1508,13 +1568,17 @@ inherits = 0.30mm DETAIL @0.8 nozzle
|
|||||||
compatible_printers_condition = printer_model=="MINI" and nozzle_diameter[0]==0.8
|
compatible_printers_condition = printer_model=="MINI" and nozzle_diameter[0]==0.8
|
||||||
perimeter_speed = 35
|
perimeter_speed = 35
|
||||||
external_perimeter_speed = 25
|
external_perimeter_speed = 25
|
||||||
infill_acceleration = 1000
|
|
||||||
infill_speed = 50
|
infill_speed = 50
|
||||||
max_print_speed = 80
|
max_print_speed = 80
|
||||||
solid_infill_speed = 45
|
solid_infill_speed = 45
|
||||||
top_solid_infill_speed = 35
|
top_solid_infill_speed = 35
|
||||||
support_material_speed = 40
|
support_material_speed = 40
|
||||||
travel_speed = 150
|
travel_speed = 150
|
||||||
|
infill_acceleration = 1500
|
||||||
|
solid_infill_acceleration = 1500
|
||||||
|
top_solid_infill_acceleration = 800
|
||||||
|
perimeter_acceleration = 900
|
||||||
|
external_perimeter_acceleration = 800
|
||||||
|
|
||||||
[print:0.40mm QUALITY @0.8 nozzle MINI]
|
[print:0.40mm QUALITY @0.8 nozzle MINI]
|
||||||
inherits = 0.40mm QUALITY @0.8 nozzle
|
inherits = 0.40mm QUALITY @0.8 nozzle
|
||||||
@ -1525,11 +1589,15 @@ solid_infill_speed = 40
|
|||||||
top_solid_infill_speed = 30
|
top_solid_infill_speed = 30
|
||||||
support_material_speed = 40
|
support_material_speed = 40
|
||||||
travel_speed = 150
|
travel_speed = 150
|
||||||
|
infill_acceleration = 1500
|
||||||
|
solid_infill_acceleration = 1500
|
||||||
|
top_solid_infill_acceleration = 800
|
||||||
|
perimeter_acceleration = 1000
|
||||||
|
external_perimeter_acceleration = 800
|
||||||
|
|
||||||
[print:0.55mm DRAFT @0.8 nozzle MINI]
|
[print:0.55mm DRAFT @0.8 nozzle MINI]
|
||||||
inherits = 0.55mm DRAFT @0.8 nozzle
|
inherits = 0.55mm DRAFT @0.8 nozzle
|
||||||
compatible_printers_condition = printer_model=="MINI" and nozzle_diameter[0]==0.8
|
compatible_printers_condition = printer_model=="MINI" and nozzle_diameter[0]==0.8
|
||||||
infill_acceleration = 1000
|
|
||||||
infill_speed = 40
|
infill_speed = 40
|
||||||
solid_infill_speed = 40
|
solid_infill_speed = 40
|
||||||
support_material_speed = 35
|
support_material_speed = 35
|
||||||
@ -1539,6 +1607,11 @@ top_solid_infill_speed = 28
|
|||||||
external_perimeter_extrusion_width = 1
|
external_perimeter_extrusion_width = 1
|
||||||
perimeter_extrusion_width = 1
|
perimeter_extrusion_width = 1
|
||||||
travel_speed = 150
|
travel_speed = 150
|
||||||
|
infill_acceleration = 1500
|
||||||
|
solid_infill_acceleration = 1500
|
||||||
|
top_solid_infill_acceleration = 800
|
||||||
|
perimeter_acceleration = 1000
|
||||||
|
external_perimeter_acceleration = 800
|
||||||
|
|
||||||
# XXXXXXxxXXXXXXXXXXXXXX
|
# XXXXXXxxXXXXXXXXXXXXXX
|
||||||
# XXX--- filament ---XXX
|
# XXX--- filament ---XXX
|
||||||
@ -3865,6 +3938,17 @@ filament_spool_weight = 201
|
|||||||
filament_type = PETG
|
filament_type = PETG
|
||||||
compatible_printers_condition = nozzle_diameter[0]!=0.8 and nozzle_diameter[0]!=0.6 and printer_model!="MK2SMM" and printer_model!="MINI" and ! (printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK(2.5|3).*/ and single_extruder_multi_material)
|
compatible_printers_condition = nozzle_diameter[0]!=0.8 and nozzle_diameter[0]!=0.6 and printer_model!="MK2SMM" and printer_model!="MINI" and ! (printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK(2.5|3).*/ and single_extruder_multi_material)
|
||||||
|
|
||||||
|
[filament:Prusament PETG Carbon Fiber]
|
||||||
|
inherits = Prusament PETG
|
||||||
|
filament_vendor = Prusa Polymers
|
||||||
|
first_layer_temperature = 260
|
||||||
|
temperature = 265
|
||||||
|
extrusion_multiplier = 1.03
|
||||||
|
filament_cost = 54.99
|
||||||
|
filament_density = 1.27
|
||||||
|
filament_colour = #BBBBBB
|
||||||
|
compatible_printers_condition = nozzle_diameter[0]>=0.4 and nozzle_diameter[0]!=0.8 and nozzle_diameter[0]!=0.6 and printer_model!="MK2SMM" and printer_model!="MINI" and ! (printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK(2.5|3).*/ and single_extruder_multi_material)
|
||||||
|
|
||||||
[filament:Prusa PETG @0.6 nozzle]
|
[filament:Prusa PETG @0.6 nozzle]
|
||||||
inherits = *PET06*
|
inherits = *PET06*
|
||||||
renamed_from = "Prusa PET 0.6 nozzle"; "Prusa PETG 0.6 nozzle"
|
renamed_from = "Prusa PET 0.6 nozzle"; "Prusa PETG 0.6 nozzle"
|
||||||
@ -3883,6 +3967,14 @@ filament_density = 1.27
|
|||||||
filament_spool_weight = 201
|
filament_spool_weight = 201
|
||||||
filament_type = PETG
|
filament_type = PETG
|
||||||
|
|
||||||
|
[filament:Prusament PETG Carbon Fiber @0.6 nozzle]
|
||||||
|
inherits = Prusament PETG @0.6 nozzle
|
||||||
|
first_layer_temperature = 260
|
||||||
|
temperature = 265
|
||||||
|
extrusion_multiplier = 1.03
|
||||||
|
filament_cost = 54.99
|
||||||
|
filament_colour = #BBBBBB
|
||||||
|
|
||||||
[filament:Filament PM PETG @0.6 nozzle]
|
[filament:Filament PM PETG @0.6 nozzle]
|
||||||
inherits = *PET06*
|
inherits = *PET06*
|
||||||
renamed_from = "Plasty Mladec PETG @0.6 nozzle"
|
renamed_from = "Plasty Mladec PETG @0.6 nozzle"
|
||||||
@ -3976,6 +4068,14 @@ filament_cost = 36.29
|
|||||||
filament_density = 1.27
|
filament_density = 1.27
|
||||||
filament_spool_weight = 201
|
filament_spool_weight = 201
|
||||||
|
|
||||||
|
[filament:Prusament PETG Carbon Fiber @MMU2]
|
||||||
|
inherits = Prusament PETG @MMU2
|
||||||
|
first_layer_temperature = 260
|
||||||
|
temperature = 260
|
||||||
|
extrusion_multiplier = 1.03
|
||||||
|
filament_cost = 54.99
|
||||||
|
filament_colour = #BBBBBB
|
||||||
|
|
||||||
[filament:Generic PETG @MMU2 0.6 nozzle]
|
[filament:Generic PETG @MMU2 0.6 nozzle]
|
||||||
inherits = *PET MMU2 06*
|
inherits = *PET MMU2 06*
|
||||||
renamed_from = "Generic PET MMU2 0.6 nozzle"; "Generic PETG MMU2 0.6 nozzle"
|
renamed_from = "Generic PET MMU2 0.6 nozzle"; "Generic PETG MMU2 0.6 nozzle"
|
||||||
@ -3995,6 +4095,14 @@ filament_cost = 36.29
|
|||||||
filament_density = 1.27
|
filament_density = 1.27
|
||||||
filament_spool_weight = 201
|
filament_spool_weight = 201
|
||||||
|
|
||||||
|
[filament:Prusament PETG Carbon Fiber @MMU2 0.6 nozzle]
|
||||||
|
inherits = Prusament PETG @MMU2 0.6 nozzle
|
||||||
|
first_layer_temperature = 260
|
||||||
|
temperature = 260
|
||||||
|
extrusion_multiplier = 1.03
|
||||||
|
filament_cost = 54.99
|
||||||
|
filament_colour = #BBBBBB
|
||||||
|
|
||||||
[filament:Filament PM PETG @MMU2 0.6 nozzle]
|
[filament:Filament PM PETG @MMU2 0.6 nozzle]
|
||||||
inherits = *PET MMU2 06*
|
inherits = *PET MMU2 06*
|
||||||
renamed_from = "Plasty Mladec PETG @MMU2 0.6 nozzle"
|
renamed_from = "Plasty Mladec PETG @MMU2 0.6 nozzle"
|
||||||
@ -4079,6 +4187,87 @@ bed_temperature = 30
|
|||||||
filament_retract_length = 0
|
filament_retract_length = 0
|
||||||
extrusion_multiplier = 1.16
|
extrusion_multiplier = 1.16
|
||||||
|
|
||||||
|
[filament:Print With Smile PLA]
|
||||||
|
inherits = *PLA*
|
||||||
|
filament_vendor = Print With Smile
|
||||||
|
filament_cost = 535
|
||||||
|
filament_density = 1.24
|
||||||
|
filament_spool_weight = 0
|
||||||
|
filament_colour = #FFFF6F
|
||||||
|
filament_max_volumetric_speed = 15
|
||||||
|
first_layer_temperature = 205
|
||||||
|
temperature = 205
|
||||||
|
|
||||||
|
[filament:Print With Smile PETG]
|
||||||
|
inherits = *PET*
|
||||||
|
filament_vendor = Print With Smile
|
||||||
|
filament_cost = 590
|
||||||
|
filament_density = 1.27
|
||||||
|
filament_spool_weight = 0
|
||||||
|
filament_colour = #4D9398
|
||||||
|
filament_max_volumetric_speed = 8
|
||||||
|
temperature = 245
|
||||||
|
first_layer_bed_temperature = 85
|
||||||
|
first_layer_temperature = 240
|
||||||
|
bed_temperature = 90
|
||||||
|
|
||||||
|
[filament:Print With Smile PETG @MINI]
|
||||||
|
inherits = Print With Smile PETG; *PETMINI*
|
||||||
|
|
||||||
|
[filament:Print With Smile ASA]
|
||||||
|
inherits = Ultrafuse ASA
|
||||||
|
filament_vendor = Print With Smile
|
||||||
|
filament_cost = 625
|
||||||
|
first_layer_temperature = 250
|
||||||
|
temperature = 250
|
||||||
|
first_layer_bed_temperature = 105
|
||||||
|
bed_temperature = 110
|
||||||
|
filament_type = ASA
|
||||||
|
max_fan_speed = 40
|
||||||
|
bridge_fan_speed = 70
|
||||||
|
filament_max_volumetric_speed = 11
|
||||||
|
|
||||||
|
[filament:Print With Smile ABS]
|
||||||
|
inherits = *ABSC*
|
||||||
|
filament_vendor = Print With Smile
|
||||||
|
filament_cost = 535
|
||||||
|
filament_density = 1.08
|
||||||
|
first_layer_temperature = 240
|
||||||
|
temperature = 240
|
||||||
|
|
||||||
|
[filament:Print With Smile PETG CF]
|
||||||
|
inherits = Extrudr XPETG CF
|
||||||
|
filament_vendor = Print With Smile
|
||||||
|
filament_cost = 899
|
||||||
|
filament_density = 1.29
|
||||||
|
filament_notes =
|
||||||
|
first_layer_temperature = 260
|
||||||
|
temperature = 260
|
||||||
|
first_layer_bed_temperature = 85
|
||||||
|
bed_temperature = 85
|
||||||
|
max_fan_speed = 55
|
||||||
|
bridge_fan_speed = 60
|
||||||
|
filament_max_volumetric_speed = 5
|
||||||
|
|
||||||
|
[filament:Print With Smile PETG CF @MINI]
|
||||||
|
inherits = Print With Smile PETG CF; *PETMINI*
|
||||||
|
|
||||||
|
[filament:Print With Smile TPU96A]
|
||||||
|
inherits = *FLEX*
|
||||||
|
filament_vendor = Print With Smile
|
||||||
|
filament_cost = 1200
|
||||||
|
filament_density = 1.31
|
||||||
|
extrusion_multiplier = 1.1
|
||||||
|
filament_max_volumetric_speed = 1.35
|
||||||
|
fan_always_on = 1
|
||||||
|
cooling = 0
|
||||||
|
max_fan_speed = 60
|
||||||
|
min_fan_speed = 60
|
||||||
|
disable_fan_first_layers = 4
|
||||||
|
full_fan_speed_layer = 6
|
||||||
|
filament_retract_length = 1.2
|
||||||
|
filament_deretract_speed = 20
|
||||||
|
|
||||||
[filament:Fiberlogy Easy PLA]
|
[filament:Fiberlogy Easy PLA]
|
||||||
inherits = *PLA*
|
inherits = *PLA*
|
||||||
renamed_from = Fiberlogy PLA
|
renamed_from = Fiberlogy PLA
|
||||||
@ -4680,6 +4869,23 @@ fan_always_on = 1
|
|||||||
max_fan_speed = 15
|
max_fan_speed = 15
|
||||||
min_fan_speed = 15
|
min_fan_speed = 15
|
||||||
|
|
||||||
|
[filament:Fiberthree F3 PA-GF30 Pro]
|
||||||
|
inherits = Prusament PC Blend Carbon Fiber
|
||||||
|
filament_vendor = Fiberthree
|
||||||
|
filament_cost = 208.01
|
||||||
|
filament_density = 1.35
|
||||||
|
extrusion_multiplier = 1.03
|
||||||
|
first_layer_temperature = 275
|
||||||
|
temperature = 285
|
||||||
|
first_layer_bed_temperature = 90
|
||||||
|
bed_temperature = 90
|
||||||
|
fan_below_layer_time = 10
|
||||||
|
compatible_printers_condition = printer_model!="MINI" and ! single_extruder_multi_material
|
||||||
|
max_fan_speed = 15
|
||||||
|
min_fan_speed = 15
|
||||||
|
filament_type = PA
|
||||||
|
filament_max_volumetric_speed = 6
|
||||||
|
|
||||||
[filament:Taulman T-Glase]
|
[filament:Taulman T-Glase]
|
||||||
inherits = *PET*
|
inherits = *PET*
|
||||||
filament_vendor = Taulman
|
filament_vendor = Taulman
|
||||||
@ -4889,6 +5095,13 @@ renamed_from = "Prusa PET MMU1"; "Prusa PETG MMU1"
|
|||||||
[filament:Prusament PETG @MMU1]
|
[filament:Prusament PETG @MMU1]
|
||||||
inherits = Prusament PETG; *PETMMU1*
|
inherits = Prusament PETG; *PETMMU1*
|
||||||
|
|
||||||
|
[filament:Prusament PETG Carbon Fiber @MMU1]
|
||||||
|
inherits = Prusament PETG @MMU1
|
||||||
|
first_layer_temperature = 260
|
||||||
|
temperature = 265
|
||||||
|
filament_cost = 54.99
|
||||||
|
filament_colour = #BBBBBB
|
||||||
|
|
||||||
[filament:Taulman T-Glase @MMU1]
|
[filament:Taulman T-Glase @MMU1]
|
||||||
inherits = Taulman T-Glase; *PETMMU1*
|
inherits = Taulman T-Glase; *PETMMU1*
|
||||||
start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}200{else}30{endif}; Filament gcode"
|
start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}200{else}30{endif}; Filament gcode"
|
||||||
@ -5016,6 +5229,19 @@ fan_always_on = 1
|
|||||||
max_fan_speed = 15
|
max_fan_speed = 15
|
||||||
min_fan_speed = 15
|
min_fan_speed = 15
|
||||||
|
|
||||||
|
[filament:Fiberthree F3 PA-GF30 Pro @MINI]
|
||||||
|
inherits = Fiberthree F3 PA-GF30 Pro
|
||||||
|
filament_vendor = Fiberthree
|
||||||
|
first_layer_temperature = 275
|
||||||
|
temperature = 280
|
||||||
|
compatible_printers_condition = nozzle_diameter[0]>=0.4 and printer_model=="MINI"
|
||||||
|
filament_retract_length = nil
|
||||||
|
filament_retract_speed = nil
|
||||||
|
filament_retract_lift = nil
|
||||||
|
filament_retract_before_travel = nil
|
||||||
|
filament_wipe = nil
|
||||||
|
filament_type = PA
|
||||||
|
|
||||||
[filament:Kimya ABS Carbon @MINI]
|
[filament:Kimya ABS Carbon @MINI]
|
||||||
inherits = Kimya ABS Carbon; *ABSMINI*
|
inherits = Kimya ABS Carbon; *ABSMINI*
|
||||||
filament_max_volumetric_speed = 6
|
filament_max_volumetric_speed = 6
|
||||||
@ -5043,6 +5269,15 @@ inherits = Verbatim ABS; *ABSMINI*
|
|||||||
inherits = Prusament PETG; *PETMINI*
|
inherits = Prusament PETG; *PETMINI*
|
||||||
compatible_printers_condition = printer_model=="MINI" and nozzle_diameter[0]!=0.8 and nozzle_diameter[0]!=0.6
|
compatible_printers_condition = printer_model=="MINI" and nozzle_diameter[0]!=0.8 and nozzle_diameter[0]!=0.6
|
||||||
|
|
||||||
|
[filament:Prusament PETG Carbon Fiber @MINI]
|
||||||
|
inherits = Prusament PETG @MINI
|
||||||
|
first_layer_temperature = 260
|
||||||
|
temperature = 265
|
||||||
|
extrusion_multiplier = 1.03
|
||||||
|
filament_cost = 54.99
|
||||||
|
filament_colour = #BBBBBB
|
||||||
|
compatible_printers_condition = printer_model=="MINI" and nozzle_diameter[0]>=0.4 and nozzle_diameter[0]!=0.8 and nozzle_diameter[0]!=0.6
|
||||||
|
|
||||||
[filament:Kimya PETG Carbon @MINI]
|
[filament:Kimya PETG Carbon @MINI]
|
||||||
inherits = Kimya PETG Carbon; *PETMINI*
|
inherits = Kimya PETG Carbon; *PETMINI*
|
||||||
filament_max_volumetric_speed = 6
|
filament_max_volumetric_speed = 6
|
||||||
@ -5053,6 +5288,14 @@ compatible_printers_condition = nozzle_diameter[0]>=0.4 and printer_model=="MINI
|
|||||||
[filament:Prusament PETG @0.6 nozzle MINI]
|
[filament:Prusament PETG @0.6 nozzle MINI]
|
||||||
inherits = Prusament PETG; *PETMINI06*
|
inherits = Prusament PETG; *PETMINI06*
|
||||||
|
|
||||||
|
[filament:Prusament PETG Carbon Fiber @0.6 nozzle MINI]
|
||||||
|
inherits = Prusament PETG @0.6 nozzle MINI
|
||||||
|
first_layer_temperature = 260
|
||||||
|
temperature = 265
|
||||||
|
extrusion_multiplier = 1.03
|
||||||
|
filament_cost = 54.99
|
||||||
|
filament_colour = #BBBBBB
|
||||||
|
|
||||||
[filament:Generic PETG @0.6 nozzle MINI]
|
[filament:Generic PETG @0.6 nozzle MINI]
|
||||||
inherits = Generic PETG; *PETMINI06*
|
inherits = Generic PETG; *PETMINI06*
|
||||||
renamed_from = "Generic PET 0.6 nozzle MINI"; "Generic PETG 0.6 nozzle MINI"
|
renamed_from = "Generic PET 0.6 nozzle MINI"; "Generic PETG 0.6 nozzle MINI"
|
||||||
@ -5358,6 +5601,14 @@ filament_retract_lift = 0.2
|
|||||||
slowdown_below_layer_time = 20
|
slowdown_below_layer_time = 20
|
||||||
compatible_printers_condition = nozzle_diameter[0]==0.8 and printer_model!="MK2SMM" and printer_model!="MINI" and ! (printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK(2.5|3).*/ and single_extruder_multi_material)
|
compatible_printers_condition = nozzle_diameter[0]==0.8 and printer_model!="MK2SMM" and printer_model!="MINI" and ! (printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK(2.5|3).*/ and single_extruder_multi_material)
|
||||||
|
|
||||||
|
[filament:Prusament PETG Carbon Fiber @0.8 nozzle]
|
||||||
|
inherits = Prusament PETG @0.8 nozzle
|
||||||
|
first_layer_temperature = 265
|
||||||
|
temperature = 270
|
||||||
|
extrusion_multiplier = 1.03
|
||||||
|
filament_cost = 54.99
|
||||||
|
filament_colour = #BBBBBB
|
||||||
|
|
||||||
[filament:Prusament ASA @0.8 nozzle]
|
[filament:Prusament ASA @0.8 nozzle]
|
||||||
inherits = Prusament ASA
|
inherits = Prusament ASA
|
||||||
first_layer_temperature = 265
|
first_layer_temperature = 265
|
||||||
@ -5437,6 +5688,14 @@ temperature = 240
|
|||||||
slowdown_below_layer_time = 20
|
slowdown_below_layer_time = 20
|
||||||
filament_ramming_parameters = "120 140 5.51613 5.6129 5.70968 5.77419 5.77419 5.74194 5.80645 5.93548 6.06452 6.19355 6.3871 6.74194 7.25806 7.87097 8.54839 9.22581 10 10.8387| 0.05 5.5032 0.45 5.63868 0.95 5.8 1.45 5.7839 1.95 6.02257 2.45 6.25811 2.95 7.08395 3.45 8.43875 3.95 9.92258 4.45 11.3419 4.95 7.6"
|
filament_ramming_parameters = "120 140 5.51613 5.6129 5.70968 5.77419 5.77419 5.74194 5.80645 5.93548 6.06452 6.19355 6.3871 6.74194 7.25806 7.87097 8.54839 9.22581 10 10.8387| 0.05 5.5032 0.45 5.63868 0.95 5.8 1.45 5.7839 1.95 6.02257 2.45 6.25811 2.95 7.08395 3.45 8.43875 3.95 9.92258 4.45 11.3419 4.95 7.6"
|
||||||
|
|
||||||
|
[filament:Prusament PETG Carbon Fiber @MMU2 0.8 nozzle]
|
||||||
|
inherits = Prusament PETG @MMU2 0.8 nozzle
|
||||||
|
first_layer_temperature = 265
|
||||||
|
temperature = 270
|
||||||
|
extrusion_multiplier = 1.03
|
||||||
|
filament_cost = 54.99
|
||||||
|
filament_colour = #BBBBBB
|
||||||
|
|
||||||
[filament:Generic PLA @MMU2 0.8 nozzle]
|
[filament:Generic PLA @MMU2 0.8 nozzle]
|
||||||
inherits = Generic PLA @MMU2
|
inherits = Generic PLA @MMU2
|
||||||
compatible_printers_condition = nozzle_diameter[0]==0.8 and printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK(2.5|3).*/ and single_extruder_multi_material
|
compatible_printers_condition = nozzle_diameter[0]==0.8 and printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK(2.5|3).*/ and single_extruder_multi_material
|
||||||
@ -5520,6 +5779,14 @@ filament_retract_lift = 0.25
|
|||||||
slowdown_below_layer_time = 20
|
slowdown_below_layer_time = 20
|
||||||
compatible_printers_condition = nozzle_diameter[0]==0.8 and printer_model=="MINI"
|
compatible_printers_condition = nozzle_diameter[0]==0.8 and printer_model=="MINI"
|
||||||
|
|
||||||
|
[filament:Prusament PETG Carbon Fiber @0.8 nozzle MINI]
|
||||||
|
inherits = Prusament PETG @0.8 nozzle MINI
|
||||||
|
first_layer_temperature = 265
|
||||||
|
temperature = 270
|
||||||
|
extrusion_multiplier = 1.03
|
||||||
|
filament_cost = 54.99
|
||||||
|
filament_colour = #BBBBBB
|
||||||
|
|
||||||
[filament:Prusament ASA @0.8 nozzle MINI]
|
[filament:Prusament ASA @0.8 nozzle MINI]
|
||||||
inherits = Prusament ASA @MINI
|
inherits = Prusament ASA @MINI
|
||||||
first_layer_temperature = 265
|
first_layer_temperature = 265
|
||||||
@ -10039,7 +10306,7 @@ default_filament_profile = "Prusament PLA"
|
|||||||
default_print_profile = 0.15mm QUALITY @MINI
|
default_print_profile = 0.15mm QUALITY @MINI
|
||||||
gcode_flavor = marlin2
|
gcode_flavor = marlin2
|
||||||
machine_max_acceleration_e = 5000
|
machine_max_acceleration_e = 5000
|
||||||
machine_max_acceleration_extruding = 1250
|
machine_max_acceleration_extruding = 2000
|
||||||
machine_max_acceleration_retracting = 1250
|
machine_max_acceleration_retracting = 1250
|
||||||
machine_max_acceleration_travel = 2500
|
machine_max_acceleration_travel = 2500
|
||||||
machine_max_acceleration_x = 2500
|
machine_max_acceleration_x = 2500
|
||||||
|
@ -1,2 +1,3 @@
|
|||||||
min_slic3r_version = 2.6.0-alpha0
|
min_slic3r_version = 2.6.0-alpha0
|
||||||
|
1.0.1 Added Prusament PETG Carbon Fiber, Fiberthree F3 PA-GF30 Pro.
|
||||||
1.0.0 Initial
|
1.0.0 Initial
|
||||||
|
@ -2,14 +2,12 @@
|
|||||||
|
|
||||||
[vendor]
|
[vendor]
|
||||||
name = Templates
|
name = Templates
|
||||||
config_version = 1.0.0
|
config_version = 1.0.1
|
||||||
config_update_url = https://files.prusa3d.com/wp-content/uploads/repository/PrusaSlicer-settings-master/live/Templates/
|
config_update_url = https://files.prusa3d.com/wp-content/uploads/repository/PrusaSlicer-settings-master/live/Templates/
|
||||||
templates_profile = 1
|
templates_profile = 1
|
||||||
|
|
||||||
## Generic filament profiles
|
## Generic filament profiles
|
||||||
|
|
||||||
# Print profiles for the Prusa Research printers.
|
|
||||||
|
|
||||||
[filament:*common*]
|
[filament:*common*]
|
||||||
cooling = 1
|
cooling = 1
|
||||||
compatible_printers =
|
compatible_printers =
|
||||||
@ -1547,6 +1545,16 @@ filament_density = 1.27
|
|||||||
filament_spool_weight = 201
|
filament_spool_weight = 201
|
||||||
filament_type = PETG
|
filament_type = PETG
|
||||||
|
|
||||||
|
[filament:Prusament PETG Carbon Fiber]
|
||||||
|
inherits = Prusament PETG
|
||||||
|
filament_vendor = Prusa Polymers
|
||||||
|
first_layer_temperature = 260
|
||||||
|
temperature = 265
|
||||||
|
extrusion_multiplier = 1.03
|
||||||
|
filament_cost = 54.99
|
||||||
|
filament_density = 1.27
|
||||||
|
filament_colour = #BBBBBB
|
||||||
|
|
||||||
[filament:Prusa PLA]
|
[filament:Prusa PLA]
|
||||||
inherits = *PLA*
|
inherits = *PLA*
|
||||||
filament_vendor = Made for Prusa
|
filament_vendor = Made for Prusa
|
||||||
@ -2055,6 +2063,21 @@ fan_always_on = 1
|
|||||||
max_fan_speed = 15
|
max_fan_speed = 15
|
||||||
min_fan_speed = 15
|
min_fan_speed = 15
|
||||||
|
|
||||||
|
[filament:Fiberthree F3 PA-GF30 Pro]
|
||||||
|
inherits = Prusament PC Blend Carbon Fiber
|
||||||
|
filament_vendor = Fiberthree
|
||||||
|
filament_cost = 208.01
|
||||||
|
filament_density = 1.35
|
||||||
|
extrusion_multiplier = 1.03
|
||||||
|
first_layer_temperature = 275
|
||||||
|
temperature = 285
|
||||||
|
first_layer_bed_temperature = 90
|
||||||
|
bed_temperature = 90
|
||||||
|
fan_below_layer_time = 10
|
||||||
|
max_fan_speed = 15
|
||||||
|
min_fan_speed = 15
|
||||||
|
filament_type = PA
|
||||||
|
|
||||||
[filament:Taulman T-Glase]
|
[filament:Taulman T-Glase]
|
||||||
inherits = *PET*
|
inherits = *PET*
|
||||||
filament_vendor = Taulman
|
filament_vendor = Taulman
|
||||||
|
@ -930,4 +930,30 @@ double rotation_diff_z(const Transform3d &trafo_from, const Transform3d &trafo_t
|
|||||||
return atan2(vx.y(), vx.x());
|
return atan2(vx.y(), vx.x());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool trafos_differ_in_rotation_by_z_and_mirroring_by_xy_only(const Transform3d &t1, const Transform3d &t2)
|
||||||
|
{
|
||||||
|
if (std::abs(t1.translation().z() - t2.translation().z()) > EPSILON)
|
||||||
|
// One of the object is higher than the other above the build plate (or below the build plate).
|
||||||
|
return false;
|
||||||
|
Matrix3d m1 = t1.matrix().block<3, 3>(0, 0);
|
||||||
|
Matrix3d m2 = t2.matrix().block<3, 3>(0, 0);
|
||||||
|
Matrix3d m = m2.inverse() * m1;
|
||||||
|
Vec3d z = m.block<3, 1>(0, 2);
|
||||||
|
if (std::abs(z.x()) > EPSILON || std::abs(z.y()) > EPSILON || std::abs(z.z() - 1.) > EPSILON)
|
||||||
|
// Z direction or length changed.
|
||||||
|
return false;
|
||||||
|
// Z still points in the same direction and it has the same length.
|
||||||
|
Vec3d x = m.block<3, 1>(0, 0);
|
||||||
|
Vec3d y = m.block<3, 1>(0, 1);
|
||||||
|
if (std::abs(x.z()) > EPSILON || std::abs(y.z()) > EPSILON)
|
||||||
|
return false;
|
||||||
|
double lx2 = x.squaredNorm();
|
||||||
|
double ly2 = y.squaredNorm();
|
||||||
|
if (lx2 - 1. > EPSILON * EPSILON || ly2 - 1. > EPSILON * EPSILON)
|
||||||
|
return false;
|
||||||
|
// Verify whether the vectors x, y are still perpendicular.
|
||||||
|
double d = x.dot(y);
|
||||||
|
return std::abs(d * d) < EPSILON * lx2 * ly2;
|
||||||
|
}
|
||||||
|
|
||||||
}} // namespace Slic3r::Geometry
|
}} // namespace Slic3r::Geometry
|
||||||
|
@ -584,6 +584,13 @@ inline bool is_rotation_ninety_degrees(const Vec3d &rotation)
|
|||||||
return is_rotation_ninety_degrees(rotation.x()) && is_rotation_ninety_degrees(rotation.y()) && is_rotation_ninety_degrees(rotation.z());
|
return is_rotation_ninety_degrees(rotation.x()) && is_rotation_ninety_degrees(rotation.y()) && is_rotation_ninety_degrees(rotation.z());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Returns true if one transformation may be converted into another transformation by
|
||||||
|
// rotation around Z and by mirroring in X / Y only. Two objects sharing such transformation
|
||||||
|
// may share support structures and they share Z height.
|
||||||
|
bool trafos_differ_in_rotation_by_z_and_mirroring_by_xy_only(const Transform3d &t1, const Transform3d &t2);
|
||||||
|
inline bool trafos_differ_in_rotation_by_z_and_mirroring_by_xy_only(const Transformation &t1, const Transformation &t2)
|
||||||
|
{ return trafos_differ_in_rotation_by_z_and_mirroring_by_xy_only(t1.get_matrix(), t2.get_matrix()); }
|
||||||
|
|
||||||
template <class Tout = double, class Tin>
|
template <class Tout = double, class Tin>
|
||||||
std::pair<Tout, Tout> dir_to_spheric(const Vec<3, Tin> &n, Tout norm = 1.)
|
std::pair<Tout, Tout> dir_to_spheric(const Vec<3, Tin> &n, Tout norm = 1.)
|
||||||
{
|
{
|
||||||
|
@ -643,15 +643,7 @@ ModelObject& ModelObject::assign_copy(const ModelObject &rhs)
|
|||||||
this->printable = rhs.printable;
|
this->printable = rhs.printable;
|
||||||
this->origin_translation = rhs.origin_translation;
|
this->origin_translation = rhs.origin_translation;
|
||||||
this->cut_id.copy(rhs.cut_id);
|
this->cut_id.copy(rhs.cut_id);
|
||||||
m_bounding_box_approx = rhs.m_bounding_box_approx;
|
this->copy_transformation_caches(rhs);
|
||||||
m_bounding_box_approx_valid = rhs.m_bounding_box_approx_valid;
|
|
||||||
m_bounding_box_exact = rhs.m_bounding_box_exact;
|
|
||||||
m_bounding_box_exact_valid = rhs.m_bounding_box_exact_valid;
|
|
||||||
m_min_max_z_valid = rhs.m_min_max_z_valid;
|
|
||||||
m_raw_bounding_box = rhs.m_raw_bounding_box;
|
|
||||||
m_raw_bounding_box_valid = rhs.m_raw_bounding_box_valid;
|
|
||||||
m_raw_mesh_bounding_box = rhs.m_raw_mesh_bounding_box;
|
|
||||||
m_raw_mesh_bounding_box_valid = rhs.m_raw_mesh_bounding_box_valid;
|
|
||||||
|
|
||||||
this->clear_volumes();
|
this->clear_volumes();
|
||||||
this->volumes.reserve(rhs.volumes.size());
|
this->volumes.reserve(rhs.volumes.size());
|
||||||
@ -687,15 +679,7 @@ ModelObject& ModelObject::assign_copy(ModelObject &&rhs)
|
|||||||
this->layer_height_profile = std::move(rhs.layer_height_profile);
|
this->layer_height_profile = std::move(rhs.layer_height_profile);
|
||||||
this->printable = std::move(rhs.printable);
|
this->printable = std::move(rhs.printable);
|
||||||
this->origin_translation = std::move(rhs.origin_translation);
|
this->origin_translation = std::move(rhs.origin_translation);
|
||||||
m_bounding_box_approx = std::move(rhs.m_bounding_box_approx);
|
this->copy_transformation_caches(rhs);
|
||||||
m_bounding_box_approx_valid = std::move(rhs.m_bounding_box_approx_valid);
|
|
||||||
m_bounding_box_exact = std::move(rhs.m_bounding_box_exact);
|
|
||||||
m_bounding_box_exact_valid = std::move(rhs.m_bounding_box_exact_valid);
|
|
||||||
m_min_max_z_valid = rhs.m_min_max_z_valid;
|
|
||||||
m_raw_bounding_box = rhs.m_raw_bounding_box;
|
|
||||||
m_raw_bounding_box_valid = rhs.m_raw_bounding_box_valid;
|
|
||||||
m_raw_mesh_bounding_box = rhs.m_raw_mesh_bounding_box;
|
|
||||||
m_raw_mesh_bounding_box_valid = rhs.m_raw_mesh_bounding_box_valid;
|
|
||||||
|
|
||||||
this->clear_volumes();
|
this->clear_volumes();
|
||||||
this->volumes = std::move(rhs.volumes);
|
this->volumes = std::move(rhs.volumes);
|
||||||
|
@ -606,6 +606,19 @@ private:
|
|||||||
mutable BoundingBoxf3 m_raw_mesh_bounding_box;
|
mutable BoundingBoxf3 m_raw_mesh_bounding_box;
|
||||||
mutable bool m_raw_mesh_bounding_box_valid { false };
|
mutable bool m_raw_mesh_bounding_box_valid { false };
|
||||||
|
|
||||||
|
// Only use this method if now the source and dest ModelObjects are equal, for example they were synchronized by Print::apply().
|
||||||
|
void copy_transformation_caches(const ModelObject &src) {
|
||||||
|
m_bounding_box_approx = src.m_bounding_box_approx;
|
||||||
|
m_bounding_box_approx_valid = src.m_bounding_box_approx_valid;
|
||||||
|
m_bounding_box_exact = src.m_bounding_box_exact;
|
||||||
|
m_bounding_box_exact_valid = src.m_bounding_box_exact_valid;
|
||||||
|
m_min_max_z_valid = src.m_min_max_z_valid;
|
||||||
|
m_raw_bounding_box = src.m_raw_bounding_box;
|
||||||
|
m_raw_bounding_box_valid = src.m_raw_bounding_box_valid;
|
||||||
|
m_raw_mesh_bounding_box = src.m_raw_mesh_bounding_box;
|
||||||
|
m_raw_mesh_bounding_box_valid = src.m_raw_mesh_bounding_box_valid;
|
||||||
|
}
|
||||||
|
|
||||||
// Called by Print::apply() to set the model pointer after making a copy.
|
// Called by Print::apply() to set the model pointer after making a copy.
|
||||||
friend class Print;
|
friend class Print;
|
||||||
friend class SLAPrint;
|
friend class SLAPrint;
|
||||||
|
@ -875,6 +875,38 @@ namespace client
|
|||||||
output.it_range = boost::iterator_range<Iterator>(opt.it_range.begin(), it_end);
|
output.it_range = boost::iterator_range<Iterator>(opt.it_range.begin(), it_end);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Return a boolean value, true if the scalar variable referenced by "opt" is nullable and it has a nil value.
|
||||||
|
template <typename Iterator>
|
||||||
|
static void is_nil_test_scalar(
|
||||||
|
const MyContext *ctx,
|
||||||
|
OptWithPos<Iterator> &opt,
|
||||||
|
expr<Iterator> &output)
|
||||||
|
{
|
||||||
|
if (opt.opt->is_vector())
|
||||||
|
ctx->throw_exception("Referencing a vector variable when scalar is expected", opt.it_range);
|
||||||
|
output.set_b(opt.opt->is_nil());
|
||||||
|
output.it_range = opt.it_range;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Return a boolean value, true if an element of a vector variable referenced by "opt[index]" is nullable and it has a nil value.
|
||||||
|
template <typename Iterator>
|
||||||
|
static void is_nil_test_vector(
|
||||||
|
const MyContext *ctx,
|
||||||
|
OptWithPos<Iterator> &opt,
|
||||||
|
int &index,
|
||||||
|
Iterator it_end,
|
||||||
|
expr<Iterator> &output)
|
||||||
|
{
|
||||||
|
if (opt.opt->is_scalar())
|
||||||
|
ctx->throw_exception("Referencing a scalar variable when vector is expected", opt.it_range);
|
||||||
|
const ConfigOptionVectorBase *vec = static_cast<const ConfigOptionVectorBase*>(opt.opt);
|
||||||
|
if (vec->empty())
|
||||||
|
ctx->throw_exception("Indexing an empty vector variable", opt.it_range);
|
||||||
|
size_t idx = (index < 0) ? 0 : (index >= int(vec->size())) ? 0 : size_t(index);
|
||||||
|
output.set_b(static_cast<const ConfigOptionVectorBase*>(opt.opt)->is_nil(idx));
|
||||||
|
output.it_range = boost::iterator_range<Iterator>(opt.it_range.begin(), it_end);
|
||||||
|
}
|
||||||
|
|
||||||
// Verify that the expression returns an integer, which may be used
|
// Verify that the expression returns an integer, which may be used
|
||||||
// to address a vector.
|
// to address a vector.
|
||||||
template <typename Iterator>
|
template <typename Iterator>
|
||||||
@ -973,6 +1005,7 @@ namespace client
|
|||||||
{ "unary_expression", "Expecting an expression." },
|
{ "unary_expression", "Expecting an expression." },
|
||||||
{ "optional_parameter", "Expecting a closing brace or an optional parameter." },
|
{ "optional_parameter", "Expecting a closing brace or an optional parameter." },
|
||||||
{ "scalar_variable_reference", "Expecting a scalar variable reference."},
|
{ "scalar_variable_reference", "Expecting a scalar variable reference."},
|
||||||
|
{ "is_nil_test", "Expecting a scalar variable reference."},
|
||||||
{ "variable_reference", "Expecting a variable reference."},
|
{ "variable_reference", "Expecting a variable reference."},
|
||||||
{ "regular_expression", "Expecting a regular expression."}
|
{ "regular_expression", "Expecting a regular expression."}
|
||||||
};
|
};
|
||||||
@ -1259,6 +1292,7 @@ namespace client
|
|||||||
[ px::bind(&expr<Iterator>::template digits<true>, _val, _2, _3) ]
|
[ px::bind(&expr<Iterator>::template digits<true>, _val, _2, _3) ]
|
||||||
| (kw["int"] > '(' > conditional_expression(_r1) > ')') [ px::bind(&FactorActions::to_int, _1, _val) ]
|
| (kw["int"] > '(' > conditional_expression(_r1) > ')') [ px::bind(&FactorActions::to_int, _1, _val) ]
|
||||||
| (kw["round"] > '(' > conditional_expression(_r1) > ')') [ px::bind(&FactorActions::round, _1, _val) ]
|
| (kw["round"] > '(' > conditional_expression(_r1) > ')') [ px::bind(&FactorActions::round, _1, _val) ]
|
||||||
|
| (kw["is_nil"] > '(' > is_nil_test(_r1) > ')') [_val = _1]
|
||||||
| (strict_double > iter_pos) [ px::bind(&FactorActions::double_, _1, _2, _val) ]
|
| (strict_double > iter_pos) [ px::bind(&FactorActions::double_, _1, _2, _val) ]
|
||||||
| (int_ > iter_pos) [ px::bind(&FactorActions::int_, _1, _2, _val) ]
|
| (int_ > iter_pos) [ px::bind(&FactorActions::int_, _1, _2, _val) ]
|
||||||
| (kw[bool_] > iter_pos) [ px::bind(&FactorActions::bool_, _1, _2, _val) ]
|
| (kw[bool_] > iter_pos) [ px::bind(&FactorActions::bool_, _1, _2, _val) ]
|
||||||
@ -1286,6 +1320,15 @@ namespace client
|
|||||||
[ px::bind(&MyContext::resolve_variable<Iterator>, _r1, _1, _val) ];
|
[ px::bind(&MyContext::resolve_variable<Iterator>, _r1, _1, _val) ];
|
||||||
variable_reference.name("variable reference");
|
variable_reference.name("variable reference");
|
||||||
|
|
||||||
|
is_nil_test =
|
||||||
|
variable_reference(_r1)[_a=_1] >>
|
||||||
|
(
|
||||||
|
('[' > additive_expression(_r1)[px::bind(&MyContext::evaluate_index<Iterator>, _1, _b)] > ']' >
|
||||||
|
iter_pos[px::bind(&MyContext::is_nil_test_vector<Iterator>, _r1, _a, _b, _1, _val)])
|
||||||
|
| eps[px::bind(&MyContext::is_nil_test_scalar<Iterator>, _r1, _a, _val)]
|
||||||
|
);
|
||||||
|
is_nil_test.name("is_nil test");
|
||||||
|
|
||||||
regular_expression = raw[lexeme['/' > *((utf8char - char_('\\') - char_('/')) | ('\\' > char_)) > '/']];
|
regular_expression = raw[lexeme['/' > *((utf8char - char_('\\') - char_('/')) | ('\\' > char_)) > '/']];
|
||||||
regular_expression.name("regular_expression");
|
regular_expression.name("regular_expression");
|
||||||
|
|
||||||
@ -1295,6 +1338,7 @@ namespace client
|
|||||||
("zdigits")
|
("zdigits")
|
||||||
("if")
|
("if")
|
||||||
("int")
|
("int")
|
||||||
|
("is_nil")
|
||||||
//("inf")
|
//("inf")
|
||||||
("else")
|
("else")
|
||||||
("elsif")
|
("elsif")
|
||||||
@ -1329,6 +1373,7 @@ namespace client
|
|||||||
debug(optional_parameter);
|
debug(optional_parameter);
|
||||||
debug(scalar_variable_reference);
|
debug(scalar_variable_reference);
|
||||||
debug(variable_reference);
|
debug(variable_reference);
|
||||||
|
debug(is_nil_test);
|
||||||
debug(regular_expression);
|
debug(regular_expression);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1374,6 +1419,8 @@ namespace client
|
|||||||
qi::rule<Iterator, expr<Iterator>(const MyContext*), qi::locals<OptWithPos<Iterator>, int>, spirit_encoding::space_type> scalar_variable_reference;
|
qi::rule<Iterator, expr<Iterator>(const MyContext*), qi::locals<OptWithPos<Iterator>, int>, spirit_encoding::space_type> scalar_variable_reference;
|
||||||
// Rule to translate an identifier to a ConfigOption, or to fail.
|
// Rule to translate an identifier to a ConfigOption, or to fail.
|
||||||
qi::rule<Iterator, OptWithPos<Iterator>(const MyContext*), spirit_encoding::space_type> variable_reference;
|
qi::rule<Iterator, OptWithPos<Iterator>(const MyContext*), spirit_encoding::space_type> variable_reference;
|
||||||
|
// Evaluating whether a nullable variable is nil.
|
||||||
|
qi::rule<Iterator, expr<Iterator>(const MyContext*), qi::locals<OptWithPos<Iterator>, int>, spirit_encoding::space_type> is_nil_test;
|
||||||
|
|
||||||
qi::rule<Iterator, std::string(const MyContext*), qi::locals<bool, bool>, spirit_encoding::space_type> if_else_output;
|
qi::rule<Iterator, std::string(const MyContext*), qi::locals<bool, bool>, spirit_encoding::space_type> if_else_output;
|
||||||
// qi::rule<Iterator, std::string(const MyContext*), qi::locals<expr<Iterator>, bool, std::string>, spirit_encoding::space_type> switch_output;
|
// qi::rule<Iterator, std::string(const MyContext*), qi::locals<expr<Iterator>, bool, std::string>, spirit_encoding::space_type> switch_output;
|
||||||
|
@ -1250,7 +1250,6 @@ Print::ApplyStatus Print::apply(const Model &model, DynamicPrintConfig new_full_
|
|||||||
l->get_transformation().get_matrix().isApprox(r->get_transformation().get_matrix()); })) {
|
l->get_transformation().get_matrix().isApprox(r->get_transformation().get_matrix()); })) {
|
||||||
// If some of the instances changed, the bounding box of the updated ModelObject is likely no more valid.
|
// If some of the instances changed, the bounding box of the updated ModelObject is likely no more valid.
|
||||||
// This is safe as the ModelObject's bounding box is only accessed from this function, which is called from the main thread only.
|
// This is safe as the ModelObject's bounding box is only accessed from this function, which is called from the main thread only.
|
||||||
model_object.invalidate_bounding_box();
|
|
||||||
// Synchronize the content of instances.
|
// Synchronize the content of instances.
|
||||||
auto new_instance = model_object_new.instances.begin();
|
auto new_instance = model_object_new.instances.begin();
|
||||||
for (auto old_instance = model_object.instances.begin(); old_instance != model_object.instances.end(); ++ old_instance, ++ new_instance) {
|
for (auto old_instance = model_object.instances.begin(); old_instance != model_object.instances.end(); ++ old_instance, ++ new_instance) {
|
||||||
@ -1259,6 +1258,8 @@ Print::ApplyStatus Print::apply(const Model &model, DynamicPrintConfig new_full_
|
|||||||
(*old_instance)->printable = (*new_instance)->printable;
|
(*old_instance)->printable = (*new_instance)->printable;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// Source / dest object share the same bounding boxes, just copy them.
|
||||||
|
model_object.copy_transformation_caches(model_object_new);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2954,7 +2954,7 @@ SupportGeneratorLayersPtr generate_raft_base(
|
|||||||
Polygons columns;
|
Polygons columns;
|
||||||
Polygons first_layer;
|
Polygons first_layer;
|
||||||
if (columns_base != nullptr) {
|
if (columns_base != nullptr) {
|
||||||
if (columns_base->print_z > slicing_params.raft_contact_top_z - EPSILON) {
|
if (columns_base->bottom_print_z() > slicing_params.raft_interface_top_z - EPSILON) {
|
||||||
// Classic supports with colums above the raft interface.
|
// Classic supports with colums above the raft interface.
|
||||||
base = columns_base->polygons;
|
base = columns_base->polygons;
|
||||||
columns = base;
|
columns = base;
|
||||||
|
@ -130,8 +130,10 @@ TreeSupportSettings::TreeSupportSettings(const TreeSupportMeshGroupSettings& mes
|
|||||||
this->raft_layers.emplace_back(z);
|
this->raft_layers.emplace_back(z);
|
||||||
}
|
}
|
||||||
// Raft contact layer
|
// Raft contact layer
|
||||||
z = slicing_params.raft_contact_top_z;
|
if (slicing_params.raft_layers() > 1) {
|
||||||
this->raft_layers.emplace_back(z);
|
z = slicing_params.raft_contact_top_z;
|
||||||
|
this->raft_layers.emplace_back(z);
|
||||||
|
}
|
||||||
if (double dist_to_go = slicing_params.object_print_z_min - z; dist_to_go > EPSILON) {
|
if (double dist_to_go = slicing_params.object_print_z_min - z; dist_to_go > EPSILON) {
|
||||||
// Layers between the raft contacts and bottom of the object.
|
// Layers between the raft contacts and bottom of the object.
|
||||||
auto nsteps = int(ceil(dist_to_go / slicing_params.max_suport_layer_height));
|
auto nsteps = int(ceil(dist_to_go / slicing_params.max_suport_layer_height));
|
||||||
@ -991,6 +993,30 @@ inline SupportGeneratorLayer& layer_allocate(
|
|||||||
return layer_initialize(layer_storage.back(), layer_type, slicing_params, config, layer_idx);
|
return layer_initialize(layer_storage.back(), layer_type, slicing_params, config, layer_idx);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int generate_raft_contact(
|
||||||
|
const PrintObject &print_object,
|
||||||
|
const TreeSupportSettings &config,
|
||||||
|
SupportGeneratorLayersPtr &top_contacts,
|
||||||
|
SupportGeneratorLayerStorage &layer_storage)
|
||||||
|
{
|
||||||
|
int raft_contact_layer_idx = -1;
|
||||||
|
if (print_object.has_raft() && print_object.layer_count() > 0) {
|
||||||
|
// Produce raft contact layer outside of the tree support loop, so that no trees will be generated for the raft contact layer.
|
||||||
|
// Raft layers supporting raft contact interface will be produced by the classic raft generator.
|
||||||
|
// Find the raft contact layer.
|
||||||
|
raft_contact_layer_idx = int(config.raft_layers.size()) - 1;
|
||||||
|
while (raft_contact_layer_idx > 0 && config.raft_layers[raft_contact_layer_idx] > print_object.slicing_parameters().raft_contact_top_z + EPSILON)
|
||||||
|
-- raft_contact_layer_idx;
|
||||||
|
// Create the raft contact layer.
|
||||||
|
SupportGeneratorLayer &raft_contact_layer = layer_allocate(layer_storage, SupporLayerType::TopContact, print_object.slicing_parameters(), config, raft_contact_layer_idx);
|
||||||
|
top_contacts[raft_contact_layer_idx] = &raft_contact_layer;
|
||||||
|
const ExPolygons &lslices = print_object.get_layer(0)->lslices;
|
||||||
|
double expansion = print_object.config().raft_expansion.value;
|
||||||
|
raft_contact_layer.polygons = expansion > 0 ? expand(lslices, scaled<float>(expansion)) : to_polygons(lslices);
|
||||||
|
}
|
||||||
|
return raft_contact_layer_idx;
|
||||||
|
}
|
||||||
|
|
||||||
using SupportElements = std::deque<SupportElement>;
|
using SupportElements = std::deque<SupportElement>;
|
||||||
/*!
|
/*!
|
||||||
* \brief Creates the initial influence areas (that can later be propagated down) by placing them below the overhang.
|
* \brief Creates the initial influence areas (that can later be propagated down) by placing them below the overhang.
|
||||||
@ -1064,24 +1090,7 @@ static void generate_initial_areas(
|
|||||||
const size_t num_raft_layers = config.raft_layers.size();
|
const size_t num_raft_layers = config.raft_layers.size();
|
||||||
const size_t num_support_layers = size_t(std::max(0, int(print_object.layer_count()) + int(num_raft_layers) - int(z_distance_delta)));
|
const size_t num_support_layers = size_t(std::max(0, int(print_object.layer_count()) + int(num_raft_layers) - int(z_distance_delta)));
|
||||||
const size_t first_support_layer = std::max(int(num_raft_layers) - int(z_distance_delta), 1);
|
const size_t first_support_layer = std::max(int(num_raft_layers) - int(z_distance_delta), 1);
|
||||||
size_t first_tree_layer = 0;
|
const int raft_contact_layer_idx = generate_raft_contact(print_object, config, top_contacts, layer_storage);
|
||||||
|
|
||||||
size_t raft_contact_layer_idx = std::numeric_limits<size_t>::max();
|
|
||||||
if (num_raft_layers > 0 && print_object.layer_count() > 0) {
|
|
||||||
// Produce raft contact layer outside of the tree support loop, so that no trees will be generated for the raft contact layer.
|
|
||||||
// Raft layers supporting raft contact interface will be produced by the classic raft generator.
|
|
||||||
// Find the raft contact layer.
|
|
||||||
raft_contact_layer_idx = config.raft_layers.size() - 1;
|
|
||||||
while (raft_contact_layer_idx > 0 && config.raft_layers[raft_contact_layer_idx] > print_object.slicing_parameters().raft_contact_top_z + EPSILON)
|
|
||||||
-- raft_contact_layer_idx;
|
|
||||||
// Create the raft contact layer.
|
|
||||||
SupportGeneratorLayer &raft_contact_layer = layer_allocate(layer_storage, SupporLayerType::TopContact, print_object.slicing_parameters(), config, raft_contact_layer_idx);
|
|
||||||
top_contacts[raft_contact_layer_idx] = &raft_contact_layer;
|
|
||||||
const ExPolygons &lslices = print_object.get_layer(0)->lslices;
|
|
||||||
double expansion = print_object.config().raft_expansion.value;
|
|
||||||
raft_contact_layer.polygons = expansion > 0 ? expand(lslices, scaled<float>(expansion)) : to_polygons(lslices);
|
|
||||||
first_tree_layer = print_object.slicing_parameters().raft_layers() - 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::mutex mutex_layer_storage, mutex_movebounds;
|
std::mutex mutex_layer_storage, mutex_movebounds;
|
||||||
std::vector<std::unordered_set<Point, PointHash>> already_inserted(num_support_layers);
|
std::vector<std::unordered_set<Point, PointHash>> already_inserted(num_support_layers);
|
||||||
@ -1434,47 +1443,50 @@ static void generate_initial_areas(
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
// Remove tree tips that start below the raft contact,
|
if (raft_contact_layer_idx >= 0) {
|
||||||
// remove interface layers below the raft contact.
|
const size_t first_tree_layer = print_object.slicing_parameters().raft_layers() - 1;
|
||||||
for (size_t i = 0; i < first_tree_layer; ++i) {
|
// Remove tree tips that start below the raft contact,
|
||||||
top_contacts[i] = nullptr;
|
// remove interface layers below the raft contact.
|
||||||
move_bounds[i].clear();
|
for (size_t i = 0; i < first_tree_layer; ++i) {
|
||||||
}
|
top_contacts[i] = nullptr;
|
||||||
if (raft_contact_layer_idx != std::numeric_limits<size_t>::max() && print_object.config().raft_expansion.value > 0) {
|
move_bounds[i].clear();
|
||||||
// If any tips at first_tree_layer now are completely inside the expanded raft layer, remove them as well before they are propagated to the ground.
|
}
|
||||||
Polygons &raft_polygons = top_contacts[raft_contact_layer_idx]->polygons;
|
if (raft_contact_layer_idx >= 0 && print_object.config().raft_expansion.value > 0) {
|
||||||
EdgeGrid::Grid grid(get_extents(raft_polygons).inflated(SCALED_EPSILON));
|
// If any tips at first_tree_layer now are completely inside the expanded raft layer, remove them as well before they are propagated to the ground.
|
||||||
grid.create(raft_polygons, Polylines{}, coord_t(scale_(10.)));
|
Polygons &raft_polygons = top_contacts[raft_contact_layer_idx]->polygons;
|
||||||
SupportElements &first_layer_move_bounds = move_bounds[first_tree_layer];
|
EdgeGrid::Grid grid(get_extents(raft_polygons).inflated(SCALED_EPSILON));
|
||||||
double threshold = scaled<double>(print_object.config().raft_expansion.value) * 2.;
|
grid.create(raft_polygons, Polylines{}, coord_t(scale_(10.)));
|
||||||
first_layer_move_bounds.erase(std::remove_if(first_layer_move_bounds.begin(), first_layer_move_bounds.end(),
|
SupportElements &first_layer_move_bounds = move_bounds[first_tree_layer];
|
||||||
[&grid, threshold](const SupportElement &el) {
|
double threshold = scaled<double>(print_object.config().raft_expansion.value) * 2.;
|
||||||
coordf_t dist;
|
first_layer_move_bounds.erase(std::remove_if(first_layer_move_bounds.begin(), first_layer_move_bounds.end(),
|
||||||
if (grid.signed_distance_edges(el.state.result_on_layer, threshold, dist)) {
|
[&grid, threshold](const SupportElement &el) {
|
||||||
assert(std::abs(dist) < threshold + SCALED_EPSILON);
|
coordf_t dist;
|
||||||
// Support point is inside the expanded raft, remove it.
|
if (grid.signed_distance_edges(el.state.result_on_layer, threshold, dist)) {
|
||||||
return dist < - 0.;
|
assert(std::abs(dist) < threshold + SCALED_EPSILON);
|
||||||
}
|
// Support point is inside the expanded raft, remove it.
|
||||||
return false;
|
return dist < - 0.;
|
||||||
}), first_layer_move_bounds.end());
|
}
|
||||||
#if 0
|
return false;
|
||||||
// Remove the remaining tips from the raft: Closing operation on tip circles.
|
}), first_layer_move_bounds.end());
|
||||||
if (! first_layer_move_bounds.empty()) {
|
#if 0
|
||||||
const double eps = 0.1;
|
// Remove the remaining tips from the raft: Closing operation on tip circles.
|
||||||
// All tips supporting this layer are expected to have the same radius.
|
if (! first_layer_move_bounds.empty()) {
|
||||||
double radius = config.getRadius(first_layer_move_bounds.front().state);
|
const double eps = 0.1;
|
||||||
// Connect the tips with the following closing radius.
|
// All tips supporting this layer are expected to have the same radius.
|
||||||
double closing_distance = radius;
|
double radius = config.getRadius(first_layer_move_bounds.front().state);
|
||||||
Polygon circle = make_circle(radius + closing_distance, eps);
|
// Connect the tips with the following closing radius.
|
||||||
Polygons circles;
|
double closing_distance = radius;
|
||||||
circles.reserve(first_layer_move_bounds.size());
|
Polygon circle = make_circle(radius + closing_distance, eps);
|
||||||
for (const SupportElement &el : first_layer_move_bounds) {
|
Polygons circles;
|
||||||
circles.emplace_back(circle);
|
circles.reserve(first_layer_move_bounds.size());
|
||||||
circles.back().translate(el.state.result_on_layer);
|
for (const SupportElement &el : first_layer_move_bounds) {
|
||||||
}
|
circles.emplace_back(circle);
|
||||||
raft_polygons = diff(raft_polygons, offset(union_(circles), - closing_distance));
|
circles.back().translate(el.state.result_on_layer);
|
||||||
|
}
|
||||||
|
raft_polygons = diff(raft_polygons, offset(union_(circles), - closing_distance));
|
||||||
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -4201,79 +4213,90 @@ static void generate_support_areas(Print &print, const BuildVolume &build_volume
|
|||||||
std::vector<Polygons> overhangs = generate_overhangs(config, *print.get_object(processing.second.front()), throw_on_cancel);
|
std::vector<Polygons> overhangs = generate_overhangs(config, *print.get_object(processing.second.front()), throw_on_cancel);
|
||||||
|
|
||||||
// ### Precalculate avoidances, collision etc.
|
// ### Precalculate avoidances, collision etc.
|
||||||
size_t num_support_layers = precalculate(print, overhangs, processing.first, processing.second, volumes, throw_on_cancel);
|
|
||||||
if (num_support_layers == 0)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
auto t_precalc = std::chrono::high_resolution_clock::now();
|
|
||||||
|
|
||||||
// value is the area where support may be placed. As this is calculated in CreateLayerPathing it is saved and reused in draw_areas
|
|
||||||
std::vector<SupportElements> move_bounds(num_support_layers);
|
|
||||||
|
|
||||||
// ### Place tips of the support tree
|
|
||||||
SupportGeneratorLayersPtr bottom_contacts(num_support_layers, nullptr);
|
|
||||||
SupportGeneratorLayersPtr top_contacts(num_support_layers, nullptr);
|
|
||||||
SupportGeneratorLayersPtr top_interface_layers(num_support_layers, nullptr);
|
|
||||||
SupportGeneratorLayersPtr intermediate_layers(num_support_layers, nullptr);
|
|
||||||
SupportGeneratorLayerStorage layer_storage;
|
SupportGeneratorLayerStorage layer_storage;
|
||||||
|
SupportGeneratorLayersPtr top_contacts;
|
||||||
|
SupportGeneratorLayersPtr bottom_contacts;
|
||||||
|
SupportGeneratorLayersPtr top_interface_layers;
|
||||||
|
SupportGeneratorLayersPtr intermediate_layers;
|
||||||
|
|
||||||
for (size_t mesh_idx : processing.second)
|
if (size_t num_support_layers = precalculate(print, overhangs, processing.first, processing.second, volumes, throw_on_cancel);
|
||||||
generate_initial_areas(*print.get_object(mesh_idx), volumes, config, overhangs, move_bounds, top_contacts, top_interface_layers, layer_storage, throw_on_cancel);
|
num_support_layers > 0) {
|
||||||
auto t_gen = std::chrono::high_resolution_clock::now();
|
|
||||||
|
|
||||||
#ifdef TREESUPPORT_DEBUG_SVG
|
auto t_precalc = std::chrono::high_resolution_clock::now();
|
||||||
for (size_t layer_idx = 0; layer_idx < move_bounds.size(); ++layer_idx) {
|
|
||||||
Polygons polys;
|
// value is the area where support may be placed. As this is calculated in CreateLayerPathing it is saved and reused in draw_areas
|
||||||
for (auto& area : move_bounds[layer_idx])
|
std::vector<SupportElements> move_bounds(num_support_layers);
|
||||||
append(polys, area.influence_area);
|
|
||||||
if (auto begin = move_bounds[layer_idx].begin(); begin != move_bounds[layer_idx].end())
|
// ### Place tips of the support tree
|
||||||
SVG::export_expolygons(debug_out_path("treesupport-initial_areas-%d.svg", layer_idx),
|
top_contacts .assign(num_support_layers, nullptr);
|
||||||
{ { { union_ex(volumes.getWallRestriction(config.getCollisionRadius(begin->state), layer_idx, begin->state.use_min_xy_dist)) },
|
bottom_contacts .assign(num_support_layers, nullptr);
|
||||||
{ "wall_restricrictions", "gray", 0.5f } },
|
top_interface_layers.assign(num_support_layers, nullptr);
|
||||||
{ { union_ex(polys) }, { "parent", "red", "black", "", scaled<coord_t>(0.1f), 0.5f } } });
|
intermediate_layers .assign(num_support_layers, nullptr);
|
||||||
|
|
||||||
|
for (size_t mesh_idx : processing.second)
|
||||||
|
generate_initial_areas(*print.get_object(mesh_idx), volumes, config, overhangs, move_bounds, top_contacts, top_interface_layers, layer_storage, throw_on_cancel);
|
||||||
|
auto t_gen = std::chrono::high_resolution_clock::now();
|
||||||
|
|
||||||
|
#ifdef TREESUPPORT_DEBUG_SVG
|
||||||
|
for (size_t layer_idx = 0; layer_idx < move_bounds.size(); ++layer_idx) {
|
||||||
|
Polygons polys;
|
||||||
|
for (auto& area : move_bounds[layer_idx])
|
||||||
|
append(polys, area.influence_area);
|
||||||
|
if (auto begin = move_bounds[layer_idx].begin(); begin != move_bounds[layer_idx].end())
|
||||||
|
SVG::export_expolygons(debug_out_path("treesupport-initial_areas-%d.svg", layer_idx),
|
||||||
|
{ { { union_ex(volumes.getWallRestriction(config.getCollisionRadius(begin->state), layer_idx, begin->state.use_min_xy_dist)) },
|
||||||
|
{ "wall_restricrictions", "gray", 0.5f } },
|
||||||
|
{ { union_ex(polys) }, { "parent", "red", "black", "", scaled<coord_t>(0.1f), 0.5f } } });
|
||||||
|
}
|
||||||
|
#endif // TREESUPPORT_DEBUG_SVG
|
||||||
|
|
||||||
|
// ### Propagate the influence areas downwards. This is an inherently serial operation.
|
||||||
|
create_layer_pathing(volumes, config, move_bounds, throw_on_cancel);
|
||||||
|
auto t_path = std::chrono::high_resolution_clock::now();
|
||||||
|
|
||||||
|
// ### Set a point in each influence area
|
||||||
|
create_nodes_from_area(volumes, config, move_bounds, throw_on_cancel);
|
||||||
|
auto t_place = std::chrono::high_resolution_clock::now();
|
||||||
|
|
||||||
|
// ### draw these points as circles
|
||||||
|
|
||||||
|
if (print_object.config().support_material_style == smsTree)
|
||||||
|
draw_areas(*print.get_object(processing.second.front()), volumes, config, overhangs, move_bounds,
|
||||||
|
bottom_contacts, top_contacts, intermediate_layers, layer_storage, throw_on_cancel);
|
||||||
|
else {
|
||||||
|
assert(print_object.config().support_material_style == smsOrganic);
|
||||||
|
indexed_triangle_set branches = draw_branches(*print.get_object(processing.second.front()), volumes, config, move_bounds, throw_on_cancel);
|
||||||
|
// Reduce memory footprint. After this point only slice_branches() will use volumes and from that only collisions with zero radius will be used.
|
||||||
|
volumes.clear_all_but_object_collision();
|
||||||
|
slice_branches(*print.get_object(processing.second.front()), volumes, config, overhangs, move_bounds, branches,
|
||||||
|
bottom_contacts, top_contacts, intermediate_layers, layer_storage, throw_on_cancel);
|
||||||
|
}
|
||||||
|
|
||||||
|
auto t_draw = std::chrono::high_resolution_clock::now();
|
||||||
|
auto dur_pre_gen = 0.001 * std::chrono::duration_cast<std::chrono::microseconds>(t_precalc - t_start).count();
|
||||||
|
auto dur_gen = 0.001 * std::chrono::duration_cast<std::chrono::microseconds>(t_gen - t_precalc).count();
|
||||||
|
auto dur_path = 0.001 * std::chrono::duration_cast<std::chrono::microseconds>(t_path - t_gen).count();
|
||||||
|
auto dur_place = 0.001 * std::chrono::duration_cast<std::chrono::microseconds>(t_place - t_path).count();
|
||||||
|
auto dur_draw = 0.001 * std::chrono::duration_cast<std::chrono::microseconds>(t_draw - t_place).count();
|
||||||
|
auto dur_total = 0.001 * std::chrono::duration_cast<std::chrono::microseconds>(t_draw - t_start).count();
|
||||||
|
BOOST_LOG_TRIVIAL(info) <<
|
||||||
|
"Total time used creating Tree support for the currently grouped meshes: " << dur_total << " ms. "
|
||||||
|
"Different subtasks:\nCalculating Avoidance: " << dur_pre_gen << " ms "
|
||||||
|
"Creating inital influence areas: " << dur_gen << " ms "
|
||||||
|
"Influence area creation: " << dur_path << "ms "
|
||||||
|
"Placement of Points in InfluenceAreas: " << dur_place << "ms "
|
||||||
|
"Drawing result as support " << dur_draw << " ms";
|
||||||
|
// if (config.branch_radius==2121)
|
||||||
|
// BOOST_LOG_TRIVIAL(error) << "Why ask questions when you already know the answer twice.\n (This is not a real bug, please dont report it.)";
|
||||||
|
|
||||||
|
move_bounds.clear();
|
||||||
|
} else {
|
||||||
|
top_contacts.assign(config.raft_layers.size(), nullptr);
|
||||||
|
if (generate_raft_contact(print_object, config, top_contacts, layer_storage) < 0)
|
||||||
|
// No raft.
|
||||||
|
continue;
|
||||||
}
|
}
|
||||||
#endif // TREESUPPORT_DEBUG_SVG
|
|
||||||
|
|
||||||
// ### Propagate the influence areas downwards. This is an inherently serial operation.
|
|
||||||
create_layer_pathing(volumes, config, move_bounds, throw_on_cancel);
|
|
||||||
auto t_path = std::chrono::high_resolution_clock::now();
|
|
||||||
|
|
||||||
// ### Set a point in each influence area
|
|
||||||
create_nodes_from_area(volumes, config, move_bounds, throw_on_cancel);
|
|
||||||
auto t_place = std::chrono::high_resolution_clock::now();
|
|
||||||
|
|
||||||
// ### draw these points as circles
|
|
||||||
|
|
||||||
if (print_object.config().support_material_style == smsTree)
|
|
||||||
draw_areas(*print.get_object(processing.second.front()), volumes, config, overhangs, move_bounds,
|
|
||||||
bottom_contacts, top_contacts, intermediate_layers, layer_storage, throw_on_cancel);
|
|
||||||
else {
|
|
||||||
assert(print_object.config().support_material_style == smsOrganic);
|
|
||||||
indexed_triangle_set branches = draw_branches(*print.get_object(processing.second.front()), volumes, config, move_bounds, throw_on_cancel);
|
|
||||||
// Reduce memory footprint. After this point only slice_branches() will use volumes and from that only collisions with zero radius will be used.
|
|
||||||
volumes.clear_all_but_object_collision();
|
|
||||||
slice_branches(*print.get_object(processing.second.front()), volumes, config, overhangs, move_bounds, branches,
|
|
||||||
bottom_contacts, top_contacts, intermediate_layers, layer_storage, throw_on_cancel);
|
|
||||||
}
|
|
||||||
|
|
||||||
auto t_draw = std::chrono::high_resolution_clock::now();
|
|
||||||
auto dur_pre_gen = 0.001 * std::chrono::duration_cast<std::chrono::microseconds>(t_precalc - t_start).count();
|
|
||||||
auto dur_gen = 0.001 * std::chrono::duration_cast<std::chrono::microseconds>(t_gen - t_precalc).count();
|
|
||||||
auto dur_path = 0.001 * std::chrono::duration_cast<std::chrono::microseconds>(t_path - t_gen).count();
|
|
||||||
auto dur_place = 0.001 * std::chrono::duration_cast<std::chrono::microseconds>(t_place - t_path).count();
|
|
||||||
auto dur_draw = 0.001 * std::chrono::duration_cast<std::chrono::microseconds>(t_draw - t_place).count();
|
|
||||||
auto dur_total = 0.001 * std::chrono::duration_cast<std::chrono::microseconds>(t_draw - t_start).count();
|
|
||||||
BOOST_LOG_TRIVIAL(info) <<
|
|
||||||
"Total time used creating Tree support for the currently grouped meshes: " << dur_total << " ms. "
|
|
||||||
"Different subtasks:\nCalculating Avoidance: " << dur_pre_gen << " ms "
|
|
||||||
"Creating inital influence areas: " << dur_gen << " ms "
|
|
||||||
"Influence area creation: " << dur_path << "ms "
|
|
||||||
"Placement of Points in InfluenceAreas: " << dur_place << "ms "
|
|
||||||
"Drawing result as support " << dur_draw << " ms";
|
|
||||||
// if (config.branch_radius==2121)
|
|
||||||
// BOOST_LOG_TRIVIAL(error) << "Why ask questions when you already know the answer twice.\n (This is not a real bug, please dont report it.)";
|
|
||||||
|
|
||||||
move_bounds.clear();
|
|
||||||
|
|
||||||
auto remove_undefined_layers = [](SupportGeneratorLayersPtr &layers) {
|
auto remove_undefined_layers = [](SupportGeneratorLayersPtr &layers) {
|
||||||
layers.erase(std::remove_if(layers.begin(), layers.end(), [](const SupportGeneratorLayer* ptr) { return ptr == nullptr; }), layers.end());
|
layers.erase(std::remove_if(layers.begin(), layers.end(), [](const SupportGeneratorLayer* ptr) { return ptr == nullptr; }), layers.end());
|
||||||
@ -4341,7 +4364,9 @@ void fff_tree_support_generate(PrintObject &print_object, std::function<void()>
|
|||||||
break;
|
break;
|
||||||
++idx;
|
++idx;
|
||||||
}
|
}
|
||||||
FFFTreeSupport::generate_support_areas(*print_object.print(), BuildVolume(Pointfs{ Vec2d{ -300., -300. }, Vec2d{ -300., +300. }, Vec2d{ +300., +300. }, Vec2d{ +300., -300. } }, 0.), { idx }, throw_on_cancel);
|
FFFTreeSupport::generate_support_areas(*print_object.print(),
|
||||||
|
BuildVolume(Pointfs{ Vec2d{ -300., -300. }, Vec2d{ -300., +300. }, Vec2d{ +300., +300. }, Vec2d{ +300., -300. } }, 0.), { idx },
|
||||||
|
throw_on_cancel);
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace Slic3r
|
} // namespace Slic3r
|
||||||
|
@ -2683,7 +2683,8 @@ std::vector<size_t> Plater::priv::load_files(const std::vector<fs::path>& input_
|
|||||||
instance->set_offset(-model_object->origin_translation);
|
instance->set_offset(-model_object->origin_translation);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
model_object->ensure_on_bed(is_project_file);
|
if (!model_object->instances.empty())
|
||||||
|
model_object->ensure_on_bed(is_project_file);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (one_by_one) {
|
if (one_by_one) {
|
||||||
|
@ -24,6 +24,8 @@ SCENARIO("Placeholder parser scripting", "[PlaceholderParser]") {
|
|||||||
// a percent to what.
|
// a percent to what.
|
||||||
config.option<ConfigOptionFloatOrPercent>("first_layer_speed")->value = 50.;
|
config.option<ConfigOptionFloatOrPercent>("first_layer_speed")->value = 50.;
|
||||||
config.option<ConfigOptionFloatOrPercent>("first_layer_speed")->percent = true;
|
config.option<ConfigOptionFloatOrPercent>("first_layer_speed")->percent = true;
|
||||||
|
ConfigOptionFloatsNullable *opt_filament_retract_length = config.option<ConfigOptionFloatsNullable>("filament_retract_length", true);
|
||||||
|
opt_filament_retract_length->values = { 5., ConfigOptionFloatsNullable::nil_value(), 3. };
|
||||||
|
|
||||||
parser.apply_config(config);
|
parser.apply_config(config);
|
||||||
parser.set("foo", 0);
|
parser.set("foo", 0);
|
||||||
@ -33,6 +35,9 @@ SCENARIO("Placeholder parser scripting", "[PlaceholderParser]") {
|
|||||||
SECTION("nested config options (legacy syntax)") { REQUIRE(parser.process("[temperature_[foo]]") == "357"); }
|
SECTION("nested config options (legacy syntax)") { REQUIRE(parser.process("[temperature_[foo]]") == "357"); }
|
||||||
SECTION("array reference") { REQUIRE(parser.process("{temperature[foo]}") == "357"); }
|
SECTION("array reference") { REQUIRE(parser.process("{temperature[foo]}") == "357"); }
|
||||||
SECTION("whitespaces and newlines are maintained") { REQUIRE(parser.process("test [ temperature_ [foo] ] \n hu") == "test 357 \n hu"); }
|
SECTION("whitespaces and newlines are maintained") { REQUIRE(parser.process("test [ temperature_ [foo] ] \n hu") == "test 357 \n hu"); }
|
||||||
|
SECTION("nullable is not null") { REQUIRE(parser.process("{is_nil(filament_retract_length[0])}") == "false"); }
|
||||||
|
SECTION("nullable is null") { REQUIRE(parser.process("{is_nil(filament_retract_length[1])}") == "true"); }
|
||||||
|
SECTION("nullable is not null 2") { REQUIRE(parser.process("{is_nil(filament_retract_length[2])}") == "false"); }
|
||||||
|
|
||||||
// Test the math expressions.
|
// Test the math expressions.
|
||||||
SECTION("math: 2*3") { REQUIRE(parser.process("{2*3}") == "6"); }
|
SECTION("math: 2*3") { REQUIRE(parser.process("{2*3}") == "6"); }
|
||||||
|
Loading…
x
Reference in New Issue
Block a user