mirror of
https://github.com/SoftFever/OrcaSlicer.git
synced 2025-07-24 07:03:59 -06:00
New feature: plate name
This commit is contained in:
commit
6d60f968f4
18 changed files with 369 additions and 172 deletions
|
@ -153,7 +153,7 @@ Standard: Latest
|
|||
StatementMacros:
|
||||
- Q_UNUSED
|
||||
- QT_REQUIRE_VERSION
|
||||
TabWidth: 8
|
||||
TabWidth: 4
|
||||
UseCRLF: false
|
||||
UseTab: Never
|
||||
WhitespaceSensitiveMacros:
|
||||
|
|
|
@ -458,7 +458,9 @@ msgid ""
|
|||
"OrcaSlicer will terminate because of running out of memory.It may be a bug. "
|
||||
"It will be appreciated if you report the issue to our team."
|
||||
msgstr ""
|
||||
"OrcaSlicer wird aufgrund eines Speicherplatzmangels beendet. Es könnte sich um einen Fehler handeln. Wir würden es schätzen, wenn Sie das Problem unserem Team melden würden."
|
||||
"OrcaSlicer wird aufgrund eines Speicherplatzmangels beendet. Es könnte sich "
|
||||
"um einen Fehler handeln. Wir würden es schätzen, wenn Sie das Problem "
|
||||
"unserem Team melden würden."
|
||||
|
||||
msgid "Fatal error"
|
||||
msgstr "Fataler Fehler"
|
||||
|
@ -467,7 +469,9 @@ msgid ""
|
|||
"OrcaSlicer will terminate because of a localization error. It will be "
|
||||
"appreciated if you report the specific scenario this issue happened."
|
||||
msgstr ""
|
||||
"OrcaSlicer wird aufgrund eines Lokalisierungsfehlers beendet. Es wird geschätzt, wenn Sie das spezifische Szenario melden, in dem dieser Fehler aufgetreten ist."
|
||||
"OrcaSlicer wird aufgrund eines Lokalisierungsfehlers beendet. Es wird "
|
||||
"geschätzt, wenn Sie das spezifische Szenario melden, in dem dieser Fehler "
|
||||
"aufgetreten ist."
|
||||
|
||||
msgid "Critical error"
|
||||
msgstr "Kritischer Fehler"
|
||||
|
@ -490,7 +494,9 @@ msgid ""
|
|||
"OrcaSlicer configuration file may be corrupted and is not abled to be parsed."
|
||||
"Please delete the file and try again."
|
||||
msgstr ""
|
||||
"Die OrcaSlicer-Konfigurationsdatei ist möglicherweise beschädigt und kann nicht analysiert werden. Bitte löschen Sie die Datei und versuchen Sie es erneut."
|
||||
"Die OrcaSlicer-Konfigurationsdatei ist möglicherweise beschädigt und kann "
|
||||
"nicht analysiert werden. Bitte löschen Sie die Datei und versuchen Sie es "
|
||||
"erneut."
|
||||
|
||||
#, c-format, boost-format
|
||||
msgid ""
|
||||
|
@ -1524,10 +1530,12 @@ msgid ""
|
|||
"The SLA archive doesn't contain any presets. Please activate some SLA "
|
||||
"printer preset first before importing that SLA archive."
|
||||
msgstr ""
|
||||
"Die SLA-Archivdatei enthält keine Voreinstellungen. Bitte aktivieren Sie zuerst einige SLA-Druckervoreinstellungen, bevor Sie das SLA-Archiv importieren."
|
||||
"Die SLA-Archivdatei enthält keine Voreinstellungen. Bitte aktivieren Sie "
|
||||
"zuerst einige SLA-Druckervoreinstellungen, bevor Sie das SLA-Archiv "
|
||||
"importieren."
|
||||
|
||||
msgid "Importing canceled."
|
||||
msgstr """Import abgebrochen."
|
||||
msgstr "Import abgebrochen."
|
||||
|
||||
msgid "Importing done."
|
||||
msgstr "Import erfolgreich."
|
||||
|
@ -1536,13 +1544,17 @@ msgid ""
|
|||
"The imported SLA archive did not contain any presets. The current SLA "
|
||||
"presets were used as fallback."
|
||||
msgstr ""
|
||||
"Die importierte SLA-Archivdatei enthält keine Voreinstellungen. Die aktuellen SLA-Voreinstellungen wurden als Fallback verwendet."
|
||||
"Die importierte SLA-Archivdatei enthält keine Voreinstellungen. Die "
|
||||
"aktuellen SLA-Voreinstellungen wurden als Fallback verwendet."
|
||||
|
||||
msgid "You cannot load SLA project with a multi-part object on the bed"
|
||||
msgstr "Du kannst kein SLA-Projekt mit einem mehrteiligen Objekt auf dem Druckbett laden."
|
||||
msgstr ""
|
||||
"Du kannst kein SLA-Projekt mit einem mehrteiligen Objekt auf dem Druckbett "
|
||||
"laden."
|
||||
|
||||
msgid "Please check your object list before preset changing."
|
||||
msgstr "Bitte überprüfen Sie Ihre Objektliste vor der Änderung des Voreinstellungen."
|
||||
msgstr ""
|
||||
"Bitte überprüfen Sie Ihre Objektliste vor der Änderung des Voreinstellungen."
|
||||
|
||||
msgid "Attention!"
|
||||
msgstr "Achtung!"
|
||||
|
@ -1585,7 +1597,9 @@ msgid ""
|
|||
"by Prusa Research. PrusaSlicer is from Slic3r by Alessandro Ranellucci and "
|
||||
"the RepRap community"
|
||||
msgstr ""
|
||||
"Orca Slicer basiert auf BambuStudio von Bambulab, welches von PrusaSlicer von Prusa Research stammt. PrusaSlicer wiederum basiert auf Slic3r von Alessandro Ranellucci und der RepRap-Community."
|
||||
"Orca Slicer basiert auf BambuStudio von Bambulab, welches von PrusaSlicer "
|
||||
"von Prusa Research stammt. PrusaSlicer wiederum basiert auf Slic3r von "
|
||||
"Alessandro Ranellucci und der RepRap-Community."
|
||||
|
||||
msgid "Libraries"
|
||||
msgstr "Bibliotheken"
|
||||
|
@ -1668,7 +1682,9 @@ msgid "Factor N"
|
|||
msgstr "Faktor N"
|
||||
|
||||
msgid "Setting Virtual slot information while printing is not supported"
|
||||
msgstr "Das Einstellen von virtuellen Slot-Informationen während des Druckens wird nicht unterstützt."
|
||||
msgstr ""
|
||||
"Das Einstellen von virtuellen Slot-Informationen während des Druckens wird "
|
||||
"nicht unterstützt."
|
||||
|
||||
msgid "Please input a valid value (K in 0~0.5)"
|
||||
msgstr "Bitte geben Sie einen gültigen Wert ein (K im Bereich von 0 bis 0,5)"
|
||||
|
@ -1784,7 +1800,9 @@ msgid ""
|
|||
"Green means that AMS humidity is normal, orange represent humidity is high, "
|
||||
"red represent humidity is too high.(Hygrometer: lower the better.)"
|
||||
msgstr ""
|
||||
"Grün bedeutet, dass die Luftfeuchtigkeit der AMS normal ist, Orange bedeutet, dass die Luftfeuchtigkeit hoch ist und Rot bedeutet, dass die Luftfeuchtigkeit zu hoch ist. (Hygrometer: Je niedriger, desto besser.)"
|
||||
"Grün bedeutet, dass die Luftfeuchtigkeit der AMS normal ist, Orange "
|
||||
"bedeutet, dass die Luftfeuchtigkeit hoch ist und Rot bedeutet, dass die "
|
||||
"Luftfeuchtigkeit zu hoch ist. (Hygrometer: Je niedriger, desto besser.)"
|
||||
|
||||
msgid "Desiccant status"
|
||||
msgstr "Trockenmittelstatus"
|
||||
|
@ -1793,7 +1811,9 @@ msgid ""
|
|||
"A desiccant status lower than two bars indicates that desiccant may be "
|
||||
"inactive. Please change the desiccant.(The bars: higher the better.)"
|
||||
msgstr ""
|
||||
"Ein Desiccant-Status von weniger als zwei Balken zeigt an, dass der Desiccant möglicherweise inaktiv ist. Bitte wechseln Sie den Desiccant aus. (Die Balken: je höher, desto besser.)"
|
||||
"Ein Desiccant-Status von weniger als zwei Balken zeigt an, dass der "
|
||||
"Desiccant möglicherweise inaktiv ist. Bitte wechseln Sie den Desiccant aus. "
|
||||
"(Die Balken: je höher, desto besser.)"
|
||||
|
||||
msgid ""
|
||||
"Note: When the lid is open or the desiccant pack is changed, it can take "
|
||||
|
@ -2217,7 +2237,9 @@ msgstr ""
|
|||
"Nein - Verzichten Sie dieses Mal auf den Spiralmodus"
|
||||
|
||||
msgid "Arachne engine doesn't work with classic overhang speed mode.\n"
|
||||
msgstr "Die Arachne-Engine funktioniert nicht im klassischen Überhanganpassungsmodus.\n"
|
||||
msgstr ""
|
||||
"Die Arachne-Engine funktioniert nicht im klassischen "
|
||||
"Überhanganpassungsmodus.\n"
|
||||
|
||||
msgid ""
|
||||
"Turn off classic mode automatically? \n"
|
||||
|
@ -2282,7 +2304,8 @@ msgid ""
|
|||
"While printing by Object, the extruder may collide skirt.\n"
|
||||
"Thus, reset the skirt layer to 1 to avoid that."
|
||||
msgstr ""
|
||||
"Während des Druckens mit einem Objekt kann der Extruder auf den Rand stoßen.\n"
|
||||
"Während des Druckens mit einem Objekt kann der Extruder auf den Rand "
|
||||
"stoßen.\n"
|
||||
"Daher sollten die Skirt-Ebenen zurückgesetzt werden."
|
||||
|
||||
msgid "Auto bed leveling"
|
||||
|
@ -2881,7 +2904,9 @@ msgid "No"
|
|||
msgstr "Nein"
|
||||
|
||||
msgid "will be closed before creating a new model. Do you want to continue?"
|
||||
msgstr "Bevor ein neues Modell erstellt wird, wird %1% geschlossen. Möchten Sie fortfahren?"
|
||||
msgstr ""
|
||||
"Bevor ein neues Modell erstellt wird, wird %1% geschlossen. Möchten Sie "
|
||||
"fortfahren?"
|
||||
|
||||
msgid "Slice plate"
|
||||
msgstr "Aktuelle Platte slicen"
|
||||
|
@ -3213,11 +3238,15 @@ msgstr "&Hilfe"
|
|||
|
||||
#, c-format, boost-format
|
||||
msgid "A file exists with the same name: %s, do you want to override it."
|
||||
msgstr "Es existiert bereits eine Datei mit demselben Namen: %s. Möchten Sie sie überschreiben?"
|
||||
msgstr ""
|
||||
"Es existiert bereits eine Datei mit demselben Namen: %s. Möchten Sie sie "
|
||||
"überschreiben?"
|
||||
|
||||
#, c-format, boost-format
|
||||
msgid "A config exists with the same name: %s, do you want to override it."
|
||||
msgstr "Eine Konfiguration mit dem gleichen Namen existiert bereits: %s. Möchten Sie sie überschreiben?"
|
||||
msgstr ""
|
||||
"Eine Konfiguration mit dem gleichen Namen existiert bereits: %s. Möchten Sie "
|
||||
"sie überschreiben?"
|
||||
|
||||
msgid "Overwrite file"
|
||||
msgstr "Datei überschreiben"
|
||||
|
@ -3922,7 +3951,8 @@ msgid ""
|
|||
"Already did a synchronization, do you want to sync only changes or resync "
|
||||
"all?"
|
||||
msgstr ""
|
||||
"Es wurde bereits eine Synchronisation durchgeführt. Möchtest du nur Änderungen synchronisieren oder alles neu synchronisieren?"
|
||||
"Es wurde bereits eine Synchronisation durchgeführt. Möchtest du nur "
|
||||
"Änderungen synchronisieren oder alles neu synchronisieren?"
|
||||
|
||||
msgid "Sync"
|
||||
msgstr "Sync"
|
||||
|
@ -4331,7 +4361,9 @@ msgid ""
|
|||
"still want to do this printing, please set this filament's bed temperature "
|
||||
"to non zero."
|
||||
msgstr ""
|
||||
"Plate %d: %s wird nicht empfohlen, um Filament %s (%s) zu drucken. Wenn Sie dennoch diesen Druck durchführen möchten, stellen Sie bitte die Betttemperatur dieses Filaments auf einen Wert größer als Null."
|
||||
"Plate %d: %s wird nicht empfohlen, um Filament %s (%s) zu drucken. Wenn Sie "
|
||||
"dennoch diesen Druck durchführen möchten, stellen Sie bitte die "
|
||||
"Betttemperatur dieses Filaments auf einen Wert größer als Null."
|
||||
|
||||
msgid "Switching the language requires application restart.\n"
|
||||
msgstr "Der Wechsel der Sprache erfordert einen Neustart der Anwendung.\n"
|
||||
|
@ -4928,7 +4960,9 @@ msgstr ""
|
|||
"wird"
|
||||
|
||||
msgid "An SD card needs to be inserted before send to printer SD card."
|
||||
msgstr "Bevor Sie die Datei an die SD-Karte des Druckers senden können, muss eine SD-Karte eingelegt werden."
|
||||
msgstr ""
|
||||
"Bevor Sie die Datei an die SD-Karte des Druckers senden können, muss eine SD-"
|
||||
"Karte eingelegt werden."
|
||||
|
||||
msgid "The printer is required to be in the same LAN as Orca Slicer."
|
||||
msgstr "Der Drucker muss sich im selben LAN wie OrcaSlicer befinden."
|
||||
|
@ -5035,8 +5069,8 @@ msgstr ""
|
|||
msgid ""
|
||||
"When recording timelapse without toolhead, it is recommended to add a "
|
||||
"\"Timelapse Wipe Tower\" \n"
|
||||
"by right-click the empty position of build plate and choose \"Add "
|
||||
"Primitive\"->\"Timelapse Wipe Tower\"."
|
||||
"by right-click the empty position of build plate and choose \"Add Primitive"
|
||||
"\"->\"Timelapse Wipe Tower\"."
|
||||
msgstr ""
|
||||
"Wenn Sie eine Zeitrafferaufnahme ohne Werkzeugkopf aufnehmen, wird "
|
||||
"empfohlen, einen „Timelapse Wipe Tower“ hinzuzufügen,\n"
|
||||
|
@ -6414,7 +6448,9 @@ msgstr "Gerät"
|
|||
|
||||
msgid ""
|
||||
"Specify the URL of your device user interface if it's not same as print_host"
|
||||
msgstr "Bitte geben Sie die URL der Benutzeroberfläche Ihres Geräts an, falls sie nicht mit print_host identisch ist."
|
||||
msgstr ""
|
||||
"Bitte geben Sie die URL der Benutzeroberfläche Ihres Geräts an, falls sie "
|
||||
"nicht mit print_host identisch ist."
|
||||
|
||||
msgid "API Key / Password"
|
||||
msgstr "API Key / Passwort"
|
||||
|
@ -6761,8 +6797,9 @@ msgid ""
|
|||
"This controls the generation of the brim at outer side of models. Auto means "
|
||||
"the brim width is analysed and calculated automatically."
|
||||
msgstr ""
|
||||
"Dies steuert die Generierung des Brims auf der Außenseite von Modellen."
|
||||
"Auto bedeutet, dass die Breite des Brims automatisch analysiert und berechnet wird."
|
||||
"Dies steuert die Generierung des Brims auf der Außenseite von Modellen.Auto "
|
||||
"bedeutet, dass die Breite des Brims automatisch analysiert und berechnet "
|
||||
"wird."
|
||||
|
||||
msgid "outer_only"
|
||||
msgstr "Nur Außen"
|
||||
|
@ -6988,7 +7025,11 @@ msgid ""
|
|||
"example: 80%) it will be calculated on the outer wall speed setting above. "
|
||||
"Set to zero for auto."
|
||||
msgstr ""
|
||||
"Diese separate Einstellung beeinflusst die Geschwindigkeit von Umfängen mit einem Radius <= small_perimeter_threshold (normalerweise Löcher). Wenn es als Prozentsatz ausgedrückt wird (z.B. 80%), wird es auf die oben genannte Einstellung der Geschwindigkeit der Außenwand berechnet. Setzen Sie es auf Null für automatisch."
|
||||
"Diese separate Einstellung beeinflusst die Geschwindigkeit von Umfängen mit "
|
||||
"einem Radius <= small_perimeter_threshold (normalerweise Löcher). Wenn es "
|
||||
"als Prozentsatz ausgedrückt wird (z.B. 80%), wird es auf die oben genannte "
|
||||
"Einstellung der Geschwindigkeit der Außenwand berechnet. Setzen Sie es auf "
|
||||
"Null für automatisch."
|
||||
|
||||
msgid "mm/s or %"
|
||||
msgstr "mm/s o. %"
|
||||
|
@ -7205,7 +7246,6 @@ msgstr ""
|
|||
msgid "Shrinkage"
|
||||
msgstr "Schrumpfung"
|
||||
|
||||
#, c-format, boost-format
|
||||
msgid ""
|
||||
"Enter the shrinkage percentage that the filament will get after cooling "
|
||||
"(94% if you measure 94mm instead of 100mm). The part will be scaled in xy to "
|
||||
|
@ -7213,11 +7253,12 @@ msgid ""
|
|||
"Be sure to allow enough space between objects, as this compensation is done "
|
||||
"after the checks."
|
||||
msgstr ""
|
||||
"Gib das Schrumpfungsprozent ein, das der Filament nach dem Abkühlen haben wird"
|
||||
"(94%, wenn du 94mm anstatt 100mm misst). Das Teil wird in der xy-Ebene skaliert, um zu"
|
||||
"kompensieren. Nur das Filament, das für den Umfang verwendet wird, wird berücksichtigt."
|
||||
"Stelle sicher, dass genügend Platz zwischen den Objekten vorhanden ist, da diese Kompensation "
|
||||
"nach den Überprüfungen durchgeführt wird."
|
||||
"Gib das Schrumpfungsprozent ein, das der Filament nach dem Abkühlen haben "
|
||||
"wird(94%, wenn du 94mm anstatt 100mm misst). Das Teil wird in der xy-Ebene "
|
||||
"skaliert, um zukompensieren. Nur das Filament, das für den Umfang verwendet "
|
||||
"wird, wird berücksichtigt.Stelle sicher, dass genügend Platz zwischen den "
|
||||
"Objekten vorhanden ist, da diese Kompensation nach den Überprüfungen "
|
||||
"durchgeführt wird."
|
||||
|
||||
msgid "Density"
|
||||
msgstr "Dichte"
|
||||
|
@ -7363,8 +7404,9 @@ msgid ""
|
|||
"Acceleration of bridges. If the value is expressed as a percentage (e.g. "
|
||||
"50%), it will be calculated based on the outer wall acceleration."
|
||||
msgstr ""
|
||||
"Beschleunigung der Brücken. Wenn der Wert als Prozentwert angegeben wird (z.B. "
|
||||
"50%), wird er auf der Grundlage der Beschleunigung der Außenwand berechnet."
|
||||
"Beschleunigung der Brücken. Wenn der Wert als Prozentwert angegeben wird (z."
|
||||
"B. 50%), wird er auf der Grundlage der Beschleunigung der Außenwand "
|
||||
"berechnet."
|
||||
|
||||
msgid "mm/s² or %"
|
||||
msgstr "mm/s² or %"
|
||||
|
@ -7373,15 +7415,18 @@ msgid ""
|
|||
"Acceleration of sparse infill. If the value is expressed as a percentage (e."
|
||||
"g. 100%), it will be calculated based on the default acceleration."
|
||||
msgstr ""
|
||||
"Beschleunigung der spärlichen Innenfüllung. Wenn der Wert als Prozentwert angegeben wird (z.B. "
|
||||
"100%), wird er auf der Grundlage der Standardbeschleunigung berechnet."
|
||||
"Beschleunigung der spärlichen Innenfüllung. Wenn der Wert als Prozentwert "
|
||||
"angegeben wird (z.B. 100%), wird er auf der Grundlage der "
|
||||
"Standardbeschleunigung berechnet."
|
||||
|
||||
msgid ""
|
||||
"Acceleration of internal solid infill. If the value is expressed as a "
|
||||
"percentage (e.g. 100%), it will be calculated based on the default "
|
||||
"acceleration."
|
||||
msgstr ""
|
||||
"Beschleunigung des internen massiven Innenfülls. Wenn der Wert als Prozentwert angegeben wird (z.B. 100%), wird er auf der Grundlage der Standardbeschleunigung berechnet."
|
||||
"Beschleunigung des internen massiven Innenfülls. Wenn der Wert als "
|
||||
"Prozentwert angegeben wird (z.B. 100%), wird er auf der Grundlage der "
|
||||
"Standardbeschleunigung berechnet."
|
||||
|
||||
msgid ""
|
||||
"Acceleration of initial layer. Using a lower value can improve build plate "
|
||||
|
@ -7604,7 +7649,11 @@ msgid ""
|
|||
"plugin. This settings is NOT compatible with Single Extruder Multi Material "
|
||||
"setup and Wipe into Object / Wipe into Infill."
|
||||
msgstr ""
|
||||
"Aktivieren Sie diese Option, um Kommentare in den G-Code einzufügen, die die Druckbewegungen mit dem zugehörigen Objekt kennzeichnen. Dies ist nützlich für das Octoprint CancelObject-Plugin. Diese Einstellung ist NICHT kompatibel mit der Einzeldruckerdüsen-Mehrmaterial-Konfiguration und mit der Option zum Wischen in das Objekt / in den Innenfüllbereich."
|
||||
"Aktivieren Sie diese Option, um Kommentare in den G-Code einzufügen, die die "
|
||||
"Druckbewegungen mit dem zugehörigen Objekt kennzeichnen. Dies ist nützlich "
|
||||
"für das Octoprint CancelObject-Plugin. Diese Einstellung ist NICHT "
|
||||
"kompatibel mit der Einzeldruckerdüsen-Mehrmaterial-Konfiguration und mit der "
|
||||
"Option zum Wischen in das Objekt / in den Innenfüllbereich."
|
||||
|
||||
msgid "Verbose G-code"
|
||||
msgstr "ausführlicher G-Code"
|
||||
|
@ -7614,7 +7663,10 @@ msgid ""
|
|||
"descriptive text. If you print from SD card, the additional weight of the "
|
||||
"file could make your firmware slow down."
|
||||
msgstr ""
|
||||
"Aktivieren Sie diese Option, um eine kommentierte G-Code-Datei zu erhalten, in der jede Zeile durch einen beschreibenden Text erklärt wird. Wenn Sie von der SD-Karte drucken, kann das zusätzliche Gewicht der Datei dazu führen, dass Ihre Firmware langsamer wird."
|
||||
"Aktivieren Sie diese Option, um eine kommentierte G-Code-Datei zu erhalten, "
|
||||
"in der jede Zeile durch einen beschreibenden Text erklärt wird. Wenn Sie von "
|
||||
"der SD-Karte drucken, kann das zusätzliche Gewicht der Datei dazu führen, "
|
||||
"dass Ihre Firmware langsamer wird."
|
||||
|
||||
msgid "Infill combination"
|
||||
msgstr "Füllungskombination"
|
||||
|
@ -7913,8 +7965,7 @@ msgid "Start end points"
|
|||
msgstr "Start- und Endpunkte"
|
||||
|
||||
msgid "The start and end points which is from cutter area to garbage can."
|
||||
msgstr ""
|
||||
"Die Start- und Endpunkte, die vom Schneidbereich zur Mülltonne führen."
|
||||
msgstr "Die Start- und Endpunkte, die vom Schneidbereich zur Mülltonne führen."
|
||||
|
||||
msgid "Reduce infill retraction"
|
||||
msgstr "Rückzug bei der Füllung verringern"
|
||||
|
@ -7976,7 +8027,8 @@ msgid "Raft contact Z distance"
|
|||
msgstr "Z Abstand Objekt Druckbasis "
|
||||
|
||||
msgid "Z gap between object and raft. Ignored for soluble interface"
|
||||
msgstr "Z-Abstand zwischen Objekt und Druckbasis. Bei löslicher Oberfläche ignoriert"
|
||||
msgstr ""
|
||||
"Z-Abstand zwischen Objekt und Druckbasis. Bei löslicher Oberfläche ignoriert"
|
||||
|
||||
msgid "Raft expansion"
|
||||
msgstr "Druckbasis Erweiterung"
|
||||
|
@ -7995,8 +8047,8 @@ msgstr "Ausdehnung der ersten Schicht"
|
|||
|
||||
msgid "Expand the first raft or support layer to improve bed plate adhesion"
|
||||
msgstr ""
|
||||
"Ausdehnung der ersten Druckbasis oder Support-Schicht um die Druckplattenhaftung "
|
||||
"zu verbessern"
|
||||
"Ausdehnung der ersten Druckbasis oder Support-Schicht um die "
|
||||
"Druckplattenhaftung zu verbessern"
|
||||
|
||||
msgid "Raft layers"
|
||||
msgstr "Druckbasisschichten"
|
||||
|
@ -8070,9 +8122,6 @@ msgstr ""
|
|||
msgid "Z Hop Type"
|
||||
msgstr "Z Hop Type"
|
||||
|
||||
msgid "select the type of Z Hop in the Slicer"
|
||||
msgstr "Wähle den Typ des Z Hops im Slicer aus."
|
||||
|
||||
msgid "Z hop type"
|
||||
msgstr "Z-Hub Typ"
|
||||
|
||||
|
@ -8404,9 +8453,9 @@ msgid ""
|
|||
"Filament to print support base and raft. \"Default\" means no specific "
|
||||
"filament for support and current filament is used"
|
||||
msgstr ""
|
||||
"Filament zum Drucken der Unterstützungsbasis und der Druckbasis. "
|
||||
"„Standard“ bedeutet, dass kein bestimmtes Filament für die Unterstützung "
|
||||
"verwendet wird und das aktuelle Filament verwendet wird"
|
||||
"Filament zum Drucken der Unterstützungsbasis und der Druckbasis. „Standard“ "
|
||||
"bedeutet, dass kein bestimmtes Filament für die Unterstützung verwendet wird "
|
||||
"und das aktuelle Filament verwendet wird"
|
||||
|
||||
msgid "Line width of support"
|
||||
msgstr "Linienbreite des Support"
|
||||
|
@ -8575,7 +8624,8 @@ msgid ""
|
|||
"Enabling this option means the height of tree support layer except the "
|
||||
"first will be automatically calculated "
|
||||
msgstr ""
|
||||
"Wenn Sie diese Option aktivieren, wird die Höhe der Baumstützschicht außer der ersten automatisch berechnet."
|
||||
"Wenn Sie diese Option aktivieren, wird die Höhe der Baumstützschicht außer "
|
||||
"der ersten automatisch berechnet."
|
||||
|
||||
msgid "Auto brim width"
|
||||
msgstr "Automatische Randbreite"
|
||||
|
@ -8960,7 +9010,7 @@ msgstr "Ungültiger Wert"
|
|||
|
||||
#, c-format, boost-format
|
||||
msgid " doesn't work at 100%% density "
|
||||
msgstr " doesn't work at 100%% density "
|
||||
msgstr " doesn't work at 100%% density "
|
||||
|
||||
msgid "Invalid value when spiral vase mode is enabled: "
|
||||
msgstr "Ungültiger Wert, wenn der Spiral-Vase-Modus aktiviert ist: "
|
||||
|
@ -9062,7 +9112,9 @@ msgid ""
|
|||
"maintaining different profiles or including configurations from a network "
|
||||
"storage."
|
||||
msgstr ""
|
||||
"Laden und Speichern von Einstellungen im angegebenen Verzeichnis. Dies ist nützlich, um verschiedene Profile beizubehalten oder Konfigurationen aus einem Netzwerkspeicher einzubeziehen."
|
||||
"Laden und Speichern von Einstellungen im angegebenen Verzeichnis. Dies ist "
|
||||
"nützlich, um verschiedene Profile beizubehalten oder Konfigurationen aus "
|
||||
"einem Netzwerkspeicher einzubeziehen."
|
||||
|
||||
msgid "Output directory"
|
||||
msgstr "Ausgabeverzeichnis"
|
||||
|
@ -9134,14 +9186,17 @@ msgid ""
|
|||
"No layers were detected. You might want to repair your STL file(s) or check "
|
||||
"their size or thickness and retry.\n"
|
||||
msgstr ""
|
||||
"Es wurden keine Schichten erkannt. Möglicherweise möchten Sie Ihre STL-Datei(en) reparieren oder ihre Größe oder Dicke überprüfen und es erneut versuchen.\n"
|
||||
"Es wurden keine Schichten erkannt. Möglicherweise möchten Sie Ihre STL-"
|
||||
"Datei(en) reparieren oder ihre Größe oder Dicke überprüfen und es erneut "
|
||||
"versuchen.\n"
|
||||
|
||||
msgid ""
|
||||
"An object's XY size compensation will not be used because it is also color-"
|
||||
"painted.\n"
|
||||
"XY Size compensation can not be combined with color-painting."
|
||||
msgstr ""
|
||||
"Die XY-Größenkompensation eines Objekts wird nicht verwendet, da es auch farblich lackiert wurde.\n"
|
||||
"Die XY-Größenkompensation eines Objekts wird nicht verwendet, da es auch "
|
||||
"farblich lackiert wurde.\n"
|
||||
"Die XY-Größenkompensation kann nicht mit Farbmalerei kombiniert werden."
|
||||
|
||||
#, c-format, boost-format
|
||||
|
@ -9347,8 +9402,7 @@ msgid ""
|
|||
msgstr ""
|
||||
"Auto-Arrange\n"
|
||||
"Wussten Sie, dass Sie alle Objekte in Ihrem Projekt automatisch anordnen "
|
||||
"können?"
|
||||
"können?"
|
||||
"können?können?"
|
||||
|
||||
#: resources/data/hints.ini: [hint:Auto-Orient]
|
||||
msgid ""
|
||||
|
@ -9574,10 +9628,12 @@ msgstr ""
|
|||
"Wussten Sie, dass Sie mehr Wandschlaufen und eine höhere spärliche "
|
||||
"Fülldichte verwenden können, um die Festigkeit des Modells zu verbessern?"
|
||||
|
||||
#~ msgid "select the type of Z Hop in the Slicer"
|
||||
#~ msgstr "Wähle den Typ des Z Hops im Slicer aus."
|
||||
|
||||
#~ msgid "SoftFever Version"
|
||||
#~ msgstr "SoftFever Version"
|
||||
|
||||
|
||||
#~ msgid "Loading user presets..."
|
||||
#~ msgstr "Nutzervoreinstellungen laden..."
|
||||
|
||||
|
|
Binary file not shown.
|
@ -249,6 +249,7 @@ static constexpr const char* OBJECT_ID_ATTR = "object_id";
|
|||
static constexpr const char* INSTANCEID_ATTR = "instance_id";
|
||||
static constexpr const char* ARRANGE_ORDER_ATTR = "arrange_order";
|
||||
static constexpr const char* PLATERID_ATTR = "plater_id";
|
||||
static constexpr const char* PLATER_NAME_ATTR = "plater_name";
|
||||
static constexpr const char* PLATE_IDX_ATTR = "index";
|
||||
static constexpr const char* SLICE_PREDICTION_ATTR = "prediction";
|
||||
static constexpr const char* SLICE_WEIGHT_ATTR = "weight";
|
||||
|
@ -1765,6 +1766,7 @@ void PlateData::parse_filament_info(GCodeProcessorResult *result)
|
|||
}
|
||||
plate_data_list[it->first-1]->locked = it->second->locked;
|
||||
plate_data_list[it->first-1]->plate_index = it->second->plate_index-1;
|
||||
plate_data_list[it->first-1]->plate_name = it->second->plate_name;
|
||||
plate_data_list[it->first-1]->obj_inst_map = it->second->obj_inst_map;
|
||||
plate_data_list[it->first-1]->gcode_file = (m_load_restore || it->second->gcode_file.empty()) ? it->second->gcode_file : m_backup_path + "/" + it->second->gcode_file;
|
||||
plate_data_list[it->first-1]->gcode_prediction = it->second->gcode_prediction;
|
||||
|
@ -3467,6 +3469,10 @@ void PlateData::parse_filament_info(GCodeProcessorResult *result)
|
|||
{
|
||||
m_curr_plater->plate_index = atoi(value.c_str());
|
||||
}
|
||||
else if(key == PLATER_NAME_ATTR)
|
||||
{
|
||||
m_curr_plater->plate_name = value;
|
||||
}
|
||||
else if (key == LOCK_ATTR)
|
||||
{
|
||||
std::istringstream(value) >> std::boolalpha >> m_curr_plater->locked;
|
||||
|
@ -6431,6 +6437,7 @@ void PlateData::parse_filament_info(GCodeProcessorResult *result)
|
|||
stream << " <" << PLATE_TAG << ">\n";
|
||||
//plate index
|
||||
stream << " <" << METADATA_TAG << " " << KEY_ATTR << "=\"" << PLATERID_ATTR << "\" " << VALUE_ATTR << "=\"" << plate_data->plate_index + 1 << "\"/>\n";
|
||||
stream << " <" << METADATA_TAG << " " << KEY_ATTR << "=\"" << PLATER_NAME_ATTR << "\" " << VALUE_ATTR << "=\"" << plate_data->plate_name << "\"/>\n";
|
||||
stream << " <" << METADATA_TAG << " " << KEY_ATTR << "=\"" << LOCK_ATTR << "\" " << VALUE_ATTR << "=\"" << std::boolalpha<< plate_data->locked<< "\"/>\n";
|
||||
ConfigOption* bed_type_opt = plate_data->config.option("curr_bed_type");
|
||||
t_config_enum_names bed_type_names = ConfigOptionEnum<BedType>::get_enum_names();
|
||||
|
|
|
@ -70,6 +70,7 @@ struct PlateData
|
|||
std::string pattern_bbox_file;
|
||||
std::string gcode_prediction;
|
||||
std::string gcode_weight;
|
||||
std::string plate_name;
|
||||
std::vector<FilamentInfo> slice_filaments_info;
|
||||
DynamicPrintConfig config;
|
||||
bool is_support_used {false};
|
||||
|
|
|
@ -1758,6 +1758,7 @@ void GCode::_do_export(Print& print, GCodeOutputStream &file, ThumbnailsGenerato
|
|||
m_placeholder_parser.set("first_layer_temperature", new ConfigOptionInts(m_config.nozzle_temperature_initial_layer));
|
||||
m_placeholder_parser.set("max_print_height",new ConfigOptionInt(m_config.printable_height));
|
||||
m_placeholder_parser.set("z_offset", new ConfigOptionFloat(0.0f));
|
||||
m_placeholder_parser.set("plate_name", new ConfigOptionString(print.get_plate_name()));
|
||||
|
||||
//BBS: calculate the volumetric speed of outer wall. Ignore pre-object setting and multi-filament, and just use the default setting
|
||||
{
|
||||
|
|
|
@ -2152,6 +2152,8 @@ std::string Print::output_filename(const std::string &filename_base) const
|
|||
// These values will be just propagated into the output file name.
|
||||
DynamicConfig config = this->finished() ? this->print_statistics().config() : this->print_statistics().placeholders();
|
||||
config.set_key_value("num_filaments", new ConfigOptionInt((int)m_config.nozzle_diameter.size()));
|
||||
config.set_key_value("plate_name", new ConfigOptionString(get_plate_name()));
|
||||
|
||||
return this->PrintBase::output_filename(m_config.filename_format.value, ".gcode", filename_base, &config);
|
||||
}
|
||||
|
||||
|
|
|
@ -511,6 +511,9 @@ public:
|
|||
int get_plate_index() const { return m_plate_index; }
|
||||
void set_plate_index(int index) { m_plate_index = index; }
|
||||
|
||||
//SoftFever plate name
|
||||
std::string get_plate_name() const { return m_plate_name; }
|
||||
void set_plate_name(const std::string& name) { m_plate_name = name; }
|
||||
protected:
|
||||
friend class PrintObjectBase;
|
||||
friend class BackgroundSlicingProcess;
|
||||
|
@ -545,6 +548,9 @@ protected:
|
|||
//BBS: add plate id into print base
|
||||
int m_plate_index{ 0 };
|
||||
|
||||
// SoftFever: current plate name
|
||||
std::string m_plate_name;
|
||||
|
||||
// Callback to be evoked regularly to update state of the UI thread.
|
||||
status_callback_type m_status_callback;
|
||||
|
||||
|
|
|
@ -516,11 +516,9 @@ bool GLTexture::generate_from_text(const std::string &text_str, wxFont &font, wx
|
|||
// prepare buffer
|
||||
std::vector<unsigned char> data(4 * m_width * m_height, 0);
|
||||
const unsigned char* src = image.GetData();
|
||||
/* for debug use
|
||||
std::ofstream fout;
|
||||
fout.open(text_str+std::to_string(m_width)+"_"+std::to_string(m_height)+".rgb", std::ios::out);
|
||||
fout.write((const char*)src, 3 * m_width * m_height);
|
||||
fout.close();*/
|
||||
//for debug use
|
||||
//image.SaveFile(text_str+"_test.png", wxBITMAP_TYPE_PNG);
|
||||
|
||||
for (int h = 0; h < m_height; ++h) {
|
||||
unsigned char* dst = data.data() + 4 * h * m_width;
|
||||
for (int w = 0; w < m_width; ++w) {
|
||||
|
|
|
@ -74,7 +74,44 @@ std::array<float, 4> PartPlate::LINE_BOTTOM_COLOR = { 0.8f, 0.8f, 0.8f, 0.4f };
|
|||
std::array<float, 4> PartPlate::HEIGHT_LIMIT_TOP_COLOR = { 0.6f, 0.6f, 1.0f, 1.0f };
|
||||
std::array<float, 4> PartPlate::HEIGHT_LIMIT_BOTTOM_COLOR = { 0.4f, 0.4f, 1.0f, 1.0f };
|
||||
|
||||
// get text extent with wxMemoryDC
|
||||
void get_text_extent(const wxString &msg, wxCoord &w, wxCoord &h, wxFont *font)
|
||||
{
|
||||
wxMemoryDC memDC;
|
||||
if (font)
|
||||
memDC.SetFont(*font);
|
||||
memDC.GetTextExtent(msg, &w, &h);
|
||||
}
|
||||
|
||||
|
||||
wxFont* find_font(const std::string& text_str, int max_size = 32)
|
||||
{
|
||||
auto is_font_suitable = [](std::string str, wxFont &font, int max_size) {
|
||||
wxString msg(str);
|
||||
wxCoord w, h;
|
||||
get_text_extent(msg, w, h, &font);
|
||||
|
||||
if (w <= max_size)
|
||||
return true;
|
||||
else
|
||||
return false;
|
||||
};
|
||||
wxFont *font = nullptr;
|
||||
if (is_font_suitable(text_str, Label::Head_24, max_size))
|
||||
font = &Label::Head_24;
|
||||
else if (is_font_suitable(text_str, Label::Head_20, max_size))
|
||||
font = &Label::Head_20;
|
||||
else if (is_font_suitable(text_str, Label::Head_18, max_size))
|
||||
font = &Label::Head_18;
|
||||
else if (is_font_suitable(text_str, Label::Head_16, max_size))
|
||||
font = &Label::Head_16;
|
||||
else if (is_font_suitable(text_str, Label::Head_14, max_size))
|
||||
font = &Label::Head_14;
|
||||
else
|
||||
font = &Label::Head_12;
|
||||
|
||||
return font;
|
||||
}
|
||||
void PartPlate::update_render_colors()
|
||||
{
|
||||
PartPlate::SELECT_COLOR = GLColor(RenderColor::colors[RenderCol_Plate_Selected]);
|
||||
|
@ -131,6 +168,7 @@ void PartPlate::init()
|
|||
|
||||
m_print_index = -1;
|
||||
m_print = nullptr;
|
||||
m_plate_name_vbo_id = 0;
|
||||
}
|
||||
|
||||
BedType PartPlate::get_bed_type() const
|
||||
|
@ -744,8 +782,33 @@ void PartPlate::render_icon_texture(int position_id, int tex_coords_id, const Ge
|
|||
glsafe(::glBindBuffer(GL_ARRAY_BUFFER, 0));
|
||||
glsafe(::glBindTexture(GL_TEXTURE_2D, 0));
|
||||
}
|
||||
void PartPlate::render_plate_name_texture(int position_id, int tex_coords_id)
|
||||
{
|
||||
if (m_name_texture.get_id() == 0)
|
||||
generate_plate_name_texture();
|
||||
|
||||
void PartPlate::render_icons(bool bottom, int hover_id) const
|
||||
if (m_plate_name_vbo_id == 0 && m_plate_name_icon.get_vertices_data_size() > 0) {
|
||||
glsafe(::glGenBuffers(1, &m_plate_name_vbo_id));
|
||||
glsafe(::glBindBuffer(GL_ARRAY_BUFFER, m_plate_name_vbo_id));
|
||||
glsafe(::glBufferData(GL_ARRAY_BUFFER, (GLsizeiptr)m_plate_name_icon.get_vertices_data_size(), (const GLvoid*)m_plate_name_icon.get_vertices_data(), GL_STATIC_DRAW));
|
||||
glsafe(::glBindBuffer(GL_ARRAY_BUFFER, 0));
|
||||
}
|
||||
|
||||
unsigned int stride = m_plate_name_icon.get_vertex_data_size();
|
||||
GLuint tex_id = (GLuint)m_name_texture.get_id();
|
||||
glsafe(::glBindTexture(GL_TEXTURE_2D, tex_id));
|
||||
glsafe(::glBindBuffer(GL_ARRAY_BUFFER, m_plate_name_vbo_id));
|
||||
if (position_id != -1)
|
||||
glsafe(::glVertexAttribPointer(position_id, 3, GL_FLOAT, GL_FALSE, stride, (GLvoid*)(intptr_t)m_plate_name_icon.get_position_offset()));
|
||||
if (tex_coords_id != -1)
|
||||
glsafe(::glVertexAttribPointer(tex_coords_id, 2, GL_FLOAT, GL_FALSE, stride, (GLvoid*)(intptr_t)m_plate_name_icon.get_tex_coords_offset()));
|
||||
glsafe(::glDrawArrays(GL_TRIANGLES, 0, (GLsizei)m_plate_name_icon.get_vertices_count()));
|
||||
|
||||
glsafe(::glBindBuffer(GL_ARRAY_BUFFER, 0));
|
||||
glsafe(::glBindTexture(GL_TEXTURE_2D, 0));
|
||||
}
|
||||
|
||||
void PartPlate::render_icons(bool bottom, bool only_name, int hover_id)
|
||||
{
|
||||
GLShaderProgram* shader = wxGetApp().get_shader("printbed");
|
||||
if (shader != nullptr) {
|
||||
|
@ -766,54 +829,69 @@ void PartPlate::render_icons(bool bottom, int hover_id) const
|
|||
if (tex_coords_id != -1) {
|
||||
glsafe(::glEnableVertexAttribArray(tex_coords_id));
|
||||
}
|
||||
|
||||
if (hover_id == 1)
|
||||
render_icon_texture(position_id, tex_coords_id, m_del_icon, m_partplate_list->m_del_hovered_texture, m_del_vbo_id);
|
||||
else
|
||||
render_icon_texture(position_id, tex_coords_id, m_del_icon, m_partplate_list->m_del_texture, m_del_vbo_id);
|
||||
|
||||
if (hover_id == 2)
|
||||
render_icon_texture(position_id, tex_coords_id, m_orient_icon, m_partplate_list->m_orient_hovered_texture, m_orient_vbo_id);
|
||||
else
|
||||
render_icon_texture(position_id, tex_coords_id, m_orient_icon, m_partplate_list->m_orient_texture, m_orient_vbo_id);
|
||||
|
||||
if (hover_id == 3)
|
||||
render_icon_texture(position_id, tex_coords_id, m_arrange_icon, m_partplate_list->m_arrange_hovered_texture, m_arrange_vbo_id);
|
||||
else
|
||||
render_icon_texture(position_id, tex_coords_id, m_arrange_icon, m_partplate_list->m_arrange_texture, m_arrange_vbo_id);
|
||||
|
||||
if (hover_id == 4) {
|
||||
if (this->is_locked())
|
||||
render_icon_texture(position_id, tex_coords_id, m_lock_icon, m_partplate_list->m_locked_hovered_texture, m_lock_vbo_id);
|
||||
if (!only_name) {
|
||||
if (hover_id == 1)
|
||||
render_icon_texture(position_id, tex_coords_id, m_del_icon, m_partplate_list->m_del_hovered_texture,
|
||||
m_del_vbo_id);
|
||||
else
|
||||
render_icon_texture(position_id, tex_coords_id, m_lock_icon, m_partplate_list->m_lockopen_hovered_texture, m_lock_vbo_id);
|
||||
}
|
||||
else {
|
||||
if (this->is_locked())
|
||||
render_icon_texture(position_id, tex_coords_id, m_lock_icon, m_partplate_list->m_locked_texture, m_lock_vbo_id);
|
||||
else
|
||||
render_icon_texture(position_id, tex_coords_id, m_lock_icon, m_partplate_list->m_lockopen_texture, m_lock_vbo_id);
|
||||
}
|
||||
render_icon_texture(position_id, tex_coords_id, m_del_icon, m_partplate_list->m_del_texture,
|
||||
m_del_vbo_id);
|
||||
|
||||
if (m_partplate_list->render_plate_settings) {
|
||||
if (hover_id == 5) {
|
||||
if (get_bed_type() == BedType::btDefault && get_print_seq() == PrintSequence::ByDefault)
|
||||
render_icon_texture(position_id, tex_coords_id, m_plate_settings_icon, m_partplate_list->m_plate_settings_hovered_texture, m_plate_settings_vbo_id);
|
||||
if (hover_id == 2)
|
||||
render_icon_texture(position_id, tex_coords_id, m_orient_icon,
|
||||
m_partplate_list->m_orient_hovered_texture, m_orient_vbo_id);
|
||||
else
|
||||
render_icon_texture(position_id, tex_coords_id, m_orient_icon, m_partplate_list->m_orient_texture,
|
||||
m_orient_vbo_id);
|
||||
|
||||
if (hover_id == 3)
|
||||
render_icon_texture(position_id, tex_coords_id, m_arrange_icon,
|
||||
m_partplate_list->m_arrange_hovered_texture, m_arrange_vbo_id);
|
||||
else
|
||||
render_icon_texture(position_id, tex_coords_id, m_arrange_icon, m_partplate_list->m_arrange_texture,
|
||||
m_arrange_vbo_id);
|
||||
|
||||
if (hover_id == 4) {
|
||||
if (this->is_locked())
|
||||
render_icon_texture(position_id, tex_coords_id, m_lock_icon,
|
||||
m_partplate_list->m_locked_hovered_texture, m_lock_vbo_id);
|
||||
else
|
||||
render_icon_texture(position_id, tex_coords_id, m_plate_settings_icon, m_partplate_list->m_plate_settings_changed_hovered_texture, m_plate_settings_vbo_id);
|
||||
render_icon_texture(position_id, tex_coords_id, m_lock_icon,
|
||||
m_partplate_list->m_lockopen_hovered_texture, m_lock_vbo_id);
|
||||
} else {
|
||||
if (this->is_locked())
|
||||
render_icon_texture(position_id, tex_coords_id, m_lock_icon, m_partplate_list->m_locked_texture,
|
||||
m_lock_vbo_id);
|
||||
else
|
||||
render_icon_texture(position_id, tex_coords_id, m_lock_icon, m_partplate_list->m_lockopen_texture,
|
||||
m_lock_vbo_id);
|
||||
}
|
||||
else {
|
||||
if (get_bed_type() == BedType::btDefault && get_print_seq() == PrintSequence::ByDefault)
|
||||
render_icon_texture(position_id, tex_coords_id, m_plate_settings_icon, m_partplate_list->m_plate_settings_texture, m_plate_settings_vbo_id);
|
||||
else
|
||||
render_icon_texture(position_id, tex_coords_id, m_plate_settings_icon, m_partplate_list->m_plate_settings_changed_texture, m_plate_settings_vbo_id);
|
||||
|
||||
if (m_partplate_list->render_plate_settings) {
|
||||
if (hover_id == 5) {
|
||||
if (get_bed_type() == BedType::btDefault && get_print_seq() == PrintSequence::ByDefault)
|
||||
render_icon_texture(position_id, tex_coords_id, m_plate_settings_icon,
|
||||
m_partplate_list->m_plate_settings_hovered_texture, m_plate_settings_vbo_id);
|
||||
else
|
||||
render_icon_texture(position_id, tex_coords_id, m_plate_settings_icon,
|
||||
m_partplate_list->m_plate_settings_changed_hovered_texture,
|
||||
m_plate_settings_vbo_id);
|
||||
} else {
|
||||
if (get_bed_type() == BedType::btDefault && get_print_seq() == PrintSequence::ByDefault)
|
||||
render_icon_texture(position_id, tex_coords_id, m_plate_settings_icon,
|
||||
m_partplate_list->m_plate_settings_texture, m_plate_settings_vbo_id);
|
||||
else
|
||||
render_icon_texture(position_id, tex_coords_id, m_plate_settings_icon,
|
||||
m_partplate_list->m_plate_settings_changed_texture, m_plate_settings_vbo_id);
|
||||
}
|
||||
}
|
||||
|
||||
if (m_plate_index >= 0 && m_plate_index < MAX_PLATE_COUNT) {
|
||||
render_icon_texture(position_id, tex_coords_id, m_plate_idx_icon,
|
||||
m_partplate_list->m_idx_textures[m_plate_index], m_plate_idx_vbo_id);
|
||||
}
|
||||
}
|
||||
|
||||
if (m_plate_index >=0 && m_plate_index < MAX_PLATE_COUNT) {
|
||||
render_icon_texture(position_id, tex_coords_id, m_plate_idx_icon, m_partplate_list->m_idx_textures[m_plate_index], m_plate_idx_vbo_id);
|
||||
}
|
||||
|
||||
render_plate_name_texture(position_id, tex_coords_id);
|
||||
if (tex_coords_id != -1)
|
||||
glsafe(::glDisableVertexAttribArray(tex_coords_id));
|
||||
|
||||
|
@ -1190,6 +1268,10 @@ void PartPlate::release_opengl_resource()
|
|||
glsafe(::glDeleteBuffers(1, &m_plate_idx_vbo_id));
|
||||
m_plate_idx_vbo_id = 0;
|
||||
}
|
||||
if (m_plate_name_vbo_id > 0) {
|
||||
glsafe(::glDeleteBuffers(1, &m_plate_name_vbo_id));
|
||||
m_plate_name_vbo_id = 0;
|
||||
}
|
||||
}
|
||||
|
||||
std::vector<int> PartPlate::get_extruders(bool conside_custom_gcode) const
|
||||
|
@ -1385,7 +1467,7 @@ void PartPlate::clear(bool clear_sliced_result)
|
|||
m_ready_for_slice = true;
|
||||
update_slice_result_valid_state(false);
|
||||
}
|
||||
|
||||
m_name_texture.reset();
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -1473,6 +1555,50 @@ Vec3d PartPlate::get_center_origin()
|
|||
return origin;
|
||||
}
|
||||
|
||||
void PartPlate::generate_plate_name_texture()
|
||||
{
|
||||
// generate m_name_texture texture from m_name with generate_from_text_string
|
||||
m_name_texture.reset();
|
||||
auto text = m_name.empty()? _L("Untitled") : m_name;
|
||||
wxCoord w, h;
|
||||
auto* font = &Label::Head_48;
|
||||
wxColour foreground(0x0, 0x96, 0x88, 0xff);
|
||||
if (!m_name_texture.generate_from_text_string(text.ToStdString(), *font, *wxBLACK, foreground))
|
||||
BOOST_LOG_TRIVIAL(error) << "PartPlate::generate_plate_name_texture(): generate_from_text_string() failed";
|
||||
auto bed_ext = get_extents(m_shape);
|
||||
auto factor = bed_ext.size()(1) / 200.0;
|
||||
ExPolygon poly;
|
||||
float offset_x = 1;
|
||||
w = int(factor * (m_name_texture.get_width() * 16) / m_name_texture.get_height());
|
||||
h = int(factor * 16);
|
||||
Vec2d p = m_shape[3] + Vec2d(0, h*0.6);
|
||||
poly.contour.append({ scale_(p(0) + PARTPLATE_ICON_GAP_LEFT + offset_x), scale_(p(1) - h + PARTPLATE_TEXT_OFFSET_Y) });
|
||||
poly.contour.append({ scale_(p(0) + PARTPLATE_ICON_GAP_LEFT + w - offset_x), scale_(p(1) - h + PARTPLATE_TEXT_OFFSET_Y) });
|
||||
poly.contour.append({ scale_(p(0) + PARTPLATE_ICON_GAP_LEFT + w - offset_x), scale_(p(1) - PARTPLATE_TEXT_OFFSET_Y)});
|
||||
poly.contour.append({ scale_(p(0) + PARTPLATE_ICON_GAP_LEFT + offset_x), scale_(p(1) - PARTPLATE_TEXT_OFFSET_Y) });
|
||||
|
||||
auto triangles = triangulate_expolygon_2f(poly, NORMALS_UP);
|
||||
if (!m_plate_name_icon.set_from_triangles(triangles, GROUND_Z))
|
||||
BOOST_LOG_TRIVIAL(error) << __FUNCTION__ << "Unable to generate geometry buffers for icons\n";
|
||||
|
||||
if (m_plate_name_vbo_id > 0) {
|
||||
glsafe(::glDeleteBuffers(1, &m_plate_name_vbo_id));
|
||||
m_plate_name_vbo_id = 0;
|
||||
}
|
||||
}
|
||||
void PartPlate::set_plate_name(const std::string& name)
|
||||
{
|
||||
// compare if name equal to m_name, case sensitive
|
||||
if (boost::equals(m_name, name))
|
||||
return;
|
||||
|
||||
m_name = name;
|
||||
if (m_print != nullptr)
|
||||
m_print->set_plate_name(name);
|
||||
|
||||
generate_plate_name_texture();
|
||||
}
|
||||
|
||||
//get the print's object, result and index
|
||||
void PartPlate::get_print(PrintBase** print, GCodeResult** result, int* index)
|
||||
{
|
||||
|
@ -2100,6 +2226,8 @@ bool PartPlate::set_shape(const Pointfs& shape, const Pointfs& exclude_areas, Ve
|
|||
calc_vertex_for_icons(4, m_plate_settings_icon);
|
||||
//calc_vertex_for_number(0, (m_plate_index < 9), m_plate_idx_icon);
|
||||
calc_vertex_for_number(0, false, m_plate_idx_icon);
|
||||
// calc vertex for plate name
|
||||
generate_plate_name_texture();
|
||||
}
|
||||
|
||||
calc_height_limit();
|
||||
|
@ -2172,35 +2300,8 @@ void PartPlate::render(bool bottom, bool only_body, bool force_background_color,
|
|||
|
||||
render_height_limit(mode);
|
||||
|
||||
if (!only_body) {
|
||||
/*float render_color[4];
|
||||
::memcpy((void*)m_grabber_color, (const void*)DEFAULT_HIGHLIGHT_COLOR, 4 * sizeof(float));
|
||||
|
||||
render_color[0] = 1.0f - m_grabber_color[0];
|
||||
render_color[1] = 1.0f - m_grabber_color[1];
|
||||
render_color[2] = 1.0f - m_grabber_color[2];
|
||||
render_color[3] = m_grabber_color[3];
|
||||
|
||||
|
||||
if (m_hover_id == 0)
|
||||
render_grabber(m_grabber_color, true);
|
||||
else
|
||||
render_grabber(render_color, true);
|
||||
|
||||
if (m_selected) {
|
||||
if (m_hover_id == 1)
|
||||
render_left_arrow(m_grabber_color, true);
|
||||
else
|
||||
render_left_arrow(render_color, true);
|
||||
|
||||
if (m_hover_id == 2)
|
||||
render_right_arrow(m_grabber_color, true);
|
||||
else
|
||||
render_right_arrow(render_color, true);
|
||||
}*/
|
||||
render_icons(bottom, hover_id);
|
||||
}
|
||||
else if (!force_background_color){
|
||||
render_icons(bottom, only_body, hover_id);
|
||||
if (!force_background_color){
|
||||
render_only_numbers(bottom);
|
||||
}
|
||||
glsafe(::glDisableClientState(GL_VERTEX_ARRAY));
|
||||
|
@ -2666,32 +2767,9 @@ void PartPlateList::generate_icon_textures()
|
|||
}
|
||||
}
|
||||
|
||||
auto is_font_suitable = [](std::string text_str, wxFont& font, int max_size) {
|
||||
wxMemoryDC memDC;
|
||||
wxCoord w, h;
|
||||
wxString msg(text_str);
|
||||
memDC.SetFont(font);
|
||||
memDC.GetMultiLineTextExtent(msg, &w, &h);
|
||||
if (w <= max_size)
|
||||
return true;
|
||||
else
|
||||
return false;;
|
||||
};
|
||||
wxFont* font = nullptr;
|
||||
|
||||
std::string text_str = "01";
|
||||
int max_size = 32;
|
||||
if (is_font_suitable(text_str, Label::Head_24, max_size))
|
||||
font = &Label::Head_24;
|
||||
else if (is_font_suitable(text_str, Label::Head_20, max_size))
|
||||
font = &Label::Head_20;
|
||||
else if (is_font_suitable(text_str, Label::Head_18, max_size))
|
||||
font = &Label::Head_18;
|
||||
else if (is_font_suitable(text_str, Label::Head_16, max_size))
|
||||
font = &Label::Head_16;
|
||||
else if (is_font_suitable(text_str, Label::Head_14, max_size))
|
||||
font = &Label::Head_14;
|
||||
else
|
||||
font = &Label::Head_12;
|
||||
wxFont* font = find_font(text_str,32);
|
||||
|
||||
for (int i = 0; i < MAX_PLATE_COUNT; i++) {
|
||||
if (m_idx_textures[i].get_id() == 0) {
|
||||
|
@ -2701,7 +2779,7 @@ void PartPlateList::generate_icon_textures()
|
|||
else
|
||||
file_name = std::to_string(i+1);
|
||||
|
||||
wxColour foreground(0x0, 0xae, 0x42, 0xff);
|
||||
wxColour foreground(0x0, 0x96, 0x88, 0xff);
|
||||
if (!m_idx_textures[i].generate_from_text_string(file_name, *font, *wxBLACK, foreground)) {
|
||||
BOOST_LOG_TRIVIAL(error) << __FUNCTION__ << boost::format(":load file %1% failed") % file_name;
|
||||
}
|
||||
|
@ -4409,6 +4487,7 @@ int PartPlateList::store_to_3mf_structure(PlateDataPtrs& plate_data_list, bool w
|
|||
PlateData* plate_data_item = new PlateData();
|
||||
plate_data_item->locked = m_plate_list[i]->m_locked;
|
||||
plate_data_item->plate_index = m_plate_list[i]->m_plate_index;
|
||||
plate_data_item->plate_name = m_plate_list[i]->get_plate_name();
|
||||
BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << boost::format(": plate %1% before load, width %2%, height %3%, size %4%!")
|
||||
%(i+1) %m_plate_list[i]->thumbnail_data.width %m_plate_list[i]->thumbnail_data.height %m_plate_list[i]->thumbnail_data.pixels.size();
|
||||
plate_data_item->plate_thumbnail.load_from(m_plate_list[i]->thumbnail_data);
|
||||
|
@ -4482,6 +4561,7 @@ int PartPlateList::load_from_3mf_structure(PlateDataPtrs& plate_data_list)
|
|||
int index = create_plate(false);
|
||||
m_plate_list[index]->m_locked = plate_data_list[i]->locked;
|
||||
m_plate_list[index]->config()->apply(plate_data_list[i]->config);
|
||||
m_plate_list[index]->set_plate_name(plate_data_list[i]->plate_name);
|
||||
if (plate_data_list[i]->plate_index != index)
|
||||
{
|
||||
BOOST_LOG_TRIVIAL(warning) << __FUNCTION__ << boost::format(":plate index %1% seems invalid, skip it")% plate_data_list[i]->plate_index;
|
||||
|
|
|
@ -148,6 +148,15 @@ private:
|
|||
// BBS
|
||||
DynamicPrintConfig m_config;
|
||||
|
||||
// SoftFever
|
||||
// part plate name
|
||||
std::string m_name;
|
||||
GeometryBuffer m_plate_name_icon;
|
||||
mutable unsigned int m_plate_name_vbo_id{ 0 };
|
||||
GLTexture m_name_texture;
|
||||
wxCoord m_name_texture_width;
|
||||
wxCoord m_name_texture_height;
|
||||
|
||||
void init();
|
||||
bool valid_instance(int obj_id, int instance_id);
|
||||
void generate_print_polygon(ExPolygon &print_polygon);
|
||||
|
@ -161,6 +170,8 @@ private:
|
|||
void calc_vertex_for_number(int index, bool one_number, GeometryBuffer &buffer);
|
||||
void calc_vertex_for_icons(int index, GeometryBuffer &buffer);
|
||||
void calc_vertex_for_icons_background(int icon_count, GeometryBuffer &buffer);
|
||||
//void calc_vertex_for_name_tex(GeometryBuffer &buffer);
|
||||
|
||||
void render_background(bool force_default_color = false) const;
|
||||
void render_logo(bool bottom) const;
|
||||
void render_logo_texture(GLTexture& logo_texture, const GeometryBuffer& logo_buffer, bool bottom, unsigned int vbo_id) const;
|
||||
|
@ -175,8 +186,9 @@ private:
|
|||
void render_left_arrow(const float* render_color, bool use_lighting) const;
|
||||
void render_right_arrow(const float* render_color, bool use_lighting) const;
|
||||
void render_icon_texture(int position_id, int tex_coords_id, const GeometryBuffer &buffer, GLTexture &texture, unsigned int &vbo_id) const;
|
||||
void render_icons(bool bottom, int hover_id = -1) const;
|
||||
void render_icons(bool bottom, bool only_name = false, int hover_id = -1);
|
||||
void render_only_numbers(bool bottom) const;
|
||||
void render_plate_name_texture(int position_id, int tex_coords_id);
|
||||
void render_rectangle_for_picking(const GeometryBuffer &buffer, const float* render_color) const;
|
||||
void on_render_for_picking() const;
|
||||
std::array<float, 4> picking_color_component(int idx) const;
|
||||
|
@ -242,6 +254,13 @@ public:
|
|||
//get the plate's index
|
||||
int get_index() { return m_plate_index; }
|
||||
|
||||
// SoftFever
|
||||
//get the plate's name
|
||||
std::string get_plate_name() { return m_name; }
|
||||
void generate_plate_name_texture();
|
||||
//set the plate's name
|
||||
void set_plate_name(const std::string& name);
|
||||
|
||||
//get the print's object, result and index
|
||||
void get_print(PrintBase **print, GCodeResult **result, int *index);
|
||||
|
||||
|
|
|
@ -23,14 +23,19 @@ PlateSettingsDialog::PlateSettingsDialog(wxWindow* parent, wxWindowID id, const
|
|||
top_sizer->SetFlexibleDirection(wxBOTH);
|
||||
top_sizer->SetNonFlexibleGrowMode(wxFLEX_GROWMODE_SPECIFIED);
|
||||
|
||||
m_bed_type_choice = new ComboBox( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize(FromDIP(240),-1), 0, NULL, wxCB_READONLY );
|
||||
for (BedType i = btDefault; i < btCount; i = BedType(int(i) + 1)) {
|
||||
bool is_bbl = wxGetApp().preset_bundle->printers.get_edited_preset().is_bbl_vendor_preset(wxGetApp().preset_bundle);
|
||||
if (is_bbl) {
|
||||
m_bed_type_choice = new ComboBox(this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize(FromDIP(240), -1), 0,
|
||||
NULL, wxCB_READONLY);
|
||||
for (BedType i = btDefault; i < btCount; i = BedType(int(i) + 1)) {
|
||||
m_bed_type_choice->Append(to_bed_type_name(i));
|
||||
}
|
||||
wxStaticText *m_bed_type_txt = new wxStaticText(this, wxID_ANY, _L("Bed type"));
|
||||
m_bed_type_txt->SetFont(Label::Body_14);
|
||||
top_sizer->Add(m_bed_type_txt, 0, wxALIGN_CENTER_VERTICAL | wxALIGN_LEFT | wxALL, FromDIP(5));
|
||||
top_sizer->Add(m_bed_type_choice, 0, wxALIGN_CENTER_VERTICAL | wxALIGN_RIGHT | wxALL, FromDIP(5));
|
||||
}
|
||||
wxStaticText* m_bed_type_txt = new wxStaticText(this, wxID_ANY, _L("Bed type"));
|
||||
m_bed_type_txt->SetFont(Label::Body_14);
|
||||
top_sizer->Add(m_bed_type_txt, 0, wxALIGN_CENTER_VERTICAL | wxALIGN_LEFT | wxALL, FromDIP(5));
|
||||
top_sizer->Add(m_bed_type_choice, 0, wxALIGN_CENTER_VERTICAL | wxALIGN_RIGHT |wxALL, FromDIP(5));
|
||||
|
||||
|
||||
wxBoxSizer* m_sizer_selectbox = new wxBoxSizer(wxHORIZONTAL);
|
||||
m_print_seq_choice = new ComboBox( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize(FromDIP(240),-1), 0, NULL, wxCB_READONLY );
|
||||
|
@ -43,6 +48,12 @@ PlateSettingsDialog::PlateSettingsDialog(wxWindow* parent, wxWindowID id, const
|
|||
top_sizer->Add(m_print_seq_txt, 0, wxALIGN_CENTER_VERTICAL | wxALIGN_LEFT |wxALL, FromDIP(5));
|
||||
top_sizer->Add(m_print_seq_choice, 0, wxALIGN_CENTER_VERTICAL | wxALIGN_RIGHT |wxALL, FromDIP(5));
|
||||
|
||||
auto plate_name_txt = new wxStaticText(this, wxID_ANY, _L("Plate name"));
|
||||
plate_name_txt->SetFont(Label::Body_14);
|
||||
m_ti_plate_name = new TextInput(this, wxString::FromDouble(0.0), "", "", wxDefaultPosition, wxSize(FromDIP(240),-1), wxTE_PROCESS_ENTER);
|
||||
top_sizer->Add(plate_name_txt, 0, wxALIGN_CENTER_VERTICAL | wxALIGN_LEFT |wxALL, FromDIP(5));
|
||||
top_sizer->Add(m_ti_plate_name, 0, wxALIGN_CENTER_VERTICAL | wxALIGN_RIGHT |wxALL, FromDIP(5));
|
||||
|
||||
m_sizer_main->Add(top_sizer, 0, wxEXPAND | wxALL, FromDIP(30));
|
||||
|
||||
auto sizer_button = new wxBoxSizer(wxHORIZONTAL);
|
||||
|
@ -155,4 +166,10 @@ void PlateSettingsDialog::on_dpi_changed(const wxRect& suggested_rect)
|
|||
m_button_cancel->Rescale();
|
||||
}
|
||||
|
||||
wxString PlateSettingsDialog::get_plate_name() const {
|
||||
return m_ti_plate_name->GetTextCtrl()->GetValue();
|
||||
}
|
||||
|
||||
void PlateSettingsDialog::set_plate_name(const wxString &name) { m_ti_plate_name->GetTextCtrl()->SetValue(name); }
|
||||
|
||||
}} // namespace Slic3r::GUI
|
|
@ -49,11 +49,15 @@ public:
|
|||
return choice;
|
||||
};
|
||||
|
||||
wxString get_plate_name() const;
|
||||
void set_plate_name(const wxString& name);
|
||||
|
||||
protected:
|
||||
ComboBox* m_print_seq_choice { nullptr };
|
||||
ComboBox* m_bed_type_choice { nullptr };
|
||||
Button* m_button_ok;
|
||||
Button* m_button_cancel;
|
||||
TextInput *m_ti_plate_name;
|
||||
};
|
||||
|
||||
}} // namespace Slic3r::GUI
|
||||
|
|
|
@ -11508,6 +11508,8 @@ int Plater::select_plate_by_hover_id(int hover_id, bool right_click)
|
|||
else
|
||||
dlg.sync_print_seq(0);
|
||||
|
||||
dlg.set_plate_name(curr_plate->get_plate_name());
|
||||
|
||||
dlg.Bind(EVT_SET_BED_TYPE_CONFIRM, [this, plate_index, &dlg](wxCommandEvent& e) {
|
||||
PartPlate *curr_plate = p->partplate_list.get_curr_plate();
|
||||
BedType old_bed_type = curr_plate->get_bed_type();
|
||||
|
@ -11531,6 +11533,7 @@ int Plater::select_plate_by_hover_id(int hover_id, bool right_click)
|
|||
wxGetApp().plater()->config_change_notification(plate_config, std::string("print_sequence"));
|
||||
});
|
||||
dlg.ShowModal();
|
||||
curr_plate->set_plate_name(dlg.get_plate_name().ToStdString());
|
||||
|
||||
this->schedule_background_process();
|
||||
}
|
||||
|
|
|
@ -1647,7 +1647,7 @@ void Tab::on_presets_changed()
|
|||
if (is_bbl_vendor_preset)
|
||||
wxGetApp().plater()->get_partplate_list().set_render_option(true, true);
|
||||
else
|
||||
wxGetApp().plater()->get_partplate_list().set_render_option(false, false);
|
||||
wxGetApp().plater()->get_partplate_list().set_render_option(false, true);
|
||||
|
||||
// Printer selected at the Printer tab, update "compatible" marks at the print and filament selectors.
|
||||
for (auto t: m_dependent_tabs)
|
||||
|
|
|
@ -21,6 +21,7 @@ wxFont Label::sysFont(int size, bool bold)
|
|||
}
|
||||
return font;
|
||||
}
|
||||
wxFont Label::Head_48;
|
||||
wxFont Label::Head_24;
|
||||
wxFont Label::Head_20;
|
||||
wxFont Label::Head_18;
|
||||
|
@ -64,6 +65,7 @@ void Label::initSysFont()
|
|||
Head_12 = Label::sysFont(12, true);
|
||||
Head_10 = Label::sysFont(10, true);
|
||||
|
||||
Head_48 = Label::sysFont(48, true);
|
||||
Body_16 = Label::sysFont(16, false);
|
||||
Body_15 = Label::sysFont(15, false);
|
||||
Body_14 = Label::sysFont(14, false);
|
||||
|
|
|
@ -35,6 +35,7 @@ public:
|
|||
static wxFont Head_12;
|
||||
static wxFont Head_10;
|
||||
|
||||
static wxFont Head_48;
|
||||
static wxFont Body_16;
|
||||
static wxFont Body_15;
|
||||
static wxFont Body_14;
|
||||
|
|
|
@ -302,7 +302,7 @@ void TabCtrl::doRender(wxDC& dc)
|
|||
#else
|
||||
dc.SetPen(wxPen(border_color.colorForStates(states), border_width));
|
||||
dc.DrawLine(0, size.y - BS2, size.x, size.y - BS2);
|
||||
wxColor c(0x42AE00);
|
||||
wxColor c(0x968800);
|
||||
dc.SetPen(wxPen(c, 1));
|
||||
dc.SetBrush(c);
|
||||
dc.DrawRoundedRectangle(x1 - radius, size.y - BS2 - border_width * 3, x2 + radius * 2 - x1, border_width * 3, radius);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue