Merge branch 'stable' (no conflicts fixed)
This commit is contained in:
commit
09fe421fe8
32 changed files with 7409 additions and 5368 deletions
Binary file not shown.
|
@ -8412,7 +8412,7 @@ msgstr "Überlauf"
|
||||||
#: src/slic3r/GUI/GUI_Preview.cpp:241 src/libslic3r/ExtrusionEntity.cpp:320
|
#: src/slic3r/GUI/GUI_Preview.cpp:241 src/libslic3r/ExtrusionEntity.cpp:320
|
||||||
#: src/libslic3r/ExtrusionEntity.cpp:344
|
#: src/libslic3r/ExtrusionEntity.cpp:344
|
||||||
msgid "Overhang perimeter"
|
msgid "Overhang perimeter"
|
||||||
msgstr "Überhängende Außenkontur"
|
msgstr "Überhängende Kontur"
|
||||||
|
|
||||||
#: src/libslic3r/PrintConfig.cpp:2767
|
#: src/libslic3r/PrintConfig.cpp:2767
|
||||||
msgid "Overhang threshold"
|
msgid "Overhang threshold"
|
||||||
|
@ -8731,7 +8731,7 @@ msgstr ""
|
||||||
#: src/slic3r/GUI/GUI_Preview.cpp:239 src/libslic3r/ExtrusionEntity.cpp:318
|
#: src/slic3r/GUI/GUI_Preview.cpp:239 src/libslic3r/ExtrusionEntity.cpp:318
|
||||||
#: src/libslic3r/ExtrusionEntity.cpp:340
|
#: src/libslic3r/ExtrusionEntity.cpp:340
|
||||||
msgid "Perimeter"
|
msgid "Perimeter"
|
||||||
msgstr "Außenkontur"
|
msgstr "Kontur"
|
||||||
|
|
||||||
#: src/libslic3r/PrintConfig.cpp:1946
|
#: src/libslic3r/PrintConfig.cpp:1946
|
||||||
msgid "Perimeter extruder"
|
msgid "Perimeter extruder"
|
||||||
|
@ -10848,8 +10848,8 @@ msgstr ""
|
||||||
"Setzen Sie dies auf einen Nicht-Nullwert, um eine manuelle Extrusionsbreite "
|
"Setzen Sie dies auf einen Nicht-Nullwert, um eine manuelle Extrusionsbreite "
|
||||||
"zuzulassen. Falls auf null belassen, wird PrusaSlicer die Extrusionsbreiten "
|
"zuzulassen. Falls auf null belassen, wird PrusaSlicer die Extrusionsbreiten "
|
||||||
"vom Durchmesser der Druckdüse ableiten (siehe die Hilfstexte für die "
|
"vom Durchmesser der Druckdüse ableiten (siehe die Hilfstexte für die "
|
||||||
"Extrusionsbreite für Außenkonturen, Infill usw.). Falls als Prozentwert (z."
|
"Extrusionsbreite für Konturen, Infill usw.). Falls als Prozentwert (z.B. "
|
||||||
"B. 230%) angegeben, wird dieser ausgehend von der Schichthöhe berechnet."
|
"230%) angegeben, wird dieser ausgehend von der Schichthöhe berechnet."
|
||||||
|
|
||||||
#: src/libslic3r/PrintConfig.cpp:729
|
#: src/libslic3r/PrintConfig.cpp:729
|
||||||
msgid ""
|
msgid ""
|
||||||
|
@ -10859,10 +10859,10 @@ msgid ""
|
||||||
"(for example 200%), it will be computed over layer height."
|
"(for example 200%), it will be computed over layer height."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Setzen Sie dies auf einen Nicht-Nullwert, um eine manuelle Extrusionsbreite "
|
"Setzen Sie dies auf einen Nicht-Nullwert, um eine manuelle Extrusionsbreite "
|
||||||
"für externe Außenkonturen anzugeben. Falls auf null belassen, wird die "
|
"für Außenkonturen anzugeben. Falls auf null belassen, wird die Standard-"
|
||||||
"Standard-Extrusionsbreite verwendet (falls angeben), ansonsten wird der "
|
"Extrusionsbreite verwendet (falls angeben), ansonsten wird der Durchmesser "
|
||||||
"Durchmesser der Druckdüse x 1,125 verwendet. Falls als Prozentwert (z.B. "
|
"der Druckdüse x 1,125 verwendet. Falls als Prozentwert (z.B. 200%) "
|
||||||
"200%) angegeben, wird dieser ausgehend von der Schichthöhe berechnet."
|
"angegeben, wird dieser ausgehend von der Schichthöhe berechnet."
|
||||||
|
|
||||||
#: src/libslic3r/PrintConfig.cpp:1196
|
#: src/libslic3r/PrintConfig.cpp:1196
|
||||||
msgid ""
|
msgid ""
|
||||||
|
@ -10931,7 +10931,7 @@ msgid ""
|
||||||
"it will be computed over layer height."
|
"it will be computed over layer height."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Setzen Sie dies auf einen Nicht-Nullwert, um eine manuelle Extrusionsbreite "
|
"Setzen Sie dies auf einen Nicht-Nullwert, um eine manuelle Extrusionsbreite "
|
||||||
"für Außenkonturen anzugeben. Dünnere Extrusionsbreiten sind vorteilhaft, um "
|
"für Konturen anzugeben. Dünnere Extrusionsbreiten sind vorteilhaft, um "
|
||||||
"genauere Oberflächen zu erhalten. Falls auf null belassen, wird die Standard-"
|
"genauere Oberflächen zu erhalten. Falls auf null belassen, wird die Standard-"
|
||||||
"Extrusionsbreite verwendet (falls angeben), ansonsten wird der Durchmesser "
|
"Extrusionsbreite verwendet (falls angeben), ansonsten wird der Durchmesser "
|
||||||
"der Druckdüse x 1,125 verwendet. Falls als Prozentwert (z.B. 200%) "
|
"der Druckdüse x 1,125 verwendet. Falls als Prozentwert (z.B. 200%) "
|
||||||
|
@ -11797,7 +11797,7 @@ msgid ""
|
||||||
"for auto."
|
"for auto."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Druckgeschwindigkeit für die oberen massiven Schichten (betrifft nur die "
|
"Druckgeschwindigkeit für die oberen massiven Schichten (betrifft nur die "
|
||||||
"obersten Außenkonturen und nicht deren innenliegende massiven Schichten). "
|
"obersten Außenschichten und nicht deren innenliegende massiven Schichten). "
|
||||||
"Wir empfehlen, diesen Wert zu reduzieren, um eine schönere Oberfläche zu "
|
"Wir empfehlen, diesen Wert zu reduzieren, um eine schönere Oberfläche zu "
|
||||||
"erhalten. Dies kann als Prozentwert (z.B. 80%) der oben eingegebenen "
|
"erhalten. Dies kann als Prozentwert (z.B. 80%) der oben eingegebenen "
|
||||||
"Geschwindigkeit für massives Infill angegeben werden. Für Automatik auf null "
|
"Geschwindigkeit für massives Infill angegeben werden. Für Automatik auf null "
|
||||||
|
@ -12613,8 +12613,8 @@ msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Der Extruder, der verwendet werden soll, falls keine sonstigen "
|
"Der Extruder, der verwendet werden soll, falls keine sonstigen "
|
||||||
"Extrudereinstellungen angegeben wurden. Dies übersteuert die Angaben für die "
|
"Extrudereinstellungen angegeben wurden. Dies übersteuert die Angaben für die "
|
||||||
"Außenkontur- und Infill-Extruder, aber nicht die Angabe des Extruders für "
|
"Kontur- und Infill-Extruder, aber nicht die Angabe des Extruders für die "
|
||||||
"die Stützen."
|
"Stützen."
|
||||||
|
|
||||||
#: src/libslic3r/PrintConfig.cpp:1448
|
#: src/libslic3r/PrintConfig.cpp:1448
|
||||||
msgid "The extruder to use when printing infill."
|
msgid "The extruder to use when printing infill."
|
||||||
|
@ -13554,8 +13554,8 @@ msgid ""
|
||||||
"prevent resetting acceleration at all."
|
"prevent resetting acceleration at all."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Dies ist der Beschleunigungswert, auf den Ihr Drucker zurückgesetzt wird, "
|
"Dies ist der Beschleunigungswert, auf den Ihr Drucker zurückgesetzt wird, "
|
||||||
"nachdem aufgabenspezifische Beschleunigungswerte (Außenkonturen/Infill) "
|
"nachdem aufgabenspezifische Beschleunigungswerte (Konturen/Infill) verwendet "
|
||||||
"verwendet wurden. Setzen Sie dies auf null, um ein Zurückstellen der "
|
"wurden. Setzen Sie dies auf null, um ein Zurückstellen der "
|
||||||
"Beschleunigungswerte zu deaktivieren."
|
"Beschleunigungswerte zu deaktivieren."
|
||||||
|
|
||||||
#: src/libslic3r/PrintConfig.cpp:443
|
#: src/libslic3r/PrintConfig.cpp:443
|
||||||
|
@ -13679,11 +13679,11 @@ msgid ""
|
||||||
"surfaces which benefit from a higher number of perimeters if the Extra "
|
"surfaces which benefit from a higher number of perimeters if the Extra "
|
||||||
"Perimeters option is enabled."
|
"Perimeters option is enabled."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Diese Stellung bestimmt die Anzahl der Außenkonturen, die für jede Schicht "
|
"Diese Stellung bestimmt die Anzahl der Konturen, die für jede Schicht "
|
||||||
"erzeugt werden. PusaSlicer kann diese Zahl automatisch vergrößern, wenn es "
|
"erzeugt werden. PusaSlicer kann diese Zahl automatisch vergrößern, wenn es "
|
||||||
"schräge Oberflächen erkennt, die sich mit einer höheren Zahl von "
|
"schräge Oberflächen erkennt, die sich mit einer höheren Zahl von Konturen "
|
||||||
"Außenkonturen besser drucken lassen, wenn die \"Zusätzliche Außenkonturen "
|
"besser drucken lassen, wenn die \"Zusätzliche Konturen falls notwendig\" "
|
||||||
"falls notwendig\" Option aktiviert ist."
|
"Option aktiviert ist."
|
||||||
|
|
||||||
#: src/libslic3r/PrintConfig.cpp:1895
|
#: src/libslic3r/PrintConfig.cpp:1895
|
||||||
msgid ""
|
msgid ""
|
||||||
|
@ -13712,8 +13712,8 @@ msgid ""
|
||||||
"This option will switch the print order of perimeters and infill, making the "
|
"This option will switch the print order of perimeters and infill, making the "
|
||||||
"latter first."
|
"latter first."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Diese Einstellungen kehrt die Druckreihenfolge von Außenkonturen und Infill "
|
"Diese Einstellungen kehrt die Druckreihenfolge von Konturen und Infill um, "
|
||||||
"um, sodass der Infill zuerst gedruckt wird."
|
"sodass der Infill zuerst gedruckt wird."
|
||||||
|
|
||||||
#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:83
|
#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:83
|
||||||
msgid "This printer will be shown in the presets list as"
|
msgid "This printer will be shown in the presets list as"
|
||||||
|
@ -13726,9 +13726,9 @@ msgid ""
|
||||||
"calculated on the perimeters speed setting above. Set to zero for auto."
|
"calculated on the perimeters speed setting above. Set to zero for auto."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Diese separate Einstellung wirkt sich auf die Geschwindigkeit der äußeren "
|
"Diese separate Einstellung wirkt sich auf die Geschwindigkeit der äußeren "
|
||||||
"(sichtbaren) Außenkonturen aus. Als Prozentwert eingegeben (z.B. 80%), wird "
|
"(sichtbaren) Konturen aus. Als Prozentwert eingegeben (z.B. 80%), wird sie "
|
||||||
"sie ausgehend von der obigen Geschwindigkeitseinstellung für Außenkonturen "
|
"ausgehend von der obigen Geschwindigkeitseinstellung für Konturen berechnet. "
|
||||||
"berechnet. Für die automatische Berechnung auf null setzen."
|
"Für die automatische Berechnung auf null setzen."
|
||||||
|
|
||||||
#: src/libslic3r/PrintConfig.cpp:2303
|
#: src/libslic3r/PrintConfig.cpp:2303
|
||||||
msgid ""
|
msgid ""
|
||||||
|
@ -13736,11 +13736,11 @@ msgid ""
|
||||||
"6.5mm (usually holes). If expressed as percentage (for example: 80%) it will "
|
"6.5mm (usually holes). If expressed as percentage (for example: 80%) it will "
|
||||||
"be calculated on the perimeters speed setting above. Set to zero for auto."
|
"be calculated on the perimeters speed setting above. Set to zero for auto."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Diese separate Einstellung wirkt sich auf die Geschwindigkeit von "
|
"Diese separate Einstellung wirkt sich auf die Geschwindigkeit von Konturen "
|
||||||
"Außenkonturen mit einem Radius <= 6,5 mm (üblicherweise Bohrungen) aus. Als "
|
"mit einem Radius <= 6,5 mm (üblicherweise Bohrungen) aus. Als Prozentwert "
|
||||||
"Prozentwert eingegeben (z.B. 80%), wird sie ausgehend von der obigen "
|
"eingegeben (z.B. 80%), wird sie ausgehend von der obigen "
|
||||||
"Geschwindigkeitseinstellung für Außenkonturen berechnet. Für eine "
|
"Geschwindigkeitseinstellung für Konturen berechnet. Für eine automatische "
|
||||||
"automatische Berechnung setzen Sie dies auf null."
|
"Berechnung setzen Sie dies auf null."
|
||||||
|
|
||||||
#: src/libslic3r/PrintConfig.cpp:1484
|
#: src/libslic3r/PrintConfig.cpp:1484
|
||||||
msgid ""
|
msgid ""
|
||||||
|
@ -13749,11 +13749,11 @@ msgid ""
|
||||||
"cause gaps. If expressed as percentage (example: 15%) it is calculated over "
|
"cause gaps. If expressed as percentage (example: 15%) it is calculated over "
|
||||||
"perimeter extrusion width."
|
"perimeter extrusion width."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Diese Einstellung fügt eine zusätzliche Überlappung zwischen Außenkonturen "
|
"Diese Einstellung fügt eine zusätzliche Überlappung zwischen Konturen und "
|
||||||
"und Infill ein, um die Haftung zu verbessern. Theoretisch sollte dies nicht "
|
"Infill ein, um die Haftung zu verbessern. Theoretisch sollte dies nicht "
|
||||||
"notwendig sein, doch vorhandenes Getriebespiel könnte Lücken erzeugen. Als "
|
"notwendig sein, doch vorhandenes Getriebespiel könnte Lücken erzeugen. Als "
|
||||||
"Prozentwert eingegeben (z.B. 15%) wird sie ausgehend von der "
|
"Prozentwert eingegeben (z.B. 15%) wird sie ausgehend von der "
|
||||||
"Extrusionsbreite für die Außenkontur ausgerechnet."
|
"Extrusionsbreite für die Kontur ausgerechnet."
|
||||||
|
|
||||||
#: src/libslic3r/PrintConfig.cpp:265
|
#: src/libslic3r/PrintConfig.cpp:265
|
||||||
msgid ""
|
msgid ""
|
||||||
|
@ -15816,7 +15816,7 @@ msgstr "Parametername"
|
||||||
|
|
||||||
#: src/slic3r/GUI/PresetHints.cpp:171
|
#: src/slic3r/GUI/PresetHints.cpp:171
|
||||||
msgid "perimeters"
|
msgid "perimeters"
|
||||||
msgstr "Außenkonturen"
|
msgstr "Konturen"
|
||||||
|
|
||||||
#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:64 src/libslic3r/Preset.cpp:1338
|
#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:64 src/libslic3r/Preset.cpp:1338
|
||||||
msgid "print"
|
msgid "print"
|
||||||
|
|
Binary file not shown.
File diff suppressed because it is too large
Load diff
Binary file not shown.
File diff suppressed because it is too large
Load diff
|
@ -470,4 +470,8 @@ max_print_height = 235
|
||||||
start_gcode = M82 ;absolute extrusion mode\n;Start GCode begin\nM140 S[first_layer_bed_temperature] ;Start Warming Bed\nM104 S160 ;Preheat Nozzle\nG28 ; home all axes\nG90 ;absolute positioning\nG1 X-10 Y-10 F3000\nG1 Z0 F1800\nG1 Z5 F5000 ; lift nozzle\nM190 S[first_layer_bed_temperature] ;Wait For Bed Temperature\nM109 S[first_layer_temperature] ;Wait for Hotend Temperature\nG92 E0\nG1 E10 F200\nG1 E-2 F300\nG92 E0\n;Start GCode end\nG1 F3600 E-2
|
start_gcode = M82 ;absolute extrusion mode\n;Start GCode begin\nM140 S[first_layer_bed_temperature] ;Start Warming Bed\nM104 S160 ;Preheat Nozzle\nG28 ; home all axes\nG90 ;absolute positioning\nG1 X-10 Y-10 F3000\nG1 Z0 F1800\nG1 Z5 F5000 ; lift nozzle\nM190 S[first_layer_bed_temperature] ;Wait For Bed Temperature\nM109 S[first_layer_temperature] ;Wait for Hotend Temperature\nG92 E0\nG1 E10 F200\nG1 E-2 F300\nG92 E0\n;Start GCode end\nG1 F3600 E-2
|
||||||
end_gcode = M140 S0\n;End GCode begin\nM104 S0 ;extruder heater off\nM140 S0 ;heated bed heater off (if you have it)\nG90 ;absolute positioning\nG92 E0\nG1 E-2 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\nG1 Z330 E-1 F80 ;move Z up a bit and retract filament even more\nG1 X0 F3000 ;move X to min endstops, so the head is out of the way\nG1 Y250 F3000 ;so the head is out of the way and Plate is moved forward\nM84 ;steppers off\n;End GCode end\nM82 ;absolute extrusion mode\nM104 S0\nM107\n;End of Gcode
|
end_gcode = M140 S0\n;End GCode begin\nM104 S0 ;extruder heater off\nM140 S0 ;heated bed heater off (if you have it)\nG90 ;absolute positioning\nG92 E0\nG1 E-2 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\nG1 Z330 E-1 F80 ;move Z up a bit and retract filament even more\nG1 X0 F3000 ;move X to min endstops, so the head is out of the way\nG1 Y250 F3000 ;so the head is out of the way and Plate is moved forward\nM84 ;steppers off\n;End GCode end\nM82 ;absolute extrusion mode\nM104 S0\nM107\n;End of Gcode
|
||||||
default_filament_profile = Generic PLA @Snapmaker
|
default_filament_profile = Generic PLA @Snapmaker
|
||||||
|
<<<<<<< HEAD
|
||||||
default_print_profile = 0.20mm NORMAL @SnapmakerA250
|
default_print_profile = 0.20mm NORMAL @SnapmakerA250
|
||||||
|
=======
|
||||||
|
default_print_profile = 0.20mm NORMAL @SnapmakerA250
|
||||||
|
>>>>>>> stable
|
||||||
|
|
Binary file not shown.
Before Width: | Height: | Size: 14 KiB After Width: | Height: | Size: 13 KiB |
Binary file not shown.
Binary file not shown.
Before Width: | Height: | Size: 13 KiB After Width: | Height: | Size: 12 KiB |
Binary file not shown.
BIN
resources/shapes/PLA_recycling_symbol.png
Normal file
BIN
resources/shapes/PLA_recycling_symbol.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 11 KiB |
BIN
resources/shapes/PLA_recycling_symbol.stl
Normal file
BIN
resources/shapes/PLA_recycling_symbol.stl
Normal file
Binary file not shown.
|
@ -824,6 +824,7 @@ public:
|
||||||
m_ifs.seekg(m_file_pos, m_ifs.beg);
|
m_ifs.seekg(m_file_pos, m_ifs.beg);
|
||||||
if (! m_ifs.read(m_block.data(), m_block_len))
|
if (! m_ifs.read(m_block.data(), m_block_len))
|
||||||
return false;
|
return false;
|
||||||
|
assert(m_block_len == m_ifs.gcount());
|
||||||
}
|
}
|
||||||
|
|
||||||
assert(m_block_len > 0);
|
assert(m_block_len > 0);
|
||||||
|
@ -866,7 +867,7 @@ private:
|
||||||
ConfigSubstitutions ConfigBase::load_from_gcode_file(const std::string &file, ForwardCompatibilitySubstitutionRule compatibility_rule)
|
ConfigSubstitutions ConfigBase::load_from_gcode_file(const std::string &file, ForwardCompatibilitySubstitutionRule compatibility_rule)
|
||||||
{
|
{
|
||||||
// Read a 64k block from the end of the G-code.
|
// Read a 64k block from the end of the G-code.
|
||||||
boost::nowide::ifstream ifs(file);
|
boost::nowide::ifstream ifs(file, std::ifstream::binary);
|
||||||
// Look for Slic3r or PrusaSlicer header.
|
// Look for Slic3r or PrusaSlicer header.
|
||||||
// Look for the header across the whole file as the G-code may have been extended at the start by a post-processing script or the user.
|
// Look for the header across the whole file as the G-code may have been extended at the start by a post-processing script or the user.
|
||||||
bool has_delimiters = false;
|
bool has_delimiters = false;
|
||||||
|
|
|
@ -194,7 +194,8 @@ enum ConfigOptionType {
|
||||||
enum ConfigOptionMode {
|
enum ConfigOptionMode {
|
||||||
comSimple = 0,
|
comSimple = 0,
|
||||||
comAdvanced,
|
comAdvanced,
|
||||||
comExpert
|
comExpert,
|
||||||
|
comUndef
|
||||||
};
|
};
|
||||||
|
|
||||||
enum PrinterTechnology : unsigned char
|
enum PrinterTechnology : unsigned char
|
||||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -153,8 +153,8 @@ public:
|
||||||
float layer_height,
|
float layer_height,
|
||||||
// Maximum number of tool changes on this layer or the layers below.
|
// Maximum number of tool changes on this layer or the layers below.
|
||||||
size_t max_tool_changes,
|
size_t max_tool_changes,
|
||||||
// Is this the first layer of the print? In that case print the brim first.
|
// Is this the first layer of the print? In that case print the brim first. (OBSOLETE)
|
||||||
bool is_first_layer,
|
bool /*is_first_layer*/,
|
||||||
// Is this the last layer of the waste tower?
|
// Is this the last layer of the waste tower?
|
||||||
bool is_last_layer)
|
bool is_last_layer)
|
||||||
{
|
{
|
||||||
|
@ -162,8 +162,14 @@ public:
|
||||||
m_layer_height = layer_height;
|
m_layer_height = layer_height;
|
||||||
m_depth_traversed = 0.f;
|
m_depth_traversed = 0.f;
|
||||||
m_current_layer_finished = false;
|
m_current_layer_finished = false;
|
||||||
m_current_shape = (! is_first_layer && m_current_shape == SHAPE_NORMAL) ? SHAPE_REVERSED : SHAPE_NORMAL;
|
|
||||||
if (is_first_layer) {
|
|
||||||
|
// Advance m_layer_info iterator, making sure we got it right
|
||||||
|
while (!m_plan.empty() && m_layer_info->z < print_z - WT_EPSILON && m_layer_info+1 != m_plan.end())
|
||||||
|
++m_layer_info;
|
||||||
|
|
||||||
|
m_current_shape = (! this->is_first_layer() && m_current_shape == SHAPE_NORMAL) ? SHAPE_REVERSED : SHAPE_NORMAL;
|
||||||
|
if (this->is_first_layer()) {
|
||||||
m_num_layer_changes = 0;
|
m_num_layer_changes = 0;
|
||||||
m_num_tool_changes = 0;
|
m_num_tool_changes = 0;
|
||||||
} else
|
} else
|
||||||
|
@ -171,10 +177,6 @@ public:
|
||||||
|
|
||||||
// Calculate extrusion flow from desired line width, nozzle diameter, filament diameter and layer_height:
|
// Calculate extrusion flow from desired line width, nozzle diameter, filament diameter and layer_height:
|
||||||
m_extrusion_flow = extrusion_flow(layer_height);
|
m_extrusion_flow = extrusion_flow(layer_height);
|
||||||
|
|
||||||
// Advance m_layer_info iterator, making sure we got it right
|
|
||||||
while (!m_plan.empty() && m_layer_info->z < print_z - WT_EPSILON && m_layer_info+1 != m_plan.end())
|
|
||||||
++m_layer_info;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Return the wipe tower position.
|
// Return the wipe tower position.
|
||||||
|
|
|
@ -538,8 +538,21 @@ std::string Print::validate(std::string* warning) const
|
||||||
for (size_t idx_object = 0; idx_object < m_objects.size(); ++ idx_object) {
|
for (size_t idx_object = 0; idx_object < m_objects.size(); ++ idx_object) {
|
||||||
if (idx_object == tallest_object_idx)
|
if (idx_object == tallest_object_idx)
|
||||||
continue;
|
continue;
|
||||||
if (layer_height_profiles[idx_object] != layer_height_profiles[tallest_object_idx])
|
// Check that the layer height profiles are equal. This will happen when one object is
|
||||||
return L("The Wipe tower is only supported if all objects have the same variable layer height");
|
// a copy of another, or when a layer height modifier is used the same way on both objects.
|
||||||
|
// The latter case might create a floating point inaccuracy mismatch, so compare
|
||||||
|
// element-wise using an epsilon check.
|
||||||
|
size_t i = 0;
|
||||||
|
const coordf_t eps = 0.5 * EPSILON; // layers closer than EPSILON will be merged later. Let's make
|
||||||
|
// this check a bit more sensitive to make sure we never consider two different layers as one.
|
||||||
|
while (i < layer_height_profiles[idx_object].size()
|
||||||
|
&& i < layer_height_profiles[tallest_object_idx].size()) {
|
||||||
|
if (i%2 == 0 && layer_height_profiles[tallest_object_idx][i] > layer_height_profiles[idx_object][layer_height_profiles[idx_object].size() - 2 ])
|
||||||
|
break;
|
||||||
|
if (std::abs(layer_height_profiles[idx_object][i] - layer_height_profiles[tallest_object_idx][i]) > eps)
|
||||||
|
return L("The Wipe tower is only supported if all objects have the same variable layer height");
|
||||||
|
++i;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -2176,7 +2176,8 @@ void Control::auto_color_change()
|
||||||
|
|
||||||
const Print& print = GUI::wxGetApp().plater()->fff_print();
|
const Print& print = GUI::wxGetApp().plater()->fff_print();
|
||||||
for (auto object : print.objects()) {
|
for (auto object : print.objects()) {
|
||||||
if (object->layer_count() == 0)
|
// An object should to have at least 2 layers to apply an auto color change
|
||||||
|
if (object->layer_count() < 2)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
check_color_change(object, 1, object->layers().size(), false, [this, extruders_cnt](Layer* layer)
|
check_color_change(object, 1, object->layers().size(), false, [this, extruders_cnt](Layer* layer)
|
||||||
|
|
|
@ -1050,8 +1050,6 @@ bool GUI_App::OnInit()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool update_gui_after_init = true;
|
|
||||||
|
|
||||||
bool GUI_App::on_init_inner()
|
bool GUI_App::on_init_inner()
|
||||||
{
|
{
|
||||||
// Set initialization of image handlers before any UI actions - See GH issue #7469
|
// Set initialization of image handlers before any UI actions - See GH issue #7469
|
||||||
|
@ -1327,18 +1325,18 @@ bool GUI_App::on_init_inner()
|
||||||
// An ugly solution to GH #5537 in which GUI_App::init_opengl (normally called from events wxEVT_PAINT
|
// An ugly solution to GH #5537 in which GUI_App::init_opengl (normally called from events wxEVT_PAINT
|
||||||
// and wxEVT_SET_FOCUS before GUI_App::post_init is called) wasn't called before GUI_App::post_init and OpenGL wasn't initialized.
|
// and wxEVT_SET_FOCUS before GUI_App::post_init is called) wasn't called before GUI_App::post_init and OpenGL wasn't initialized.
|
||||||
#ifdef __linux__
|
#ifdef __linux__
|
||||||
if (update_gui_after_init && m_opengl_initialized) {
|
if (! m_post_initialized && m_opengl_initialized) {
|
||||||
#else
|
#else
|
||||||
if (update_gui_after_init) {
|
if (! m_post_initialized) {
|
||||||
#endif
|
#endif
|
||||||
update_gui_after_init = false;
|
m_post_initialized = true;
|
||||||
#ifdef WIN32
|
#ifdef WIN32
|
||||||
this->mainframe->register_win32_callbacks();
|
this->mainframe->register_win32_callbacks();
|
||||||
#endif
|
#endif
|
||||||
this->post_init();
|
this->post_init();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (! update_gui_after_init && app_config->dirty() && app_config->get("autosave") == "1")
|
if (m_post_initialized && app_config->dirty() && app_config->get("autosave") == "1")
|
||||||
app_config->save();
|
app_config->save();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -2726,17 +2724,25 @@ void GUI_App::MacOpenFiles(const wxArrayString &fileNames)
|
||||||
// Running in G-code viewer.
|
// Running in G-code viewer.
|
||||||
// Load the first G-code into the G-code viewer.
|
// Load the first G-code into the G-code viewer.
|
||||||
// Or if no G-codes, send other files to slicer.
|
// Or if no G-codes, send other files to slicer.
|
||||||
if (! gcode_files.empty())
|
if (! gcode_files.empty()) {
|
||||||
this->plater()->load_gcode(gcode_files.front());
|
if (m_post_initialized)
|
||||||
|
this->plater()->load_gcode(gcode_files.front());
|
||||||
|
else
|
||||||
|
this->init_params->input_files = { into_u8(gcode_files.front()) };
|
||||||
|
}
|
||||||
if (!non_gcode_files.empty())
|
if (!non_gcode_files.empty())
|
||||||
start_new_slicer(non_gcode_files, true);
|
start_new_slicer(non_gcode_files, true);
|
||||||
} else {
|
} else {
|
||||||
if (! files.empty()) {
|
if (! files.empty()) {
|
||||||
wxArrayString input_files;
|
if (m_post_initialized) {
|
||||||
for (size_t i = 0; i < non_gcode_files.size(); ++i) {
|
wxArrayString input_files;
|
||||||
input_files.push_back(non_gcode_files[i]);
|
for (size_t i = 0; i < non_gcode_files.size(); ++i)
|
||||||
|
input_files.push_back(non_gcode_files[i]);
|
||||||
|
this->plater()->load_files(input_files);
|
||||||
|
} else {
|
||||||
|
for (const auto &f : non_gcode_files)
|
||||||
|
this->init_params->input_files.emplace_back(into_u8(f));
|
||||||
}
|
}
|
||||||
this->plater()->load_files(input_files);
|
|
||||||
}
|
}
|
||||||
for (const wxString &filename : gcode_files)
|
for (const wxString &filename : gcode_files)
|
||||||
start_new_gcodeviewer(&filename);
|
start_new_gcodeviewer(&filename);
|
||||||
|
|
|
@ -116,6 +116,7 @@ public:
|
||||||
|
|
||||||
private:
|
private:
|
||||||
bool m_initialized { false };
|
bool m_initialized { false };
|
||||||
|
bool m_post_initialized { false };
|
||||||
bool m_app_conf_exists{ false };
|
bool m_app_conf_exists{ false };
|
||||||
EAppMode m_app_mode{ EAppMode::Editor };
|
EAppMode m_app_mode{ EAppMode::Editor };
|
||||||
bool m_is_recreating_gui{ false };
|
bool m_is_recreating_gui{ false };
|
||||||
|
|
|
@ -119,6 +119,7 @@ void GLGizmoHollow::render_points(const Selection& selection, bool picking)
|
||||||
|
|
||||||
const GLVolume* vol = selection.get_volume(*selection.get_volume_idxs().begin());
|
const GLVolume* vol = selection.get_volume(*selection.get_volume_idxs().begin());
|
||||||
Geometry::Transformation trafo = vol->get_instance_transformation() * vol->get_volume_transformation();
|
Geometry::Transformation trafo = vol->get_instance_transformation() * vol->get_volume_transformation();
|
||||||
|
<<<<<<< HEAD
|
||||||
|
|
||||||
#if ENABLE_GL_SHADERS_ATTRIBUTES
|
#if ENABLE_GL_SHADERS_ATTRIBUTES
|
||||||
const Transform3d instance_scaling_matrix_inverse = vol->get_instance_transformation().get_matrix(true, true, false, true).inverse();
|
const Transform3d instance_scaling_matrix_inverse = vol->get_instance_transformation().get_matrix(true, true, false, true).inverse();
|
||||||
|
@ -130,6 +131,8 @@ void GLGizmoHollow::render_points(const Selection& selection, bool picking)
|
||||||
|
|
||||||
shader->set_uniform("projection_matrix", projection_matrix);
|
shader->set_uniform("projection_matrix", projection_matrix);
|
||||||
#else
|
#else
|
||||||
|
=======
|
||||||
|
>>>>>>> stable
|
||||||
const Transform3d& instance_scaling_matrix_inverse = trafo.get_matrix(true, true, false, true).inverse();
|
const Transform3d& instance_scaling_matrix_inverse = trafo.get_matrix(true, true, false, true).inverse();
|
||||||
const Transform3d& instance_matrix = trafo.get_matrix();
|
const Transform3d& instance_matrix = trafo.get_matrix();
|
||||||
|
|
||||||
|
|
|
@ -149,6 +149,7 @@ void GLGizmoSlaSupports::render_points(const Selection& selection, bool picking)
|
||||||
const GLVolume* vol = selection.get_volume(*selection.get_volume_idxs().begin());
|
const GLVolume* vol = selection.get_volume(*selection.get_volume_idxs().begin());
|
||||||
Geometry::Transformation transformation(vol->get_instance_transformation().get_matrix() * vol->get_volume_transformation().get_matrix());
|
Geometry::Transformation transformation(vol->get_instance_transformation().get_matrix() * vol->get_volume_transformation().get_matrix());
|
||||||
const Transform3d& instance_scaling_matrix_inverse = transformation.get_matrix(true, true, false, true).inverse();
|
const Transform3d& instance_scaling_matrix_inverse = transformation.get_matrix(true, true, false, true).inverse();
|
||||||
|
<<<<<<< HEAD
|
||||||
#if ENABLE_GL_SHADERS_ATTRIBUTES
|
#if ENABLE_GL_SHADERS_ATTRIBUTES
|
||||||
const Transform3d instance_matrix = Geometry::assemble_transform(m_c->selection_info()->get_sla_shift() * Vec3d::UnitZ()) * transformation.get_matrix();
|
const Transform3d instance_matrix = Geometry::assemble_transform(m_c->selection_info()->get_sla_shift() * Vec3d::UnitZ()) * transformation.get_matrix();
|
||||||
const Camera& camera = wxGetApp().plater()->get_camera();
|
const Camera& camera = wxGetApp().plater()->get_camera();
|
||||||
|
@ -157,6 +158,8 @@ void GLGizmoSlaSupports::render_points(const Selection& selection, bool picking)
|
||||||
|
|
||||||
shader->set_uniform("projection_matrix", projection_matrix);
|
shader->set_uniform("projection_matrix", projection_matrix);
|
||||||
#else
|
#else
|
||||||
|
=======
|
||||||
|
>>>>>>> stable
|
||||||
const Transform3d& instance_matrix = transformation.get_matrix();
|
const Transform3d& instance_matrix = transformation.get_matrix();
|
||||||
const float z_shift = m_c->selection_info()->get_sla_shift();
|
const float z_shift = m_c->selection_info()->get_sla_shift();
|
||||||
glsafe(::glPushMatrix());
|
glsafe(::glPushMatrix());
|
||||||
|
|
|
@ -1227,6 +1227,15 @@ void ImGuiWrapper::init_font(bool compress)
|
||||||
ImVector<ImWchar> ranges;
|
ImVector<ImWchar> ranges;
|
||||||
ImFontAtlas::GlyphRangesBuilder builder;
|
ImFontAtlas::GlyphRangesBuilder builder;
|
||||||
builder.AddRanges(m_glyph_ranges);
|
builder.AddRanges(m_glyph_ranges);
|
||||||
|
|
||||||
|
if (m_font_cjk) {
|
||||||
|
// This is a temporary fix of https://github.com/prusa3d/PrusaSlicer/issues/8171. The translation
|
||||||
|
// contains characters not in the ImGui ranges for simplified Chinese. For now, just add them manually.
|
||||||
|
// In future, it might be worth to parse the dictionary and add all the necessary characters.
|
||||||
|
builder.AddChar(ImWchar(0x5ED3));
|
||||||
|
builder.AddChar(ImWchar(0x8F91));
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef __APPLE__
|
#ifdef __APPLE__
|
||||||
if (m_font_cjk)
|
if (m_font_cjk)
|
||||||
// Apple keyboard shortcuts are only contained in the CJK fonts.
|
// Apple keyboard shortcuts are only contained in the CJK fonts.
|
||||||
|
|
|
@ -53,7 +53,7 @@ void SLAImportJob::process(Ctl &ctl)
|
||||||
return !ctl.was_canceled();
|
return !ctl.was_canceled();
|
||||||
};
|
};
|
||||||
|
|
||||||
if (p->path.empty()) return;
|
if (p->path.empty() || ! p->err.empty()) return;
|
||||||
|
|
||||||
std::string path = p->path.ToUTF8().data();
|
std::string path = p->path.ToUTF8().data();
|
||||||
std::string format_id = p->import_dlg->get_archive_format();
|
std::string format_id = p->import_dlg->get_archive_format();
|
||||||
|
@ -75,11 +75,16 @@ void SLAImportJob::process(Ctl &ctl)
|
||||||
}
|
}
|
||||||
} catch (MissingProfileError &) {
|
} catch (MissingProfileError &) {
|
||||||
p->err = _u8L("The SLA archive doesn't contain any presets. "
|
p->err = _u8L("The SLA archive doesn't contain any presets. "
|
||||||
|
<<<<<<< HEAD
|
||||||
"Please activate some SLA printer preset first before "
|
"Please activate some SLA printer preset first before "
|
||||||
"importing that SLA archive.");
|
"importing that SLA archive.");
|
||||||
} catch (ReaderUnimplementedError &) {
|
} catch (ReaderUnimplementedError &) {
|
||||||
p->err = _u8L("Import is unavailable for this archive format.");
|
p->err = _u8L("Import is unavailable for this archive format.");
|
||||||
}catch (std::exception &ex) {
|
}catch (std::exception &ex) {
|
||||||
|
=======
|
||||||
|
"Please activate some SLA printer preset first before importing that SLA archive.");
|
||||||
|
} catch (std::exception &ex) {
|
||||||
|
>>>>>>> stable
|
||||||
p->err = ex.what();
|
p->err = ex.what();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -94,12 +99,14 @@ void SLAImportJob::reset()
|
||||||
p->profile = p->plater->sla_print().full_print_config();
|
p->profile = p->plater->sla_print().full_print_config();
|
||||||
p->quality = SLAImportQuality::Balanced;
|
p->quality = SLAImportQuality::Balanced;
|
||||||
p->path.Clear();
|
p->path.Clear();
|
||||||
|
p->err = "";
|
||||||
}
|
}
|
||||||
|
|
||||||
void SLAImportJob::prepare()
|
void SLAImportJob::prepare()
|
||||||
{
|
{
|
||||||
reset();
|
reset();
|
||||||
|
|
||||||
|
<<<<<<< HEAD
|
||||||
auto path = p->import_dlg->get_path();
|
auto path = p->import_dlg->get_path();
|
||||||
auto nm = wxFileName(path);
|
auto nm = wxFileName(path);
|
||||||
p->path = !nm.Exists(wxFILE_EXISTS_REGULAR) ? "" : nm.GetFullPath();
|
p->path = !nm.Exists(wxFILE_EXISTS_REGULAR) ? "" : nm.GetFullPath();
|
||||||
|
@ -107,6 +114,22 @@ void SLAImportJob::prepare()
|
||||||
p->quality = p->import_dlg->get_quality();
|
p->quality = p->import_dlg->get_quality();
|
||||||
|
|
||||||
p->config_substitutions.clear();
|
p->config_substitutions.clear();
|
||||||
|
=======
|
||||||
|
if (p->import_dlg.ShowModal() == wxID_OK) {
|
||||||
|
auto path = p->import_dlg.get_path();
|
||||||
|
auto nm = wxFileName(path);
|
||||||
|
p->path = !nm.Exists(wxFILE_EXISTS_REGULAR) ? "" : nm.GetFullPath();
|
||||||
|
if (p->path.empty()) {
|
||||||
|
p->err = _u8L("The file does not exist.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
p->sel = p->import_dlg.get_selection();
|
||||||
|
p->win = p->import_dlg.get_marchsq_windowsize();
|
||||||
|
p->config_substitutions.clear();
|
||||||
|
} else {
|
||||||
|
p->path = "";
|
||||||
|
}
|
||||||
|
>>>>>>> stable
|
||||||
}
|
}
|
||||||
|
|
||||||
void SLAImportJob::finalize(bool canceled, std::exception_ptr &eptr)
|
void SLAImportJob::finalize(bool canceled, std::exception_ptr &eptr)
|
||||||
|
@ -121,6 +144,12 @@ void SLAImportJob::finalize(bool canceled, std::exception_ptr &eptr)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (p->path.empty()) {
|
||||||
|
// This happens when the user cancels the import dialog. That is not
|
||||||
|
// an error to report, but we cannot continue either.
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
std::string name = wxFileName(p->path).GetName().ToUTF8().data();
|
std::string name = wxFileName(p->path).GetName().ToUTF8().data();
|
||||||
|
|
||||||
if (p->profile.empty()) {
|
if (p->profile.empty()) {
|
||||||
|
|
|
@ -1491,22 +1491,18 @@ bool Sidebar::is_multifilament()
|
||||||
return p->combos_filament.size() > 1;
|
return p->combos_filament.size() > 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static std::vector<Search::InputInfo> get_search_inputs(ConfigOptionMode mode)
|
void Sidebar::check_and_update_searcher(bool respect_mode /*= false*/)
|
||||||
{
|
{
|
||||||
std::vector<Search::InputInfo> ret {};
|
std::vector<Search::InputInfo> search_inputs{};
|
||||||
|
|
||||||
auto& tabs_list = wxGetApp().tabs_list;
|
auto& tabs_list = wxGetApp().tabs_list;
|
||||||
auto print_tech = wxGetApp().preset_bundle->printers.get_selected_preset().printer_technology();
|
auto print_tech = wxGetApp().preset_bundle->printers.get_selected_preset().printer_technology();
|
||||||
for (auto tab : tabs_list)
|
for (auto tab : tabs_list)
|
||||||
if (tab->supports_printer_technology(print_tech))
|
if (tab->supports_printer_technology(print_tech))
|
||||||
ret.emplace_back(Search::InputInfo {tab->get_config(), tab->type(), mode});
|
search_inputs.emplace_back(Search::InputInfo{ tab->get_config(), tab->type() });
|
||||||
|
|
||||||
return ret;
|
p->searcher.check_and_update(wxGetApp().preset_bundle->printers.get_selected_preset().printer_technology(),
|
||||||
}
|
respect_mode ? m_mode : comExpert, search_inputs);
|
||||||
|
|
||||||
void Sidebar::update_searcher()
|
|
||||||
{
|
|
||||||
p->searcher.init(get_search_inputs(m_mode));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Sidebar::update_mode()
|
void Sidebar::update_mode()
|
||||||
|
@ -1515,7 +1511,6 @@ void Sidebar::update_mode()
|
||||||
|
|
||||||
update_reslice_btn_tooltip();
|
update_reslice_btn_tooltip();
|
||||||
update_mode_sizer();
|
update_mode_sizer();
|
||||||
update_searcher();
|
|
||||||
|
|
||||||
wxWindowUpdateLocker noUpdates(this);
|
wxWindowUpdateLocker noUpdates(this);
|
||||||
|
|
||||||
|
@ -1573,6 +1568,8 @@ Search::OptionsSearcher& Sidebar::get_searcher()
|
||||||
|
|
||||||
std::string& Sidebar::get_search_line()
|
std::string& Sidebar::get_search_line()
|
||||||
{
|
{
|
||||||
|
// update searcher before show imGui search dialog on the plater, if printer technology or mode was changed
|
||||||
|
check_and_update_searcher(true);
|
||||||
return p->searcher.search_string();
|
return p->searcher.search_string();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1716,8 +1713,11 @@ struct Plater::priv
|
||||||
res = (act == "1") ? wxID_YES : wxID_NO;
|
res = (act == "1") ? wxID_YES : wxID_NO;
|
||||||
|
|
||||||
if (res == wxID_YES)
|
if (res == wxID_YES)
|
||||||
if (!mainframe->save_project_as(project_name))
|
if (!mainframe->save_project_as(project_name)) {
|
||||||
res = wxID_CANCEL;
|
// Return Cancel only, when we don't remember a choice for closing the application.
|
||||||
|
// Elsewhere it can causes an impossibility to close the application at all.
|
||||||
|
res = act.empty() ? wxID_CANCEL : wxID_NO;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return res;
|
return res;
|
||||||
|
@ -2399,7 +2399,11 @@ std::vector<size_t> Plater::priv::load_files(const std::vector<fs::path>& input_
|
||||||
}
|
}
|
||||||
|
|
||||||
const auto loading = _L("Loading") + dots;
|
const auto loading = _L("Loading") + dots;
|
||||||
wxProgressDialog progress_dlg(loading, "", 100, find_toplevel_parent(q), wxPD_AUTO_HIDE);
|
|
||||||
|
// Create wxProgressDialog on heap, see the linux ifdef below.
|
||||||
|
auto progress_dlg = new wxProgressDialog(loading, "", 100, find_toplevel_parent(q), wxPD_AUTO_HIDE);
|
||||||
|
Slic3r::ScopeGuard([&progress_dlg](){ if (progress_dlg) progress_dlg->Destroy(); progress_dlg = nullptr; });
|
||||||
|
|
||||||
wxBusyCursor busy;
|
wxBusyCursor busy;
|
||||||
|
|
||||||
auto *new_model = (!load_model || one_by_one) ? nullptr : new Slic3r::Model();
|
auto *new_model = (!load_model || one_by_one) ? nullptr : new Slic3r::Model();
|
||||||
|
@ -2419,8 +2423,10 @@ std::vector<size_t> Plater::priv::load_files(const std::vector<fs::path>& input_
|
||||||
const auto &path = input_files[i];
|
const auto &path = input_files[i];
|
||||||
#endif // _WIN32
|
#endif // _WIN32
|
||||||
const auto filename = path.filename();
|
const auto filename = path.filename();
|
||||||
progress_dlg.Update(static_cast<int>(100.0f * static_cast<float>(i) / static_cast<float>(input_files.size())), _L("Loading file") + ": " + from_path(filename));
|
if (progress_dlg) {
|
||||||
progress_dlg.Fit();
|
progress_dlg->Update(static_cast<int>(100.0f * static_cast<float>(i) / static_cast<float>(input_files.size())), _L("Loading file") + ": " + from_path(filename));
|
||||||
|
progress_dlg->Fit();
|
||||||
|
}
|
||||||
|
|
||||||
const bool type_3mf = std::regex_match(path.string(), pattern_3mf);
|
const bool type_3mf = std::regex_match(path.string(), pattern_3mf);
|
||||||
const bool type_zip_amf = !type_3mf && std::regex_match(path.string(), pattern_zip_amf);
|
const bool type_zip_amf = !type_3mf && std::regex_match(path.string(), pattern_zip_amf);
|
||||||
|
@ -2438,8 +2444,10 @@ std::vector<size_t> Plater::priv::load_files(const std::vector<fs::path>& input_
|
||||||
// then related SLA Print and Materials Settings or FFF Print and Filaments Settings will be unparent from the wxNoteBook
|
// then related SLA Print and Materials Settings or FFF Print and Filaments Settings will be unparent from the wxNoteBook
|
||||||
// and that is why they will never be enabled after destruction of the ProgressDialog.
|
// and that is why they will never be enabled after destruction of the ProgressDialog.
|
||||||
// So, distroy progress_gialog if we are loading project file
|
// So, distroy progress_gialog if we are loading project file
|
||||||
if (input_files_size == 1)
|
if (input_files_size == 1 && progress_dlg) {
|
||||||
progress_dlg.Destroy();
|
progress_dlg->Destroy();
|
||||||
|
progress_dlg = nullptr;
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
DynamicPrintConfig config;
|
DynamicPrintConfig config;
|
||||||
PrinterTechnology loaded_printer_technology {ptFFF};
|
PrinterTechnology loaded_printer_technology {ptFFF};
|
||||||
|
@ -5822,6 +5830,10 @@ void Plater::convert_unit(ConversionType conv_type)
|
||||||
if (obj_idxs.empty() && volume_idxs.empty())
|
if (obj_idxs.empty() && volume_idxs.empty())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
// We will remove object indexes after convertion
|
||||||
|
// So, resort object indexes descending to avoid the crash after remove
|
||||||
|
std::sort(obj_idxs.begin(), obj_idxs.end(), std::greater<int>());
|
||||||
|
|
||||||
TakeSnapshot snapshot(this, conv_type == ConversionType::CONV_FROM_INCH ? _L("Convert from imperial units") :
|
TakeSnapshot snapshot(this, conv_type == ConversionType::CONV_FROM_INCH ? _L("Convert from imperial units") :
|
||||||
conv_type == ConversionType::CONV_TO_INCH ? _L("Revert conversion from imperial units") :
|
conv_type == ConversionType::CONV_TO_INCH ? _L("Revert conversion from imperial units") :
|
||||||
conv_type == ConversionType::CONV_FROM_METER ? _L("Convert from meters") : _L("Revert conversion from meters"));
|
conv_type == ConversionType::CONV_FROM_METER ? _L("Convert from meters") : _L("Revert conversion from meters"));
|
||||||
|
@ -6497,8 +6509,6 @@ void Plater::on_config_change(const DynamicPrintConfig &config)
|
||||||
p->config->set_key_value(opt_key, config.option(opt_key)->clone());
|
p->config->set_key_value(opt_key, config.option(opt_key)->clone());
|
||||||
if (opt_key == "printer_technology") {
|
if (opt_key == "printer_technology") {
|
||||||
this->set_printer_technology(config.opt_enum<PrinterTechnology>(opt_key));
|
this->set_printer_technology(config.opt_enum<PrinterTechnology>(opt_key));
|
||||||
// print technology is changed, so we should to update a search list
|
|
||||||
p->sidebar->update_searcher();
|
|
||||||
p->sidebar->show_sliced_info_sizer(false);
|
p->sidebar->show_sliced_info_sizer(false);
|
||||||
p->reset_gcode_toolpaths();
|
p->reset_gcode_toolpaths();
|
||||||
p->view3D->get_canvas3d()->reset_sequential_print_clearance();
|
p->view3D->get_canvas3d()->reset_sequential_print_clearance();
|
||||||
|
@ -6747,8 +6757,6 @@ bool Plater::set_printer_technology(PrinterTechnology printer_technology)
|
||||||
|
|
||||||
p->update_main_toolbar_tooltips();
|
p->update_main_toolbar_tooltips();
|
||||||
|
|
||||||
p->sidebar->get_searcher().set_printer_technology(printer_technology);
|
|
||||||
|
|
||||||
p->notification_manager->set_fff(printer_technology == ptFFF);
|
p->notification_manager->set_fff(printer_technology == ptFFF);
|
||||||
p->notification_manager->set_slicing_progress_hidden();
|
p->notification_manager->set_slicing_progress_hidden();
|
||||||
|
|
||||||
|
@ -6912,8 +6920,10 @@ void Plater::search(bool plater_is_active)
|
||||||
evt.SetControlDown(true);
|
evt.SetControlDown(true);
|
||||||
canvas3D()->on_char(evt);
|
canvas3D()->on_char(evt);
|
||||||
}
|
}
|
||||||
else
|
else {
|
||||||
|
p->sidebar->check_and_update_searcher(true);
|
||||||
p->sidebar->get_searcher().show_dialog();
|
p->sidebar->get_searcher().show_dialog();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Plater::msw_rescale()
|
void Plater::msw_rescale()
|
||||||
|
|
|
@ -113,7 +113,7 @@ public:
|
||||||
void update_mode();
|
void update_mode();
|
||||||
bool is_collapsed();
|
bool is_collapsed();
|
||||||
void collapse(bool collapse);
|
void collapse(bool collapse);
|
||||||
void update_searcher();
|
void check_and_update_searcher(bool respect_mode = false);
|
||||||
void update_ui_from_settings();
|
void update_ui_from_settings();
|
||||||
|
|
||||||
#ifdef _MSW_DARK_MODE
|
#ifdef _MSW_DARK_MODE
|
||||||
|
|
|
@ -78,7 +78,7 @@ static std::string get_key(const std::string& opt_key, Preset::Type type)
|
||||||
return std::to_string(int(type)) + ";" + opt_key;
|
return std::to_string(int(type)) + ";" + opt_key;
|
||||||
}
|
}
|
||||||
|
|
||||||
void OptionsSearcher::append_options(DynamicPrintConfig* config, Preset::Type type, ConfigOptionMode mode)
|
void OptionsSearcher::append_options(DynamicPrintConfig* config, Preset::Type type)
|
||||||
{
|
{
|
||||||
auto emplace = [this, type](const std::string key, const wxString& label)
|
auto emplace = [this, type](const std::string key, const wxString& label)
|
||||||
{
|
{
|
||||||
|
@ -299,8 +299,9 @@ OptionsSearcher::~OptionsSearcher()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
void OptionsSearcher::init(std::vector<InputInfo> input_values)
|
void OptionsSearcher::check_and_update(PrinterTechnology pt_in, ConfigOptionMode mode_in, std::vector<InputInfo> input_values)
|
||||||
{
|
{
|
||||||
|
<<<<<<< HEAD
|
||||||
options.clear();
|
options.clear();
|
||||||
for (auto i : input_values)
|
for (auto i : input_values)
|
||||||
append_options(i.config, i.type, i.mode);
|
append_options(i.config, i.type, i.mode);
|
||||||
|
@ -315,14 +316,18 @@ void OptionsSearcher::init(std::vector<InputInfo> input_values)
|
||||||
void OptionsSearcher::apply(DynamicPrintConfig* config, Preset::Type type, ConfigOptionMode mode)
|
void OptionsSearcher::apply(DynamicPrintConfig* config, Preset::Type type, ConfigOptionMode mode)
|
||||||
{
|
{
|
||||||
if (options.empty())
|
if (options.empty())
|
||||||
|
=======
|
||||||
|
if (printer_technology == pt_in && mode == mode_in)
|
||||||
|
>>>>>>> stable
|
||||||
return;
|
return;
|
||||||
|
|
||||||
options.erase(std::remove_if(options.begin(), options.end(), [type](Option opt) {
|
options.clear();
|
||||||
return opt.type == type;
|
|
||||||
}), options.end());
|
|
||||||
|
|
||||||
append_options(config, type, mode);
|
printer_technology = pt_in;
|
||||||
|
mode = mode_in;
|
||||||
|
|
||||||
|
for (auto i : input_values)
|
||||||
|
append_options(i.config, i.type);
|
||||||
sort_options();
|
sort_options();
|
||||||
|
|
||||||
search(search_line, true);
|
search(search_line, true);
|
||||||
|
|
|
@ -33,7 +33,6 @@ struct InputInfo
|
||||||
{
|
{
|
||||||
DynamicPrintConfig* config {nullptr};
|
DynamicPrintConfig* config {nullptr};
|
||||||
Preset::Type type {Preset::TYPE_INVALID};
|
Preset::Type type {Preset::TYPE_INVALID};
|
||||||
ConfigOptionMode mode {comSimple};
|
|
||||||
};
|
};
|
||||||
|
|
||||||
struct GroupAndCategory {
|
struct GroupAndCategory {
|
||||||
|
@ -83,13 +82,14 @@ class OptionsSearcher
|
||||||
{
|
{
|
||||||
std::string search_line;
|
std::string search_line;
|
||||||
std::map<std::string, GroupAndCategory> groups_and_categories;
|
std::map<std::string, GroupAndCategory> groups_and_categories;
|
||||||
PrinterTechnology printer_technology;
|
PrinterTechnology printer_technology {ptAny};
|
||||||
|
ConfigOptionMode mode{ comUndef };
|
||||||
|
|
||||||
std::vector<Option> options {};
|
std::vector<Option> options {};
|
||||||
std::vector<Option> preferences_options {};
|
std::vector<Option> preferences_options {};
|
||||||
std::vector<FoundOption> found {};
|
std::vector<FoundOption> found {};
|
||||||
|
|
||||||
void append_options(DynamicPrintConfig* config, Preset::Type type, ConfigOptionMode mode);
|
void append_options(DynamicPrintConfig* config, Preset::Type type);
|
||||||
|
|
||||||
void sort_options() {
|
void sort_options() {
|
||||||
std::sort(options.begin(), options.end(), [](const Option& o1, const Option& o2) {
|
std::sort(options.begin(), options.end(), [](const Option& o1, const Option& o2) {
|
||||||
|
@ -111,12 +111,18 @@ public:
|
||||||
OptionsSearcher();
|
OptionsSearcher();
|
||||||
~OptionsSearcher();
|
~OptionsSearcher();
|
||||||
|
|
||||||
|
<<<<<<< HEAD
|
||||||
void init(std::vector<InputInfo> input_values);
|
void init(std::vector<InputInfo> input_values);
|
||||||
void apply(DynamicPrintConfig *config,
|
void apply(DynamicPrintConfig *config,
|
||||||
Preset::Type type,
|
Preset::Type type,
|
||||||
ConfigOptionMode mode);
|
ConfigOptionMode mode);
|
||||||
void append_preferences_option(const GUI::Line& opt_line);
|
void append_preferences_option(const GUI::Line& opt_line);
|
||||||
void append_preferences_options(const std::vector<GUI::Line>& opt_lines);
|
void append_preferences_options(const std::vector<GUI::Line>& opt_lines);
|
||||||
|
=======
|
||||||
|
void check_and_update( PrinterTechnology pt_in,
|
||||||
|
ConfigOptionMode mode_in,
|
||||||
|
std::vector<InputInfo> input_values);
|
||||||
|
>>>>>>> stable
|
||||||
bool search();
|
bool search();
|
||||||
bool search(const std::string& search, bool force = false);
|
bool search(const std::string& search, bool force = false);
|
||||||
|
|
||||||
|
@ -133,8 +139,6 @@ public:
|
||||||
const GroupAndCategory& get_group_and_category (const std::string& opt_key) { return groups_and_categories[opt_key]; }
|
const GroupAndCategory& get_group_and_category (const std::string& opt_key) { return groups_and_categories[opt_key]; }
|
||||||
std::string& search_string() { return search_line; }
|
std::string& search_string() { return search_line; }
|
||||||
|
|
||||||
void set_printer_technology(PrinterTechnology pt) { printer_technology = pt; }
|
|
||||||
|
|
||||||
void sort_options_by_key() {
|
void sort_options_by_key() {
|
||||||
std::sort(options.begin(), options.end(), [](const Option& o1, const Option& o2) {
|
std::sort(options.begin(), options.end(), [](const Option& o1, const Option& o2) {
|
||||||
return o1.key < o2.key; });
|
return o1.key < o2.key; });
|
||||||
|
|
|
@ -1191,11 +1191,6 @@ void Tab::activate_option(const std::string& opt_key, const wxString& category)
|
||||||
m_highlighter.init(get_custom_ctrl_with_blinking_ptr(opt_key));
|
m_highlighter.init(get_custom_ctrl_with_blinking_ptr(opt_key));
|
||||||
}
|
}
|
||||||
|
|
||||||
void Tab::apply_searcher()
|
|
||||||
{
|
|
||||||
wxGetApp().sidebar().get_searcher().apply(m_config, m_type, m_mode);
|
|
||||||
}
|
|
||||||
|
|
||||||
void Tab::cache_config_diff(const std::vector<std::string>& selected_options)
|
void Tab::cache_config_diff(const std::vector<std::string>& selected_options)
|
||||||
{
|
{
|
||||||
m_cache_config.apply_only(m_presets->get_edited_preset().config, selected_options);
|
m_cache_config.apply_only(m_presets->get_edited_preset().config, selected_options);
|
||||||
|
@ -2836,9 +2831,6 @@ void TabPrinter::build_unregular_pages(bool from_initial_build/* = false*/)
|
||||||
|
|
||||||
// Reload preset pages with current configuration values
|
// Reload preset pages with current configuration values
|
||||||
reload_config();
|
reload_config();
|
||||||
|
|
||||||
// apply searcher with current configuration
|
|
||||||
apply_searcher();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// this gets executed after preset is loaded and before GUI fields are updated
|
// this gets executed after preset is loaded and before GUI fields are updated
|
||||||
|
|
|
@ -377,7 +377,6 @@ public:
|
||||||
|
|
||||||
void update_wiping_button_visibility();
|
void update_wiping_button_visibility();
|
||||||
void activate_option(const std::string& opt_key, const wxString& category);
|
void activate_option(const std::string& opt_key, const wxString& category);
|
||||||
void apply_searcher();
|
|
||||||
void cache_config_diff(const std::vector<std::string>& selected_options);
|
void cache_config_diff(const std::vector<std::string>& selected_options);
|
||||||
void apply_config_from_cache();
|
void apply_config_from_cache();
|
||||||
|
|
||||||
|
|
|
@ -1243,6 +1243,8 @@ void UnsavedChangesDialog::update(Preset::Type type, PresetCollection* dependent
|
||||||
|
|
||||||
void UnsavedChangesDialog::update_tree(Preset::Type type, PresetCollection* presets_)
|
void UnsavedChangesDialog::update_tree(Preset::Type type, PresetCollection* presets_)
|
||||||
{
|
{
|
||||||
|
// update searcher befofre update of tree
|
||||||
|
wxGetApp().sidebar().check_and_update_searcher();
|
||||||
Search::OptionsSearcher& searcher = wxGetApp().sidebar().get_searcher();
|
Search::OptionsSearcher& searcher = wxGetApp().sidebar().get_searcher();
|
||||||
searcher.sort_options_by_key();
|
searcher.sort_options_by_key();
|
||||||
|
|
||||||
|
@ -1298,9 +1300,6 @@ void UnsavedChangesDialog::update_tree(Preset::Type type, PresetCollection* pres
|
||||||
get_string_value(opt_key, old_config), get_string_value(opt_key, new_config), category_icon_map.at(option.category));
|
get_string_value(opt_key, old_config), get_string_value(opt_key, new_config), category_icon_map.at(option.category));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Revert sort of searcher back
|
|
||||||
searcher.sort_options_by_label();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void UnsavedChangesDialog::on_dpi_changed(const wxRect& suggested_rect)
|
void UnsavedChangesDialog::on_dpi_changed(const wxRect& suggested_rect)
|
||||||
|
@ -1606,6 +1605,8 @@ void DiffPresetDialog::update_presets(Preset::Type type)
|
||||||
|
|
||||||
void DiffPresetDialog::update_tree()
|
void DiffPresetDialog::update_tree()
|
||||||
{
|
{
|
||||||
|
// update searcher befofre update of tree
|
||||||
|
wxGetApp().sidebar().check_and_update_searcher();
|
||||||
Search::OptionsSearcher& searcher = wxGetApp().sidebar().get_searcher();
|
Search::OptionsSearcher& searcher = wxGetApp().sidebar().get_searcher();
|
||||||
searcher.sort_options_by_key();
|
searcher.sort_options_by_key();
|
||||||
|
|
||||||
|
@ -1708,9 +1709,6 @@ void DiffPresetDialog::update_tree()
|
||||||
Fit();
|
Fit();
|
||||||
Refresh();
|
Refresh();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Revert sort of searcher back
|
|
||||||
searcher.sort_options_by_label();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void DiffPresetDialog::on_dpi_changed(const wxRect&)
|
void DiffPresetDialog::on_dpi_changed(const wxRect&)
|
||||||
|
|
Loading…
Reference in a new issue