From a3ebd945f2a59e0240074bfa35e35af27872c59f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Steffen=20M=C3=B6ller?= Date: Sat, 31 Jan 2026 23:29:36 +0100 Subject: [PATCH 1/9] Translated using Weblate (German) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 99.6% (33874 of 33994 strings) Author: Steffen Möller Co-authored-by: Steffen Möller Translate-URL: https://hosted.weblate.org/projects/linuxcnc/linuxcnc-docs/de/ Translation: LinuxCNC/LinuxCNC Documentation --- docs/po/de.po | 358 ++++++++++++++++---------------------------------- 1 file changed, 116 insertions(+), 242 deletions(-) diff --git a/docs/po/de.po b/docs/po/de.po index 714d58bc377..2b19e84bece 100644 --- a/docs/po/de.po +++ b/docs/po/de.po @@ -16,7 +16,7 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: emc-developers@lists.sourceforge.net\n" "POT-Creation-Date: 2026-01-29 16:34+0000\n" -"PO-Revision-Date: 2026-01-22 19:45+0000\n" +"PO-Revision-Date: 2026-01-31 14:15+0000\n" "Last-Translator: Steffen Möller \n" "Language-Team: none\n" "Language: de\n" @@ -19229,35 +19229,25 @@ msgstr "" #. type: NOTE #: src/config/ini-config.adoc:563 -#, fuzzy -#| msgid "" -#| "'PARAMETER_G73_PECK_CLEARANCE = .020' (default: Metric machine: 1mm, " -#| "imperial machine: .050 inches) Chip breaking back-off distance in " -#| "machine units" msgid "" "'G73_PECK_CLEARANCE = .020' (default: Metric machine: 1mm, imperial machine: " ".050 inches) Chip breaking back-off distance in machine units" msgstr "" -"'PARAMETER_G73_PECK_CLEARANCE = .020' (Voreinstellung: Metrische Maschine: " -"1 mm, imperiale Maschine: .05 Zoll) Splitter/Span (chip)-Back-" -"off-Abstand in Maschineneinheiten" +"'G73_PECK_CLEARANCE = .020' (Voreinstellung: Metrische Maschine: 1 mm, " +"imperiale Maschine: .05 Zoll) Splitter/Span (chip)-Back-off-Abstand in " +"Maschineneinheiten" #. type: NOTE #: src/config/ini-config.adoc:565 -#, fuzzy -#| msgid "" -#| "'PARAMETER_G83_PECK_CLEARANCE = .020' (default: Metric machine: 1mm, " -#| "imperial machine: .050 inches) Clearance distance from last feed depth " -#| "when machine rapids back to bottom of hole, in machine units." msgid "" "'G83_PECK_CLEARANCE = .020' (default: Metric machine: 1mm, imperial machine: " ".050 inches) Clearance distance from last feed depth when machine rapids " "back to bottom of hole, in machine units." msgstr "" -"'PARAMETER_G83_PECK_CLEARANCE = .020' (Voreinstellung: Metrische Maschine: " -"1mm, imperiale Maschine: .050 Zoll) Freiraumabstand (engl. clearance " -"distance) von der letzten Eintauchtiefe (engl. feed depth), wenn die " -"Maschine schnell zum Boden des Lochs zurückfährt, in Maschineneinheiten." +"'G83_PECK_CLEARANCE = .020' (Voreinstellung: Metrische Maschine: 1mm, " +"imperiale Maschine: .050 Zoll) Freiraumabstand (engl. clearance distance) " +"von der letzten Eintauchtiefe (engl. feed depth), wenn die Maschine schnell " +"zum Boden des Lochs zurückfährt, in Maschineneinheiten." #. type: delimited block = #: src/config/ini-config.adoc:571 @@ -20328,19 +20318,14 @@ msgstr "" #. type: Plain text #: src/config/ini-config.adoc:870 -#, fuzzy -#| msgid "" -#| "`MAX_LINEAR_VELOCITY = 5.0` - The maximum velocity for any axis or " -#| "coordinated move, in 'machine units' per second. The value shown equals " -#| "300 units per minute." msgid "" "`DEFAULT_LINEAR_JERK = 0.0` - The default jerk value for coordinated moves, " "in 'machine units' per second cubed. When set to 0, `MAX_LINEAR_JERK` is " "used." msgstr "" -"`MAX_LINEAR_VELOCITY = 5.0` - Die maximale Geschwindigkeit für eine " -"beliebige Achse oder koordinierte Bewegung, in 'Maschineneinheiten' pro " -"Sekunde. Der angezeigte Wert entspricht 300 Einheiten pro Minute." +"`DEFAULT_LINEAR_JERK = 0.0 ` - Der voreingestellte Jerk-Wert für " +"koordinierte Bewegungen, in 'Maschineneinheiten' pro Sekunde hoch 3. Wenn " +"auf 0 gesetzt, wird `MAX_LINEAR_JERK`genutzt." #. type: Plain text #: src/config/ini-config.adoc:877 @@ -24366,10 +24351,9 @@ msgstr "" #. type: Title == #: src/config/integrator-concepts.adoc:261 -#, fuzzy, no-wrap -#| msgid "Trajectory Planning" +#, no-wrap msgid "S-Curve Trajectory Planning" -msgstr "Trajektorienplanung" +msgstr "S-Kurven (engl. S-curve)Trajektorienplanung" #. type: NOTE #: src/config/integrator-concepts.adoc:266 @@ -24381,10 +24365,9 @@ msgstr "" #. type: Title === #: src/config/integrator-concepts.adoc:267 -#, fuzzy, no-wrap -#| msgid "Enabling Touchy" +#, no-wrap msgid "Enabling" -msgstr "Touchy aktivieren" +msgstr "Aktivieren" #. type: NOTE #: src/config/integrator-concepts.adoc:270 @@ -24402,16 +24385,13 @@ msgstr "" #. type: delimited block - #: src/config/integrator-concepts.adoc:278 -#, fuzzy, no-wrap -#| msgid "" -#| "[JOINT_0]\n" -#| "MAX_VELOCITY = 4\n" +#, no-wrap msgid "" "[JOINT_n]\n" "MAX_JERK = 1000.0\n" msgstr "" -"[JOINT_0]\n" -"MAX_VELOCITY = 4\n" +"[JOINT_n]\n" +"MAX_JERK = 1000.0\n" #. type: Plain text #: src/config/integrator-concepts.adoc:281 @@ -24422,10 +24402,9 @@ msgstr "" #. type: Title === #: src/config/integrator-concepts.adoc:282 -#, fuzzy, no-wrap -#| msgid "PID Tuning" +#, no-wrap msgid "Tuning" -msgstr "PID-Feineinstellung (engl. tuning)" +msgstr "Feineinstellung (engl. tuning)" #. type: Plain text #: src/config/integrator-concepts.adoc:285 @@ -25704,13 +25683,6 @@ msgstr "Maschinengrundlagen" #. type: Plain text #: src/config/pncconf.adoc:58 -#, fuzzy -#| msgid "" -#| "If you use a name with spaces PnCconf will replace the spaces with " -#| "underscore (as a loose rule Linux doesn't like spaces in names) Pick an " -#| "axis configuration - this selects what type of machine you are building " -#| "and what axes are available. The Machine units selector allows data " -#| "entry of metric or imperial units in the following pages." msgid "" "If you use a name with spaces PnCconf will replace the spaces with " "underscores (as a loose rule Linux doesn't like spaces in names). Picking " @@ -25720,10 +25692,11 @@ msgid "" msgstr "" "Wenn Sie einen Namen mit Leerzeichen verwenden, ersetzt PnCconf die " "Leerzeichen durch Unterstriche (als lockere Regel gilt, dass Linux keine " -"Leerzeichen in Namen mag) Wählen Sie eine Achsenkonfiguration - damit wählen " -"Sie aus, welche Art von Maschine Sie bauen und welche Achsen verfügbar sind. " -"Die Auswahl der Maschineneinheiten ermöglicht die Eingabe von metrischen " -"oder imperialen Einheiten auf den folgenden Seiten." +"Leerzeichen in Namen mag). Durch Wahl einer Achsenkonfiguration bestimmen " +"Sie, welche Art von Maschine Sie bauen und welche Achsen verfügbar sind. Die " +"Auswahl der \"Maschineneinheiten\" (engl. machine units) ermöglicht die " +"Eingabe von metrischen oder imperialen Einheiten im weiteren Verlauf der " +"Konfiguration." #. type: Plain text #: src/config/pncconf.adoc:60 @@ -29781,10 +29754,9 @@ msgstr "'(gibt einen booleschen Wert zurück)' - 'Bewegung pausiert'-Flag." #. type: Labeled list #: src/config/python-interface.adoc:281 -#, fuzzy, no-wrap -#| msgid "*spindle_stop*" +#, no-wrap msgid "*single_stepping*" -msgstr "*spindle_stop*" +msgstr "*single_stepping*" #. type: Plain text #: src/config/python-interface.adoc:283 @@ -87916,11 +87888,7 @@ msgstr "" #. type: delimited block - #: src/gui/gladevcp-panels.adoc:91 -#, fuzzy, no-wrap -#| msgid "" -#| "EMBED_TAB_NAME = Second user tab\n" -#| "EMBED_TAB_LOCATION = ntb_preview\n" -#| "EMBED_TAB_COMMAND = gladevcp -x {XID} vcp_box.glade\n" +#, no-wrap msgid "" "[DISPLAY]\n" "DISPLAY = gmoccapy\n" @@ -87928,9 +87896,11 @@ msgid "" "EMBED_TAB_LOCATION = ntb_preview\n" "EMBED_TAB_COMMAND = gladevcp -x {XID} gtk_little_probe\n" msgstr "" -"EMBED_TAB_NAME = Second user tab\n" +"[DISPLAY]\n" +"DISPLAY = gmoccapy\n" +"EMBED_TAB_NAME = Probe\n" "EMBED_TAB_LOCATION = ntb_preview\n" -"EMBED_TAB_COMMAND = gladevcp -x {XID} vcp_box.glade\n" +"EMBED_TAB_COMMAND = gladevcp -x {XID} gtk_little_probe\n" #. type: delimited block - #: src/gui/gladevcp-panels.adoc:98 @@ -87983,10 +87953,9 @@ msgstr "" #. type: Target for macro image #: src/gui/gladevcp-panels.adoc:126 -#, fuzzy, no-wrap -#| msgid "images/tester.png" +#, no-wrap msgid "images/gtk_mesa_tests-servo.png" -msgstr "images/tester.png" +msgstr "images/gtk_mesa_tests-servo.png" #. type: Plain text #: src/gui/gladevcp-panels.adoc:129 @@ -88028,10 +87997,9 @@ msgstr "" #. type: Target for macro image #: src/gui/gladevcp-panels.adoc:136 -#, fuzzy, no-wrap -#| msgid "images/tester.png" +#, no-wrap msgid "images/gtk_mesa_tests-nic.png" -msgstr "images/tester.png" +msgstr "images/gtk_mesa_tests-nic.png" #. type: Plain text #: src/gui/gladevcp-panels.adoc:139 @@ -88046,7 +88014,7 @@ msgstr "Drücken Sie den \"Get read.tmax\" Button." #. type: Plain text #: src/gui/gladevcp-panels.adoc:143 msgid "press the \"Get write.tmax\" button" -msgstr "Drücken Sie den \"Get write.tmax\" Button." +msgstr "Drücken Sie den \"Get write.tmax\" Button." #. type: Plain text #: src/gui/gladevcp-panels.adoc:148 @@ -113967,15 +113935,12 @@ msgstr "Registerkarte \"Dienstprogramme\"" #. type: NOTE #: src/gui/qtdragon.adoc:1473 -#, fuzzy -#| msgid "" -#| "This tabs will display another stab election of G-code utility programs:" msgid "" "This tab will display another tab selection of G-code utility programs (and " "any embedded panels):" msgstr "" "Auf dieser Registerkarte wird eine weitere Auswahl von G-Code-" -"Hilfsprogrammen angezeigt:" +"Hilfsprogrammen (und allen eingebetteten Panels) angezeigt:" #. type: NOTE #: src/gui/qtdragon.adoc:1475 @@ -165827,17 +165792,14 @@ msgstr "" #. type: NOTE #: src/install/latency-test.adoc:63 -#, fuzzy -#| msgid "" -#| "To run the test, open a terminal window (in Ubuntu, from Applications → " -#| "Accessories → Terminal) and run the following command:" msgid "" "If you want to run the test from the command line, open a terminal window " "(in Ubuntu, from Applications → Accessories → Terminal) and run the " "following command:" msgstr "" -"Um den Test auszuführen, öffnen Sie ein Terminal-Fenster (in Ubuntu, von " -"Anwendungen → Zubehör → Terminal) und führen den folgenden Befehl aus:" +"Um den Test von der Kommandozeile auszuführen, öffnen Sie ein Terminal-" +"Fenster (in Ubuntu, von Anwendungen → Zubehör → Terminal) und führen den " +"folgenden Befehl aus:" #. type: delimited block - #: src/install/latency-test.adoc:66 @@ -165929,15 +165891,6 @@ msgstr "" #. type: Plain text #: src/install/latency-test.adoc:107 -#, fuzzy -#| msgid "" -#| "In the example above, latency-test only ran for a few seconds. You " -#| "should run the test for at least several minutes; sometimes the worst " -#| "case latency doesn't happen very often, or only happens when you do some " -#| "particular action. For instance, one Intel motherboard worked pretty well " -#| "most of the time, but every 64 seconds it had a very bad 300 µs latency. " -#| "Fortunately that was fixable, see https://wiki.linuxcnc.org/cgi-bin/" -#| "wiki.pl?FixingSMIIssues ." msgid "" "In the example above, latency-test only ran for a few seconds. You should " "run the test for at least several minutes; sometimes the worst case latency " @@ -165951,8 +165904,7 @@ msgstr "" "die schlimmste Latenz nicht sehr oft auf oder nur, wenn Sie eine bestimmte " "Aktion durchführen. Eine Intel-Hauptplatine funktionierte beispielsweise die " "meiste Zeit recht gut, aber alle 64 Sekunden hatte sie eine sehr schlechte " -"300 µs-Latenz. Glücklicherweise war das behebbar, siehe https://" -"wiki.linuxcnc.org/cgi-bin/wiki.pl?FixingSMIIssues." +"300 µs-Latenz. Glücklicherweise war das behebbar, siehe <<_latency_tuning>>." #. type: Plain text #: src/install/latency-test.adoc:109 @@ -165995,12 +165947,6 @@ msgstr "" #. type: NOTE #: src/install/latency-test.adoc:127 -#, fuzzy -#| msgid "" -#| "If you get high numbers, there may be ways to improve them. Another PC " -#| "had very bad latency (several milliseconds) when using the onboard video. " -#| "But a $5 used video card solved the problem. LinuxCNC does not require " -#| "bleeding edge hardware." msgid "" "If you get high numbers, there may be ways to improve them. Another PC had " "very bad latency (several million nanoseconds) when using the onboard video. " @@ -166009,9 +165955,9 @@ msgid "" msgstr "" "Wenn Sie hohe Zahlen erhalten, gibt es möglicherweise Möglichkeiten, sie zu " "verbessern. Ein anderer PC hatte eine sehr schlechte Latenz (mehrere " -"Millisekunden) bei der Verwendung des Onboard-Videos. Aber eine $ 5 " -"gebrauchte Grafikkarte löste das Problem. LinuxCNC benötigt keine " -"hochmoderne Hardware." +"Millionen Nanosekunden, d.h. Millisekunden) bei der Verwendung des Onboard-" +"Videos. Aber eine €5 gebrauchte Grafikkarte löste das Problem. LinuxCNC " +"benötigt keine hochmoderne Hardware." #. type: NOTE #: src/install/latency-test.adoc:130 @@ -166163,14 +166109,6 @@ msgstr "" #. type: NOTE #: src/install/latency-test.adoc:191 -#, fuzzy -#| msgid "" -#| "When determining the latency, LinuxCNC and HAL should not be running, " -#| "stop with `halrun -U`. Large number of bins and/or small binsizes will " -#| "slow updates. For single thread, specify `--nobase` (and options for " -#| "servo thread). Measured latencies outside of the +/- bin range are " -#| "reported with special end bars. Use `--show` to show count for the off-" -#| "chart [pos|neg] bin." msgid "" "When determining the latency, LinuxCNC and HAL should not be running, stop " "with `halrun -U`. Large number of bins and/or small binsizes will slow " @@ -166183,9 +166121,9 @@ msgstr "" "werden, stoppen Sie mit `halrun -U`. Eine große Anzahl von Bins und/oder " "kleine Binsizes verlangsamen die Aktualisierung. Für einen einzelnen Thread " "geben Sie *--nobase* (und Optionen für den Servo-Thread) an. Gemessene " -"Latenzen außerhalb des +/- Bin-Bereichs werden mit speziellen Endbalken " -"angezeigt. Verwenden Sie *--show*, um die Zählung für den Off-Chart [pos|" -"neg] bin anzuzeigen." +"Latenzen außerhalb des +/- Bereichs werden mit speziellen Endbalken " +"angezeigt. Verwenden Sie *--show*, um die Zählung für den Off-Chart " +"[pos|neg] bin anzuzeigen." #. type: Block title #: src/install/latency-test.adoc:192 @@ -174240,10 +174178,8 @@ msgstr "" #. type: Index entry #: src/lathe/lathe-user.adoc:77 -#, fuzzy -#| msgid "Axis Positions" msgid "Tool Positions 1" -msgstr "Achsenpositionen" +msgstr "Werkzeugpositionen 1" #. type: Index entry #: src/lathe/lathe-user.adoc:77 @@ -174252,10 +174188,9 @@ msgstr "" #. type: Block title #: src/lathe/lathe-user.adoc:78 -#, fuzzy, no-wrap -#| msgid "Tool Positions 1, 2, 3 & 4(((Tool Positions 1, 2, 3 & 4)))" +#, no-wrap msgid "Tool Positions 1, 2, 3 & 4" -msgstr "Werkzeugpositionen 1, 2, 3 & 4(((Werkzeugpositionen 1, 2, 3 & 4)))" +msgstr "Werkzeugpositionen 1, 2, 3 & 4" #. type: Plain text #: src/lathe/lathe-user.adoc:83 @@ -174270,10 +174205,8 @@ msgstr "" #. type: Index entry #: src/lathe/lathe-user.adoc:85 -#, fuzzy -#| msgid "Axis Positions" msgid "Tool Positions 5" -msgstr "Achsenpositionen" +msgstr "Werkzeugpositionen 5" #. type: Index entry #: src/lathe/lathe-user.adoc:85 @@ -174282,10 +174215,9 @@ msgstr "" #. type: Block title #: src/lathe/lathe-user.adoc:86 -#, fuzzy, no-wrap -#| msgid "Tool Positions 5, 6, 7 & 8(((Tool Positions 5, 6, 7 & 8)))" +#, no-wrap msgid "Tool Positions 5, 6, 7 & 8" -msgstr "Werkzeugpositionen 5, 6, 7 & 8(((Werkzeugpositionen 5, 6, 7 & 8)))" +msgstr "Werkzeugpositionen 5, 6, 7 & 8" #. type: Plain text #: src/lathe/lathe-user.adoc:91 @@ -189652,10 +189584,8 @@ msgstr "" #. type: Plain text #: src/man/man1/modcompile.1.adoc:23 -#, fuzzy -#| msgid "https://linuxcnc.org/docs/stable/html/drivers/mesa_modbus.html" msgid "https://linuxcnc.org/docs/devel/html/drivers/mesa_modbus.html" -msgstr "https://linuxcnc.org/docs/stable/html/drivers/mesa_modbus.html" +msgstr "https://linuxcnc.org/docs/devel/html/drivers/mesa_modbus.html" #. type: Labeled list #: src/man/man1/modcompile.1.adoc:26 @@ -192893,11 +192823,6 @@ msgstr "" #. type: Plain text #: src/man/man1/tool_mmap_read.1.adoc:17 -#, fuzzy -#| msgid "" -#| "See the Tool Database Interface section of the LinuxCNC Documentation for " -#| "more information at https://linuxcnc.org/docs/stable/html/tooldatabase/" -#| "tooldatabase.html." msgid "" "See the Tool Database Interface section of the LinuxCNC Documentation for " "more information at https://linuxcnc.org/docs/devel/html/tooldatabase/" @@ -192905,7 +192830,7 @@ msgid "" msgstr "" "Siehe den Abschnitt zur Schnittstelle der Werkzeug-Datenbank (engl. Tool " "Database Interface) der LinuxCNC Dokumentation für weitere Informationen " -"unter https://linuxcnc.org/docs/stable/html/tooldatabase/tooldatabase.html." +"unter https://linuxcnc.org/docs/devel/html/tooldatabase/tooldatabase.html." #. type: Title = #: src/man/man1/tool_watch.1.adoc:1 @@ -192931,11 +192856,6 @@ msgstr "" #. type: Plain text #: src/man/man1/tool_watch.1.adoc:15 -#, fuzzy -#| msgid "" -#| "See the Tool Database Interface section of the LinuxCNC Documentation for " -#| "more information. https://linuxcnc.org/docs/stable/html/tooldatabase/" -#| "tooldatabase.html" msgid "" "See the Tool Database Interface section of the LinuxCNC Documentation for " "more information. https://linuxcnc.org/docs/devel/html/tooldatabase/" @@ -192943,7 +192863,7 @@ msgid "" msgstr "" "Siehe die Hauptdokumentation zu LinuxSiehe den Abschnitt zur Schnittstelle " "der Werkzeug-Datenbank (engl. Tool Database Interface) der LinuxCNC " -"Dokumentation für weitere Informationen https://linuxcnc.org/docs/stable/" +"Dokumentation für weitere Informationen https://linuxcnc.org/docs/devel/" "html/tooldatabase/tooldatabase.html" #. type: Title = @@ -217473,10 +217393,9 @@ msgstr "Die Soll-Geschwindigkeit des Gelenks." #. type: Labeled list #: src/man/man9/motion.9.adoc:411 -#, fuzzy, no-wrap -#| msgid "**joint.**_N_**.vel-cmd** OUT FLOAT *(DEBUG)*" +#, no-wrap msgid "**joint.**_N_**.jerk-cmd** OUT FLOAT *(DEBUG)*" -msgstr "**joint.**_N_**.vel-cmd** OUT FLOAT *(DEBUG)*" +msgstr "**joint.**_N_**.jerk-cmd** OUT FLOAT *(DEBUG)*" #. type: Plain text #: src/man/man9/motion.9.adoc:415 @@ -231513,10 +231432,6 @@ msgstr "Empfohlene Einstellungen:" #. type: NOTE #: src/plasma/qtplasmac.adoc:192 -#, fuzzy -#| msgid "" -#| "Refer to the <> diagram for a " -#| "visual representation of the terms below." msgid "" "Refer to the <> for a visual " "representation of the terms below." @@ -231969,17 +231884,15 @@ msgstr "" #. type: Block title #: src/plasma/qtplasmac.adoc:310 -#, fuzzy, no-wrap -#| msgid "Probe Height" +#, no-wrap msgid "*Probe Height Only*" -msgstr "Sondenhöhe" +msgstr "*Sondenhöhe allein*" #. type: Target for macro image #: src/plasma/qtplasmac.adoc:312 -#, fuzzy, no-wrap -#| msgid "images/qtplasmac_heights_diagram.png" +#, no-wrap msgid "images/qtplasmac_heights_diagram_probe_height.png" -msgstr "images/qtplasmac_heights_diagram.png" +msgstr "images/qtplasmac_heights_diagram_probe_height.png" #. type: Block title #: src/plasma/qtplasmac.adoc:314 @@ -231989,10 +231902,9 @@ msgstr "" #. type: Target for macro image #: src/plasma/qtplasmac.adoc:316 -#, fuzzy, no-wrap -#| msgid "images/qtplasmac_heights_diagram.png" +#, no-wrap msgid "images/qtplasmac_heights_diagram_slat_and_material_height.png" -msgstr "images/qtplasmac_heights_diagram.png" +msgstr "images/qtplasmac_heights_diagram_slat_and_material_height.png" #. type: Plain text #: src/plasma/qtplasmac.adoc:320 @@ -235219,16 +235131,15 @@ msgstr "Schnittfugenbreite (engl. kerf width)" #. type: Table #: src/plasma/qtplasmac.adoc:1096 -#, fuzzy, no-wrap -#| msgid "" -#| "This sets the kerf width for the currently selected material.\n" -#| "Refer to the <> diagram for a visual representation." +#, no-wrap msgid "" "This sets the kerf width for the currently selected material.\n" "Refer to the <> for a visual representation." msgstr "" -"Hiermit wird die Schnittfugenbreite (engl. kerf width) für das aktuell ausgewählte Material festgelegt.\n" -"Eine visuelle Darstellung finden Sie im <> ( engl. Heights Diagram)." +"Hiermit wird die Schnittfugenbreite (engl. kerf width) für das aktuell " +"ausgewählte Material festgelegt.\n" +"Eine visuelle Darstellung finden Sie im <> ( engl. Heights Diagram)." #. type: Table #: src/plasma/qtplasmac.adoc:1096 @@ -235238,16 +235149,15 @@ msgstr "Einstichhöhe (engl. pierce height)" #. type: Table #: src/plasma/qtplasmac.adoc:1098 -#, fuzzy, no-wrap -#| msgid "" -#| "This sets the pierce height for the currently selected material.\n" -#| "Refer to the <> diagram for a visual representation." +#, no-wrap msgid "" "This sets the pierce height for the currently selected material.\n" "Refer to the <> for a visual representation." msgstr "" -"Hiermit wird die Durchstoßhöhe (engl. widthpierce height) für das aktuell ausgewählte Material festgelegt.\n" -"Eine visuelle Darstellung finden Sie im <> ( engl. Heights Diagram)." +"Hiermit wird die Durchstoßhöhe (engl. widthpierce height) für das aktuell " +"ausgewählte Material festgelegt.\n" +"Eine visuelle Darstellung finden Sie im <> ( engl. Heights Diagram)." #. type: Table #: src/plasma/qtplasmac.adoc:1098 @@ -235269,16 +235179,15 @@ msgstr "Schnitthöhe (engl. cut height)" #. type: Table #: src/plasma/qtplasmac.adoc:1101 -#, fuzzy, no-wrap -#| msgid "" -#| "This sets the cut height for the currently selected material.\n" -#| "Refer to the <> diagram for a visual representation." +#, no-wrap msgid "" "This sets the cut height for the currently selected material.\n" "Refer to the <> for a visual representation." msgstr "" -"Hiermit wird die Schnitthöhe (engl. cut height) für das aktuell ausgewählte Material festgelegt.\n" -"Eine visuelle Darstellung finden Sie im <> ( engl. Heights Diagram)." +"Hiermit wird die Schnitthöhe (engl. cut height) für das aktuell ausgewählte " +"Material festgelegt.\n" +"Eine visuelle Darstellung finden Sie im <> ( engl. Heights Diagram)." #. type: Title === #: src/plasma/qtplasmac.adoc:1101 src/plasma/qtplasmac.adoc:1332 @@ -235328,19 +235237,22 @@ msgstr "Pfützenhöhe (engl. puddle height)" #. type: Table #: src/plasma/qtplasmac.adoc:1108 -#, fuzzy, no-wrap -#| msgid "" -#| "Expressed as a percentage of Pierce Height, this sets the Puddle Jump height for the currently selected material. +\n" -#| "Typically used for thicker materials, Puddle Jump allows the torch to have an intermediate step between Pierce Height and Cut Height. +\n" -#| "If set, the torch will proceed from Pierce Height to P-Jump Height for a period of time (P-Jump Delay) before proceeding to Cut Height to effectively \"jump\" over the molten puddle. Refer to the <> diagram for a visual representation." +#, no-wrap msgid "" "Expressed as a percentage of Pierce Height, this sets the Puddle Jump height for the currently selected material. +\n" "Typically used for thicker materials, Puddle Jump allows the torch to have an intermediate step between Pierce Height and Cut Height. +\n" "If set, the torch will proceed from Pierce Height to P-Jump Height for a period of time (P-Jump Delay) before proceeding to Cut Height to effectively \"jump\" over the molten puddle. Refer to the <> for a visual representation." msgstr "" -"Ausgedrückt als Prozentsatz der Pierce-Höhe legt dies die Pfützensprunghöhe (engl. puddle jump height) für das aktuell ausgewählte Material fest. +\n" -"Puddle Jump wird normalerweise für dickere Materialien verwendet und ermöglicht es dem Brenner, einen Zwischenschritt zwischen Durchstichhöhe und Schnitthöhe zu haben. +\n" -"Wenn eingestellt, wird der Brenner für einen bestimmten Zeitraum von der Durchstichhöhe zur P-Sprunghöhe (P-Sprungverzögerung) fortgesetzt, bevor sie zur Schnitthöhe übergeht, um effektiv über die geschmolzene Pfütze zu \"springen\". Eine visuelle Darstellung finden Sie im <>." +"Ausgedrückt als Prozentsatz der Pierce-Höhe legt dies die Pfützensprunghöhe " +"(engl. puddle jump height) für das aktuell ausgewählte Material fest. +\n" +"Puddle Jump wird normalerweise für dickere Materialien verwendet und " +"ermöglicht es dem Brenner, einen Zwischenschritt zwischen Durchstichhöhe und " +"Schnitthöhe zu haben. +\n" +"Wenn eingestellt, wird der Brenner für einen bestimmten Zeitraum von der " +"Durchstichhöhe zur P-Sprunghöhe (P-Sprungverzögerung) fortgesetzt, bevor sie " +"zur Schnitthöhe übergeht, um effektiv über die geschmolzene Pfütze zu " +"\"springen\". Eine visuelle Darstellung finden Sie im <>." #. type: Table #: src/plasma/qtplasmac.adoc:1108 @@ -237077,14 +236989,13 @@ msgstr "Optionale Parameter sind:" #, fuzzy, no-wrap #| msgid "t" msgid "mt" -msgstr "t" +msgstr "mt" #. type: Table #: src/plasma/qtplasmac.adoc:1529 -#, fuzzy, no-wrap -#| msgid "Sets the feed rate." +#, no-wrap msgid "Sets the material thickness." -msgstr "Legt die Vorschubgeschwindigkeit fest." +msgstr "Bestimmt die Materialstärke (engl. material thickness)." #. type: Table #: src/plasma/qtplasmac.adoc:1529 @@ -237196,31 +237107,29 @@ msgstr "Legt die Pfützensprungverzögerung fest." #. type: Plain text #: src/plasma/qtplasmac.adoc:1541 -#, fuzzy -#| msgid "A complete example:" msgid "A complete example (metric):" -msgstr "Ein vollständiges Beispiel:" +msgstr "Ein vollständiges Beispiel (metrisch):" #. type: delimited block - #: src/plasma/qtplasmac.adoc:1545 -#, fuzzy, no-wrap -#| msgid "(o=0, nu=2, na=5mm Mild Steel 40A, ph=3.1, pd=0.1, ch=0.75, fr=3000, kw=0.5, th=1, ca=45, cv=110, pe=0.1, gp=5, cm=1, jh=0, jd=0)\n" +#, no-wrap msgid "(o=0, nu=2, na=5mm Mild Steel 40A, ph=3.1, pd=0.1, ch=0.75, fr=3000, mt=5, kw=0.5, th=1, ca=40, cv=110, pe=0.1, gp=5, cm=1, jh=0, jd=0)\n" -msgstr "(o=0, nu=2, na=5mm Baustahl (engl. mild steel) 40A, ph=3.1, pd=0.1, ch=0.75, fr=3000, kw=0.5, th=1, ca=45, cv=110, pe=0.1, gp=5, cm=1, jh=0, jd=0)\n" +msgstr "" +"(o=0, nu=2, na=5mm Mild Steel 40A, ph=3.1, pd=0.1, ch=0.75, fr=3000, mt=5, " +"kw=0.5, th=1, ca=40, cv=110, pe=0.1, gp=5, cm=1, jh=0, jd=0)\n" #. type: Plain text #: src/plasma/qtplasmac.adoc:1548 -#, fuzzy -#| msgid "A complete example:" msgid "A complete example (imperial):" -msgstr "Ein vollständiges Beispiel:" +msgstr "Ein vollständiges Beispiel (Zoll):" #. type: delimited block - #: src/plasma/qtplasmac.adoc:1552 -#, fuzzy, no-wrap -#| msgid "(o=0, nu=2, na=5mm Mild Steel 40A, ph=3.1, pd=0.1, ch=0.75, fr=3000, kw=0.5, th=1, ca=45, cv=110, pe=0.1, gp=5, cm=1, jh=0, jd=0)\n" +#, no-wrap msgid "(o=0, nu=2, na=0.197\" Mild Steel 40A, ph=0.122, pd=0.1, ch=0.029, fr=118, mt=0.197, kw=0.020, th=1, ca=40, cv=110, pe=0.1, gp=72, cm=1, jh=0, jd=0)\n" -msgstr "(o=0, nu=2, na=5mm Baustahl (engl. mild steel) 40A, ph=3.1, pd=0.1, ch=0.75, fr=3000, kw=0.5, th=1, ca=45, cv=110, pe=0.1, gp=5, cm=1, jh=0, jd=0)\n" +msgstr "" +"(o=0, nu=2, na=0.197\" Mild Steel 40A, ph=0.122, pd=0.1, ch=0.029, fr=118, " +"mt=0.197, kw=0.020, th=1, ca=40, cv=110, pe=0.1, gp=72, cm=1, jh=0, jd=0)\n" #. type: Plain text #: src/plasma/qtplasmac.adoc:1555 @@ -245291,14 +245200,6 @@ msgstr "Z-Bewegung beibehalten" #. type: NOTE #: src/plasma/qtplasmac.adoc:3743 -#, fuzzy -#| msgid "" -#| "By default, QtPlasmaC will remove all Z motion from a loaded G-code file " -#| "and add an initial Z movement to bring the torch near the top of travel " -#| "at the beginning of the file. If the user wishes to use their table with " -#| "a marker, a drag knife, diamond scribe, etc. mounted in the torch holder, " -#| "QtPlasmaC has the ability to retain the Z movements when executing a " -#| "program by adding the following command in a G-code file:" msgid "" "By default, QtPlasmaC will remove all Z motion from a loaded G-code file and " "add an initial Z movement to bring the torch near the top of travel at the " @@ -245323,10 +245224,8 @@ msgstr "# = 1\n" #. type: Plain text #: src/plasma/qtplasmac.adoc:3750 -#, fuzzy -#| msgid "These can be set in:" msgid "This can be used two different ways:" -msgstr "Diese können eingestellt werden in:" +msgstr "Das kann auf zwei Arten genutzt werden:" #. type: Plain text #: src/plasma/qtplasmac.adoc:3751 @@ -249698,15 +249597,6 @@ msgstr "" #. type: Plain text #: src/remap/remap.adoc:40 -#, fuzzy -#| msgid "" -#| "A good example for this deficiency is tool change support in LinuxCNC: " -#| "While random tool changers are well supported, it is next to impossible " -#| "to reasonably define a configuration for a manual-tool change machine " -#| "with, for example, an automatic tool length offset switch being visited " -#| "after a tool change, and offsets set accordingly. Also, while a patch " -#| "for a very specific rack tool changer exists, it has not found its way " -#| "back into the main code base." msgid "" "A good example for this deficiency is tool change support in LinuxCNC. " "While random tool changers are supported well, it is next to impossible to " @@ -249727,13 +249617,6 @@ msgstr "" #. type: Plain text #: src/remap/remap.adoc:45 -#, fuzzy -#| msgid "" -#| "However, many of these things may be fixed by using an O-word procedure " -#| "instead of a built in code - whenever the - insufficient - built in code " -#| "is to be executed, call the O-word procedure instead. While possible, it " -#| "is cumbersome - it requires source-editing of NGC programs, replacing all " -#| "calls to the deficient code by a an O-word procedure call." msgid "" "However, many of these things may be fixed by using an O-word procedure " "instead of built-in code. Whenever the insufficient built-in code is to be " @@ -249742,12 +249625,12 @@ msgid "" "calls to the deficient code by an O-word procedure call." msgstr "" "Viele dieser Probleme können jedoch durch die Verwendung einer O-Wort-" -"Prozedur anstelle eines eingebauten Codes behoben werden - wann immer der - " +"Prozedur anstelle eines eingebauten Codes behoben werden. Wann immer der - " "unzureichende - eingebaute Code ausgeführt werden soll, rufen Sie " -"stattdessen die O-Wort-Prozedur auf. Dies ist zwar möglich, aber umständlich " -"- es erfordert eine Quelltextbearbeitung der NGC-Programme, wobei alle " -"Aufrufe des mangelhaften Codes durch einen Aufruf einer O-Wort-Prozedur " -"ersetzt werden müssen." +"stattdessen die O-Wort-Prozedur auf. Diese Vorgehen ist zwar möglich, aber " +"umständlich - es erfordert eine Quelltextbearbeitung der NGC-Programme, " +"wobei alle Aufrufe des mangelhaften Codes durch einen Aufruf einer O-Wort-" +"Prozedur ersetzt werden müssen." #. type: Plain text #: src/remap/remap.adoc:48 @@ -262539,10 +262422,9 @@ msgstr "PI500_VFD" #: man/man9/toggle2nist.9:10 man/man9/toggle.9:10 man/man9/tristate_bit.9:10 #: man/man9/tristate_float.9:10 man/man9/updown.9:10 man/man9/userkins.9:10 #: man/man9/wcomp.9:10 man/man9/xhc_hb04_util.9:10 man/man9/xor2.9:10 -#, fuzzy, no-wrap -#| msgid "03/24/2025" +#, no-wrap msgid "01/07/2026" -msgstr "03/24/2025" +msgstr "01/07/2026" #. type: TH #: man/man1/pi500_vfd.1:10 man/man1/thermistor.1:10 man/man1/wj200_vfd.1:10 @@ -276171,10 +276053,8 @@ msgstr "" #. type: Plain text #: man/man9/plasmac.9:41 -#, fuzzy -#| msgid "14" msgid "014" -msgstr "14" +msgstr "014" #. type: SS #: man/man9/plasmac.9:41 @@ -276758,17 +276638,13 @@ msgstr "" #. type: Plain text #: man/man9/plasmac.9:306 -#, fuzzy -#| msgid "B\\&.B float in" msgid "B\\&.B float in" -msgstr "B\\&.B float in" +msgstr "B\\&.B float in" #. type: Plain text #: man/man9/plasmac.9:308 -#, fuzzy -#| msgid "cut height (machine units)" msgid "material thickness (machine units)" -msgstr "Schnitthöhe (Maschineneinheiten)" +msgstr "Materialstärke (Maschineneinheiten)" #. type: Plain text #: man/man9/plasmac.9:311 @@ -276777,10 +276653,8 @@ msgstr "B\\&.B s32 in (Voreinstellung: I<5>)" #. type: Plain text #: man/man9/plasmac.9:313 -#, fuzzy -#| msgid "maximum height offset" msgid "maximum height offset (mm)" -msgstr "maximaler Höhenversatz" +msgstr "maximaler Höhenversatz (mm)" #. type: Plain text #: man/man9/plasmac.9:316 From 010c12a97af9269cb0c722ab53b5fac20f8170b1 Mon Sep 17 00:00:00 2001 From: Temuri Doghonadze Date: Sat, 31 Jan 2026 23:29:39 +0100 Subject: [PATCH 2/9] Translated using Weblate (Georgian) Currently translated at 1.5% (542 of 33994 strings) Author: Temuri Doghonadze Co-authored-by: Temuri Doghonadze Translate-URL: https://hosted.weblate.org/projects/linuxcnc/linuxcnc-docs/ka/ Translation: LinuxCNC/LinuxCNC Documentation --- docs/po/ka.po | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/docs/po/ka.po b/docs/po/ka.po index 8e1d106ac97..1e23c7e4039 100644 --- a/docs/po/ka.po +++ b/docs/po/ka.po @@ -7,7 +7,7 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: emc-developers@lists.sourceforge.net\n" "POT-Creation-Date: 2026-01-29 16:34+0000\n" -"PO-Revision-Date: 2026-01-02 16:42+0000\n" +"PO-Revision-Date: 2026-01-31 14:15+0000\n" "Last-Translator: Temuri Doghonadze \n" "Language-Team: none\n" "Language: ka\n" @@ -15,7 +15,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 5.15.1\n" +"X-Generator: Weblate 5.16-dev\n" #. vim: set syntax=asciidoc: #. type: Attribute :lang: @@ -56892,10 +56892,9 @@ msgstr "" #. type: Index entry #: src/getting-started/getting-linuxcnc.adoc:228 #: src/getting-started/getting-linuxcnc.adoc:235 -#, fuzzy, no-wrap -#| msgid "LinuxCNC" +#, no-wrap msgid "Updates to LinuxCNC" -msgstr "LinuxCNC" +msgstr "LinuxCNC-ის განახლებები" #. type: Plain text #: src/getting-started/getting-linuxcnc.adoc:235 From 22469d034849e82f42437a3481b281337652babb Mon Sep 17 00:00:00 2001 From: Tron Lee <472734894@qq.com> Date: Sat, 31 Jan 2026 23:29:42 +0100 Subject: [PATCH 3/9] Translated using Weblate (Chinese (Simplified Han script)) Currently translated at 1.3% (450 of 33994 strings) Author: Tron Lee <472734894@qq.com> Co-authored-by: Tron Lee <472734894@qq.com> Translate-URL: https://hosted.weblate.org/projects/linuxcnc/linuxcnc-docs/zh_Hans/ Translation: LinuxCNC/LinuxCNC Documentation --- docs/po/zh_CN.po | 31 ++++++++++--------------------- 1 file changed, 10 insertions(+), 21 deletions(-) diff --git a/docs/po/zh_CN.po b/docs/po/zh_CN.po index 2df97c10952..5eb5338fe28 100644 --- a/docs/po/zh_CN.po +++ b/docs/po/zh_CN.po @@ -29,8 +29,8 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: emc-developers@lists.sourceforge.net\n" "POT-Creation-Date: 2026-01-29 16:34+0000\n" -"PO-Revision-Date: 2026-01-21 23:15+0000\n" -"Last-Translator: BeginsDuang \n" +"PO-Revision-Date: 2026-01-31 14:15+0000\n" +"Last-Translator: Tron Lee <472734894@qq.com>\n" "Language-Team: none\n" "Language: zh_CN\n" "MIME-Version: 1.0\n" @@ -128178,10 +128178,9 @@ msgstr "" #. type: Title == #: src/hal/intro.adoc:97 -#, fuzzy, no-wrap -#| msgid "Configuration" +#, no-wrap msgid "Communication" -msgstr "配置" +msgstr "通信" #. type: Plain text #: src/hal/intro.adoc:100 @@ -147613,10 +147612,8 @@ msgstr "" #. type: Plain text #: src/man/man1/halrmt.1.adoc:203 -#, fuzzy -#| msgid "Start QCAD" msgid "Start" -msgstr "启动QCAD" +msgstr "启动" #. type: Plain text #: src/man/man1/halrmt.1.adoc:205 @@ -212777,10 +212774,9 @@ msgstr "" #. type: Title == #: README.adoc:22 -#, fuzzy, no-wrap -#| msgid "Notes on LinuxCNC documentation:" +#, no-wrap msgid "Notes on LinuxCNC documentation" -msgstr "关于 ‎‎LinuxCNC‎‎ 文档的说明:" +msgstr "关于 ‎‎LinuxCNC‎‎ 文档的说明" #. type: Plain text #: README.adoc:27 @@ -212852,13 +212848,6 @@ msgstr "" #. type: Plain text #: README.adoc:57 -#, fuzzy -#| msgid "" -#| "Once exported, the arrowheads lose their relationship with the line they " -#| "are on, and need to be moved and/or rotated manually if the line is " -#| "moved. I believe that even if they were imported back into EasyCad, the " -#| "line/arrow connection would remain broken. New lines with arrowheads can " -#| "be created in Qcad with the 'leader' dimension tool." msgid "" "Once exported, the arrowheads lose their relationship with the line they are " "on, and need to be moved and/or rotated manually if the line is moved. I " @@ -212866,9 +212855,9 @@ msgid "" "connection would remain broken. New lines with arrowheads can be created in " "QCAD with the 'leader' dimension tool." msgstr "" -"导出后,箭头将失去与所在行的关系,如果移动了线,则需要手动移动和/或旋转箭头。" -"我相信,即使将它们导入回EasyCad,线/箭头连接也会断开。可以使用“引线”尺寸工具" -"在 Qcad 中创建带有箭头的新线。 " +" 一旦导出,箭头就会失去与它们所在线条的关系,如果线条被移动,就需要手动移动" +"和/或旋转箭头。我认为,即使它们被重新导入到EasyCad中,线条/箭头的连接也会保持" +"断开状态。在QCAD中,可以使用“引线”尺寸工具创建带有箭头的新线条。" #. type: Plain text #: README.adoc:64 From 2348c6ffa39f5892bf2ec29898fe8ecabf6f9679 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Salvador=20Pe=C3=B1a?= Date: Sat, 31 Jan 2026 23:29:47 +0100 Subject: [PATCH 4/9] Translated using Weblate (Spanish) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 22.5% (7668 of 33994 strings) Author: Salvador Peña Translated using Weblate (Spanish) Currently translated at 22.4% (7625 of 33994 strings) Author: Salvador Peña Co-authored-by: Salvador Peña Translate-URL: https://hosted.weblate.org/projects/linuxcnc/linuxcnc-docs/es/ Translation: LinuxCNC/LinuxCNC Documentation --- docs/po/es.po | 534 ++++++++++++++++++++++++-------------------------- 1 file changed, 251 insertions(+), 283 deletions(-) diff --git a/docs/po/es.po b/docs/po/es.po index 56cf5cfda5a..d9e0304cd8a 100644 --- a/docs/po/es.po +++ b/docs/po/es.po @@ -14,7 +14,7 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: emc-developers@lists.sourceforge.net\n" "POT-Creation-Date: 2026-01-29 16:34+0000\n" -"PO-Revision-Date: 2026-01-27 03:30+0000\n" +"PO-Revision-Date: 2026-01-31 22:29+0000\n" "Last-Translator: Salvador Peña \n" "Language-Team: LANGUAGE \n" "Language: es\n" @@ -11166,7 +11166,7 @@ msgstr "" #. type: delimited block - #: src/gui/gui-dev-reference.adoc:69 src/gui/axis.adoc:52 -#, fuzzy, no-wrap +#, no-wrap msgid "" "[DISPLAY]\n" "CYCLE_TIME = 100\n" @@ -14612,7 +14612,6 @@ msgstr "" #: src/common/linux-faq.adoc:57 src/drivers/mb2hal.adoc:169 #: src/gcode/overview.adoc:660 src/gui/axis.adoc:1008 #: src/man/man1/mb2hal.1.adoc:79 -#, fuzzy msgid "Example:" msgstr "Ejemplo:" @@ -16655,9 +16654,9 @@ msgstr "" #. type: Title ==== #: src/config/core-components.adoc:323 src/gui/axis.adoc:36 #: src/gui/qtvcp-widgets.adoc:3266 -#, fuzzy, no-wrap +#, no-wrap msgid "INI settings" -msgstr "INI settings" +msgstr "Configuraciones de INI" #. type: Plain text #: src/config/core-components.adoc:326 @@ -52455,7 +52454,7 @@ msgstr "CMS" #: src/gcode/g-code.adoc:1589 src/gcode/overview.adoc:142 src/gui/axis.adoc:650 #, no-wrap msgid "R" -msgstr "" +msgstr "R" #. type: Table #: src/gcode/g-code.adoc:1589 @@ -56192,7 +56191,7 @@ msgstr "" #: src/plasma/qtplasmac.adoc:693 #, no-wrap msgid "P" -msgstr "" +msgstr "P" #. type: Content of:
#: html/gcode.html:60 @@ -58750,7 +58749,7 @@ msgstr "Cambio de herramienta" #. type: Title == #: src/gcode/m-code.adoc:153 src/gui/axis.adoc:711 -#, fuzzy, no-wrap +#, no-wrap msgid "Manual Tool Change" msgstr "Cambio manual de herramienta" @@ -62441,9 +62440,9 @@ msgstr "Índice de desplazamiento de la longitud de la herramienta" #. type: Table #: src/gcode/overview.adoc:131 src/gui/axis.adoc:640 #: src/motion/pid-theory.adoc:158 src/motion/pid-theory.adoc:181 -#, fuzzy, no-wrap +#, no-wrap msgid "I" -msgstr "IO" +msgstr "I" #. type: Table #: src/gcode/overview.adoc:132 @@ -62520,9 +62519,9 @@ msgstr "" #. type: Table #: src/gcode/overview.adoc:138 src/gui/axis.adoc:648 #: src/plasma/qtplasmac.adoc:2576 -#, fuzzy, no-wrap +#, no-wrap msgid "O" -msgstr "IO" +msgstr "O" #. type: Table #: src/gcode/overview.adoc:139 @@ -62558,7 +62557,7 @@ msgstr "Radio del arco o plano del ciclo fijo" #: src/gcode/overview.adoc:143 src/gui/axis.adoc:652 #, no-wrap msgid "S" -msgstr "" +msgstr "S" #. type: Table #: src/gcode/overview.adoc:144 @@ -62894,7 +62893,7 @@ msgstr "" #: src/gcode/overview.adoc:244 src/gcode/overview.adoc:518 #: src/gcode/overview.adoc:540 src/gui/axis.adoc:633 src/gui/halui.adoc:248 #: src/man/man1/halui.1.adoc:143 src/plasma/qtplasmac.adoc:97 -#, fuzzy, no-wrap +#, no-wrap msgid "Mode" msgstr "Modo" @@ -72370,33 +72369,32 @@ msgstr "" #. type: Index entry #: src/gui/axis.adoc:5 src/gui/axis.adoc:14 -#, fuzzy, no-wrap +#, no-wrap msgid "AXIS GUI" -msgstr "GUI AXIS " +msgstr "GUI AXIS" #. type: Plain text #: src/gui/axis.adoc:20 -#, fuzzy msgid "" "AXIS is a graphical front-end for LinuxCNC which features a live preview and " "backplot. It is written in Python and uses Tk and OpenGL to display its user " "interface." msgstr "" "AXIS es una interfaz gráfica para LinuxCNC que cuenta con vista previa y " -"backplot. Está escrito en Python y utiliza Tk y OpenGL para mostrar la " -"interfaz de usuario." +"trazo posterior. Está escrito en Python y utiliza Tk y OpenGL para mostrar " +"la interfaz de usuario." #. type: Block title #: src/gui/axis.adoc:22 -#, fuzzy, no-wrap +#, no-wrap msgid "The AXIS Window" -msgstr "La Ventana de AXIS" +msgstr "La ventana de AXIS" #. type: Positional ($1) AttributeList argument for macro 'image' #: src/gui/axis.adoc:23 -#, fuzzy, no-wrap +#, no-wrap msgid "AXIS main window" -msgstr "Ventana Principal AXIS" +msgstr "Ventana principal de AXIS" #. type: Target for macro image #: src/gui/axis.adoc:23 @@ -72412,19 +72410,17 @@ msgstr "Primeros pasos" #. type: Plain text #: src/gui/axis.adoc:30 -#, fuzzy msgid "" "If your configuration is not currently set up to use AXIS, you can change it " "by editing the .ini file (INI file). In the section `[DISPLAY]` change the " "`[DISPLAY]` line to read `DISPLAY = axis`." msgstr "" -"Si su configuración no está configurada actualmente para usar AXIS, puede " -"cambiarlo editando el archivo .ini. En la sección '[DISPLAY]' indiquelo con " -"la linea 'DISPLAY = axis'." +"Si la configuración no está preparada actualmente para usar AXIS, se puede " +"cambiar editando el archivo .ini (archivo INI). En la sección `[DISPLAY]` " +"cambiar la línea a `DISPLAY = axis`." #. type: Plain text #: src/gui/axis.adoc:32 -#, fuzzy msgid "" "The sample configuration 'sim/axis.ini' is already configured to use AXIS as " "its front-end." @@ -72434,24 +72430,24 @@ msgstr "" #. type: Plain text #: src/gui/axis.adoc:35 -#, fuzzy msgid "" "When AXIS starts, a window like the one in the figure <> " "above opens." msgstr "" -"When AXIS starts, a window like the one in the figure <> " -"above opens." +"Al iniciar AXIS se abrirá una ventana como la de la figura <> de arriba." #. type: Plain text #: src/gui/axis.adoc:42 -#, fuzzy msgid "" "For more information on INI file settings that can change how AXIS works see " "the <> and the <> of the INI Configuration Chapter." msgstr "" -"For more information on ini file settings that can change how AXIS works see " -"the <> of the INI Configuration Chapter." +"Para más información sobre las configuraciones del archivo INI que modifican " +"el funcionamiento de AXIS ver la <> y " +"la <> del capítulo Configuración de " +"INI." #. type: Plain text #: src/gui/axis.adoc:47 @@ -72471,70 +72467,69 @@ msgid "" "initial part of the program is drawn in the graphical display. Specifying 0 " "or leaving the setting out results in no timeout." msgstr "" +"'PREVIEW_TIMEOUT' - Establece el tiempo de espera en segundos para cargar la " +"vista previa de código G. Si el análisis gramatical del código G tarda más " +"que este valor, se mostrará una advertencia y solo se mostrará en el área de " +"visualización gráfica la parte inicial del programa. Especificar 0 o nada " +"significa sin tiempo de espera." #. type: delimited block - #: src/gui/axis.adoc:64 -#, fuzzy, no-wrap +#, no-wrap msgid "" "[DISPLAY]\n" "PREVIEW_TIMEOUT = 5\n" msgstr "" "[DISPLAY]\n" -"CYCLE_TIME = 100\n" +"PREVIEW_TIMEOUT = 5\n" #. type: Title === #: src/gui/axis.adoc:66 -#, fuzzy, no-wrap +#, no-wrap msgid "A Typical Session" msgstr "Una sesión típica" #. type: Plain text #: src/gui/axis.adoc:69 -#, fuzzy msgid "Launch LinuxCNC and select a configuration file." -msgstr "Inicie LinuxCNC and select a configuration file." +msgstr "Iniciar LinuxCNC y seleccionar un archivo de configuración." #. type: Plain text #: src/gui/axis.adoc:70 -#, fuzzy msgid "Release the E-STOP button (F1) and turn the Machine Power on (F2)." -msgstr "Reinicie E-STOP (F1) y encienda la alimentación de la máquina (F2)." +msgstr "" +"Liberar el botón E-STOP (F1) y encender la alimentación de la máquina (F2)." #. type: Plain text #: src/gui/axis.adoc:71 -#, fuzzy msgid "Home all axes." -msgstr "Haga Homing de todos los ejes." +msgstr "Llevar a casa todos los ejes." #. type: Plain text #: src/gui/axis.adoc:72 -#, fuzzy msgid "Load the G-code file." -msgstr "Cargue el archivo g-code." +msgstr "Cargar el archivo de código G." #. type: Plain text #: src/gui/axis.adoc:73 -#, fuzzy msgid "Use the preview plot to verify that the program is correct." msgstr "" -"Utilice el gráfico de vista previa para verificar que el programa es " +"Utilizar el gráfico de vista previa para verificar que el programa está " "correcto." #. type: Plain text #: src/gui/axis.adoc:74 -#, fuzzy msgid "Load the material." -msgstr "Cargue el material." +msgstr "Montar el material." #. type: Plain text #: src/gui/axis.adoc:76 -#, fuzzy msgid "" "Set the proper offset for each axis by jogging and using the `Touch Off` " "button as needed." msgstr "" -"Establezca el offset adecuado para cada eje haciendo jogging y usando la " -"tecla Touch Off según sea necesario." +"Establecer el offset adecuado para cada eje trotando y usando la tecla " +"`Touch Off` según sea necesario." #. type: Plain text #: src/gui/axis.adoc:77 src/gui/tklinuxcnc.adoc:56 @@ -72543,23 +72538,20 @@ msgstr "Ejecutar el programa." #. type: Plain text #: src/gui/axis.adoc:79 -#, fuzzy msgid "" "To machine the same file again, return to step 6. To machine a different " "file, return to step 4." msgstr "" -"To machine the same file again, return to step 6. To machine a different " -"file, return to step 4." +"Para maquinar el mismo archivo otra vez regresar al paso 6. Para maquinar " +"otro archivo regresar al paso 4." #. type: Plain text #: src/gui/axis.adoc:80 -#, fuzzy msgid "When the job is complete, exit AXIS." -msgstr "When the job is complete, exit AXIS." +msgstr "Al terminar el trabajo salir AXIS." #. type: NOTE #: src/gui/axis.adoc:87 -#, fuzzy msgid "" "To run the same program again depends on your setup and requirements. You " "might need to load more material and set offsets or move over and set an " @@ -72567,29 +72559,27 @@ msgid "" "might need to only run the program again. See the <> for more information on the run command." msgstr "" -"Ejecutar el mismo programa de nuevo dependera de su configuración y " -"requisitos. Es posible que deba cargar más material y establecer offsets o " -"desplazarse y establecer un nuevo offset y luego ejecutar el programa de " -"nuevo. Si la ubicacion del material es siempre la misma, entonces es posible " -"que solo tenga que volver a ejecutar el programa. Ver la seccion <> para obtener más información sobre el comando de " -"ejecución." +"Ejecutar el mismo programa de nuevo dependerá de su configuración y " +"requisitos. Es posible que se deba cargar más material y establecer offsets " +"o desplazarse y establecer un nuevo offset y luego ejecutar el programa de " +"nuevo. Si la ubicación del material es siempre la misma, entonces es posible " +"que solo se tenga que volver a ejecutar el programa. Ver la sección " +"<> para obtener más información sobre el " +"comando de ejecución." #. type: Title == #: src/gui/axis.adoc:88 -#, fuzzy, no-wrap +#, no-wrap msgid "AXIS Window" msgstr "Pantalla AXIS" #. type: NOTE #: src/gui/axis.adoc:91 -#, fuzzy msgid "The AXIS window contains the following elements:" -msgstr "La ventana de AXIS contiene los siguientes elementos:" +msgstr "La ventana de AXIS contiene los elementos siguientes:" #. type: NOTE #: src/gui/axis.adoc:93 -#, fuzzy msgid "A display area that shows one of the following:" msgstr "Un área de visualización que muestra uno de los siguientes elementos:" @@ -72601,100 +72591,92 @@ msgid "" "will display the path the CNC machine has moved through, called the " "'backplot'." msgstr "" -"Ana vista previa del archivo cargado (en este caso, 'axis.ngc'), así como la " +"Una vista previa del archivo cargado (en este caso, 'axis.ngc'), así como la " "ubicación actual del 'punto controlado' de la máquina CNC. Más adelante, " "esta área mostrará el camino por el que la máquina CNC se ha movido, llamado " -"'backplot'." +"'trazo posterior' ('backplot')." #. type: NOTE #: src/gui/axis.adoc:98 -#, fuzzy msgid "A large readout showing the current position and all offsets." -msgstr "una lector grande que muestra la posición actual y todos los offsets." +msgstr "" +"Un lector de salida grande que muestra la posición actual y todos los " +"offsets." #. type: NOTE #: src/gui/axis.adoc:99 -#, fuzzy msgid "A menu bar and toolbar that allow you to perform various actions" msgstr "" -"Una barra de menús y una barra de herramientas que le permiten realizar " -"varias acciones" +"Una barra de menús y una barra de herramientas que permiten realizar varias " +"acciones" #. type: NOTE #: src/gui/axis.adoc:102 -#, fuzzy msgid "" "'Manual Control Tab' - which allows you to make the machine move, turn the " "spindle on or off, and turn the coolant on or off if included in the INI " "file." msgstr "" -"Una pestaña de 'control manual (F3)' - que te permite mover la máquina, " -"encender o apagar el husillo y el refrigerante, si se incluye en el archivo " -"ini." +"Pestaña de 'Control manual (F3)' - que permite mover la máquina, encender o " +"apagar el husillo, y el refrigerante si se incluye en el archivo INI." #. type: NOTE #: src/gui/axis.adoc:105 -#, fuzzy msgid "" "'MDI Tab' - where G-code programs can be entered manually, one line at a " "time. This also shows the 'Active G-codes' which shows which modal G-codes " "are in effect." msgstr "" -"Una pestaña 'MDI' - donde los programas con código G se pueden ingresar " +"Pestaña 'MDI' - donde los programas en código G se pueden ingresar " "manualmente, una línea a la vez. También muestra los 'Códigos G activos' que " "son los códigos G modales en vigor." #. type: NOTE #: src/gui/axis.adoc:109 -#, fuzzy msgid "" "'Feed Override' - which allows you to scale the speed of programmed " "motions. The default maximum is 120% and can be set to a different value in " "the INI file. See the <> of the INI " "file for more information." msgstr "" -"'Feed Override' - que le permite escalar la velocidad de los movimientos " +"'Ajustar avance' - que permite escalar la velocidad de los movimientos " "programados. El máximo predeterminado es 120% y se puede configurar a un " -"valor diferente en el archivo ini. Consulte la <> del archivo INI para más información." +"valor diferente en el archivo INI. Consultar la <> del archivo INI para más información." #. type: NOTE #: src/gui/axis.adoc:110 -#, fuzzy msgid "" "'Spindle Override' - which allows you to scale the spindle speed up or down." msgstr "" -"'Spindle Override' - que le permite escalar la velocidad del husillo hacia " +"'Ajustar Husillo' - que permite escalar la velocidad del husillo hacia " "arriba o hacia abajo." #. type: NOTE #: src/gui/axis.adoc:112 -#, fuzzy msgid "" "'Jog Speed' - which allows you to set the jog speed within the limits set in " "the INI file. See the <> of the INI " "file for more information." msgstr "" -"'Jog Speed' - que te permite configurar la velocidad de jog dentro de los " -"límites establecidos en el archivo ini. Ver la " -"<> del archivo INI para " -"obtener más información." +"'Velocidad Jog' - que permite configurar la velocidad de trote dentro de los " +"límites establecidos en el archivo INI. Ver la " +"<> del archivo INI para obtener más " +"información." #. type: NOTE #: src/gui/axis.adoc:114 -#, fuzzy msgid "" "'Max Velocity' - which allows you to restrict the maximum velocity of all " "programmed motions (except spindle synchronized motion)." msgstr "" -"'Velocidad máxima' - que le permite restringir la velocidad máxima de todos " -"los movimientos programados (excepto movimiento sincronizados del husillo)." +"'Velocidad máxima' - que permite restringir la velocidad máxima de todos los " +"movimientos programados (excepto movimiento sincronizado del husillo)." #. type: NOTE #: src/gui/axis.adoc:115 -#, fuzzy msgid "A text display area that shows the loaded G-code." -msgstr "Una zona de visualización de texto que muestra el G-Code cargado." +msgstr "Una zona de visualización de texto que muestra el código G cargado." #. type: NOTE #: src/gui/axis.adoc:119 @@ -72711,25 +72693,24 @@ msgstr "" #. type: Title === #: src/gui/axis.adoc:120 -#, fuzzy, no-wrap +#, no-wrap msgid "Menu Items" msgstr "Elementos del menú" #. type: NOTE #: src/gui/axis.adoc:125 -#, fuzzy msgid "" "Some menu items might be grayed out depending on how you have your INI file " "configured. For more information on configuration see the <>." msgstr "" -"Algunos elementos del menú pueden estar en gris dependiendo de cómo tenga su " -"archivo .ini configurado. Para más información sobre configuración vea el " +"Algunos elementos del menú pueden estar en gris dependiendo de cómo este " +"configurado el archivo INI. Para más información sobre configuración ver el " "<>." #. type: Title ==== #: src/gui/axis.adoc:126 -#, fuzzy, no-wrap +#, no-wrap msgid "File Menu" msgstr "Menú Archivo" @@ -72749,7 +72730,6 @@ msgstr "" #. type: NOTE #: src/gui/axis.adoc:133 -#, fuzzy msgid "'Recent Files' - Displays a list of recently opened files." msgstr "" "'Archivos recientes' - muestra una lista de los archivos abiertos " @@ -72757,48 +72737,44 @@ msgstr "" #. type: NOTE #: src/gui/axis.adoc:136 -#, fuzzy msgid "" "'Edit...' - Open the current G-code file for editing if you have an editor " "configured in your INI file. See the <> " "for more information on specifying an editor to use." msgstr "" -"'Editar ...' - abre el archivo de código G actual para editarlo si tienes un " -"editor configurado en su archivo ini. Consulte la sección " +"'Editar ...' - abre el archivo de código G actual para editarlo si se tiene " +"un editor configurado en el archivo INI. Consultar la sección " "<> para obtener más información sobre " "la especificación del editor a usar." #. type: NOTE #: src/gui/axis.adoc:140 -#, fuzzy msgid "" "'Reload' - Reload the current G-code file. If you edited it you must reload " "it for the changes to take affect. If you stop a file and want to start from " "the beginning then reload the file. The toolbar reload is the same as the " "menu." msgstr "" -"'Recargar' - vuelve a cargar el archivo de código g actual. Si lo edita, " -"debe recargarlo para que los cambios se actualizen. Si detiene un archivo y " -"quiere empezar desde el principio, vuelva a cargar el archivo. La recarga de " -"la barra de herramientas es la misma qu la del menu." +"'Recargar' - vuelve a cargar el archivo de código G actual. Si se editó, se " +"debe recargar para que los cambios surtan efecto. Si se detiene un archivo y " +"se quiere empezar desde el principio, volver a cargar el archivo. La recarga " +"de la barra de herramientas es la misma que la del menú." #. type: NOTE #: src/gui/axis.adoc:141 -#, fuzzy msgid "'Save G-code as...' - Save the current file with a new name." msgstr "" -"'Guardar gcode como ...' - Guarda el archivo actual con un nuevo nombre." +"'Guardar código G como ...' - Guarda el archivo actual con un nombre nuevo." #. type: NOTE #: src/gui/axis.adoc:144 -#, fuzzy msgid "" "'Properties' - The sum of the rapid and feed moves. Does not factor in " "acceleration, blending or path mode so time reported will never be less than " "the actual run time." msgstr "" -"'Propiedades' - la suma de los movimientos rápidos y de avance. No tiene en " -"cuenta modos de aceleración, fusion o ruta para que el tiempo reportado " +"'Propiedades' - La suma de los movimientos rápidos y de avance. No tiene en " +"cuenta modos de aceleración, fusión o ruta para que el tiempo reportado " "nunca sea menor que el tiempo de ejecución real." #. type: NOTE @@ -72807,60 +72783,55 @@ msgid "" "'Edit tool table...' - Same as Edit if you have defined an editor you can " "open the tool table and edit it." msgstr "" -"'Editar tabla de herramientas ...' - Igual que Editar si ha definido un " -"editor. Puede abrir la tabla de herramientas y editarla." +"'Editar datos de herramienta ...' - Igual que Editar, si se ha definido un " +"editor, se puede abrir la tabla de herramientas y editarla." #. type: NOTE #: src/gui/axis.adoc:147 -#, fuzzy msgid "'Reload tool table' - After editing the tool table you must reload it." msgstr "" -"'Recargar tabla de herramientas' - después de editar la tabla de " -"herramientas, debe volve a cargarla." +"'Recargar datos de herramienta' - Después de editar la tabla de herramientas " +"se debe volver a cargarla." #. type: NOTE #: src/gui/axis.adoc:149 -#, fuzzy msgid "" "'Ladder editor' - If you have loaded ClassicLadder you can edit it from " "here. See the <> for more " "information." msgstr "" -"'Editor Ladder' - Si has cargado Classic Ladder puedes editarlo desde aquí. " -"Vea el capítulo Classicladder para más información." +"'Editor Ladder' - Si se ha cargado ClassicLadder, se puede editar desde " +"aquí. Ver el capítulo Classicladder para más información." #. type: NOTE #: src/gui/axis.adoc:150 -#, fuzzy msgid "'Quit' - Terminates the current LinuxCNC session." msgstr "'Salir' - Termina la sesión actual de LinuxCNC." #. type: Title ==== #: src/gui/axis.adoc:152 -#, fuzzy, no-wrap +#, no-wrap msgid "Machine Menu" -msgstr "Menú de Máquina" +msgstr "Menú Máquina" #. type: NOTE #: src/gui/axis.adoc:155 -#, fuzzy msgid "'Toggle Emergency Stop F1' - Change the state of the Emergency Stop." msgstr "" -"'Toggle Emergency Stop F1'- cambia el estado de la parada de emergencia." +"'Conmutar parada de Emergencia F1'- Cambia el estado de la parada de " +"emergencia." #. type: NOTE #: src/gui/axis.adoc:156 -#, fuzzy msgid "" "'Toggle Machine Power F2' - Change the state of the Machine Power if the " "Emergency Stop is not on." msgstr "" -"'Toggle Machine Power F2' - Cambiar el estado de encendido de la máquina si " -"la parada de emergencia no está encendida." +"'Conmutar encendido de Máquina F2' - Cambia el estado de encendido de la " +"máquina si la parada de emergencia no está encendida." #. type: NOTE #: src/gui/axis.adoc:157 -#, fuzzy msgid "'Run Program' - Run the currently loaded program from the beginning." msgstr "" "'Ejecutar programa'- Ejecuta el programa actualmente cargado desde el " @@ -72868,67 +72839,60 @@ msgstr "" #. type: NOTE #: src/gui/axis.adoc:160 -#, fuzzy msgid "" "'Run From Selected Line' - Select the line you want to start from first. " "Use with caution as this will move the tool to the expected position before " "the line first then it will execute the rest of the code." msgstr "" -"'Ejecutar desde la línea seleccionada' - seleccione la línea desde la que " -"desea comenzar. Use con precaución ya que esto moverá la herramienta a la " -"posición esperada en la línea y luego se ejecutará el resto del código." +"'Ejecutar desde línea seleccionada' - Selecciona la línea desde la que desea " +"comenzar. Usarla con precaución ya que esto moverá primero la herramienta a " +"la posición esperada antes de la línea y luego se ejecutará el resto del " +"código." #. type: WARNING #: src/gui/axis.adoc:163 -#, fuzzy msgid "" "Do not use 'Run From Selected Line' if your G-code program contains " "subroutines." msgstr "" -"No use 'Ejecutar desde la línea seleccionada' si su programa de código g " +"No usar 'Ejecutar desde línea seleccionada' si el programa de código G " "contiene subrutinas." #. type: WARNING #: src/gui/axis.adoc:165 -#, fuzzy msgid "'Step' - Single step through a program." -msgstr "'Step' - Un solo paso a través de un programa." +msgstr "'Paso de programa' - Un solo paso a través de un programa." #. type: WARNING #: src/gui/axis.adoc:166 -#, fuzzy msgid "'Pause' - Pause a program." msgstr "'Pausa' - Pausa un programa." #. type: WARNING #: src/gui/axis.adoc:167 -#, fuzzy msgid "'Resume' - Resume running from a pause." -msgstr "'Resume' - reanudar la ejecución de una pausa." +msgstr "'Reanudar' - Reanuda la ejecución pausada." #. type: WARNING #: src/gui/axis.adoc:168 -#, fuzzy msgid "" "'Stop' - Stop a running program. When run is selected after a stop the " "program will start from the beginning." msgstr "" -"'Stop' - Detiene un programa en ejecución. Cuando se selecciona ejecutar " +"'Detener' - Detiene un programa en ejecución. Cuando se selecciona ejecutar " "después de una parada, el programa comenzará desde el principio." #. type: WARNING #: src/gui/axis.adoc:169 -#, fuzzy msgid "" "'Stop at M1' - If an M1 is reached, and this is checked, program execution " "will stop on the M1 line. Press Resume to continue." msgstr "" -"'Stop en M1' - Si se alcanza un M1, y esto esta activo, la ejecución del " -"programa parará en la línea M1. Presione Resume para continuar." +"'Parar en M1' - Si se alcanza un M1, y este esta activo, la ejecución del " +"programa parará en la línea M1. Presionar Reanudar para continuar." #. type: WARNING #: src/gui/axis.adoc:170 -#, fuzzy msgid "" "'Skip lines with \"/\"' - If a line begins with '/' and this is checked, the " "line will be skipped." @@ -72938,110 +72902,97 @@ msgstr "" #. type: WARNING #: src/gui/axis.adoc:171 -#, fuzzy msgid "'Clear MDI history' - Clears the MDI history window." -msgstr "'Borrar historial de MDI': borra la ventana del historial de MDI." +msgstr "'Borrar historial MDI' - Borra la ventana del historial de MDI." #. type: WARNING #: src/gui/axis.adoc:172 -#, fuzzy msgid "'Copy from MDI history' - Copies the MDI history to the clipboard" -msgstr "" -"'Copiar desde el historial de MDI': copia el historial MDI al portapapeles" +msgstr "'Copiar desde historial MDI' - Copia el historial MDI al portapapeles" #. type: WARNING #: src/gui/axis.adoc:173 -#, fuzzy msgid "" "'Paste to MDI history' - Paste from the clipboard to the MDI history window" msgstr "" -"'Pegar al historial de MDI' - Pegar desde el portapapeles a la ventana del " +"'Pegar en historial MDI' - Pegar desde el portapapeles a la ventana del " "historial MDI" #. type: WARNING #: src/gui/axis.adoc:177 -#, fuzzy msgid "" "'Calibration' - Starts the Calibration assistant (emccalib.tcl). " "Calibration reads the HAL file and for every 'setp' that uses a variable " "from the INI file that is in an [AXIS_L],[JOINT_N],[SPINDLE_S], or [TUNE] " "section it creates an entry that can be edited and tested." msgstr "" -"'Calibración': inicia el asistente de calibración (emccalib.tcl). La " +"'Calibración' - Inicia el asistente de calibración (emccalib.tcl). La " "calibración lee el archivo HAL y para cada 'setp' que usa una variable del " -"archivo ini que se encuentra en las secciones [AXIS_L], [JOINT_N] o [TUNE], " -"crea una entrada que puede ser editada y probada." +"archivo INI que se encuentra en una de las secciones [AXIS_L], [JOINT_N], " +"[SPINDLE_S] o [TUNE], crea una entrada que puede ser editada y probada." #. type: WARNING #: src/gui/axis.adoc:179 -#, fuzzy msgid "" "'Show HAL Configuration' - Opens the HAL Configuration window where you can " "monitor HAL Components, Pins, Parameters, Signals, Functions, and Threads." msgstr "" -"'Mostrar configuración HAL' - abre la ventana de configuración HAL donde " -"puede monitorear componentes HAL, pines, parámetros, señales, funciones y " -"subprocesos." +"'Mostrar configuración HAL' - Abre la ventana de configuración HAL donde se " +"pueden monitorear componentes HAL, pines, parámetros, señales, funciones e " +"hilos." #. type: WARNING #: src/gui/axis.adoc:180 -#, fuzzy msgid "" "'HAL Meter' - Opens a window where you can monitor a single HAL Pin, Signal, " "or Parameter." msgstr "" -"'HAL Meter' - abre una ventana donde puede monitorear un solo Pin HAL, señal " -"o Parámetro." +"'HAL Meter' - Abre una ventana donde se puede monitorear un solo pin, señal " +"o parámetro HAL." #. type: WARNING #: src/gui/axis.adoc:181 -#, fuzzy msgid "" "'HAL Scope' - Opens a virtual oscilloscope that allows plotting HAL values " "vs. time." msgstr "" -"'HAL Scope' - abre un osciloscopio virtual que permite seguir valores HAL en " -"función del tiempo." +"'Osciloscopio HAL' - Abre un osciloscopio virtual que permite seguir valores " +"HAL en función del tiempo." #. type: WARNING #: src/gui/axis.adoc:182 -#, fuzzy msgid "'Show LinuxCNC Status' - Opens a window showing LinuxCNC's status." msgstr "" -"'Mostrar estado de LinuxCNC' - abre una ventana que muestra el estado de " +"'Mostrar estado de LinuxCNC' - Abre una ventana que muestra el estado de " "LinuxCNC." #. type: WARNING #: src/gui/axis.adoc:183 -#, fuzzy msgid "" "'Set Debug Level' - Opens a window where debug levels can be viewed and some " "can be set." msgstr "" -"'Establecer nivel de depuración' - abre una ventana donde se pueden ver los " +"'Establecer nivel de depuración' - Abre una ventana donde se pueden ver los " "niveles de depuración y se pueden configurar algunos." #. type: WARNING #: src/gui/axis.adoc:184 -#, fuzzy msgid "'Homing' - Home one or all axes." -msgstr "'Homing' - home uno o todos los ejes." +msgstr "'Homing' - Lleva a casa uno o todos los ejes." #. type: WARNING #: src/gui/axis.adoc:185 -#, fuzzy msgid "'Unhoming' - Unhome one or all axes." -msgstr "'Unhoming' - Deshacer home de uno o todos los ejes." +msgstr "'Unhoming' - Deshacer la ida a casa de uno o todos los ejes." #. [[sub:axis:tool-touch-off]] #. type: WARNING #: src/gui/axis.adoc:186 -#, fuzzy msgid "" "'Zero Coordinate System' - Set all offsets to zero in the coordinate system " "chosen." msgstr "" -"'Sistema de coordenadas cero' - establece todos los offsets a cero en el " +"'Sistema de coordenadas cero' - Establece todos los offsets a cero en el " "sistema de coordenadas elegido." #. type: Title == @@ -73052,7 +73003,6 @@ msgstr "Toque inicial de la herramienta" #. type: WARNING #: src/gui/axis.adoc:193 -#, fuzzy msgid "" "'Tool touch off to workpiece' - When performing Touch Off, the value entered " "is relative to the current workpiece ('G5x') coordinate system, as modified " @@ -73060,15 +73010,14 @@ msgid "" "coordinate for the chosen axis will become the value entered. See " "<> in the G-code chapter." msgstr "" -"'Tool touch off to workpiece' - Al realizar Touch Off, el valor ingresado es " -"relativo al sistema de coordenadas de la pieza actual ('G5x'), modificado " -"por el offset del eje ('G92'). Cuando se completa el Touch Off, la " +"'Touch off herramienta -pieza' - Al realizar Touch off, el valor ingresado " +"es relativo al sistema de coordenadas de la pieza actual ('G5x'), modificado " +"por el offset del eje ('G92'). Cuando se completa el Touch off, la " "coordenada relativa para el eje elegido se convertirá en el valor " -"ingresado. Consulte <> in the G-code " "chapter." msgstr "" -"'Tool touch off to fixture' - Al realizar Touch Off, el valor ingresado es " -"relativo al noveno ('G59.3') sistema de coordenadas, con el offset del eje " -"('G92') ignorado. Esto es útil cuando hay un accesorio para Tool touch off " -"en una ubicación fija en la máquina, con el noveno ('G59.3') sistema de " +"'Touch off herramienta - amarre' - Al realizar Touch off, el valor ingresado " +"es relativo al noveno ('G59.3') sistema de coordenadas, con el offset del " +"eje ('G92') ignorado. Esto es útil cuando hay un accesorio para Tool touch " +"off en una ubicación fija en la máquina, con el noveno ('G59.3') sistema de " "coordenadas establecido de tal manera que la punta de una herramienta de " "longitud cero esté en el origen del montaje cuando las coordenadas relativas " -"son 0. Consulte <> en el capítulo de código G." #. type: Title ==== #: src/gui/axis.adoc:200 -#, fuzzy, no-wrap +#, no-wrap msgid "View Menu" msgstr "Menú Ver" @@ -74565,7 +74514,7 @@ msgstr "Atajos de teclado más comunes(((AXIS,Keyboard Shortcuts)))" #: src/gui/axis.adoc:632 src/gui/tklinuxcnc.adoc:257 #, no-wrap msgid "Keystroke" -msgstr "Tecla" +msgstr "Teclas" #. type: Table #: src/gui/axis.adoc:632 src/gui/tklinuxcnc.adoc:258 @@ -134141,31 +134090,29 @@ msgstr "Incrementar la velocidad del husillo" #. type: Plain text #: src/gui/tklinuxcnc.adoc:88 -#, fuzzy msgid "then on the second line:" -msgstr "Agregue este código en la sección llamada:" +msgstr "después, en la segunda línea:" #. type: Plain text #: src/gui/tklinuxcnc.adoc:90 msgid "Operation mode: 'MANUAL' > 'MDI' > 'AUTO'" -msgstr "" +msgstr "Modo de operación: 'MANUAL' > 'MDI' > 'AUTO'" #. type: Plain text #: src/gui/tklinuxcnc.adoc:91 msgid "Toggle flood coolant" -msgstr "" +msgstr "Alternador de inundación de refrigerante" #. type: Plain text #: src/gui/tklinuxcnc.adoc:92 -#, fuzzy msgid "Toggle spindle brake control" -msgstr "Control de husillo(((0-10v Spindle Speed Example)))" +msgstr "Alternador de control de freno del husillo" #. type: Title === #: src/gui/tklinuxcnc.adoc:93 #, no-wrap msgid "Offset display status bar" -msgstr "" +msgstr "Barra de estado de offsets" #. type: Plain text #: src/gui/tklinuxcnc.adoc:98 @@ -134174,12 +134121,16 @@ msgid "" "with Txx M6), the tool length offset (if active), and the work offsets (set " "by right-clicking the coordinates)." msgstr "" +"La barra de estado de offsets muestra la herramienta actualmente " +"seleccionada (con Txx M6), el offset de longitud de herramienta (si esta " +"activo) y los offsets de trabajo (establecidos al hacer click derecho en las " +"coordenadas)." #. type: Title === #: src/gui/tklinuxcnc.adoc:99 -#, fuzzy, no-wrap +#, no-wrap msgid "Coordinate Display Area" -msgstr "Visualizacion de coordenadas" +msgstr "Área de visualización de coordenadas" #. type: Plain text #: src/gui/tklinuxcnc.adoc:107 @@ -134191,6 +134142,12 @@ msgid "" "TkLinuxCNC will use red letter to show that. (for example if an hardware " "limit switch is tripped)." msgstr "" +"La parte principal de la pantalla muestra la posición actual de la " +"herramienta. El color de la lectura de posición depende del estado del eje. " +"Si el eje no está en casa el eje se muestra en letras amarillas. Una vez en " +"casa se mostrará en letras verdes. Si hay un error con el eje actual, " +"TkLinuxCNC usará letras rojas para indicarlo, por ejemplo si se ha alcanzado " +"un interruptor de límite." #. type: Plain text #: src/gui/tklinuxcnc.adoc:120 @@ -134229,6 +134186,11 @@ msgid "" "robots or stewart platforms. (you can read more about kinematics in the " "Integrator Manual)." msgstr "" +"Otro grupo de botones de opción permite elegir entre las vistas " +"'articulación' y 'universal'. Estos no tienen mucho sentido en una máquina " +"normal (p. ej. cinemáticas triviales), pero son de ayuda en máquinas con " +"cinemáticas no-triviales como robots o plataformas Stewart. (puede leer más " +"acerca de cinemáticas en el Manual del integrador)." #. type: Plain text #: src/gui/tklinuxcnc.adoc:130 @@ -134236,24 +134198,25 @@ msgid "" "When the machine moves, it leaves a trail called the backplot. You can start " "the backplot window by selecting View→Backplot." msgstr "" +"Cuando hay movimiento en la máquina, deja un rastro llamado trazo posterior. " +"Se puede iniciar la ventana de trazo posterior seleccionando Ver→Backplot." #. type: Title === #: src/gui/tklinuxcnc.adoc:132 #, no-wrap msgid "TkLinuxCNC Interpreter / Automatic Program Control" -msgstr "" +msgstr "Intérprete TkLinuxCNC / Control de programa automático" #. type: Index entry #: src/gui/tklinuxcnc.adoc:135 -#, fuzzy msgid "TkLinuxCNC Interpreter" -msgstr "TkLinuxCNC" +msgstr "Intérprete TkLinuxCNC" #. type: Positional ($1) AttributeList argument for macro 'image' #: src/gui/tklinuxcnc.adoc:135 #, no-wrap msgid "TkLinuxCNC Interpreter / program control" -msgstr "" +msgstr "Intérprete TkLinuxCNC / control de programa" #. type: Target for macro image #: src/gui/tklinuxcnc.adoc:135 @@ -134263,9 +134226,9 @@ msgstr "images/tester.png" #. type: Block title #: src/gui/tklinuxcnc.adoc:137 -#, fuzzy, no-wrap +#, no-wrap msgid "Control Buttons" -msgstr "Punto de control" +msgstr "Botones de control" #. type: Plain text #: src/gui/tklinuxcnc.adoc:140 @@ -134273,36 +134236,38 @@ msgid "" "The buttons in the lower part of TkLinuxCNC are used to control the " "execution of a program:" msgstr "" +"Los botones en la parte inferior de TkLinuxCNC se usan para controlar la " +"ejecución de un programa:" #. type: Plain text #: src/gui/tklinuxcnc.adoc:142 msgid "'Open' to load a program," -msgstr "'Abrir' - para cargar un programa," +msgstr "'Abrir' para cargar un programa," #. type: Plain text #: src/gui/tklinuxcnc.adoc:143 msgid "'Verify' to check it for errors," -msgstr "" +msgstr "'Verificar' para revisar si tiene errores," #. type: Plain text #: src/gui/tklinuxcnc.adoc:144 msgid "'Run' to start the actual cutting," -msgstr "" +msgstr "'Ejecutar' para iniciar el corte real," #. type: Plain text #: src/gui/tklinuxcnc.adoc:145 msgid "'Pause' to stop it while running," -msgstr "" +msgstr "'Pausa' para detener la ejecución," #. type: Plain text #: src/gui/tklinuxcnc.adoc:146 msgid "'Resume' to resume an already paused program," -msgstr "'Resume' para reanudar la ejecución de un programa pausado," +msgstr "'Reanudar' para reanudar la ejecución de un programa pausado," #. type: Plain text #: src/gui/tklinuxcnc.adoc:147 msgid "'Step' to advance one line in the program and" -msgstr "" +msgstr "'Paso' para avanzar una línea en el programa y" #. type: Plain text #: src/gui/tklinuxcnc.adoc:149 @@ -134310,31 +134275,32 @@ msgid "" "'Optional Stop' to toggle the optional stop switch (if the button is green " "the program execution will be stopped on any M1 encountered)." msgstr "" +"'Parada opcional' para alternar el interruptor de parada opcional (si el " +"botón esta verde se detendrá la ejecución del programa al encontrar " +"cualquier M1)." #. type: Block title #: src/gui/tklinuxcnc.adoc:150 -#, fuzzy, no-wrap +#, no-wrap msgid "Text Program Display Area" msgstr "Área de visualización de texto" #. type: Plain text #: src/gui/tklinuxcnc.adoc:154 -#, fuzzy msgid "" "When the program is running, the line currently being executed is " "highlighted in white. The text display will automatically scroll to show the " "current line." msgstr "" -"Cuando el programa se está ejecutando, la línea que se está ejecutando " -"actualmente es resaltada en rojo. Si el usuario no ha seleccionado ninguna " -"línea, la pantalla de texto se desplazará automáticamente para mostrar la " -"línea actual." +"Cuando el programa está en ejecución se resalta en blanco la línea que se " +"ejecuta actualmente. El área de texto se desplazará automáticamente para " +"mostrar la línea actual." #. type: Block title #: src/gui/tklinuxcnc.adoc:157 -#, fuzzy, no-wrap +#, no-wrap msgid "Implicit keys" -msgstr "Parámetros implícitos" +msgstr "Teclas implícitas" #. type: Plain text #: src/gui/tklinuxcnc.adoc:163 @@ -134345,12 +134311,12 @@ msgid "" "The first four axes can also be moved by the keyboard arrow keys (X and Y), " "the PAGE UP and PAGE DOWN keys (Z) and the '[' and ']' keys (A/4th)." msgstr "" -"TkLinuxCNC le permite mover manualmente la máquina. Esta acción se conoce " -"como 'trotar'. Primero, seleccione el eje a mover haciendo clic en él. " -"Luego, haga clic y mantenga presionado el botón '+' o '-' dependiendo de la " +"TkLinuxCNC permite mover manualmente la máquina. A esta acción se le conoce " +"como 'trotar'. Primero, seleccionar el eje a mover haciendo clic en él. " +"Luego, hacer clic y mantenga presionado el botón '+' o '-' dependiendo de la " "dirección de movimiento deseada. Los primeros cuatro ejes también pueden " -"moverse con las teclas de flecha (X e Y), Teclas PAGE UP y PAGE DOWN (Z), y " -"las teclas '[' y ']' (A/4th)." +"moverse con el teclado, con teclas de flecha (X e Y), teclas Pág. Arriba y " +"Pág. Abajo (Z) y las teclas '[' y ']' (A/4to)." #. type: Plain text #: src/gui/tklinuxcnc.adoc:168 @@ -134361,7 +134327,7 @@ msgid "" "pressed. The available values are:" msgstr "" "Si se selecciona 'Continuo', el movimiento continuará mientras el botón o la " -"tecla se presiona. Si se selecciona otro valor, la máquina se moverá " +"tecla esta presionado(a). Si se selecciona otro valor, la máquina se moverá " "exactamente la distancia mostrada cada vez que se hace clic en el botón o se " "presiona la tecla. Los valores disponibles son:" @@ -134380,6 +134346,11 @@ msgid "" "location through use of 'home switches'. See the <> for more information." msgstr "" +"Al presionar 'Home' o la tecla HOME, se llevará a casa el eje seleccionado. " +"Dependiendo de la configuración, esto puede simplemente establecer el valor " +"del eje a la posición absoluta 0.0, o puede hacer que la máquina se mueva a " +"una ubicación de casa específica usando 'interruptores de casa'. Ver el " +"<> para más información." #. type: Plain text #: src/gui/tklinuxcnc.adoc:183 @@ -134388,18 +134359,21 @@ msgid "" "jog outside the limits defined in the INI file. (Note: if 'Override Limits' " "is active the button will be displayed using a red color)." msgstr "" +"Al presionar 'Ajuste de límites' se le permitirá temporalmente a la máquina " +"trotar fuera de los límites definidos en el archivo INI. (Nota: Si el botón " +"'Ajuste de límites' está activo se mostrará en color rojo)." #. type: Block title #: src/gui/tklinuxcnc.adoc:185 #, no-wrap msgid "TkLinuxCNC Override Limits & Jogging increments example" -msgstr "" +msgstr "Ejemplo de ajuste de límites e incrementos de trote en TkLinuxCNC" #. type: Positional ($1) AttributeList argument for macro 'image' #: src/gui/tklinuxcnc.adoc:186 #, no-wrap msgid "TkLinuxCNC Override Limits and Jogging increments example" -msgstr "" +msgstr "Ejemplo de ajuste de límites e incrementos de trote en TkLinuxCNC" #. type: Target for macro image #: src/gui/tklinuxcnc.adoc:186 @@ -134409,7 +134383,6 @@ msgstr "images/tooledit.png" #. type: Plain text #: src/gui/tklinuxcnc.adoc:196 -#, fuzzy msgid "" "The button on the first row selects the direction for the spindle to rotate: " "Counterclockwise, Stopped, Clockwise. The buttons next to it allow the user " @@ -134417,34 +134390,29 @@ msgid "" "allows the spindle brake to be engaged or released. Depending on your " "machine configuration, not all the items in this group may have an effect." msgstr "" -"Los botones de la primera fila seleccionan la dirección de giro del husillo; " +"Los botones de la primera fila seleccionan la dirección de giro del husillo: " "en sentido contrario a las agujas del reloj, detenido y en el sentido de las " -"agujas del reloj. El sentido antihorario solo aparece si el pin " -"'motion.spindle-reverse' está en el archivo HAL ( por ejemlo, 'net trick-" -"axis motion.spindle-reverse'). Los botones en la siguiente fila aumentan o " -"disminuyen la velocidad de rotación. La casilla de verificación en la " -"tercera fila permite que el freno del husillo sea accionado o liberado. " -"Dependiendo de la configuración de su máquina,pueden no aparecer todos los " -"elementos en este grupo. Presionando el botón de arranque del husillo se " -"establece la velocidad 'S' en 1." +"agujas del reloj. Los botones siguientes aumentan o disminuyen la velocidad " +"de rotación. El botón en la segunda fila permite que el freno del husillo " +"sea accionado o liberado. Dependiendo de la configuración de la máquina, no " +"todos los elementos en este grupo pueden tener algún efecto." #. type: Plain text #: src/gui/tklinuxcnc.adoc:202 -#, fuzzy msgid "" "The two buttons allow the 'Mist' and 'Flood' coolants to be turned on and " "off. Depending on your machine configuration, not all the items in this " "group may appear." msgstr "" -"Dos botones permiten encender los refrigerantes 'Mist' y 'Flood' y " -"apagarlos. Dependiendo de la configuración de su máquina, puede no aparecer " -"todos los elementos en este grupo." +"Dos botones permiten encender y apagar los refrigerantes 'Niebla' e " +"'Inundación'. Dependiendo de la configuración de la máquina, no todos los " +"elementos en este grupo pueden aparecer." #. type: Title === #: src/gui/tklinuxcnc.adoc:203 -#, fuzzy, no-wrap +#, no-wrap msgid "Code Entry" -msgstr "Entrada a Rampa" +msgstr "Entrada de código" #. type: Plain text #: src/gui/tklinuxcnc.adoc:208 @@ -134462,29 +134430,28 @@ msgstr "" #: src/gui/tklinuxcnc.adoc:209 #, no-wrap msgid "The Code Entry tab" -msgstr "" +msgstr "El área de entrada de código" #. type: Target for macro image #: src/gui/tklinuxcnc.adoc:209 -#, fuzzy, no-wrap +#, no-wrap msgid "images/tkemc-mdi.png" -msgstr "images/axis-mdi_es.png" +msgstr "images/tkemc-mdi.png" #. type: Plain text #: src/gui/tklinuxcnc.adoc:213 -#, fuzzy msgid "" "This allows you to enter a G-code command to be executed. Execute the " "command by pressing Enter." msgstr "" -"'Comando MDI' - Esto le permite ingresar un comando de código g para ser " -"ejecutado. Ejecute el comando pulsando Intro o haciendo clic en 'Go'." +"Esto permite ingresar un comando de código G para ser ejecutado. El comando " +"se ejecuta al presionar Enter." #. type: Block title #: src/gui/tklinuxcnc.adoc:214 -#, fuzzy, no-wrap +#, no-wrap msgid "Active G-Codes" -msgstr "Códigos G" +msgstr "Códigos G activos" #. type: Plain text #: src/gui/tklinuxcnc.adoc:218 @@ -134504,10 +134471,13 @@ msgid "" "refer to axis units / second. The text box with the number is clickable. " "Once clicked a popup window will appear, allowing for a number to be entered." msgstr "" +"La velocidad de trote puede ser modificada al mover este deslizante. Los " +"números de arriba se refieren a unidades del eje / segundo. Se puede hacer " +"clic en la caja de texto con el número. Al hacer clic aparecerá una ventana " +"emergente, donde se puede ingresar un número." #. type: Plain text #: src/gui/tklinuxcnc.adoc:233 -#, fuzzy msgid "" "By moving this slider, the programmed feed rate can be modified. For " "instance, if a program requests 'F60' and the slider is set to 120%, then " @@ -134515,14 +134485,15 @@ msgid "" "clickable. Once clicked a popup window will appear, allowing for a number to " "be entered." msgstr "" -"Al mover este control deslizante (feed override), se puede modificar la " -"velocidad de alimentación programada. Por ejemplo, si un programa solicita " -"'F60' y el control deslizante se establece en 120%, entonces la velocidad de " -"alimentación resultante será 72." +"Al mover este deslizante, se puede modificar la velocidad de alimentación " +"programada. Por ejemplo, si un programa solicita 'F60' y el deslizante se " +"establece en 120%, entonces la velocidad de alimentación resultante será " +"72. Se puede hacer clic en la caja de texto con el número; al hacer clic " +"aparecerá una ventana emergente donde se puede ingresar un número." #. type: Title === #: src/gui/tklinuxcnc.adoc:234 -#, fuzzy, no-wrap +#, no-wrap msgid "Spindle speed Override" msgstr "Porcentaje de velocidad del husillo" @@ -134537,27 +134508,24 @@ msgid "" "The text box with the number is clickable. Once clicked a popup window will " "appear, allowing for a number to be entered." msgstr "" -"El control deslizante de anulación de velocidad del husillo funciona " -"exactamente como el control deslizante de alimentación, pero controla la " -"velocidad del husillo. Por ejemplo, si un programa solicita S500 (velocidad " -"del husillo de 500 RPM) y el control deslizante se establece en 80%, " -"entonces la velocidad del husillo resultante será 400 RPM. El control " -"deslizante tienen valores mínimo y un máximo definidos en el archivo INI; si " -"faltasen, el deslizante permanecerá en 100%. Se puede hacer clic en el " -"cuadro de texto con el número, al hacerlo aparecerá una ventana emergente " -"que permitirá capturar un número." +"El deslizante de porcentaje de velocidad del husillo funciona exactamente " +"como el deslizante de alimentación, pero controla la velocidad del husillo. " +"Por ejemplo, si un programa solicita S500 (velocidad del husillo de 500 RPM) " +"y el control deslizante se establece en 80%, entonces la velocidad del " +"husillo resultante será 400 RPM. El deslizante tienen valores mínimo y " +"máximo definidos en el archivo INI; si faltasen, el deslizante permanecerá " +"en 100%. Se puede hacer clic en el cuadro de texto con el número, al hacerlo " +"aparecerá una ventana emergente que permitirá capturar un número." #. type: Plain text #: src/gui/tklinuxcnc.adoc:249 -#, fuzzy msgid "" "Almost all actions in TkLinuxCNC can be accomplished with the keyboard. " "Many of the shortcuts are unavailable when in MDI mode." msgstr "" -"Casi todas las acciones en AXIS se pueden realizar con el teclado. La lista " -"completa de atajos de teclado se puede encontrar en AXIS Quick Reference, " -"que se puede mostrar seleccionando Ayuda> Quick Reference. Muchos de los " -"accesos directos no están disponibles cuando se está en modo MDI." +"Casi todas las acciones en TkLinuxCNC se pueden realizar con el teclado. " +"Muchos de los atajos de teclado no están disponibles cuando se está en modo " +"MDI." #. type: Plain text #: src/gui/tklinuxcnc.adoc:252 @@ -134569,15 +134537,16 @@ msgstr "" #. type: Block title #: src/gui/tklinuxcnc.adoc:254 -#, fuzzy, no-wrap +#, no-wrap msgid "Most Common Keyboard Shortcuts(((TkLinuxCNC Common Keyboard Shortcuts)))" -msgstr "Atajos de teclado más comunes(((AXIS,Keyboard Shortcuts)))" +msgstr "" +"Atajos de teclado más comunes(((Atajos de teclado comunes en TkLinuxCNC)))" #. type: Table #: src/gui/tklinuxcnc.adoc:266 #, no-wrap msgid "Send active axis Home" -msgstr "" +msgstr "Envía el eje activo a casa" #. type: Title = #: src/gui/tooledit.adoc:5 @@ -259418,9 +259387,8 @@ msgstr "B\\&.I\\&.B u32 out" #. type: Plain text #: man/man9/spindle.9:107 -#, fuzzy msgid "Currently selected gear\\&." -msgstr "Líneas actuales y seleccionadas" +msgstr "Engrane seleccionado actualmente\\&." #. type: Plain text #: man/man9/spindle.9:110 @@ -259483,9 +259451,9 @@ msgstr "B\\&.I\\&.B bit out" #. type: Plain text #: man/man9/spindle.9:137 -#, fuzzy msgid "TRUE when the commanded spindle speed is Emax or Emin\\&." -msgstr "El diccionario `spindle`" +msgstr "" +"TRUE cuando la velocidad del husillo ordenada es Emax o Emin\\&." #. type: Plain text #: man/man9/spindle.9:141 From c3ed83e3a9d91c6ac3d1c6440b6a3a55f10b49cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Salvador=20Pe=C3=B1a?= Date: Sat, 31 Jan 2026 15:15:37 +0100 Subject: [PATCH 5/9] Translated using Weblate (Spanish) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 22.4% (7625 of 33994 strings) Author: Salvador Peña Co-authored-by: Salvador Peña Translate-URL: https://hosted.weblate.org/projects/linuxcnc/linuxcnc-docs/es/ Translation: LinuxCNC/LinuxCNC Documentation --- docs/po/es.po | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/po/es.po b/docs/po/es.po index d9e0304cd8a..1ead2df8541 100644 --- a/docs/po/es.po +++ b/docs/po/es.po @@ -14,7 +14,7 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: emc-developers@lists.sourceforge.net\n" "POT-Creation-Date: 2026-01-29 16:34+0000\n" -"PO-Revision-Date: 2026-01-31 22:29+0000\n" +"PO-Revision-Date: 2026-01-31 14:15+0000\n" "Last-Translator: Salvador Peña \n" "Language-Team: LANGUAGE \n" "Language: es\n" From c2fa9a2fa2dd6167ae35b30dc681fd5df274f7d8 Mon Sep 17 00:00:00 2001 From: Luca Toniolo Date: Sat, 31 Jan 2026 16:06:43 +0800 Subject: [PATCH 6/9] inifile: Fix non-reentrant Find() returning pointer to static buffer IniFile::Find() used a static buffer to return results, causing bugs when multiple Find() calls were made before using the first result. Change Find() to return std::optional instead of std::optional. Each caller now owns their result copy. Core changes: - Remove static buffer from Find(), return std::string by value - Update all callers to use s->c_str() where const char* is needed - Use string methods (.empty(), .length(), ==) instead of C functions C API compatibility maintained via static storage in iniFind() wrapper. No functional changes - all updates are behavior-preserving. --- src/emc/ini/emcIniFile.hh | 5 +- src/emc/ini/inijoint.cc | 6 +- src/emc/ini/initraj.cc | 28 ++--- src/emc/pythonplugin/python_plugin.cc | 25 ++-- src/emc/rs274ngc/interp_namedparams.cc | 5 +- src/emc/rs274ngc/rs274ngc_pre.cc | 65 ++++++----- src/emc/sai/driver.cc | 5 +- src/emc/task/emcsvr.cc | 39 +++---- src/emc/task/emctask.cc | 20 ++-- src/emc/task/emctaskmain.cc | 71 ++++++------ src/emc/task/taskclass.cc | 19 ++- src/emc/task/taskintf.cc | 16 +-- src/emc/usr_intf/axis/extensions/emcmodule.cc | 4 +- src/emc/usr_intf/emcsh.cc | 6 +- src/emc/usr_intf/halui.cc | 108 +++++++++--------- src/emc/usr_intf/shcom.cc | 64 +++++------ src/hal/user_comps/xhc-hb04.cc | 8 +- src/libnml/inifile/inifile.cc | 30 +++-- src/libnml/inifile/inifile.hh | 2 +- src/libnml/inifile/inivar.cc | 4 +- 20 files changed, 262 insertions(+), 268 deletions(-) diff --git a/src/emc/ini/emcIniFile.hh b/src/emc/ini/emcIniFile.hh index edd55b90c18..535d387d66f 100644 --- a/src/emc/ini/emcIniFile.hh +++ b/src/emc/ini/emcIniFile.hh @@ -76,10 +76,9 @@ public: return(IniFile::Find(result, tag, section, num)); } - const char * Find(const char *tag, const char *section=NULL, + std::optional Find(const char *tag, const char *section=NULL, int num = 1){ - return(IniFile::Find(tag, section, num) - .value_or(nullptr)); + return(IniFile::Find(tag, section, num)); } private: diff --git a/src/emc/ini/inijoint.cc b/src/emc/ini/inijoint.cc index ae1dbb61386..c7647da40bd 100644 --- a/src/emc/ini/inijoint.cc +++ b/src/emc/ini/inijoint.cc @@ -73,7 +73,6 @@ extern value_inihal_data old_inihal_data; static int loadJoint(int joint, EmcIniFile *jointIniFile) { char jointString[16]; - const char *inistring; EmcJointType jointType; double units; double backlash; @@ -234,8 +233,9 @@ static int loadJoint(int joint, EmcIniFile *jointIniFile) comp_file_type = 0; // default jointIniFile->Find(&comp_file_type, "COMP_FILE_TYPE", jointString); - if (NULL != (inistring = jointIniFile->Find("COMP_FILE", jointString))) { - if (0 != emcJointLoadComp(joint, inistring, comp_file_type)) { + auto comp_file = jointIniFile->Find("COMP_FILE", jointString); + if (comp_file) { + if (0 != emcJointLoadComp(joint, comp_file->c_str(), comp_file_type)) { return -1; } } diff --git a/src/emc/ini/initraj.cc b/src/emc/ini/initraj.cc index f6389933e95..dade6236594 100644 --- a/src/emc/ini/initraj.cc +++ b/src/emc/ini/initraj.cc @@ -109,33 +109,33 @@ static int loadTraj(EmcIniFile *trajInifile) try{ int axismask = 0; - const char *coord = trajInifile->Find("COORDINATES", "TRAJ"); + auto coord = trajInifile->Find("COORDINATES", "TRAJ"); if(coord) { - if(strchr(coord, 'x') || strchr(coord, 'X')) { + if(coord->find_first_of("xX") != std::string::npos) { axismask |= 1; } - if(strchr(coord, 'y') || strchr(coord, 'Y')) { + if(coord->find_first_of("yY") != std::string::npos) { axismask |= 2; } - if(strchr(coord, 'z') || strchr(coord, 'Z')) { + if(coord->find_first_of("zZ") != std::string::npos) { axismask |= 4; } - if(strchr(coord, 'a') || strchr(coord, 'A')) { + if(coord->find_first_of("aA") != std::string::npos) { axismask |= 8; } - if(strchr(coord, 'b') || strchr(coord, 'B')) { + if(coord->find_first_of("bB") != std::string::npos) { axismask |= 16; } - if(strchr(coord, 'c') || strchr(coord, 'C')) { + if(coord->find_first_of("cC") != std::string::npos) { axismask |= 32; } - if(strchr(coord, 'u') || strchr(coord, 'U')) { + if(coord->find_first_of("uU") != std::string::npos) { axismask |= 64; } - if(strchr(coord, 'v') || strchr(coord, 'V')) { + if(coord->find_first_of("vV") != std::string::npos) { axismask |= 128; } - if(strchr(coord, 'w') || strchr(coord, 'W')) { + if(coord->find_first_of("wW") != std::string::npos) { axismask |= 256; } } else { @@ -295,7 +295,6 @@ static int loadTraj(EmcIniFile *trajInifile) return -1; } try{ - const char *inistring; unsigned char coordinateMark[6] = { 1, 1, 1, 0, 0, 0 }; int t; int len; @@ -303,14 +302,15 @@ static int loadTraj(EmcIniFile *trajInifile) char home[LINELEN]; EmcPose homePose = { {0.0, 0.0, 0.0}, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 }; double d; - if (NULL != (inistring = trajInifile->Find("HOME", "TRAJ"))) { + auto inistring = trajInifile->Find("HOME", "TRAJ"); + if (inistring) { // [TRAJ]HOME is important for genhexkins.c kinetmaticsForward() // and probably other non-identity kins that solve the forward // kinematics with an iterative algorithm when the homePose // is not all zeros // found it, now interpret it according to coordinateMark[] - rtapi_strxcpy(homes, inistring); + rtapi_strxcpy(homes, inistring->c_str()); len = 0; for (t = 0; t < 6; t++) { if (!coordinateMark[t]) { @@ -354,7 +354,7 @@ static int loadTraj(EmcIniFile *trajInifile) } else { // badly formatted entry rcs_print("invalid INI file value for [TRAJ] HOME: %s\n", - inistring); + inistring->c_str()); return -1; } } // end of for-loop on coordinateMark[] diff --git a/src/emc/pythonplugin/python_plugin.cc b/src/emc/pythonplugin/python_plugin.cc index f59cd80d163..b9462a8841f 100644 --- a/src/emc/pythonplugin/python_plugin.cc +++ b/src/emc/pythonplugin/python_plugin.cc @@ -339,7 +339,6 @@ int PythonPlugin::configure(const char *iniFilename, const char *section) { IniFile inifile; - std::optional inistring; if (section == NULL) { logPP(1, "no section"); @@ -360,16 +359,16 @@ int PythonPlugin::configure(const char *iniFilename, char real_path[PATH_MAX]; char expandinistring[PATH_MAX]; - if ((inistring = inifile.Find("TOPLEVEL", section))) { - if (inifile.TildeExpansion(*inistring,expandinistring,sizeof(expandinistring))) { + if (auto inistring = inifile.Find("TOPLEVEL", section)) { + if (inifile.TildeExpansion(inistring->c_str(),expandinistring,sizeof(expandinistring))) { logPP(-1, "TildeExpansion failed '%s'", toplevel); status = PLUGIN_BAD_PATH; return status; } toplevel = strstore(expandinistring); - if ((inistring = inifile.Find("RELOAD_ON_CHANGE", section))) - reload_on_change = (atoi(*inistring) > 0); + if (auto reload_str = inifile.Find("RELOAD_ON_CHANGE", section)) + reload_on_change = (atoi(reload_str->c_str()) > 0); if (realpath(toplevel, real_path) == NULL) { logPP(-1, "can\'t resolve path to '%s'", toplevel); @@ -394,16 +393,16 @@ int PythonPlugin::configure(const char *iniFilename, abs_path = strstore(real_path); } - if ((inistring = inifile.Find("LOG_LEVEL", section))) - log_level = atoi(*inistring); + if (auto inistring = inifile.Find("LOG_LEVEL", section)) + log_level = atoi(inistring->c_str()); else log_level = 0; char pycmd[PATH_MAX + 64]; int n = 1; int lineno; - while ((inistring = inifile.Find("PATH_PREPEND", "PYTHON", - n, &lineno))) { - if (inifile.TildeExpansion(*inistring,expandinistring,sizeof(expandinistring))) { + while (auto inistring = inifile.Find("PATH_PREPEND", "PYTHON", + n, &lineno)) { + if (inifile.TildeExpansion(inistring->c_str(),expandinistring,sizeof(expandinistring))) { logPP(-1, "TildeExpansion failed '%s'", toplevel); status = PLUGIN_EXCEPTION_DURING_PATH_PREPEND; return status; @@ -420,9 +419,9 @@ int PythonPlugin::configure(const char *iniFilename, n++; } n = 1; - while ((inistring = inifile.Find("PATH_APPEND", "PYTHON", - n, &lineno))) { - if (inifile.TildeExpansion(*inistring,expandinistring,sizeof(expandinistring))) { + while (auto inistring = inifile.Find("PATH_APPEND", "PYTHON", + n, &lineno)) { + if (inifile.TildeExpansion(inistring->c_str(),expandinistring,sizeof(expandinistring))) { logPP(-1, "TildeExpansion failed '%s'", toplevel); status = PLUGIN_EXCEPTION_DURING_PATH_APPEND; return status; diff --git a/src/emc/rs274ngc/interp_namedparams.cc b/src/emc/rs274ngc/interp_namedparams.cc index cb0127698b4..61704960ed0 100644 --- a/src/emc/rs274ngc/interp_namedparams.cc +++ b/src/emc/rs274ngc/interp_namedparams.cc @@ -964,7 +964,6 @@ double Interp::inicheck() { IniFile inifile; const char *filename; - std::optional inistring; double result = -1.0; if ((filename = getenv("INI_FILE_NAME")) == NULL) { @@ -976,8 +975,8 @@ double Interp::inicheck() return -1.0; } - if ((inistring = inifile.Find("LINEAR_UNITS", "TRAJ"))) { - if (!strcmp(*inistring, "inch")) { + if (auto inistring = inifile.Find("LINEAR_UNITS", "TRAJ")) { + if (*inistring == "inch") { result = 0.0; } else { result = 1.0; diff --git a/src/emc/rs274ngc/rs274ngc_pre.cc b/src/emc/rs274ngc/rs274ngc_pre.cc index a2fc8758530..c74799d32cc 100644 --- a/src/emc/rs274ngc/rs274ngc_pre.cc +++ b/src/emc/rs274ngc/rs274ngc_pre.cc @@ -884,7 +884,6 @@ int Interp::init() fprintf(stderr,"Unable to open inifile:%s:\n", iniFileName); } else { bool opt; - std::optional inistring; inifile.Find(&_setup.tool_change_at_g30, "TOOL_CHANGE_AT_G30", "EMCIO"); inifile.Find(&_setup.tool_change_quill_up, "TOOL_CHANGE_QUILL_UP", "EMCIO"); @@ -920,14 +919,14 @@ int Interp::init() inifile.Find(&opt, "OWORD_WARNONLY", "RS274NGC"); if (opt) _setup.feature_set |= FEATURE_OWORD_WARNONLY; - if ((inistring =inifile.Find("LOCKING_INDEXER_JOINT", "AXIS_A"))) { - _setup.a_indexer_jnum = atol(*inistring); + if (auto inistring = inifile.Find("LOCKING_INDEXER_JOINT", "AXIS_A")) { + _setup.a_indexer_jnum = atol(inistring->c_str()); } - if ((inistring =inifile.Find("LOCKING_INDEXER_JOINT", "AXIS_B"))) { - _setup.b_indexer_jnum = atol(*inistring); + if (auto inistring = inifile.Find("LOCKING_INDEXER_JOINT", "AXIS_B")) { + _setup.b_indexer_jnum = atol(inistring->c_str()); } - if ((inistring =inifile.Find("LOCKING_INDEXER_JOINT", "AXIS_C"))) { - _setup.c_indexer_jnum = atol(*inistring); + if (auto inistring = inifile.Find("LOCKING_INDEXER_JOINT", "AXIS_C")) { + _setup.c_indexer_jnum = atol(inistring->c_str()); } inifile.Find(&_setup.orient_offset, "ORIENT_OFFSET", "RS274NGC"); inifile.Find(&_setup.parameter_g73_peck_clearance, "G73_PECK_CLEARANCE", "RS274NGC"); @@ -937,18 +936,18 @@ int Interp::init() _setup.debugmask |= EMC_DEBUG_UNCONDITIONAL; - if((inistring = inifile.Find("LOG_LEVEL", "RS274NGC"))) + if(auto inistring = inifile.Find("LOG_LEVEL", "RS274NGC")) { - _setup.loggingLevel = atol(*inistring); + _setup.loggingLevel = atol(inistring->c_str()); } // default the log_file to stderr. - if((inistring = inifile.Find("LOG_FILE", "RS274NGC"))) + if(auto inistring = inifile.Find("LOG_FILE", "RS274NGC")) { - if ((log_file = fopen(*inistring, "a")) == NULL) { + if ((log_file = fopen(inistring->c_str(), "a")) == NULL) { log_file = stderr; logDebug( "(%d): Unable to open log file:%s, using stderr", - getpid(), *inistring); + getpid(), inistring->c_str()); } } else { log_file = stderr; @@ -957,30 +956,30 @@ int Interp::init() _setup.use_lazy_close = 1; _setup.wizard_root[0] = 0; - if((inistring = inifile.Find("WIZARD_ROOT", "WIZARD"))) + if(auto inistring = inifile.Find("WIZARD_ROOT", "WIZARD")) { - logDebug("[WIZARD]WIZARD_ROOT:%s", *inistring); - if (realpath(*inistring, _setup.wizard_root) == NULL) { + logDebug("[WIZARD]WIZARD_ROOT:%s", inistring->c_str()); + if (realpath(inistring->c_str(), _setup.wizard_root) == NULL) { //realpath didn't find the file - logDebug("realpath failed to find wizard_root:%s:", *inistring); + logDebug("realpath failed to find wizard_root:%s:", inistring->c_str()); } } logDebug("_setup.wizard_root:%s:", _setup.wizard_root); _setup.program_prefix[0] = 0; - if((inistring = inifile.Find("PROGRAM_PREFIX", "DISPLAY"))) + if(auto inistring = inifile.Find("PROGRAM_PREFIX", "DISPLAY")) { // found it char expandinistring[LINELEN]; - if (inifile.TildeExpansion(*inistring,expandinistring,sizeof(expandinistring))) { - logDebug("TildeExpansion failed for: %s",*inistring); + if (inifile.TildeExpansion(inistring->c_str(),expandinistring,sizeof(expandinistring))) { + logDebug("TildeExpansion failed for: %s",inistring->c_str()); } if (realpath(expandinistring, _setup.program_prefix) == NULL){ //realpath didn't find the file - logDebug("realpath failed to find program_prefix:%s:", *inistring); + logDebug("realpath failed to find program_prefix:%s:", inistring->c_str()); } logDebug("program prefix:%s: prefix:%s:", - *inistring, _setup.program_prefix); + inistring->c_str(), _setup.program_prefix); } else { @@ -988,7 +987,7 @@ int Interp::init() } logDebug("_setup.program_prefix:%s:", _setup.program_prefix); - if((inistring = inifile.Find("SUBROUTINE_PATH", "RS274NGC"))) + if(auto inistring = inifile.Find("SUBROUTINE_PATH", "RS274NGC")) { // found it int dct; @@ -999,7 +998,7 @@ int Interp::init() _setup.subroutines[dct] = NULL; } - rtapi_strxcpy(tmpdirs,*inistring); + rtapi_strxcpy(tmpdirs,inistring->c_str()); nextdir = strtok(tmpdirs,":"); // first token dct = 0; while (1) { @@ -1031,15 +1030,15 @@ int Interp::init() } // subroutine to execute on aborts - for instance to retract // toolchange HAL pins - if ((inistring = inifile.Find("ON_ABORT_COMMAND", "RS274NGC"))) { - _setup.on_abort_command = strstore(*inistring); + if (auto inistring = inifile.Find("ON_ABORT_COMMAND", "RS274NGC")) { + _setup.on_abort_command = strstore(inistring->c_str()); logDebug("_setup.on_abort_command=%s", _setup.on_abort_command); } else { _setup.on_abort_command = NULL; } // initialize the Python plugin singleton - if ((inistring = inifile.Find("TOPLEVEL", "PYTHON"))) { + if (inifile.Find("TOPLEVEL", "PYTHON")) { int status = python_plugin->configure(iniFileName,"PYTHON"); if (status != PLUGIN_OK) { Error("Python plugin configure() failed, status = %d", status); @@ -1051,10 +1050,10 @@ int Interp::init() _setup.g_remapped.clear(); _setup.m_remapped.clear(); _setup.remaps.clear(); - while ((inistring = inifile.Find("REMAP", "RS274NGC", - n, &lineno))) { + while (auto inistring = inifile.Find("REMAP", "RS274NGC", + n, &lineno)) { - CHP(parse_remap( *inistring, lineno)); + CHP(parse_remap( inistring->c_str(), lineno)); n++; } @@ -2513,7 +2512,6 @@ VARIABLE_FILE = rs274ngc.var int Interp::ini_load(const char *filename) { IniFile inifile; - std::optional inistring; // open it if (inifile.Open(filename) == false) { @@ -2525,12 +2523,13 @@ int Interp::ini_load(const char *filename) char parameter_file_name[LINELEN]={}; - if ((inistring = inifile.Find("PARAMETER_FILE", "RS274NGC"))) { - if (strlen(*inistring) >= sizeof(parameter_file_name)) { + if (auto inistring = inifile.Find("PARAMETER_FILE", "RS274NGC")) { + if (inistring->length() >= sizeof(parameter_file_name)) { logDebug("%s:[RS274NGC]PARAMETER_FILE is too long (max len %zu)", filename, sizeof(parameter_file_name)-1); } else { - strncpy(parameter_file_name, *inistring, sizeof(parameter_file_name)); + strncpy(parameter_file_name, inistring->c_str(), sizeof(parameter_file_name)-1); + parameter_file_name[sizeof(parameter_file_name)-1] = '\0'; logDebug("found PARAMETER_FILE:%s:", parameter_file_name); } } else { diff --git a/src/emc/sai/driver.cc b/src/emc/sai/driver.cc index 2c1882b950c..4381ff2bc49 100644 --- a/src/emc/sai/driver.cc +++ b/src/emc/sai/driver.cc @@ -675,7 +675,6 @@ int main (int argc, char ** argv) } _sai._external_length_units = 0.03937007874016; if (inifile!= 0) { - std::optional inistring; IniFile ini; // open it if (ini.Open(inifile) == false) { @@ -683,8 +682,8 @@ int main (int argc, char ** argv) exit(1); } - if ((inistring = ini.Find("LINEAR_UNITS", "TRAJ"))) { - if (!strcmp(*inistring, "mm")) { + if (auto inistring = ini.Find("LINEAR_UNITS", "TRAJ")) { + if (*inistring == "mm") { _sai._external_length_units = 1.0; } } diff --git a/src/emc/task/emcsvr.cc b/src/emc/task/emcsvr.cc index b2550c8fc8c..571f1b42a22 100644 --- a/src/emc/task/emcsvr.cc +++ b/src/emc/task/emcsvr.cc @@ -34,7 +34,6 @@ static int iniLoad(const char *filename) { IniFile inifile; - std::optional inistring; char version[LINELEN], machine[LINELEN]; // open it @@ -44,28 +43,28 @@ static int iniLoad(const char *filename) // EMC debugging flags emc_debug = 0; // disabled by default - if ((inistring = inifile.Find("DEBUG", "EMC"))) { + if (auto inistring = inifile.Find("DEBUG", "EMC")) { // parse to global - if (sscanf(*inistring, "%x", &emc_debug) < 1) { + if (sscanf(inistring->c_str(), "%x", &emc_debug) < 1) { perror("failed to parse [EMC] DEBUG"); } } // set output for RCS messages set_rcs_print_destination(RCS_PRINT_TO_STDOUT); // use stdout by default - if ((inistring = inifile.Find("RCS_DEBUG_DEST", "EMC"))) { + if (auto inistring = inifile.Find("RCS_DEBUG_DEST", "EMC")) { static RCS_PRINT_DESTINATION_TYPE type; - if (!strcmp(*inistring, "STDOUT")) { + if (*inistring == "STDOUT") { type = RCS_PRINT_TO_STDOUT; - } else if (!strcmp(*inistring, "STDERR")) { + } else if (*inistring == "STDERR") { type = RCS_PRINT_TO_STDERR; - } else if (!strcmp(*inistring, "FILE")) { + } else if (*inistring == "FILE") { type = RCS_PRINT_TO_FILE; - } else if (!strcmp(*inistring, "LOGGER")) { + } else if (*inistring == "LOGGER") { type = RCS_PRINT_TO_LOGGER; - } else if (!strcmp(*inistring, "MSGBOX")) { + } else if (*inistring == "MSGBOX") { type = RCS_PRINT_TO_MESSAGE_BOX; - } else if (!strcmp(*inistring, "NULL")) { + } else if (*inistring == "NULL") { type = RCS_PRINT_TO_NULL; } else { type = RCS_PRINT_TO_STDOUT; @@ -82,9 +81,9 @@ static int iniLoad(const char *filename) } // set flags if RCS_DEBUG in ini file - if ((inistring = inifile.Find("RCS_DEBUG", "EMC"))) { + if (auto inistring = inifile.Find("RCS_DEBUG", "EMC")) { long unsigned int flags; - if (sscanf(*inistring, "%lx", &flags) < 1) { + if (sscanf(inistring->c_str(), "%lx", &flags) < 1) { perror("failed to parse [EMC] RCS_DEBUG"); } // clear all flags @@ -94,18 +93,18 @@ static int iniLoad(const char *filename) } // output infinite RCS errors by default max_rcs_errors_to_print = -1; - if ((inistring = inifile.Find("RCS_MAX_ERR", "EMC"))) { - if (sscanf(*inistring, "%d", &max_rcs_errors_to_print) < 1) { + if (auto inistring = inifile.Find("RCS_MAX_ERR", "EMC")) { + if (sscanf(inistring->c_str(), "%d", &max_rcs_errors_to_print) < 1) { perror("failed to parse [EMC] RCS_MAX_ERR"); } } if (emc_debug & EMC_DEBUG_CONFIG) { - inistring = inifile.Find("VERSION", "EMC"); - strncpy(version, inistring.value_or("unknown"), LINELEN-1); + auto ver = inifile.Find("VERSION", "EMC"); + strncpy(version, ver ? ver->c_str() : "unknown", LINELEN-1); - inistring = inifile.Find("MACHINE", "EMC"); - strncpy(machine, inistring.value_or("unknown"), LINELEN-1); + auto mach = inifile.Find("MACHINE", "EMC"); + strncpy(machine, mach ? mach->c_str() : "unknown", LINELEN-1); extern char *program_invocation_short_name; rcs_print( @@ -114,9 +113,9 @@ static int iniLoad(const char *filename) ); } - if ((inistring = inifile.Find("NML_FILE", "EMC"))) { + if (auto inistring = inifile.Find("NML_FILE", "EMC")) { // copy to global - rtapi_strxcpy(emc_nmlfile, *inistring); + rtapi_strxcpy(emc_nmlfile, inistring->c_str()); } else { // not found, use default } diff --git a/src/emc/task/emctask.cc b/src/emc/task/emctask.cc index a96f264e3d8..a17f604a448 100644 --- a/src/emc/task/emctask.cc +++ b/src/emc/task/emctask.cc @@ -116,18 +116,17 @@ int emcTaskInit() char path[EMC_SYSTEM_CMD_LEN]; struct stat buf; IniFile inifile; - std::optional inistring; ZERO_EMC_POSE(emcStatus->task.toolOffset); inifile.Open(emc_inifile); // Identify user_defined_function directories - if ((inistring = inifile.Find("PROGRAM_PREFIX", "DISPLAY"))) { - if (strlen(*inistring) >= sizeof(mdir[0])) { + if (auto inistring = inifile.Find("PROGRAM_PREFIX", "DISPLAY")) { + if (inistring->length() >= sizeof(mdir[0])) { rcs_print("[DISPLAY]PROGRAM_PREFIX too long (max len %zu)\n", sizeof(mdir[0])); return -1; } - strncpy(mdir[0], *inistring, sizeof(mdir[0])); + rtapi_strlcpy(mdir[0], inistring->c_str(), sizeof(mdir[0])); } else { // default dir if no PROGRAM_PREFIX rtapi_strlcpy(mdir[0], "nc_files", sizeof(mdir[0])); @@ -136,17 +135,17 @@ int emcTaskInit() // user can specify a list of directories for user defined functions // with a colon (:) separated list - if ((inistring = inifile.Find("USER_M_PATH", "RS274NGC"))) { + if (auto inistring = inifile.Find("USER_M_PATH", "RS274NGC")) { char* nextdir; char tmpdirs[PATH_MAX]; for (dct=1; dct < MAX_M_DIRS; dct++) mdir[dct][0] = 0; - if (strlen(*inistring) >= sizeof(tmpdirs)) { + if (inistring->length() >= sizeof(tmpdirs)) { rcs_print("[RS274NGC]USER_M_PATH too long (max len %zu)\n", sizeof(tmpdirs)); return -1; } - strncpy(tmpdirs, *inistring, sizeof(tmpdirs)); + rtapi_strlcpy(tmpdirs, inistring->c_str(), sizeof(tmpdirs)); nextdir = strtok(tmpdirs,":"); // first token dct = 1; @@ -431,13 +430,12 @@ int emcTaskPlanInit() { if(!pinterp) { IniFile inifile; - std::optional inistring; inifile.Open(emc_inifile); - if((inistring = inifile.Find("INTERPRETER", "TASK"))) { - pinterp = interp_from_shlib(*inistring); + if(auto inistring = inifile.Find("INTERPRETER", "TASK")) { + pinterp = interp_from_shlib(inistring->c_str()); fprintf(stderr, "interp_from_shlib() -> %p\n", pinterp); if (!pinterp) { - fprintf(stderr, "failed to load [TASK]INTERPRETER (%s)\n", *inistring); + fprintf(stderr, "failed to load [TASK]INTERPRETER (%s)\n", inistring->c_str()); return -1; } } diff --git a/src/emc/task/emctaskmain.cc b/src/emc/task/emctaskmain.cc index 36d6b38a951..5aee7ad435e 100644 --- a/src/emc/task/emctaskmain.cc +++ b/src/emc/task/emctaskmain.cc @@ -3095,7 +3095,6 @@ static int emctask_shutdown(void) static int iniLoad(const char *filename) { IniFile inifile; - std::optional inistring; char version[LINELEN], machine[LINELEN]; double saveDouble; int saveInt; @@ -3105,9 +3104,9 @@ static int iniLoad(const char *filename) return -1; } - if ((inistring = inifile.Find("JOINTS", "KINS"))) { + if (auto inistring = inifile.Find("JOINTS", "KINS")) { // copy to global - if (1 != sscanf(*inistring, "%i", &joints)) { + if (1 != sscanf(inistring->c_str(), "%i", &joints)) { joints = 0; } } else { @@ -3117,28 +3116,28 @@ static int iniLoad(const char *filename) // EMC debugging flags emc_debug = 0; // disabled by default - if ((inistring = inifile.Find("DEBUG", "EMC"))) { + if (auto inistring = inifile.Find("DEBUG", "EMC")) { // parse to global - if (sscanf(*inistring, "%x", &emc_debug) < 1) { + if (sscanf(inistring->c_str(), "%x", &emc_debug) < 1) { perror("failed to parse [EMC] DEBUG"); } } // set output for RCS messages set_rcs_print_destination(RCS_PRINT_TO_STDOUT); // use stdout by default - if ((inistring = inifile.Find("RCS_DEBUG_DEST", "EMC"))) { + if (auto inistring = inifile.Find("RCS_DEBUG_DEST", "EMC")) { static RCS_PRINT_DESTINATION_TYPE type; - if (!strcmp(*inistring, "STDOUT")) { + if (*inistring == "STDOUT") { type = RCS_PRINT_TO_STDOUT; - } else if (!strcmp(*inistring, "STDERR")) { + } else if (*inistring == "STDERR") { type = RCS_PRINT_TO_STDERR; - } else if (!strcmp(*inistring, "FILE")) { + } else if (*inistring == "FILE") { type = RCS_PRINT_TO_FILE; - } else if (!strcmp(*inistring, "LOGGER")) { + } else if (*inistring == "LOGGER") { type = RCS_PRINT_TO_LOGGER; - } else if (!strcmp(*inistring, "MSGBOX")) { + } else if (*inistring == "MSGBOX") { type = RCS_PRINT_TO_MESSAGE_BOX; - } else if (!strcmp(*inistring, "NULL")) { + } else if (*inistring == "NULL") { type = RCS_PRINT_TO_NULL; } else { type = RCS_PRINT_TO_STDOUT; @@ -3155,9 +3154,9 @@ static int iniLoad(const char *filename) } // set flags if RCS_DEBUG in ini file - if ((inistring = inifile.Find("RCS_DEBUG", "EMC"))) { + if (auto inistring = inifile.Find("RCS_DEBUG", "EMC")) { long unsigned int flags; - if (sscanf(*inistring, "%lx", &flags) < 1) { + if (sscanf(inistring->c_str(), "%lx", &flags) < 1) { perror("failed to parse [EMC] RCS_DEBUG"); } // clear all flags @@ -3167,18 +3166,18 @@ static int iniLoad(const char *filename) } // output infinite RCS errors by default max_rcs_errors_to_print = -1; - if ((inistring = inifile.Find("RCS_MAX_ERR", "EMC"))) { - if (sscanf(*inistring, "%d", &max_rcs_errors_to_print) < 1) { + if (auto inistring = inifile.Find("RCS_MAX_ERR", "EMC")) { + if (sscanf(inistring->c_str(), "%d", &max_rcs_errors_to_print) < 1) { perror("failed to parse [EMC] RCS_MAX_ERR"); } } if (emc_debug & EMC_DEBUG_CONFIG) { - inistring = inifile.Find("VERSION", "EMC"); - rtapi_strlcpy(version, inistring.value_or("unknown"), LINELEN-1); + auto ver = inifile.Find("VERSION", "EMC"); + rtapi_strlcpy(version, ver ? ver->c_str() : "unknown", LINELEN-1); - inistring = inifile.Find("MACHINE", "EMC"); - rtapi_strlcpy(machine, inistring.value_or("unknown"), LINELEN-1); + auto mach = inifile.Find("MACHINE", "EMC"); + rtapi_strlcpy(machine, mach ? mach->c_str() : "unknown", LINELEN-1); extern char *program_invocation_short_name; rcs_print( "%s (%d) task: machine '%s' version '%s'\n", @@ -3186,16 +3185,16 @@ static int iniLoad(const char *filename) ); } - if ((inistring = inifile.Find("NML_FILE", "EMC"))) { + if (auto inistring = inifile.Find("NML_FILE", "EMC")) { // copy to global - rtapi_strxcpy(emc_nmlfile, *inistring); + rtapi_strxcpy(emc_nmlfile, inistring->c_str()); } else { // not found, use default } saveInt = emc_task_interp_max_len; //remember default or previously set value - if ((inistring = inifile.Find("INTERP_MAX_LEN", "TASK"))) { - if (1 == sscanf(*inistring, "%d", &emc_task_interp_max_len)) { + if (auto inistring = inifile.Find("INTERP_MAX_LEN", "TASK")) { + if (1 == sscanf(inistring->c_str(), "%d", &emc_task_interp_max_len)) { if (emc_task_interp_max_len <= 0) { emc_task_interp_max_len = saveInt; } @@ -3204,16 +3203,16 @@ static int iniLoad(const char *filename) } } - if ((inistring = inifile.Find("RS274NGC_STARTUP_CODE", "RS274NGC"))) { + if (auto inistring = inifile.Find("RS274NGC_STARTUP_CODE", "RS274NGC")) { // copy to global - rtapi_strxcpy(rs274ngc_startup_code, *inistring); + rtapi_strxcpy(rs274ngc_startup_code, inistring->c_str()); } saveDouble = emc_task_cycle_time; EMC_TASK_CYCLE_TIME_ORIG = emc_task_cycle_time; emcTaskNoDelay = 0; - if ((inistring = inifile.Find("CYCLE_TIME", "TASK"))) { - if (1 == sscanf(*inistring, "%lf", &emc_task_cycle_time)) { + if (auto inistring = inifile.Find("CYCLE_TIME", "TASK")) { + if (1 == sscanf(inistring->c_str(), "%lf", &emc_task_cycle_time)) { // found it // if it's <= 0.0, then flag that we don't want to // wait at all, which will set the EMC_TASK_CYCLE_TIME @@ -3226,7 +3225,7 @@ static int iniLoad(const char *filename) emc_task_cycle_time = saveDouble; rcs_print ("invalid [TASK] CYCLE_TIME in %s (%s); using default %f\n", - filename, *inistring, emc_task_cycle_time); + filename, inistring->c_str(), emc_task_cycle_time); } } else { // not found, using default @@ -3235,8 +3234,8 @@ static int iniLoad(const char *filename) } - if ((inistring = inifile.Find("NO_FORCE_HOMING", "TRAJ"))) { - if (1 == sscanf(*inistring, "%d", &no_force_homing)) { + if (auto inistring = inifile.Find("NO_FORCE_HOMING", "TRAJ")) { + if (1 == sscanf(inistring->c_str(), "%d", &no_force_homing)) { // found it // if it's <= 0.0, then set it 0 so that homing is required before MDI or Auto if (no_force_homing <= 0) { @@ -3247,7 +3246,7 @@ static int iniLoad(const char *filename) no_force_homing = 0; rcs_print ("invalid [TRAJ] NO_FORCE_HOMING in %s (%s); using default %d\n", - filename, *inistring, no_force_homing); + filename, inistring->c_str(), no_force_homing); } } else { // not found, using default @@ -3255,13 +3254,13 @@ static int iniLoad(const char *filename) } // configurable template for iocontrol reason display - if ((inistring = inifile.Find("IO_ERROR", "TASK"))) { - io_error = strdup(*inistring); + if (auto inistring = inifile.Find("IO_ERROR", "TASK")) { + io_error = strdup(inistring->c_str()); } // max number of queued MDI commands - if ((inistring = inifile.Find("MDI_QUEUED_COMMANDS", "TASK"))) { - max_mdi_queued_commands = atoi(*inistring); + if (auto inistring = inifile.Find("MDI_QUEUED_COMMANDS", "TASK")) { + max_mdi_queued_commands = atoi(inistring->c_str()); } // close it diff --git a/src/emc/task/taskclass.cc b/src/emc/task/taskclass.cc index 3c481483490..ffb98ed1c9b 100644 --- a/src/emc/task/taskclass.cc +++ b/src/emc/task/taskclass.cc @@ -138,14 +138,13 @@ Task::Task(EMC_IO_STAT & emcioStatus_in) : if (inifile.Open(ini_filename)) { inifile.Find(&random_toolchanger, "RANDOM_TOOLCHANGER", "EMCIO"); - std::optional t; - if ((t = inifile.Find("TOOL_TABLE", "EMCIO"))) - tooltable_filename = strdup(*t); + if (auto t = inifile.Find("TOOL_TABLE", "EMCIO")) + tooltable_filename = strdup(t->c_str()); - if ((t = inifile.Find("DB_PROGRAM", "EMCIO"))) { + if (auto t = inifile.Find("DB_PROGRAM", "EMCIO")) { db_mode = tooldb_t::DB_ACTIVE; tooldata_set_db(db_mode); - strncpy(db_program, *t, LINELEN - 1); + strncpy(db_program, t->c_str(), LINELEN - 1); } if (tooltable_filename != NULL && db_program[0] != '\0') { @@ -206,11 +205,11 @@ Task::~Task() {}; static int readToolChange(IniFile *toolInifile) { int retval = 0; - std::optional inistring; - if ((inistring = toolInifile->Find("TOOL_CHANGE_POSITION", "EMCIO"))) { + auto inistring = toolInifile->Find("TOOL_CHANGE_POSITION", "EMCIO"); + if (inistring) { /* found an entry */ - if (9 == sscanf(*inistring, "%lf %lf %lf %lf %lf %lf %lf %lf %lf", + if (9 == sscanf(inistring->c_str(), "%lf %lf %lf %lf %lf %lf %lf %lf %lf", &tool_change_position.tran.x, &tool_change_position.tran.y, &tool_change_position.tran.z, @@ -222,7 +221,7 @@ static int readToolChange(IniFile *toolInifile) &tool_change_position.w)) { have_tool_change_position=9; retval=0; - } else if (6 == sscanf(*inistring, "%lf %lf %lf %lf %lf %lf", + } else if (6 == sscanf(inistring->c_str(), "%lf %lf %lf %lf %lf %lf", &tool_change_position.tran.x, &tool_change_position.tran.y, &tool_change_position.tran.z, @@ -234,7 +233,7 @@ static int readToolChange(IniFile *toolInifile) tool_change_position.w = 0.0; have_tool_change_position = 6; retval = 0; - } else if (3 == sscanf(*inistring, "%lf %lf %lf", + } else if (3 == sscanf(inistring->c_str(), "%lf %lf %lf", &tool_change_position.tran.x, &tool_change_position.tran.y, &tool_change_position.tran.z)) { diff --git a/src/emc/task/taskintf.cc b/src/emc/task/taskintf.cc index 2f180645b59..5029143ae42 100644 --- a/src/emc/task/taskintf.cc +++ b/src/emc/task/taskintf.cc @@ -1733,14 +1733,14 @@ int emcPositionLoad() { ini.Open(emc_inifile); auto posfile = ini.Find("POSITION_FILE", "TRAJ"); ini.Close(); - if(!posfile || !posfile.value()[0]) return 0; - FILE *f = fopen(*posfile, "r"); + if(!posfile || posfile->empty()) return 0; + FILE *f = fopen(posfile->c_str(), "r"); if(!f) return 0; for(int i=0; ic_str()); return -1; } } @@ -1748,7 +1748,7 @@ int emcPositionLoad() { int result = 0; for(int i=0; ic_str()); result = -1; } } @@ -1758,9 +1758,9 @@ int emcPositionLoad() { int emcPositionSave() { IniFile ini; - std::optional posfile; ini.Open(emc_inifile); + std::optional posfile; try { posfile = ini.Find("POSITION_FILE", "TRAJ"); } catch (IniFile::Exception e) { @@ -1769,10 +1769,10 @@ int emcPositionSave() { } ini.Close(); - if(!posfile || !posfile.value()[0]) return 0; + if(!posfile || posfile->empty()) return 0; // like the var file, make sure the posfile is recreated according to umask - unlink(*posfile); - FILE *f = fopen(*posfile, "w"); + unlink(posfile->c_str()); + FILE *f = fopen(posfile->c_str(), "w"); if(!f) return -1; for(int i=0; ii->Find(s2, s1, num)) - return PyUnicode_FromString(out.value()); + return PyUnicode_FromString(out.value().c_str()); Py_INCREF(Py_None); return Py_None; @@ -135,7 +135,7 @@ static PyObject *Ini_findall(pyIniFile *self, PyObject *args) { PyObject *result = PyList_New(0); while(auto out = self->i->Find(s2, s1, num)) { - PyList_Append(result, PyUnicode_FromString(out.value())); + PyList_Append(result, PyUnicode_FromString(out.value().c_str())); num++; } return result; diff --git a/src/emc/usr_intf/emcsh.cc b/src/emc/usr_intf/emcsh.cc index e9fb7b18681..b61f72fefe8 100644 --- a/src/emc/usr_intf/emcsh.cc +++ b/src/emc/usr_intf/emcsh.cc @@ -389,7 +389,6 @@ static int emc_ini(ClientData /*clientdata*/, Tcl_Interp * interp, int objc, Tcl_Obj * CONST objv[]) { IniFile inifile; - std::optional inistring; const char *varstr, *secstr, *defaultstr; defaultstr = 0; @@ -409,14 +408,15 @@ static int emc_ini(ClientData /*clientdata*/, defaultstr = Tcl_GetStringFromObj(objv[3], 0); } - if (!(inistring = inifile.Find(varstr, secstr))) { + auto inistring = inifile.Find(varstr, secstr); + if (!inistring) { if (defaultstr != 0) { setresult(interp,(char *) defaultstr); } return TCL_OK; } - setresult(interp, *inistring); + setresult(interp, inistring->c_str()); // close it inifile.Close(); diff --git a/src/emc/usr_intf/halui.cc b/src/emc/usr_intf/halui.cc index e9e23735c94..d71eaf0ef5b 100644 --- a/src/emc/usr_intf/halui.cc +++ b/src/emc/usr_intf/halui.cc @@ -1381,7 +1381,6 @@ static int sendSpindleOverride(int spindle, double override) static int iniLoad(const char *filename) { IniFile inifile; - std::optional inistring; char version[LINELEN], machine[LINELEN]; double d; int i; @@ -1393,28 +1392,28 @@ static int iniLoad(const char *filename) // EMC debugging flags emc_debug = 0; // disabled by default - if ((inistring = inifile.Find("DEBUG", "EMC"))) { + if (auto inistring = inifile.Find("DEBUG", "EMC")) { // parse to global - if (sscanf(*inistring, "%x", &emc_debug) < 1) { + if (sscanf(inistring->c_str(), "%x", &emc_debug) < 1) { perror("failed to parse [EMC] DEBUG"); } } // set output for RCS messages set_rcs_print_destination(RCS_PRINT_TO_STDOUT); // use stdout by default - if ((inistring = inifile.Find("RCS_DEBUG_DEST", "EMC"))) { + if (auto inistring = inifile.Find("RCS_DEBUG_DEST", "EMC")) { static RCS_PRINT_DESTINATION_TYPE type; - if (!strcmp(*inistring, "STDOUT")) { + if (*inistring == "STDOUT") { type = RCS_PRINT_TO_STDOUT; - } else if (!strcmp(*inistring, "STDERR")) { + } else if (*inistring == "STDERR") { type = RCS_PRINT_TO_STDERR; - } else if (!strcmp(*inistring, "FILE")) { + } else if (*inistring == "FILE") { type = RCS_PRINT_TO_FILE; - } else if (!strcmp(*inistring, "LOGGER")) { + } else if (*inistring == "LOGGER") { type = RCS_PRINT_TO_LOGGER; - } else if (!strcmp(*inistring, "MSGBOX")) { + } else if (*inistring == "MSGBOX") { type = RCS_PRINT_TO_MESSAGE_BOX; - } else if (!strcmp(*inistring, "NULL")) { + } else if (*inistring == "NULL") { type = RCS_PRINT_TO_NULL; } else { type = RCS_PRINT_TO_STDOUT; @@ -1431,9 +1430,9 @@ static int iniLoad(const char *filename) } // set flags if RCS_DEBUG in ini file - if ((inistring = inifile.Find("RCS_DEBUG", "EMC"))) { + if (auto inistring = inifile.Find("RCS_DEBUG", "EMC")) { long unsigned int flags; - if (sscanf(*inistring, "%lx", &flags) < 1) { + if (sscanf(inistring->c_str(), "%lx", &flags) < 1) { perror("failed to parse [EMC] RCS_DEBUG"); } // clear all flags @@ -1443,20 +1442,20 @@ static int iniLoad(const char *filename) } // output infinite RCS errors by default max_rcs_errors_to_print = -1; - if ((inistring = inifile.Find("RCS_MAX_ERR", "EMC"))) { - if (sscanf(*inistring, "%d", &max_rcs_errors_to_print) < 1) { + if (auto inistring = inifile.Find("RCS_MAX_ERR", "EMC")) { + if (sscanf(inistring->c_str(), "%d", &max_rcs_errors_to_print) < 1) { perror("failed to parse [EMC] RCS_MAX_ERR"); } } strncpy(version, "unknown", LINELEN-1); - if ((inistring = inifile.Find("VERSION", "EMC"))) { - strncpy(version, *inistring, LINELEN-1); + if (auto inistring = inifile.Find("VERSION", "EMC")) { + strncpy(version, inistring->c_str(), LINELEN-1); } if (emc_debug & EMC_DEBUG_CONFIG) { - if ((inistring = inifile.Find("MACHINE", "EMC"))) { - strncpy(machine, *inistring, LINELEN-1); + if (auto inistring = inifile.Find("MACHINE", "EMC")) { + strncpy(machine, inistring->c_str(), LINELEN-1); } else { strncpy(machine, "unknown", LINELEN-1); } @@ -1468,15 +1467,15 @@ static int iniLoad(const char *filename) ); } - if ((inistring = inifile.Find("NML_FILE", "EMC"))) { + if (auto inistring = inifile.Find("NML_FILE", "EMC")) { // copy to global - rtapi_strxcpy(emc_nmlfile, *inistring); + rtapi_strxcpy(emc_nmlfile, inistring->c_str()); } else { // not found, use default } - if ((inistring = inifile.Find("MAX_FEED_OVERRIDE", "DISPLAY"))) { - if (1 == sscanf(*inistring, "%lf", &d) && d > 0.0) { + if (auto inistring = inifile.Find("MAX_FEED_OVERRIDE", "DISPLAY")) { + if (1 == sscanf(inistring->c_str(), "%lf", &d) && d > 0.0) { maxFeedOverride = d; } } @@ -1485,30 +1484,30 @@ static int iniLoad(const char *filename) inifile.Find(&maxMaxVelocity, "MAX_VELOCITY", "AXIS_X")) maxMaxVelocity = 1.0; - if ((inistring = inifile.Find("MIN_SPINDLE_OVERRIDE", "DISPLAY"))) { - if (1 == sscanf(*inistring, "%lf", &d) && d > 0.0) { + if (auto inistring = inifile.Find("MIN_SPINDLE_OVERRIDE", "DISPLAY")) { + if (1 == sscanf(inistring->c_str(), "%lf", &d) && d > 0.0) { minSpindleOverride = d; } } - if ((inistring = inifile.Find("MAX_SPINDLE_OVERRIDE", "DISPLAY"))) { - if (1 == sscanf(*inistring, "%lf", &d) && d > 0.0) { + if (auto inistring = inifile.Find("MAX_SPINDLE_OVERRIDE", "DISPLAY")) { + if (1 == sscanf(inistring->c_str(), "%lf", &d) && d > 0.0) { maxSpindleOverride = d; } } - inistring = inifile.Find("COORDINATES", "TRAJ"); + auto coord = inifile.Find("COORDINATES", "TRAJ"); num_axes = 0; - if (inistring) { - if(strchr(*inistring, 'x') || strchr(*inistring, 'X')) { axis_mask |= 0x0001; num_axes++; } - if(strchr(*inistring, 'y') || strchr(*inistring, 'Y')) { axis_mask |= 0x0002; num_axes++; } - if(strchr(*inistring, 'z') || strchr(*inistring, 'Z')) { axis_mask |= 0x0004; num_axes++; } - if(strchr(*inistring, 'a') || strchr(*inistring, 'A')) { axis_mask |= 0x0008; num_axes++; } - if(strchr(*inistring, 'b') || strchr(*inistring, 'B')) { axis_mask |= 0x0010; num_axes++; } - if(strchr(*inistring, 'c') || strchr(*inistring, 'C')) { axis_mask |= 0x0020; num_axes++; } - if(strchr(*inistring, 'u') || strchr(*inistring, 'U')) { axis_mask |= 0x0040; num_axes++; } - if(strchr(*inistring, 'v') || strchr(*inistring, 'V')) { axis_mask |= 0x0080; num_axes++; } - if(strchr(*inistring, 'w') || strchr(*inistring, 'W')) { axis_mask |= 0x0100; num_axes++; } + if (coord) { + if(coord->find_first_of("xX") != std::string::npos) { axis_mask |= 0x0001; num_axes++; } + if(coord->find_first_of("yY") != std::string::npos) { axis_mask |= 0x0002; num_axes++; } + if(coord->find_first_of("zZ") != std::string::npos) { axis_mask |= 0x0004; num_axes++; } + if(coord->find_first_of("aA") != std::string::npos) { axis_mask |= 0x0008; num_axes++; } + if(coord->find_first_of("bB") != std::string::npos) { axis_mask |= 0x0010; num_axes++; } + if(coord->find_first_of("cC") != std::string::npos) { axis_mask |= 0x0020; num_axes++; } + if(coord->find_first_of("uU") != std::string::npos) { axis_mask |= 0x0040; num_axes++; } + if(coord->find_first_of("vV") != std::string::npos) { axis_mask |= 0x0080; num_axes++; } + if(coord->find_first_of("wW") != std::string::npos) { axis_mask |= 0x0100; num_axes++; } } if (num_axes ==0) { rcs_print("halui: no [TRAJ]COORDINATES specified, enabling all axes\n"); @@ -1516,14 +1515,14 @@ static int iniLoad(const char *filename) axis_mask = 0xFFFF; } - if ((inistring = inifile.Find("JOINTS", "KINS"))) { - if (1 == sscanf(*inistring, "%d", &i) && i > 0) { + if (auto inistring = inifile.Find("JOINTS", "KINS")) { + if (1 == sscanf(inistring->c_str(), "%d", &i) && i > 0) { num_joints = i; } } - if ((inistring = inifile.Find("SPINDLES", "TRAJ"))) { - if (1 == sscanf(*inistring, "%d", &i) && i > 0) { + if (auto inistring = inifile.Find("SPINDLES", "TRAJ")) { + if (1 == sscanf(inistring->c_str(), "%d", &i) && i > 0) { num_spindles = i; } } @@ -1532,33 +1531,34 @@ static int iniLoad(const char *filename) have_home_all = 1; } - if ((inistring = inifile.Find("LINEAR_UNITS", "DISPLAY"))) { - if (!strcmp(*inistring, "AUTO")) { + if (auto inistring = inifile.Find("LINEAR_UNITS", "DISPLAY")) { + if (*inistring == "AUTO") { linearUnitConversion = LINEAR_UNITS_AUTO; - } else if (!strcmp(*inistring, "INCH")) { + } else if (*inistring == "INCH") { linearUnitConversion = LINEAR_UNITS_INCH; - } else if (!strcmp(*inistring, "MM")) { + } else if (*inistring == "MM") { linearUnitConversion = LINEAR_UNITS_MM; - } else if (!strcmp(*inistring, "CM")) { + } else if (*inistring == "CM") { linearUnitConversion = LINEAR_UNITS_CM; } } - if ((inistring = inifile.Find("ANGULAR_UNITS", "DISPLAY"))) { - if (!strcmp(*inistring, "AUTO")) { + if (auto inistring = inifile.Find("ANGULAR_UNITS", "DISPLAY")) { + if (*inistring == "AUTO") { angularUnitConversion = ANGULAR_UNITS_AUTO; - } else if (!strcmp(*inistring, "DEG")) { + } else if (*inistring == "DEG") { angularUnitConversion = ANGULAR_UNITS_DEG; - } else if (!strcmp(*inistring, "RAD")) { + } else if (*inistring == "RAD") { angularUnitConversion = ANGULAR_UNITS_RAD; - } else if (!strcmp(*inistring, "GRAD")) { + } else if (*inistring == "GRAD") { angularUnitConversion = ANGULAR_UNITS_GRAD; } } - std::optional mc; - while(num_mdi_commands < MDI_MAX && (mc = inifile.Find("MDI_COMMAND", "HALUI", num_mdi_commands+1))) { - mdi_commands[num_mdi_commands++] = strdup(*mc); + while(num_mdi_commands < MDI_MAX) { + auto mc = inifile.Find("MDI_COMMAND", "HALUI", num_mdi_commands+1); + if (!mc) break; + mdi_commands[num_mdi_commands++] = strdup(mc->c_str()); } // close it diff --git a/src/emc/usr_intf/shcom.cc b/src/emc/usr_intf/shcom.cc index 6fc27756fe7..adb2ff955ce 100644 --- a/src/emc/usr_intf/shcom.cc +++ b/src/emc/usr_intf/shcom.cc @@ -1250,7 +1250,6 @@ int sendProbe(double x, double y, double z) int iniLoad(const char *filename) { IniFile inifile; - std::optional inistring; char version[LINELEN], machine[LINELEN]; char displayString[LINELEN] = ""; int t; @@ -1263,28 +1262,28 @@ int iniLoad(const char *filename) // EMC debugging flags emc_debug = 0; // disabled by default - if ((inistring = inifile.Find("DEBUG", "EMC"))) { + if (auto inistring = inifile.Find("DEBUG", "EMC")) { // parse to global - if (sscanf(*inistring, "%x", &emc_debug) < 1) { + if (sscanf(inistring->c_str(), "%x", &emc_debug) < 1) { perror("failed to parse [EMC] DEBUG"); } } // set output for RCS messages set_rcs_print_destination(RCS_PRINT_TO_STDOUT); // use stdout by default - if ((inistring = inifile.Find("RCS_DEBUG_DEST", "EMC"))) { + if (auto inistring = inifile.Find("RCS_DEBUG_DEST", "EMC")) { static RCS_PRINT_DESTINATION_TYPE type; - if (!strcmp(*inistring, "STDOUT")) { + if (*inistring == "STDOUT") { type = RCS_PRINT_TO_STDOUT; - } else if (!strcmp(*inistring, "STDERR")) { + } else if (*inistring == "STDERR") { type = RCS_PRINT_TO_STDERR; - } else if (!strcmp(*inistring, "FILE")) { + } else if (*inistring == "FILE") { type = RCS_PRINT_TO_FILE; - } else if (!strcmp(*inistring, "LOGGER")) { + } else if (*inistring == "LOGGER") { type = RCS_PRINT_TO_LOGGER; - } else if (!strcmp(*inistring, "MSGBOX")) { + } else if (*inistring == "MSGBOX") { type = RCS_PRINT_TO_MESSAGE_BOX; - } else if (!strcmp(*inistring, "NULL")) { + } else if (*inistring == "NULL") { type = RCS_PRINT_TO_NULL; } else { type = RCS_PRINT_TO_STDOUT; @@ -1301,9 +1300,9 @@ int iniLoad(const char *filename) } // set flags if RCS_DEBUG in ini file - if ((inistring = inifile.Find("RCS_DEBUG", "EMC"))) { + if (auto inistring = inifile.Find("RCS_DEBUG", "EMC")) { long unsigned int flags; - if (sscanf(*inistring, "%lx", &flags) < 1) { + if (sscanf(inistring->c_str(), "%lx", &flags) < 1) { perror("failed to parse [EMC] RCS_DEBUG"); } // clear all flags @@ -1313,20 +1312,20 @@ int iniLoad(const char *filename) } // output infinite RCS errors by default max_rcs_errors_to_print = -1; - if ((inistring = inifile.Find("RCS_MAX_ERR", "EMC"))) { - if (sscanf(*inistring, "%d", &max_rcs_errors_to_print) < 1) { + if (auto inistring = inifile.Find("RCS_MAX_ERR", "EMC")) { + if (sscanf(inistring->c_str(), "%d", &max_rcs_errors_to_print) < 1) { perror("failed to parse [EMC] RCS_MAX_ERR"); } } strncpy(version, "unknown", LINELEN-1); - if ((inistring = inifile.Find("VERSION", "EMC"))) { - strncpy(version, *inistring, LINELEN-1); + if (auto inistring = inifile.Find("VERSION", "EMC")) { + strncpy(version, inistring->c_str(), LINELEN-1); } if (emc_debug & EMC_DEBUG_CONFIG) { - if ((inistring = inifile.Find("MACHINE", "EMC"))) { - strncpy(machine, *inistring, LINELEN-1); + if (auto inistring = inifile.Find("MACHINE", "EMC")) { + strncpy(machine, inistring->c_str(), LINELEN-1); } else { strncpy(machine, "unknown", LINELEN-1); } @@ -1338,10 +1337,10 @@ int iniLoad(const char *filename) ); } - if ((inistring = inifile.Find("NML_FILE", "EMC"))) { + if (auto inistring = inifile.Find("NML_FILE", "EMC")) { // copy to global - rtapi_strxcpy(emc_nmlfile, *inistring); + rtapi_strxcpy(emc_nmlfile, inistring->c_str()); } else { // not found, use default } @@ -1349,36 +1348,35 @@ int iniLoad(const char *filename) for (t = 0; t < EMCMOT_MAX_JOINTS; t++) { jogPol[t] = 1; // set to default snprintf(displayString, sizeof(displayString), "JOINT_%d", t); - if ((inistring = - inifile.Find("JOGGING_POLARITY", displayString)) && - 1 == sscanf(*inistring, "%d", &i) && i == 0) { + auto inistring = inifile.Find("JOGGING_POLARITY", displayString); + if (inistring && 1 == sscanf(inistring->c_str(), "%d", &i) && i == 0) { // it read as 0, so override default jogPol[t] = 0; } } - if ((inistring = inifile.Find("LINEAR_UNITS", "DISPLAY"))) { - if (!strcmp(*inistring, "AUTO")) { + if (auto inistring = inifile.Find("LINEAR_UNITS", "DISPLAY")) { + if (*inistring == "AUTO") { linearUnitConversion = LINEAR_UNITS_AUTO; - } else if (!strcmp(*inistring, "INCH")) { + } else if (*inistring == "INCH") { linearUnitConversion = LINEAR_UNITS_INCH; - } else if (!strcmp(*inistring, "MM")) { + } else if (*inistring == "MM") { linearUnitConversion = LINEAR_UNITS_MM; - } else if (!strcmp(*inistring, "CM")) { + } else if (*inistring == "CM") { linearUnitConversion = LINEAR_UNITS_CM; } } else { // not found, leave default alone } - if ((inistring = inifile.Find("ANGULAR_UNITS", "DISPLAY"))) { - if (!strcmp(*inistring, "AUTO")) { + if (auto inistring = inifile.Find("ANGULAR_UNITS", "DISPLAY")) { + if (*inistring == "AUTO") { angularUnitConversion = ANGULAR_UNITS_AUTO; - } else if (!strcmp(*inistring, "DEG")) { + } else if (*inistring == "DEG") { angularUnitConversion = ANGULAR_UNITS_DEG; - } else if (!strcmp(*inistring, "RAD")) { + } else if (*inistring == "RAD") { angularUnitConversion = ANGULAR_UNITS_RAD; - } else if (!strcmp(*inistring, "GRAD")) { + } else if (*inistring == "GRAD") { angularUnitConversion = ANGULAR_UNITS_GRAD; } } else { diff --git a/src/hal/user_comps/xhc-hb04.cc b/src/hal/user_comps/xhc-hb04.cc index ae32dd54dd7..e3bdeda2146 100644 --- a/src/hal/user_comps/xhc-hb04.cc +++ b/src/hal/user_comps/xhc-hb04.cc @@ -668,7 +668,6 @@ static int hal_setup() int read_ini_file(char *filename) { IniFile iniFile; - std::optional bt; int nb_buttons = 0; if (!iniFile.Open(filename)) { fprintf(stderr, "%s: Could not open configuration file: %s\n", @@ -676,9 +675,10 @@ int read_ini_file(char *filename) return -1; } - while ((bt = iniFile.Find("BUTTON", section, nb_buttons+1)) && nb_buttons < NB_MAX_BUTTONS) { - if (sscanf(*bt, "%x:%255s", &xhc.buttons[nb_buttons].code, xhc.buttons[nb_buttons].pin_name) !=2 ) { - fprintf(stderr, "%s: syntax error\n", *bt); + while (auto bt = iniFile.Find("BUTTON", section, nb_buttons+1)) { + if (nb_buttons >= NB_MAX_BUTTONS) break; + if (sscanf(bt->c_str(), "%x:%255s", &xhc.buttons[nb_buttons].code, xhc.buttons[nb_buttons].pin_name) !=2 ) { + fprintf(stderr, "%s: syntax error\n", bt->c_str()); return -1; } nb_buttons++; diff --git a/src/libnml/inifile/inifile.cc b/src/libnml/inifile/inifile.cc index 4ba8876ff43..f03f0a66789 100644 --- a/src/libnml/inifile/inifile.cc +++ b/src/libnml/inifile/inifile.cc @@ -93,7 +93,7 @@ IniFile::Find(int *result, StrIntPair *pPair, } int tmp; - if(sscanf(*pStr, "%i", &tmp) == 1){ + if(sscanf(pStr->c_str(), "%i", &tmp) == 1){ *result = tmp; if (lineno) *lineno = lineNo; @@ -101,7 +101,7 @@ IniFile::Find(int *result, StrIntPair *pPair, } while(pPair->pStr != NULL){ - if(strcasecmp(*pStr, pPair->pStr) == 0){ + if(strcasecmp(pStr->c_str(), pPair->pStr) == 0){ *result = pPair->value; if (lineno) *lineno = lineNo; @@ -129,7 +129,7 @@ IniFile::Find(double *result, StrDoublePair *pPair, } double tmp; - if(sscanf(*pStr, "%lf", &tmp) == 1){ + if(sscanf(pStr->c_str(), "%lf", &tmp) == 1){ if (lineno) *lineno = lineNo; *result = tmp; @@ -139,7 +139,7 @@ IniFile::Find(double *result, StrDoublePair *pPair, } while(pPair->pStr != NULL){ - if(strcasecmp(*pStr, pPair->pStr) == 0){ + if(strcasecmp(pStr->c_str(), pPair->pStr) == 0){ *result = pPair->value; if (lineno) *lineno = lineNo; @@ -163,12 +163,10 @@ IniFile::Find(double *result, StrDoublePair *pPair, @return pointer to the variable after the '=' delimiter, or @c NULL if not found */ -std::optional +std::optional IniFile::Find(const char *_tag, const char *_section, int _num, int *lineno) { - // WTF, return a pointer to the middle of a local buffer? - // FIX: this is totally non-reentrant. - static char line[LINELEN + 2] = ""; /* 1 for newline, 1 for NULL */ + char line[LINELEN + 2] = ""; /* 1 for newline, 1 for NULL */ char eline [(LINELEN + 2) * (MAX_EXTEND_LINES + 1)]; char* elineptr; @@ -345,7 +343,7 @@ IniFile::Find(const char *_tag, const char *_section, int _num, int *lineno) } if (lineno) *lineno = lineNo; - return valueString; + return std::string(valueString); } /* else continue */ } @@ -372,7 +370,7 @@ IniFile::FindString(char *dest, size_t n, const char *_tag, const char *_section auto res = Find(_tag, _section, _num, lineno); if(!res) return std::nullopt; - int r = snprintf(dest, n, "%s", *res); + int r = snprintf(dest, n, "%s", res->c_str()); if(r < 0 || (size_t)r >= n) { ThrowException(ERR_CONVERSION); return std::nullopt; @@ -386,7 +384,7 @@ IniFile::FindPath(char *dest, size_t n, const char *_tag, const char *_section, auto res = Find(_tag, _section, _num, lineno); if(!res) return std::nullopt; - if(TildeExpansion(*res, dest, n)) { + if(TildeExpansion(res->c_str(), dest, n)) { return std::nullopt; } return dest; @@ -598,7 +596,15 @@ iniFind(FILE *fp, const char *tag, const char *section) { IniFile f(false, fp); - return(f.Find(tag, section).value_or(nullptr)); + // Note: Using static storage for C API backward compatibility. + // This preserves the original non-reentrant behavior of the C API. + // The returned pointer is only valid until the next call. + // Callers needing to preserve the value should copy it immediately. + static std::string result_storage; + auto result = f.Find(tag, section); + if (!result) return nullptr; + result_storage = *result; + return result_storage.c_str(); } extern "C" int diff --git a/src/libnml/inifile/inifile.hh b/src/libnml/inifile/inifile.hh index b422cc1cc83..2c64e830be3 100644 --- a/src/libnml/inifile/inifile.hh +++ b/src/libnml/inifile/inifile.hh @@ -58,7 +58,7 @@ public: bool Close(); bool IsOpen(){ return(fp != nullptr); } - std::optional Find(const char *tag, const char *section = nullptr, + std::optional Find(const char *tag, const char *section = nullptr, int num = 1, int *lineno = nullptr); template diff --git a/src/libnml/inifile/inivar.cc b/src/libnml/inifile/inivar.cc index 7b316cfcb87..2a4fded0db5 100644 --- a/src/libnml/inifile/inivar.cc +++ b/src/libnml/inifile/inivar.cc @@ -117,10 +117,10 @@ int main(int argc, char *argv[]) if (iniString) { if (tildeExpand) { char expanded[PATH_MAX]; - iniFile.TildeExpansion(*iniString, expanded, sizeof(expanded)); + iniFile.TildeExpansion(iniString->c_str(), expanded, sizeof(expanded)); printf("%s\n", expanded); } else { - printf("%s\n", *iniString); + printf("%s\n", iniString->c_str()); } retval = 0; } else { From 5de306a8f9ed4ea10b164980fdfdfcd5968958a3 Mon Sep 17 00:00:00 2001 From: Luca Toniolo Date: Sat, 31 Jan 2026 19:42:13 +0800 Subject: [PATCH 7/9] inifile: Migrate C callers to new reentrant iniFindString() API Follow-up to the C++ IniFile::Find() reentrancy fix. The previous commit changed Find() to return std::string by value, but the C API wrapper iniFind() still used static storage, making it non-reentrant. Add iniFindString() that takes a caller-provided buffer, making it safe for concurrent use and multiple sequential calls. Reimplement iniFind() as a deprecated wrapper around iniFindString(). Migrate all C callers to iniFindString(): - mb2hal: 11 call sites - vfdb_vfd: 2 call sites - vfs11_vfd: 4 call sites - halcmd: 2 call sites Also clean up dead commented-out code in mb2hal and halrmt. --- src/hal/user_comps/mb2hal/mb2hal_init.c | 48 +++++++----------------- src/hal/user_comps/vfdb_vfd/vfdb_vfd.c | 6 ++- src/hal/user_comps/vfs11_vfd/vfs11_vfd.c | 12 +++--- src/hal/utils/halcmd.c | 11 +++--- src/hal/utils/halrmt.c | 6 --- src/libnml/inifile/inifile.cc | 25 ++++++------ src/libnml/inifile/inifile.h | 8 +++- 7 files changed, 51 insertions(+), 65 deletions(-) diff --git a/src/hal/user_comps/mb2hal/mb2hal_init.c b/src/hal/user_comps/mb2hal/mb2hal_init.c index 76a6abd89ae..ccd52748c6f 100644 --- a/src/hal/user_comps/mb2hal/mb2hal_init.c +++ b/src/hal/user_comps/mb2hal/mb2hal_init.c @@ -79,6 +79,7 @@ retCode parse_common_section() char *fnct_name = "parse_common_section"; char *section = "MB2HAL_INIT", *tag; const char *tmpstr; + char tmpbuf[INI_MAX_LINELEN]; if (gbl.ini_file_ptr == NULL) { ERR(gbl.init_dbg, "gbl.ini_file_ptr NULL pointer"); @@ -90,7 +91,7 @@ retCode parse_common_section() DBG(gbl.init_dbg, "[%s] [%s] [%d]", section, tag, gbl.init_dbg); tag = "VERSION"; //optional - tmpstr = iniFind(gbl.ini_file_ptr, tag, section); + tmpstr = iniFindString(gbl.ini_file_ptr, tag, section, tmpbuf, sizeof(tmpbuf)); if (tmpstr != NULL) { int major, minor; sscanf(tmpstr, "%d.%d", &major, &minor); @@ -99,7 +100,7 @@ retCode parse_common_section() DBG(gbl.init_dbg, "[%s] [%s] [%d]", section, tag, gbl.version); tag = "HAL_MODULE_NAME"; //optional - tmpstr = iniFind(gbl.ini_file_ptr, tag, section); + tmpstr = iniFindString(gbl.ini_file_ptr, tag, section, tmpbuf, sizeof(tmpbuf)); if (tmpstr != NULL) { gbl.hal_mod_name = strdup(tmpstr); } @@ -176,6 +177,7 @@ retCode parse_transaction_section(const int mb_tx_num) char section[40]; char *tag; const char *tmpstr; + char tmpbuf[INI_MAX_LINELEN]; mb_tx_t *this_mb_tx; if (gbl.ini_file_ptr == NULL) { @@ -197,7 +199,7 @@ retCode parse_transaction_section(const int mb_tx_num) snprintf(section, sizeof(section)-1, "TRANSACTION_%02d", mb_tx_num); tag = "LINK_TYPE"; //required 1st time, then optional - tmpstr = iniFind(gbl.ini_file_ptr, tag, section); + tmpstr = iniFindString(gbl.ini_file_ptr, tag, section, tmpbuf, sizeof(tmpbuf)); if (tmpstr != NULL) { if (strcasecmp(tmpstr, "tcp") == retOK) { this_mb_tx->cfg_link_type = linkTCP; @@ -274,7 +276,7 @@ retCode parse_transaction_section(const int mb_tx_num) tag = "PIN_NAMES"; - tmpstr = iniFind(gbl.ini_file_ptr, tag, section); + tmpstr = iniFindString(gbl.ini_file_ptr, tag, section, tmpbuf, sizeof(tmpbuf)); if (tmpstr != NULL) { if(parse_pin_names(tmpstr, this_mb_tx) != retOK) { @@ -344,7 +346,7 @@ retCode parse_transaction_section(const int mb_tx_num) DBG(gbl.init_dbg, "[%s] [%s] [%d]", section, tag, this_mb_tx->cfg_debug); tag = "MB_TX_CODE"; //required - tmpstr = iniFind(gbl.ini_file_ptr, tag, section); + tmpstr = iniFindString(gbl.ini_file_ptr, tag, section, tmpbuf, sizeof(tmpbuf)); if (tmpstr != NULL) { int i; for (i=0 ; imb_tx_fnct_name, this_mb_tx->mb_tx_fnct); tag = "HAL_TX_NAME"; //optional - tmpstr = iniFind(gbl.ini_file_ptr, tag, section); + tmpstr = iniFindString(gbl.ini_file_ptr, tag, section, tmpbuf, sizeof(tmpbuf)); if (tmpstr != NULL) { strncpy(this_mb_tx->hal_tx_name, tmpstr, HAL_NAME_LEN); } @@ -376,32 +378,6 @@ retCode parse_transaction_section(const int mb_tx_num) } DBG(gbl.init_dbg, "[%s] [%s] [%s]", section, tag, this_mb_tx->hal_tx_name); - /* - str = iniFind(gbl.ini_file_ptr, "PINNAME", mb_tx_name); - if (str != NULL) { - pin_name = malloc(strlen(str) + 1); - rtapi_strxcpy(pin_name, str); // convert a const string into one - // we can modify - } - else { - pin_name = malloc(1); // empty string - *pin_name = 0; - } - if (mb_tx->name[0] != 0) { - strncpy(mb_tx_name, mb_tx->name, HAL_NAME_LEN); - } - else { - snprintf(mb_tx_name, sizeof(mb_tx_name), "%02d", mb_tx_num); - } - memcpy(&gbl.mb_tx[mb_tx_num], mb_tx, sizeof(mb_tx_t)); - rc = create_pins(mb_tx_name, &gbl.mb_tx[mb_tx_num], pin_name); - free(pin_name); - if (rc != retOK) { - ERR(gbl.init_dbg, "Failed to create pins"); - return retERR; - } - */ - return retOK; } @@ -410,6 +386,7 @@ retCode parse_tcp_subsection(const char *section, const int mb_tx_num) char *fnct_name="parse_tcp_subsection"; char *tag; const char *tmpstr; + char tmpbuf[INI_MAX_LINELEN]; mb_tx_t *this_mb_tx; if (gbl.ini_file_ptr == NULL || section == NULL) { @@ -424,7 +401,7 @@ retCode parse_tcp_subsection(const char *section, const int mb_tx_num) this_mb_tx = &gbl.mb_tx[mb_tx_num]; tag = "TCP_IP"; //required 1st time, then optional - tmpstr = iniFind(gbl.ini_file_ptr, tag, section); + tmpstr = iniFindString(gbl.ini_file_ptr, tag, section, tmpbuf, sizeof(tmpbuf)); if (tmpstr != NULL) { strncpy(this_mb_tx->cfg_tcp_ip, tmpstr, sizeof(this_mb_tx->cfg_tcp_ip)-1); } @@ -466,6 +443,7 @@ retCode parse_serial_subsection(const char *section, const int mb_tx_num) char *fnct_name="parse_serial_subsection"; char *tag; const char *tmpstr; + char tmpbuf[INI_MAX_LINELEN]; mb_tx_t *this_mb_tx; if (gbl.ini_file_ptr == NULL || section == NULL) { @@ -480,7 +458,7 @@ retCode parse_serial_subsection(const char *section, const int mb_tx_num) this_mb_tx = &gbl.mb_tx[mb_tx_num]; tag = "SERIAL_PORT"; //required 1st time - tmpstr = iniFind(gbl.ini_file_ptr, tag, section); + tmpstr = iniFindString(gbl.ini_file_ptr, tag, section, tmpbuf, sizeof(tmpbuf)); if (tmpstr != NULL) { strncpy(this_mb_tx->cfg_serial_device, tmpstr, sizeof(this_mb_tx->cfg_serial_device)-1); } @@ -548,7 +526,7 @@ retCode parse_serial_subsection(const char *section, const int mb_tx_num) DBG(gbl.init_dbg, "[%s] [%s] [%d]", section, tag, this_mb_tx->cfg_serial_data_bit); tag = "SERIAL_PARITY"; //required 1st time - tmpstr = iniFind(gbl.ini_file_ptr, tag, section); + tmpstr = iniFindString(gbl.ini_file_ptr, tag, section, tmpbuf, sizeof(tmpbuf)); if (tmpstr != NULL) { strncpy(this_mb_tx->cfg_serial_parity, tmpstr, sizeof(this_mb_tx->cfg_serial_parity)-1); } diff --git a/src/hal/user_comps/vfdb_vfd/vfdb_vfd.c b/src/hal/user_comps/vfdb_vfd/vfdb_vfd.c index df38f7ba9a3..218f5aeceb7 100644 --- a/src/hal/user_comps/vfdb_vfd/vfdb_vfd.c +++ b/src/hal/user_comps/vfdb_vfd/vfdb_vfd.c @@ -278,11 +278,12 @@ enum kwdresult {NAME_NOT_FOUND, KEYWORD_INVALID, KEYWORD_FOUND}; int findkwd(param_pointer p, const char *name, int *result, const char *keyword, int value, ...) { const char *word; + char wordbuf[INI_MAX_LINELEN]; va_list ap; const char *kwds[MAX_KWD], **s; int nargs = 0; - if ((word = iniFind(p->fp, name, p->section)) == NULL) + if ((word = iniFindString(p->fp, name, p->section, wordbuf, sizeof(wordbuf))) == NULL) return NAME_NOT_FOUND; kwds[nargs++] = keyword; @@ -311,6 +312,7 @@ int findkwd(param_pointer p, const char *name, int *result, const char *keyword, int read_ini(param_pointer p) { const char *s; + char sbuf[INI_MAX_LINELEN]; int value; if ((p->fp = fopen(p->inifile,"r")) != NULL) { @@ -328,7 +330,7 @@ int read_ini(param_pointer p) iniFindInt(p->fp, "MOTOR_HZ", p->section, &p->motor_hz); iniFindInt(p->fp, "MOTOR_RPM", p->section, &p->motor_rpm); - if ((s = iniFind(p->fp, "DEVICE", p->section))) { + if ((s = iniFindString(p->fp, "DEVICE", p->section, sbuf, sizeof(sbuf)))) { p->device = strdup(s); } value = p->parity; diff --git a/src/hal/user_comps/vfs11_vfd/vfs11_vfd.c b/src/hal/user_comps/vfs11_vfd/vfs11_vfd.c index 6304fe38306..8b172337610 100644 --- a/src/hal/user_comps/vfs11_vfd/vfs11_vfd.c +++ b/src/hal/user_comps/vfs11_vfd/vfs11_vfd.c @@ -398,11 +398,12 @@ enum kwdresult {NAME_NOT_FOUND, KEYWORD_INVALID, KEYWORD_FOUND}; int findkwd(param_pointer p, const char *name, int *result, const char *keyword, int value, ...) { const char *word; + char wordbuf[INI_MAX_LINELEN]; va_list ap; const char *kwds[MAX_KWD], **s; int nargs = 0; - if ((word = iniFind(p->fp, name, p->section)) == NULL) + if ((word = iniFindString(p->fp, name, p->section, wordbuf, sizeof(wordbuf))) == NULL) return NAME_NOT_FOUND; kwds[nargs++] = keyword; @@ -431,6 +432,7 @@ int findkwd(param_pointer p, const char *name, int *result, const char *keyword, int read_ini(param_pointer p) { const char *s; + char sbuf[INI_MAX_LINELEN]; double f; int value; @@ -447,10 +449,10 @@ int read_ini(param_pointer p) iniFindInt(p->fp, "PORT", p->section, &p->tcp_portno); iniFindInt(p->fp, "RECONNECT_DELAY", p->section, &p->reconnect_delay); - if ((s = iniFind(p->fp, "TCPDEST", p->section))) { + if ((s = iniFindString(p->fp, "TCPDEST", p->section, sbuf, sizeof(sbuf)))) { p->tcp_destip = strdup(s); } - if ((s = iniFind(p->fp, "DEVICE", p->section))) { + if ((s = iniFindString(p->fp, "DEVICE", p->section, sbuf, sizeof(sbuf)))) { p->device = strdup(s); } if (iniFindDouble(p->fp, "RESPONSE_TIMEOUT", p->section, &f)) { @@ -478,10 +480,10 @@ int read_ini(param_pointer p) (void *)NULL) == KEYWORD_INVALID) return -1; #else - if (iniFind(p->fp, "RTS_MODE", p->section) != NULL) { + if (iniFindString(p->fp, "RTS_MODE", p->section, sbuf, sizeof(sbuf)) != NULL) { fprintf(stderr,"%s: warning - the RTS_MODE feature is not available with the installed libmodbus version (%s).\n" "to enable it, uninstall libmodbus-dev and rebuild with " - "libmodbus built http://github.com/stephane/libmodbus:master .\n", + "libmodbus built http://github.com/stephane/libmodbus:master .\n", LIBMODBUS_VERSION_STRING, p->progname); } #endif diff --git a/src/hal/utils/halcmd.c b/src/hal/utils/halcmd.c index e45f08f0793..1486c22ea00 100644 --- a/src/hal/utils/halcmd.c +++ b/src/hal/utils/halcmd.c @@ -46,7 +46,7 @@ #include "emc/linuxcnc.h" #ifndef NO_INI -#include "inifile.h" /* iniFind() from libnml */ +#include "inifile.h" /* iniFindString() from libnml */ FILE *halcmd_inifile = NULL; #endif @@ -707,7 +707,7 @@ static int replace_vars(char *source_str, char *dest_str, int max_chars, char ** { int retval = 0; int next_delim, remaining, buf_space; - char *replacement, sec[128], var[128]; + char *replacement, sec[128], var[128], ini_buf[INI_MAX_LINELEN]; static char info[256]; char *sp=source_str, *dp=dest_str, *secP, *varP; const char @@ -776,11 +776,12 @@ static int replace_vars(char *source_str, char *dest_str, int max_chars, char ** var[next_delim]='\0'; if ( strlen(sec) > 0 ) { /* get value from INI file */ - /* cast to char ptr, we are discarding the 'const' */ - replacement = (char *) iniFind(halcmd_inifile, var, sec); + replacement = (char *) iniFindString(halcmd_inifile, var, sec, + ini_buf, sizeof(ini_buf)); } else { /* no section specified */ - replacement = (char *) iniFind(halcmd_inifile, var, NULL); + replacement = (char *) iniFindString(halcmd_inifile, var, NULL, + ini_buf, sizeof(ini_buf)); } if (replacement==NULL) { *detail = info; diff --git a/src/hal/utils/halrmt.c b/src/hal/utils/halrmt.c index c7486a41662..85c21853770 100644 --- a/src/hal/utils/halrmt.c +++ b/src/hal/utils/halrmt.c @@ -303,12 +303,6 @@ #include // rtapi_strlcpy #include "hal.h" // HAL public API decls #include "../hal_priv.h" // private HAL decls -/* non-EMC related uses of halrmt may want to avoid libnml dependency -#ifndef NO_INI -#include "inifile.h" // iniFind() from libnml -#endif -#include -*/ /*********************************************************************** * LOCAL FUNCTION DECLARATIONS * diff --git a/src/libnml/inifile/inifile.cc b/src/libnml/inifile/inifile.cc index f03f0a66789..35e1234c0df 100644 --- a/src/libnml/inifile/inifile.cc +++ b/src/libnml/inifile/inifile.cc @@ -592,19 +592,22 @@ IniFile::Exception::Print(FILE *fp) extern "C" const char * -iniFind(FILE *fp, const char *tag, const char *section) +iniFindString(FILE *fp, const char *tag, const char *section, + char *buf, size_t bufsize) { - IniFile f(false, fp); - - // Note: Using static storage for C API backward compatibility. - // This preserves the original non-reentrant behavior of the C API. - // The returned pointer is only valid until the next call. - // Callers needing to preserve the value should copy it immediately. - static std::string result_storage; - auto result = f.Find(tag, section); + IniFile f(false, fp); + auto result = f.FindString(buf, bufsize, tag, section); if (!result) return nullptr; - result_storage = *result; - return result_storage.c_str(); + return *result; +} + +extern "C" const char * +iniFind(FILE *fp, const char *tag, const char *section) +{ + // Deprecated: This function uses static storage and is not reentrant. + // Use iniFindString() instead for thread-safe operation. + static char result_storage[LINELEN]; + return iniFindString(fp, tag, section, result_storage, sizeof(result_storage)); } extern "C" int diff --git a/src/libnml/inifile/inifile.h b/src/libnml/inifile/inifile.h index 09a8c338d50..d0f31535c7b 100644 --- a/src/libnml/inifile/inifile.h +++ b/src/libnml/inifile/inifile.h @@ -25,7 +25,13 @@ extern "C" { #endif -extern const char *iniFind(FILE *fp, const char *tag, const char *section); +// Recommended buffer size for iniFindString() +#define INI_MAX_LINELEN 256 + +extern const char *iniFind(FILE *fp, const char *tag, const char *section) + __attribute__((deprecated("use iniFindString() instead"))); +extern const char *iniFindString(FILE *fp, const char *tag, const char *section, + char *buf, size_t bufsize); extern int iniFindInt(FILE *fp, const char *tag, const char *section, int *result); extern int iniFindDouble(FILE *fp, const char *tag, const char *section, double *result); extern int TildeExpansion(const char *file, char *path, size_t size); From 43f9f094858422794b5834880a60b7df0616e61d Mon Sep 17 00:00:00 2001 From: Bertho Stultiens Date: Fri, 30 Jan 2026 14:28:26 +0100 Subject: [PATCH 8/9] configure: workaround "maybe uninitialized" when compiling with g++ 15.2. --- src/configure.ac | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/src/configure.ac b/src/configure.ac index 8f15816f229..f5c469ea89e 100644 --- a/src/configure.ac +++ b/src/configure.ac @@ -987,6 +987,30 @@ if test "x" = "x$BOOST_PYTHON_LIB"; then DEPFOUND=false fi +# Test for a "maybe uninitialized" in the python::boost library in +# extract when compiled with g++ 15.2.[01] and maybe others. +# The test needs to have -O2 and -Wall enabled to expose the probem. +AC_LANG_PUSH([C++]) +CPPFLAGS_SAVED="$CPPFLAGS" +CPPFLAGS="$PYTHON_CPPFLAGS $BOOST_CPPFLAGS $CPPFLAGS -O2 -Wall -Werror" +AC_CACHE_CHECK(whether $CXX has a "maybe uninitialized" false positive, ax_cv_cxx_boost_maybe_uninit, + [AC_COMPILE_IFELSE([AC_LANG_SOURCE([[ +#include +std::string func(boost::python::object& o) { + return boost::python::extract(o); +} +int main() { return 0; } +]])], + [ax_cv_cxx_boost_maybe_uninit=no], + [ax_cv_cxx_boost_maybe_uninit=yes]) + ] +) +CPPFLAGS="$CPPFLAGS_SAVED" +if test x$ax_cv_cxx_boost_maybe_uninit = xyes; then + CPPFLAGS="$CPPFLAGS -Wno-maybe-uninitialized" +fi +AC_LANG_POP([C++]) + AC_MSG_CHECKING([whether to build documentation]) AC_ARG_ENABLE(build-documentation, AS_HELP_STRING( From 6e4f63222029694c59d8b0947b37a796cd5f0932 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Robert=20Sch=C3=B6ftner?= Date: Fri, 30 Jan 2026 11:36:57 +0100 Subject: [PATCH 9/9] change how signal handler raises fatal signal to enable core dump files --- src/rtapi/uspace_rtapi_app.cc | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/rtapi/uspace_rtapi_app.cc b/src/rtapi/uspace_rtapi_app.cc index e8d3615f4d0..d72acf72735 100644 --- a/src/rtapi/uspace_rtapi_app.cc +++ b/src/rtapi/uspace_rtapi_app.cc @@ -693,7 +693,9 @@ static void signal_handler(int sig, siginfo_t * /*si*/, void * /*uctx*/) "rtapi_app: caught signal %d - dumping core\n", sig); sleep(1); // let syslog drain signal(sig, SIG_DFL); - raise(sig); + // for reasons unknown raise(sig); doesn't lead to core dump file + // but this will + kill(getpid(), sig); break; } exit(1);