From 64d87af2dfb5c5488d3e8f9a6a50681262212eb6 Mon Sep 17 00:00:00 2001 From: alkabal <33371787+alkabal@users.noreply.github.com> Date: Fri, 14 May 2021 22:07:42 +0200 Subject: [PATCH 01/85] update 2.8 from master for xhc-whb04b-6 --- .../xhc-whb04b-6/example-configuration.md | 14 +++++--- src/hal/user_comps/xhc-whb04b-6/hal.cc | 35 +++++++++++++++++-- src/hal/user_comps/xhc-whb04b-6/hal.h | 13 +++++++ 3 files changed, 54 insertions(+), 8 deletions(-) diff --git a/src/hal/user_comps/xhc-whb04b-6/example-configuration.md b/src/hal/user_comps/xhc-whb04b-6/example-configuration.md index b99730fbbcc..8cea499435f 100644 --- a/src/hal/user_comps/xhc-whb04b-6/example-configuration.md +++ b/src/hal/user_comps/xhc-whb04b-6/example-configuration.md @@ -66,6 +66,10 @@ net pdnt.mode.is-mdi halui.mode.is-mdi net pdnt.mode.is-joint halui.mode.is-joint whb.halui.mode.is-joint net pdnt.mode.is-teleop halui.mode.is-teleop whb.halui.mode.is-teleop +# "is-homed" axis signal for allowing pendant when machine is not homed +net pdnt.axis.X.is-homed halui.joint.0.is-homed whb.halui.joint.x.is-homed +net pdnt.axis.Y.is-homed halui.joint.1.is-homed whb.halui.joint.y.is-homed +net pdnt.axis.Z.is-homed halui.joint.2.is-homed whb.halui.joint.z.is-homed # "selected axis" signals net pdnt.axis.X.select whb.halui.axis.x.select halui.axis.x.select @@ -92,17 +96,17 @@ net pdnt.axis.z.jog-vel-mode whb.axis.z.jog-vel-mode # macro buttons to MDI commands net pdnt.macro-1 whb.button.macro-1 halui.mdi-command-01 # use MDI command from main.ini net pdnt.macro-2 whb.button.macro-2 halui.mdi-command-02 # use MDI command from main.ini or used for Hardcoded lube on/off -net pdnt.reserved.for.spindle+ whb.button.macro-3 # Harcoded for spindle+ whb.halui.spindle.increase -net pdnt.reserved.for.spindle- whb.button.macro-4 # Harcoded for spindle- whb.halui.spindle.decrease +net pdnt.reserved.for.spindle+ whb.button.macro-3 # Hardcoded for spindle+ whb.halui.spindle.increase +net pdnt.reserved.for.spindle- whb.button.macro-4 # Hardcoded for spindle- whb.halui.spindle.decrease net pdnt.macro-5 whb.button.macro-5 halui.mdi-command-05 # use MDI command from main.ini net pdnt.macro-6 whb.button.macro-6 halui.mdi-command-06 # use MDI command from main.ini net pdnt.macro-7 whb.button.macro-7 halui.mdi-command-07 # use MDI command from main.ini -net pdnt.reserved.for.spindle.dir whb.button.macro-8 # Harcoded for spindle direction inside pendant +net pdnt.reserved.for.spindle.dir whb.button.macro-8 # Hardcoded for spindle direction inside pendant net pdnt.macro-9 whb.button.macro-9 halui.mdi-command-09 # use MDI command from main.ini net pdnt.reserved.for.ABS-REL whb.button.macro-10 # Hardcoded for swap Dro Relative/Absolue net pdnt.macro-14 whb.button.macro-14 halui.mdi-command-14 # use MDI command from main.ini -net pdnt.reserved.for.flood whb.button.macro-15 # Harcoded for halui.flood on/off -net pdnt.reserved.for.mist whb.button.macro-16 # Harcoded for halui.mist on/off +net pdnt.reserved.for.flood whb.button.macro-15 # Hardcoded for halui.flood on/off +net pdnt.reserved.for.mist whb.button.macro-16 # Hardcoded for halui.mist on/off net pdnt.macro.11 whb.button.macro-11 halui.mdi-command-11 # use MDI command from main.ini net pdnt.macro.12 whb.button.macro-12 halui.mdi-command-12 # use MDI command from main.ini diff --git a/src/hal/user_comps/xhc-whb04b-6/hal.cc b/src/hal/user_comps/xhc-whb04b-6/hal.cc index f26dc9aa470..878df18e7b0 100644 --- a/src/hal/user_comps/xhc-whb04b-6/hal.cc +++ b/src/hal/user_comps/xhc-whb04b-6/hal.cc @@ -118,6 +118,15 @@ Hal::~Hal() freeSimulatedPin((void**)(&memory->in.isModeMdi)); freeSimulatedPin((void**)(&memory->in.isModeTeleop)); + // If axis is not homed we need to ask Teleop mode but we need to bypass that if machine is homed + // https://forum.linuxcnc.org/49-basic-configuration/40581-how-to-configure-a-xhc-whb04b-pendant + freeSimulatedPin((void**)(&memory->in.JointXisHomed)); + freeSimulatedPin((void**)(&memory->in.JointYisHomed)); + freeSimulatedPin((void**)(&memory->in.JointZisHomed)); + freeSimulatedPin((void**)(&memory->in.JointAisHomed)); + freeSimulatedPin((void**)(&memory->in.JointBisHomed)); + freeSimulatedPin((void**)(&memory->in.JointCisHomed)); + freeSimulatedPin((void**)(&memory->in.isMachineOn)); constexpr size_t pinsCount = sizeof(memory->out.button_pin) / sizeof(hal_bit_t * ); @@ -543,6 +552,18 @@ void Hal::init(const MetaButtonCodes* metaButtons, const KeyCodes& keyCodes) newHalBit(HAL_IN, &(memory->in.isModeManual), mHalCompId, "%s.halui.mode.is-manual", mComponentPrefix); newHalBit(HAL_IN, &(memory->in.isModeMdi), mHalCompId, "%s.halui.mode.is-mdi", mComponentPrefix); newHalBit(HAL_IN, &(memory->in.isModeTeleop), mHalCompId, "%s.halui.mode.is-teleop", mComponentPrefix); + + + // If axis is not homed we need to ask Teleop mode but we need to bypass that if machine is homed + // https://forum.linuxcnc.org/49-basic-configuration/40581-how-to-configure-a-xhc-whb04b-pendant + newHalBit(HAL_IN, &(memory->in.JointXisHomed), mHalCompId, "%s.halui.joint.x.is-homed", mComponentPrefix); + newHalBit(HAL_IN, &(memory->in.JointYisHomed), mHalCompId, "%s.halui.joint.y.is-homed", mComponentPrefix); + newHalBit(HAL_IN, &(memory->in.JointZisHomed), mHalCompId, "%s.halui.joint.z.is-homed", mComponentPrefix); + newHalBit(HAL_IN, &(memory->in.JointAisHomed), mHalCompId, "%s.halui.joint.a.is-homed", mComponentPrefix); + newHalBit(HAL_IN, &(memory->in.JointBisHomed), mHalCompId, "%s.halui.joint.b.is-homed", mComponentPrefix); + newHalBit(HAL_IN, &(memory->in.JointCisHomed), mHalCompId, "%s.halui.joint.c.is-homed", mComponentPrefix); + + newHalBit(HAL_OUT, &(memory->out.doModeAuto), mHalCompId, "%s.halui.mode.auto", mComponentPrefix); newHalBit(HAL_OUT, &(memory->out.doModeJoint), mHalCompId, "%s.halui.mode.joint", mComponentPrefix); newHalBit(HAL_OUT, &(memory->out.doModeManual), mHalCompId, "%s.halui.mode.manual", mComponentPrefix); @@ -986,7 +1007,7 @@ void Hal::toggleSpindleDirection(bool enabled) } else { - *memory->out.spindleDoRunReverse = true; + *memory->out.spindleDoRunReverse = true; *memory->out.spindleDoIncrease = true; } } @@ -1298,8 +1319,16 @@ void Hal::setPin(bool enabled, const char* pinName) // ---------------------------------------------------------------------- void Hal::setJogCounts(const HandWheelCounters& counters) { - requestManualMode(true); - requestTeleopMode(true); + // If axis is not homed we need to ask Teleop mode but we need to bypass that if machine is homed + // https://forum.linuxcnc.org/49-basic-configuration/40581-how-to-configure-a-xhc-whb04b-pendant + if (*memory->out.axisXSelect && false == *memory->in.JointXisHomed) {requestTeleopMode(true);} + else if (*memory->out.axisYSelect && false == *memory->in.JointYisHomed) {requestTeleopMode(true);} + else if (*memory->out.axisZSelect && false == *memory->in.JointZisHomed) {requestTeleopMode(true);} + else if (*memory->out.axisASelect && false == *memory->in.JointAisHomed) {requestTeleopMode(true);} + else if (*memory->out.axisBSelect && false == *memory->in.JointBisHomed) {requestTeleopMode(true);} + else if (*memory->out.axisCSelect && false == *memory->in.JointCisHomed) {requestTeleopMode(true);} + {requestManualMode(true);} + *memory->out.axisXJogCounts = counters.counts(HandWheelCounters::CounterNameToIndex::AXIS_X); *memory->out.axisYJogCounts = counters.counts(HandWheelCounters::CounterNameToIndex::AXIS_Y); *memory->out.axisZJogCounts = counters.counts(HandWheelCounters::CounterNameToIndex::AXIS_Z); diff --git a/src/hal/user_comps/xhc-whb04b-6/hal.h b/src/hal/user_comps/xhc-whb04b-6/hal.h index 2d80d265759..173d2b89be1 100644 --- a/src/hal/user_comps/xhc-whb04b-6/hal.h +++ b/src/hal/user_comps/xhc-whb04b-6/hal.h @@ -158,6 +158,19 @@ class HalMemory //! to be connected to \ref halui.mode.is-teleop hal_bit_t* isModeTeleop{nullptr}; + + // If axis is not homed we need to ask Teleop mode but we need to bypass that if machine is homed + // https://forum.linuxcnc.org/49-basic-configuration/40581-how-to-configure-a-xhc-whb04b-pendant + hal_bit_t* JointXisHomed{nullptr}; + hal_bit_t* JointYisHomed{nullptr}; + hal_bit_t* JointZisHomed{nullptr}; + hal_bit_t* JointAisHomed{nullptr}; + hal_bit_t* JointBisHomed{nullptr}; + hal_bit_t* JointCisHomed{nullptr}; + + + + //! to be connected to \ref halui.machine.is-on hal_bit_t* isMachineOn{nullptr}; From e965a86ba7e35050386593d797d5fa4442710d94 Mon Sep 17 00:00:00 2001 From: alkabal <33371787+alkabal@users.noreply.github.com> Date: Tue, 18 May 2021 20:33:39 +0200 Subject: [PATCH 02/85] Typo correction Axis.py "Geometry reading" XYZBCUVW > XYZABCUVW Master branch use XYZABCUVW --- src/emc/usr_intf/axis/scripts/axis.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/emc/usr_intf/axis/scripts/axis.py b/src/emc/usr_intf/axis/scripts/axis.py index 39ee33697bc..7e50578d9a3 100755 --- a/src/emc/usr_intf/axis/scripts/axis.py +++ b/src/emc/usr_intf/axis/scripts/axis.py @@ -3298,7 +3298,7 @@ def units(s, d=1.0): max_feed_override = int(max_feed_override * 100 + 0.5) max_spindle_override = int(max_spindle_override * 100 + 0.5) default_spindle_speed = int(inifile.find("DISPLAY", "DEFAULT_SPINDLE_SPEED") or 1) -geometry = inifile.find("DISPLAY", "GEOMETRY") or "XYZBCUVW" +geometry = inifile.find("DISPLAY", "GEOMETRY") or "XYZABCUVW" geometry = re.split(" *(-?[XYZABCUVW])", geometry.upper()) geometry = "".join(reversed(geometry)) From af05f21738bdac6e10d0dc3059bcbdeb7d5365c6 Mon Sep 17 00:00:00 2001 From: alkabal <33371787+alkabal@users.noreply.github.com> Date: Tue, 18 May 2021 20:43:51 +0200 Subject: [PATCH 03/85] Alkabal patch add an axisui.abort pin --- src/emc/usr_intf/axis/scripts/axis.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/emc/usr_intf/axis/scripts/axis.py b/src/emc/usr_intf/axis/scripts/axis.py index 39ee33697bc..499fc96db73 100755 --- a/src/emc/usr_intf/axis/scripts/axis.py +++ b/src/emc/usr_intf/axis/scripts/axis.py @@ -2346,8 +2346,11 @@ def task_pauseresume(*event): def task_stop(*event): if s.task_mode == linuxcnc.MODE_AUTO and vars.running_line.get() != 0: o.set_highlight_line(vars.running_line.get()) + comp["abort"] = True c.abort() c.wait_complete() + time.sleep(0.3) + comp["abort"] = False def mdi_up_cmd(*args): if args and args[0].char: return # e.g., for KP_Up with numlock on @@ -3845,6 +3848,7 @@ def select_run_from(e): comp.newpin("notifications-clear-error",hal.HAL_BIT,hal.HAL_IN) comp.newpin("resume-inhibit",hal.HAL_BIT,hal.HAL_IN) comp.newpin("error", hal.HAL_BIT, hal.HAL_OUT) + comp.newpin("abort", hal.HAL_BIT, hal.HAL_OUT) vars.has_ladder.set(hal.component_exists('classicladder_rt')) From 025e37936c1efa2e54e0c0a560be52e7d7c41456 Mon Sep 17 00:00:00 2001 From: alkabal <33371787+alkabal@users.noreply.github.com> Date: Tue, 18 May 2021 21:13:44 +0200 Subject: [PATCH 04/85] Alkabal patch add an axisui.abort pin documentation --- docs/src/gui/axis.txt | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/docs/src/gui/axis.txt b/docs/src/gui/axis.txt index 26e03685095..d3664f64bad 100644 --- a/docs/src/gui/axis.txt +++ b/docs/src/gui/axis.txt @@ -1057,6 +1057,14 @@ Type Dir Name float OUT axisui.jog.increment ---- +Axis has a Hal output pin that indicates when an abort has occurred. The +'axisui.abort' pin will be 'TRUE' and come back to 'FALSE' after 0.3ms. + +---- +Type Dir Name +bit OUT axisui.abort +---- + Axis has a Hal output pin that indicates when an error has occurred. The 'axisui.error' pin will remain 'TRUE' until all error notifications have been dismissed. From c12345e9284a8666ba33e402c724653e977ee2ab Mon Sep 17 00:00:00 2001 From: alkabal <33371787+alkabal@users.noreply.github.com> Date: Mon, 31 May 2021 00:40:24 +0200 Subject: [PATCH 05/85] add missing information to manual 2.8 for xhc-whb04b-6 --- docs/src/man/man1/xhc-whb04b-6.1.txt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/src/man/man1/xhc-whb04b-6.1.txt b/docs/src/man/man1/xhc-whb04b-6.1.txt index 4913f14b85e..4f98237062c 100644 --- a/docs/src/man/man1/xhc-whb04b-6.1.txt +++ b/docs/src/man/man1/xhc-whb04b-6.1.txt @@ -464,6 +464,10 @@ net pdnt.mode.is-mdi halui.mode.is-mdi net pdnt.mode.is-joint halui.mode.is-joint whb.halui.mode.is-joint net pdnt.mode.is-teleop halui.mode.is-teleop whb.halui.mode.is-teleop +# "is-homed" axis signal for allowing pendant when machine is not homed +net pdnt.axis.X.is-homed halui.joint.0.is-homed whb.halui.joint.x.is-homed +net pdnt.axis.Y.is-homed halui.joint.1.is-homed whb.halui.joint.y.is-homed +net pdnt.axis.Z.is-homed halui.joint.2.is-homed whb.halui.joint.z.is-homed # "selected axis" signals net pdnt.axis.X.select whb.halui.axis.x.select halui.axis.x.select From 8abbff0025b6fa0ad9c8003b994f442df5ad08db Mon Sep 17 00:00:00 2001 From: andypugh Date: Sun, 20 Jun 2021 19:59:22 +0100 Subject: [PATCH 06/85] 2.8.2 Release --- VERSION | 2 +- debian/changelog | 44 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 45 insertions(+), 1 deletion(-) diff --git a/VERSION b/VERSION index dbe59006547..1817afea416 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2.8.1 +2.8.2 diff --git a/debian/changelog b/debian/changelog index 68abb796a0f..5683ebb17ec 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,47 @@ +linuxcnc (1:2.8.2) buster; urgency=low + + * gladevcp: Numerous Updates + * qtvcp -cam_align panel: allow selection of camera number + * gmoccapy_3_1_3_8 - many updates + * Typo correction Axis.py "Geometry reading" XYZBCUVW > XYZABCUVW + * Docs add info on loading halscope + * update 2.8 from master for xhc-whb04b-6 + * Merge pull request #1024 from kiall/2.8-axis-error-pin + * translations - fixed moccapy / gmoccapy errors + * Update hostmot2.9 + * Fix: update manual SSI + * Update abs_encoder.c + * add info on installing mesaflash + * rx_mode typo in hm2_uart_setup + * Docs: Many updates + * flipflop: Add an inverted output pin, like the classic D-type latch + * pncconf -fix inverting of steppers, in the tune axis test + * qtvcp -qtaxis: change controls for lathe configs + * pyui -fix commands for joints/axis changes + * Docs: Correct pin direction 14 in the parallel port docs + * gmoccapy_translations - new translation files + * interp_o_word.cc: mdi-opened files leak #1088 + * command.c: use consistent external offset epsilon + * sendkeys: A HAL component to send keystrokes and UI events + * plasmac: fix material verter for sheetcam update + * fix halcompile singleton option on userspace components + * pncconf -fix internal description of 7i73 mode 1 + * pncconf -fix sserial number when parcing XML + * pncconf -fix sserial channel number for the 7i96 + * Docs: Update URL to updated Pi SD card image. Also document limitations. + * Merge pull request #1052 from Hans470/2.8-restructure-hal-doc + * pncconf -many uodates + * Added new version of Raspberry Pi4 and Raspberry Pi 400 + * AXIS: Add an axisui.error pin + * qtvcp -qtDragon docs: add a bit of information about probing. + * Update near.comp add {} for syntax coherence + * PlasmaC: Many Updates + * hal_glib -fix check_for_modes always failing + * emccanon.cc GET_EXTERNAL_TOOL_SLOT hdl bogus request + * Revert bad change inside driver XHC-WHB04B-6 lcnc 2.8 + + -- andypugh Sun, 20 Jun 2021 18:48:30 +0100 + linuxcnc (1:2.8.1) buster; urgency=low * Docs: Updated Chinese "Getting Started" From 3dacc7ff12cb2a3ecbefefb12939ce24d028e62e Mon Sep 17 00:00:00 2001 From: Sebastian Kuzminsky Date: Thu, 24 Jun 2021 17:21:48 -0600 Subject: [PATCH 07/85] docs: add a note about reloading udev rules for shuttle driver --- docs/man/man1/shuttle.1 | 2 ++ docs/src/drivers/shuttle.txt | 2 ++ 2 files changed, 4 insertions(+) diff --git a/docs/man/man1/shuttle.1 b/docs/man/man1/shuttle.1 index 66ceb578dec..2cf52c32be1 100644 --- a/docs/man/man1/shuttle.1 +++ b/docs/man/man1/shuttle.1 @@ -40,6 +40,8 @@ SUBSYSTEM=="hidraw", ATTRS{idVendor}=="05f3", ATTRS{idProduct}=="0240", MODE="04 The LinuxCNC Debian package installs an appropriate udev file automatically, but if you are building LinuxCNC from source and are not using the Debian packaging, you'll need to install this file by hand. +If you install the file by hand you'll need to tell udev to reload its +rules files by running `udevadm control --reload-rules`. .SH A warning about the Jog Wheel The Shuttle devices have an internal 8-bit counter for the current diff --git a/docs/src/drivers/shuttle.txt b/docs/src/drivers/shuttle.txt index b6fea15c4e1..ee6aa12a304 100644 --- a/docs/src/drivers/shuttle.txt +++ b/docs/src/drivers/shuttle.txt @@ -52,6 +52,8 @@ SUBSYSTEM=="hidraw", ATTRS{idVendor}=="05f3", ATTRS{idProduct}=="0240", MODE="04 The LinuxCNC Debian package installs an appropriate udev file automatically, but if you are building LinuxCNC from source and are not using the Debian packaging you'll need to install this file by hand. +If you install the file by hand you'll need to tell udev to reload its +rules files by running `udevadm control --reload-rules`. == Pins From 992f3dedafbf5063069ec5352b959c13646d1bff Mon Sep 17 00:00:00 2001 From: Sebastian Kuzminsky Date: Thu, 24 Jun 2021 17:41:11 -0600 Subject: [PATCH 08/85] docs: fix out-of-date info about shuttle HAL pin names They all begin with just `shuttle` now (like the component name), not different HAL pin names for different shuttle devices. --- docs/man/man1/shuttle.1 | 6 +++--- docs/src/drivers/shuttle.txt | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/docs/man/man1/shuttle.1 b/docs/man/man1/shuttle.1 index 2cf52c32be1..77f5d02b30d 100644 --- a/docs/man/man1/shuttle.1 +++ b/docs/man/man1/shuttle.1 @@ -60,9 +60,9 @@ notice the first click. .SH Pins -All HAL pin names are prefixed with the type of device followed by -the index of the device (the order in which the driver found them), -for example "shuttlexpress.0" or "shuttlepro.2". +All HAL pin names are prefixed with `shuttle` followed by the index +of the device (the order in which the driver found them), for example +"shuttle.0" or "shuttle.2". .TP (bit out) \fI(prefix).button-(number)\fR diff --git a/docs/src/drivers/shuttle.txt b/docs/src/drivers/shuttle.txt index ee6aa12a304..029dd1ce061 100644 --- a/docs/src/drivers/shuttle.txt +++ b/docs/src/drivers/shuttle.txt @@ -58,9 +58,9 @@ rules files by running `udevadm control --reload-rules`. == Pins -All HAL pin names are prefixed with the type of device followed by -the index of the device (the order in which the driver found them), -for example "shuttlexpress.0" or "shuttlepro.2". +All HAL pin names are prefixed with `shuttle` followed by the index +of the device (the order in which the driver found them), for example +"shuttle.0" or "shuttle.2". '.button-' (bit out):: From ec6f65e029f1946147cc87257839da39598fdfa5 Mon Sep 17 00:00:00 2001 From: Sebastian Kuzminsky Date: Thu, 24 Jun 2021 17:43:12 -0600 Subject: [PATCH 09/85] shuttle: finish support for Shuttle PRO2 It's much like the Shuttle PRO, but with two more buttons and a different USB ID. --- debian/extras/lib/udev/rules.d/99-shuttle.rules | 6 ++++++ docs/man/man1/shuttle.1 | 11 +++++++++-- docs/src/drivers/shuttle.txt | 7 ++++++- src/hal/user_comps/shuttle.c | 8 ++++---- 4 files changed, 25 insertions(+), 7 deletions(-) diff --git a/debian/extras/lib/udev/rules.d/99-shuttle.rules b/debian/extras/lib/udev/rules.d/99-shuttle.rules index d967b1ed070..6271cd5538e 100644 --- a/debian/extras/lib/udev/rules.d/99-shuttle.rules +++ b/debian/extras/lib/udev/rules.d/99-shuttle.rules @@ -1,5 +1,11 @@ # ShuttleXpress USB jog pendant +# model "S-XPRS" SUBSYSTEM=="hidraw", ATTRS{idVendor}=="0b33", ATTRS{idProduct}=="0020", MODE="0444" # ShuttlePRO USB jog pendant +# model "SP-JNS" SUBSYSTEM=="hidraw", ATTRS{idVendor}=="05f3", ATTRS{idProduct}=="0240", MODE="0444" + +# ShuttlePROv2 USB jog pendant +# model "S-PROV2" +SUBSYSTEM=="hidraw", ATTRS{idVendor}=="0b33", ATTRS{idProduct}=="0030", MODE="0444" diff --git a/docs/man/man1/shuttle.1 b/docs/man/man1/shuttle.1 index 77f5d02b30d..5e26ab0d0c3 100644 --- a/docs/man/man1/shuttle.1 +++ b/docs/man/man1/shuttle.1 @@ -5,12 +5,12 @@ .TP \\$1 .. .SH NAME -shuttle \- control HAL pins with the ShuttleXpress or ShuttlePRO device made by Contour Design +shuttle \- control HAL pins with the ShuttleXpress, ShuttlePRO, and ShuttlePRO2 device made by Contour Design .SH SYNOPSIS \fIloadusr\fR \fBshuttle\fR \fI[DEVICE ...]\fR .SH DESCRIPTION shuttle is a non-realtime HAL component that interfaces Contour -Design's ShuttleXpress and ShuttlePRO devices with LinuxCNC's HAL. +Design's ShuttleXpress, ShuttlePRO, and ShuttlePRO2 devices with LinuxCNC's HAL. .PP If the driver is started without command-line arguments, it will probe all @@ -28,6 +28,11 @@ The ShuttlePRO has 13 momentary buttons, a 10 counts/revolution jog wheel with detents, and a 15-position spring-loaded outer wheel that returns to center when released. +.PP +The ShuttlePRO2 has 15 momentary buttons, a 10 counts/revolution +jog wheel with detents, and a 15-position spring-loaded outer wheel that +returns to center when released. + .SH UDEV The shuttle driver needs read permission to the Shuttle devices' /dev/hidraw* device files. This can be accomplished by adding a file @@ -37,6 +42,8 @@ SUBSYSTEM=="hidraw", ATTRS{idVendor}=="0b33", ATTRS{idProduct}=="0020", MODE="04 SUBSYSTEM=="hidraw", ATTRS{idVendor}=="05f3", ATTRS{idProduct}=="0240", MODE="0444" +SUBSYSTEM=="hidraw", ATTRS{idVendor}=="0b33", ATTRS{idProduct}=="0030", MODE="0444" + The LinuxCNC Debian package installs an appropriate udev file automatically, but if you are building LinuxCNC from source and are not using the Debian packaging, you'll need to install this file by hand. diff --git a/docs/src/drivers/shuttle.txt b/docs/src/drivers/shuttle.txt index 029dd1ce061..395179d3665 100644 --- a/docs/src/drivers/shuttle.txt +++ b/docs/src/drivers/shuttle.txt @@ -5,7 +5,7 @@ == Description Shuttle is a non-realtime HAL component that interfaces Contour Design’s -ShuttleXpress and ShuttlePRO devices with LinuxCNC’s HAL. +ShuttleXpress, ShuttlePRO, and ShuttlePRO2 devices with LinuxCNC’s HAL. If the driver is started without command-line arguments, it will probe all /dev/hidraw* device files for Shuttle devices, and use all devices @@ -20,6 +20,10 @@ The ShuttlePRO has 13 momentary buttons, a 10 counts/revolution jog wheel with detents, and a 15-position spring-loaded outer wheel that returns to center when released. +The ShuttlePRO2 has 15 momentary buttons, a 10 counts/revolution jog +wheel with detents, and a 15-position spring-loaded outer wheel that +returns to center when released. + [WARNING] ===== The Shuttle devices have an internal 8-bit counter for the current @@ -47,6 +51,7 @@ device files. This can be accomplished by adding a file ---- SUBSYSTEM=="hidraw", ATTRS{idVendor}=="0b33", ATTRS{idProduct}=="0020", MODE="0444" SUBSYSTEM=="hidraw", ATTRS{idVendor}=="05f3", ATTRS{idProduct}=="0240", MODE="0444" +SUBSYSTEM=="hidraw", ATTRS{idVendor}=="0b33", ATTRS{idProduct}=="0030", MODE="0444" ---- The LinuxCNC Debian package installs an appropriate udev file diff --git a/src/hal/user_comps/shuttle.c b/src/hal/user_comps/shuttle.c index a8b45b2ce2d..7e52bcda827 100644 --- a/src/hal/user_comps/shuttle.c +++ b/src/hal/user_comps/shuttle.c @@ -3,7 +3,7 @@ // This is a userspace HAL driver for the ShuttleXpress and ShuttlePRO // devices by Contour Design. // -// Copyright 2011, 2016 Sebastian Kuzminsky +// Copyright 2011, 2016, 2021 Sebastian Kuzminsky // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by @@ -48,7 +48,7 @@ #define Max(a, b) ((a) > (b) ? (a) : (b)) -#define MAX_BUTTONS 13 +#define MAX_BUTTONS 15 typedef struct { @@ -80,8 +80,8 @@ contour_dev_t contour_dev[] = { .name = "shuttleproV2", .vendor_id = 0x0b33, .product_id = 0x0030, - .num_buttons = 13, - .button_mask = { 0x0001, 0x0002, 0x0004, 0x0008, 0x0010, 0x0020, 0x0040, 0x0080, 0x0100, 0x0200, 0x0400, 0x0800, 0x1000 } + .num_buttons = 15, + .button_mask = { 0x0001, 0x0002, 0x0004, 0x0008, 0x0010, 0x0020, 0x0040, 0x0080, 0x0100, 0x0200, 0x0400, 0x0800, 0x1000, 0x2000, 0x4000 } } }; From 2493d191badc7469eff09c307bff48dc36be00ba Mon Sep 17 00:00:00 2001 From: Chris Morley Date: Sat, 26 Jun 2021 20:44:57 -0700 Subject: [PATCH 10/85] qtvcp -panel: add standalone toolchange component This is the 2.8 version --- share/qtvcp/panels/tool_dialog/tool_dialog.ui | 78 +++++++++++++++ .../panels/tool_dialog/tool_dialog_handler.py | 97 +++++++++++++++++++ 2 files changed, 175 insertions(+) create mode 100644 share/qtvcp/panels/tool_dialog/tool_dialog.ui create mode 100644 share/qtvcp/panels/tool_dialog/tool_dialog_handler.py diff --git a/share/qtvcp/panels/tool_dialog/tool_dialog.ui b/share/qtvcp/panels/tool_dialog/tool_dialog.ui new file mode 100644 index 00000000000..c4fce6bf179 --- /dev/null +++ b/share/qtvcp/panels/tool_dialog/tool_dialog.ui @@ -0,0 +1,78 @@ + + + MainWindow + + + + 0 + 0 + 315 + 150 + + + + MainWindow + + + + + + + false + + + false + + + false + + + true + + + true + + + CONFIGFOLDER/.qtvcp_toolchange_preferences + + + false + + + false + + + false + + + false + + + false + + + + + + + + + 0 + 0 + 315 + 27 + + + + + + + ScreenOptions + QWidget +
qtvcp.widgets.screen_options
+ 1 +
+
+ + +
diff --git a/share/qtvcp/panels/tool_dialog/tool_dialog_handler.py b/share/qtvcp/panels/tool_dialog/tool_dialog_handler.py new file mode 100644 index 00000000000..afe7e41fc97 --- /dev/null +++ b/share/qtvcp/panels/tool_dialog/tool_dialog_handler.py @@ -0,0 +1,97 @@ +############################ +# **** IMPORT SECTION **** # +############################ +from PyQt5.QtWidgets import (QMessageBox) +from qtvcp.core import Status, Action + +# Set up logging +from qtvcp import logger +from qtvcp.widgets.dialog_widget import ToolDialog +########################################### +# **** instantiate libraries section **** # +########################################### + +STATUS = Status() +ACTION = Action() +LOG = logger.getLogger(__name__) +# Set the log level for this module +#LOG.setLevel(logger.INFO) # One of DEBUG, INFO, WARNING, ERROR, CRITICAL + +################################### +# **** HANDLER CLASS SECTION **** # +################################### + +class HandlerClass: + + ######################## + # **** INITIALIZE **** # + ######################## + # widgets allows access to widgets from the qtvcp files + # at this point the widgets and hal pins are not instantiated + def __init__(self, halcomp,widgets,paths): + self.hal = halcomp + self.w = widgets + self.PATHS = paths + #print self.w.USEROPTIONS_ + ########################################## + # Special Functions called from QTVCP + ########################################## + + # at this point: + # the widgets are instantiated. + # the HAL pins are built but HAL is not set ready + def initialized__(self): + self.init_tool_dialog() + + # don't ever show the main window + def show(self): + pass + + ######################## + # callbacks from STATUS # + ######################## + + ####################### + # callbacks from form # + ####################### + + ##################### + # general functions # + ##################### + def init_tool_dialog(self): + w = self.w + w.toolDialog_ = ToolDialog() + w.toolDialog_.setObjectName('toolDialog_') + w.toolDialog_.hal_init(HAL_NAME='') + if self.w.USEROPTIONS_ is not None: + if 'notify_on' in self.w.USEROPTIONS_: + w.toolDialog_.setProperty('useDesktopNotify', True) + if 'audio_on' in self.w.USEROPTIONS_: + w.toolDialog_.play_sound = True + if 'speak_on' in self.w.USEROPTIONS_: + w.toolDialog_.speak = True + w.toolDialog_.setProperty('frameless', False) + + ##################### + # KEY BINDING CALLS # + ##################### + + ########################### + # **** closing event **** # + ########################### + + ############################## + # required class boiler code # + ############################## + + def __getitem__(self, item): + return getattr(self, item) + def __setitem__(self, item, value): + return setattr(self, item, value) + +################################ +# required handler boiler code # +################################ + +def get_handlers(halcomp,widgets,paths): + return [HandlerClass(halcomp,widgets,paths)] From ef374ca6248584ad819a366845ed59f4c637c479 Mon Sep 17 00:00:00 2001 From: andypugh Date: Mon, 28 Jun 2021 15:44:58 +0100 Subject: [PATCH 11/85] Docs: Bump kernel version for RTAI in "Getting LinuxCNC" Signed-off-by: andypugh --- docs/src/getting-started/getting-linuxcnc-cn.txt | 4 ++-- docs/src/getting-started/getting-linuxcnc.txt | 4 ++-- docs/src/getting-started/getting-linuxcnc_es.txt | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/docs/src/getting-started/getting-linuxcnc-cn.txt b/docs/src/getting-started/getting-linuxcnc-cn.txt index a5345799d62..ba2d3c12170 100755 --- a/docs/src/getting-started/getting-linuxcnc-cn.txt +++ b/docs/src/getting-started/getting-linuxcnc-cn.txt @@ -322,13 +322,13 @@ sudo apt-get update . 安装RTAI内核 + ---- -sudo apt-get install linux-image-4.14.174-rtai-amd64 +sudo apt-get install linux-image-4.19.195-rtai-amd64 ---- . 安装RTAI应用层 + ---- -sudo apt-get install rtai-modules-4.14.174 +sudo apt-get install rtai-modules-4.19.195 ---- . 安装linuxcnc(安装之前可能需要重新启动) diff --git a/docs/src/getting-started/getting-linuxcnc.txt b/docs/src/getting-started/getting-linuxcnc.txt index 85ba5dc92e7..041b3c4b7ee 100755 --- a/docs/src/getting-started/getting-linuxcnc.txt +++ b/docs/src/getting-started/getting-linuxcnc.txt @@ -413,12 +413,12 @@ sudo apt-get update . Install the RTAI kernel + ---- -sudo apt-get install linux-image-4.14.174-rtai-amd64 +sudo apt-get install linux-image-4.19.195-rtai-amd64 ---- . Install the RTAI application layer + ---- -sudo apt-get install rtai-modules-4.14.174 +sudo apt-get install rtai-modules-4.19.195 ---- . Install linuxcnc (a reboot may be required prior to installing) + diff --git a/docs/src/getting-started/getting-linuxcnc_es.txt b/docs/src/getting-started/getting-linuxcnc_es.txt index a348ce0dad2..20f0f8c9844 100644 --- a/docs/src/getting-started/getting-linuxcnc_es.txt +++ b/docs/src/getting-started/getting-linuxcnc_es.txt @@ -401,12 +401,12 @@ sudo apt-get update . Instale el kernel RTAI + ---- -sudo apt-get install linux-image-4.14.174-rtai-amd64 +sudo apt-get install linux-image-4.19.195-rtai-amd64 ---- . Instale la capa de aplicación RTAI + ---- -sudo apt-get install rtai-modules-4.14.174 +sudo apt-get install rtai-modules-4.19.195 ---- . Instale linuxcnc (puede ser necesario reiniciar antes de instalar) + From 7bd5bafecac5af02b841dedfd986fb84f6a9c4a6 Mon Sep 17 00:00:00 2001 From: andypugh Date: Mon, 28 Jun 2021 20:08:53 +0100 Subject: [PATCH 12/85] parport: Clarify messages when parport_pc has not found the device. Signed-off-by: andypugh --- src/rtapi/uspace_rtapi_parport.cc | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/rtapi/uspace_rtapi_parport.cc b/src/rtapi/uspace_rtapi_parport.cc index ff79398c731..2fed13a74ad 100644 --- a/src/rtapi/uspace_rtapi_parport.cc +++ b/src/rtapi/uspace_rtapi_parport.cc @@ -71,9 +71,11 @@ int rtapi_parport_get(const char *mod_name, rtapi_parport_t *port, unsigned shor if(parports.empty()) map_parports(); ParportMap::iterator pi = parports.find(base); if(pi == parports.end()) { - rtapi_print_msg(RTAPI_MSG_ERR, "Linux parallel port %c%d not found\n", base < 16 ? '#' : '@', base); - if(base < 16) - return -ENOENT; + if(base < 16){ + rtapi_print_msg(RTAPI_MSG_ERR, "Linux parallel port %d not found\n", base); + return -ENOENT;} + rtapi_print_msg(RTAPI_MSG_ERR, "No parport registered at 0x%x. " + "This is not always an error. Continuing.\n", base); port->base = base; port->base_hi = base_hi; return 0; From a17ba27b8f3438f7d7cc3ce17dfa7ee7e3824abc Mon Sep 17 00:00:00 2001 From: Chris Morley Date: Wed, 30 Jun 2021 18:04:41 -0700 Subject: [PATCH 13/85] pncconf -raise the stepper timing maximuim to 50000 --- src/emc/usr_intf/pncconf/s_motor.glade | 653 ++++++++++------------ src/emc/usr_intf/pncconf/x_motor.glade | 725 ++++++++++++++++++------- src/emc/usr_intf/pncconf/y_motor.glade | 725 ++++++++++++++++++------- src/emc/usr_intf/pncconf/z_motor.glade | 725 ++++++++++++++++++------- 4 files changed, 1879 insertions(+), 949 deletions(-) diff --git a/src/emc/usr_intf/pncconf/s_motor.glade b/src/emc/usr_intf/pncconf/s_motor.glade index 58069c648e6..ff52eb6eb3d 100644 --- a/src/emc/usr_intf/pncconf/s_motor.glade +++ b/src/emc/usr_intf/pncconf/s_motor.glade @@ -16,144 +16,6 @@ 100 1 - - 100000 - 100 - 0.5 - - - 100000 - 10 - 100 - - - 100000 - 100 - - - 1 - 10 - 10 - 1 - - - -100000 - 100000 - 100 - - - 100000 - 10 - 100 - - - 100000 - 100 - - - 10000 - 1 - - - 10000 - 1 - - - 10000 - 1 - - - 100 - 10000 - 5000 - 100 - - - 100 - 10000 - 5000 - 100 - - - 5000000 - 1 - 100 - - - 10 - 0.10000000000000001 - 0.001 - - - 10000 - 1 - - - 10000 - 1 - - - 10000 - 1 - - - 0.5 - 1.5 - 1 - 0.01 - - - 10000 - 1 - - - 100000 - 10 - 1 - - - 10 - 500 - 200 - 10 - - - 105 - 150 - 105 - 10 - - - 10000 - 1 - - - 10 - 0.5 - 0.001 - - - 5000000 - 1 - 100 - - - 100 - 10000 - 5000 - 100 - - - 100 - 10000 - 5000 - 100 - - - 1000000 - 1 - 1 - True False @@ -181,12 +43,6 @@ False 10 2 - - - - - - True @@ -507,6 +363,12 @@ + + + + + + @@ -543,60 +405,6 @@ False 10 3 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - True @@ -746,6 +554,7 @@ True True False + False True @@ -777,6 +586,7 @@ True True False + False True @@ -787,6 +597,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -824,18 +688,6 @@ False 8 2 - - - - - - - - - - - - True @@ -1028,12 +880,6 @@ - - - - - - @@ -1051,96 +897,24 @@ False False 4 - 2 - - - - - False - 0 - - - True - False - 12 - - - True - False - 10 - 3 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + 2 + + + + + False + 0 + + + True + False + 12 + + + True + False + 10 + 3 True @@ -1204,6 +978,7 @@ True True False + False True @@ -1213,6 +988,23 @@ + + + True + False + Slave number: + + + + + True + False + + + 1 + 2 + + @@ -1277,21 +1069,13 @@ - - True - False - Slave number: - + - - True - False - - - 1 - 2 - + + + + @@ -1358,6 +1142,7 @@ True True False + False True True @@ -1373,6 +1158,7 @@ True True False + False True @@ -1387,6 +1173,7 @@ True True False + False True @@ -1401,6 +1188,7 @@ True True False + False True @@ -1415,6 +1203,7 @@ True True False + False True @@ -1429,6 +1218,7 @@ True True False + False True @@ -1443,6 +1233,7 @@ True True False + False True @@ -1512,6 +1303,7 @@ True True False + False True @@ -1526,6 +1318,7 @@ True True False + False True @@ -1540,6 +1333,7 @@ True True False + False True @@ -1554,6 +1348,7 @@ True True False + False True @@ -1568,6 +1363,7 @@ True True False + False True True @@ -1583,6 +1379,7 @@ True True False + False True @@ -1750,6 +1547,7 @@ True True False + False True @@ -1967,6 +1765,7 @@ True True False + False True @@ -2018,60 +1817,13 @@ 5 7 3 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Invert Motor Direction True True False + False True @@ -2087,6 +1839,7 @@ True True False + False True @@ -2101,6 +1854,7 @@ Single Input Encoder True False + False True @@ -2114,6 +1868,7 @@ True True False + False True @@ -2175,9 +1930,6 @@ - - - @@ -2193,12 +1945,6 @@ False 7 3 - - - - - - True @@ -2455,15 +2201,13 @@ 6 - - - Use Near Range True True False + False True True @@ -2479,6 +2223,7 @@ True True False + False True True snearrange_button @@ -2489,6 +2234,15 @@ 7 + + + + + + + + + False @@ -2514,6 +2268,7 @@ Scale True True True + False @@ -2529,6 +2284,7 @@ Scale True True True + False @@ -2572,6 +2328,7 @@ Scale True True + False @@ -2643,4 +2400,142 @@ Scale + + 100000 + 100 + 0.5 + + + 100000 + 10 + 100 + + + 100000 + 100 + + + 1 + 10 + 10 + 1 + + + -100000 + 100000 + 100 + + + 100000 + 10 + 100 + + + 100000 + 100 + + + 10000 + 1 + + + 10000 + 1 + + + 10000 + 1 + + + 100 + 50000 + 5000 + 100 + + + 100 + 50000 + 5000 + 100 + + + 5000000 + 1 + 100 + + + 10 + 0.10000000000000001 + 0.001 + + + 10000 + 1 + + + 10000 + 1 + + + 10000 + 1 + + + 0.5 + 1.5 + 1 + 0.01 + + + 10000 + 1 + + + 100000 + 10 + 1 + + + 10 + 500 + 200 + 10 + + + 105 + 150 + 105 + 10 + + + 10000 + 1 + + + 10 + 0.5 + 0.001 + + + 5000000 + 1 + 100 + + + 100 + 50000 + 5000 + 100 + + + 100 + 50000 + 5000 + 100 + + + 1000000 + 1 + 1 + diff --git a/src/emc/usr_intf/pncconf/x_motor.glade b/src/emc/usr_intf/pncconf/x_motor.glade index 42cb9369c41..f796c3c64b2 100644 --- a/src/emc/usr_intf/pncconf/x_motor.glade +++ b/src/emc/usr_intf/pncconf/x_motor.glade @@ -1,34 +1,59 @@ - + + + + + + + + + 100 + 1 + 10 + + + 100 + 1 + 10 + True + False True + False True + False 0 True + False 4 4 True + False 10 2 True True - + + False + False + True + True xmaxout_adjust 2 @@ -37,13 +62,14 @@ 2 8 9 - - + + True + False 0 Max Output @@ -51,15 +77,19 @@ 8 9 GTK_FILL - + True True - + 0.5 + False + False + True + True xff2_adjust 4 @@ -68,16 +98,20 @@ 2 5 6 - - + + True True - + 0.5 + False + False + True + True xff1_adjust 4 if-valid @@ -87,16 +121,20 @@ 2 4 5 - - + + True True - + 0.5 + False + False + True + True xff0_adjust 4 @@ -105,13 +143,14 @@ 2 3 4 - - + + True + False 0 FF2 @@ -119,12 +158,13 @@ 5 6 GTK_FILL - + True + False 0 FF1 @@ -132,12 +172,13 @@ 4 5 GTK_FILL - + True + False 0 FF0 @@ -145,15 +186,19 @@ 3 4 GTK_FILL - + True True - + 0.5 + False + False + True + True xdeadb_adjust 4 @@ -162,16 +207,20 @@ 2 7 8 - - + + True True - + 0.5 + False + False + True + True xbias_adjust 4 @@ -180,13 +229,14 @@ 2 6 7 - - + + True + False 0 Deadband @@ -194,12 +244,13 @@ 7 8 GTK_FILL - + True + False 0 Bias @@ -207,23 +258,25 @@ 6 7 GTK_FILL - + True + False 0 P GTK_FILL - + True + False 0 I @@ -231,12 +284,13 @@ 1 2 GTK_FILL - + True + False 0 D @@ -244,31 +298,39 @@ 2 3 GTK_FILL - + True True - + 0.5 + False + False + True + True xp_adjust 4 1 2 - - + + True True - + 0.5 + False + False + True + True xi_adjust 4 @@ -277,16 +339,20 @@ 2 1 2 - - + + True True - + 0.5 + False + False + True + True xd_adjust 4 @@ -295,8 +361,8 @@ 2 2 3 - - + + @@ -312,6 +378,7 @@ True + False PID Info True @@ -327,30 +394,35 @@ True + False 0 True + False 12 True + False 10 3 True + False 0 3pwm Scale: GTK_FILL - + True + False 0 3pwm Deadtime: @@ -358,12 +430,13 @@ 1 2 GTK_FILL - + True + False 0 Quad Pulses / Rev: @@ -371,7 +444,7 @@ 7 8 GTK_FILL - + 4 @@ -379,6 +452,7 @@ 100 True + False 0.25 1 label @@ -388,15 +462,19 @@ 2 7 8 - - + + True True - + + False + False + True + True x3pwm_deadtime_adjust @@ -404,23 +482,27 @@ 2 1 2 - - + + True True - + + False + False + True + True x3pwm_scale_adjust 2 1 2 - - + + @@ -430,26 +512,34 @@ True True True - + False + True + False True + False gtk-execute + True + True 0 True + False Open Loop Test + True + True 1 @@ -461,13 +551,14 @@ 2 8 10 - - + + True + False 0 4 Analog Min Limit: @@ -476,12 +567,13 @@ 4 5 GTK_FILL - + True + False 0 4 Analog Max limit: @@ -490,12 +582,13 @@ 5 6 GTK_FILL - + True + False 0 4 Analog Max Scale: @@ -504,14 +597,18 @@ 6 7 GTK_FILL - + True True - + + False + False + True + True xanalog_min_adjust 2 @@ -520,15 +617,19 @@ 2 4 5 - - + + True True - + + False + False + True + True xanalog_max_adjust 2 @@ -537,15 +638,19 @@ 2 5 6 - - + + True True - + + False + False + True + True xanalog_scale_adjust 2 @@ -554,8 +659,8 @@ 2 6 7 - - + + @@ -613,6 +718,7 @@ True + False Output Info True @@ -620,26 +726,31 @@ False + True 1 True + False 0 True + False 4 4 True + False 8 2 True + False 0 Step On-Time @@ -647,12 +758,13 @@ 1 2 GTK_FILL - + True + False 0 Step Space @@ -660,14 +772,18 @@ 2 3 GTK_FILL - + True True - + + False + False + True + True xsteptime_adjust @@ -675,15 +791,19 @@ 2 1 2 - - + + True True - + + False + False + True + True xstepspace_adjust @@ -691,13 +811,14 @@ 2 2 3 - - + + True + False 0 Direction Hold @@ -705,12 +826,13 @@ 3 4 GTK_FILL - + True + False 0 Direction Setup @@ -718,14 +840,18 @@ 4 5 GTK_FILL - + True True - + + False + False + True + True xdirhold_adjust @@ -733,15 +859,19 @@ 2 3 4 - - + + True True - + + False + False + True + True xdirsetup_adjust @@ -749,13 +879,14 @@ 2 4 5 - - + + True + False 0 Driver Type: True @@ -764,15 +895,16 @@ 5 6 GTK_FILL - + 120 True + False driverstore - + @@ -786,7 +918,7 @@ 5 6 GTK_FILL - + @@ -814,6 +946,7 @@ True + False Stepper Info True @@ -836,9 +969,11 @@ True + False True + False 0 @@ -848,27 +983,34 @@ True False + False True + False 0 True + False 12 True + False No feedback True True False + False True True + True + True 0 @@ -878,9 +1020,12 @@ True True False + False True + True + True 1 @@ -890,9 +1035,12 @@ True True False + False True + True + True 2 @@ -902,9 +1050,12 @@ True True False + False True + True + True 3 @@ -914,9 +1065,12 @@ True True False + False True + True + True 4 @@ -926,9 +1080,12 @@ True True False + False True + True + True 5 @@ -938,25 +1095,34 @@ True True False + False True + True + True 6 True + False + True + True 7 True + False + True + True 8 @@ -967,35 +1133,44 @@ True + False <b>Input Options</b> True + True + True 0 True + False 0 True + False 12 True + False Digital instead of PWM outputs True True False + False True + True + True 0 @@ -1005,9 +1180,12 @@ True True False + False True + True + True 1 @@ -1017,9 +1195,12 @@ True True False + False True + True + True 2 @@ -1029,9 +1210,12 @@ True True False + False True + True + True 3 @@ -1041,10 +1225,13 @@ True True False + False True True + True + True 4 @@ -1054,54 +1241,74 @@ True True False + False True + True + True 5 True + False True True - + + False + False + True + True 1 False + True 0 True + False 8i20 Max Current + True + True 1 + True + True 6 True + False + True + True 7 True + False + True + True 8 @@ -1112,33 +1319,43 @@ True + False <b>Output Options</b> True + True + True 1 True + False 0 True + False 12 True + False 9 2 True True - + + False + False + True + True 1 @@ -1151,7 +1368,11 @@ True True - + + False + False + True + True 2 @@ -1164,6 +1385,7 @@ True + False alignment current @@ -1174,6 +1396,7 @@ True + False lead angle @@ -1186,6 +1409,7 @@ True True False + False True @@ -1199,7 +1423,11 @@ True True - + + False + False + True + True 1 @@ -1212,7 +1440,11 @@ True True - + + False + False + True + True 1 @@ -1225,7 +1457,11 @@ True True - + + False + False + True + True 1 @@ -1238,7 +1474,11 @@ True True - + + False + False + True + True 1 @@ -1251,7 +1491,11 @@ True True - + + False + False + True + True 1 @@ -1264,7 +1508,11 @@ True True - + + False + False + True + True 1 @@ -1274,6 +1522,7 @@ True + False Reverse @@ -1284,6 +1533,7 @@ True + False Input-pattern @@ -1294,6 +1544,7 @@ True + False output-pattern @@ -1304,6 +1555,7 @@ True + False Drive-offset @@ -1314,6 +1566,7 @@ True + False Encoder-offset @@ -1324,6 +1577,7 @@ True + False Poles @@ -1334,6 +1588,7 @@ True + False Scale @@ -1344,12 +1599,15 @@ True + False <b>Configuration</b> True + True + True 2 @@ -1358,6 +1616,7 @@ True + False Details @@ -1368,11 +1627,13 @@ True True False + False True - + True + False <b>Use BLDC Motor Commutation Control</b> True @@ -1381,6 +1642,8 @@ + True + True 0 @@ -1389,30 +1652,38 @@ + True + True 2 True + False + False 0 etched-out True + False 12 True + False True + False Scale: False + True 0 @@ -1420,10 +1691,15 @@ True True - + + False + False + True + True False + True 15 1 @@ -1431,29 +1707,35 @@ True + False % False + True 2 True + False False + True 3 True + False Range: False + True 10 4 @@ -1463,7 +1745,11 @@ True True 3 - + + False + False + True + True False @@ -1475,10 +1761,12 @@ True + False RPM False + True 6 @@ -1491,10 +1779,12 @@ True True False + False True True + False <b>Use Spindle-At-Speed</b> True @@ -1503,27 +1793,34 @@ + True + True 0 + False 0 etched-out True + False 12 True + False True + False Filter gain: False + True 0 @@ -1531,11 +1828,16 @@ True True - + + False + False + True + True 3 False + True 15 1 @@ -1543,9 +1845,11 @@ True + False False + True 2 @@ -1556,37 +1860,46 @@ True + False <b>Spindle Display Filter Settings</b> True + True + True 1 + True + True 3 True + False True + False 0 0.75999999046325684 True + False 5 3 50 True + False 0 mm @@ -1594,24 +1907,26 @@ 2 3 GTK_FILL - + True + False 0 Rapid Speed Following Error: GTK_FILL - + 5 True + False 0 Feed Speed Following Error: @@ -1619,7 +1934,7 @@ 1 2 GTK_FILL - + 5 @@ -1629,13 +1944,14 @@ True True False + False True 2 3 GTK_FILL - + @@ -1644,18 +1960,20 @@ True True False + False True 3 4 GTK_FILL - + True + False 0 mm @@ -1665,14 +1983,18 @@ 1 2 GTK_FILL - + True True - + + False + False + True + True xrapid_adjust 4 @@ -1685,7 +2007,11 @@ True True - + + False + False + True + True xfeed_adjust 4 @@ -1701,6 +2027,7 @@ Single Input Encoder True False + False True @@ -1738,11 +2065,13 @@ True + False 4 3 True + False 0 Maximum _Velocity: True @@ -1751,12 +2080,13 @@ 2 3 GTK_FILL - + True + False 0 Maximum _Acceleration: True @@ -1765,12 +2095,13 @@ 3 4 GTK_FILL - + True + False 0 mm / s @@ -1780,14 +2111,15 @@ 2 3 GTK_FILL - + True + False 0 - mm / s² + mm / s² 2 @@ -1795,14 +2127,18 @@ 3 4 GTK_FILL - + True True - + + False + False + True + True xvelocity_adjust @@ -1816,7 +2152,11 @@ True True - + + False + False + True + True xaccl_adjust 1 @@ -1830,20 +2170,25 @@ True + False 0 encoder Scale: True GTK_FILL - + True True - + + False + False + True + True xencoder_adjust 3 @@ -1855,6 +2200,7 @@ True + False 0 Stepper Scale: True @@ -1863,14 +2209,18 @@ 1 2 GTK_FILL - + True True - + + False + False + True + True xstepper_adjust 3 @@ -1888,7 +2238,8 @@ Scale True True True - + False + 2 @@ -1913,9 +2264,11 @@ Scale True + False True + False 0 0.2800000011920929 @@ -1924,6 +2277,7 @@ Scale False + True 0 @@ -1932,19 +2286,23 @@ Scale True True True - + False + True + False 0 0 True + False 2 True + False gtk-execute @@ -1956,6 +2314,7 @@ Scale True + False Test / Tune Axis True @@ -1979,6 +2338,8 @@ Scale + True + True 5 @@ -1986,77 +2347,60 @@ Scale - - - - - - - - 1 - 5000000 - 100 - - + + 10000 1 - 5000000 - 100 + 0.5 - - 0.5 - 10 - 0.001 + + 10000 + 10 + 1 - - 0.1 - 10 - 0.001 + + -10000 + 10000 + -10 + 1 - - 1 - 1000000 + + 10000 + 10 1 - - 1 + 10000 - 0.5 + 1 - - 5000 - 100 + 10000 - 100 + 1 - - 5000 - 100 + 10000 - 100 + 1 - 5000 100 - 10000 + 50000 + 5000 100 - 5000 100 - 10000 + 50000 + 5000 100 - - 10000 - 1 - - - 10000 - 1 + + 5000000 + 1 + 100 - - 10000 - 1 + + 10 + 0.10000000000000001 + 0.001 10000 @@ -2070,43 +2414,44 @@ Scale 10000 1 - - 10000 - 1 - - + 10000 1 - 10 10000 + 10 1 - - -10 - -10000 + 10000 1 - - 10 - 10000 - 1 + + 10 + 0.5 + 0.001 - - 10 - 10000 - 1 + + 5000000 + 1 + 100 - - 100 - 1 - 10 + + 100 + 50000 + 5000 + 100 - - 100 + + 100 + 50000 + 5000 + 100 + + + 1000000 + 1 1 - 10 diff --git a/src/emc/usr_intf/pncconf/y_motor.glade b/src/emc/usr_intf/pncconf/y_motor.glade index 4b202601eff..4443648310e 100644 --- a/src/emc/usr_intf/pncconf/y_motor.glade +++ b/src/emc/usr_intf/pncconf/y_motor.glade @@ -1,34 +1,59 @@ - + + + + + + + + + 100 + 1 + 10 + + + 100 + 1 + 10 + True + False True + False True + False 0 True + False 4 4 True + False 10 2 True True - + + False + False + True + True ymaxout_adjust 2 @@ -37,13 +62,14 @@ 2 8 9 - - + + True + False 0 Max Output @@ -51,15 +77,19 @@ 8 9 GTK_FILL - + True True - + 0.5 + False + False + True + True yff2_adjust 4 @@ -68,16 +98,20 @@ 2 5 6 - - + + True True - + 0.5 + False + False + True + True yff1_adjust 4 if-valid @@ -87,16 +121,20 @@ 2 4 5 - - + + True True - + 0.5 + False + False + True + True yff0_adjust 4 @@ -105,13 +143,14 @@ 2 3 4 - - + + True + False 0 FF2 @@ -119,12 +158,13 @@ 5 6 GTK_FILL - + True + False 0 FF1 @@ -132,12 +172,13 @@ 4 5 GTK_FILL - + True + False 0 FF0 @@ -145,15 +186,19 @@ 3 4 GTK_FILL - + True True - + 0.5 + False + False + True + True ydeadb_adjust 4 @@ -162,16 +207,20 @@ 2 7 8 - - + + True True - + 0.5 + False + False + True + True ybias_adjust 4 @@ -180,13 +229,14 @@ 2 6 7 - - + + True + False 0 Deadband @@ -194,12 +244,13 @@ 7 8 GTK_FILL - + True + False 0 Bias @@ -207,23 +258,25 @@ 6 7 GTK_FILL - + True + False 0 P GTK_FILL - + True + False 0 I @@ -231,12 +284,13 @@ 1 2 GTK_FILL - + True + False 0 D @@ -244,31 +298,39 @@ 2 3 GTK_FILL - + True True - + 0.5 + False + False + True + True yp_adjust 4 1 2 - - + + True True - + 0.5 + False + False + True + True yi_adjust 4 @@ -277,16 +339,20 @@ 2 1 2 - - + + True True - + 0.5 + False + False + True + True yd_adjust 4 @@ -295,8 +361,8 @@ 2 2 3 - - + + @@ -312,6 +378,7 @@ True + False Servo Info True @@ -327,30 +394,35 @@ True + False 0 True + False 12 True + False 10 3 True + False 0 3pwm Scale: GTK_FILL - + True + False 0 3pwm Deadtime: @@ -358,12 +430,13 @@ 1 2 GTK_FILL - + True + False 0 Quad Pulses / Rev: @@ -371,7 +444,7 @@ 7 8 GTK_FILL - + 4 @@ -379,6 +452,7 @@ 100 True + False 0.25 1 label @@ -388,15 +462,19 @@ 2 7 8 - - + + True True - + + False + False + True + True y3pwm_deadtime_adjust @@ -404,23 +482,27 @@ 2 1 2 - - + + True True - + + False + False + True + True y3pwm_scale_adjust 2 1 2 - - + + @@ -430,26 +512,34 @@ True True True - + False + True + False True + False gtk-execute + True + True 0 True + False Open Loop Test + True + True 1 @@ -461,13 +551,14 @@ 2 8 10 - - + + True + False 0 4 Analog Min Limit: @@ -476,12 +567,13 @@ 4 5 GTK_FILL - + True + False 0 4 Analog Max limit: @@ -490,12 +582,13 @@ 5 6 GTK_FILL - + True + False 0 4 Analog Max Scale: @@ -504,14 +597,18 @@ 6 7 GTK_FILL - + True True - + + False + False + True + True yanalog_min_adjust 2 @@ -520,15 +617,19 @@ 2 4 5 - - + + True True - + + False + False + True + True yanalog_max_adjust 2 @@ -537,15 +638,19 @@ 2 5 6 - - + + True True - + + False + False + True + True yanalog_scale_adjust 2 @@ -554,8 +659,8 @@ 2 6 7 - - + + @@ -613,6 +718,7 @@ True + False Output Info True @@ -620,26 +726,31 @@ False + True 1 True + False 0 True + False 4 4 True + False 8 2 True + False 0 Step On-Time @@ -647,12 +758,13 @@ 1 2 GTK_FILL - + True + False 0 Step Space @@ -660,14 +772,18 @@ 2 3 GTK_FILL - + True True - + + False + False + True + True ysteptime_adjust @@ -675,15 +791,19 @@ 2 1 2 - - + + True True - + + False + False + True + True ystepspace_adjust @@ -691,13 +811,14 @@ 2 2 3 - - + + True + False 0 Direction Hold @@ -705,12 +826,13 @@ 3 4 GTK_FILL - + True + False 0 Direction Setup @@ -718,14 +840,18 @@ 4 5 GTK_FILL - + True True - + + False + False + True + True ydirhold_adjust @@ -733,15 +859,19 @@ 2 3 4 - - + + True True - + + False + False + True + True ydirsetup_adjust @@ -749,13 +879,14 @@ 2 4 5 - - + + True + False 0 Driver Type: True @@ -764,15 +895,16 @@ 5 6 GTK_FILL - + 120 True + False driverstore - + @@ -786,7 +918,7 @@ 5 6 GTK_FILL - + @@ -814,6 +946,7 @@ True + False Stepper Info True @@ -836,9 +969,11 @@ True + False True + False 0 @@ -848,27 +983,34 @@ True False + False True + False 0 True + False 12 True + False No feedback True True False + False True True + True + True 0 @@ -878,9 +1020,12 @@ True True False + False True + True + True 1 @@ -890,9 +1035,12 @@ True True False + False True + True + True 2 @@ -902,9 +1050,12 @@ True True False + False True + True + True 3 @@ -914,9 +1065,12 @@ True True False + False True + True + True 4 @@ -926,9 +1080,12 @@ True True False + False True + True + True 5 @@ -938,25 +1095,34 @@ True True False + False True + True + True 6 True + False + True + True 7 True + False + True + True 8 @@ -967,35 +1133,44 @@ True + False <b>Input Options</b> True + True + True 0 True + False 0 True + False 12 True + False Digital instead of PWM outputs True True False + False True + True + True 0 @@ -1005,9 +1180,12 @@ True True False + False True + True + True 1 @@ -1017,9 +1195,12 @@ True True False + False True + True + True 2 @@ -1029,9 +1210,12 @@ True True False + False True + True + True 3 @@ -1041,10 +1225,13 @@ True True False + False True True + True + True 4 @@ -1054,54 +1241,74 @@ True True False + False True + True + True 5 True + False True True - + + False + False + True + True 1 False + True 0 True + False 8i20 Max Current + True + True 1 + True + True 6 True + False + True + True 7 True + False + True + True 8 @@ -1112,33 +1319,43 @@ True + False <b>Output Options</b> True + True + True 1 True + False 0 True + False 12 True + False 9 2 True True - + + False + False + True + True 1 @@ -1151,7 +1368,11 @@ True True - + + False + False + True + True 2 @@ -1164,6 +1385,7 @@ True + False alignment current @@ -1174,6 +1396,7 @@ True + False lead angle @@ -1186,6 +1409,7 @@ True True False + False True @@ -1199,7 +1423,11 @@ True True - + + False + False + True + True 1 @@ -1212,7 +1440,11 @@ True True - + + False + False + True + True 1 @@ -1225,7 +1457,11 @@ True True - + + False + False + True + True 1 @@ -1238,7 +1474,11 @@ True True - + + False + False + True + True 1 @@ -1251,7 +1491,11 @@ True True - + + False + False + True + True 1 @@ -1264,7 +1508,11 @@ True True - + + False + False + True + True 1 @@ -1274,6 +1522,7 @@ True + False Reverse @@ -1284,6 +1533,7 @@ True + False Input-pattern @@ -1294,6 +1544,7 @@ True + False output-pattern @@ -1304,6 +1555,7 @@ True + False Drive-offset @@ -1314,6 +1566,7 @@ True + False Encoder-offset @@ -1324,6 +1577,7 @@ True + False Poles @@ -1334,6 +1588,7 @@ True + False Scale @@ -1344,12 +1599,15 @@ True + False <b>Configuration</b> True + True + True 2 @@ -1358,6 +1616,7 @@ True + False Details @@ -1368,11 +1627,13 @@ True True False + False True - + True + False <b>Use BLDC Motor Commutation Control</b> True @@ -1381,6 +1642,8 @@ + True + True 0 @@ -1389,30 +1652,38 @@ + True + True 2 True + False + False 0 etched-out True + False 12 True + False True + False Scale: False + True 0 @@ -1420,10 +1691,15 @@ True True - + + False + False + True + True False + True 15 1 @@ -1431,29 +1707,35 @@ True + False % False + True 2 True + False False + True 3 True + False Range: False + True 10 4 @@ -1463,7 +1745,11 @@ True True 3 - + + False + False + True + True False @@ -1475,10 +1761,12 @@ True + False RPM False + True 6 @@ -1491,10 +1779,12 @@ True True False + False True True + False <b>Use Spindle-At-Speed</b> True @@ -1503,27 +1793,34 @@ + True + True 0 + False 0 etched-out True + False 12 True + False True + False Filter gain: False + True 0 @@ -1531,11 +1828,16 @@ True True - + + False + False + True + True 3 False + True 15 1 @@ -1543,9 +1845,11 @@ True + False False + True 2 @@ -1556,37 +1860,46 @@ True + False <b>Spindle Display Filter Settings</b> True + True + True 1 + True + True 3 True + False True + False 0 0.75999999046325684 True + False 5 3 50 True + False 0 mm @@ -1594,24 +1907,26 @@ 2 3 GTK_FILL - + True + False 0 Rapid Speed Following Error: GTK_FILL - + 5 True + False 0 Feed Speed Following Error: @@ -1619,7 +1934,7 @@ 1 2 GTK_FILL - + 5 @@ -1629,13 +1944,14 @@ True True False + False True 2 3 GTK_FILL - + @@ -1644,18 +1960,20 @@ True True False + False True 3 4 GTK_FILL - + True + False 0 mm @@ -1665,14 +1983,18 @@ 1 2 GTK_FILL - + True True - + + False + False + True + True yrapid_adjust 4 @@ -1685,7 +2007,11 @@ True True - + + False + False + True + True yfeed_adjust 4 @@ -1701,6 +2027,7 @@ Single Input Encoder True False + False True @@ -1738,11 +2065,13 @@ True + False 4 3 True + False 0 Maximum _Velocity: True @@ -1751,12 +2080,13 @@ 2 3 GTK_FILL - + True + False 0 Maximum _Acceleration: True @@ -1765,12 +2095,13 @@ 3 4 GTK_FILL - + True + False 0 mm / s @@ -1780,14 +2111,15 @@ 2 3 GTK_FILL - + True + False 0 - mm / s² + mm / s² 2 @@ -1795,14 +2127,18 @@ 3 4 GTK_FILL - + True True - + + False + False + True + True yvelocity_adjust @@ -1816,7 +2152,11 @@ True True - + + False + False + True + True yaccl_adjust 1 @@ -1830,20 +2170,25 @@ True + False 0 encoder Scale: True GTK_FILL - + True True - + + False + False + True + True yencoder_adjust 3 @@ -1855,6 +2200,7 @@ True + False 0 Stepper Scale: True @@ -1863,14 +2209,18 @@ 1 2 GTK_FILL - + True True - + + False + False + True + True ystepper_adjust 3 @@ -1888,7 +2238,8 @@ Scale True True True - + False + 2 @@ -1913,9 +2264,11 @@ Scale True + False True + False 0 0.2800000011920929 @@ -1924,6 +2277,7 @@ Scale False + True 0 @@ -1932,19 +2286,23 @@ Scale True True True - + False + True + False 0 0 True + False 2 True + False gtk-execute @@ -1956,6 +2314,7 @@ Scale True + False Test / Tune Axis True @@ -1979,6 +2338,8 @@ Scale + True + True 5 @@ -1986,77 +2347,60 @@ Scale - - - - - - - - 1 - 5000000 - 100 - - + + 10000 1 - 5000000 - 100 + 0.5 - - 0.5 - 10 - 0.001 + + 10000 + 10 + 1 - - 0.100 - 10 - 0.001 + + -10000 + 10000 + -10 + 1 - - 1 - 1000000 + + 10000 + 10 1 - - 1 + 10000 - 0.5 + 1 - - 5000 - 100 + 10000 - 100 + 1 - - 5000 - 100 + 10000 - 100 + 1 - 5000 100 - 10000 + 50000 + 5000 100 - 5000 100 - 10000 + 50000 + 5000 100 - - 10000 - 1 - - - 10000 - 1 + + 5000000 + 1 + 100 - - 10000 - 1 + + 10 + 0.10000000000000001 + 0.001 10000 @@ -2070,43 +2414,44 @@ Scale 10000 1 - - 10000 - 1 - - + 10000 1 - 10 10000 + 10 1 - - -10 - -10000 + 10000 1 - - 10 - 10000 - 1 + + 10 + 0.5 + 0.001 - - 10 - 10000 - 1 + + 5000000 + 1 + 100 - - 100 - 1 - 10 + + 100 + 50000 + 5000 + 100 - - 100 + + 100 + 50000 + 5000 + 100 + + + 1000000 + 1 1 - 10 diff --git a/src/emc/usr_intf/pncconf/z_motor.glade b/src/emc/usr_intf/pncconf/z_motor.glade index 31f062060fc..60d1f310594 100644 --- a/src/emc/usr_intf/pncconf/z_motor.glade +++ b/src/emc/usr_intf/pncconf/z_motor.glade @@ -1,34 +1,59 @@ - + + + + + + + + + 100 + 1 + 10 + + + 100 + 1 + 10 + True + False True + False True + False 0 True + False 4 4 True + False 10 2 True True - + + False + False + True + True zmaxout_adjust 2 @@ -37,13 +62,14 @@ 2 8 9 - - + + True + False 0 Max Output @@ -51,15 +77,19 @@ 8 9 GTK_FILL - + True True - + 0.5 + False + False + True + True zff2_adjust 4 @@ -68,16 +98,20 @@ 2 5 6 - - + + True True - + 0.5 + False + False + True + True zff1_adjust 4 if-valid @@ -87,16 +121,20 @@ 2 4 5 - - + + True True - + 0.5 + False + False + True + True zff0_adjust 4 @@ -105,13 +143,14 @@ 2 3 4 - - + + True + False 0 FF2 @@ -119,12 +158,13 @@ 5 6 GTK_FILL - + True + False 0 FF1 @@ -132,12 +172,13 @@ 4 5 GTK_FILL - + True + False 0 FF0 @@ -145,15 +186,19 @@ 3 4 GTK_FILL - + True True - + 0.5 + False + False + True + True zdeadb_adjust 4 @@ -162,16 +207,20 @@ 2 7 8 - - + + True True - + 0.5 + False + False + True + True zbias_adjust 4 @@ -180,13 +229,14 @@ 2 6 7 - - + + True + False 0 Deadband @@ -194,12 +244,13 @@ 7 8 GTK_FILL - + True + False 0 Bias @@ -207,23 +258,25 @@ 6 7 GTK_FILL - + True + False 0 P GTK_FILL - + True + False 0 I @@ -231,12 +284,13 @@ 1 2 GTK_FILL - + True + False 0 D @@ -244,31 +298,39 @@ 2 3 GTK_FILL - + True True - + 0.5 + False + False + True + True zp_adjust 4 1 2 - - + + True True - + 0.5 + False + False + True + True zi_adjust 4 @@ -277,16 +339,20 @@ 2 1 2 - - + + True True - + 0.5 + False + False + True + True zd_adjust 4 @@ -295,8 +361,8 @@ 2 2 3 - - + + @@ -312,6 +378,7 @@ True + False Servo Info True @@ -327,30 +394,35 @@ True + False 0 True + False 12 True + False 10 3 True + False 0 3pwm Scale: GTK_FILL - + True + False 0 3pwm Deadtime: @@ -358,12 +430,13 @@ 1 2 GTK_FILL - + True + False 0 Quad Pulses / Rev: @@ -371,7 +444,7 @@ 7 8 GTK_FILL - + 4 @@ -379,6 +452,7 @@ 100 True + False 0.25 1 label @@ -388,15 +462,19 @@ 2 7 8 - - + + True True - + + False + False + True + True z3pwm_deadtime_adjust @@ -404,23 +482,27 @@ 2 1 2 - - + + True True - + + False + False + True + True z3pwm_scale_adjust 2 1 2 - - + + @@ -430,26 +512,34 @@ True True True - + False + True + False True + False gtk-execute + True + True 0 True + False Open Loop Test + True + True 1 @@ -461,13 +551,14 @@ 2 8 10 - - + + True + False 0 4 Analog Min Limit: @@ -476,12 +567,13 @@ 4 5 GTK_FILL - + True + False 0 4 Analog Max limit: @@ -490,12 +582,13 @@ 5 6 GTK_FILL - + True + False 0 4 Analog Max Scale: @@ -504,14 +597,18 @@ 6 7 GTK_FILL - + True True - + + False + False + True + True zanalog_min_adjust 2 @@ -520,15 +617,19 @@ 2 4 5 - - + + True True - + + False + False + True + True zanalog_max_adjust 2 @@ -537,15 +638,19 @@ 2 5 6 - - + + True True - + + False + False + True + True zanalog_scale_adjust 2 @@ -554,8 +659,8 @@ 2 6 7 - - + + @@ -613,6 +718,7 @@ True + False Output Info True @@ -620,26 +726,31 @@ False + True 1 True + False 0 True + False 4 4 True + False 8 2 True + False 0 Step On-Time @@ -647,12 +758,13 @@ 1 2 GTK_FILL - + True + False 0 Step Space @@ -660,14 +772,18 @@ 2 3 GTK_FILL - + True True - + + False + False + True + True zsteptime_adjust @@ -675,15 +791,19 @@ 2 1 2 - - + + True True - + + False + False + True + True zstepspace_adjust @@ -691,13 +811,14 @@ 2 2 3 - - + + True + False 0 Direction Hold @@ -705,12 +826,13 @@ 3 4 GTK_FILL - + True + False 0 Direction Setup @@ -718,14 +840,18 @@ 4 5 GTK_FILL - + True True - + + False + False + True + True zdirhold_adjust @@ -733,15 +859,19 @@ 2 3 4 - - + + True True - + + False + False + True + True zdirsetup_adjust @@ -749,13 +879,14 @@ 2 4 5 - - + + True + False 0 Driver Type: True @@ -764,15 +895,16 @@ 5 6 GTK_FILL - + 120 True + False driverstore - + @@ -786,7 +918,7 @@ 5 6 GTK_FILL - + @@ -814,6 +946,7 @@ True + False Stepper Info True @@ -836,9 +969,11 @@ True + False True + False 0 @@ -848,27 +983,34 @@ True False + False True + False 0 True + False 12 True + False No feedback True True False + False True True + True + True 0 @@ -878,9 +1020,12 @@ True True False + False True + True + True 1 @@ -890,9 +1035,12 @@ True True False + False True + True + True 2 @@ -902,9 +1050,12 @@ True True False + False True + True + True 3 @@ -914,9 +1065,12 @@ True True False + False True + True + True 4 @@ -926,9 +1080,12 @@ True True False + False True + True + True 5 @@ -938,25 +1095,34 @@ True True False + False True + True + True 6 True + False + True + True 7 True + False + True + True 8 @@ -967,35 +1133,44 @@ True + False <b>Input Options</b> True + True + True 0 True + False 0 True + False 12 True + False Digital instead of PWM outputs True True False + False True + True + True 0 @@ -1005,9 +1180,12 @@ True True False + False True + True + True 1 @@ -1017,9 +1195,12 @@ True True False + False True + True + True 2 @@ -1029,9 +1210,12 @@ True True False + False True + True + True 3 @@ -1041,10 +1225,13 @@ True True False + False True True + True + True 4 @@ -1054,54 +1241,74 @@ True True False + False True + True + True 5 True + False True True - + + False + False + True + True 1 False + True 0 True + False 8i20 Max Current + True + True 1 + True + True 6 True + False + True + True 7 True + False + True + True 8 @@ -1112,33 +1319,43 @@ True + False <b>Output Options</b> True + True + True 1 True + False 0 True + False 12 True + False 9 2 True True - + + False + False + True + True 1 @@ -1151,7 +1368,11 @@ True True - + + False + False + True + True 2 @@ -1164,6 +1385,7 @@ True + False alignment current @@ -1174,6 +1396,7 @@ True + False lead angle @@ -1186,6 +1409,7 @@ True True False + False True @@ -1199,7 +1423,11 @@ True True - + + False + False + True + True 1 @@ -1212,7 +1440,11 @@ True True - + + False + False + True + True 1 @@ -1225,7 +1457,11 @@ True True - + + False + False + True + True 1 @@ -1238,7 +1474,11 @@ True True - + + False + False + True + True 1 @@ -1251,7 +1491,11 @@ True True - + + False + False + True + True 1 @@ -1264,7 +1508,11 @@ True True - + + False + False + True + True 1 @@ -1274,6 +1522,7 @@ True + False Reverse @@ -1284,6 +1533,7 @@ True + False Input-pattern @@ -1294,6 +1544,7 @@ True + False output-pattern @@ -1304,6 +1555,7 @@ True + False Drive-offset @@ -1314,6 +1566,7 @@ True + False Encoder-offset @@ -1324,6 +1577,7 @@ True + False Poles @@ -1334,6 +1588,7 @@ True + False Scale @@ -1344,12 +1599,15 @@ True + False <b>Configuration</b> True + True + True 2 @@ -1358,6 +1616,7 @@ True + False Details @@ -1368,11 +1627,13 @@ True True False + False True - + True + False <b>Use BLDC Motor Commutation Control</b> True @@ -1381,6 +1642,8 @@ + True + True 0 @@ -1389,30 +1652,38 @@ + True + True 2 True + False + False 0 etched-out True + False 12 True + False True + False Scale: False + True 0 @@ -1420,10 +1691,15 @@ True True - + + False + False + True + True False + True 15 1 @@ -1431,29 +1707,35 @@ True + False % False + True 2 True + False False + True 3 True + False Range: False + True 10 4 @@ -1463,7 +1745,11 @@ True True 3 - + + False + False + True + True False @@ -1475,10 +1761,12 @@ True + False RPM False + True 6 @@ -1491,10 +1779,12 @@ True True False + False True True + False <b>Use Spindle-At-Speed</b> True @@ -1503,27 +1793,34 @@ + True + True 0 + False 0 etched-out True + False 12 True + False True + False Filter gain: False + True 0 @@ -1531,11 +1828,16 @@ True True - + + False + False + True + True 3 False + True 15 1 @@ -1543,9 +1845,11 @@ True + False False + True 2 @@ -1556,37 +1860,46 @@ True + False <b>Spindle Display Filter Settings</b> True + True + True 1 + True + True 3 True + False True + False 0 0.75999999046325684 True + False 5 3 50 True + False 0 mm @@ -1594,24 +1907,26 @@ 2 3 GTK_FILL - + True + False 0 Rapid Speed Following Error: GTK_FILL - + 5 True + False 0 Feed Speed Following Error: @@ -1619,7 +1934,7 @@ 1 2 GTK_FILL - + 5 @@ -1629,13 +1944,14 @@ True True False + False True 2 3 GTK_FILL - + @@ -1644,18 +1960,20 @@ True True False + False True 3 4 GTK_FILL - + True + False 0 mm @@ -1665,14 +1983,18 @@ 1 2 GTK_FILL - + True True - + + False + False + True + True zrapid_adjust 4 @@ -1685,7 +2007,11 @@ True True - + + False + False + True + True zfeed_adjust 4 @@ -1701,6 +2027,7 @@ Single Input Encoder True False + False True @@ -1738,11 +2065,13 @@ True + False 4 3 True + False 0 Maximum _Velocity: True @@ -1751,12 +2080,13 @@ 2 3 GTK_FILL - + True + False 0 Maximum _Acceleration: True @@ -1765,12 +2095,13 @@ 3 4 GTK_FILL - + True + False 0 mm / s @@ -1780,14 +2111,15 @@ 2 3 GTK_FILL - + True + False 0 - mm / s² + mm / s² 2 @@ -1795,14 +2127,18 @@ 3 4 GTK_FILL - + True True - + + False + False + True + True zvelocity_adjust @@ -1816,7 +2152,11 @@ True True - + + False + False + True + True zaccl_adjust 1 @@ -1830,20 +2170,25 @@ True + False 0 encoder Scale: True GTK_FILL - + True True - + + False + False + True + True zencoder_adjust 3 @@ -1855,6 +2200,7 @@ True + False 0 Stepper Scale: True @@ -1863,14 +2209,18 @@ 1 2 GTK_FILL - + True True - + + False + False + True + True zstepper_adjust 3 @@ -1888,7 +2238,8 @@ Scale True True True - + False + 2 @@ -1913,9 +2264,11 @@ Scale True + False True + False 0 0.2800000011920929 @@ -1924,6 +2277,7 @@ Scale False + True 0 @@ -1932,19 +2286,23 @@ Scale True True True - + False + True + False 0 0 True + False 2 True + False gtk-execute @@ -1956,6 +2314,7 @@ Scale True + False Test / Tune Axis True @@ -1979,6 +2338,8 @@ Scale + True + True 5 @@ -1986,77 +2347,60 @@ Scale - - - - - - - - 1 - 5000000 - 100 - - + + 10000 1 - 5000000 - 100 + 0.5 - - 0.5 - 10 - 0.001 + + 10000 + 10 + 1 - - 0.100 - 10 - 0.001 + + -10000 + 10000 + -10 + 1 - - 1 - 1000000 + + 10000 + 10 1 - - 1 + 10000 - 0.5 + 1 - - 5000 - 100 + 10000 - 100 + 1 - - 5000 - 100 + 10000 - 100 + 1 - 5000 100 - 10000 + 50000 + 5000 100 - 5000 100 - 10000 + 50000 + 5000 100 - - 10000 - 1 - - - 10000 - 1 + + 5000000 + 1 + 100 - - 10000 - 1 + + 10 + 0.10000000000000001 + 0.001 10000 @@ -2070,43 +2414,44 @@ Scale 10000 1 - - 10000 - 1 - - + 10000 1 - 10 10000 + 10 1 - - -10 - -10000 + 10000 1 - - 10 - 10000 - 1 + + 10 + 0.5 + 0.001 - - 10 - 10000 - 1 + + 5000000 + 1 + 100 - - 100 - 1 - 10 + + 100 + 50000 + 5000 + 100 - - 100 + + 100 + 50000 + 5000 + 100 + + + 1000000 + 1 1 - 10 From ee4cacf1b0acf4fa7f594e74ed981c555126e9c1 Mon Sep 17 00:00:00 2001 From: john Date: Fri, 2 Jul 2021 19:12:32 -0500 Subject: [PATCH 14/85] fix author name --- docs/man/man1/mb2hal.1 | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/docs/man/man1/mb2hal.1 b/docs/man/man1/mb2hal.1 index 95f49837d85..71d374b668f 100644 --- a/docs/man/man1/mb2hal.1 +++ b/docs/man/man1/mb2hal.1 @@ -1,4 +1,8 @@ -.\" Copyright (c) 2016 John Thornton +.\" Copyright (c) 2016 Victor Rocco +.\" +.\" Victor Rocco, adapted from Les Newell's modbuscomms.c which is +.\" Copyright (C) 2009-2012 Les Newell +.\" source code in http://wiki.linuxcnc.org/cgi-bin/wiki.pl?ContributedComponents .\" .\" This is free documentation; you can redistribute it and/or .\" modify it under the terms of the GNU General Public License as @@ -35,6 +39,6 @@ Modbus devices. .PP See the Documents for more information on mb2hal .SH AUTHOR -John Thornton +Victor Rocco .SH LICENSE GPL From 2f8fa89b57cd12c01d144974f6256be30c6afc9f Mon Sep 17 00:00:00 2001 From: Phillip Carter Date: Mon, 5 Jul 2021 11:59:14 +1000 Subject: [PATCH 15/85] pncconf: fix all-limit-home config settings --- src/emc/usr_intf/pncconf/build_INI.py | 9 +++++++-- src/emc/usr_intf/pncconf/pncconf.py | 8 ++++---- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/src/emc/usr_intf/pncconf/build_INI.py b/src/emc/usr_intf/pncconf/build_INI.py index a50c4c24b6d..6416e00c7ef 100644 --- a/src/emc/usr_intf/pncconf/build_INI.py +++ b/src/emc/usr_intf/pncconf/build_INI.py @@ -402,8 +402,9 @@ def get(s): return self.d[letter + s] minlim, maxlim = self.find_limits(letter) print >>file, "MIN_LIMIT = %s" % minlim print >>file, "MAX_LIMIT = %s" % maxlim - thisaxishome = set(("all-home", "home-" + letter, "min-home-" + letter, "max-home-" + letter, "both-home-" + letter)) - ignore = set(("min-home-" + letter, "max-home-" + letter, "both-home-" + letter)) + thisaxishome = set(("all-limit-home", "all-home", "home-" + letter, "min-home-" + letter, "max-home-" + letter, "both-home-" + letter)) + ignore = set(("min-home-" + letter, "max-home-" + letter, "both-home-" + letter, "all-limit-home")) + share = set(("all-limit-home", "all-home")) homes = False for i in thisaxishome: if self.a.findsignal(i): homes = True @@ -435,6 +436,10 @@ def get(s): return self.d[letter + s] if self.a.findsignal(i): print >>file, "HOME_IGNORE_LIMITS = YES" break + for i in share: + if self.a.findsignal(i): + print >>file, "HOME_IS_SHARED = 1" + break else: print >>file, "HOME_OFFSET = %s" % get("homepos") # if all axis have homing switches and user doesn't request diff --git a/src/emc/usr_intf/pncconf/pncconf.py b/src/emc/usr_intf/pncconf/pncconf.py index 3d221599306..eb5dfd2ee6e 100755 --- a/src/emc/usr_intf/pncconf/pncconf.py +++ b/src/emc/usr_intf/pncconf/pncconf.py @@ -4064,7 +4064,7 @@ def set_active(n): w[axis + n].set_active(d[axis + n]) set_active("searchdir") set_active("latchdir") set_active("usehomeindex") - thisaxishome = set(("all-home", "home-" + axis, "min-home-" + axis,"max-home-" + axis, "both-home-" + axis)) + thisaxishome = set(("all-limit-home", "all-home", "home-" + axis, "min-home-" + axis,"max-home-" + axis, "both-home-" + axis)) homes = False for i in thisaxishome: test = self.findsignal(i) @@ -4883,19 +4883,19 @@ def tppwmgen_has_6(self, axis): return test def home_sig(self, axis): - thisaxishome = set(("all-home", "home-" + axis, "min-home-" + axis, "max-home-" + axis, "both-home-" + axis)) + thisaxishome = set(("all-limit-home", "all-home", "home-" + axis, "min-home-" + axis, "max-home-" + axis, "both-home-" + axis)) for i in thisaxishome: if self.findsignal(i): return i return None def min_lim_sig(self, axis): - thisaxishome = set(("all-limit", "min-" + axis,"min-home-" + axis, "both-" + axis, "both-home-" + axis)) + thisaxishome = set(("all-limit-home", "all-limit", "min-" + axis,"min-home-" + axis, "both-" + axis, "both-home-" + axis)) for i in thisaxishome: if self.findsignal(i): return i return None def max_lim_sig(self, axis): - thisaxishome = set(("all-limit", "max-" + axis, "max-home-" + axis, "both-" + axis, "both-home-" + axis)) + thisaxishome = set(("all-limit-home", "all-limit", "max-" + axis, "max-home-" + axis, "both-" + axis, "both-home-" + axis)) for i in thisaxishome: if self.findsignal(i): return i return None From fb90374eebe62cf67f21ca6e95a92b7a62012a67 Mon Sep 17 00:00:00 2001 From: Phillip Carter Date: Mon, 5 Jul 2021 12:11:27 +1000 Subject: [PATCH 16/85] pncconf: fix dual mesa card config settings --- src/emc/usr_intf/pncconf/build_INI.py | 7 +++- src/emc/usr_intf/pncconf/pncconf.py | 52 ++++++++++++++++----------- 2 files changed, 38 insertions(+), 21 deletions(-) diff --git a/src/emc/usr_intf/pncconf/build_INI.py b/src/emc/usr_intf/pncconf/build_INI.py index 6416e00c7ef..cd86823e4ce 100644 --- a/src/emc/usr_intf/pncconf/build_INI.py +++ b/src/emc/usr_intf/pncconf/build_INI.py @@ -124,7 +124,12 @@ def write_inifile(self, base): print >>file, "# **** This is for info only ****" print >>file, "CARD0=hm2_%s.0"% self.d.mesa0_currentfirmwaredata[_PD._BOARDNAME] if self.d.number_mesa == 2: - print >>file, "CARD1=hm_%s.1"% self.d.mesa1_currentfirmwaredata[_PD._BOARDNAME] + for boardnum in range(0,int(self.d.number_mesa)): + if boardnum == 1 and (self.d.mesa0_currentfirmwaredata[_PD._BOARDNAME] == self.d.mesa1_currentfirmwaredata[_PD._BOARDNAME]): + halnum = 1 + else: + halnum = 0 + print >>file, "CARD1=hm2_%s.%d"% (self.d.mesa1_currentfirmwaredata[_PD._BOARDNAME], halnum) if self.d._substitution_list: print >>file, "# These are to ease setting custom component's parameters in a custom HAL file" print >>file diff --git a/src/emc/usr_intf/pncconf/pncconf.py b/src/emc/usr_intf/pncconf/pncconf.py index eb5dfd2ee6e..2b570c1a715 100755 --- a/src/emc/usr_intf/pncconf/pncconf.py +++ b/src/emc/usr_intf/pncconf/pncconf.py @@ -4932,21 +4932,28 @@ def make_name(bname,bnum): mesa0_ioaddr = mesa1_ioaddr = '' load_cmnds.append("loadrt hostmot2") if '7i43' in board0: - mesa0_ioaddr = ' ioaddr=%s ioaddr_hi=0 epp_wide=1'% self.d.mesa0_parportaddrs + mesa0_ioaddr = ' ioaddr=%s ioaddr_hi=0 epp_wide=0'% self.d.mesa0_parportaddrs if '7i43' in board1: - mesa1_ioaddr = ' ioaddr=%s ioaddr_hi=0 epp_wide=1'% self.d.mesa1_parportaddrs + if mesa0_ioaddr: + mesa0_ioaddr = ' ioaddr=%s,%s ioaddr_hi=0,0 epp_wide=0,0'% (self.d.mesa0_parportaddrs, self.d.mesa1_parportaddrs) + else: + mesa1_ioaddr = ' ioaddr=%s ioaddr_hi=0 epp_wide=0'% self.d.mesa1_parportaddrs if 'eth' in driver0: firmstring0 ='' if self.d.mesa0_card_addrs: board0_ip = ''' board_ip="%s"''' % self.d.mesa0_card_addrs elif not "5i25" in board0: - firmstring0 = "firmware=hm2/%s/%s.BIT" % (directory0, firm0) + firmstring0 = "firmware=hm2/%s/%s.BIT " % (directory0, firm0) if 'eth' in driver1: firmstring1 ='' if self.d.mesa1_card_addrs: - board1_ip = ''' board_ip="%s"'''% self.d.mesa1_card_addrs + if board0_ip: + board0_ip = board0_ip.rstrip('"') + "," + board1_ip = ' %s"'% self.d.mesa1_card_addrs + else: + board1_ip = ' board_ip="%s"' % self.d.mesa1_card_addrs elif not "5i25" in board1: - firmstring1 = "firmware=hm2/%s/%s.BIT" % (directory1, firm1) + firmstring1 = "firmware=hm2/%s/%s.BIT " % (directory1, firm1) # TODO fix this hardcoded hack: only one serialport ssconfig0 = ssconfig1 = resolver0 = resolver1 = temp = "" @@ -4984,23 +4991,28 @@ def make_name(bname,bnum): mesa1_3pwm = ' num_3pwmgens=%d' %self.d.mesa1_numof_tppwmgens if self.d.number_mesa == 1: - load_cmnds.append( """loadrt%s%s%s config="%s num_encoders=%d num_pwmgens=%d%s num_stepgens=%d%s%s" """ % ( - driver0, board0_ip, mesa0_ioaddr, firmstring0, self.d.mesa0_numof_encodergens, self.d.mesa0_numof_pwmgens, - mesa0_3pwm, self.d.mesa0_numof_stepgens, ssconfig0, resolver0)) + load_cmnds.append( """loadrt%s%s%s config="%snum_encoders=%d num_pwmgens=%d%s num_stepgens=%d%s%s" """ % ( + driver0, board0_ip, mesa0_ioaddr, + firmstring0, self.d.mesa0_numof_encodergens, self.d.mesa0_numof_pwmgens, mesa0_3pwm, self.d.mesa0_numof_stepgens, + ssconfig0, resolver0)) elif self.d.number_mesa == 2 and (driver0 == driver1): - load_cmnds.append( """loadrt%s%s%s config="%s num_encoders=%d num_pwmgens=%d%s num_stepgens=%d%s%s,\ - %s%s num_encoders=%d num_pwmgens=%d%s num_stepgens=%d%s%s" """ % ( - driver0, board0_ip, mesa0_ioaddr, firmstring0, self.d.mesa0_numof_encodergens, self.d.mesa0_numof_pwmgens, - mesa0_3pwm, self.d.mesa0_numof_stepgens, ssconfig0, resolver0, mesa1_ioaddr, firmstring1, - self.d.mesa1_numof_encodergens, self.d.mesa1_numof_pwmgens, mesa1_3pwm, - self.d.mesa1_numof_stepgens, ssconfig1, resolver1)) + loadstring = """loadrt%s%s%s%s%s config="%snum_encoders=%d num_pwmgens=%d%s num_stepgens=%d%s%s,""" % ( + driver0, board0_ip, board1_ip, mesa0_ioaddr, mesa1_ioaddr, + firmstring0, self.d.mesa0_numof_encodergens, self.d.mesa0_numof_pwmgens, mesa0_3pwm, self.d.mesa0_numof_stepgens, + ssconfig0, resolver0) + loadstring += """ %snum_encoders=%d num_pwmgens=%d%s num_stepgens=%d%s%s" """ % ( + firmstring1, self.d.mesa1_numof_encodergens, self.d.mesa1_numof_pwmgens, mesa1_3pwm, self.d.mesa1_numof_stepgens, + ssconfig1, resolver1) + load_cmnds.append(loadstring) elif self.d.number_mesa == 2: - load_cmnds.append( """loadrt%s%s%s config="%s num_encoders=%d num_pwmgens=%d%s num_stepgens=%d%s%s" """ % ( - driver0, board0_ip, mesa0_ioaddr, firmstring0, self.d.mesa0_numof_encodergens, self.d.mesa0_numof_pwmgens, - mesa0_3pwm, self.d.mesa0_numof_stepgens, ssconfig0, resolver0 )) - load_cmnds.append( """loadrt%s%s%s config="%s num_encoders=%d num_pwmgens=%d%s num_stepgens=%d%s%s" """ % ( - driver1, board1_ip, mesa1_ioaddr, firmstring1, self.d.mesa1_numof_encodergens, self.d.mesa1_numof_pwmgens, - mesa0_3pwm, self.d.mesa1_numof_stepgens, ssconfig1, resolver1 )) + load_cmnds.append( """loadrt%s%s%s config="%snum_encoders=%d num_pwmgens=%d%s num_stepgens=%d%s%s" """ % ( + driver0, board0_ip, mesa0_ioaddr, + firmstring0, self.d.mesa0_numof_encodergens, self.d.mesa0_numof_pwmgens, mesa0_3pwm, self.d.mesa0_numof_stepgens, + ssconfig0, resolver0 )) + load_cmnds.append( """loadrt%s%s%s config="%snum_encoders=%d num_pwmgens=%d%s num_stepgens=%d%s%s" """ % ( + driver1, board1_ip, mesa1_ioaddr, + firmstring1, self.d.mesa1_numof_encodergens, self.d.mesa1_numof_pwmgens, mesa1_3pwm, self.d.mesa1_numof_stepgens, + ssconfig1, resolver1 )) for boardnum in range(0,int(self.d.number_mesa)): if boardnum == 1 and (board0 == board1): halnum = 1 From 9851451ccd113a3d708ac3a4ba2df5ba5107d6ab Mon Sep 17 00:00:00 2001 From: Phillip Carter Date: Mon, 5 Jul 2021 12:14:09 +1000 Subject: [PATCH 17/85] pncconf: add a 7i80db and a 7i90hd firmware --- src/emc/usr_intf/pncconf/pncconf.py | 8 +- src/emc/usr_intf/pncconf/private_data.py | 100 +++++++++++++++++------ 2 files changed, 80 insertions(+), 28 deletions(-) diff --git a/src/emc/usr_intf/pncconf/pncconf.py b/src/emc/usr_intf/pncconf/pncconf.py index 2b570c1a715..892ee2351a6 100755 --- a/src/emc/usr_intf/pncconf/pncconf.py +++ b/src/emc/usr_intf/pncconf/pncconf.py @@ -4931,9 +4931,9 @@ def make_name(bname,bnum): mesa0_3pwm = mesa1_3pwm = '' mesa0_ioaddr = mesa1_ioaddr = '' load_cmnds.append("loadrt hostmot2") - if '7i43' in board0: + if '7i43' in board0 or '7i90' in board0: mesa0_ioaddr = ' ioaddr=%s ioaddr_hi=0 epp_wide=0'% self.d.mesa0_parportaddrs - if '7i43' in board1: + if '7i43' in board1 or '7i90' in board1: if mesa0_ioaddr: mesa0_ioaddr = ' ioaddr=%s,%s ioaddr_hi=0,0 epp_wide=0,0'% (self.d.mesa0_parportaddrs, self.d.mesa1_parportaddrs) else: @@ -4942,7 +4942,7 @@ def make_name(bname,bnum): firmstring0 ='' if self.d.mesa0_card_addrs: board0_ip = ''' board_ip="%s"''' % self.d.mesa0_card_addrs - elif not "5i25" in board0: + elif not "5i25" in board0 and not '7i90' in board0: firmstring0 = "firmware=hm2/%s/%s.BIT " % (directory0, firm0) if 'eth' in driver1: firmstring1 ='' @@ -4952,7 +4952,7 @@ def make_name(bname,bnum): board1_ip = ' %s"'% self.d.mesa1_card_addrs else: board1_ip = ' board_ip="%s"' % self.d.mesa1_card_addrs - elif not "5i25" in board1: + elif not "5i25" in board1 and not '7i90' in board1: firmstring1 = "firmware=hm2/%s/%s.BIT " % (directory1, firm1) # TODO fix this hardcoded hack: only one serialport diff --git a/src/emc/usr_intf/pncconf/private_data.py b/src/emc/usr_intf/pncconf/private_data.py index 593f421daa3..78834a608c0 100644 --- a/src/emc/usr_intf/pncconf/private_data.py +++ b/src/emc/usr_intf/pncconf/private_data.py @@ -675,6 +675,78 @@ def __init__(self,app,bin_dir,base_dir): [S.GPIOI, 0],[S.GPIOI, 0],[S.GPIOI, 0],[S.GPIOI, 0],[S.GPIOI, 0],[S.GPIOI, 0],[S.GPIOI, 0], [S.NUSED,0],[S.NUSED,0],[S.NUSED,0],[S.NUSED,0],[S.NUSED,0],[S.NUSED,0],[S.NUSED,0],], + ['7i76e-Internal Data', '7i76e', '7i76e_7i76x1_Dpl', '7i76', 'hm2_eth', + 3,1, 0,0, 0,3, 0,0, 5,2, 1,2, [],0,0,0,0,0,0,0, 1, 34, 33, 200, [1, 2, 3], + # TAB 1 + [S.STEPB,0],[S.STEPA,0],[S.STEPB,1],[S.STEPA,1],[S.STEPB,2],[S.STEPA,2],[S.STEPB,3],[S.STEPA,3],[S.STEPB,4],[S.STEPA,4], + [S.SS7I76M0,0],[S.RXDATA0,0],[S.TXDATA1,0],[S.RXDATA1,0],[S.ENCA,2],[S.ENCA,1],[S.ENCA,0], + [S.NUSED,0],[S.NUSED,0],[S.NUSED,0],[S.NUSED,0],[S.NUSED,0],[S.NUSED,0],[S.NUSED,0], + # TAB 2 + [S.GPIOI, 0],[S.GPIOI, 0],[S.GPIOI, 0],[S.GPIOI, 0],[S.GPIOI, 0],[S.GPIOI, 0],[S.GPIOI, 0],[S.GPIOI, 0],[S.GPIOI, 0],[S.GPIOI, 0], + [S.GPIOI, 0],[S.GPIOI, 0],[S.GPIOI, 0],[S.GPIOI, 0],[S.GPIOI, 0],[S.GPIOI, 0],[S.GPIOI, 0], + [S.NUSED,0],[S.NUSED,0],[S.NUSED,0],[S.NUSED,0],[S.NUSED,0],[S.NUSED,0],[S.NUSED,0], + # TAB 3 + [S.GPIOI, 0],[S.GPIOI, 0],[S.GPIOI, 0],[S.GPIOI, 0],[S.GPIOI, 0],[S.GPIOI, 0],[S.GPIOI, 0],[S.GPIOI, 0],[S.GPIOI, 0],[S.GPIOI, 0], + [S.GPIOI, 0],[S.GPIOI, 0],[S.GPIOI, 0],[S.GPIOI, 0],[S.GPIOI, 0],[S.GPIOI, 0],[S.GPIOI, 0], + [S.NUSED,0],[S.NUSED,0],[S.NUSED,0],[S.NUSED,0],[S.NUSED,0],[S.NUSED,0],[S.NUSED,0],], + + # 7i80 ################# + ["7i80DB-Internal Data", "7i80db", "7I76x2", "7i80DB", "hm2_eth", + 2,3, 0,0, 0,0, 0,0, 10,2, 4,4, [],0,0,0,0,0,0,0, 1, 68, 33, 100, [1,2,3,4], + #TAB 1 + [S.STEPB,0],[S.STEPA,0],[S.STEPB,1],[S.STEPA,1],[S.STEPB,2],[S.STEPA,2],[S.STEPB,3],[S.STEPA,3],[S.STEPB,4],[S.STEPA,4], + [S.TXDATA0, 0],[S.RXDATA0, 0],[S.TXDATA1, 0],[S.RXDATA1, 0],[S.ENCI,0],[S.ENCB,0],[S.ENCA,0], + [S.NUSED,0],[S.NUSED,0],[S.NUSED,0],[S.NUSED,0],[S.NUSED,0],[S.NUSED,0],[S.NUSED,0], + #TAB 2 + [S.STEPB,5],[S.STEPA,5],[S.STEPB,6],[S.STEPA,6],[S.STEPB,7],[S.STEPA,7],[S.STEPB,8],[S.STEPA,8],[S.STEPB,9],[S.STEPA,9], + [S.TXDATA2, 0],[S.RXDATA2, 0],[S.TXDATA3, 0],[S.RXDATA3, 0],[S.ENCI,1],[S.ENCB,1],[S.ENCA,1], + [S.NUSED,0],[S.NUSED,0],[S.NUSED,0],[S.NUSED,0],[S.NUSED,0],[S.NUSED,0],[S.NUSED,0], + #TAB 3 + [S.GPIOI,0],[S.GPIOI,0],[S.GPIOI,0],[S.GPIOI,0],[S.GPIOI,0],[S.GPIOI,0],[S.GPIOI,0],[S.GPIOI,0],[S.GPIOI,0], + [S.GPIOI,0],[S.GPIOI,0],[S.GPIOI,0],[S.GPIOI,0],[S.GPIOI,0],[S.GPIOI,0],[S.GPIOI,0],[S.GPIOI,0], + [S.NUSED,0],[S.NUSED,0],[S.NUSED,0],[S.NUSED,0],[S.NUSED,0],[S.NUSED,0],[S.NUSED,0], + #TAB 4 + [S.GPIOI,0],[S.GPIOI,0],[S.GPIOI,0],[S.GPIOI,0],[S.GPIOI,0],[S.GPIOI,0],[S.GPIOI,0],[S.GPIOI,0],[S.GPIOI,0], + [S.GPIOI,0],[S.GPIOI,0],[S.GPIOI,0],[S.GPIOI,0],[S.GPIOI,0],[S.GPIOI,0],[S.GPIOI,0],[S.GPIOI,0], + [S.NUSED,0],[S.NUSED,0],[S.NUSED,0],[S.NUSED,0],[S.NUSED,0],[S.NUSED,0],[S.NUSED,0],], + + ["7i80HD-Internal Data", "7i80hd", "SV12", "7i80HD", "hm2_eth", + 12,3, 0,0, 12,3, 0,0, 0,0, 0,0, [],0,0,0,0,0,0,0, 1, 72 , 33, 100, [1,2,3], + # TAB 1 + [S.ENCB,1],[S.ENCA,1],[S.ENCB,0],[S.ENCA,0],[S.ENCI,1],[S.ENCI,0],[S.PWMP,1],[S.PWMP,0],[S.PWMD,1],[S.PWMD,0],[S.PWME,1],[S.PWME,0], + [S.ENCB,3],[S.ENCA,3],[S.ENCB,2],[S.ENCA,2],[S.ENCI,3],[S.ENCI,2],[S.PWMP,3],[S.PWMP,2],[S.PWMD,3],[S.PWMD,2],[S.PWME,3],[S.PWME,2], + # TAB 2 + [S.ENCB,5],[S.ENCA,5],[S.ENCB,4],[S.ENCA,4],[S.ENCI,5],[S.ENCI,4],[S.PWMP,5],[S.PWMP,4],[S.PWMD,5],[S.PWMD,4],[S.PWME,5],[S.PWME,4], + [S.ENCB,7],[S.ENCA,7],[S.ENCB,6],[S.ENCA,6],[S.ENCI,7],[S.ENCI,6],[S.PWMP,7],[S.PWMP,6],[S.PWMD,7],[S.PWMD,6],[S.PWME,7],[S.PWME,6], + # TAB 3 + [S.ENCB,9],[S.ENCA,9],[S.ENCB,8],[S.ENCA,8],[S.ENCI,9],[S.ENCI,8],[S.PWMP,9],[S.PWMP,8],[S.PWMD,9],[S.PWMD,8],[S.PWME,9],[S.PWME,8], + [S.ENCB,11],[S.ENCA,11],[S.ENCB,10],[S.ENCA,10],[S.ENCI,11],[S.ENCI,10],[S.PWMP,11],[S.PWMP,10],[S.PWMD,11],[S.PWMD,10],[S.PWME,11],[S.PWME,10],], + + ["7i80HD-Internal Data", "7i80hd", "SVST8_4", "7i80HD", "hm2_eth", + 8,3, 0,0, 8,3, 0,0, 4,2, 0,0, [],0,0,0,0,0,0,0, 1, 72, 33, 100, [1,2,3], + # TAB 1 + [S.ENCB,1],[S.ENCA,1],[S.ENCB,0],[S.ENCA,0],[S.ENCI,1],[S.ENCI,0],[S.PWMP,1],[S.PWMP,0],[S.PWMD,1],[S.PWMD,0],[S.PWME,1],[S.PWME,0], + [S.ENCB,3],[S.ENCA,3],[S.ENCB,2],[S.ENCA,2],[S.ENCI,3],[S.ENCI,2],[S.PWMP,3],[S.PWMP,2],[S.PWMD,3],[S.PWMD,2],[S.PWME,3],[S.PWME,2], + # TAB 2 + [S.ENCB,5],[S.ENCA,5],[S.ENCB,4],[S.ENCA,4],[S.ENCI,5],[S.ENCI,4],[S.PWMP,5],[S.PWMP,4],[S.PWMD,5],[S.PWMD,4],[S.PWME,5],[S.PWME,4], + [S.ENCB,7],[S.ENCA,7],[S.ENCB,6],[S.ENCA,6],[S.ENCI,7],[S.ENCI,6],[S.PWMP,7],[S.PWMP,6],[S.PWMD,7],[S.PWMD,6],[S.PWME,7],[S.PWME,6], + # TAB 3 + [S.STEPA,0],[S.STEPB,0],[S.GPIOI,0],[S.GPIOI,0],[S.GPIOI,0],[S.GPIOI,0],[S.STEPA,1],[S.STEPB,1],[S.GPIOI,0],[S.GPIOI,0],[S.GPIOI,0],[S.GPIOI,0], + [S.STEPA,2],[S.STEPB,2],[S.GPIOI,0],[S.GPIOI,0],[S.GPIOI,0],[S.GPIOI,0],[S.STEPA,3],[S.STEPB,3],[S.GPIOI,0],[S.GPIOI,0],[S.GPIOI,0],[S.GPIOI,0] ], + + # 7i90 #################### + ["7i90HD-Internal Data", "7i90", "SVST1_4_2x7i47s", "7i90HD", "hm2_7i90", + 8,3, 0,0, 2,3, 0,0, 8,2, 0,0, [],0,0,0,0,0,0,0, 1, 72, 33, 100, [1,2,3], + #TAB 1 + [S.STEPA,0],[S.STEPB,0],[S.STEPA,1],[S.STEPB,1],[S.ENCA,0],[S.ENCA,2],[S.ENCB,0],[S.ENCB,2],[S.ENCI,0],[S.ENCI,2],[S.ENCA,1],[S.ENCA,3], + [S.ENCB,1],[S.ENCB,3],[S.ENCI,1],[S.ENCI,3],[S.NUSED,0],[S.PWMD,0],[S.PWME,0],[S.PWMP,0],[S.STEPA,2],[S.STEPB,2],[S.STEPA,3],[S.STEPB,3], + #TAB 2 + [S.STEPA,4],[S.STEPB,4],[S.STEPA,5],[S.STEPB,5],[S.ENCA,4],[S.ENCA,6],[S.ENCB,4],[S.ENCB,6],[S.ENCI,4],[S.ENCI,6],[S.ENCA,5],[S.ENCA,7], + [S.ENCB,5],[S.ENCB,7],[S.ENCI,5],[S.ENCI,7],[S.NUSED,0],[S.PWMD,1],[S.PWME,1],[S.PWMP,1],[S.STEPA,6],[S.STEPB,6],[S.STEPA,7],[S.STEPB,7], + #TAB 3 + [S.GPIOI,0],[S.GPIOI,0],[S.GPIOI,0],[S.GPIOI,0],[S.GPIOI,0],[S.GPIOI,0],[S.GPIOI,0],[S.GPIOI,0],[S.GPIOI,0],[S.GPIOI,0],[S.GPIOI,0],[S.GPIOI,0], + [S.GPIOI,0],[S.GPIOI,0],[S.GPIOI,0],[S.GPIOI,0],[S.GPIOI,0],[S.GPIOI,0],[S.GPIOI,0],[S.GPIOI,0],[S.GPIOI,0],[S.GPIOI,0],[S.GPIOI,0],[S.GPIOI,0],], + # 7i92 #################### ["7i92-Internal Data", "7i92", "7i76x2 with one 7i76 ", "7i92", "hm2_eth", 1,3, 0,0, 0,3, 0,0, 5,2, 1,2, [],0,0,0,0,0,0,0, 1, 34 , 33, 200, [2,1], @@ -760,25 +832,6 @@ def __init__(self,app,bin_dir,base_dir): [S.STEPA,0],[S.STEPB,0],[S.GPIOI,0],[S.GPIOI,0],[S.GPIOI,0],[S.GPIOI,0],[S.STEPA,1],[S.STEPB,1],[S.GPIOI,0],[S.GPIOI,0],[S.GPIOI,0],[S.GPIOI,0], [S.STEPA,2],[S.STEPB,2],[S.GPIOI,0],[S.GPIOI,0],[S.GPIOI,0],[S.GPIOI,0],[S.STEPA,3],[S.STEPB,3],[S.GPIOI,0],[S.GPIOI,0],[S.GPIOI,0],[S.GPIOI,0],], - # 7i80HD ################# - ["7i80HD-Internal Data", "7i80hd", "SV12", "7i80HD", "hm2_eth", - 12,3, 0,0, 12,3, 0,0, 0,0, 0,0, [],0,0,0,0,0,0,0, 1, 72 , 33, 100, [2,3,4], - [S.ENCB,1],[S.ENCA,1],[S.ENCB,0],[S.ENCA,0],[S.ENCI,1],[S.ENCI,0],[S.PWMP,1],[S.PWMP,0],[S.PWMD,1],[S.PWMD,0],[S.PWME,1],[S.PWME,0], - [S.ENCB,3],[S.ENCA,3],[S.ENCB,2],[S.ENCA,2],[S.ENCI,3],[S.ENCI,2],[S.PWMP,3],[S.PWMP,2],[S.PWMD,3],[S.PWMD,2],[S.PWME,3],[S.PWME,2], - [S.ENCB,5],[S.ENCA,5],[S.ENCB,4],[S.ENCA,4],[S.ENCI,5],[S.ENCI,4],[S.PWMP,5],[S.PWMP,4],[S.PWMD,5],[S.PWMD,4],[S.PWME,5],[S.PWME,4], - [S.ENCB,7],[S.ENCA,7],[S.ENCB,6],[S.ENCA,6],[S.ENCI,7],[S.ENCI,6],[S.PWMP,7],[S.PWMP,6],[S.PWMD,7],[S.PWMD,6],[S.PWME,7],[S.PWME,6], - [S.ENCB,9],[S.ENCA,9],[S.ENCB,8],[S.ENCA,8],[S.ENCI,9],[S.ENCI,8],[S.PWMP,9],[S.PWMP,8],[S.PWMD,9],[S.PWMD,8],[S.PWME,9],[S.PWME,8], - [S.ENCB,11],[S.ENCA,11],[S.ENCB,10],[S.ENCA,10],[S.ENCI,11],[S.ENCI,10],[S.PWMP,11],[S.PWMP,10],[S.PWMD,11],[S.PWMD,10],[S.PWME,11],[S.PWME,10],], - - ["7i80HD-Internal Data", "7i80hd", "SVST8_4", "7i80HD", "hm2_eth", - 8,3, 0,0, 8,3, 0,0, 4,2, 0,0, [],0,0,0,0,0,0,0, 1, 72, 33, 100, [2,3,4], - [S.ENCB,1],[S.ENCA,1],[S.ENCB,0],[S.ENCA,0],[S.ENCI,1],[S.ENCI,0],[S.PWMP,1],[S.PWMP,0],[S.PWMD,1],[S.PWMD,0],[S.PWME,1],[S.PWME,0], - [S.ENCB,3],[S.ENCA,3],[S.ENCB,2],[S.ENCA,2],[S.ENCI,3],[S.ENCI,2],[S.PWMP,3],[S.PWMP,2],[S.PWMD,3],[S.PWMD,2],[S.PWME,3],[S.PWME,2], - [S.ENCB,5],[S.ENCA,5],[S.ENCB,4],[S.ENCA,4],[S.ENCI,5],[S.ENCI,4],[S.PWMP,5],[S.PWMP,4],[S.PWMD,5],[S.PWMD,4],[S.PWME,5],[S.PWME,4], - [S.ENCB,7],[S.ENCA,7],[S.ENCB,6],[S.ENCA,6],[S.ENCI,7],[S.ENCI,6],[S.PWMP,7],[S.PWMP,6],[S.PWMD,7],[S.PWMD,6],[S.PWME,7],[S.PWME,6], - [S.STEPA,0],[S.STEPB,0],[S.GPIOI,0],[S.GPIOI,0],[S.GPIOI,0],[S.GPIOI,0],[S.STEPA,1],[S.STEPB,1],[S.GPIOI,0],[S.GPIOI,0],[S.GPIOI,0],[S.GPIOI,0], - [S.STEPA,2],[S.STEPB,2],[S.GPIOI,0],[S.GPIOI,0],[S.GPIOI,0],[S.GPIOI,0],[S.STEPA,3],[S.STEPB,3],[S.GPIOI,0],[S.GPIOI,0],[S.GPIOI,0],[S.GPIOI,0] ], - # 7i96 #################### ['7i96-Internal Data', '7i96', '7i96d', '7i96', 'hm2_eth', 1,3, 0,0, 0,3, 0,0, 5,2, 1,1, [],0,0,0,0,0,0,0, 1, 34, 33, 200, [1, 2, 3], @@ -984,14 +1037,13 @@ def __init__(self,app,bin_dir,base_dir): '5i25':{'DRIVER':'hm2_pci','PINS_PER_CONNECTOR':17,'TOTAL_CONNECTORS':2}, '7i43':{'DRIVER':'hm2_7i43','PINS_PER_CONNECTOR':24,'TOTAL_CONNECTORS':2}, '7i68':{'DRIVER':'hm2_pci','PINS_PER_CONNECTOR':24,'TOTAL_CONNECTORS':6}, - '7i80hd':{'DRIVER':'hm2_eth','PINS_PER_CONNECTOR':24,'TOTAL_CONNECTORS':3}, - '7i80db':{'DRIVER':'hm2_eth','PINS_PER_CONNECTOR':17,'TOTAL_CONNECTORS':4}, '7i76e':{'DRIVER':'hm2_eth','PINS_PER_CONNECTOR':17,'TOTAL_CONNECTORS':3}, - '7i90':{'DRIVER':'hm2_7i90','PINS_PER_CONNECTOR':24,'TOTAL_CONNECTORS':3}, + '7i80hd':{'DRIVER':'hm2_eth','PINS_PER_CONNECTOR':24,'TOTAL_CONNECTORS':3,'TAB_NUMS':[1,2,3],'TAB_NAMES':['P1','P2','P3']}, + '7i80db':{'DRIVER':'hm2_eth','PINS_PER_CONNECTOR':17,'TOTAL_CONNECTORS':4,'TAB_NUMS':[1,2,3,4],'TAB_NAMES':['P1','P2','P3','P4']}, + '7i90':{'DRIVER':'hm2_7i90','PINS_PER_CONNECTOR':24,'TOTAL_CONNECTORS':3,'TAB_NUMS':[1,2,3],'TAB_NAMES':['P1','P2','P3']}, '7i92':{'DRIVER':'hm2_eth','PINS_PER_CONNECTOR':17,'TOTAL_CONNECTORS':2}, '7i93':{'DRIVER':'hm2_eth','PINS_PER_CONNECTOR':24,'TOTAL_CONNECTORS':2}, - '7i96':{'DRIVER':'hm2_eth','PINS_PER_CONNECTOR':17,'TOTAL_CONNECTORS':3, - 'TAB_NUMS':[1,2,3],'TAB_NAMES':['TB3','TB1/TB2','P1']}, + '7i96':{'DRIVER':'hm2_eth','PINS_PER_CONNECTOR':17,'TOTAL_CONNECTORS':3,'TAB_NUMS':[1,2,3],'TAB_NAMES':['TB3','TB1/TB2','P1']}, '7i98':{'DRIVER':'hm2_eth','PINS_PER_CONNECTOR':17,'TOTAL_CONNECTORS':3}, } From 842a5137a6c0255846eb8bdd023634c6cbd249de Mon Sep 17 00:00:00 2001 From: Phillip Carter Date: Mon, 5 Jul 2021 12:15:44 +1000 Subject: [PATCH 18/85] pncconf: rename 7i80 hal name --- src/emc/usr_intf/pncconf/pncconf.py | 27 ++++++++++++++++++--------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/src/emc/usr_intf/pncconf/pncconf.py b/src/emc/usr_intf/pncconf/pncconf.py index 892ee2351a6..ebcdf54ca64 100755 --- a/src/emc/usr_intf/pncconf/pncconf.py +++ b/src/emc/usr_intf/pncconf/pncconf.py @@ -215,6 +215,7 @@ def __init__(self, dbgstate=0): window.show() self.axis_under_test = False self.jogminus = self.jogplus = 0 + self.origname = ['',''] # set preferences if they exist link = short = advanced = show_pages = False @@ -349,14 +350,22 @@ def discovery_interface_combobox_changed(self,w): else: self.widgets.discovery_address_entry.set_sensitive(False) - def get_board_meta(self, name): + def get_board_meta(self, name, num): name = name.lower() - meta = _PD.MESA_BOARD_META.get(name) + # 7i80hd and 7i80db don't use the HD or DB in the Hal name + # store the original name here for getting the board meta + if name != '7i80': + self.origname[num] = name + # change the name in currentfirmwaredata to the Hal name + if name in ['7i80hd', '7i80db'] and self.d["mesa%d_currentfirmwaredata"% num]: + self.d["mesa%d_currentfirmwaredata"% num][_PD._BOARDNAME] = '7i80' + + meta = _PD.MESA_BOARD_META.get(self.origname[num]) if meta: return meta else: for key in _PD.MESA_BOARD_META: - if key in name: + if key in self.origname[num]: return _PD.MESA_BOARD_META.get(key) print 'boardname %s not found in hardware metadata array'% name @@ -917,7 +926,7 @@ def mesa_firmware_search(self,boardtitle,*args): self._p.MESA_FIRMWAREDATA.append(firmdata) self.window.hide() - def parse_xml(self, driver, boardtitle, firmname, xml_path): + def parse_xml(self, driver, boardtitle, firmname, xml_path, boardnum=0): def search(elementlist): for i in elementlist: temp = root.find(i) @@ -961,7 +970,7 @@ def search(elementlist): hifreq = int(text)/1000000 modules = root.findall(".//modules")[0] if driver == None: - meta = self.get_board_meta(boardname) + meta = self.get_board_meta(boardname, boardnum) driver = meta.get('DRIVER') for i,j in enumerate(modules): k = modules[i].find("tagname").text @@ -1487,7 +1496,7 @@ def discovery_selection_update(self, info, bdnum): driver, boardname, firmname, path = self.parse_discovery(info,boardnum=bdnum) print driver, boardname, firmname, path boardname = 'Discovered:%s'% boardname - firmdata = self.parse_xml( driver,boardname,firmname,path) + firmdata = self.parse_xml( driver,boardname,firmname,path,boardnum) self._p.MESA_FIRMWAREDATA.append(firmdata) self._p.MESA_INTERNAL_FIRMWAREDATA.append(firmdata) self._p.MESA_BOARDNAMES.append(boardname) @@ -2017,7 +2026,7 @@ def on_mesa_boardname_changed(self, widget,boardnum): self.widgets["mesa%dsserial0_%d"%(boardnum,i)].hide() if title == None: return if 'Discovery Option' not in title: - meta = self.get_board_meta(title) + meta = self.get_board_meta(title, boardnum) names = meta.get('TAB_NAMES') tnums = meta.get('TAB_NUMS') if names and tnums: @@ -2450,7 +2459,7 @@ def set_mesa_options(self,boardnum,title,firmware,numofpwmgens,numoftppwmgens,nu pass currentboard = self.d["mesa%d_currentfirmwaredata"% boardnum][_PD._BOARDNAME] - meta = self.get_board_meta(currentboard) + meta = self.get_board_meta(currentboard, boardnum) ppc = meta.get('PINS_PER_CONNECTOR') for concount,connector in enumerate(self.d["mesa%d_currentfirmwaredata"% boardnum][_PD._NUMOFCNCTRS]) : @@ -5210,7 +5219,7 @@ def make_name(bname,bnum): _PD.POTE:"spinena",_PD.POTD:"spindir",_PD.ANALOGIN:"analog","Error":"None" } boardnum = int(test[4:5]) boardname = self.d["mesa%d_currentfirmwaredata"% boardnum][_PD._BOARDNAME] - meta = self.get_board_meta(boardname) + meta = self.get_board_meta(boardname, boardnum) num_of_pins = meta.get('PINS_PER_CONNECTOR') ptype = self.d[pin+"type"] From 6a3d0a434ebed19c41aecb3e6d09c712e1971b52 Mon Sep 17 00:00:00 2001 From: Dewey Garrett Date: Mon, 5 Jul 2021 14:16:24 -0700 Subject: [PATCH 19/85] check_config.tcl: warn multiple [section]name vals for JOINT_*,AXIS_* sections Example: Duplicating a [JOINT_n]MAX_LIMIT item may result in an error for limit violation. With this commit, a warning will precede the error to aid in isolating the ambiguous duplicated limit setting Ref: https://forum.linuxcnc.org/27-driver-boards/42972-y-axis-setup-trivkins-kinematics-error-with-max-limit#213689 --- lib/hallib/check_config.tcl | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/lib/hallib/check_config.tcl b/lib/hallib/check_config.tcl index ef51eade037..c33aa351f8a 100644 --- a/lib/hallib/check_config.tcl +++ b/lib/hallib/check_config.tcl @@ -136,6 +136,31 @@ proc validate_identity_kins_limits {} { } return $emsg } ;# validate_identity_kins_limits + +proc warn_for_multiple_ini_values {} { + set sections [info globals] + set sections_to_check {JOINT_ AXIS_} + + foreach section $sections { + set enforce 0 + foreach csection $sections_to_check { + if {[string first $csection $section"] >= 0} { + set enforce 1 + break + } + } + if !$enforce continue + foreach name [array names ::$section] { + set gsection ::$section + set val [set [set gsection]($name)] + set len [llength $val] + if {$len > 1} { + lappend ::wmsg "Unexpected multiple values \[$section\]$name: $val" + } + } + } +} ;# warn_for_multiple_ini_values + #---------------------------------------------------------------------- # begin package require Linuxcnc ;# parse_ini @@ -183,7 +208,7 @@ switch $::kins(module) { } } - +warn_for_multiple_ini_values #parray ::kins set emsg [validate_identity_kins_limits] consistent_coords_for_trivkins $::kins(coordinates) From 74a8ee39f2c19412ccf130c59d8597cb18bb518b Mon Sep 17 00:00:00 2001 From: andypugh Date: Fri, 9 Jul 2021 14:23:12 +0100 Subject: [PATCH 20/85] Docs: Latency-test, make text description match image --- docs/src/install/latency-test.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/src/install/latency-test.txt b/docs/src/install/latency-test.txt index d7962d98a73..af8f665474e 100644 --- a/docs/src/install/latency-test.txt +++ b/docs/src/install/latency-test.txt @@ -60,8 +60,8 @@ the latency test checks to see what the worst case numbers are. [NOTE] Do not run LinuxCNC or Stepconf while the latency test is running. -The important numbers are the 'max jitter'. -In the example above, that is 9075 nanoseconds, or 9.075 microseconds. +The important number for software stepping is the 'max jitter' of the base thread. +In the example above, that is 6693 nanoseconds, or 6.693 microseconds. Record this number, and enter it in Stepconf when it is requested. In the example above, latency-test only ran for a few seconds. From 2e7391e3b4882e35cab744c221f30d3aa67b3a4d Mon Sep 17 00:00:00 2001 From: andypugh Date: Tue, 13 Jul 2021 00:08:26 +0100 Subject: [PATCH 21/85] Docs: New ISO Signed-off-by: andypugh --- docs/src/getting-started/getting-linuxcnc-cn.txt | 10 +++++----- docs/src/getting-started/getting-linuxcnc.txt | 15 ++++++++------- docs/src/getting-started/getting-linuxcnc_es.txt | 12 ++++++------ 3 files changed, 19 insertions(+), 18 deletions(-) diff --git a/docs/src/getting-started/getting-linuxcnc-cn.txt b/docs/src/getting-started/getting-linuxcnc-cn.txt index ba2d3c12170..623e6292396 100755 --- a/docs/src/getting-started/getting-linuxcnc-cn.txt +++ b/docs/src/getting-started/getting-linuxcnc-cn.txt @@ -31,7 +31,7 @@ NOTE: LinuxCNC需要带额外实时功能的内核。 通过单击此处下载Live/安装CD: -http://www.linuxcnc.org/iso/linuxcnc-2.7.14-wheezy.iso +http://www.linuxcnc.org/iso/linuxcnc-2.8.2-buster.iso === 使用zsync下载 @@ -51,7 +51,7 @@ sudo apt-get install zsync . 然后运行以下命令将iso下载到您的电脑上 + ---- -zsync http://www.linuxcnc.org/iso/linuxcnc-2.8.0-buster.iso.zsync +http://www.linuxcnc.org/iso/linuxcnc-2.8.2-buster.iso ---- .Windows中的zsync @@ -68,13 +68,13 @@ https://www.assembla.com/spaces/zsync-windows/documents . 下载后,请验证镜像的校验和以确保完整性。 + ---- -md5sum linuxcnc-2.8.0-buster.iso +md5sum linuxcnc-2.8.2-buster.iso ---- + 或 + ---- -sha256sum linuxcnc-2.8.0-buster.iso +sha256sum linuxcnc-2.8.2-buster.iso ---- . 然后于以下校验和作比较 + @@ -101,7 +101,7 @@ LinuxCNC Live/安装镜像是一个混合ISO镜像,可以将其直接写入USB . 使用dd命令将镜像写入USB储存设备。例如,如果您的储存设备显示为/dev/sde,则使用以下命令: + ----- -dd if=linuxcnc-2.8.0-buster.iso of=/dev/sde +dd if=linuxcnc-2.8.2-buster.iso of=/dev/sde ----- .在Mac OS X中将镜像写入USB储存设备 diff --git a/docs/src/getting-started/getting-linuxcnc.txt b/docs/src/getting-started/getting-linuxcnc.txt index 041b3c4b7ee..4f1c5635137 100755 --- a/docs/src/getting-started/getting-linuxcnc.txt +++ b/docs/src/getting-started/getting-linuxcnc.txt @@ -39,11 +39,12 @@ Image. For x86 PCs Download the Live/Install CD by clicking here: -http://www.linuxcnc.org/iso/linuxcnc-2.8.0-buster.iso +http://www.linuxcnc.org/iso/linuxcnc-2.8.2-buster.iso For the Raspberry Pi a complete SD card image is available here: -http://www.linuxcnc.org/iso/linuxcnc-2.8.1-pi4.zip +http://www.linuxcnc.org/iso/linuxcnc-2.8.1-pi4.zip (this will auto-update +to 2.8.2 ) This can be installed using the normal Pi https://www.raspberrypi.org/documentation/installation/installing-images/README.md[install process] @@ -76,13 +77,13 @@ sudo apt-get install zsync . Then run this command to download the iso to your computer + ---- -zsync http://www.linuxcnc.org/iso/linuxcnc-2.8.0-buster.iso.zsync +http://www.linuxcnc.org/iso/linuxcnc-2.8.2-buster.iso ---- + or + ---- -zsync http://www.linuxcnc.org/iso/linuxcnc-2.8.0-pi4.zip.zsync +zsync http://www.linuxcnc.org/iso/linuxcnc-2.8.1-pi4.zip.zsync ---- .zsync in Windows @@ -99,13 +100,13 @@ https://www.assembla.com/spaces/zsync-windows/documents . After downloading, verify the checksum of the image to ensure integrity. + ---- -md5sum linuxcnc-2.8.0-buster.iso +md5sum linuxcnc-2.8.2-buster.iso ---- + or + ---- -sha256sum linuxcnc-2.8.0-buster.iso +sha256sum linuxcnc-2.8.2-buster.iso ---- . Then compare to these checksums + @@ -142,7 +143,7 @@ used to boot a computer. The image is too large to fit on a CD. then use this command: + ----- -dd if=linuxcnc-2.8.0-buster.iso of=/dev/sde +dd if=linuxcnc-2.8.2-buster.iso of=/dev/sde ----- .Writing the image to a USB storage device in Mac OSX diff --git a/docs/src/getting-started/getting-linuxcnc_es.txt b/docs/src/getting-started/getting-linuxcnc_es.txt index 20f0f8c9844..54901a35a5d 100644 --- a/docs/src/getting-started/getting-linuxcnc_es.txt +++ b/docs/src/getting-started/getting-linuxcnc_es.txt @@ -40,7 +40,7 @@ Esta sección describe algunos métodos para descargar una imagen Live/Install. Descargue el CD Live/Install desde esta dirección: -http://www.linuxcnc.org/iso/linuxcnc-2.8.0-buster.iso +http://www.linuxcnc.org/iso/linuxcnc-2.8.2-buster.iso Para la Raspberry Pi, una imagen completa de la tarjeta SD está disponible aquí: @@ -77,13 +77,13 @@ sudo apt-get install zsync . Luego, ejecute este comando para descargar el iso a su ordenador + ---- -zsync http://www.linuxcnc.org/iso/linuxcnc-2.8.0-buster.iso.zsync +zsync http://www.linuxcnc.org/iso/linuxcnc-2.8.2-buster.iso.zsync ---- + o + ---- -zsync http://www.linuxcnc.org/iso/linuxcnc-2.8.0-pi4.zip.zsync +zsync http://www.linuxcnc.org/iso/linuxcnc-2.8.1-pi4.zip.zsync ---- + .zsync en Windows @@ -100,13 +100,13 @@ https://www.assembla.com/spaces/zsync-windows/documents . Después de la descarga, verifique la suma de comprobación de la imagen para garantizar su integridad. + ---- -md5sum linuxcnc-2.8.0-buster.iso +md5sum linuxcnc-2.8.2-buster.iso ---- + o + ---- -sha256sum linuxcnc-2.8.0-buster.iso +sha256sum linuxcnc-2.8.2-buster.iso ---- . Luego, compare con la suma de comprobación segun su caso + @@ -139,7 +139,7 @@ un ordenador. La imagen es demasiado grande para caber en un CD. use este comando: + ----- -dd if=linuxcnc-2.8.0-buster.iso of=/dev/sde +dd if=linuxcnc-2.8.2-buster.iso of=/dev/sde ----- .Escribir la imagen en un dispositivo de almacenamiento USB en Mac OSX From 908d167679a7b29d69bd6f38c72a6c724a4acc94 Mon Sep 17 00:00:00 2001 From: Dewey Garrett Date: Sat, 17 Jul 2021 06:42:54 -0700 Subject: [PATCH 22/85] docs: specify a working keyserver Ref: #1209 https://github.com/LinuxCNC/linuxcnc/issues/1209 --- docs/src/getting-started/getting-linuxcnc-cn.txt | 8 ++++---- docs/src/getting-started/getting-linuxcnc.txt | 8 ++++---- docs/src/getting-started/getting-linuxcnc_es.txt | 8 ++++---- docs/src/plasma/plasmac-user-guide_es.txt | 4 ++-- 4 files changed, 14 insertions(+), 14 deletions(-) diff --git a/docs/src/getting-started/getting-linuxcnc-cn.txt b/docs/src/getting-started/getting-linuxcnc-cn.txt index 623e6292396..e7e583363f8 100755 --- a/docs/src/getting-started/getting-linuxcnc-cn.txt +++ b/docs/src/getting-started/getting-linuxcnc-cn.txt @@ -272,7 +272,7 @@ uname -v . 通过运行以下命令将LinuxCNC包签名密匙添加到APT密匙环 + ---- -sudo apt-key adv --keyserver hkp://keys.gnupg.net --recv-key 3cb9fd148f374fef +sudo apt-key adv --keyserver hkp://keys.openpgp.org --recv-key 3cb9fd148f374fef ---- . 添加APT储存库: @@ -304,7 +304,7 @@ WARNING: 这个内核有已知的稳定性问题。 当LinuxCNC已加载它似 . 将LinuxCNC包签名密匙添加到APT密匙环(如果在更换LinuxCNC Live-CD镜像的实时模式则不需要) + ---- -sudo apt-key adv --keyserver hkp://keys.gnupg.net --recv-key 3cb9fd148f374fef +sudo apt-key adv --keyserver hkp://keys.openpgp.org --recv-key 3cb9fd148f374fef ---- . 添加APT储存库: @@ -345,7 +345,7 @@ sudo apt-get install linuxcnc . 将LinuxCNC包签名密匙添加到APT密匙环 + ---- -sudo apt-key adv --keyserver hkp://keys.gnupg.net --recv-key 3cb9fd148f374fef +sudo apt-key adv --keyserver hkp://keys.openpgp.org --recv-key 3cb9fd148f374fef ---- . 添加 APT 储存库 : + @@ -388,7 +388,7 @@ sudo apt-get dist-upgrade . 通过运行以下命令将LinuxCNC包签名密匙添加到APT密匙环 + ---- -sudo apt-key adv --keyserver hkp://keys.gnupg.net --recv-key 3cb9fd148f374fef +sudo apt-key adv --keyserver hkp://keys.openpgp.org --recv-key 3cb9fd148f374fef ---- . 添加新的APT源 diff --git a/docs/src/getting-started/getting-linuxcnc.txt b/docs/src/getting-started/getting-linuxcnc.txt index 4f1c5635137..9ddc181e2a4 100755 --- a/docs/src/getting-started/getting-linuxcnc.txt +++ b/docs/src/getting-started/getting-linuxcnc.txt @@ -356,7 +356,7 @@ uname -v . Add the LinuxCNC Archive Signing Key to your apt keyring by running + ---- -sudo apt-key adv --keyserver hkp://keys.gnupg.net --recv-key 3cb9fd148f374fef +sudo apt-key adv --keyserver hkp://keys.openpgp.org --recv-key 3cb9fd148f374fef ---- . Add the apt repository: @@ -397,7 +397,7 @@ at system shut-down. necessary if switching the realtime mode of a LinuxCNC Live-CD image) + ---- -sudo apt-key adv --keyserver hkp://keys.gnupg.net --recv-key 3cb9fd148f374fef +sudo apt-key adv --keyserver hkp://keys.openpgp.org --recv-key 3cb9fd148f374fef ---- . Add the apt repository: @@ -435,7 +435,7 @@ sudo apt-get install linuxcnc . Add the LinuxCNC Archive Signing Key to your apt keyring + ---- -sudo apt-key adv --keyserver hkp://keys.gnupg.net --recv-key 3cb9fd148f374fef +sudo apt-key adv --keyserver hkp://keys.openpgp.org --recv-key 3cb9fd148f374fef ---- . Add the apt repository: + @@ -479,7 +479,7 @@ sudo apt-get dist-upgrade . Add the LinuxCNC Archive Signing Key to your apt keyring by running + ---- -sudo apt-key adv --keyserver hkp://keys.gnupg.net --recv-key 3cb9fd148f374fef +sudo apt-key adv --keyserver hkp://keys.openpgp.org --recv-key 3cb9fd148f374fef ---- . Add a new apt source diff --git a/docs/src/getting-started/getting-linuxcnc_es.txt b/docs/src/getting-started/getting-linuxcnc_es.txt index 54901a35a5d..64d97934a49 100644 --- a/docs/src/getting-started/getting-linuxcnc_es.txt +++ b/docs/src/getting-started/getting-linuxcnc_es.txt @@ -350,7 +350,7 @@ uname -v . Agregue la clave de firma de archivo LinuxCNC a su apt keyring ejecutando + ---- -sudo apt-key adv --keyserver hkp://keys.gnupg.net --recv-key 3cb9fd148f374fef +sudo apt-key adv --keyserver hkp://keys.openpgp.org --recv-key 3cb9fd148f374fef ---- . Añada el repositorio apt: @@ -384,7 +384,7 @@ en el apagado del sistema. necesario si se cambia el modo tiempo real de una imagen de Live-CD de LinuxCNC) + ---- -sudo apt-key adv --keyserver hkp://keys.gnupg.net --recv-key 3cb9fd148f374fef +sudo apt-key adv --keyserver hkp://keys.openpgp.org --recv-key 3cb9fd148f374fef ---- . Agregue el repositorio apt: @@ -422,7 +422,7 @@ sudo apt-get install linuxcnc . Agregue la clave de firma de archivo LinuxCNC a su apt keyring + ---- -sudo apt-key adv --keyserver hkp://keys.gnupg.net --recv-key 3cb9fd148f374fef +sudo apt-key adv --keyserver hkp://keys.openpgp.org --recv-key 3cb9fd148f374fef ---- . Agregue el repositorio de apt + @@ -464,7 +464,7 @@ sudo apt-get dist-upgrade . Agregue la clave de firma de archivo LinuxCNC a su apt keyring ejecutando + ---- -sudo apt-key adv --keyserver hkp://keys.gnupg.net --recv-key 3cb9fd148f374fef +sudo apt-key adv --keyserver hkp://keys.openpgp.org --recv-key 3cb9fd148f374fef ---- . Agregue una nueva fuente apt diff --git a/docs/src/plasma/plasmac-user-guide_es.txt b/docs/src/plasma/plasmac-user-guide_es.txt index d2b708de23e..b7a254dc632 100644 --- a/docs/src/plasma/plasmac-user-guide_es.txt +++ b/docs/src/plasma/plasmac-user-guide_es.txt @@ -143,7 +143,7 @@ Para obtener más información sobre una instalación Run In Place, consulte lin Para usar los paquetes buildbot en su computadora, primero agregue la clave de firma del archivo buildbot a su keychain apt ejecutando este comando desde una terminal: ---- -sudo apt-key adv --keyserver hkp://keys.gnupg.net --recv-key E0EE663E +sudo apt-key adv --keyserver hkp://keys.openpgp.org --recv-key E0EE663E ---- Si obtiene un error como GPG: la recepción del servidor de claves falló: No dirmngr @@ -160,7 +160,7 @@ Si aún recibe un error al descargar la clave, puede deberse a estar detrás de caso, puede intentar especificar el puerto 80 en lugar de usar el valor predeterminado 11371: ---- -sudo apt-key adv --keyserver hkp://keys.gnupg.net: 80 --recv-key E0EE663E +sudo apt-key adv --keyserver hkp://keys.openpgp.org: 80 --recv-key E0EE663E ---- Cierre la terminal y, desde el Menú principal, abra el Administrador de paquetes Synaptic. From acab27a90c0ae04ccc6eb523ea0d8dd1f77ab857 Mon Sep 17 00:00:00 2001 From: andypugh Date: Fri, 30 Jul 2021 12:57:31 +0100 Subject: [PATCH 23/85] Docs: Typo in sendkeys manpage --- docs/src/man/man1/sendkeys.1.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/src/man/man1/sendkeys.1.txt b/docs/src/man/man1/sendkeys.1.txt index 17bb295b393..c4f9420fcc1 100644 --- a/docs/src/man/man1/sendkeys.1.txt +++ b/docs/src/man/man1/sendkeys.1.txt @@ -33,7 +33,7 @@ which is not available by default. To give access: Create the uinput group and add the LinuxCNC user to it: - sudo groupdadd -f uinput + sudo groupadd -f uinput sudo gpasswd -a username uinput Create a new entry in .B/etc/udev/rules.d/99-input.rules From 3c61dfc263bcd2e8a9a31d390d36cdc1c9f179be Mon Sep 17 00:00:00 2001 From: john Date: Sat, 31 Jul 2021 07:23:56 -0500 Subject: [PATCH 24/85] Docs add axis lathe info and images --- docs/src/gui/axis.txt | 10 ++++++++-- docs/src/gui/images/axis-back-tool-lathe.png | Bin 0 -> 80504 bytes docs/src/gui/images/axis-lathe.png | Bin 0 -> 80519 bytes 3 files changed, 8 insertions(+), 2 deletions(-) create mode 100644 docs/src/gui/images/axis-back-tool-lathe.png create mode 100644 docs/src/gui/images/axis-lathe.png diff --git a/docs/src/gui/axis.txt b/docs/src/gui/axis.txt index d3664f64bad..3304f9892bf 100644 --- a/docs/src/gui/axis.txt +++ b/docs/src/gui/axis.txt @@ -823,14 +823,20 @@ the bottom of the screen, and several controls (such as those for preset views) are removed. The coordinate readouts for X are replaced with diameter and radius. +image::images/axis-lathe.png[align="center", alt="Back Tool Lathe"] + Pressing 'V' zooms out to show the entire file, if one is loaded. When in lathe mode, the shape of the loaded tool (if any) is shown. -.Lathe Tool Shape - image::images/axis-lathe-tool.png[align="center", alt="Lathe Tool Shape"] +To change the display to a back tool lathe you need to have both 'LATHE = 1' +and 'BACK_TOOL_LATHE = 1' in the [DISPLAY] section. This will invert the view +and put the tool on the back side of the Z axis. + +image::images/axis-back-tool-lathe.png[align="center", alt="Back Tool Lathe"] + == Using AXIS in Foam Cutting mode By including the line 'FOAM = 1' diff --git a/docs/src/gui/images/axis-back-tool-lathe.png b/docs/src/gui/images/axis-back-tool-lathe.png new file mode 100644 index 0000000000000000000000000000000000000000..3638de91f748d31993d223fdbd7d3bab977cda7b GIT binary patch literal 80504 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ⅆ0v=BX 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 literal 0 HcmV?d00001 diff --git a/docs/src/gui/images/axis-lathe.png b/docs/src/gui/images/axis-lathe.png new file mode 100644 index 0000000000000000000000000000000000000000..a7476401e9517c74bc77d48ae66ff8cdd54b25de GIT binary patch literal 80519 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 Date: Sat, 14 Aug 2021 15:26:14 -0600 Subject: [PATCH 25/85] docs: fix some minor glitches in INI config docs. Fixing broken asciidoc syntax, & prettier words. --- docs/src/config/ini-config.txt | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/docs/src/config/ini-config.txt b/docs/src/config/ini-config.txt index 98d8eb8a83d..63d3ffec272 100644 --- a/docs/src/config/ini-config.txt +++ b/docs/src/config/ini-config.txt @@ -583,13 +583,13 @@ time (typ: 'USER_DEFINED_FUNCTION_MAX_DIRS == 5'). * 'INI_VARS = 1' Default 1 Allows G-code programs to read values from the INI file using the format -#<_ini[section]name>. See < +#<_ini[section]name>. See <>. * 'HAL_PIN_VARS = 1' Default 1 Allows G-code programs to read the values of HAL pins using the format -#<_hal[Hal item]> Variable access is read-only +#<_hal[Hal item]>. Variable access is read-only. See <> for more details and an -important caveat +important caveat. * 'RETAIN_G43 = 0' Default 0 When set, you can turn on G43 after loading the first tool, @@ -1590,9 +1590,9 @@ image::images/encoder-scale.png[align="center"] * 'TOOL_CHANGE_AT_G30 = 1' - The machine is moved to reference point defined by parameters - 5181-5186 for G30 if the value is 1. For more information see the - <>. + 5181-5186 for G30 if the value is 1. For more information see + <> and + <>. * 'RANDOM_TOOLCHANGER = 1' - This is for machines that cannot place the tool back into the pocket From 2a28f188ea3486e1e57ad2c0ebaa48756328610d Mon Sep 17 00:00:00 2001 From: andypugh Date: Mon, 16 Aug 2021 22:35:35 +0100 Subject: [PATCH 26/85] Fix MD5 / SHA256 sums --- docs/src/getting-started/getting-linuxcnc.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/src/getting-started/getting-linuxcnc.txt b/docs/src/getting-started/getting-linuxcnc.txt index 9ddc181e2a4..962423af5df 100755 --- a/docs/src/getting-started/getting-linuxcnc.txt +++ b/docs/src/getting-started/getting-linuxcnc.txt @@ -111,8 +111,8 @@ sha256sum linuxcnc-2.8.2-buster.iso . Then compare to these checksums + ----- -md5sum: 41b71c4956c0c89033a99a590ebaefec -sha256sum: a542092aa9f399d3ad50bbb2f0f4dd63ad9332c23d8387f6061bdd186d1df3b0 +md5sum: 4496eae88a1d66f457205d0d5b69c3c2 +sha256sum: 94a6dc7ef12fbdc0bafd9259ce36797a8b3410ad22e73c4ab57b8e937a924e1a ----- .Verify md5sum on Windows or Mac From 85436a81d388cb21f935f6a36744425d06b08d76 Mon Sep 17 00:00:00 2001 From: andypugh Date: Mon, 16 Aug 2021 22:38:44 +0100 Subject: [PATCH 27/85] Update getting-linuxcnc-cn.txt --- docs/src/getting-started/getting-linuxcnc-cn.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/src/getting-started/getting-linuxcnc-cn.txt b/docs/src/getting-started/getting-linuxcnc-cn.txt index e7e583363f8..3d9172739a4 100755 --- a/docs/src/getting-started/getting-linuxcnc-cn.txt +++ b/docs/src/getting-started/getting-linuxcnc-cn.txt @@ -79,8 +79,8 @@ sha256sum linuxcnc-2.8.2-buster.iso . 然后于以下校验和作比较 + ----- -md5sum: 41b71c4956c0c89033a99a590ebaefec -sha256sum: a542092aa9f399d3ad50bbb2f0f4dd63ad9332c23d8387f6061bdd186d1df3b0 +md5sum: 4496eae88a1d66f457205d0d5b69c3c2 +sha256sum: 94a6dc7ef12fbdc0bafd9259ce36797a8b3410ad22e73c4ab57b8e937a924e1a ----- .在Windows或Mac上验证md5sum From 06cff4c97bd17527b925d801d2906d6b4048b2dc Mon Sep 17 00:00:00 2001 From: andypugh Date: Mon, 16 Aug 2021 22:39:30 +0100 Subject: [PATCH 28/85] Update getting-linuxcnc_es.txt --- docs/src/getting-started/getting-linuxcnc_es.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/src/getting-started/getting-linuxcnc_es.txt b/docs/src/getting-started/getting-linuxcnc_es.txt index 64d97934a49..525fb9dcd34 100644 --- a/docs/src/getting-started/getting-linuxcnc_es.txt +++ b/docs/src/getting-started/getting-linuxcnc_es.txt @@ -111,8 +111,8 @@ sha256sum linuxcnc-2.8.2-buster.iso . Luego, compare con la suma de comprobación segun su caso + ----- -md5sum: 41b71c4956c0c89033a99a590ebaefec -sha256sum: a542092aa9f399d3ad50bbb2f0f4dd63ad9332c23d8387f6061bdd186d1df3b0 +md5sum: 4496eae88a1d66f457205d0d5b69c3c2 +sha256sum: 94a6dc7ef12fbdc0bafd9259ce36797a8b3410ad22e73c4ab57b8e937a924e1a ----- ==== Verificar md5sum en Windows o Mac From f8a0faf402fcdd1ac28a167a40cf5d743dffb236 Mon Sep 17 00:00:00 2001 From: andypugh Date: Mon, 16 Aug 2021 23:00:53 +0100 Subject: [PATCH 29/85] Docs: Update RTAI install instructions. Signed-off-by: andypugh --- docs/src/getting-started/getting-linuxcnc.txt | 21 +++++++------------ 1 file changed, 7 insertions(+), 14 deletions(-) diff --git a/docs/src/getting-started/getting-linuxcnc.txt b/docs/src/getting-started/getting-linuxcnc.txt index 962423af5df..f2d8c939b35 100755 --- a/docs/src/getting-started/getting-linuxcnc.txt +++ b/docs/src/getting-started/getting-linuxcnc.txt @@ -362,7 +362,8 @@ sudo apt-key adv --keyserver hkp://keys.openpgp.org --recv-key 3cb9fd148f374fef . Add the apt repository: + ---- - echo deb http://linuxcnc.org/ buster base 2.8-rtpreempt | sudo tee -a /etc/apt/sources.list.d/linuxcnc.list + echo deb http://linuxcnc.org/ buster base 2.8-rtpreempt | sudo tee /etc/apt/sources.list.d/linuxcnc.list + echo deb-src http://linuxcnc.org/ buster base 2.8-rtpreempt | sudo tee -a /etc/apt/sources.list.d/linuxcnc.list ---- . Update the package list from linuxcnc.org @@ -403,7 +404,8 @@ sudo apt-key adv --keyserver hkp://keys.openpgp.org --recv-key 3cb9fd148f374fef . Add the apt repository: + ---- - echo deb http://linuxcnc.org/ buster base 2.8-rt | sudo tee -a /etc/apt/sources.list.d/linuxcnc.list + echo deb http://linuxcnc.org/ buster base 2.8-rt | sudo tee /etc/apt/sources.list.d/linuxcnc.list + echo deb-src http://linuxcnc.org/ buster base 2.8-rt | sudo tee /etc/apt/sources.list.d/linuxcnc.list ---- . Update the package list from linuxcnc.org @@ -411,21 +413,12 @@ sudo apt-key adv --keyserver hkp://keys.openpgp.org --recv-key 3cb9fd148f374fef ---- sudo apt-get update ---- -. Install the RTAI kernel -+ ----- -sudo apt-get install linux-image-4.19.195-rtai-amd64 ----- -. Install the RTAI application layer -+ ----- -sudo apt-get install rtai-modules-4.19.195 ----- -. Install linuxcnc (a reboot may be required prior to installing) +. Install the new realtime kernel, RTAI and the rtai version of linuxcnc + ---- sudo apt-get install linuxcnc ---- +Reboot the machine, ensuring that the system boots from the new 4.19.195-rtai kernel. === Installing on Raspbian 10 @@ -440,7 +433,7 @@ sudo apt-key adv --keyserver hkp://keys.openpgp.org --recv-key 3cb9fd148f374fef . Add the apt repository: + ----- - echo deb http://linuxcnc.org/ buster base 2.8-rtpreempt | sudo tee -a /etc/apt/sources.list.d/linuxcnc.list + echo deb http://linuxcnc.org/ buster base 2.8-rtpreempt | sudo tee /etc/apt/sources.list.d/linuxcnc.list ----- . Update the package list from linuxcnc.org + From cdd14572a935d95cda935b4bfefde174bb9e7136 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A5vard=20Flaget=20Aasen?= Date: Mon, 16 Aug 2021 22:28:00 +0200 Subject: [PATCH 30/85] Update man-pages for latency-* scripts. Create content for man-page latency-histogram and latency-plot. The man-pages consist of information found in '--help' option in the actual script, and documentation found in 'docs/' path in LinuxCNC repository. --- docs/man/man1/latency-histogram.1 | 95 +++++++++++++++++++++++++------ docs/man/man1/latency-plot.1 | 65 +++++++++++++++------ 2 files changed, 127 insertions(+), 33 deletions(-) diff --git a/docs/man/man1/latency-histogram.1 b/docs/man/man1/latency-histogram.1 index d1b7cc7d194..1674c965ff1 100644 --- a/docs/man/man1/latency-histogram.1 +++ b/docs/man/man1/latency-histogram.1 @@ -22,36 +22,99 @@ .\" .\" .\" -.TH LATENCY-HISTOGRAM "1" "2020-08-26" "LinuxCNC Documentation" "The Enhanced Machine Controller" +.TH LATENCY-HISTOGRAM "1" "2021-08-14" "LinuxCNC Documentation" "The Enhanced Machine Controller" .SH NAME latency-histogram \- plot a histogram of machine latency .SH SYNOPSIS .B latency-histogram - +.RB [ \-?|\-\-help ] +.RB [ \-\-base " " \fInS\fP ] +.RB [ \-\-servo " " \fInS\fP ] +.RB [ \-\-bbinsize " " \fInS\fP ] +.RB [ \-\-sbinsize " " \fInS\fP ] +.RB [ \-\-bbins " " \fInS\fP ] +.RB [ \-\-sbins " " \fInS\fP ] +.RB [ \-\-logscale " " \fI0|1\fP ] +.RB [ \-\-text " " \fInote\fP ] +.RB [ \-\-show ] +.RB [ \-\-nobase ] +.RB [ \-\-verbose ] +.RB [ \-\-nox ] .SH DESCRIPTION -The latency test is important when configuring a LinuxCNC system. +The latency test is important when configuring a LinuxCNC system. An adjunct to the standard latency-test latency-histogram plots the distribution of latency. This can be useful to get a feel for how frequent -the high latency excursions are. - +the high latency excursions are. +.PP +LinuxCNC and Hal should not be running, stop with +.IR "halrun \-U" . +Large number of bins and/or small binsizes will slow updates. +For single thread, specify +.B \-\-nobase +(and options for servo thread). +Measured latencies outside of the +/\- bin range are reported +with special end bars. Use +.B \-\-show +to show count for +the off-chart [pos|neg] bin +.PP More details: -.nf http://linuxcnc.org/docs/html/install/latency-test.html - +\%https://linuxcnc.org/docs/html/install/latency-test.html +.SH OPTIONS +.TP +.BR \-? ", " \-\-help +Show options and exit. +.TP +.BI \-\-base " nS" +base thread interval, default: 25000, min: 5000 +.TP +.BI \-\-servo " nS" +servo thread interval, default: 1000000, min: 25000 +.TP +.BI \-\-bbinsize " nS" +base bin size, default: 100 +.TP +.BI \-\-sbinsize " nS" +servo bin size, default: 100 +.TP +.BI \-\-bbins " nS" +base bins, default: 200 +.TP +.BI \-\-sbins " nS" +servo bins, default: 200 +.TP +.BI \-\-logscale " 0|1" +y axis log scale, default: 1 +.TP +.BI \-\-text " note" +additional note, default: "" +.TP +.BI \-\-show +show count of undisplayed bins +.TP +.BI \-\-nobase +servo thread only +.TP +.BI \-\-verbose +progress and debug +.TP +.BI \-\-nox +no gui, display elapsed,min,max,sdev for each thread .SH "SEE ALSO" -\fBLinuxCNC(1)\fR - +.BR latency-plot (1), +.BR latency-test (1), +.BR linuxcnc (1) +.PP Much more information about LinuxCNC and HAL is available in the LinuxCNC -and HAL User Manuals, found at /usr/share/doc/LinuxCNC/. - -.SH HISTORY - +and HAL User Manuals, found at +.IR /usr/share/doc/linuxcnc/ . .SH BUGS -None known at this time. -.PP +None known at this time. .SH AUTHOR This man page written by andypugh, as part of the LinuxCNC project. .SH REPORTING BUGS -Report bugs at https://github.com/LinuxCNC/linuxcnc/issues +Report bugs at +\%https://github.com/LinuxCNC/linuxcnc/issues .SH COPYRIGHT Copyright \(co 2020 andypugh. .br diff --git a/docs/man/man1/latency-plot.1 b/docs/man/man1/latency-plot.1 index 04886e5149c..14b3e56c1aa 100644 --- a/docs/man/man1/latency-plot.1 +++ b/docs/man/man1/latency-plot.1 @@ -22,34 +22,65 @@ .\" .\" .\" -.TH LATENCY-PLOT "1" "2020-08-26" "LinuxCNC Documentation" "The Enhanced Machine Controller" +.TH LATENCY-PLOT "1" "2021-08-14" "LinuxCNC Documentation" "The Enhanced Machine Controller" .SH NAME latency-plot \- another way to view latency numbers .SH SYNOPSIS .B latency-plot - +.RB [ \-?|\-\-help ] +.RB [ \-H|\-\-hal ] +.RB [ \-b|\-\-base " " \fInS\fP ] +.RB [ \-s|\-\-servo " " \fInS\fP ] +.RB [ \-t|\-\-time " " \fImS\fP ] +.RB [ \-\-relative ] +.RB [ \-\-actual ] .SH DESCRIPTION -\fBlatency-plot\fR plots realtime system latency. -Mainly superseded by latency-histogram - -http://linuxcnc.org/docs/html/install/latency-test.html - +.B latency-plot +makes a strip chart recording for a base and a servo thread. It may be useful +to see spikes in latency when other applications are started or used. +Mainly superseded by latency-histogram. +.PP +LinuxCNC and Hal should not be running, stop with +.IR "halrun \-U" . +.PP +More details: +\%https://linuxcnc.org/docs/html/install/latency-test.html +.SH OPTIONS +.TP +.BR \-? ", " \-\-help +Show options and exit. +.TP +.BR \-H ", " \-\-hal +.TP +.BR \-b ", " \-\-base " " \fInS\fP +base thread interval, default: 25000 +.TP +.BR \-s ", " \-\-servo " " \fInS\fP +servo thread interval, default: 1000000 +.TP +.BR \-t ", " \-\-time " " \fImS\fP +report interval, default: 1000, min: 100, max: 10000 +.TP +.B \-\-relative +relative clock time (default) +.TP +.B \-\-actual +actual clock time .SH "SEE ALSO" -\fBlatency-histogram(1)\fR -\fBLinuxCNC(1)\fR - +.BR latency-histogram (1), +.BR latency-test (1), +.BR linuxcnc (1) +.PP Much more information about LinuxCNC and HAL is available in the LinuxCNC -and HAL User Manuals, found at /usr/share/doc/LinuxCNC/. - -.SH HISTORY - +and HAL User Manuals, found at +.IR /usr/share/doc/linuxcnc/ . .SH BUGS -None known at this time. -.PP +None known at this time. .SH AUTHOR This man page written by andypugh, as part of the LinuxCNC project. .SH REPORTING BUGS -Report bugs at https://github.com/LinuxCNC/linuxcnc/issues +Report bugs at +\%https://github.com/LinuxCNC/linuxcnc/issues .SH COPYRIGHT Copyright \(co 2020 andypugh. .br From c95c6f440d20507bfdd25638618fb6d8d2fb7294 Mon Sep 17 00:00:00 2001 From: Chris Morley Date: Thu, 19 Aug 2021 18:09:16 -0700 Subject: [PATCH 31/85] pncconf -fix error with encoder name in tune test --- src/emc/usr_intf/pncconf/tests.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/emc/usr_intf/pncconf/tests.py b/src/emc/usr_intf/pncconf/tests.py index a84dbfaac96..fc2782ca026 100644 --- a/src/emc/usr_intf/pncconf/tests.py +++ b/src/emc/usr_intf/pncconf/tests.py @@ -865,7 +865,7 @@ def update_tune_test_params(self, *args): setp %(encoder)s.scale %(enc_scale)d """ % { 'encoder':self.enc_signalname, - ' enc_scale':self.enc_scale, + 'enc_scale':self.enc_scale, }) halrun.flush() From d048960c941f2206489042536707cccc9efa64a4 Mon Sep 17 00:00:00 2001 From: Chris Morley Date: Fri, 20 Aug 2021 18:01:28 -0700 Subject: [PATCH 32/85] qtvcp -detect machine units from joints rather the axis Now that joints are separate, only joints have units info. --- lib/python/qtvcp/qt_istat.py | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/lib/python/qtvcp/qt_istat.py b/lib/python/qtvcp/qt_istat.py index 82fb398ffaf..9d0f47fc8f5 100644 --- a/lib/python/qtvcp/qt_istat.py +++ b/lib/python/qtvcp/qt_istat.py @@ -99,10 +99,16 @@ def update(self): # first check the global settings units=self.INI.find("TRAJ","LINEAR_UNITS") if units==None: - # else then the X axis units - units=self.INI.find("AXIS_0","UNITS") + log.critical('Misssing LINEAR_UNITS in TRAJ, guessing units for machine from JOINT 0') + # else then guess; The joint 0 is usually X axis + units=self.INI.find("JOINT_0","UNITS") + if units==None: + log.critical('Misssing UNITS in JOINT_0, assuming metric based machine') + units = 'metric' except: - units = "inch" + units = "metric" + finally: + units = units.lower() # set up the conversion arrays based on what units we discovered if units=="mm" or units=="metric" or units == "1.0": self.MACHINE_IS_METRIC = True From da89022b89fe1d493f7a38fde4003786d6e475bd Mon Sep 17 00:00:00 2001 From: Chris Morley Date: Fri, 20 Aug 2021 18:03:19 -0700 Subject: [PATCH 33/85] qtvcp -status slider: add a HAL pin for current value useful for example, getting jog rate for external controls --- lib/python/qtvcp/widgets/status_slider.py | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/lib/python/qtvcp/widgets/status_slider.py b/lib/python/qtvcp/widgets/status_slider.py index d04006af7cf..d27a944a37d 100644 --- a/lib/python/qtvcp/widgets/status_slider.py +++ b/lib/python/qtvcp/widgets/status_slider.py @@ -15,6 +15,8 @@ # ################################################################################# +import hal + from PyQt5 import QtWidgets from PyQt5.QtCore import pyqtProperty from qtvcp.widgets.widget_baseclass import _HalWidgetBase @@ -39,6 +41,7 @@ class StatusSlider(QtWidgets.QSlider, _HalWidgetBase): def __init__(self, parent=None): super(StatusSlider, self).__init__(parent) self._block_signal = False + self._halpin_option = True self.rapid = True self.feed = False self.spindle = False @@ -69,11 +72,21 @@ def _hal_init(self): self.setMaximum(int(INFO.MAX_TRAJ_VELOCITY)) else: LOG.error('{} : no option recognised'.format(self.HAL_NAME_)) + if self._halpin_option: + self.hal_pin = self.HAL_GCOMP_.newpin(str(self.HAL_NAME_), hal.HAL_FLOAT, hal.HAL_OUT) # connect a signal and callback function to the button self.valueChanged.connect(self._action) + # catch any programmed settings and update HAL pin + def setValue(self, v): + super(StatusSlider, self).setValue(v) + if self._halpin_option: + self.hal_pin.set(v) + def _action(self, value): + if self._halpin_option: + self.hal_pin.set(value) if self.rapid: ACTION.SET_RAPID_RATE(value) elif self.feed: @@ -159,6 +172,14 @@ def getmax_velocity(self): def resetmax_velocity(self): self.max_velocity = False + def set_halpin_option(self, value): + self._halpin_option = value + def get_halpin_option(self): + return self._halpin_option + def reset_halpin_option(self): + self._halpin_option = True + + halpin_option = pyqtProperty(bool, get_halpin_option, set_halpin_option, reset_halpin_option) rapid_rate = pyqtProperty(bool, getrapid, setrapid, resetrapid) feed_rate = pyqtProperty(bool, getfeed, setfeed, resetfeed) spindle_rate = pyqtProperty(bool, getspindle, setspindle, resetspindle) From eb4de6f2d9296bd8411de8988545bfb72790c90c Mon Sep 17 00:00:00 2001 From: Phillip Carter Date: Mon, 23 Aug 2021 17:03:56 +1000 Subject: [PATCH 34/85] pncconf: fix miscellaneous signals for tandem joints --- src/emc/usr_intf/pncconf/build_HAL.py | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/src/emc/usr_intf/pncconf/build_HAL.py b/src/emc/usr_intf/pncconf/build_HAL.py index ea508a88014..11d6d383c98 100644 --- a/src/emc/usr_intf/pncconf/build_HAL.py +++ b/src/emc/usr_intf/pncconf/build_HAL.py @@ -365,37 +365,45 @@ def writebackup(origname): print 'error in number of axis identity: ', self.d.axes return jnum = 0 + coords = ['x'] # Always add X axis self.connect_joint(file, jnum, 'x') tandemjoint = self.a.tandem_check('x') if tandemjoint: jnum += 1 + coords.append('x2') self.connect_joint(file, jnum, 'x2') # Maybe add Y Axis ################### if self.d.axes in(0,1): jnum += 1 + coords.append('y') self.connect_joint(file, jnum, 'y') tandemjoint = self.a.tandem_check('y') if tandemjoint: jnum += 1 + coords.append('y2') self.connect_joint(file, jnum, 'y2') # Always add Z Axis ################## jnum += 1 + coords.append('z') self.connect_joint(file, jnum, 'z') tandemjoint = self.a.tandem_check('z') if tandemjoint: jnum += 1 + coords.append('z2') self.connect_joint(file, jnum, 'z2') # Maybe add A axis ################### if self.d.axes == 1: jnum += 1 + coords.append('a') self.connect_joint(file, jnum, 'a') tandemjoint = self.a.tandem_check('a') if tandemjoint: jnum += 1 + coords.append('a2') self.connect_joint(file, jnum, 'a2') # usually add Spindle ################## @@ -410,20 +418,19 @@ def writebackup(origname): print >>file, _("# ---HALUI signals---") print >>file - jnum = 0 - for axletter in axis_convert: - if axletter in self.d.available_axes: - # support for KINEMATICS_IDENTITY kins only + for axletter in coords: + if len(axletter) == 1: + # support for KINEMATICS_IDENTITY kins only # Assumption: gui uses halui teleop jogging for KINEMATICS_IDENTITY configs # (axis gui does this for joints_axes) print >>file, "net axis-select-%s halui.axis.%s.select"% (axletter,axletter) print >>file, "net jog-%s-pos halui.axis.%s.plus"% (axletter,axletter) print >>file, "net jog-%s-neg halui.axis.%s.minus"% (axletter,axletter) print >>file, "net jog-%s-analog halui.axis.%s.analog"% (axletter,axletter) - # joints only items (no corresponding axis item): - print >>file, "net %s-is-homed halui.joint.%d.is-homed"% (axletter,jnum) - jnum = jnum + 1 # expect joints in sequence (like trivkins) + print >>file, "net %s-is-homed halui.joint.%d.is-homed"% (axletter,coords.index(axletter)) + else: + print >>file, "net %s-is-homed halui.joint.%d.is-homed"% (axletter,coords.index(axletter)) print >>file, "net jog-selected-pos halui.axis.selected.plus" print >>file, "net jog-selected-neg halui.axis.selected.minus" From a0a1c237b923c84f5ed7e4b0d3d294bc7d3afc25 Mon Sep 17 00:00:00 2001 From: John Date: Tue, 24 Aug 2021 07:01:29 -0500 Subject: [PATCH 35/85] remove my name from hal components I didn't work on Signed-off-by: John --- docs/man/es/man1/mb2hal.1 | 4 +--- docs/man/es/man1/vfdb_vfd.1 | 2 +- docs/man/es/man1/vfs11_vfd.1 | 2 -- docs/man/man1/vfdb_vfd.1 | 2 +- docs/man/man1/vfs11_vfd.1 | 2 -- src/hal/user_comps/vfdb_vfd/vfdb_vfd.c | 1 - 6 files changed, 3 insertions(+), 10 deletions(-) diff --git a/docs/man/es/man1/mb2hal.1 b/docs/man/es/man1/mb2hal.1 index 5e86be0aade..6442be9b922 100644 --- a/docs/man/es/man1/mb2hal.1 +++ b/docs/man/es/man1/mb2hal.1 @@ -1,5 +1,3 @@ -.\" Copyright (c) 2016 John Thornton -.\" .\" This is free documentation; you can redistribute it and/or .\" modify it under the terms of the GNU General Public License as .\" published by the Free Software Foundation; either version 2 of @@ -35,6 +33,6 @@ Modbus devices. .PP See the Documents for more information on mb2hal .SH AUTHOR -John Thornton +Victor Rocco .SH LICENSE GPL diff --git a/docs/man/es/man1/vfdb_vfd.1 b/docs/man/es/man1/vfdb_vfd.1 index 207dd905c39..bd976332c01 100644 --- a/docs/man/es/man1/vfdb_vfd.1 +++ b/docs/man/es/man1/vfdb_vfd.1 @@ -1,5 +1,5 @@ .\" Copyright (c) 2013 Sebastian Kuzminsky -.\" derived from the vfs11_vfd manpage by Michael Haberler and John Thornton +.\" derived from the vfs11_vfd manpage by Michael Haberler .\" .\" This is free documentation; you can redistribute it and/or .\" modify it under the terms of the GNU General Public License as diff --git a/docs/man/es/man1/vfs11_vfd.1 b/docs/man/es/man1/vfs11_vfd.1 index e90ddc055a8..b31a5bc9a99 100644 --- a/docs/man/es/man1/vfs11_vfd.1 +++ b/docs/man/es/man1/vfs11_vfd.1 @@ -1,6 +1,4 @@ .\" Copyright (c) 2009 Michael Haberler -.\" Copyright (c) 2009 John Thornton -.\" (jet1024 AT semo DOT net) .\" .\" This is free documentation; you can redistribute it and/or .\" modify it under the terms of the GNU General Public License as diff --git a/docs/man/man1/vfdb_vfd.1 b/docs/man/man1/vfdb_vfd.1 index 24db4c5a01c..78e9eff07eb 100644 --- a/docs/man/man1/vfdb_vfd.1 +++ b/docs/man/man1/vfdb_vfd.1 @@ -1,5 +1,5 @@ .\" Copyright (c) 2013 Sebastian Kuzminsky -.\" derived from the vfs11_vfd manpage by Michael Haberler and John Thornton +.\" derived from the vfs11_vfd manpage by Michael Haberler .\" .\" This is free documentation; you can redistribute it and/or .\" modify it under the terms of the GNU General Public License as diff --git a/docs/man/man1/vfs11_vfd.1 b/docs/man/man1/vfs11_vfd.1 index cf38cd6f763..660ef2e2f81 100644 --- a/docs/man/man1/vfs11_vfd.1 +++ b/docs/man/man1/vfs11_vfd.1 @@ -1,6 +1,4 @@ .\" Copyright (c) 2009 Michael Haberler -.\" Copyright (c) 2009 John Thornton -.\" (jet1024 AT semo DOT net) .\" .\" This is free documentation; you can redistribute it and/or .\" modify it under the terms of the GNU General Public License as diff --git a/src/hal/user_comps/vfdb_vfd/vfdb_vfd.c b/src/hal/user_comps/vfdb_vfd/vfdb_vfd.c index 733372a2f32..3bb264054d1 100644 --- a/src/hal/user_comps/vfdb_vfd/vfdb_vfd.c +++ b/src/hal/user_comps/vfdb_vfd/vfdb_vfd.c @@ -6,7 +6,6 @@ Yishin Li, adapted from Michael Haberler's vfs11_vfd/. Copyright (C) 2007, 2008 Stephen Wille Padnos, Thoth Systems, Inc. - Copyright (C) 2009 John Thornton Copyright (C) 2009,2010,2011,2012 Michael Haberler Copyright (C) 2013 Yishin Li Copyright (C) 2013 Sebastian Kuzminsky From 9dd7565034fb711e4ea73134b264a8de01c3e554 Mon Sep 17 00:00:00 2001 From: andypugh Date: Fri, 3 Sep 2021 18:12:04 +0100 Subject: [PATCH 36/85] docs: Fix error in RTAI install instructions --- docs/src/getting-started/getting-linuxcnc.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/src/getting-started/getting-linuxcnc.txt b/docs/src/getting-started/getting-linuxcnc.txt index f2d8c939b35..dfd7f22cbde 100755 --- a/docs/src/getting-started/getting-linuxcnc.txt +++ b/docs/src/getting-started/getting-linuxcnc.txt @@ -405,7 +405,7 @@ sudo apt-key adv --keyserver hkp://keys.openpgp.org --recv-key 3cb9fd148f374fef + ---- echo deb http://linuxcnc.org/ buster base 2.8-rt | sudo tee /etc/apt/sources.list.d/linuxcnc.list - echo deb-src http://linuxcnc.org/ buster base 2.8-rt | sudo tee /etc/apt/sources.list.d/linuxcnc.list + echo deb-src http://linuxcnc.org/ buster base 2.8-rt | sudo tee -a /etc/apt/sources.list.d/linuxcnc.list ---- . Update the package list from linuxcnc.org From 2c24928afd9f0cac3eb6f7581dfcce0355aae7d1 Mon Sep 17 00:00:00 2001 From: Dewey Garrett Date: Sun, 5 Sep 2021 10:05:53 -0700 Subject: [PATCH 37/85] pyngcgui.py bugfix for expanding nested indents --- lib/python/pyngcgui.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/python/pyngcgui.py b/lib/python/pyngcgui.py index 82eaed040bd..e8623b3344a 100644 --- a/lib/python/pyngcgui.py +++ b/lib/python/pyngcgui.py @@ -3348,7 +3348,7 @@ def __init__(self,mypg,pre_info,sub_info,pst_info,force_expand=False): if modlabel == 'ignoreme': continue modlabel = 'o<%03d%s>' % (g_label_id,modlabel) - r = re.search(r'^o<(.*?)>(.*)',line) + r = re.search(r'^o<(.*?)>(.*)',line.strip()) if r: modline = r.group(2) + '\n' else: From 4c6437f40c38f1a33193b1fa43d576a89d528165 Mon Sep 17 00:00:00 2001 From: john Date: Mon, 6 Sep 2021 07:29:22 -0500 Subject: [PATCH 38/85] Docs fix incomplete examples --- docs/src/gui/axis.txt | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/docs/src/gui/axis.txt b/docs/src/gui/axis.txt index 3304f9892bf..e1178709761 100644 --- a/docs/src/gui/axis.txt +++ b/docs/src/gui/axis.txt @@ -968,8 +968,8 @@ root_window.tk.call("wm","protocol",".","WM_DELETE_WINDOW","destroy .") A configuration-specific python file may be specified with an ini file setting '[DISLAY]USER_COMMAND_FILE=filename.py'. Like a `~/.axisrc` file, -this file is sourced just before the AXIS GUI is displayed. This file -is specific to an ini file configuration not the user's home directory. +this file is sourced just before the AXIS GUI is displayed. This file needs to +be located in the same directory as the ini file. When this file is specified, an existing `~/.axisrc` file is ignored. === user_live_update() @@ -1186,6 +1186,9 @@ root_window.bind('',lambda event: set_feedrate(100)) [source,python] ---- # read an ini file item +import sys +import linuxcnc +inifile = linuxcnc.ini(sys.argv[1]) machine = inifile.find('EMC','MACHINE') print 'machine name =',machine @@ -1196,8 +1199,8 @@ print 'machine name =',machine [source,python] ---- -# linuxcnc status can be read from s. - +import linuxcnc +s = linuxcnc.stat() # create a connection to the status channel print s.actual_position print s.paused ---- @@ -1207,8 +1210,9 @@ print s.paused ---- # set the view of the preview # valid views are view_x view_y view_y2 view_z view_z2 view_p - -commands.set_view_z() +import linuxcnc +c = linuxcnc.command() +c.set_view_z() ---- === Creating new AXISUI HAL Pins From f255cd3c653326b65b9dc8cab1cb040dea07cade Mon Sep 17 00:00:00 2001 From: John Date: Mon, 6 Sep 2021 17:58:19 -0500 Subject: [PATCH 39/85] revert previous commit due to lack of information Signed-off-by: John --- docs/src/gui/axis.txt | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/docs/src/gui/axis.txt b/docs/src/gui/axis.txt index e1178709761..e1612d7141b 100644 --- a/docs/src/gui/axis.txt +++ b/docs/src/gui/axis.txt @@ -968,8 +968,8 @@ root_window.tk.call("wm","protocol",".","WM_DELETE_WINDOW","destroy .") A configuration-specific python file may be specified with an ini file setting '[DISLAY]USER_COMMAND_FILE=filename.py'. Like a `~/.axisrc` file, -this file is sourced just before the AXIS GUI is displayed. This file needs to -be located in the same directory as the ini file. +this file is sourced just before the AXIS GUI is displayed. This file +is specific to an ini file configuration not the user's home directory. When this file is specified, an existing `~/.axisrc` file is ignored. === user_live_update() @@ -1186,10 +1186,6 @@ root_window.bind('',lambda event: set_feedrate(100)) [source,python] ---- # read an ini file item -import sys -import linuxcnc -inifile = linuxcnc.ini(sys.argv[1]) - machine = inifile.find('EMC','MACHINE') print 'machine name =',machine ---- @@ -1199,8 +1195,7 @@ print 'machine name =',machine [source,python] ---- -import linuxcnc -s = linuxcnc.stat() # create a connection to the status channel +# linuxcnc status can be read from s. print s.actual_position print s.paused ---- @@ -1210,8 +1205,6 @@ print s.paused ---- # set the view of the preview # valid views are view_x view_y view_y2 view_z view_z2 view_p -import linuxcnc -c = linuxcnc.command() c.set_view_z() ---- From ade80dd4f6002eabedfa83504ce561998659e366 Mon Sep 17 00:00:00 2001 From: John Date: Mon, 6 Sep 2021 18:01:39 -0500 Subject: [PATCH 40/85] missed one item Signed-off-by: John --- docs/src/gui/axis.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/src/gui/axis.txt b/docs/src/gui/axis.txt index e1612d7141b..20d8eed9d15 100644 --- a/docs/src/gui/axis.txt +++ b/docs/src/gui/axis.txt @@ -1205,7 +1205,7 @@ print s.paused ---- # set the view of the preview # valid views are view_x view_y view_y2 view_z view_z2 view_p -c.set_view_z() +commands.set_view_z() ---- === Creating new AXISUI HAL Pins From 054c34494868a4999104aa602301731d2c0d0dd9 Mon Sep 17 00:00:00 2001 From: Sebastian Kuzminsky Date: Sun, 19 Sep 2021 11:37:16 -0600 Subject: [PATCH 41/85] axis gui: fix incremental jog hotkey This adds a missing global variable that tracks whether a continuous jog is in progress (and also switches it from int to bool, for clarity). Before this, attempting to switch from Continuous to Incremental jogging using `I` or `Shift-I` would produce this error message: Exception in Tkinter callback Traceback (most recent call last): File "/usr/lib/python2.7/lib-tk/Tkinter.py", line 1550, in __call__ return self.func(*args) File "/usr/bin/axis", line 3109, in root_window.bind("i", lambda event: jogspeed_incremental()) File "/usr/bin/axis", line 1478, in jogspeed_incremental if continuous_jog_in_progress: return NameError: global name 'continuous_jog_in_progress' is not defined --- src/emc/usr_intf/axis/scripts/axis.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/emc/usr_intf/axis/scripts/axis.py b/src/emc/usr_intf/axis/scripts/axis.py index ee65d869ea1..cf642f35809 100755 --- a/src/emc/usr_intf/axis/scripts/axis.py +++ b/src/emc/usr_intf/axis/scripts/axis.py @@ -172,6 +172,7 @@ def General_Halt(): jogincr_index_last = 1 mdi_history_index= -1 resume_inhibit = 0 +continuous_jog_in_progress = False help1 = [ ("F1", _("Emergency stop")), @@ -3211,7 +3212,7 @@ def jog_on(a, b): jog_cont[a] = False else: global continuous_jog_in_progress - continuous_jog_in_progress = 1 + continuous_jog_in_progress = True jog(linuxcnc.JOG_CONTINUOUS, jjogmode, a, b) jog_cont[a] = True jogging[a] = b @@ -3223,7 +3224,7 @@ def jog_off(a): def jog_off_actual(a): global continuous_jog_in_progress - continuous_jog_in_progress = 0 + continuous_jog_in_progress = False if not manual_ok(): return jog_after[a] = None jogging[a] = 0 From 57106b06e85831418fd9f901adac05f7d9168452 Mon Sep 17 00:00:00 2001 From: Sebastian Kuzminsky Date: Sun, 19 Sep 2021 12:27:07 -0600 Subject: [PATCH 42/85] docs: add missing word to pid.9 manpage --- docs/man/man9/pid.9 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/man/man9/pid.9 b/docs/man/man9/pid.9 index 8c79de13b95..95c0339117c 100644 --- a/docs/man/man9/pid.9 +++ b/docs/man/man9/pid.9 @@ -116,7 +116,7 @@ friction or motor counter-EMF and may permit better tuning if used properly. .TP \fBpid.\fIN\fB.FF1\fR float in First order feed-forward term. Produces a contribution to the output that -\fBFF1\fR multiplied by the derivative of the commanded value. For +is \fBFF1\fR multiplied by the derivative of the commanded value. For position loops, the contribution is proportional to speed, and can be used to compensate for friction or motor CEMF. For velocity loops, it is proportional to acceleration and can compensate for inertia. In both From 2619ba7a7f143565ed9830f9d40aecba33c15719 Mon Sep 17 00:00:00 2001 From: Phillip Carter Date: Fri, 24 Sep 2021 10:01:55 +1000 Subject: [PATCH 43/85] plasmac: change default thc delay to 0.5 --- configs/by_machine/plasmac/plasmac_config.py | 4 ++-- configs/by_machine/plasmac/versions.html | 5 +++++ 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/configs/by_machine/plasmac/plasmac_config.py b/configs/by_machine/plasmac/plasmac_config.py index 00b723d2da2..ef7db6d61a9 100644 --- a/configs/by_machine/plasmac/plasmac_config.py +++ b/configs/by_machine/plasmac/plasmac_config.py @@ -113,7 +113,7 @@ def configure_widgets(self): self.builder.get_object('scribe-on-delay').set_digits(1) self.builder.get_object('scribe-on-delay-adj').configure(0,0,9,0.1,0,0) self.builder.get_object('thc-delay').set_digits(1) - self.builder.get_object('thc-delay-adj').configure(1.5,0,9,0.1,0,0) + self.builder.get_object('thc-delay-adj').configure(0.5,0,9,0.1,0,0) self.builder.get_object('thc-threshold').set_digits(2) self.builder.get_object('thc-threshold-adj').configure(1,0.05,9,0.01,0,0) if self.i.find('TRAJ', 'LINEAR_UNITS').lower() == 'mm': @@ -350,7 +350,7 @@ def idle_changed(self, halpin): def __init__(self, halcomp,builder,useropts): - self.plasmacVersion = 'PlasmaC v0.188' + self.plasmacVersion = 'PlasmaC v0.189' self.W = gtk.Window() self.halcomp = halcomp diff --git a/configs/by_machine/plasmac/versions.html b/configs/by_machine/plasmac/versions.html index 0221fb2adb0..59b29217ebf 100644 --- a/configs/by_machine/plasmac/versions.html +++ b/configs/by_machine/plasmac/versions.html @@ -19,6 +19,11 @@

PlasmaC Updates

+
v0.189 - 2021 Sep 24 +
    +
  • change default thc delay to 0.5
  • +
+
v0.188 - 2021 Feb 22
  • fix material verter for sheetcam update
  • From a3db7e2e6c8748c0018fb52b1882b3c7f3da1513 Mon Sep 17 00:00:00 2001 From: Charles-Xavier Roy Date: Fri, 24 Sep 2021 10:34:06 -0400 Subject: [PATCH 44/85] Fix https://github.com/LinuxCNC/linuxcnc/issues/1272 Ignore iopl error and provide warning message to user --- src/rtapi/uspace_rtapi_app.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/rtapi/uspace_rtapi_app.cc b/src/rtapi/uspace_rtapi_app.cc index 78911631590..5f45f7f8cc7 100644 --- a/src/rtapi/uspace_rtapi_app.cc +++ b/src/rtapi/uspace_rtapi_app.cc @@ -708,8 +708,8 @@ static int harden_rt() if (iopl(3) < 0) { rtapi_print_msg(RTAPI_MSG_ERR, "cannot gain I/O privileges - " - "forgot 'sudo make setuid'?\n"); - return -EPERM; + "forgot 'sudo make setuid' or using secure boot? -" + "parallel port access is not allow\n"); } #endif From 332325c14a55de051dc69e3e3b2fff0e9bd0e5fa Mon Sep 17 00:00:00 2001 From: Sebastian Kuzminsky Date: Mon, 27 Sep 2021 16:25:59 -0600 Subject: [PATCH 45/85] github workflow: bump ci runner from 16.04 to 18.04 --- .github/workflows/ci.yml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 2622fc0cfb3..9f969304c8b 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -10,7 +10,7 @@ on: jobs: main: - runs-on: ubuntu-16.04 + runs-on: ubuntu-18.04 steps: - name: Dump GitHub context env: @@ -23,5 +23,3 @@ jobs: - run: git fetch --recurse-submodules=no https://github.com/linuxcnc/linuxcnc refs/tags/*:refs/tags/* - run: ./scripts/travis-install-build-deps.sh - run: ./scripts/travis-build-test.sh - - From d94492873614654c0e983ef097b244794bdbe54d Mon Sep 17 00:00:00 2001 From: CMorley Date: Sun, 3 Oct 2021 10:27:20 -0700 Subject: [PATCH 46/85] qtvcp -backport master fixes to LCDNumber, Dial, Slider LCDNumber: add other in types and add a template for floats Dial: fix initial HAL output setting. slider: fix initial HAL output setting. --- lib/python/qtvcp/widgets/simple_widgets.py | 121 +++++++++++++++++++-- 1 file changed, 112 insertions(+), 9 deletions(-) diff --git a/lib/python/qtvcp/widgets/simple_widgets.py b/lib/python/qtvcp/widgets/simple_widgets.py index b3308bed23d..75c38e2a795 100644 --- a/lib/python/qtvcp/widgets/simple_widgets.py +++ b/lib/python/qtvcp/widgets/simple_widgets.py @@ -34,14 +34,113 @@ class LCDNumber(QtWidgets.QLCDNumber, _HalWidgetBase): def __init__(self, parent=None): super(LCDNumber, self).__init__(parent) + self._pin_name = '' + self._floatTemplate = '{:.4f}' + self._bit_pin_type = False + self._s32_pin_type = False + self._float_pin_type = True def _hal_init(self): - self.hal_pin = self.HAL_GCOMP_.newpin(self.HAL_NAME_, hal.HAL_FLOAT, hal.HAL_IN) - self.hal_pin.value_changed.connect(lambda data: self.l_update(data)) - - def l_update(self, data): + if self._pin_name == '': + pname = self.HAL_NAME_ + else: + pname = self._pin_name + if self._bit_pin_type: + self.hal_pin = self.HAL_GCOMP_.newpin(pname, hal.HAL_BIT, hal.HAL_IN) + self.hal_pin.value_changed.connect(lambda data: self.updateDisplay(data)) + elif self._float_pin_type: + self.hal_pin = self.HAL_GCOMP_.newpin(pname, hal.HAL_FLOAT, hal.HAL_IN) + self.hal_pin.value_changed.connect(lambda data: self.updateFloatDisplay(data)) + elif self._s32_pin_type: + self.hal_pin = self.HAL_GCOMP_.newpin(pname, hal.HAL_S32, hal.HAL_IN) + self.hal_pin.value_changed.connect(lambda data: self.updateDisplay(data)) + + def updateDisplay(self, data): self.display(data) + def updateFloatDisplay(self, data): + try: + if self._floatTemplate == '': + print ('None') + self.updateDisplay(data) + return + print(':',self._floatTemplate) + t = self._floatTemplate.format + self.display(t(data)) + except: + self.display('{:.2f}'.format(data)) + LOG.warning("(LCDNumber) Float formatting string: {} not valid-using {}".format( + self._floatTemplate, '{:.2f}')) + + ######################################################################### + # This is how designer can interact with our widget properties. + # designer will show the pyqtProperty properties in the editor + # it will use the get set and reset calls to do those actions + ######################################################################## + + def _toggle_properties(self, picked): + data = ('bit', 's32', 'float') + + for i in data: + if not i == picked: + self[i+'_pin_type'] = False + + def set_pin_name(self, value): + self._pin_name = value + def get_pin_name(self): + return self._pin_name + def reset_pin_name(self): + self._pin_name = '' + + def set_bit_pin_type(self, value): + self._bit_pin_type = value + if value: + self._toggle_properties('bit') + def get_bit_pin_type(self): + return self._bit_pin_type + def reset_bit_pin_type(self): + self._bit_pin_type = '' + + def set_s32_pin_type(self, value): + self._s32_pin_type = value + if value: + self._toggle_properties('s32') + def get_s32_pin_type(self): + return self._s32_pin_type + def reset_s32_pin_type(self): + self._s32_pin_type = '' + + def set_float_pin_type(self, value): + self._float_pin_type = value + if value: + self._toggle_properties('float') + def get_float_pin_type(self): + return self._float_pin_type + def reset_float_pin_type(self): + self._float_pin_type = '' + + def set_floatTemplate(self, data): + self._floatTemplate = data + def get_floatTemplate(self): + return self._floatTemplate + def reset_floatTemplate(self): + self._floatTemplate = '{:.4f}' + + # designer will show these properties in this order: + pin_name = QtCore.pyqtProperty(str, get_pin_name, set_pin_name, reset_pin_name) + bit_pin_type = QtCore.pyqtProperty(bool, get_bit_pin_type, set_bit_pin_type, reset_bit_pin_type) + s32_pin_type = QtCore.pyqtProperty(bool, get_s32_pin_type, set_s32_pin_type, reset_s32_pin_type) + float_pin_type = QtCore.pyqtProperty(bool, get_float_pin_type, set_float_pin_type, reset_float_pin_type) + floatTemplate = QtCore.pyqtProperty(str, get_floatTemplate, set_floatTemplate, reset_floatTemplate) + + ############################## + # required class boiler code # + ############################## + + def __getitem__(self, item): + return getattr(self, item) + def __setitem__(self, item, value): + return setattr(self, item, value) class CheckBox(QtWidgets.QCheckBox, _HalToggleBase): def __init__(self, parent=None): @@ -62,11 +161,13 @@ def _hal_init(self): self.hal_pin_f = self.HAL_GCOMP_.newpin(self.HAL_NAME_+'-f', hal.HAL_FLOAT, hal.HAL_OUT) self.hal_pin_scale = self.HAL_GCOMP_.newpin(self.HAL_NAME_+'-scale', hal.HAL_FLOAT, hal.HAL_IN) self.hal_pin_scale.set(1) - def _f(data): - scale = self.hal_pin_scale.get() - self.hal_pin_s.set(data) - self.hal_pin_f.set(data*scale) - self.valueChanged.connect(partial(_f)) + self.updateValue(self.value()) + self.valueChanged.connect(lambda data:self.updateValue(data)) + + def updateValue(self, data): + scale = self.hal_pin_scale.get() + self.hal_pin_s.set(data) + self.hal_pin_f.set(data*scale) class Dial(QtWidgets.QDial, _HalWidgetBase): def __init__(self, parent=None): @@ -85,6 +186,7 @@ def _hal_init(self): self.hal_pin_scale = self.HAL_GCOMP_.newpin(self.HAL_NAME_+'-scale', hal.HAL_FLOAT, hal.HAL_IN) self.hal_pin_scale.value_changed.connect(lambda data: self.updateScale(data)) self.hal_pin_scale.set(1) + self.updateCount(self.value()) self.valueChanged.connect(lambda data:self.updateCount(data)) def updateScale(self, data): @@ -114,6 +216,7 @@ def updateCount(self, count): self.hal_pin_f.set(self._currentTotalCount * self.scale) self.hal_pin_d.set(self._deltaScaled) + class DoubleScale(QtWidgets.QDoubleSpinBox, _HalScaleBase): intOutput = QtCore.pyqtSignal(int) floatOutput = QtCore.pyqtSignal(float) From 38c4d4b21502ff70ec0403f7e535b872294a9ed7 Mon Sep 17 00:00:00 2001 From: Chris Morley Date: Tue, 5 Oct 2021 19:09:56 -0700 Subject: [PATCH 47/85] qtvcp -simplewidgets: fix default template of LCDNumber This will make it work just as before the upgrade. Also remove some debug prints --- lib/python/qtvcp/widgets/simple_widgets.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/lib/python/qtvcp/widgets/simple_widgets.py b/lib/python/qtvcp/widgets/simple_widgets.py index 75c38e2a795..9c051a49f0a 100644 --- a/lib/python/qtvcp/widgets/simple_widgets.py +++ b/lib/python/qtvcp/widgets/simple_widgets.py @@ -35,7 +35,7 @@ class LCDNumber(QtWidgets.QLCDNumber, _HalWidgetBase): def __init__(self, parent=None): super(LCDNumber, self).__init__(parent) self._pin_name = '' - self._floatTemplate = '{:.4f}' + self._floatTemplate = '' self._bit_pin_type = False self._s32_pin_type = False self._float_pin_type = True @@ -61,10 +61,8 @@ def updateDisplay(self, data): def updateFloatDisplay(self, data): try: if self._floatTemplate == '': - print ('None') self.updateDisplay(data) return - print(':',self._floatTemplate) t = self._floatTemplate.format self.display(t(data)) except: @@ -124,7 +122,7 @@ def set_floatTemplate(self, data): def get_floatTemplate(self): return self._floatTemplate def reset_floatTemplate(self): - self._floatTemplate = '{:.4f}' + self._floatTemplate = '' # designer will show these properties in this order: pin_name = QtCore.pyqtProperty(str, get_pin_name, set_pin_name, reset_pin_name) From d7567230dffe7240a32e2fd0d4b1324df38873ca Mon Sep 17 00:00:00 2001 From: Phillip Carter Date: Sat, 9 Oct 2021 12:15:32 +1100 Subject: [PATCH 48/85] qtvcp: add install script and add v5.11 to makefile --- lib/python/qtvcp/designer/install_script | 116 +++++++++++++++++++++++ src/Makefile | 2 + 2 files changed, 118 insertions(+) create mode 100755 lib/python/qtvcp/designer/install_script diff --git a/lib/python/qtvcp/designer/install_script b/lib/python/qtvcp/designer/install_script new file mode 100755 index 00000000000..c84b74710e7 --- /dev/null +++ b/lib/python/qtvcp/designer/install_script @@ -0,0 +1,116 @@ +#!/bin/bash + +# install base packages for displaying qtvcp screens and sounds +echo -e '\ninstalling common base packages' +sudo apt-get install -y gstreamer1.0-tools espeak espeak-ng sound-theme-freedesktop + +echo -e '\ninstalling base packages for python2' +sudo apt-get install -y python-opengl python-pyqt5 python-pyqt5.qsci python-pyqt5.qtsvg python-pyqt5.qtopengl python-opencv python-dbus python-dbus.mainloop.pyqt5 python-espeak python-pyqt5.qtwebkit python-xlib python-cairo + +# prompt to install designer +while true; do +# clear + echo -e '\nDo you wish to install Qt Designer for creating or modifying GUI files' + echo ' 1 = No, exit' + echo ' 2 = Yes, for a Run In Place installation' + echo ' 3 = Yes, for a package installation' + read -p $'\nSelection? ' response + case $response in + [1]* ) echo -e '\nInstallation complete, QtVCP screens are now available.\n' + exit;; + [2]* ) break;; + [3]* ) break;; + * ) echo -e '\nInstallation complete, QtVCP screens are now available.\n' + exit;; + esac +done + +# install tools +#clear +echo -e '\ninstalling common tools' +sudo apt-get install -y qttools5-dev qttools5-dev-tools + +echo -e '\ninstalling python2 tools' +sudo apt-get install -y libpython-dev pyqt5-dev-tools + +# get qttools version +qttools=$(dpkg-query -W -f='${Version}\n' qttools5-dev) +case $qttools in + *5.5* ) qtver=5.5; qtfile=libpyqt5_py2.tar.gz;; + *5.7* ) qtver=5.7; qtfile=libpyqt5_py2.tar.gz;; + *5.9* ) qtver=5.9; qtfile=libpyqt5_py2.so.tar.gz;; + *5.11* ) qtver=5.11; qtfile=libpyqt5_py2.so.tar.gz;; + * ) clear + echo -e '\nUnknown qttools version '$qttools + echo -e '\ncannot continue designer installation\n' + exit +esac + +# get the correct .so file to copy +# for run in place LinuxCNC installation +if [ $response -eq 2 ]; then + if [ -f ~/linuxcnc-dev/lib/python/qtvcp/designer/x86_64/qt$qtver/$qtfile ]; then + sofile=~/linuxcnc-dev/lib/python/qtvcp/designer/x86_64/qt$qtver/$qtfile + pifile=~/linuxcnc-dev/lib/python/qtvcp/plugins/qtvcp_plugin.py + ripdir='~/linuxcnc-dev' + else + while true; do +# clear + echo -e '\nrun in place installation not found' + echo 'Enter base directory name e.g. linuxcnc-2.9' + echo 'X to exit' + read -p $'\nDirectory? ' basedir + case $basedir in + [Xx]* ) clear + exit;; + * ) if [ -f ~/$basedir/lib/python/qtvcp/designer/x86_64/qt$qtver/$qtfile ]; then + sofile=~/$basedir/lib/python/qtvcp/designer/x86_64/qt$qtver/$qtfile + pifile=~/$basedir/lib/python/qtvcp/plugins/qtvcp_plugin.py + ripdir='~/'$basedir + break + fi + ;; + esac + done + fi +# for full LinuxCNC installation +elif [ $response -eq 3 ]; then + # check for valid $qtfile + if [ -f /usr/lib/python2.7/dist-packages/qtvcp/designer/x86_64/qt$qtver/$qtfile ]; then + sofile=/usr/lib/python2.7/dist-packages/qtvcp/designer/x86_64/qt$qtver/$qtfile + pifile=/usr/lib/python2.7/dist-packages/qtvcp/plugins/qtvcp_plugin.py + else +# clear + echo -e '\n'$qtfile 'not found in /usr/lib/python2.7/dist-packages/qtvcp/designer/x86_64/qt'$qtver'/' + echo -e '\ncannot continue designer installation\n' + exit + fi +fi + +# install python2 module loading library + # if library exists +if [ -f /usr/lib/x86_64-linux-gnu/qt5/plugins/designer/libpyqt5.so ]; then + # rename it + sudo mv /usr/lib/x86_64-linux-gnu/qt5/plugins/designer/libpyqt5.so /usr/lib/x86_64-linux-gnu/qt5/plugins/designer/libpyqt5.so.old +fi + +# copy the new .so file +sudo tar -xzvf $sofile -C /usr/lib/x86_64-linux-gnu/qt5/plugins/designer + +# create users plugin directory +mkdir -p ~/.designer/plugins/python + +# link to plugins +if [ -f ~/.designer/plugins/python/qtvcp_plugin.py ]; then + sudo rm ~/.designer/plugins/python/qtvcp_plugin.py +fi +echo -e '\ncreate plugin link at:\n~/.designer/plugins/python/\n' +ln -s $pifile ~/.designer/plugins/python/ + +#clear +echo -e '\nInstallation complete, designer can be started with:' +echo -e '\ndesigner -qt=5\n' +if [ $response -eq 2 ]; then + echo -e 'After setting the rip-environment with:\n' + echo -e 'source '$ripdir'/scripts/rip-environment\n' +fi diff --git a/src/Makefile b/src/Makefile index f26bc3e1c67..28015c6d1cc 100644 --- a/src/Makefile +++ b/src/Makefile @@ -667,6 +667,7 @@ install-python: install-dirs $(DIR) $(DESTDIR)$(SITEPY)/qtvcp/designer/x86_64/qt5.5 $(DIR) $(DESTDIR)$(SITEPY)/qtvcp/designer/x86_64/qt5.7 $(DIR) $(DESTDIR)$(SITEPY)/qtvcp/designer/x86_64/qt5.9 + $(DIR) $(DESTDIR)$(SITEPY)/qtvcp/designer/x86_64/qt5.11 $(DIR) $(DESTDIR)$(SITEPY)/qtvcp/lib $(DIR) $(DESTDIR)$(SITEPY)/qtvcp/plugins $(DIR) $(DESTDIR)$(SITEPY)/qtvcp/widgets @@ -685,6 +686,7 @@ install-python: install-dirs $(FILE) ../lib/python/qtvcp/designer/x86_64/qt5.5/*.gz $(DESTDIR)$(SITEPY)/qtvcp/designer/x86_64/qt5.5 $(FILE) ../lib/python/qtvcp/designer/x86_64/qt5.7/*.gz $(DESTDIR)$(SITEPY)/qtvcp/designer/x86_64/qt5.7 $(FILE) ../lib/python/qtvcp/designer/x86_64/qt5.9/*.gz $(DESTDIR)$(SITEPY)/qtvcp/designer/x86_64/qt5.9 + $(FILE) ../lib/python/qtvcp/designer/x86_64/qt5.11/*.gz $(DESTDIR)$(SITEPY)/qtvcp/designer/x86_64/qt5.11 $(FILE) ../lib/python/qtvcp/widgets/*.py $(DESTDIR)$(SITEPY)/qtvcp/widgets $(FILE) ../lib/python/qtvcp/widgets/widget_icons/*.png ../lib/python/qtvcp/widgets/widget_icons/*.gif $(DESTDIR)$(SITEPY)/qtvcp/widgets/widget_icons $(FILE) ../lib/python/qtvcp/plugins/*.py $(DESTDIR)$(SITEPY)/qtvcp/plugins From 17d8e9d363f7b4cb47d569b2fb2186dbbc3165e9 Mon Sep 17 00:00:00 2001 From: Sebastian Kuzminsky Date: Sat, 9 Oct 2021 18:36:39 -0600 Subject: [PATCH 49/85] docs: add missing section to Getting Started pdf --- docs/src/Master_Getting_Started.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/src/Master_Getting_Started.txt b/docs/src/Master_Getting_Started.txt index 0ca4a3df3b5..05ea857c1da 100644 --- a/docs/src/Master_Getting_Started.txt +++ b/docs/src/Master_Getting_Started.txt @@ -18,6 +18,8 @@ include::getting-started/system-requirements.txt[] include::getting-started/getting-linuxcnc.txt[] +include::getting-started/running-linuxcnc.txt[] + include::getting-started/updating-linuxcnc.txt[] include::common/glossary.txt[] From 8054d18d724d056bbba5ea0d3066e789ea02fbb7 Mon Sep 17 00:00:00 2001 From: Sebastian Kuzminsky Date: Sat, 9 Oct 2021 18:38:05 -0600 Subject: [PATCH 50/85] docs: fix asciidoc markup in Running LinuxCNC, update index This removes an unused section tag in running-linuxcnc.txt which confused asciidoc. --- docs/src/getting-started/running-linuxcnc.txt | 3 --- docs/src/index.tmpl | 2 +- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/docs/src/getting-started/running-linuxcnc.txt b/docs/src/getting-started/running-linuxcnc.txt index c7e5b14095d..86cb1e51244 100644 --- a/docs/src/getting-started/running-linuxcnc.txt +++ b/docs/src/getting-started/running-linuxcnc.txt @@ -1,5 +1,4 @@ [[cha:running-emc]] - = Running LinuxCNC == Invoking LinuxCNC @@ -8,8 +7,6 @@ After installation, LinuxCNC starts just like any other Linux program: run it from the <> by issuing the command 'linuxcnc', or select it in the Applications - CNC menu. -[[sec:config-launcher]] (((Configuration Launcher))) - == Configuration Launcher When starting LinuxCNC from the CNC menu or from the command line without diff --git a/docs/src/index.tmpl b/docs/src/index.tmpl index 821e5215791..21876cdefd4 100644 --- a/docs/src/index.tmpl +++ b/docs/src/index.tmpl @@ -108,7 +108,7 @@ function setup_page(){
  • About LinuxCNC
  • System Requirements
  • Getting LinuxCNC
  • -
  • Configuration Launcher
  • +
  • Running LinuxCNC
  • Updating LinuxCNC
  • Linux FAQ
From a5f8e5cc0224de04ddf0704ababc4214a41e9638 Mon Sep 17 00:00:00 2001 From: Sebastian Kuzminsky Date: Sat, 9 Oct 2021 19:02:34 -0600 Subject: [PATCH 51/85] ignore another generated file --- docs/man/.gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/man/.gitignore b/docs/man/.gitignore index 3c38fa759e5..c182907229a 100644 --- a/docs/man/.gitignore +++ b/docs/man/.gitignore @@ -12,6 +12,7 @@ man1/halstreamer.1 man1/thermistor.1 man1/wj200_vfd.1 man1/xhc-whb04b-6.1 +man1/sendkeys.1 man9/abs_s32.9 man9/abs.9 From ab788522d4a75958cea46b43d928131c59cbb8e3 Mon Sep 17 00:00:00 2001 From: andypugh Date: Thu, 14 Oct 2021 16:19:42 +0100 Subject: [PATCH 52/85] Put the English version of rtfaults.txt back But also keep the Spanish translation --- docs/rtfaults.txt | 50 ++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 49 insertions(+), 1 deletion(-) diff --git a/docs/rtfaults.txt b/docs/rtfaults.txt index 21e660e0ed5..ccb0afca23d 100644 --- a/docs/rtfaults.txt +++ b/docs/rtfaults.txt @@ -1,3 +1,51 @@ +(Versión en español a continuación) + +Finding line number information for faults in realtime components + +1. Get a version of LinuxCNC which prints the faulting instruction address + (that includes this version of LinuxCNC) + +2. Include debugging info in your modules. For built-in modules, + below the definition of EXTRA_CFLAGS in Makefile, add + EXTRA_CFLAGS += -g + For standalone modules, add the same line just above the line + ifeq ($(BUILDSYS),kbuild) + and (re)build the component + +3. Run hal until the fault occurs. DO NOT EXIT THE HAL SESSION YET. You + must find the start of the module (step 5) first. + +4. Note the ip (instruction pointer) address in dmesg. e.g.: + RTAPI: Task 1[c2800000]: Fault with vec=14, signo=11 ip=c93dc01a. + ^^^^^^^^ +5. Find the module which contains the offending IP. + $cat /proc/modules + motmod 142230 0 - Live 0xc93df000 + fault 1626 1 motmod, Live 0xc93dc000 + hal_lib 30517 2 motmod,fault, Live 0xc93d5000 + + Now you can exit hal/emc2. + +6. Subtract the start of the module from the faulting ip (in this case, 0x1a) + Among other ways to do this, you can use the shell: + $ printf "0x%x\n" $((0xc93dc01a-0xc93dc000)) + 0x1a + +7. Use addr2line to find out the source code line: + $ addr2line -e emc2-dev/src/fault.ko 0x1a + /usr/src/linux-headers-2.6.32-122-rtai/hal/components/fault.comp:9 + Ignore how the directory name is wrong and see whether this has helped you + localize the problem: + fault.comp:9 *(int*)0 = 0; + Yup! Looks like it has. + + Note that even if you do not prefix the address argument to addr2line + with 0x, it is taken to be a hex number, and you'll get the wrong + line-number information. Take care to always use hex addresses with + addr2line. + +----- + Encontrar información del número de línea para fallos en componentes de tiempo real 1. Obtenga una versión de LinuxCNC que imprima la dirección de instrucción que falla @@ -40,4 +88,4 @@ Encontrar información del número de línea para fallos en componentes de tiemp Tenga en cuenta que incluso si no agrega el argumento de dirección a addr2line con 0x, se espera un número hexadecimal, y obtendrá un error en la información del número de línea. Tenga cuidado de usar siempre direcciones - hexadecimales con addr2line. \ No newline at end of file + hexadecimales con addr2line. From 9c2a80cf24b45e3edb19306c4b46442146de06d5 Mon Sep 17 00:00:00 2001 From: Petter Reinholdtsen Date: Thu, 14 Oct 2021 15:20:12 +0200 Subject: [PATCH 53/85] Adjusted udev rules to flag xhc units as user accessable. This is an alternative to using the plugdev group, which provide access to the user logged in on the console without having to statically grant plugdev membership. --- debian/extras/lib/udev/rules.d/99-xhc-whb04b-6.rules | 2 +- debian/extras/lib/udev/rules.d/99-xhc.rules | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/debian/extras/lib/udev/rules.d/99-xhc-whb04b-6.rules b/debian/extras/lib/udev/rules.d/99-xhc-whb04b-6.rules index e742d8e7215..0ef0c4ef55e 100644 --- a/debian/extras/lib/udev/rules.d/99-xhc-whb04b-6.rules +++ b/debian/extras/lib/udev/rules.d/99-xhc-whb04b-6.rules @@ -1,3 +1,3 @@ # xhc-whb04b-6 mpg pendant -SUBSYSTEM=="usb", ATTR{idProduct}=="eb93", ATTR{idVendor}=="10ce", MODE="666", OWNER="root", GROUP="plugdev" +SUBSYSTEM=="usb", ATTR{idProduct}=="eb93", ATTR{idVendor}=="10ce", MODE="666", OWNER="root", GROUP="plugdev", TAG+="uaccess" diff --git a/debian/extras/lib/udev/rules.d/99-xhc.rules b/debian/extras/lib/udev/rules.d/99-xhc.rules index 9d48db338e4..4bbb7642a15 100644 --- a/debian/extras/lib/udev/rules.d/99-xhc.rules +++ b/debian/extras/lib/udev/rules.d/99-xhc.rules @@ -1,2 +1,2 @@ # xhc-hb04 mpg pendant -SUBSYSTEM=="usb", ATTR{idProduct}=="eb70", ATTR{idVendor}=="10ce", MODE="0666", OWNER="root", GROUP="plugdev" +SUBSYSTEM=="usb", ATTR{idProduct}=="eb70", ATTR{idVendor}=="10ce", MODE="0666", OWNER="root", GROUP="plugdev", TAG+="uaccess" From c573452f8865161e977d1151b799fca7c2add889 Mon Sep 17 00:00:00 2001 From: Greg Carl Date: Fri, 15 Oct 2021 13:50:04 -0400 Subject: [PATCH 54/85] plasmac: docs update to add heights diagram --- .../plasma/images/plasmac_heights_diagram.png | Bin 0 -> 144753 bytes docs/src/plasma/plasmac-user-guide.txt | 8 ++++++-- 2 files changed, 6 insertions(+), 2 deletions(-) create mode 100644 docs/src/plasma/images/plasmac_heights_diagram.png diff --git a/docs/src/plasma/images/plasmac_heights_diagram.png b/docs/src/plasma/images/plasmac_heights_diagram.png new file mode 100644 index 0000000000000000000000000000000000000000..57ba7f1dad7f7c0e0943960f633ed30efc9d9d96 GIT binary patch literal 144753 zcmeFZ2|Sc--#310ELkE&c2kxVA$!)LLXuEP5h`R0*)rC#B-ulf#0W*!WJ{Q_t7PA@ z4uDP8 z!HYV2Isgp~4R9O$2T&&ue$a+H+yeju13(-Afc?O}a0h@EJfi_W$S&{$4B-DP;OFDu z0q`$?Z~OPoe!hNc;HL(DYT%~^ern*S2L4BCfbJ;-*au3^0RRVsp3?s9{8>W$FXs>? zc>qXA`1|?a*~EU&J&pZj6aORU%}=3!YT%~^ern*S27YSbZyJz2Ei0pPT3JQz^ikQ< zD)RCw@@Ig5^xa;}f-%G1)ANCfw6u$d)EyhwyS7r+uFlf%I}fB~q)tl%YB2bNJJwFN zo=5N6+BvwWi>+3p#g01IsEe5@7@RhEaL(4=;exNb?N#5)*Q|Y=td(uVU>XOQ)Zi*` z=LgQVo_CJIo$tGNsKC{Qera6=Jm33TT1Z39-R7RkmGe4(y#oBCF7(&Fczb(GdCN(; zy4y+1C@U*VpO%%Dm6Zgqko53z@w@|u`nNRjZ(aOzcKuY>zomhH>*AlY>;Exz{he*ux_}hR z8{|^d5#SuaKu1SUN6SD@N57weVLuZ)GZP~t6DQk27ItnzSjs1!~XqDj7%KN%pBtU-2CGI_KR8vuN&4;<3!}{x`!|_9pU2U;T1hDcH*SC zyn>?A8D*7o=e2coFX&yodd=jz>5ZFa);6~H?Cc#JJv_Z0dc%EuLm!1b4u296nUMG_ z>3Q;tl$V)V*>B$FgzlilW$$ldjJ1EyaT3QG#!=79;`@F#e!cI$fOoslDmNCN} zx5GlR!TUMR#=kD9XB3vZg5$jF-pzDGM1E2fzbD!+lKpFfh5VN!`!QxBBhC)~h0d?j`@!qeHxk|?$X8_p_EU2;19UFg&Ic;_oAtuHT6 z>0w`O?GB@y2})Ez%m9laKA{5h_dNkbqcEaxnF>5ZQpR*ivP$I3m>oSTu-w0q#6h#} z`m1mHetoHxp0OrWkqZ2`xcf3Wz1Yi{c`7bKZQpR*uxHFEi%&UEBT)9Ukx)+C1Zm$5;7xC06&lax($`owZTp&Qy zN|D4z1rp!lSIJF?jS3ZD_u@Y@?cYvouZ<-C5u7XKa%wAjo1F^ue4m5Ni=W60V)`== z2{uc7VEkmQp>9dPi`u*LC}gR5+*U5i}T_;l@l0Jno=BMMVJb_Dd}S9xn`^laQs=vA&x_rf$7BI$Tcbum##tu z9w|+ZcA4pyUg@tiH=kI`j~hR;3yI5T0(M%lN^#lvxTY_wr|j<7zO5Wux@oAHlPow> zMap0346{@)6!h14->(mWM@?IvfIT#sK(>Yw2J8EmtV-iz(UZJ*%$Dd<^?ilR5|;Es zhzVHiLyAz4M*T1NfpQ;2X~0P&tpSqy1QlSpx#0BH!eIaT59w2P2ZOMl<&cF~hn|1){S4#H-$ULgUh5(1V_aZ1Bd$ zBffVRyp0-+mvSm!h$P%+&D2%q>2zrc(un!*ih}<#Le*fV3>#P3;aS%#OwZvd?G2}HdvsNg70k+2ci3$`+Q-O?^z>e#rQn{+u2f9MQ0> zsRPnW9tElz-D)FiRUQ5_&0c}W@ZK?M&Uj@MKjH9A6=zfuYx}utknIn$fQY+qvcV!q7*PyxqVy2qUKA4fElooZ%2$q-sEAS-coD+N!Fw8fze1kIncQ(n6rj0743`))5y z`}$|t^@lw`a&3&H32!;$L}NDYsXloV^)2Qx(_!WcwvQbr_8IcdBMze2=X|{*3n?NC zynXJYx_rY{ToTW(d>>vrb7$?TTj>1qn7=8Z@*UixUS%KQA)SR^(}V1%G1Zigf;>H7 z^ZrNUbd~h}8B0~%<98G4P7S-rIIq-I9)hETslT_}MU-Bh=)+`}(P(I@0|RGoU{{zt zMgY#%yq|dv?_+Dmp0rQ-`elv0QD5wEkdiRL4)1rV#KOIEO1=3uD~S>~oTkXUy4>epvUquKnnS|o`c|C4H!mMq;aQZ^3v zk`05W<2!DCZ^=&ZOK|#O7=xfwQ^sNIAHGC|`{fzBDP}w`s7z@2%+V@*XkSZ?vKD3l zm5j3^J@I8AhdQG-u5{7&?_u-*X$KZf(Ldu(|F{1B zTk`Px@%Rr;XH!zpRb#kqaq*QeZvY3)XOcR>Ig6ywTYRcaB5DX*{lY-l@PG=uShNG^r2N8+&9VFp?zJltcZ2yPPELjg#`yq z2fVRv*f549;;&w?v*`59CV}2qQvxk9OZedmEP|hH&j9fn-F1a%6t*ML7cpuqdq3I-wkM|D^!=)@BlT8|2xO@5JC^uK$Qz{YVdY_#q)4n;cl^|aDxnMK$ zD8~u<6G(0+$vi@wHqmxbsKu6et$W5aqu~tn%?%u~5w@Qoxa-%+>;SuyJ_QrkC0_dA za%+~``>6W~NHa-&vY5A>cozPlVXzf>uYa;6xX81KI<4 zY&mc@%$t4Ow(_4$nLG~&RvUoORm9R8o)M6{`U_~|6G4Zk&T5+#RNj!p9&yHsfy6lo zy&?b-=MP4IGI9R12>74S4(GaSJ$gsQRgemd>QVuH>*DPEAH`9;Qsp@0)Fap-|5L$B z(zdYsPmXh1RC)S)-BiBaniX&)NFyn;#9w%-P^l%IyKGS2M`>iV=;Gn^^Vn5k--C$O z*M)h&iOk6V^Zky{ya<8~#m(V=X2ptbnPxuopX&=}YTLi)$wj+f)N(Cxi$;Ts6 ztUS}oxrD@ZAy^P|_rSH78A(wxEsqO9vXzr9XRr19tCd<> zC?_}^S%GhtD2p*o*pS8JNOH4{(A^`5wZK^_5Nkw31r9LaS}BiRNl&Y&0M--Hs6~>Y z0voeLOQXgdI0g=?rR%qb zb454Z=@X2u!SWA&0BN)TUN7yyz}pIfFk{(GVe;4LQt)%WdJ(tQ=;Jtb!N#d-`g`Nk z2OT=PJwd9U{>&i7|4nV>8rD z4-H{BQ{xo$kzJ2;Nb3WJ6gyATz%?Hu_B+S>wj&3x>seGe8pmyxLq;X6VYWvAKu_f?`XxT z=IVy$YGwX$Gkd5kxaGR3)h7T}hkRH3R=grD$IJnA?~pl~&$lYNpG-y2@5`MNZ~yb6 z9e)DY{%Mhy|HFOZoJI-+av&O9U&lC|4Hp#ZO_W)h7;RAoZL>zD7^NGi?h*;CNe9C? zJ7YYpUlT&^!^1D%f~7QC=$ye&aC4a86}QFm^_-Sfz={BCdO*62J7ItPv702xt>`=m ztLkoJ=4aei(`N;1aU-o;PC@-*R|GPz{#vD7? ztf!`YTkYgzj&#w2_#vI>nT(i^01e5x%ZNb?@7*$-+|u~Pmx!wq6d=014c=VbJn&!^ zDeC*AbyK5!K^`#H=J@juOIN%H<;cS^VG5_|t@bS{KmZTxHZUqd1t3Ipoa4F`;R|M+ zoT3TUGrl$0h#_2rP13ywBX8T3b32L4RtxCatou~JWG$e*7AEL%1APQBc^6?bPX%!K z2<&>NYdNA7y<1y@D8d%!$kSlDt-wq~%VjEnT>83Y_!xmpK{W6paV6+!g;~_yr zZje)6-IiNN6z=#2%F_(|x__I}k1)6r#D`5bf|(V5b5?o?hQ+Kn&yo!V0(>&qG&8Hv zPoTI&L<2MUj0Q$3aEzq8Ww>dz-tA2V3U@Sqtf0fs6oWDCXfW0T8+rzYR5^cO_EUjL zyOnYD@ z61h|PS9wh{{EveHs8VuaE~23aYy@^J5F9o^GNIH_ zfv3gae-OFGz_ES5gYcUneqU@Y^e0mR9#smW^u%6l@-u}K(SQYS$iq^Oc#}c`TPUU^ zA1Y8ho{H!rVZ0HRu#1}py34R3Z>znI7mJc&kqC#8!Pt+B&A^RJ6v*`dB5TqBNgnLp z5EWp2Wd-VRnsNFInxclHXjpApDOoiHsXvdD_yIoZfbvJ|TR7M`TOdGK8y?pPPC-iy zF3kZvKm|Z#1BxkXh}qP=IkrwFgL6#Ia!iwsa~+if-YiBg^d^JX2?qM@K-WMrZTfL} zvGbDGk1~G&@Mn;PFg{NK-@Hk|{`jp<0uHBS3-kO~5yA ziWcmC@)B%~4V*GHI|#%N;z#1>ZWjZ(+X_bTrtnHo4#h|i5fm+}`{B#zzg*^n^!`Dt zn(urQKm&GbQbP_Dn+kx>Ob0u-Kb#b-wz>f$;D|4v>%Bh~(`yFqf&D#jlKjqT&)PQE z6FWiST}MZiJZInfdT2t=cWc9uP0|EQG%gJ^!Uj4jaFj)N%Zh-f0_jd@vTNt|wioG4 zGvH?nQfZRS>JH^wakkFG=*?Dnpv*MZ{}R}NLGbyB;LTNF+tN={5!g1eoho{OG@jo7 z8Sz)^+lxmOz75DH9`7aUQebM2)^`yF!%CjmB40O43%ogni;X0D1cNJpO>=H3tfR4= z{Qlm{PLomulMz)Bi zBtI&UKhnCpqO$8@dGpt{5>EgjhB29R43wLhk8;k^Zv{jWN^uN&0cB<7TZ}iQ94;nk zgBCG)1Dwd_%Mm~RibdOqqMg94j#rd2ni1n)!Qm!442DZbG)Q}ZEy5^g(f3`&$hx~R z5pkO^>2b^;66Bk{5($K4@VVinV+r8+f`RF$m^8u8O_&EvX%~~6gSAxnbtgM1hY=0U zl(s(DqywUL@D&=2NW~$lDv_INUYkEEHI5=048UQN$^zfSNa1+s5Ud~3sg0pjP7_l< zQTV5VR4(piEPh!6EE92Ylp}%5R+J;fm(Fdm?JX6q-#}BL0ss*c?h91!vy$5^ej=f+BM7y_Yu5U9DEA{ZR;qq1Px9@LB!(r zTg)a*X$&(M*At}f9$B1A&LK)IE_$wz;L~(u_|_PJM^ZyAf`~bDoJ8y-Xt-^8t@J2 z1nL;N^J4_o?@t8~u7<7AT@01R+WxEHOlj1k0!|iGzz)%hOsD9QLec#zs=n*J0^oX* zd7^kf&YL99Kss(_M-s)X(XF?Rz_5*EE5s&3X{Oz;7T_=qf+tgW#VCggO)2b{9a{1S zD{wLX3?u8T&ycA=>I!z%V^MDsL$EI|u#GFX5uJvqMZW8rg3H?e%Q=X~iwH+EGMb|9KfMly zaQL>B4vZ5p-$k7mj9Z)1##=+)>aCpwV9c?wNG>qCYOIP-mS8&p4&!7Oi@ zK)Mc&Jh*T$YFCmZ*g%0}{8tHJPpxX#Db+uS)hceggKWPx3%N$CVI(ec-U=6w_-wx9 z7Ele^Zt-`u&Z;%?5_w!*BKV&m6|l+sce7ZY=v-bUoRjY)=!4o(0x8E^L_To`w%$22 zAN$IPeufjY{69jgV$f!PMG@Nl)j_Drq8v15BN!s4VJRB@lzfV>V&|rn*yuEdrGzFah-o+~f5QLby zh|)&jIKBag*wUSxNKvQ!7)SKs2M1pQ8%z?ZgkW%hl}JZF#gUF8*Pu-Z5XwwICeMY~ z#U!q{ED}5-@zB4oAC}I43|5OZ*5qms^<4H=={VBkn$Rs+6{WOtw=;QtDoAmz7+f@e z5!aXDkB|!RP2x9AgGs z{@zec8jwH=kQqk>lG-p7q4!dO(7>(-7Hu46=~eFWRVL}u>_7q#xc2y&BAcbAMuri? zfV}Bv?{s#;`rDy4zkDa&v6!S!DPo^en{H>HP$^-SxeLq!hy3=zi$e7Y7Wl-QJ$L|k1!3<(&{ zSlZ&mCfk1$=IP;uTdH$V)lb`O5?NlQm-16Cs7 zSoM4gfA1=H>TL#AQ-^65Png+CvBoj~fb{wF*0cR()d6`W!)EXYJH`OeuoGYUu=A8J zJ~&ttYT9ij0-C)K@f@NP`2>c0Wk`{+5F<$$#!!Kc%ZRmbkN`FB)p3}9eTi&B#%*su zcCui&-YYE5FtqHi_AO}l$BnTMf#p|0$7`66;!n~7QDF*!j|6syBX^2m(N_Gz5$q^I z`RF{Fhh4?8t$mYqon1_A{ehySfIgS!<}lWUmsiB;P7e`$hPbEGTHAH+ug9{U;rIH? z(9dD|1!P2lU6}RRDK?VWVGt%wwVd$??6V^!+R{NHRq!qe1F5iwf@kTOPhV$F?3L!dD+lvt=jg8XQ%?B%_SGOu2Zp|KWiK*Uy4iGO87ivSK4*_F1Bmub&E#ObyJcUvP_AzLkI;? zunB}>4w}t!&h;ZHcq?pq*o()D_1{$}y&Jz*@pV+v-i>LF-Ij2Tb(4qg4NmR*yu7#} z_G=YVXF7$|(tU43=65B2NE%MHwmK2z=!!#D%Dyl|wxTTdO}_HGYq1!*QQ%52gxS09 ztm7Fdha*6j{{&>wQDSCHY$~}mP37dF^#;@7Qq_IMJ{gzZFl4NSumotm+hmKf5^%jQ zQdxmhZ$V06o!cuy-EA%%gdaL$=@xqp=O<_nng1j)jr>j168aYiukot}>!_hg=X0j( zipxaT@EI!!o(_!Y)gqq`Ul!|EK>>Q&{+)h!Z){rstM~O2$_3M24Wn8aV_ea@K{LrP zBPXz*|6m5&=@C-#>zAMF*5C%-fWMq*cSk)b|C@G=?D@HQAz|VC(t}!v`*&;K z{<)=c|2IXU|9|#HjbSSTKe+WU%xRLD$4%pP#HwQYdGSCKa8WwU_Qe7H0Zdg;Fj*FG z4a%)f>(nU8*5^-u zf^$6pIZFvn+DHNk{Q>;p)|acH$KM+;)bqwg9+|)ObwC?WWATyUzU!b^k&1WGkn$FaTBo~)78>ZDtxK5ZpO{ZHI$kk`HIcKdnDN^Tf&7R+T^_(qN zh~Mt)8}+fgWltk@d0=y6=`uWnO*^w{m4<-Av<5Q2#~;Xs*_pp_#&M0`^}1V7Ro5w8 zM6Yweox(==q;?L^XM(dV%@p9eS|U9||7l&jrME*vyY=fi)+!$LTu6_7v09IYL=hVQ zkXY}l7(J-?$sIkSVC)eV^Xzu6K@DkIY+Rt@w73-=$=HyKu-Zi7r+g(I>^crd^|*NN z5N&M4T)Hb)X5TGp3T$#tB_qr9EfxkJQkZZ$g;VCLiV_MlRkt(Prf94Y&nBMg@oW_v z;k+Xz@o|p|%18Y4mU`ySC~gA`G4Vs(&}PF)O+HW4SN`UN3XLOD@l@c@)jZVOdv#ov z7ov4b$&Wky>vyiNHX;Rv{k3uaD$7aLW{JY*)JxBJa76XF)OFGsYSm}3=0)O*!KhoA zLQW9LN-@+aqoQEzGt&NrrH=&P`_Y33ViH5xTrc-8KCHx#IviYJBfiKEwo{E8y;5DJ z(MRJ5-o1~~H4rF|pFxM4YbIWPy#9?SI-P7z8mkgM`QG}NIU#m`tHL1Z3L)4Vhi!c7 zWMnU9S|RtOh-u76Lnm+%8vlV2TPfn(#o(;{z*3Y@o@EbZmaK7R3aH@gi(7i0X%urR zreEpyL=m4Fzq3LQT-U4`4}Da&Y;DxbcQJj7U8dB*zmYfL;mrG5Q-+Kdx8Weg--oaN zo+JHDwdP=t$?tQsxj!qW|8dngq$3cvmmI~j5kc>I*H}QCsE+u;+=UnigKj+$;#MFT zT{}xUM_EQwp6P-}VYPO41G-&=*vPyHZ0zL?HJm|*eF=;VZ?Np;z%e_hPS9!9{JMKF zNY>wYN}p{%;okPGexz;TE8Fj^MZV&3?iV17mdZH&#zBfK{(2VPygB}dUlp&q)bSZ> zgAY6EoMj9xU;y>PeI(*`KdtlvL(4tA3-0AkOISSX9UUg30#1x{A%P6ENY^d`8xzRq_C`RN(P*B&&;;{!LVO-uU>LK7rPbXtbML zUrf%!fLjAf^)CioW08la5TCY_ncU`FYznRR`D@?}8;fIjbG9_nMRAsS`tq4mGSd%k zYMdSUP;l`9+kuxQxb?cglVIGasq=|S^VrK_t^9V?`AT~G(F|&>n^$x#GeSq%ElqOK%aC_-+Zuv3-SSEyD`J(&R}Sg$S)aV(_QS1y85)>0hh!w} z3*;vplH_%I^szeOdex_d(+_#LfwQx(fIL}W>=~YBz^8IqtTReOz>b0dz2&aug`CDT zGt8u6vnxNr^eRGF|HgFRvRvK%NSooTDj6l$ommUJmd<^I@D@Q~oJnVR0bQSp?PwhQ zhdp*JDg6*DPq3P>=a;Dxggx7%;qB=1S_v~;K;)RkezO7m`FVE6S6Q|%Alt753C#eQ z8F=Ekn5I9m2`<%}+Em~Yo-LB&wV0~)jUvYSjnO7V9i885Gnxa+Lg~z({_I|=nu9+C};9u9273cZ49kHY*Kpv&BD!&WDkf6;}yxtJMk84GdlVx1aJ5hLu2tF zIHuWhe@~HTkH5^Dkrpo=R6p-bhg#DxpU;l*wS%x|>_CuOZ;Qig!qqx7n}RE|(T&yRDXCD#+iMNYRl*ICi1`CddPf&=how=MU2?^@v4*lVt5k@&3A&JB!lgU zMUB!S1rk&;LwxabVztaImb8-iSZ%&l}0u3Gbh?vv?tpO+UvL!6MGN6s8>R#(BW`3HFq|x*| zI$x{cH+WhUQ!iptri^&JEZ)ak??-lOiXP3{qqrBqs32p;f!#k~W&dJj=I?T#NPYqZT(`kiZ z4f%!rY8X7X0+;TC6a{#`CT=j=Retrog@u|MDogEPwsD6rQ>NPby0ojMQwA7fQo^Gt zkuZv>G=dPRaR3DIU+rl5Wv5g_Dgi?Uw4qc$A{kB6hT`5*l)%U7Qh~2Ct5ksfKXz38 z7q9cc>*Jx5vn|C;bAqDym>*eN#C+2P`98aJu1LLawm0-*1FtX7w+GmQ+cdx^*Z+tT z(tl7*#imTyOQeZNH^Ejw{ycx)i)#sl0TF31#Nazi1ulxb`@<#p1f*vUoM>Rm)U}iZ z;+8Bb0Sp!WAi_Gy5U}J9I8ji1m=N38V98rM==IR6>_eR2BcRkHD31|HxB!X&Qt%{D zgy8S5UXD+HC)$#fJq8$!HCzfkW#V44vKSq07jgnpkon&KBo@I+nCfsUW_ENya8^G` zX0N&bXic_=W_D2EUHU2f?BkjPbTugP{zLUHFA9z}t;xj?GDTjd*FDoJ6r{o{k*1-6 z`;1c}9T&T1wZvk#9Kr*e%}L%?Tp^OIIrFm?wp6y_obu-7$eCZkz?tl_M6IF!Y1%-c zAgS(Klu&FjD;#;F4>aj3T&AC_IjW<+#H)SaemC=seww{rA-=%hhJeUeD1N&TC|aqX zJDQbk{N=O`1Ff9U)BWo1@C?@RNURq+Dv$xUSsvDsU);>E60PHOQ|R%{=hql$LwVox z#`M?cQ`MR5HdNj9lrs7XoiiYP|1t=1x*{XvqGFE(V159k^i&3W{$*Dr|?XQpQ|q zQJ3PTzX%T2ooUQf-(T436~i+Yk{A743}7<@%p`(q30NG~u$Cy<8tMG<685zAsV~Uw z?u(T2UfroNdRON5Db;{0;{ihZU*43OaFsE+W{X<6tov4OS(A^$^i?w+3>rQAP~b4- z#nKAYCN;!0y}-eEmx}!Lvxeb!4cYZ`&wDg8&1#>vswv>-@G0W}CYLoaV(`IcXSyI*3QTR*wtY3`13gz!Wc#BCLUUQ}q(yqDJ^OK6=xupO407X8*GDm+hZ!BLo@n zKid7LK|=styT8Cc7`q4IKd^WVdXd09Wk^agX#)2Eymf0K-%p%Itok`h6S{^~O@F{fO?D$4a{|c$nz3t02 zqoBmDEn&B-q~o;^9Xu=~P}p8ckOQat#P$Bb@UWW3vxH#-=R>ks>ra3RojUw@kUDGR zteWrySSN5kVHq(gG`NW_d!{_#it4&Mf~;DLsp{1D$l2XR^V@aem+gFC_BIbsNE5>m z^Y`~kPyT2p-+!~;1U*1&rChLjf*7j=ov|ki(nE`s3zngj%}&ZQy(=UH6-eNkf^LHj z*hZ#G)RynwXOJ1xdVs~(hm08B?A6JF#T6L49dOr|?cQDvD$u@#K5!FAh00de&Q4vc3A+&QQSfM_d6hu; zx9)chiJPh;8Znv-r0>W*!P9(K>oGgR={#U^l#_C=X1l?Xry7q~@?ebs{eaf7Cb=4M z`1lv!H9FEmYkUC=Lh?2Q;If#8bO~HX!Kap&g)HpZTC`bW_RdYR>27uRv0#`)x}N(j za;mcFW1-DjPW|qtFXn5hp8wc#TIb>P zApyBpWQiUP`Z-=o_!~lHtJzADh_`R9Q5Pxt0g;0z(0RXB;}# zU)U$(7F_yTs>RDAu>&UyyHTAo+^hwxq|i<#xo9JXGKWBR-0{N6!qYeGUuxvMImb?9 zZgWW%f6`RK)WHZ5!7o}uiAr!gtwAqCp0|~m4#SZn1};a!}{$)GERGCTFnsol5WT(O`=EIb%lb|Z=8#lN6tUAgE z+~PH%TIM5-4o;lq*)sLCCxjzUJQL3h4$5E!Akj=aB7~dx)@OoC6)O4B2nI$_~-r^UP-bA3X@8-ICn2FWegX`r%K+e`j^=CDq5-OlR|=VbB0 zntX`T+r6tb9#ies`Y*>D2Bza(vltl@&U{M^W$(%h;b2eC$q9rR;O#MVfmsfLAZ4W`S1lq>){CU*8?ca6sF+q^d4#jLq6%hca> zpXGt@zj~GK-3UEY7WdeSPYvN!JdF94{4%M@t?-q76Z?bZ#H!?IUNH0Z*cbg+feJ7b zM2O|CY@2v1#4@eX)xZe`x=bULhg+CDp>3hQ*bRinI(6hQFFg<~5Olg;+= zcv%Qtf64tUs3(i2_8RD*&0H6(b{piN(b?7_DByA~lyuja+vSuuH;JOU{c>viO5+<9 zXLN?X%*ibGr0{Dn#%&?+O~?a9mI22-KgIVy3Oc9sG&ufzBsUA4+U%;JTivvmVGN4D zzeYoT^$CjRV`5XcxjcKy1|ggI822dZo`CFw2Q;m<`nZux=w7s~A@AGQwr-B=3Zo^b z@UmRzTo1C)@JENpE!jh!;Rc^jxXk?-k(UPVpIWK8hQD=6OMZ)}`{LWU@%ol^bTQr& zE0AA_+ltDYLwsPZqOYW_STkT*Z)6!_iI=(cz}F_^`*x>q2hO|kfJ6(jl>6lY@gc8G z;`xffh(iTEDi=nKP_lKwl?=g1$J)tNo>4e@%LFf4@meI&QAIs}_}gkiM<^Y4Iu(%8 z5+i1JF$m*Urwkj~nd^34lBSC35Dp8t6xwaXkYcY->YIC3Y2RfUlK5l4bAo{^0nk-? zgkrNazma!NDuc_QB37nM{Jm-rB!fMl?SACCbQrpfAi)>%D+=!;B7bS6X(og zz=M(dSnohH*H~$mI%P18=FyOV8#e56jt&Q8^bQ(346D^v>vKOlV$}FF|PjNYY zFTmbRd1*VUAN(;fF)`ia7OYu1Bwegm?SOaTf~7`Z&E-$G4@K#Jo>sl~l;>Gldo(1m zRm*}aw&o(`G&%n6fQaa9yfgOWnMDx~ab?oQL_!yXHO`|UPyl+sUoJleqR)#QI$~H6 zb%wM&8Z&~g*4Qbg#TiD|uun=KAyk9uC02wpIgdy_Or~c>irr5D$%(|AQ zLqHqjD5XRx$KB#bp3izbt3UgHUVc7w^k`I=j_6^DgsVlDbtJxK;@KLu2y{o{q>v6C zSo%u)uKFC=QO4--J977V>V#ujg`-XL;BBp+?3xfmoy{t!Fjt=gHRsJgShVC3lcw%! zUcVE4dRC+Si#D#&01sWN&2jv6FPT>3SXqVN=aq~{BBe|5Q4$AbcQoD7C*3p!^KrVm z{qoX}cokx+IG$RB#gkGzKFK@qJUi&if6#5@Own%5`b2n)2)?qBPc?Oj*Wzq*Oxj4L z=n&9&cr-~|Z?oN3;FmJ`f4aGKu;TSSuQh;Ks1^Vgek$6N2x#^97X`^d;0_T zgNv#um}D1Zqo{+?Rc&}ONx>=vHpdBOw;90OBHf3Txut=Gk$9>6=Wr0Ff8i zUHAu1_TJW`|BlE1?%=^RpEKuC|5 zGeh0W%kfh@g|q0A$|I|irKQ5+xJO5TS^Hb~K?PS6yj{2_-3cDRF)V#)z<9!=#!vNKCtpU7M1YrlyxYg#zm`lH!i>S}xZ z>B}>hrla?{Gid4OEq=NjM(g49^3C&9j<^!RwaH_q_w9fZ9*}zlMrz;w%5&jpbcpJJ zW!e;yZDD)u#=Oc(YJm5_gGfy5)kO zW=18;7LSGP?A$u3YRC{euagh{%$Ygne3;6vsmngQ3-7r-4mWVF~OF-pazC? z3PFqLnwbP+`MhAPr`c4epy>6}$Jcpi`9narE^j#Yjdk{o+Lb~-S8FFhrA`m=mZ-$w z=XZhWV1r%-XH~OOE?>phPPyhs#Kp=|Y|rW%SLyL&FneD2)DY@+QAm-G3b@-~arx+_ z=X#zoverdL0*$%LGTrh`${TYSG_n{$k3DCEWCiS>N_n?1{4mPKRUwLKq0x8xs(N4Bp?$swzG=1t z=9%y2eOporhXeAp`z8!tH8`-<`Qhtvd!~>JwwIn_PGWhmZvcnxn}R&}%Q0919xtl{7|G>CRox%7HjUCo zCPBh@fkn%|IraawD6zyW+c2WR^m?ZqRzT`zR!qe(=9G&j1LY>#k_vc|kD%fT(1+%Z zq@TdGQ=)REoLBGIzW{$ok5;d*C!K(-H>adUDWCf0uBR+ASV3v0aMs|ZWBG3N9Zxra z=``m0Fy0gso`&L}wVV5Dl5gTRDG^gqh5HtcC=G1Wk7mZ9hU!`eLo~{_85&mUS|<#{ zw|I5Bw=z*)BXLtnRjzG0lbQknpd-!gJ-#3J_8olNH~F!=Q(FqFrBjT?NrAX(&M%<% zg)35HrvhhP!@*Ni2CxpnLX?B19jw6mh|?uAqQH=I{VgcT0Qx6iccTQS8zx`fRNd<@ zlXY{n#XZq{9T=Uo-K!wu;y41nc=1=~`K zl#ggih*JXs+~mPg4kno?hGZ^H9u4V%G6WrEz)T}6zjI4cs`c{zp8Gy(<%(;W(I-y% zh^z2^Bfkz5g&VeN2=qwSNahE8a&mf`U_z8HS-$duK`KKqKq3RLm};F*88Xw3&9`$6 zaFC2xmt47fQ`q19l8#9*11)5e(-8b~DX8EKxb^wuvt1iwvU;upHh!uXCZ!bZXmfeM z!WPUyHIT3D_io@LTkttI+&pz1v)NyF9u};;3$aoqc0CoQ_qQWO?=-5l#9Y(}Q9(dLoCT*^Ev=(Bxd$bi6JVxN`!r!Bx;1 zGUz%HC%6b@T@^XrvrPXk>+>x6u58FPyLTgTElNd*Dd|YWq%`@Nr{rZ_jC>=sauq+=pWDd?zPL6!GtaiCxzAcflo65 zvkGsDZ{kfu%cS`njOS5eB}A`m55^vt0=6;Cmf=L*#=X_pz0&D>)!!8)&$XHkI9?y0 zy?Qf~)_Q--l{34%%P4umt|15pZ1-wPXcv@rtXQAZKN z7hN&vf^5E4zG%fuk|s1yVtC+S&3Q?mC@QrreWCf`y9g8O2NOD>$GF++J1~yGVxXG6 zcRDlvc^qE9(JkybPXgbjanLNSgi`5oYcVp$EN*hi6`zc?SdH`AFW_l#ut4ShVHVQF zA>@-UPj}^{9aFJj@C7e6Wf_MXA z$@|)@7ki<8m=QY8gO#TlB`M-6!)oLvcRGWMVmgv@NBQ2|d2n1?)#O3pAXNISUPoY3 zOJE;#?Lrpl**t^oG7pF?mD=TM=fGoUj!eq)tQg(!!LGg^7YM(Py)EJvAKPC^G(vn4 zila1uwe@q-n*8B)P7!MCc*X7dZFi+1uR;xGqU`J{?3qX%IHc7fi21ZTB$uk>R;z>l z+S956O7+9`S4@-S9Aq@O#p$;Pg?l_GLyUG~%j3;D)p3{D(C7b3nSd=C%;BePk$P3RqY z1S9zrdgH3`fAYN%{b0RQB~CZaD=yqS;jqKQ&}-e(9+VOuEpfTNXj7xHxU2RG`Q_^EzH&AJtDEo4 z{n8BXJzuA8XKPpm3ucBB zTZbRJyjcyZw0e5n6&as#YMyh*tFb`i=|hURU1ACLf<)zsY`dKP!G z_6%JqWq~3X{J&!Z@c&zF(#*m@hBO^U2q%vq$R}bm$?53nusPW3t-btkl5{J$-|1N3 zF)%=g0rSJcxoErMonyXi#6j4uu_)kc0dg7WuR{4I>&IWeyD<-~SV|r)oT-h;zOgPP zWqSjAX}*r7^dP++WWi|+O#4}bj(oT@8x@%7VWWr#showJWRYc~72G^`v8ybGp66KC zMzy5kNpt@QJC~>Vm6x7o*boOyf9u77Yb7%jbla8T2r5AT6oJ1+Q?M(Tc)aXodla&u@13YTC&Ghr$rV530=Jj?x`h# zJn~#JxOCtg7^ncJ?r)!GM4tsm=s4e1zgd=g_}%$b;abHnvqBTm3@sC=md9+|TMjRMD;je*FfzS&uLLSi9 z<9Pt8`S?Pa)canZ@I}x1Pxe01d#D%mWUaro zELlh2%d>*3Hu9!TR`=B?XOG`X{Mhbh%@K#RX!bCH{l*^R2sbETVC!{TBbcX@52XT; z8LW@Ftt-QXLgXXm`Apa~O$38jlgzL6$d9>nF1;K`bI3J!VVfSS`|x(MYx%a0PXXe0 zO=SH}0La~K-ChMrC8DZvZ=uxEgRG^}y5b{T8Q*ozEH|@dJA80}4*h@Zy?0zw`PY9Affy^S`U7y`^|OTKovalQ4~Qv-I=ITWg93Fc$-+R z@kICC0y8ruK?F-T`vNtHKAXzmCZL4-s|Dk)M-IpXOsPsyN`z>S)Ph;tDxEWW#?zjk z6-&MP#_nZO^0%eXDWj4xfV%V_UFZ2rqkq_UK@)!O@01f_blEa+C|j|iI^)X5qTUaI zG*SBGi%qfN_mucU6Ey=Q{@7{ue_{>lVJSu|oZC9-R0-4tqw4KG;sVbT)~j`2ihp6e zOS4+m<=N>~`^$`pHy1kl%Zw=#>kmelYRZ#Vz;6hcPHgcNE$VzlPP81wU%N4BljOjF z+Y%>g``Xe^P}~4uLHh$RTMEk|^q>*n<5|NozT|12WHNM?D^AsrWk zb|aKawaG0JtBbfFEhl4@sB?Ks697{S7!lZ;ul11)rhbA5Uv}Kaxyetqjy!+XNd z1^I{YCl)Q`iL@94UTAiJ|AU4Ri3&+pHmj=JT%{X#-eQtIwFQp?W0h!U0JM6I039AP zaERfoaLEf&)gyD>2hK^X0K9P$X#aLO0B`33uw$Nr0sjg<11DtcPh6nvKw(mUwbHIy zoq^BY0F$01{CTZE@7LcmCV&(DL2CsANpZy0i;+NvSqpJbCBiW2#}xRmi2? z)Bl8^*xzr``Um{((?1aVT0cRr8_83s{pMf9D027gjv{Y^5(dY*7u$YIfs>eu)&D6(hImZ{0gVZGdNukPr2>klz)BR^29e@AR z?Hq2h!^Cmzeb`H2UQuAbN#P(_kr&mX8uIWJpR-d_JGQS~ie{C}O%RRt;uY*2eKc5< zrczP!rO{N$ICp~MV%Na1XS@UD2ZPA$)5)4TBGbS$cmhJaY>;xcsP5+pml-= z&ZjO8O)w<9*y$^9WE8BcG`V@f=m~QLPjKXCrB;cVAoZBRCe1wOM%2f>7zRCiiG7uV zOt&#drF2BbuzHDaxtPX zbwpWTo($ZyJ6|SjOhduQddlSEWW02?mWNn1aiwHcU7VPOnGH{4uW+>Uwn^Sg#QA!w zX$QP73|iLZ3j#cWR%R~Y_bZ{J8TyUytjynjz3%MG6OVd$@3z75r-Gj#mtXA_Clk2i z`s_ZqMl=h-*_WR69et(Kw>_|rkFNIUR98@XhGn6Rs;9PJx|HA*L+V9Cr6q7Xq5@;i z9!b(GAnNTmryCI%X2-=JS3mTHAyQ72eN@sgxW59B4_6!ZlXA6L)-uZCGg1@)<9+}` zo(Xm5ln+GSJbNFTR^v97Z)NlR+Chh|i&?EU<-M*I;E6@L%Z7I+F5Bhn4z0U9J z@Y&yZApi1o1p2>5iUcrO*B(&1uhaPgE-HKtH*N8nUT(t8-*n|4vVulqRsMpZFHVD7!_t67k3iP6)f zH_WkK=)s96N$-}^;I;!b0M%jA-A!chRFsTg)_YKoNKw9{-*kPb$&iaY&DHMs%~Pq` zb1eXM|10(&L7Xf-<$$CkdZ#$qm3MwaP*KI53%j6>KY4+%GYZ70JkmD-)<)FT6YcW8 zzIMs;mEabNTV|-@(-stH20Fm~&*M&uB-|MM@O*i4OSrJ=2Gj6`a}Du8UzNp7uhh}o zXwX#s$mbJ6mtF#W!I-xwxO*2MeitQ>q+Rf$SoR2#6^70yMl1Wen~&2sJG$cq`uUvK zGTN%Fkedj?dzBmpm;oNu$*V9myTW~b$5J{eQI}_bCSg10uGLki46V$v@#7TJp)z?o zmsV0{J==pRW!?`oee#!#C$x*oqD|ZC966#~Iv!~iQ=JG~2~tAe1nodk4sH<$F{iYQ zxZwjM{iL$@!-s2{AtuLF6MaUNb*Nf@ep9+)!v~Kgs$@RU%#9&T zpt5a;E=v=;TMR2~=~w!)PQ~i{02INJPD}fIDaWOZhR|$xd0k{0rSq%hTv7E?*OG4nMu?wEVHrW>_m%sc`9q{XG zzgg~qT0lAQbDfXEXDs>?B8}D4;r-zGJDs;ML4CPvz<#3%Xe$0auI9hKMzI90p+L8w z&MXbi0y9^joPBP#3w(ljAET9$?|is4F17KE{1jrFwZHlLJM7B~J`O$xA8-wrl$Zll z43h}*%T9BH*4a?xNrF*Z0Jq6lja01@yE;5maZ>d5qH-!Z97>2L#ZApfCKcn*xITd4WIg0pZJ^ z_u${T2dQueaJYC26AOJx{8LG7@(^&6{i|-|_Ur^D#x1mod5&8`ubm6>-F0CY7d(IT zV9<{KUL}W*;QI=tzH=12wS~j%qjxMObgCw&w5mDi)c%nf zZXVdT2PfD!6MccW&;j~5HCwH$pP{t8=2zQ&r z0Hmu;7BjB6Hj(^PMBQ{o0msjTa}C|uErSQoGP=S}Vc1g))1HjT%T$|R8$A1w&=$7R zm~CJ=T^dH@#BU#TC=a8~Hn}ul7Z7b8^k=cuVdXHs?2EUbaO@gAF7;8axf=Pn05qrILDO{w&6=J^vLnK=47cTur8?@i zyaZ3)$hdfZrep4u%%u?Bbq3(K?3A-QLmnVg?gl?!yEC6!L?OsKTap-xNjO1gK)ksJ`51tJ zCmluE%~rc^)faJ0H3v9>>0r0;@Hoktv3ApW#qv8VV%`Mu6tJV@FUYbWzN`$*X1 zRm@P)i{yoy=3jZ6{1@vVjTVGiVZG6mpXAH(R_O@W_me9}cbnB+7$J-kNxrN^o$^Ju zH;+1K)yz-$wrt9r0s%tI=s*FYL92ceG1DyMiwV_2gtP8>UfD{Dr~WwBlMogXwOlkBe+RvT1<1jh~vSf8xVAyT%H_ezB}ksB~FFldMGwE_}U=YFb) z=)g-**;c=*m28nw%~aeC5$1plNA+tu)E8cOQPs#X@d9#r<=b6_Z=LX#lV*}XzEClo zX@$s~;dsV$ccRI^i!3|{6FxF@^g~6ul0Vz9#nmos&)i}=8{BrnFXv_iX7A-hUjmt* zIHvnC8{KX+@qEDawY4-|#CiQafIaR08M1K*j7BPO0*Zd=wSWQ3TYIHb>;Fg69p@wK z%;kcN_43`?zzw~)X5&2=%+@Bu?Q@G~uOej^%r~);Q=Nql+iX%RF%Zd@`)D@XbGk4x zX)<(4x@%!A);&JI>^TrhsW(m80;f}@F0uTvKZc0gUktxhO5T<^cX{=_=p&{h{(kBT zQ<6K;-M5(T0_^@%VNr_0Xk(x$jEc>Ln=Uuq$4OAP`rR-sigN4BdO0L6{YAjn=gPen zYYMeLJWN|3Cb0TA9f(pgZgFA7LJzB>EFXJ7>>f_!^vE z%sB;BF;+H;+^eXZi5$JoKK>+SK@9+NH`XjQu{~A~>xq4HWzJZ|aH}>2@1dt54z7Yt zJM&XCXLVkjy5s&mkQBME{pqL`eTBTA1f5>Rp;u$ZmGF`i9N5~FlipAjHAdcieVRo>!mr=d1M9=SU zECYaYYe|!Qu`^e8bh^4gKfn;&iuvd)Ra@BG&qVD<&vWQqAxazrlLT{EnkaF$6!*AW zt$ohpm@B)%2VZY%@MV=kx7z){(Q-gL&8Z>JY;_{>zVlNX&qdeAr8}SpcEOZFw$YiE zgzzv-=CR~gGbG!XauZ->T^V^}^GV93%L<|K7Fzn$0!Ulpd#SxGFci_%@HB1#dhPJb zprnjUK{)9~KH$q;q1D(Jg9dEYa>C*&ww@nzYjNdr_Hy0*#6*VB0zCbZ=Y8zUe(19+>Kmugj`y6~%SkPlEzsXLazy^J4$o`QRVY>HojD z&rNT@0X5JkAi~Ob)vRStwUMeoiq~+P4Topo#mml1v*Cf_!-4cLjZZ{4&QZE>>J~%o zXHnZ*v)-COzE2=IVu-;?e=Lh+L$s#ufS*pSHO7su2m4=~jGF-hJk|musK@yEqBNma zEs$uI88ILZbW2EiG}~0nupU!*W3FSIEQiKYBh**^9Wu#1l@IRK-L1@5#lJlR?a5K( zR5&-l!)sK^tc>4Wb#w}wPPo5L?cqmZB~P@{8G$%JqIRGO9T)IKH+`293RPBWv9tT1 zSG#g>IcHXLc*#O$M3pv=%l%IaCFEN$U>>=iRccM%oh>UZs7@IyPmIp zWR{lTr__C($Io89S%-h|qdY1ihgto+rgI@lV@ys(?JTFEE~X!s{;ff5$UX5S)MKBIPIYk8LzX^BNc_@bs7V6 z)JX9VO&5Eo=d1)Dgk!Z0YBYxyCW<6#l6t8giVZrvWfEy1T4Uk##G`uz?REyU+X${t zv;Oa#x)-TDbj3MkrgizF?+%rY_Q4vsdb!im&fgd5DVO<7xy_ zbbCav4i|=)m0ox)fE;# z`9@i7?zCxcyO(?%C!l+*rdFXD6_M&^R`|FG>Lo5zh}>?|_Ip)Q{F-2Q{kfud)VvB8 z_baRbwnV5A-o7)3Z5fV_C#H8;^41O(Qb?BXEr=arRKo{MtB!K5g69;Vp z;8rAK+US5>WBsBbGAYQ;c-~OxJ>r|`ZFHz?5be7D{NkE0VsshwaJ~1bO5li?j=?>>zbPv(!!+-{d zB@18$jW|+wBkIE|1IHK1OGn_IZBi3c^P*?tm6a}O6EGW$L8?P4;y_vW&ByEhi)gi) z^ph`)?)U1Pj4iQl*|I1EGCtK=h}!;zBz^*Qxct#q=PWY|-^J`z1$zVO;ggR|t}0#P zAPi?1gaDZxwFwbBtB4sG(*ok>$5cYWRpCc?c89 zm|!2ZB`Lx8)pUFxiuIO}WKwCpLp^ufgAYW66Pz)~Q1zr-bEqVC#`#^tlP3SVXPpn9 zDZG!hrUp#Jrhrj-eiTN5n}o+2Wh>$1&=GXzC*%MM~~bB)8v%FGsCSI{(#X(@$MM zQUdA`6O6&piE)6!|Drtk|H1P2{{TtUFJS&eJ5Qk~0%dC?-kHny>_Yf<uPwBFH(`)regdrCeLqyl*X z)R8XgJkYxm&#G3_`E~uDU74Dl08*8#*pNVI)+e+Sr8WPlMk7EGkZEjCt=uGJ2ZwBN0aPFNfdk9s2% zx>wt5L1DsgLbJXoQKqqOrEW9EAhYi`%M$z}P%1^{@FsQb$Y$PR=@YPVP83jraTZ^DBBm;j;1tYJ5 zQs9tCM#?QI!ASZy$=24b-TM4_s55a&5Sr-1A;|Q04a1me}{H zk7UDAk{O>B@r-$4QEbcJv-EqsUbS>SLyMJ(?U%Y~URCkFM;0VgiFG$I%&C-l?&}ZB zt!#WZpJ|#1i>|^%-7b_SAEapjwmW=f1UIJzB+d@ul;zWec+1Lbg& zFtA$9W_tbllO%|=963_lSIl{{(+JO;d?&qSX4+NamgnFzQMNMaX6JfvHfR5#9(chd zn+0D)5=ip|S}1PLeq&kua7B}*qwDA{g_4$*Eg;!x;<{BvUyFA(&(Nre8|kWd-3t9_ zOYJzFC#Un1^`4qDHdbn|BH2hb1ooJw2hXj}tuzE?3GcsgtI0pD{Np`GtisaM`4dpe zFnNPcE9O9PqISmwRal7`QO2yy&;3;OWZ{s2wAZaq;xwG@{d{|9;#$W_fiseZAQFRN zI_KaHb+&s`Tp`<9ceBW&LZoaW$?IgxvA(5NN3q5lXkg=md@%Thc zW@DN4JoAO~W=`)tpwH*+OK>61!_Hru0`S!ugx+R_>H_DjJZMJi2|XV>r7zYVNT-m~ zi3J`sO6a@Mpjs@P3)Uht%;9L}*ebLsfCsxx(zq|u#}o6U&Y zm^&KM&rlALdthk%74-RV-^FGXj6qOfD`u7+8cIHkVwu_+oJ&7aSh_d+1ZhjT!0d8V z+PJ`pqZ|ynvc*ffK`fn9*^uPbnr$7DEPL*c$fbqnY&tp*KRAyb%V?@1y|>Ff9NH9a}wCgyHZY*u&*mXIC>lN=~(8i^&igi|xiEF_J= z-HW>cE+c1`w0y6(7*p4k$BpJnH{n;M?t6^hgH`Q>smfJ<}X2Y=CJhPeUwV|8y$0K)> z;pa8LmvhD|Zt{s+G2}#w9lsw9U%z^s+Ly-d3Lo?8bJKS=B6D(+i`+;6|OcH^t)YZ!pxq+WiOq=-dF0i#+v>9vJdfNhPMxFZb5y6q&xB!APz;Wyk0)2yV+5wmqHNtR>oi)4 z8zaQJJkd_o?}&QW24R=7xvGZFbIAzuSEtM58b1EUxUKtHXeZ-4P_xm&gHa3{wG{sB zVP)TP5vP(JErDayn1TnY(5E|w$0@1!#+?)IV?k=CB+gNMC3<2IFPa3)ESzR|2lA_s zjfT2*CbqDWM;)MV*J6WPDBtFHq8Lb`xXeudgmWuau4yBuZ_GNRNxawB`N3gNC^Gtlgdex73ywol&7GfBfj0hrG6;6igfrW)j>z;Du zCrwtpDQj{(nA~no@0)B%!ZZE z_wz03?SR{JsnUAfC0+JiCV}_?1t2%^=1TF~6ZNxaNJ4nU=vto<`B|oRPk#}*Z`HcY zFc8&7EafxMV&kO?lsWZy(QsE75BXexz_|e-fZcI+;9`3O^`-0f9-(jM4?akU&Ly-@ zGa1#605K9j*wd1u9;I&}7%E%4l^kgxk>&f*pbi3i=yNceuC-{S907Xxd?uhoroq<@ z4Y|m$OCgXePG4T|D1_-G_-1l6XwHVni^odnZG6R;-B;L{ zG&M2(^=M=!r8i=YZeyiRJ0QjS#Ry;QTlm6hA|=;gW|4 z_SQUmQnUBj+efE?Z1q1^%>VK#UJ+nzUox(1Ut-$o>wLK*(OgSNo3rIIf$=z-_>#i$0_tzuyfwP%+G|5)fOkY2_U&ePhRczlX8jrWOTkhLtA-LuStN zIHsh8fhazU5-PHu0BzQ#1pH6XkXL~4zteI1S{u`uK=5u({U=QdZJj!E`Cx#EY%^kH13&rOKJIxQ{S7LJzF6aC`x?3T!*5QUvp!w?y9t!8UNsJW<6XdDZ6t* zM!IE5t@wmntg=LWGoc!@A5+>jmd4KfnWwTQ_TAN-t&7y6l!=s|bK8)d7|T=*r~HzcCmEGJB%8DQ(;`)-WvPBz=$svH^}y4MhWMK!lp zL#4pn0kGKeW299v${Fg$}*tQ;60a-{I9w9+4`BqVuR+_xm!U@c_Z{T2Y7 z^Z=@%7E$RaDKX~Nl*vndnrO%&S}dpv2=&{YAz?0zhyZ*gWbl0Lw(I<~R~zzX>}|9# zlfg}(o(!I)Z4$+~g?p@;_PoK}KYIER?eFF#RD(frfS8DZfX-h?gzS?a}ENe&*{$vL4SbHD4#j1gi5aH<%mlET`9ZH?= zVqbQ)GeB$VG|&js0KHCidIH0G#!Do3 zWz6bypoAkAU!hvP{0S8@ zah=1xb>iBL|pLp{o8Rm4WZJ-UG2RZ4{*E>LSq+$R8$PY zEqU;o@s$A>=$80B3mK?o-$t@7r7hKL?Pry)Da!2Fnc5w6#PghpD7?sy>9E_z2F!-; zrVG7ks6;Ow?tSun1K6VZO81)84HM|leL_Hakt20T?eV1{par;_WlG`NBQhoK%%=Nv zerIFL(g>6ALaH>d?|wkOM#^o1*N4HW@gCvIkmV|chcX(EIZjYPPlhPpIhAmZi0(49 zq9&bsYi`kJT>*XF({zxKBy)rJp$GJQ^k+`d3Ms2SO zJH-S@WlG2S)NN(*gh8G&x|<*c@CUK#0x)rWP9)2%hKNoicfEvg7DQUC|o>jQSsIAeet44*TF7$!ZeL(VEZXQu*vHX^<)tR57 zm$rH>_w&7Sf{t$YC8{}Z%qySL26H16H5t6j#iPzO47+^-Ew%q*;vOyEMb1#38_z6s zy(!Ouc$RAYjl!On>`Ku%a@}4)PuN#hMbGG>kln$$hwd6+WuS1h#xT&~*hA#h z#B{dhHtyX)BnG^DvZMWqdd6N{X;+{Q$N`~Q&ZZ_xSrfWg`U)c@%s93Dk$cJMxZw(9lA{K=;pFtISN11Hgm)|m56nH*h!oa{ZTZih_Kd`%`rk|TJ<)CL_N=3D-jNT%7!55tezqrs!YA^ zFlmu4Q4OLwDoWJ-01UaFjjgR3H6KiQWBJO`3EB@IMz^_x9`Jm`J)sqRlPzm93nHvZlH+ftMMZ@>#psZ@2;Rl0-5a|UE0EtJndNSORi3{5%X;GfpU=$^9TjW_bMOeiqR6Ln@mPQP zgs<`D8^ZGsI9sVHz2T?v(-0h@i`TMEWkal`?qD=|>1%!6pyYfUUPs9;5r`Bx1Oh98 z5Jm)k1(IWh&0oPaIuAG9d4eo&Q%R*D!t|xMzChK%DfV^vr zC~{#|gSFGw=;ZoUbsvwpH>KUPTzMzgL=$(O`Qu~SO9inw`2?RM4M*j`To-HjTp#De zjKv$X$=ii_y3#;&q>SCC-M36edG#2ANE;J{6QB5~T!6D?&Bw~_nL-Ar0=Gli9o;N_ayAx=$xI(#~ENw;%Su@ZBpCtCURLsW-AX9X~ z_76QkNd=4=SKp*@;xcwk|0W^zpM+?{r0_?S*@QnN+XAVg#pSMoH8mNFo{_m)N!^?+ zlp;-`?QmwK5Ohnwp1>5k3ugKWdffSppzY}I$={gcs(e}H+?#~vLqN4Uexdw2)+o*v zFWTPNyD83{&w=0p(`ND5E*Krx!5rIBzy{%uMDR-y1T_XZu;H1L4Gzxt+}eI zyzMe0=c^@;kG<|gqd{t1(S)@GFzMQ;x&+{W$j5}hf6*++yD2#}Q!3pW>1cY;3kp#Y~$IU{aN4$&lMQjp9d zMZED7RIQ)@uR;zjxskzpIg)BlR?+HW&3Ns07o!g42ZlQq<3B7-%}eF%Vcikub<{Wx zfQ(cZ)~+dH+aWk4wCmz2)MRgXMndv+UrXy3>e6pEKJWFajB%Hftj22kf|Mcg66?E* z!&^nh^HI3OwzoB*K|G3hChS`#+q`-!dOgC;0MlNpb4)Z0e3}xMhma%tvFC)nw|)ff zPc79sMFb&*Er~ImeCkzW_qqn#+YZ7n6h)aByySaidhMI`34RaImIhynrY~Cp5M4Wa zW@7OGGa8X^vYhzkarBXuujg~^d!=B(y~8E`=Pc07t_;z36tmOJ1;Cx&MNh9T+4;V+ zte%^DE$!!f*D11Tgq{ScOo%1m?PIopY}T})PQ{OAXkYm^)lGN8nK!SsfM`X*Qe~ce zjD(5~FqkA)Ii{*Y9sYJWd(*i5-Vawcumsd1m^0I-TpyqgE?3awwL1)=$*K(_xr1dS zZtDHp-H3Wc>1jz^8t3f~9_shUcuOaM;40e^Cv1|CLe|f0u{vM`$mHW zR1{=gQIs5%x{-=&pl)?zg_?3tS}_8t1_o6~Ao@HnK{M)AB`(5VhzF!ZDyF1tUEwY2 za*N(?&}Y{_Vrhy3PqEnKpgr{tN30^UPXfo}s3WQJDBk{>dUAi7zpwe(+>wUMJaZx1 zb)LP_mX#Q(a8vD2n0$$2gKc$>7ob$=(OTZhuz#ebiwmw#RO|D&ZM$rBT8gBCpBQWB z(vFo9cinI^-H;bEdzQIV{}lT5%;z0@&iNn*$_zZJ1I`Im?Baris9#t~+t}Z(+vh6F zr@sk(*u6ZJ$aGrkD*s|G5um+`(&8t{jS0tGVjl*P=PdPbbWCT7Yn?uPqR1iH{c{TL z6YX?h?DrQTp1sg{#(LIV>}>c~Y)&M=y1FvLP|}|RA4m3~`hJ8`G(MXg0z6T<2?xg2 z$dRUtb1{=d@iKX_k%r-S*>-V)i0cWjqd>NsXu+4PsdLS6oqmX8nf>klJu&VcaOWAi zNYgH_WVw1!<;fC$o+tn>bad{QM6#?LqB>Rj*okS*0Z(T1G;8YyH$SA}5R_mA<3#lN zglUc$r=sY<)5{IWid?5`b~bhPra{TDt|N&npqx`WhNti6S~95_l!1KhBb!*I;*gg} zw-7@J$+E|3hz9@McHiQd?a)mbY9y0WV-d6y=0z~T7=B#PoE_hM)O3}^lK0V7#Xg*J zAk3dCc#b)jqzl0B@S0moW;*HXNUd4HN0eKeD%A;B6Z{r80;#?O1ujQEp)2csZ4;f! zRF=5e0t|ia!}ZO%vpzO%h-ScTO5+O})&)c#uZ-uoQ`dYB5KFFgHbwLw&1U{X0Ugzk2HF*;#<2T;jGpf;8Om5g2fe&{ci3>JLk4J>T0ijQ+3fJnxl zJOkf-XA0UiiwGApvE0blVWmwi>x`u(rJQ*r$`aWJW za5;@T?i)L8FAx0^J$DcgSh8FiDbP@tHnS+7#(Ae8ss2ktQV7i^O*!8X0AgiI-1VYS zm2g=qbv>bLn|v9*mMLv87^GT_WshAV7(^oZ91j{K^I_-fLM=v~Ps@Dox#)f8;R$;s zj;HepX$GdQud#$e@{sq$=l;EBYJI{DfnJB&Oj*}Hg%jadlWC?ZJ+l=NxXsaQ#{Lg5 z3tz0iGpM0w{TkP=Rw2$6mH$d9EHbPt~s49A>9W-pP? z=A2!#d>&|(`oRg}aAQg3r3;6uje2VEZ(!bs6_}hCGqiZ`DtRkL2b4|o1BVWjbA~}` zL##^Dq0v<=6Vpoe#r|?R7r(I$Z*~>fcUaf$N#n~4I)aOLpg=Z!+a^gGmwKGTc1%9+ zHVDD+##^mdtm{y3!h&w7d;2^?Np3c;F?G&vKbZk0YDEp8#a*n(FTl^FNCC7PF8^CA zU|Tk;Cp+B7Iu^k`_CC`by`EbpJ~<4ei}1Ngx6>9YmQSJ_S~0apH}b7dCi;X=1rk>M z`%g)of>M*28zXC_hGy*N4-(m799g2=ZIM zI_QF8n?0?F*XJNCt4skOh#oU$C5$V=(YpNh>SYU6^G6wjRd}Yb-C6n>BHUo$ZQYPm zQt~2A%*B_NTfb5^D&eklzh&aZvxlpC`rx&C4{iarxjFCTW7jj>_Jz)_YgmabrqnM{ zXOEYc?mGd~S=I%R^8u~T<%i3MRuOV#?CtK$Ty{lC?=)GiCHlsG*Xq^6>iMXxWOLz> z33JD+ayg9S$MK!KS&w%tZ^`ncqzjR2DCQx*wMQ=>YvqE6mIVqxyKwEMS)HTRYHhrx zGq=_euu2N`t8bFW7f`2HR8{7tsoOlA&H`_Q&8_72(loOe>J@2chb6u!IJiee7oQfD zyXKc&QD`jDy#E2KH~u0PHphK`J|1 zeOypHphoks$TtJS6Zu|B^xS8*&Nd%B4Rq@ZWF`e#iJSANvco z(QxUJAVa%PoG#})gBT|O;sW7OsNeS6-*d60@`YihRdf*E$r9?LVh_AmzeJv6A)ZG4 zr<+Zu{=r77|0NV3XkNjb@tgZgtz_{^!l$gR97&WyN{JovPV%Ly%DpZNWbp;c_4i^e zfojuw*b3$ZTGQ@XyMY?#9=AK+r(AW+KHuMc)a0jYUKDAUZ1o-0ep{?MXM@eWvhRd* z5OqI@8lwSzFkmT$ulqVzI~H9gg6HukUAK1~qHMrFJ>`Anc&j^*4B-=_#O`N$60T$Q z0aImlT?SOxb6wZ(qS_6QIPb4&wG!n)0W6xn+Al~JAE2fCZUK7jn}g7hN&V!pg?2~| z*9O3vcv{ZEWXQUNqQMf~%IY%YEwt|qHTg4iJ8nw4*~Obh-FW?-jyIO^M5>_sJP_M9 zBxe*p(FmSY-eptb(gE2cUPgek3<%I9LOTWy*(L(`gN!n0zd>wq>)c8p^C-m0!gLaQ zGA(K4x?bGN=^1X@ofF!KCHkg01ZSCB$k1(Yq^hSiX00(3b!sBqLRr_={zhP+@mKFI z&-hjYSU+|1fEAc@F=B2S9nJ=hjA=Aa-bj|tY<<;zCubFD`RQP<;s&u1b1Z8_9Ks)5 z9hPX?kTJHT4*h2Lg|cOe#oU4C#YQuroBW4M9b0| zd?T8$usQH4qVoeHH5Sh1M7BdBil(OM)ULW_D;OCILWj8Pl6yOz_w|ew22kJ)3`e|B zFSsN&o5iaws=BkE&j#Kw;k+BQwH@3S*u0~`yTQ8S6a5@Tvj(n}EOQ~8(9_w?E$sT@ zy2ViC8!R}v6K?s;EOw+X_RuJ-#%+9?+wFvWwIf4meyQnn<_r7w@b+<~ewU6`oXIj$60POf&rGgpu>`3@UGVoJ_TsQVv8lPJ}eZ{xrNI3-n zRpHSDI5X@{^3J|#{vDUyd4u@9JB=!#^1wu1oG9lbc zi;g)J`(+b$d7@=b@%1c+^@e$0J1U&-%vhi_boTnl^8|?g;DVSv^~4ja3%)M`7M`IK z?m1Ado)%j)h-O35S03leWg2i7rDGZc&MHMeu|YT_YRQ88#=xTuYim*ztw*ZFhAm9A z%aE(JyVz#VVv+`R6wzr^AiM;x7rUtW!{YG$fg(;lJLY#U+oaCm!gyAq#W`9g2(DYg4EKY z2~xowIni)74^JQ$Din_#bqD&K_x5)~r-b2w6!wts4?T2!HYz2n}iW@>{7acZaE@pVpYA7;t8t7w@ zsQ}j**ep;ijJaxc8DwfgY77lWX3R7{n&u+sQ?@C6{pq(h$r@Xh0r;^NII|meRP}+X z0VH&5@9R=Bws%QWci!%vcgkYo1G`rg@j-l~07^{|l)YU|r4wNG0Z!8nqSsJkF3k7# zzd&8$niLIE>6t%ibb?i`LRKT+TQSS6&Bh#<+7(5R`PNL?%6KQ5N2}kP(AmZFb1 zB%Zhq^mC;sGY&6Bg9vbrWmDko1}Yc>YJul^s56d(#>dHr+`8(L!?pM37USs%8JAdCxz;ppaoOWa5lLX*Cqi4B|X8SC`w(?X+j}Q zRl0=e-_B-qZFL`K9D7~7!_NDIujpnPXy@Ql*Ode13vZcD;-&V1oC~uapKB<*E27L1 zVN~X6?VmRp@Kz?NhMJQbN;j71Is9l$8z0ejND90}(2j%MEy}tS;AeNF7Wz@@+@qBA zUC49K&{ic*)-^y6-TM9Z#^RV=#w>Ip^cZ9k03C1pE?5$p) zT!hoWE)z}_p-&FDJuM$v z8gkuOcWpvdPkp5m_w*#uYjNW%%z+76v>!823y_XHOdT@3M)N)7X>vZ-gcSzlT8W;f zMGIzN$x2Ysj*W^HWpwECqpwl5w=b_KM^Cibw#_l+fHqDl$o4<2$SeLegvNs1b~pUz z_Oo(<0a542x>`28kC!dDYFj6w&2Q~lJ1NS`pvfMl>VlJsBMTBF;`6;Q7j{R?7}Qs{ zbXlUXoD2&e>bZ6AO@;^l1U372o}-w{5Dinco`X!V4c%+b-s-6HJFeC&UiCh7OW|?p zcQf8D4N1yEbJEZ3Rp8MYBfDGi@H0|-3^JP&y_-)br+O&GJt@ya1ewEegUtY=9pA@Q zR|-%kC+_PLZbI!XM|QjAa)f7Zest{J-_eq7o42*KFMN)?I9A@|kN4@6ULms+7;`)% zV((5knfgXMer`RUIHAW>=;s9(O1>+?BR6LOdXnl@OdOkwVpoQ;_OrH$?`SVYB|AG1 zn|0z;$TOO)=NTxSUTf=j_*j;m72s7!J8H)tvEA|N9<2;-yXxh=_xssr3F*Ob2VPP0 zriKQ>4X$~u$$P^R&ntu<^IX_rQ+*#~C^F@q$UP*#Rda{BFYxrpo>c_uY~XqG)j(Rp zlU%nCPCddO8eCrv<_q*(nNEIi=0@~Y&L02Xbog;e!Nlxw+G^j1v^dJXG2v^5cLvE?Ec%KjuSad>1!r8)v4_Y~gsmzcj-X=6^kZHUM(u%@ z@u?M)ds0m1QG8#Y-BgtibzorkQS8=(p#vZO78-%v>?)})JQL(iU`s>Bp|&cln@}qS)RFOzP;al&OUpe znfbnNX3ig6T#1Y2y4L#rp7lJ>eLwfz8~1Hig*n!F@2H^L`!7qwt-o*@Z{++!4M7>zAJwRukFQPv@YhgSL8wTJRP*+fxvL z9WNRco0ul(C41|ESyEC?FE1ydmH0U`-wl8%&?EN~Oyqw}J4%9ictB1OCF$HML8$$E2*S1*sL&PlWr z@;+g$wlzQ6RaLc{VQ8u9>f>>#k9ZNMD;M^*rH$8-Bru`b$xvdH_`*q;mWPFkmwYBr zn%I1ce7z(NY~$qnxE8Avv}dA)8J%M{dvv!m;2x^-ZSWrc`B5tN`wxG?HN)ND+J#F~ z(;GBaADbdv5<7!bZ+(ny;|h+4^?^fO;Pkve${M#+5!a-*Ag-4vob+~1wJ!j8%&m{% zi>8NNzA^v<&W8ZdfK7G)i1IPeGcaYw-9SVUMJy_85(c@;HdteXuLuONRb0I!8$3Ji z8R`qq18iDx3<>$lp4>fQJ1zZg6V%1!GnphlT|62BJf)^`AdW`5ooYFI% zf!&pOW=w%Zny2P@p>0Z?KO64F$@=pqR!Lm-=*Sn&t`OkMw)V_qnig~N-eVXHEO}l zYGynxbxOBhgp<8Pj~>Vzlr}RiF}H>b*Bn%0wWG(UNovCa>*5J`cm1n097@X+?0v7Z zWGcjln-pw5l6umX@rKdBL&kXuCY)oD+~bt5jz6*dtsp051fb^RXI<6M@ zbr1MraPm`6GCr>E*c93~u{@Vqzddn<%*=$apG&Y^`a0gki#dH{lg5^x{^Vh-2Ni)< zP0FgU$95DR0yFD8(acX?K2F$>^={`QnQieHh`ej(mEmP)?j(&Y?9l)? zawr^cxBaJ7zbjIJ6NwLK9DKadkRYqcDeP>@%3y!tx%8j34Orgw?!pnSj6 z^jamh^_`>poM!r#ht3CRKd73a-9?En5wz^`$oB_^+sYWH8YEA)=*VRK17@Yx6g#qY z^6dz0ZIrAQBydYPM39ZU)J2LeUevCYa8x)goQZZMODB|;)f)A-Oeu7>vj`Z3vs*e) z@o}Bxfjk!&Tlm&mFNvS_mt7F}qS$jc(%O;f*&{x4E`hu4%kEpY5LVx(z*t#`gtd57 zNXzJ9ROlQ}dfv>3Ro)2)CGdS$Qz*L3^C5O&8{%$_dg()K2Bj0xYbiP8tr#aiMtcbvL#%T-e2NKODHyK zynS6GM#$|G{!3>%zNKSQ;IxjNDptXcV+0>C>`s4wr32NTCDzbXBmJc=OhYyCa)$2) z-`D+3(+X2oEI{$OjL|;xgq(;EQB}?XP?`mH26!4%6Z>!LPE{vAhPn6q*6(##rEW(b zR>&mb1Bc&?=luAIb&MX-{ovX2X4;Tu&PnSbKtH%!>KfZK+-%y!4+Zw$4{Xm_5TJ(q zaCV3)dx7|3$PG$uxJkN>9Ibf@+vehMKP%GcV>hCp4pi)s>83tp{$PVcp$c?st0vr< zeNZacP-ME{$UxJxq!Btc+>VpNW;`yQwYByrcw0hHAy<#mz|46sj8=}4=ky1BH(?!k zwbkV64g0b;`h-5<^K=qF-w?JC9OswUN;gDRqDC^-I(=DJB&TbRc)e@-!tYdRUDjf| zEGutufqiPuRI=Y%SiB}?^=)9t^P2|Cfq@$W^;m(~KI|?k&exuJ|FjYh@e z0WS!^vOg9Coax|Ow-6^!&x1S~!n(P|RI$ccH^zx_7){|R5teU8rjw;&jm)!L0*V*h z*#~uC<#Ao6A|u3Wi!+GJw$8Ka7H<=(Z!}QG@47!~<6|h7o5=M4OMBc289TcDdDvkO|3)U@5YL86TE zAaDMVCL^;Y?mI@?iu3rPb{S;WG-(zkE_zmFFB6b$ypV^QLf9o#!5 z$EHf9z*+pcW^Fvc(^3h>YD0!z9U?NQp3wPOVLwffcUX+PUmlG0ROHl@vmRb6+?5Nl zd}LqhQ@6qfeuA*=$Axue3bfA))nI3*CF_efJX1P0*xX89WK>yn-!;C++yBN%*40!K z2Z!P;D?QO{#OI5x1l8AZ1~ECQr+Nad5>=vKl&F_7(#8l$XZ3)v%}X?t@CZ^3_(!x> z8f^jfmJu=T*n6(gYT(Gzj2kx{pdi_U(X1T|JfBcM9&;sQ?jsb(QniK34AJVjsgU(zZ2-C*iUGqSdCn10>)fuw28NNS>PRx zX9;H?@tiS;DIUk7VqN)6?Gb09 z7;q&XBC%-_qn4{$*q$iI19XP1-n6ovi-M;E6*$!14soT1o>mo0Dw6j^vb0=HzFuQ} zjooDNqOsU*@+@xz@bddmPUvq-qf0{umo-VsE96i0tSG~hywJ$)&eznMfsf7jJnaB5R(Op9Uu)+@ zqeY?x8K#XzMr;d}o7wP=in!spOF&|z&oWdBlmhxaS+XOFJTNCa!%8Q)v0#8s!7jPCz$ki#w&AFog}HI5vwQz z?CqiLoRKUw$9EO<-`ANHAMFiUWz}y-{se;a7XTMWzg(ERIo^QKjW<@)GC*Ip=Ew1q zDEzF+hkV&_tSFM4(fc2kX>yHXbt~OFyjQSU2vLN;D9vi*PpY0X26cDFDj2lOGv(y% z0R7lpc}C&`rf1569a>cEt6cgDm%<@$k5w}FB5IoE!%q>n{C2;J9qTgzVG@?q!NY?) z`yPgdZrh1$v&VGd8ZOj@?66x0%x+Ne1%bHLvH>JQ1QWyGEla`iJlI$eCKQ1 zVhMRKFA-;WxB?7!L9DWUZ&aQ#eB#Mz2#N9H`(b|7gX}TLNo6j8E3j8yKX-`gZ;H-} zKl2*?ruqKw!NdPEd;$Miy6gX6j{hH|-8xMG!A|dVN%6xHATsjoUB_4%35EAP{-Dn4 z`JplHFjF!s)2<#+xo8Cw#YTwk!U#Y7W*NW12-q*{leG%r_&c?Nii&qM4>4nZkH|IJ z^r+CF4+ri>n(|jw#;Y?2P4?JazPp2_nImG=25&Y$iv(eOjj%s`pDsDl!UEkzDl5YB zL}_0;Hfhm3qufS0&K)S&0t4y=ctn>bXAg&E*;%?*K|!)BHFE#_tZz*24yV@m>kKgZ zpnM0Ahg8sBBo4tk_B-dvagPQ=D|U~Y9@c97ag%QunbJv@G$^y2crPvKB|*Ok7KR3N zG3H#m_0vLEKFL3qIP0p~iZZ)B9bW>I0uIGPpz1>%x3tB+SvkX6DXkBcW>6 zfh1hJ2K0chVMp5T`O0EH+0gj9v**?OeAt;55&XIxnBm~i#*qJ+D1(JrgBg9b(eQ1Q z^I0?BARbX=zbD^G8`JoG%S=JVuVi>FoAE9-45iIZP~jHsn8B!~=S-^Q0z}zKor(`U zXWz13zd_0H$|s~1*kR$FC;X934@wEoF|2r1{Nd)D@q@FdD}?^WJ3F2V^4;tp%Vvj2 zP*L8@yrGR`-AU#VK6Lr%9c|C$@TMd3)JbXMEGJq08;g$bDq)gGo%@=F^p7DIO(jsB zfT~f1x{D66$8(_@wm#e#d5iq3ctwzQ9zb;!3C_XsDrS~Gxlt=*HIVv^2D}OJiZ6tO zeN@<3eW%DxSVd{%y)5W#g{X~8^PN)R>1bE(hgd?yoL?ui&GoSl0JiC5D556eZ7b8Z z_#Z~PvYvSN$@*C#;=*0C^Zt8Fn}fr(idPA$q|2@6Hh8$CT3?+yrjinVdZkM~uJW6W zUbU2stsQ=<#N&gh2pMm=O?aLMll4>WOMm=sPUw)#@yol2b1YL|{C*B{e(Bwe41$C( z*(%D_;`pO$1>j6kCc<(Q)%7E({leLn&)EOCWYB2F#j@GutqEw?WZfh1=h%(du==xU zFw#QTJ>UEk7OWXPTe+)b@$3WYPQ1GG>UbVbs^ih9uMLm^c!m&_-O({#Bj)?<7Y42@ z1?~exV<$=%Cnp9`G1HhwAXh~u?DyJ_{hqEE5f)Qe)DCi0jN7+%gpBMlXxg;_3E;p;l$S;;DklPz-KA$#50jmL`#S(@H?S3r@)k<6eM zPXj=0=f1!>eI=mmu>Owe<1x(-*u$YOd*@p};G@;zkRE8{j+wN=zl56I2oj)85SoA{ z`v~yS;g*=6!T{*T`~CFeJINjBuKU1C++Z+Oj3W0u%xD`Jx?#P2;jEx}l~%MP)!M?0$}G&HY%mjVvS729pr4PcmUA6lQrI{O_hrTO?_M;q z1*oo}J~AVD zoUo#OZO3`Y1$HFA|Dp+s-GWv0@UY@o@rWrn8vG&e6f$*md~6{-_r?CSC9KQ?Xk#`v*1D-Jk%nJ zbfe#O{t5EiqDxgm5M$ZzScNJG@>Ta+9Pm-b=|=+z5<(YgeXX97Uz23c#`zHA@T0A1-C!gy#54bqo30L}NH9@W zo_}#02(pkr2U%VWJOF|=hbdXZr=e3{>NVmZz56X|uVWfhPv=}sVy=*JH<>=F(Ftzs zSE}zZrqlmJq`m))>Sb#)!F5Tlf=;PxJ~rW46RHi>c;}1A7#xUV-A;5OmpCdqlXsLq&H9Wxd;eKj+Nx z>!DOS<$lxOQKJ5?b%1X0k1Xf8L20|noN#a7S;FnVXQB-hMoI=1alwwq6` ziLAdqj=e*92N!MehZBSINF?ZJFjP?i(Y-)_9YDZQW2@{QsFU3{ zd2XCfH!B=4AJ}CwDa0ZoDje+H2y{#p$+bZ}K&GRGDd|&C&xiUx907`g_uFXfc7~)> z>cCm#+cKB?YF_byi3_6Ud+PnsiFN`#-cm6+1clu7B%*>Jj|gqZ7ZW`NOPUXlgPVyp zt1D(-7BiRtz6h?mD~k`iy&AG5FHjsKtZAkrS*?w?UTM2=g}a=3$qQiI*WMrOB8g+6 z-3q+zEyCmWP3mT)s20wyYK@m~9RHvzb{@MI3zHdSE7!-=HIXES6qx}BhTfX`QAg#M zA+I|xJ46_4%S%pB1y3-qn{pAfZy;ipaPVk(b!Uvd!#po@O_kA&CY>S*XO2X%cMgQ* z468Iy50*8y=|LGR3KLUT;D0krsS$SYbB`B#?ZGTa^a=|`{B&x4*8s}s;4cWu-ElcF1o6wkxVjP>(B!rc` z)aBmsL8lgH_TJ7{J2KmW10YWX4e7e}(f|*M`^^u*+5w)Wt%eXLM5^c2yPE-zKX+^2 zv7=f-M$5lIC!wPtl(w{H?j@!QjbabD(&Kus_--h%JB;b${YG{jEOBAc<=f`9bvVg9 ze3aTUn_%Eid(@2R5@aha3`nbqF<=JBmL%jrx{$ntV1%P4AkZ%-d>`ED@yhr5VH>S; zvpd{DP(Rv2GEutyX44FMwF}B+x4>FMt6+Nwsq|GoKQPMzv5fKkBXy8wKXg{>)rNYn z#CP8Z9D^bL*I*@WCs$OrNYW|uc5k`fimLA~nte38p5bw>k#pesg3?)W3)qH*mj$oL zb62%Tr*ba(OiN6OlV(Yqji^QlEVDK}H@e*f`Lw3JJiC!-DD7cpMQz~?(vSPD`BXlk@cuPU)8pGt(Pp`w^`+0?1qbSm+QiX+A;{bwX=eg z;MuJozb-mAPg|nCGpl-~uO9m#i}Jy3u9MiD{Bd_$#|T7?=R56?W!4kVu#1{LaK?cP znO$}7)?7o$xz!cl1;`?TS|lfYmF9Ved@W!|@A)wQH(nICS=Nr9b_6i6b7r_*uRe(5 zfu(lx2os{bEDEWK5cG_Cc2x)f0DmnyTfx-7qH}Q4QnbL-BO*9zTB%!Pv@z+h$tgmZ z+J_58i?i2XIg?I0)PaUuNfE&losV7Jn(#kjmr5&7cQ2e3bHAw;JG+Yb!ipOJSrKKR z5%Uo2ql$1i8W0z=I{UZ`1sX%Ij5LsD$)^j#uF(f2E&RBN2#L6uX9RN8^jSgZo7%dU zh9t}wf8vVD3;XbLKw#E+;-`a;J~P%zneb$ucGw-kY-+f8~26BPt1E( z$cAn&yY8C&0(Hhnp`~IZ1R6zH>?CD9kOj9QcIbPNS@)1mP(%dPH-@`&TK5J(-c+IX zzK<+E)wV{}a+*9oyzwekZ|K<6+}B<(liW(Chg-n5i3$zwq^+R!9>N_?=}xn;jrHrMURckUgajP_lXQay zAibQrTGeu~&*m)VEy+8eR0VsbT)F2#Z0%MSQxs}^o~^b9`xallhHvX3tF1r1FT$75 z>T156mERPHe+ty4@KX4s4uB@-W;4FR31^ntrU@9qJdH^m&BA$(ioL0Fy6z^iN~;sK zu+(>lkcj!KgijboDtJfFDFiR-cnZaHS0B$7p8mn>)QgG$=s?=MIEi5(#sZYi|1_1n}LRNg>>Y-|#ZiZzJVWxC_;c_jQ0mk3%8NbPzXnK}|v17f|<;XMK_+jGbT4xq) zW)LU{&)m62UJh`V0-OEAl0~e2AhC}3-84*E9@E5%(aOW|qR;ZP;(edkL-j^?C|JDR zOu@A=d0SfkZ$WC@GJ*p04m*pVtFm@>l$o2G>;4b$DV8P#WF@TL6#tqhN+#} z>~_<72<}gunwL6GPHxTfv7ez;-o^q*e%puU^B_kU5Ci<>e$)RK_ z2hr7!+=LK{U9XjE)QF+nQI|grbYWo)Y4TEhlMooYIN^gH5J9g*pdBwx6Qvt~8q}Ug zqj2kx*A1p}LCYjERyz;m)f3jFfm78ZsCq6f<7Nc~eJA`R?XS~U30fiMZ&4-8fMeWc zTf1lawS!6A6K`vJmvM~Yf6Poz*FAjm;!QMx|Aq@CB|O}9zA5Pumgi$J>AM&qN^89K zrQUapdbzl2yqHaO+rE!?^@xurmmv#$dxmV`<$N;+^ z^0b(KI2Vjx3wOTM|M9$vXNQ(AQt!@Y7U7kXPc#Rb#OG^(bpyN_4y_N$JO-aOjJ-9l zsjI1bFW;4SA0f*4!MPD~msH7+4i z^RPbhd6V#ucgN0%`#@K^nUIHZWHBUaV-fGz32CEkv-`0lIjsqVEF}Fk_s&IeKwSzAm}1A zqAe484%kL9pQKl>H%p;c(iiDD#`gem(D6*cC!0dwJPhNeBNOieLTsj4bGOK={*@8r z|En2K6%;t=HiR)u{$!4n18j5x$_8HSeXtHq4H7`jV^mGJ+cCJz4hrxpQ|qdy56mlN5oNc(&hj)A>EiN|@@|3r@~f5F zO)-6(a3~rd;l6FBHA2_+N9gwSgB3IOZj4xTY*x*gKqrS}GiOU!31F1Xj;hW4`h<0} zCPU}k^qS$L=!vQ+8xOrbTlxkZ8u?I)Kg;~8@9K&}{f3{NBsh#jU-!WhiA@Q;Qs`2_ zlYXJCsrO9=V;G@sd>W<7H5<7qq}oPPZ~d^(U5Zto#pMLS>G>|fp#ZI%-z(q)#Ool)^{kKLvJc-AXEQrB*R_B~;17%!!cSO03q--MpoKe5|A0k6{rHkC=__cm)KdMW3ZTH%N z;i2B=QuX6o=hB6%^V&-vN=8gE;X*QHzIqUOG z(+C-ktC`t(Xba_-pTDrg={&-=bfus3R8#A#z<}fiZU4)6W?A#f*QM9vQNcQso3f?_ z?w9jvj);hFYDAs;sG0j&;GvQX`D?bes~#nHQOvbXPDb4c4=#noN{`;j2@C*n z152g3yQE;+#=gh|I*oc&$Tg=fTB@x5pee&FtG=`Z`2Q65HUx|yEY_~GPcYIsQO`oN zRQSnsDf{>`K)1-f)rJkGWnP$YF{}BHC^dku`a2o1GeRu$Ogp%>N~0wOpU?M+n2OyO$~2>Ew`Zt*;41@GkN_> zkaAe0E<>q8`{KAB0yyQyQIt&{EJ>}U-m#IsmiSEO8i3POH+q-mRe<^Z5m$fIWZFl6a(x?T+zr zzfGyWBTmRoz}^-8mYW3vhnf!8HVc^4*<~_5uO7`-ogAK;<@;I|y_n2rMd7@wHF_8$ z_NeYurLu6^25ZG*Ke~Bob))kF$V5ziq{ir))u&0rb^OODYN6K#@s~%pbtr8bOr!GF z;?)_V@~75uYAdQ5YAiP_A)WUFlX?sbeP5&VhFfc9It|r6&-0$XY>E3i>n(gXIY4~ zCfE@3p2N;o%+#poO{G`&`p>5qpIG^CEjh>xJ_ZOap>d0GCtOW{;a9L4gis8c9(8Mm z=+{U#)W*~vHoCuCVNPINY>NzjjK#-fmz0O)8rT&70>NI+@Lg+ZR2op6F&=glM{FA@ zJp1Y=mxS*vXZpCfNL*YB?lG*$BUGRo=Gu`zYPZF7KBzqLNKN>P!amak*$mL>OYSK< zb7;^NKT})Q`MRM(ef5ySqul4uTgEQ8+(SFu|3ainER=Qa*4pE$y5B2HM`Z(4?YX#1 z2c4dtfx=wX>yg#>Q+{ZgUCzDW93N1A#Yvjy{h3%t7WWU|-7P<=CnKbx^qZ$b8O~l& zXXDe9s+A=T9(iUZlX*KyK8}8NH$AlN@ASq52fur!yv(FtWShdF5H-JXG(OH!sARK~ zZ;+ra&2D*>F6$OqimYU6-g<%di1>_#9B-rKI9AX(bIxA}wAy?#GsnhIC2L$(>w}e< zWoHVq4r#E&cX&gWY(T@TaLU$$X~71Wa^#VC?iptOMWPgFF}`hakMZYI8^ihJ@)?Qm zVMS9LI=ovpZ+9+P=yf|iP8180KFYq3V#GytZc|z8_WUPta-|;{CY(+^16ixQmMV9dl&E%H6YtG8NZ_DhQ0;~mO`j)ra{Nql z#a7x*d6IKIT9i%EIf%M_0Ay7B%(}t2 zq0_Lb!9IOM=VPqgc;J)XCgMlj7Y1$i9h(Nd=3KkaH4QgQEQ(aZ=yhFWAtNZB8_`(FasttE|lN z!=>Sq($W@u97Q4#HEa@jKUT&M)()kv3MI{T-+ZH@#I)+kI~_o8gyLXm<#VxXxS3wm zq*Q9}Wy94)wn6sFStA!_cYlaOZ^+F=?ukvnrF4OZAz!$~YUq~uE6QGu)@so6bnUwP zY}(Q4UKKxjE~u89L05f|Qu|7sY)neQYi@kHm!qf6)f>V>KVR}XG0@O4FkU6;l37N6 z$^%?~8sARH@)TGVDaBRhRew=WHezqTqxPM8X+BkRyr$XwiCfI$??j{4)O)p=7JCb) zWi=UKGbL7Qz^mf7mGyu7`5Te37k>kT6#jREg?}ZX|JVMF{JTG}?fYnPjHh+LfcjJJ zN2dz#KH4GpJg}^WBkn-s0EYa1;serlE9t%JQ~yEe-u(mcQ91k|=P~Hu-!=#bz|wz9 zN9mvZUeTTa^gsADmljULfxg#U_k(2L8LT6qzt+=w1O&q2$<6gUpj#D+6aLbK%Yc&o zctVLSpkrrEGVZNQ{H)jQ9ooM65{Q*Q5cI8U_nZO0GBG$#oNPnlujQLIr|nl`H>L%` zIenjHyS+8LqoQ2F@+Vs#0PDamk<_h1AzQRofJf}5hQ}+UKWRSw)AXBvi=Oj8q{5J6 zGHtXl)oLsZ6{T?|o z$;rj6d)TGeH5N785>;_)jCi?X&VR(4H7dJ`KF82N{<-mSucS<@1^H{aIN@eWnQR85 zo@x6mByOYwLT^?Vi9#{8O;oMpt*=GucUEx~zjFP#M55?vHYV&YYBRz-(Hn#$6o*A! zM6r#OPK^|Y+kMKbUyQlG^z~8kXUQIxM`83)+aA9_-P7P$;>Gd7G8=)P>UM6YmsUj5 z1H8$@oLplWO$ESRhTzV)D9O4shI;fVl-fGTJ>|r#P}Ng##+!ns?XZ0}7S;~>>3`d9 zob_a|Ljm3uK~~vNqtSnu2$obRzh-qFBp1dX&4FB8J3w6W|54Yl(9w9$3SB~bnI})2 zrF)*n+#)F;gdw-5o9dR9H2apX<07}=K86)lQo(40(d0$#*?)n{u=d70@qxXebt=eK zxQ%R~n($S?o%DD4UmQs>;d~L*H=Yw~u*8(;WIp{(j3}}f$G*lD za$DAYCKuKmEEV~=5BUTsfNo3cYg1-Q;8m-`-3%=4U#$%`y-`}Xn+UTyc9LRR;N_++ znV0`T^jlg8;phte1q$2RI+TkF=NQyRHoxRjDKDK_esfu#C+j`nt&;?_3j-@iw=Ly`Q09Km_y+6J^kd6C8BK7JLcj_@b3?St`t4sA=Fu z4XiAL=S_5PVRkvj^|BU)+j#O&dcc$HyW#xlDAN&!itlvG66IS z>eOx6BwfneSrS7fUj zH;J1u1XrN#euR@EHO>J|-Qgkwez1=PUAD6v8=3FRndc(?RmUxT2`tMFn0G?BWxXT?a zJVQj0LZaM^&D#$4Ly_%9cml_LL+xAUnIGf6GH3~aQ5@Qx+GIetv->0^a}l!LsOj_E zE}V}vi9}8Zy?m)f!=G?#F+k-O`CQ3Q@C7>{d2n;Q=&P(9Ugv>y?Js`vb}6N8Pyn>& zKz*v!q0ar%ZbLyBv$v~W`(<Z2{Ku`I)tk3+q}C5$)yo}NU>5n9o&CJFsd z)DF)4&*m3IRrx=#+fX~#Wac_N6ANM-4v>zytTJBXI0>|2HOfm9g!-eRq%FR$p{=60 zJkAGm`K&g(!2!)Q5zlZA2ERhR_hJCaFW&I238 zPiKt|9#=bRS_~*M=rXgHm)Nrzg zlJy6P0)xJ6E47YIOiPU9MBP#1>qS~x69<$bXT?F0gWkOIH5tM31(EqaDnt{Cn;zr| zWGM{t?A9VIjI`@^%MJwHa-}T%@Z8&^1|$vCP~~ zK(5+~vxjX>VL4}IM7d90+3OK`0|jz@Z|a=Gxtr31fpR%1`FVy1Px66@mrBKA zrvD~BeW=Oge7yao;dV^g>UZVJZ?3mEX=c6L*8q^xWnOXQ?O|(d78AjayGD*13w4zLA5gKcV@AT2-RplS8oXY_+=#L;=S`7i`(5= zYBKV;i843nr53Oqk|a4q^jv&b=Vzx5y`y1NFqwMKcb0sJOD;IW$s1=tx-$gy^k3H2 z47m?7P7@wHyj+SL;l3|dZ#gq`Rg0>e(bu(`nyQGPp_^`u)r%-GIe&R!9c$dnnr#(h zu!NIXYULE)WqfoKu{cOgFnXkT3wI@(=Feu3O|K~&2E?M(`~#3w)e`Rx4fjkN&p9QzIZ<({{IeO}5?Ua8D!aW3-J zCwVUN4L}{bi4*MuIZt??JtU4X{1ieY&ZbF%+0x zizEpU(mUsGj!GaH?wi;j6uHIRm;RY@{@CU5&Yj#lbtAzkitowzw|;?qgk$(4TEGj9 z><6?*c7A83EN?^=s-)mE%BJp1XNISXadAzW1u#=x7R8&D`*?lHk!Otd>?P3B5a#j_hyKNPyvuAcj*`}z0{FX(Jo;kLX2HuxFt z4WZSLkZxVq(A`AeTxx2oiNE#kf@m_IIkS??_seIWl$d>?i~Ue?|K5{#AKw1x7mu)W zc6Vl{&=i=xuTJ3(daZnLu3FwF$If$s76`-RhPn+qF?j}t1BL6(=EtADh6m}ICj=}> zOAkJ|Y`DI-8_v2=?GLP3Gd0E%BXv4iXI7^K*K>oMap@kc)_Pz`Y1;WlHgnu=2$2(Q zCq#>4@gAxfeuZqU@i|1M$s~$Dul=r5*nWu5z5u5os$-Wr(?Wkv1c?{AnHaZ~c$#0m zDB0${1x*NmbjmDSv6n7P2b0vV!10&Deu0#|s~5G;5rUwRCk34%%_LYV05U1 z(7412U5i3^g$7{^`>8YQ)|j}0Mmu(=LDEWV^zp2qK~(hRL@CA(?d1G{?PYOXM5!@h z`3Kkr2%SMh%^;mg#dNM{j@MIxnfOUQ7QTl)(HUpf=R~3ixUfzD?UpxgZtm*Ar{orQ z`UB7_6;HOBVxui&ii9`e(7x;oY4s3WW8E1)J!ul`H1{!g_^mJWDHyHSifN4`-NZ>n z)Y4m_;!}*Z8XfGWDLR!yYB}7<6q7Ew} z>Z0sQ?b>FhyH;`+-h{vUbo-f#vMzZB8Zs?mhf0HY+0!n@%!k^)iHF5$CSM!5DK^u4 z6FDpEa6|dUEG1TYW-MMkSC9W@9+ZhF0)(%$x3%yl4g6I_Ptzk zf&C>JX>yqgs!^g(9xS;1Q#*$h%FGdS8g5qYBKYY6XEddga}$r)_j_5|TqnqgR(}%Ha`{#~7_a()6t%kK|Ba#Lc)$Y4OYg%+8-Iafhp0ZU*Oi&&P8-Tm*}*PdM}54L zZFNw=`KJoobkJt?>>XpB{i$k7i^KPH+;@d)(|iBRt#o^F4n>k-iVy-Y==!63z&H}$hoL5QV-k{@!j(Jf60Jz48nrL?%FG4>B-4GlE($WB`=b;kl76#m4H<$vZ zHHezlM{P!w2_79gy5`K)g!xowB)^ia+#U{4EX(<=Kl)ehNf5M)FEF#81GHA&%Po+E z|C>nZe;)Lo_vt^E%Ky2$h4IgVI6WE|Ff&o6M-1s-U|dr5g5iK@kOCkY6h}(wfvW3J1xba-8v(TDaR0mZ zau~(hY$Kb7aAfQ_%?-EqXerR+K>t6=6~Xj`dB=CM6Hx$r-I@>pw-|6{ol^V(+4Tj6 z<4B(Dn?pqzT2QFm>@ugu?l=6ON!b;`ks9&=C6!ns+3%cf>h z+ez`d)ax`@4l-7HdDf*f`E{Rs5|C3(JV;)_;xh%m5AsfTe*5NP@SdG-BHn)tzNaC+ za7zCOi0b?mX2bI|Zay+Xy!VW1sDE7BDAs-D|6&PI3neBFNRd!a;cF59xc5Q1|7y=X zV|7Ey_b1w(@STC+iJ$odm^7Obh}=V@J1~769Am_xg4yYVQ!N9N#V^|Pz6tdn!qFNm301CuUgc$= zHwtbCAIQLf)j=5#$LRtbORVY{gDDu0uFC}zUw9#jq6GjtFMt91J;A{H_{T309nd2` zxj+Cuox2LW;>7`@#J>StRsYOo(NBk??!b6SK`p@Fw1qMo1_fGOjUFKgKb-aF;X z5r;oQVN^p9``%J*D&W<1Dt4~L$Thg7!n0o>U4n_nbmrl}lF>#S#Z8Q5d=CeTVbnM& zlwF!UFb#y4T_FJpdY>Q;dKTyiIe0JuIEefy`P_G$dJY(Q<^e{YMeu`%%v)*6o%pmD za|3zx4OwhFYT3_&1W$035K;KE9EbdiD-D{KrN8x*@6%6JIyn&zQr^%+-#~ zLI=kWiPQXL2)7(40dLyR#xH*pCv!=eH@`Bdxj@e&boFbBl&e^wUue~Zbof2e9)@)yVLMiU=Z*tXCR z{Lm3JF)?}b)$XKx?ypkJq>D;#_tXyzmmC~ht{V~9NlX=iV_6D#f^)62j6E9y(La+@J;ttH?sg804N2-{PWGef ziVOK1cX7j%SDSh5u59N0=_ena(t=)k(nWi}JBcMl6`d=s$k7)|X@?*O(yqpe#KBBXFY z61wi+akXG@#6XCNgUrCRIm2Q%+$#EgN+5!K9&J6je&GNCK;gi(>i@ph!Ly5i zctlkJ@HW;Up@3u7!f%n!*rosJGE8o`!kK=7mQ!FAq&6ht zoK>v*bI;;}=@6FHBc~FVVlrtq?f{S#&uR%4-e#vw4Xf%mj_N!qTQU@5qUfaXEiwi> zxDxc9z^O^RuvaaJMQ}K+T@ICyqrDH$O33BR?CsZa`C=2y^=Jro^d=1wM+J}qUBFS1$lHH`dI|xV;u0VS zI@bhHa09S#+y)3g4LDSyi+^*A#5PiC(Pg(eq~Esb#EFMgZYNS2oT=sEj(QeAu+?@z z0@pcj^Xm~)5=EIk!}a$rF(hQRf?u^J!4J3D#zTQsM0`}v+Z^P(-GF(447>Er%VWj# z!}`{Fkl&3*uvDT16iDirfuxQKNaNz30umkiKvH)e27Dr01d=+yjiW|C0*-n?;3Wl` z{!ZCo5W*oCJLdm8Wzz>zHXcTj0w7%X51;JbBA90#5bsyGS(&5kb-u}y-a!w?40S24 zl-7G4eRp@$MB$&7H~&YZ(Ep*Jz2fariH4r{eTXwYBHbIl7WX2JJ*(Sh>_**(=XT3U zy$+1Es!I!OFtKi)3oS!}M4uc3&c(_;Ijt&t&9=|vPRoID-BmS=?^?KV&^V&27iNIM zq+z32DEE)vfPxe;B*i(g`FcshgS?l-E4UkHK*>L^;7wB=lYTep8#Q02kG_0Nv-C=U zVq~S-^^xsQ)vv}kFO@!FP*$R3@WGji{dIG%*;7eRn|?iVu|z0WDd?{9q(E=0Z7Yz) zIG(-B0mA9!A*x)W^zWt`TKn|e6cFt~$`k8b{}j6am@3=<(DWq=xIiltgfl4s(C8qWC+&p|OtU~fE8M2&W3&nE) zGkp)0fhG3m1aDp7&w*PBXzTsu3#8eoYyLG>tA2TBA5vW|X}^gOs*LmAL;Q7Kxb1R< zN#=cF^zB)re7V)>07V#9wao*(dYZTTo5^4A{a%tSqmk+w{UHz@MnI*_zn+Y z@E3z|2#FYv9@4ne>_mT_d(3Ie$G6iF*u!5@P^%$@YPLe@AMv8YI!}cJ9)C&B<8Ytd z=p$3Oe}+CGkIg+SPeKm{z8NO!k@#@X=vO#MM1FWXxnNsagD16EqW1v^q|KG2#8dfu z7GeMoN1RaV4+Atd;)2yNu=Ol{Z{YuLW%sEDs^NY6Jp}lALrY>sy5(OwM*q9iF7}4j zFmdgR)GE!NY)%jf2!ZXoBB|62D~Cnr47#NuJx8KI91x?^0ob3&48-Hk33Wi61dc72 z2cqwN$1s4UrVqsK%c}ox9Os*KdVfQab66f)ux83UByJ})qV}c9$A>!UTl`|FeT_@D zi|*mvw(0s}85MdrMxMLCt_~ofVvPy|6DU7W?JRT2B2p_Un>g|Rg}pbAhx+gL#zzzp zl6@UzOGx&8t8Dp7CHs~nG}*VoFqV*gD+-~kWy`*kon+r)Y%^mCVa7Tb)BVwPu5-%w zoa=kt=Un&i_s4zz(Zli>^I-bS=ly&=w^ta>D;Fwtf4IU#;l|y@x^cdm#I=nqwfz@w zSv}sNH_~Lj34EIkg;R@fgc{55vPizon>L>6;@#YMq)sDw&0|fq1KQ_0ysFI5gfs=F z=x4LkKR|Ou)CArboB;=LOMWZW`U8X$0B+x5ML>!7B0!4#D<7Ag4R}q1ZSCE(CHrqz z*@!YdoimIr0Wq}ri}}m!(tG@$+0+Qct4?r3z$A1A0BFngK0iRt;3J{vpN-PkSq>No zQ`z8K2u<7k0W#E@h+8+7&UvoJtm{t{nd&4r&Nm01=x;IS$56!-Jzn@~N{IG4;;5#;(5`OZqSB08t}*3#FBGujz-R!7 zK!)cXCR{?;22}L0GtGweerc0$)a>uFaFpr1EoQpW+#kYX(>Bcu$Xn?&#%QD3hB~(> z4&(r+y63_(jx7I-xzlXkAYYo?C$)YhPp-P99GZNi*0j$tq9a_<_+XqHftPqYGfyy zUZlCsWZ_~gk!w1;g&)hYnTVV)p67>Jra+-!2WM>2qjS~!Eql!Jo*C5d+zR39<5qU! z+WMXMZc0BctI-TRx|N_`v>{X=l#Dt+3E0vmCfbnY@9>51N2m;Mvvcjf9bEIHGm}5K z8zeRR_)Tt@8u*LZ{F`q7Q10|s7}xMYth_GF@(5V#81mLj+#Ebe|9TAt^9lydz-O*D zyH2RH0iD9KI?v0^yiC7&w})hL9WM4Q^CEU8Z}aaOFDAUVFf+0{$bLCJonl{86^P`} zpmGkqoAq zJ02=eiETykbcVZwKeoH(O>t|_Yw|8KUe##f@8l>a+V&l5$TD0>Jg{ERw{nEL5d{vJ zywJ2JiIsdS`wxPtfG@c9_UX~-i{+fD^F)&MYZL3pr}BELzHnV6cWc(yc8pg3Q+o?~ug4I4?3LY81HAGL$ zeQDjQ%UqLt&SQy_qvtP=d(zi17&a$=EMLaO z=%Mb5srul&Qk$FFgJIoQtD!5t7I|lrT92 zz*0U4K(o&a8$Uoa>UjR9C_p&?CWXx!;O5%~?C-tsH+l`iWKklIj;-I zKWV$no%#qH5BUuL4cCvKg!LIz@c>amC4~aFQ&J$aD_+#%Jrh_L-9zN0N56hYRKNL> zN$j*SQ>}Ai@GXMu*8BjyRwvBDcY}RAPeQ2yQh==g$CIBqz}1tZfw`F%2S^8}oq)Ii zyrmi#o6j~LO9!T4yf*M|{mU_P6p#-764?!$28X88iG#yDs>*C>X0DG3Mu;0Yf4DaL zCU@a6347seg$IC-zXO-2nCDRqe9im6v8MFbD2Aea3PC4L2>?{uqsN4+6h2)Z9!f~b zKMqm+5;pl~KHqQMt^NVhMJnwT0n)$3_9LYg-J?N#{*ullnxKH^Bkas>hBQWm5){xs zKyL6WAm3li3jbB?;eYylVAU8a0NQh~8%J&M?Mm5$TfnNZlL-=F^++TEJn@7eII`}b zD6Es^`|gj%l-*IiXXnrK=G^V9lpCY0YI$?z^Ozh&DVo-#nQ1ak74{)d0Yv*izcC8a z+A^bni$eDl(;9ZWN>mnm|Ldub4t;NH;o(c|`l9UoT6p#f(($05%rT z9A4^OH%e)uvQ;g(Mavht5GbiYEN*CeXhXjUKHVr_+eEcZF-rzLTw_s~eu=IXPwYdV zJ99VilnM!L>VrUmWeO7$9|6O{ry0>RGxTTK?sDE#Wd{-aD|`saM@EsFx%)ca9IoKC zs2xv?`=UPVBu=z7y`JYM4f7kw#eAWCL#iy&EioTQPa>FRDZf2+{Xm5--hCUsog}479eElu=Vb!|s@r z*S`?d&`BxMSJo|7Bia2xxLB7kx3MM!bb0Cb*@+9;8}4I^oVdv?z-t0U8mr}p;RjrI zF@&fBQ()j1cmP8r0?dh10XC=_mu7P_+^*~&iK+e=!%d&;;gf`hJP%2e2TEqO~g*!WCLG2R^)_cQhE+zxjd z%w8z{<9td|H&H-yvDXk@2zf-Mdo|*%U9wwf{-jYSjZ%1k?u4!P?G#^kpWI~+{Upz* z+C>zFnNV{-A2aGd%7*P{JdF`lzMwYFCD5%v?ftivw`?c0t`l?&{jw4; zCI1J1eUfasLs~h0lJPmtXL0?ir~!BX6Lh^k_R)oDsIW=kq*S7v+y0RBpi5teBnTvX zd_w)sd*?$-z3l553;XT4+Qp4w8*IO@~ z<|c7l1cuz_VD}dWaLcV+Ff0$T=rvvCjzDC)0lh~sfXWQ>BO?ssf(ur6YrhN&CRSaz zRgz~&;liR%+07n$3$!=6Uqx^%!vl8>(PIt+zIdqAe?$yy8M*Rr**kfy-TY%-DhH4l zo(Lb&D0u6%#sD5Sx?_)9I^p>(U^7oKpfaWaDq~*L_RXDTrC-Os%fwlK5icZe`<=A= z)8P&}=MMLF5eqoFi87~=Aq@43B)D=N%B!(O*jKLJ z>k|+|D<-F18k46*HmDh08r)IP3tmb@z*^!Gfrkus9eIb(Ce1CiPPlD7hVkVJT6=70 z>~<;a1p(^~GN?YEMb%bC``F#HwZ5~={gl~Ehci(6Qo6YnMpANk8%$&CG}Y~%Ydg8q z`|?>STROkTo0^RfzPJ_0a2_!3Pp}dmZydS+)v-IrC+{H_{L3`34$$Jz{NGnc2}rdm zUL3*;WK2P1clsy95A7SD&X_1pe>o5Pa2D9F^$BQ!xPR<6P{E4;ya@3B!+jNwn+9VB z;OF4q9v>$;(+N_5*+3P*C*t5%@Bwqv=Jh3Dqv#;Of|Fu82_cU7SO6ZO-H4XO|F3$Y zCpcHsUO>G`k!ltcZhB~jZ%&r>>y~|VSv|luG4giV1@pe3+xkV&q|Zh21#OGtqr- zZ->ct>T^U)SJb&GK)zb4e>RXFyFib-XMS2vGYO)ez&ro(9nzuu0HK6UXj(cHjlp%# zZXLb;dkIa)?H{1@@1K>>eDMC=pPcLed(so8+}~c)qTF3iTog)&0|CL}a&{aaeT2B4 zdq)?E(h=i)27-gulsSg~0c{OTk|%jRptPS7c(V>e_XsGZ0~2;%9%T+46#P8wX$4kc zn}Y!p65*4@{i>om&6@hs0~eKQbD;m69>8B`)z^R@yv_$u#Ty6kO+9Ut8}>L(`aHQR zq+SMf7ABKnt7z((%uPUo?_*<0u$obj7}8Of-i z!z1BmQ}p5S--%DD|3TB?B6^v4R*1#3G@zKqs@itsbGQpVwu@t;nCax*dYA+|h3J$Q zs+GATE0xE^IUe!5Y3%#NsOt}y`zRK=+fxt^tuMbRx_v_PP~6l#@&fe3M(gs z`35jb>jO*xd)I?psidewvy+zrDp6}a~C=p({$lUI(xkU#M=4&s`o`L z#Mgp{o0e*qG^rS6BAq*V>%eEf!fYbiC3R3o7OLrL`i>Rq4nbcm%h61ca0a=7zt+=< zPQ>Vk{C*F_r~H0l0QLyy-#BHUz2q;ZLJpo25+NV56Yxin!@n~01JHp7=q?6~5ZqwdnL%Pqo-L(lbYH9-_jR`~r3hbr=ke0+@pRYkghTohBNc+qxGHaPl?Z*F!&XRK9& zazUr<(@5IRUNbWwRPY;^03hEZ$NiM1wVod!2oU!8X>$S&gWs^ze$_8D3CLRqFSZ20 z1qS%09{?Ak0myZ3AAk$N>G*0vOYu4&V+W;8u2+ zPLMHAP(9{F{%?6AgD}5AICZ_qoDNQ12}w7s*t|Pi;hTAM$;k8jX64cDQ!5|0PUC~g z-!8O28{7VsMzcPk)&cL0(>*$DTA=sl`@RpnFZfz#ceel=wCMO7!q^WGb{VO&x8C$Z z?^}A=5x1#?fqwmrUQsUlJA@WnN}&JermIBOq!R)CBzH(l2hF+Q#n6p53ou@FZjH2qOZnsQ zQ>(fN*+-0AN2biW)xk#%^lh;b7VhcR2 z)>G+8qp!8b+@UspSI>vc#NWn+&2?1(8l_SC#LS~1)p_^>gjQ58^YrGP;XzILEj!$I!!3&5xcvnqn-nqvzq>%6bN8`{x5ow0dWK5tJ$5}#oc%$Az&Z9$Cd zG#&F3$BnCuINq#vNGkgt>vg$NUq|U0YYYll>g7v62PUte4x6Q|7jgy4R$Dp=J)6Sj zcWb5#fbSs#3`Z{{<-wm-b>u*NLrI*#!v#6 zo$*>$a#d78#nH8d-MpNk_%T)1+mcM1XZvK)z|(oEdW8nyt%@LE7I{d=7~|XcL8$!ewv|xnQL@zLV*w8CZeSZcpPe+&(lTPu zpT<2x;Df?ZF`>up6BOVzFoM5n4gS@mdw#QZ{lWTSV`icE%f!mYvk|uj>wQq8qwc;B zm*17VDLCDf>XN}}*nBszHD1k=9Q6HIWc;s~O@V(jp&e(M{%alhpVM-wna5y4SS=Oo z-g60XXmPgW>w;eP9wGFp&!}sK&C6X%*^0x!tv=!%?(_$ox#9P|y7$u>>#&XKE8UkL z%XIE}I%Bvw2A1i!=wSk zu_U^>-fN!r2S~xHpA;9cCw-6xoH(pFDQ)a*u!Ea|nMSl_E&mJHfQI5~arKc3R|5#L zJQAS)aqW1Ehs8*hTm z$;PU8{463kH)H>?rTsxfSrQ!%G*IfpvQoI5=l{u_K17?am^mq-fQNy#@lr`v2PA6LCnP*Os=MMs28 zyKE7|Ay{5gH3Fl}Y)dp4m{ogF6G_W$bA`%5r>9?my1^su!Z<9&# z1WVD9PE*fH9VQRqEwL)p60NA#&N%(7N``GyeLec z*Uq%{&W&_icBlxwU*!YQFrrI3yT#y7)BT;&SH(ge1_Q{nUd$e$5#Sn!o@G#_5H2XO z;{`B@WyP@jW93I)&UD7s72yTeIXtCV&l3W#xo$n+M~_oz*5mfkLJYze?2Hp*vL>dA z-`GFEWY_^`Fl(j@5xbQ1++va6sMBYl^Fq9ahB-6lzS+E+X*;hN0sh9jKd4x!7*F%g z%&@khzVdvzwYSv+G=g0OK}Yln&xXs-!}S4mhD#BG=rSx-Lb|w`WEj1Pm9>l0=dYxs zq)r_I0hs=^S&NYli1Z?Eb%GInzmAL>C{ z?+uFxy>K=a_#<t<4zWZBl)MKe)KP)%Ca^q7+i(VT`Op-8>nY8; z8Yoi9eMNQ`v@0BBK`Sv!Yrc9w8uczvL083vxBB^MeWKT<*VrD>uSjzqy7rpD)Nlz{ zi#G4zrk0M*)atGHMGFRV<0)0x z_&MgPatEs`qz^S^RW>jg6t7;5eFW+RZmGg@zgsnQt*mQ3x| zEoZ%cl+<&7ia`xnrXWi+S&Rp+w0Lz?%;9NZ7|CG4^glc9WV(xjhk6+2#9@UE2868R z^-L)4UhVo^LlRYXc|LM`Lz#W4MF|XzX;-3!S!b;#p%y!}Uylu4B(Yl{61&W-M}i@} z=WS4G&^ue^o>d8^t+%&vb=ylYS>(U^sBii8;|Hem3Gr&)X$_ENmY+AXlm4FH30r~Q zzo29PrnOS1z#-}TFW_r?z|P^HzP#TjCV!b?W|%T&!{2`GF;)SM;6aq$C}oT-xpVd~ z1D#i-Ltqg@Rvn$Ws)RY?NZ@TC)d$p!;!Za2^#rT;SvSieUQZK9_}&u*v|9sc<%FK< zI!lJPk%}5_I|xOjZMG;p)Y#s{exEqgex>@8Lccj=5E6m&nyaa2RSLV)ZgV>AZN8?b zHD$(RNsFGcSv8SH^PIC;_P<~d`fCHCg(P8IY3nl3MY2H{_?hvWTq0P54}Ae*m+tpK z_OX@;mh1(lrG7AQvgfQEPo2N&um9VoVA#^33E<;S4~DO1k8g%IQ12e!duWjxhhD&~ z=QX5X2_PCbF~vu2wS>C{ZwdYBo7Z6qKR}L32f9KaZ>r26AkMnt17N^CI9r^oNCi_G z!#iVgAYy2ND6!V9S&bxF>xM|{Y|e{(eSA&;%2lV|-nwjk<yJZ8?9vx|b)4mGU92qvZz(ZTav-_nW#KwB?&UeP>8gtw!z2%9s zt>>A|gUzoSA>6{O;8Z7Q#Bw5Wp-b%Ie+NjanP8&|%bleX@j zw1_-NbvCvj=armHZ&Lub8YEaiMf+xMSaFrOY2HfxAhIG-mut$u(O6)!tpDLyUGp(q6AU6swC0`zDF&7ox*=Evs6S2^nII+~6i=YS?#Xjx+A?KOCo59m z;7HZZAi*6Ars?Htkb&vC_qC(Fb$R-ysgo8jcXFhT53hV)VI~7weO03B3YwoEv+6 z6ou{Yto1}V3KRO`awi?Lw;m@guB-(ln2%cmeV_NMMD4uovtJ~+cvVq5p6Yn)=Vx=} z47z*%V9-9(F3~uu@2yR)vB}IddW}&;IiLIMa)W=5pE%LxY_k$2UT{pF+1(XOj@F8} zudOn4(JNmffB%wn*F}uNQSxJAI$2-4ucnGT+ISjVs19D~2J@*5v!4b*D;o2u zTfviZZH(puN>)SiTI3Bm@8k#~KUW>P>Bs<+$Hf#uCL+jgX>K)+j^=SIC zX%e0fmHUK0aG#p!b2U|pURRW^^51dCs;0e2R;f~g*cuBVMa3c|ff=kpCSuv6U@Icg z_ReenPqAxYDfC#q<4Hw!DYR+cXy^xMwNLm6WDrOA?^$zC0WU4JIBpnID*Swg`NG!^ z>P3e95KSu5WZ74*4mf5)za}p!62WwnOez#9us7tr*ORj^+Lf|EhXV`KJaex3#EN|# zuQKolNF|7uJruz0^tFh4C6`PVs*uq$2{F$28`VoCU8GHSP5D~jVfye3@|Tm8vy2P# z3^&$7F^bae;OVCq6lB=*>;4nfOhC9T?b2{PKXSFf#whg$Y?A`K2%51ak z7GVrN9czjvGyTF^635@%g=tBrxgv5qD-qF5Ix&LGXNt33p23QbDJJ z0-Xmq*tL;jKtd-5ejyj@7;a^a*@+BzSY@^OkyL>EAo@FGg$b>ZX^7IhsZ6h@b}C?i zNSW$*xc`$S)9vL6=Vu1>i2#RrU2%#8W-P~D)uV(VKINrOz13GwqK(M$xDze|NbI|g zj(cxGJP~fhjkd(i3FzXMV9X11=7ig$d_$K4?Ay!7nwwQShT*A$*}o`-Y}?>dhNTE%zX#3d9O+HTU;w%`5uX@~S_crIbT*zKLa zj1r)XQHcwOvdAaOUeMUQ-MsFQ%h@eP^_mj|>i)!bE^R&`1v88E#w(20t9#d$j3`xI zy?F<)huukmMr(U$Pc-)dNcBaes zD8)n3oS4RxP#88Zf zws1=t@2~_l{R&IN-t$8JNuR^^t5)PiM0$e2E;Yl>(+#o)TA0=5pidlRIc#-62iGQ6TT(z#V><#>Wk%nh^KIo>NvO%|BLyIZS!_es^OR z7|8ou|MI`Y=K+vg{{e96e>xXTe}KLKNYb(C@H${!IJRiE`6z{YREk;Hd52^Ovk$7i zu&lHP;U~DpsznZUzEN_iH8PF&6j59bmybM%8vWKNjf(&PacJePD>U8+ZPH;K(fzDD zK7%&ZZAGBdO(|OOTnVlO73GIQeK&mKF&2mTSjiKimL;j~P)_t6OpW)o!&0c#j68K) zT~iQRKX+RAj)2G{D;EiN%fP^NHn867EnayjcSK%Ba7e{bDvmFO<~pmbLue(FfhK^+ z30<>WKq+4mVf-h4|IL{36OsdR`tPI9f6n3GAE_{tQ!9n^J|v8_jB4mAjPzVMW`c55e`quJ9_ueSOe{>=$vV=bhItpW2}ZuHLg% z!G6=b!Z^)xc*Qzm-nUU$OfkjNMxulJTjSzyyeEpp6>j(63t+X`eHhVvoJz_)XZw`M011bLXy50II|u@++S zyA~3!p~n*qnopQ4-AfaH>KWb11Rs8@Ix5ScE^@c`)EIc6S||?GTz*j z`%32k0~c>*JytR}*DmoO`fZ`zSf!No=GEM~o8hLBQAM{|xzea_?H{5A(=n;g;Wp>u z4e|cd--K6ZJ$fvO8YvN<>~6lUaL6w{$1`k2|D;-Zqi)Vuj`u z+N^EHx8J(l{}?iKAY&RZvZl{Rub7Y0roJA}w9{atGi(mq7w~e6V-|^AJE!IyomSBa zJ+;~jtoIhPouw4U3%HW-1TX9cu_t0QPScOa`=AF55}`}i6Hwz(@^D{}mk?ecCqj-g zbYqIkD<)tHA76|=>zhZs{Lo1hN}phdYNA?Ui5vbdu_n5*qj_eMwQEKNNaB)8ELPU0 zm0+cIEfNSc`(a~?r3|J12%{OvQ>xwT-*O3uYor{WfNB_dItX`cAkEEf?37FJyB;xUm;3*}-EeM{n(Y z?ImKb1BqxoQ!7Ppuqan~@XmXsT#^SB21Ral zj+GPW?5dohw5Z#~c8(J1A@0)aj|SJWnc6HL@B8zCC<%Q`#tr+kxmg_amBgD+@&!a~-BWjbg~{$O7s2ws2b81zY*C5gd-1 zrQ`>d_x6pFk`9v&)he;sRmwK4xg%NG_4{THhRo>kJwC4zHD)P1)bs*KNr-oVKrD-S zRW>A+x!mk_|J|_L=Mt07UJ2T{_hhxUBXYf2Pfd%~pR^DPZtFeMiHvCjli@O(^|8xp z2Y4e3V-w2QzGua(q{M-((PHI0^lNDse}Lj_fP%bY8TdA_@`dH(#+1T|qhhrYA$JP< zcG#-s*!`{*DSj?-ppIO#DQ%OL{odzAlQR>ZY*J)vPp7b)r1MGwPR;`d1~2^pse4l+ z3vd9um^~oZ=WE&6XY~UzrsLb`2cql#3Vw*rM(X-%4Iz1hxBX(Ng3eE_m5J;Ul|uX) zm4{eA-PpBhB#g1BU`3L3%IweXP9r+{(iNv{ikXVD{OHx+w_wUhqiC*i|v+y`OhoQEzQ0gzhaj70<0rXd!VL?_2)XMPmLO|_Z-mVyO znvc$D&ISaT8QhZ%B;T_Qm;il&_qpV1XyVLxcZ>t~>|sMDTSz~UxvI4T0)T`%0oAvw zwGP>r&XpR?sEgcPxt^e3A!Gt9Qqt}#h956dI#;DDsJUNqs?oJRp_M}v*E6?=6Sk(W z8O}LW%lEW?WdG36GxzkZqT7R<%Y7J8ua2>(Tmhy!lq|FR_UkO=UIvWozaY)!#)PQW}ZZt+{Gfj&NVO zFa)U{(x2XQdN#jQ#Wo%WyFXZ<$O_ZM7(B0Mw4+K8T9~M)t18#I!jGOxr8hrwGDRgB}f8a|KF!AE6d3iB}=jx_L zvmTv`CZGS6#DwB+2l#thZ=a0GraE6U;^j0f1YWO@+x7k!q={W>o0jbLFfm$jZYBrHiS}L#BgSY0Xa-Wn)=gC`G zA+0jC^Km^|!^QS)U(I!S*53W`(A2teoirif(~7gX0Y;$3d1Z1p7kg#tR@KnEM$b@< zlFHzR(M*2JPWb`xXQt4pBI`h<``?w!f30%)1$<7TK|tjwSKi&d=!u87eO=>QmL4ys zkC`I%*XbBIZ9u6$EPG8jL&9-1x2F}5y~Trol4O8Geh*<$jc&@E2I~I7wxxBEK;3`% zhA!fY3OJx3=1)J6NnlU{iW*#wcVkfkEexnU;*6?5ITPE$IkUK%0W_|umzhr0o17es zb^g@86+;+m6vQkxU=TVL13O2;_o}sxWdIxc*G2cc=RTE?Yj$Wb@6iFc@mCYGKvuCF zhB~GmY=c3x>Q|)+4$M`DYF7MP9oe%hnvr40rDFo<^au9i2&H z)Kf(!%y7LQ+wfF*Lf*axDWw>khkgL&4y>dud@=}=#ONDtqA9E|^cDkE{-;chyyt*}X^XkVl+;$Gd)kgX@=OSKh2WXFCHI zyEyLgeBz3F7dC+|x;4_cW@&a+5Uj@@`+gf9(xQOqCiN#ig41wQ#Srg*G|5`t3iRHACOmn@l^rABnR zyR&EU`5g__v=sNaIH&7&Hn{u!BF<{5ef%lTN^bE(JBHLi)sCo7hq=XQWsdj%b9L27 ziK(7aIEKJJwVY_FeN-Q~{zdM5;iV8(=#Ksau?~%1XQi^GHuQ(({5i+-#Eu1aBKwjp zD&@U&u%}#Q8BCo{VqXVHtN(Gm7uPjC!M4-H+zCVe@;ZOI1NVM5ud+M!$*_Y3KCF_-)64 zq)YoKF`@TrTgKO%O!+2C4diW@ij9E%Til}n`JrHIZer5>Zc0b+y_jV-HOD8$N|l{l zowr|mu~*02XA!_lmZO-yYmu}#&FOo%2dp6ML@U!N(&4&c)|pT40fxI435h6dWpY=g z2~?H)cbiPlIilHis^reecQK;U@phUz>&-;->lkSc*QbWC@+<7=UZtgcULlV;}>}&1nDw)0TSV5-njftQ1Iow3#&c&EY$Sa%#Qbd)gc?9y5cQ68-ZO?#qdE{t>cQARG!O zbAz+vDMogr?M?t|k#diNVaF>swRA38_>~VTBkUv||WNc+OB>3@wv0 z&5#oA83-Cm(|;d^b;R~c^)dwKB*;oU4S0FR7EZBL-CR`{)}r( zN+Wdz$Y`KZ03bui3pCz6UV9ZHi#1ROjru;r3+xpd6D~yEV5YmYYfA z8Vt^Lkf4w21|mRnuxQ!~XiSTr6s{0ONldt4K|TpJ?$oT=TC5=qMz45{q`wTV}VqTm^Gqn_6$;Kl~2eWkRQ$yz`gOZ%sQrnt@wI3%ME& zbJUze%BEns>hhpn1)(Kv5gs zim~$zX~zr`W_))oCnbl~Ghz*caPZg~iLB}R^zyco%CdR4DhT>L?Ho3#4bEX(yAu}$ z3U4qf^@r~~0aPhrOm0xcv=|z2Jl1RaST8KgMwO~VoR= zxRZU9<*q|FWmvq+-tj^x9+`ck0m~#%CfD?AhpG53aQ#pqW18Q%wkk1Rb*FsDbrg_Q z(Q5l;I6qXBJ>%KATli;7oUYLgkOG|E+_Yz_xdJZu{i^=MnQ`M$`9sF7IQ&=q1j2(Z zzFwoAjRP`bn?cQk+dytGH@^n_-JS|WnrJ+W&AMNA?LPvYT zE*9cC*Tz`X-eN{!3YqQT7gu#n0_RLVy!}e@MASvu;^|`DB`dJZ20youTOK-Q#*Xb*di?? zb@K)>>=q_9XZ6x1Dl(jSr4%?au4%;s zXhP8eqNte!W>!M3BOc(z3JE`%2&r&lC9E;hu%m?Df<-*yjN3Bj=ikF3_O)Z-3Gx)?h;q z@9jJu-n|#TOC!i3C8t4Rqxl`aR^ii-{CGLw8#GT|$i1A5>1e2XpF_ZSAW~B1qkFFL zZL#mO(~ev6CcpktO27UA#aVd;RKvXlW<31>fvrn8UiUqOL-*!*F-JSOVd@9#%GC2& zOR){5uFJow1^=CLo?Y!*C?D-B>x)BE(>mvuf53#wo0Y%7bn_2eVq3ETg~!M5cKC=B2d!K;*hGu zr1w~Gvk9;g{sK><;Tfj2W$8V3CQr6qnY{yb)i`GM8v^I(xj18Pfsl=Kuv=xgIHY*p zy^<%1Z>^dt!Jlx4=%d7DE-ZU~ZE+IJ6}e_GC*1Z5V8+N^;k*Fo2)&A`BcD+FEnmmm%%YRkFNRI?_H1e6Ytve}9Bgx5ph@8(3gar?%(ru$ zGqdP8kE7PX>;}VgwX+)#I!_)xih%@g?tZ{{^{su18S|GSu;Bz+XUH+Dtw@0|ho{2x zj9TIeXKyShpEd-E_zM&ki{LJv9RgG?s2{U2gp#(6Q8Mw5P982+lgGX)R_QMPY;^sf z#MYN3gR&$mYkTbU`R=PuR&`9s@0ePh`op2)EW0;L{pX@=(=+-^oRNY2wi)L%VDv~6 zpN-09zyK#uu+*!ko@wg z%Z2uHWm+1X;c~WU8t%*fmok{h>733;x9bm;EAXjQLVS;VF&=o#3>qP_uJlGe3I@^o z%jA#ztwj9)UoYwEp$WW8uH^@4XKZO--8|?}5#D_kvv*Vv>{*>6>k7uSsohMaR#9{?T){7pN zl_xJQv^ljzaYuV!35bVZwBY#)?QE_E$UMJGX1IJqhT5eto5y7VYdHx$8ja913)e|| zgI5PtLB9OxV)`kZRx_jdrD3qx|PTmaJIJT$rkD$fsxJGs3~GaE!S&b{q}A}b$Z-_)!rgEdxufG*e! z%0rM!loqy@4loslf&)^$G?h$0AE zK-x2aSI-0v+iC*S!ZqG*YRdt(AE447pqUJ66PzU)i{)w&Dx#D+l(O$Z?DN8<)`MlH zE8q>o^k2ur2)zeUi7zqwsIB|;RizaX_g-`>wB@t#>WlPi}v+*xdRM zD8KI(8CCi&!bb=TX^=uO;uFAh@UI*jK+d`WfT+30KL8NlAKTIocv(QZ2fr+H=U*Ax zH@?62opcfMVt{+L*v#g=KYF_;qAjZI`m4j@ts<>fp!=j^}Gh*fwweff665!(EE zhuT+Zt;5w#S%^gYEZTH2)OlgWl!LMZZoHhScsKqA{)*1B>FwA2CS6CyDn|lOwf0!I zWkjnj7|HgvHWd`ZFBedK`sJ_sZ@Kso<~+YwELQ?Ktoj>B-f@@-GRn@8g!p=zoiP{3 zhTNB!$6|4j?%yEUfWzvqYIcr^B(aJkQXQ;hkZ0!VwX@&X(fpS<8rwM9e#$HoI1{5$ zC7Y&jTAWSW)lHnuy;xaO`Z<22jfL}`nQz^k&5AMFj}I?b3P3A<@t(ksGcA8q8r+1x zPhbab6AEN_?*L`?XZNxOvOd;!v*!JjV6Ia;-!4w`Bf;Nn7?224WQKl~XqYZ2q<@yc zp%;q($h|}Qfn)y@f#rb3|L;WCzkh7Q!o#;WPD3BAnv8KHNGLWll*EhtR)lK`A^CZN zg*>%&FD(Pu)`rnL6rb*6CsD#|Xo9EpCJ8mG6LvK~$r<8beRZg*e8whUN@~ zgsf=VS)%>*KL2}8@3*kJFVBf%Gmp5JAU2C5pS>|$sK|4}S*T!~lILTU!4x|q$$|!_ zH0vDTe3=dtVXK{xJ6(RZ-sI^3w4+o#oM{sk+_yo zz{@{9>IT^`=|%%#hIG_+NbYiO|=W8Yq|>-^>34SSlX zn<*;u=VhAN#*Y5E^h%#nMZIXfBHimt9^qmh>@D#hbQ1h^p3V{Uw%vjE*LggpC6=Oj zPxk8DXR(CMF*NhFKZqu0(D7vJXEUgx#}+9N8V-d#ni+3M;xt0909$NG2f`B@op8eF zUiD9Ym(!8yF|QE&u3jD&KKmJ_ras^ERPVcgknX1#^Pd=a|AvE4{Ulc*NBQ$wYdS5- z?s12z-yv@Oj_0RVSi2{kWR@U)dH}$!chAKuVp0z}-hCeO?Sa7X!(HB&ch_|+&4n;F zpC)5s@Fr4i{p@E_#R=9gT%x(12mJ}C2dDQqMu@hfex28V&;P}#nzdsjBzBC1CXbO& zzzHM-Sj~&^f%v~cp>3ws0j1yRSvfdR{RB;F^*j)o+G=)$Q>X|gerHgQY6iusb47<1 zsw3f4hB)DyxJd^%({Q- za23FP<0>gmFKp)+f_?6?Ye$w)N;{(lhA-2B*Y;Q0wiTF1S+Rm$sIqo;&d89?ICP&A z$@!#e|J_rTnHPMM+hiX~A;mLJ4%hCDf_wmQr5A3uqv@7F7NTJ@Lc@J=Fw+ zlEPznkXJ4y(v+c?;DTFF@jvSr&uS;(^tDaM6Z_;lgjX#$`&rQGk0-|*B1*84W_60C zRK$Av_#4OM{!H8gaSL3nyK=wL| z8{G#>qB{BCtX$TH=y1fi326ei(l6sx=Ovjt@)_(%x52Tbj^KnTBjp<(KvKpx<@ySK z(R6fvkhVX7Fu$rM+K=Djh>OpTpvuJT+HPy_cJ1}?6aE=eYux|HGU%tj0q)~}6)Mcl zNP#I#8_1GYGlp>Mwg3A%_pB;pHijN13O*0@0VxgJn)Y>Lkbt&-js9{CLEp#W=iVf{ zc~~8krM*!bVMO|^$POSFdU3!v=4vE-^`bn}!s_q546ak2I^ccIp?897V0MqG!ad5( zOA_JB-A*(lqjcJG!uD<`D(LzXVN8xd;o+_V-D~wL+`$nmjHEqx3u-!h?`JQZNNx*= zl-LqYdW9QUO>G6$ZRen^m^tfHDTAfCx)G*HI^TNxDbKE?a1qe`RRD^oOUIE$wh*!T zS;F%uQ0O9^QggYssk-DwLRX#Ci%apL4tbqg+ycMnaPIgUWG2s@-|4a7NbuTMsdlHz zy6ys*%;DRLHMepTzg&-kEaQGLK`14EdrZO-;S%y&pq`v~J8hGL8s0>%~qE}gssN-^(0g+9;uXHR>mYCnpL4rC$q5QZzshc#XH zNx4Q?);Qd?58~z)P}^E%DU%7@i*l+h37_pBw`|}3PCT~XrWSuhfOXLih=#3#ar=k5 z#|Er6l;Vqadns;eDU6iVCt7$L?V3?8noF;LM#d8yNoBkwP@P2TF164gv!wI$ zF;!5{d+o&p21nR;cv$oOD!FW`hO381)$QxSM9PcU=~wg}2$)%SDLZ-o!|j2S2Qx<# zd_;X`k$~y-qbGh7E`$9hZuS?u+27oBAEN)PZuSGO1_9b{YG{C+^PA}|C>R1^^lx%# z7c*c4=WoNhhrYhmk{qvr6%SUJQs+|JebZe*xq zgD+P!&EM=TO_?N$C9O2xo;k&2Yfo*@jjcG@7KiA5BNFCmw=)o`N%|&Ty>Q;EMo1S9w~|cm8g8iNW7d0O?WZP^4}1wW7bV7(&H(AvpY@4k`KY`$U0_*~?oKKI70}7*A@8@>wLh$=H?5nO3cr7+w|QQH>>v2$9r2sfE;e zQzl7U)J6i$ZeIHchQqn`(Cl4CiU=M?v>3rkhWqOvnl-k00yX%;ZO#RN& zOeY&1s7ofrDTM_Y*OG6z*cTxt(Iqs2)O3%k`swiiAp- zhUTiw*1tu1zNFVtFHz5gQBARmNvg>GlQ34+7_Vu46df9|<^*??#%wFc)Hu+Sc^*_) zgui8YxXV}xvD zo`IF`)}vBS*>vPw2-RoQGlo5GUWL;Ixdq#Y;wkS&>1QFUE&EIQs;&GN;8vAtZ#(Qm_Z=?j5C7hN?x*Q{S8(xd8XG(Bn))`k=%qpbaBHfJ0rbL7M zOsyT_L>oQXuWugRciip7$>rd8s+Wg%^_JqGC{!IuKJXxpd^o1;=G{btCkTbCQDIOh zk!FvnIh|J+8OYzQfW7f)#0B>Fvlh)LEJTMTV@MPqj1YqY}%MuebB z1+{B;R(4CoGd(!IeO@*u9$&C)mV3?q!7kJh|8Zz6<6z&K*m$g&2B`(>vF;)%??j8d zspeBWnvtp}OrK}BPet?O(=fxh)9tJ+o4TB4ufTSMX`M?}22G^4B50ObE#6A}fDBJXZZ!H_d@0VSww* ztg+Hv<3FfZ;F`h(-@l|Wlr$x<{|*P_E}Co2=1l7-2jj&Je-Bqwl^19E@pndA*NnxF zPwY$VsCA<$R9E6Cc4O_;bCGUtH@h=^Zzi|b#28$Eq?)+s@~*}oxWsMAHb{T;zxbIJ zYb4Eo(}K~ja`nqgVo9a#RH+}Xu}*z2(u&b=8$G=(NVVT0)RgS7AoGfHm1Z_BBB38~ z@xpy#S1C&qxLeXFh=zPXFM5!w+yfJc!lLO|5_TC^D*-CYu&74N}n$8 z@qC~;)d@rtabrj5xofd%r2$sDuz_6%D!SZIk-EF~5Uf}yl_vamFL}#Crfr!iN<<+9 zbnu-cR%BBw8c=fOo8`FnVJ`F zg2$honn=&h(3?g!dozwvQpb}~5~KQJ+5_1XOmk7w%}P14n~>wsYtPu`;t_}_MXcji z9ltq(sx*_K+9`9265jlxI<4|VtB0@;XSSDn(x##2D0`UFCzpJ3?ZQTsd`AS1XO%L2+|w0}86~ZZ2cw$c%=N`YDo6R3MC^Ol(#crG$=4Qx{Gj?LW1Z{w`zK zdx+UJCPvnpn8BhpCp(V8xUUt44>R}6FPLs<>R(&XA`aM;>|i-nF|>12lOu-Q;=Iu$ z8|^0>R|EAKLqqTZ`7V|@R-W!6X_4!<&E1ZfLr!nMt;?ElTN+C#9;46%NabUnFnRnF zagCc=V}rGv+A}P2?g%-;l%~|?6rIVwzysaFe-{M#g zD5L#Zm0tTTX3}3#b&-$H0RayVd%WPG(uYQa^i&I~@HIQBkx3zjtxxq8_JosjmzPHH z>PIO>qjQBJRp^9uGpn@=?QATi<+?rx@F7vV2*O@dw}q#|=LE|`z3d3N%|0-$gT;v# z1Jt?i+gb=cU#ZExw$mUsv;+=H%fA7y63{n7nr{Z6Dh2vKDGyY z*IcdElfW)c{^R+@!AsqFmQ;iAT?2cKe6HGP;@R(SeTN_!>K@QA2QqBFbsVvGsL{%( z$J1b;PI|j$>fXa^o(g;=HyLvVm5Rnk zGG=ckz2m4KYD$?<=L6v5y>g-hYwC<#E7ivvF^XumV?o-D^}dWKn1kQwv0OZ}pL(=o zV{mdaY4-}q(G@nN4Ci`N&m;RURP_{m>t4tgbCeNJPmzo}IBAe}WMWn1qu&~8!JcRb zrNGux$)!tC?hL%UT8)P`<6?rFYmx9(?u?-R8W3;@Iz)L%2RNLmq?&|%T9R^?Nxa)9 z6=({HyBwzlaRmF4pO)nR(R(|wrwOODCywv$4>$idXjM~;uDKVY)>~vdV|!@)3GOXJ z@?!1Yu?=Xz9G1SjGFM%%F%X@+c;jK87&H>^0}x@7$fauA>Xj0i1D@^L7Ij%{425`7 zr~2S{Zf-#?_pN$rV(`|@T;~m{y!jU_WuqJw;3LO)R#peKB>{?(` zb+hms#R;I+*^Rh$)=~g-OKXUz{qEm$+2~JLscdmdKPmO}T%QZ=SlWJJ)sS(xv_=!2 zz$5#+X)ILm#mGOc`j8GkvjRcxlm;u2uEHQsolPZx^rT<|yM{ zzt&4@wrI^y=gAaPky#?XAGe4$G(wtA`T1U7yANvzWLA^=fy>u#w10hwN~Br-kU4*& za^@Fm%^zl#{{q>n{{wXd06P2?Ks}OpR-_5aPR=XReIX)pC-3={5U3#n2&|ivc^|)G zd>Y}->|Z^XK*S5CCOIm4l%$ma(xtCorW$V4WVIzC-y9izwxoA8vT5BcKJwrLAJ!s~ z`%2sI?vE-Q$Fk4V9VdMqj?6!EsI>B;10~CS%vorF!m3iIgZaw*)t!8?0hFyEAxvWjx}p@N8}?Mr>a!9cH80n zySpu{GJF>&&>#yR1tF@d(G0McVo_XUioV|I8ao#SnODxl)@x$MZ!wtXZ0s5e!$>G) zQiV&YPG8|eg^8yQ4j%mKp=$~)s2vmsukP|Dn1FQ0>k-~Zoo-6kIr@xLKS;V74? zRw0%2*H04=SFH=f0wpLaErggdQGvdM^;v#e|NVxeI&K>8hO<=TyVV?-^PW{M@luxX zwk+jksm+$p%nx;+XkQw~c5@QDq2VnvUe0sk-=pEv!1eri3fL zL8SImP2xNm+AsmI2`8;9NJOhTFi?5X+!0m^EkAo} zT*>NPf?A%o20ljubAF(vro4OJp|&>ZYFSzAixlnY`&ma3Zy+goGj58DAiRe zqNCZ{x7dF{e*-gdKKu~DO2tA`RoaU+v%sGr2pz-F*+(`Hcmiv;Y344+JTyD9P>cKs zLw_|^-BD)Y8_SnEsfs?{qAkok(p99YNA|2|?CHbmkvS`5WV1|s?pc03%*-BVxN`=G ze5Lbr%+x89J{66n;`TWC)$m!~c<3(kfy{E4M{8&>Q7Cx#$(Wm!?RFSDj$?~PJ8KO0 zR;Mw`iuW^<<(a0vOk{K{y1mj5t?6H44EHr~t5~=1-xb=OvAHm39hXWj9vjYo zB@_ENa-nA3_4VN>U6VMEpv6qYl!nMxp5XBgVWdxe-`x${BRzq5j;8R_sci}RA6Pu@ z8R>|YUI1`6x2h0PcRCJau z_{^8D52C&Vwy7)(WkyKd3+Q7l^!rM}Mav@uW>_zidY1-oHRW?Xevf3_W)kCMT2wJ$ z`N-3O%x%r!CtWmzM=2n0sm^aYzW=nyYQ&{^O^qBC*E$Xh^M>#GN_m7gj|w>WVV}qC zoXu#+-re@MPm9Gkq(EjI3)n7F#z<3UxVZQ2O(fstH<$M{$V=&sa(oI3EPXNF5n0DY zQd{K>lzND8siZS=W$8Ip zzHQ=V->tC+yyK^+m8t>Kg0h$q_HW4tqnoPJzer);ST7?Gn+||(r*%j42qky4W5?{= zOXOnfLStajzv&Qs}umMrD@>tadQ1dsuNfgRBP$_OWYZ!FPe>_N8 z>Mt46pYY#5rLg`gLhu9M`zLe2f5`_=1s*`R$&q#F!HdAS>_UHX;CuA)MQ;R^T@NgJ zR}1z3Ah#Q&R`>fQrzVjol3CijT5G~;@}2_)cI0taeUup&)uj&HCV^lPc;|RzjB0N*FL>gPwrSPG^L=g(y^lfN;~oG zu(T19Sp3$tn!5`yRaCUsk(+^r~vSo&x}JhI*gK8ofKNQ6m@(?taa)I6 z0Pf)oJWfu**7>7BHv6M(B&nOBhX_N@LjmXFnQ4%+-(P+z@T!F6YcHP158z%HlPbSv z4M}X=?Dz)X>iG^4DSvcyuph}VF>5^Guu$X|c6BqJ?wkV;bore2o;NGvaiEvu?7}4F z&Kx}-Ah@DDh(-VxWxqyupEO3MAf(S;UJ|bl)JW+d*}M1egy97kAsL75ps$pyWu-bw z;Kp^&qNF(flu`TL5A<_90O*;&7=U=IA0^3#(>z?=fvR#dE^Z+DY_jc%d&JX{^((=f zW-`C1c|U~wfrE(7KNj)+Z+{=qQ;V~kVC=|!Kq-@QehvO6pnM+Z@ExM_$cC!=b;QGp zf4J78ueSV`85xirQ51Wi&fdX53;`|c_wX^SIzJF#C6CT39d6p}4!2K9rFLVNc^!8YhH4Wpo=Z2>wT&1>2vV@dohZYnSska`yl6I`Qun}8WRqHMAJc7I&s}Ke~s&JDo*iz`U7g`}w*;+u|QbYm;9#N)L6VTtz~ zMlu zIR%)Q{c&Az?nm5M(hrMdO*>#ve-1{wnJhbBH0t=w!PTsZpP3N|c$q|b4(V#qe|P zM&T9hHYM7Fh~{e<`SK|78k^^XIJ2b4fXlbdH{h0wdAJ)R%mdE68`@OMiaqDw`kwsA zrgNC{?wjTC%f#(|W_dG$TH(RZt!Dhx^6ow|ZF?(eKb^Iin4zbd*!Gky>h*mdZmFDl zz^l6O%l7uqrJ4UuVfqdj$e;()z_!qi54N@2EZ`?xxwM|qhg)VLbBJDtm&b_(=%@0FloLx^EiDia$>PqxO-UVj5%wNcfS@%5m zoLT(V(~JTBLRhCdoAap=CT|4uZ2w)^92;x35Btt6UW;80J8?d=_c(GIVF@8J4xd-` zAwq>_rOs73gqGYa30gDuK7hyO2=y}{rK#g>lQk4GQYb#*-CVYFSMc4}P42tNIjo{x zMO)*w5_mMLHwW9OTj`jX_w}ve!f&emOhfpZQOO~*yW4UYqR)HN5u(QNZdDa!T8M%SQLtklMeRZ@*P_j>T3xTc)K|!J;WuP%6}Ub? zAHM8W$cBqHs-&mY@DLr%+j1zj^pNv9>N*)FnrijeV|B{sW(c@YfOwUk1&^*zQ{6$* zLP3(`E^nXgvvO4x8ot|)?>sr;rlxFmdziT^i{c;=k}o!poyuEs2GD|F!?5*okr7MC z3N+F$3D<<GQ{rD{VBp(}XDSe9AtXYCsjtu^1VWNf|Jwr|6&$%M3n2%~niTwD_fz z5}^=e7m>)59j7Yf@ie^b4ev7h|g$K}5H-R@nBdacDj`NkKHWIwEGK==r$4t0<&7Pek&?cyy5nR^CYZvIZv#C|u#vE3FIxxz37EkQ zpO8msU-#+KPm1lwOZx}xvn;OBYuZrstU6I}Nl7+D$Z0!gOBHM%O{EWT9ioT1$zDFE zXI!k*z0a?K zuwSq{YnEX_VZK~W*+df~DoT`HKc&eS?OB*&Wn$4CEQcLn$X=3UZm$t~@%7`_QuOeV z^6s16@<0rvhPvIT$$rJ`dLF;*Q;yZm`yw2k$0@@Dpn!)iTfdA9q}kY=CtErD6p5d* zitSdPNXCdeIE`MJl8D+$Y)-jM*a%g~KiEmsTjNmoH%~D-ldF2`Y1%fA#4my?)9QP^ zBB-ibqavpMr+P*$u7{5ww%>d4rthAKoLg7Ru#You0izY-0;j)?{g?!vesgN!)UHVx zg0x8Do9jku^+FGQ@MbSiZlArX3q!UV+a0!Xs1IFmG(BDiiVa*>i7}k5JdblxVtpum z(gxm?P*>>gG(N()$JJZKwX0=Ncd+`l(Ve{~E}g!DP-@mG0D?N`xYeG|H8%>Uc`c=t zOWPgE=N&3dl$gqcvK~N%9g1dv&>InKuBfBgjqL+Tg|en=XQb7;kDM`KvL6a#mYB0L z^DD@dT{tl2>M+h1G17R8lXIJ!fCnY?|!a10J=4>55GZYj$=P(vGp$eLfUCGTG~hbxg_^M%#)iR+bqyr|vrN z$se#4j#84xaJ(N5NlFF;MLMrzsHn3#%)S#bIHb&iJ z3%mm4XDnk*fsp4!39{E(7s+nUgj&8O=+8Y$qOVO7ju+&=9rA zr99RpKdvuir@-*0-E-;^Vb56jU16sxzE&(rv2bd-N&W!q|@6Nxw2d(0g&y(O9{eq!j$;87#h?GMHM_A<4OO2<;d zMxnfOuze-6d=zz}mW5a9&HGxfRWmJs5zMQ1_^mic<_lK6rF6T|k(irg9gs^BsnkD4 z7AvQsd~B};q{q?UL4*_J7Oc(c3-?eOp%EFv-M4Bu)@%2CJb0>@Ubx#;yCPs|BEEX^ zQ25Ej^0?BkFO!H1{tX$2yHu|;gnm447pz#iV#Z7|6irWT2Blqpc`B4<+xvkc(TL>( zFjy)SYJOofIq&EIX+>f1{MmP(hJsk`00nM?9r_3cLJSa)-iV>6Pnx*Ln3@g?Q7V4` zbjrdW1G7E^%s|1#^V~zNbqXp$bNIK3{p@Nx+$i{ZQTYl=v(t}}<9HxHZ%0nFiSHY| zVg7N2nF!*yIYM?A zpXopGy3TyMw=J&#^8QhaW`oE|)Czo{xH;o6 z##(f5r|VIn^N+>~mlhquwG$Kwug^Rf)4rP{z?y(ilVqMH{BEPTJ1c*HLr1f=SnRN) zfKI<~U`1|^k@IYGquX9%tE}c4=oNRA)r(yA{2X7a!R_%NT6kH3VVT+1-t5S9_JSe64`1RLcrNsG za&D)(AiC`cC<+T+K(C(f|Aa1S!H#ptHs?6>x-X*Ouedy2U5_r3HBZDAWFnXgv{mGI zrbmh|rH`|c9#-|$z8>jtkjgJec2HgHY~Fj@!XS-P!!Rxwkq>P{ z9-4Is-PFl~OxX*+_#JY78g=^>kdOZsd@owSf;)5xGvN|JiX9%z6*#$Z_zPMUEoO(% zb{SN;)fsmx@m129Z1YPaewE$GM(cnC=uOWpDEajW=XXfJYnzWfN0GF_?~r^Gn!9JQ z5jJE0J!q={qtt)w7My&frV`#N)dHnv!Kn($%inT$ZWY}qsm);BXR+oHMZdHdC7I8; z|97zR--DX}bgV#n924XYrdem1y(2b^cV#R0%C}qkw%iKnrOpLG)mDOMZ1Qi9@YMLc zqN$RaEQhgKt*@;j@0lIQmU|K!&^Ia^Lka}=zB`4Dw6)TlAyL&^^3{iWa1OtsdGtEL zcieSy8TzS${|wYRyzs3H5gx=)?WvI+PhJgx>0pej$lFQh*b|>Lsjy8}u!?c&ty@x0 z{1;)oz2B`S+C*S30lmAYz^b`;;epO~$i+y8_lYlrsG8LIRBF6vS|w?o-LF~&RzTFt z4V=>szuKpA@9I`h6{2G-*ZS@doJ=%ChE9^csok`jaOuQVyPup~$0%+X;<7rXEbOa< zO}3_LWaPY)_2yqz39dX{#Jpe=d}_YK+JCLEjHXD> zL!HbnzdtO|Yq`Uv@X#r#%84A&fz~=n=1afBW`4zL{@!P32HFL&xsBq&r~@JCXQS$o zffa@>A_BKC1qSDh0=D%MP?0MUj++}t(|1VM{zS=vtfoj7V$~&R#^jgjMAz$-6N~bl zskk9Zxlied#l(Ji9#?&7XG^yROtaJ4C%W$73`3A|WmqmOuy=bOxy^ysV@f{g zmcT;4#23Lyd1+`gWB+Fv)EUO{Zm)sDgM53YKfVw<^BONDYFEd(^V10}h~Fd+QS=xY z8e15s;xx<#)`=*-Gv$?C&G@Pr(opdJy}bKRcc^GkhfFZcNNUqvyL~9FQMAy=;4E%{ z7wu|eD&(>23-74|Nl4hy&}mI!5YZNP+8!Bm=c1jZRLHJjIp+F?xjtX5a6H=3-L>cv z!lD;IK^m9IsCQYX-zTaO7(roTdp$|x!dG|d+xSD z)?Q0DqS(gW?_;^;=RTs(ksrlBuTf-=pFZ4h$RJAy)dpSS7G8r)iBy@EH_5^%AtU2= zBS!W4Oy81-BUZZ>75ty@8t^YQ9>le`U1VPq=ahTL`o_?D}GX%k5%&B7@*b;ssFeQjQi%?rvnVQYN+aI#l)`ay0pLX+!? zF{^~TFlVifWigr@4%lY&v{F0%>7!M)rS?ZnS9WN{Uwim*ZxK_&c5YNmXv`Kc4J!c- zZR235`7shlf2afZ`IMDeK8}*vpD<@$6M6COrfzxNNOj-Ev>1pQWge_3P}(^`+e`;f z;+#sN2e+$z?#p=oN4&#qH}|8;jglc#s^5ZCW~Ha9In2hrH(Fv5^)OOVSwKjyoB9Yn z;uh+|b61S4Fgm}*M>J#YGwK2v5i1X)Xrn~N^l!M)41L)9`OI+F?+X}7e)$f`J&@$H z=PSIjFGwvRYCMn&`5qyHQs^#qX*>6Lu4Ok# z%@ncC{}@*yjzM7O$xVB`#Ev{PObcOEQj(t2fN2}r+Knv<&$^S*t$uE$Ina51PQsC~ zn5NKoHo<9&%pQxrhl@}Wg(w|LvAa*(0jo|jhov!V#9(y0oifB z_hV}$%9oD2c}+?NUNlyUPdHBfoY(>tU1j?6mvHO9L3d!q3^KYzg{y-dN=U8I5|PDa zx+Ro>OPr?<+F3qk2#NuyB2%XYMv*}P`$#=cC2cdLWKzXoSC`Te-$Q_hiJuAxJd*Ny=AFeV00vc%HvR76QKmjl%C{$~&y z8j>RzY{tL2TXJw^f{8eb2&M66e}@Pc9E^f20D$$GJba5AbrqyHX$X?YwZvjRr`bD(rG0lWXJZ)*k3L)o;;9rRyd5`?rPe1h^4D|-sR^LATyQw$G2!K{!jM% z|Ip#^KeSngDd}V}yd77KDB;{NFWI}c@qD7yQ2G(*!}^u)5E+$MS1D0*UeFj(;m|V} zoi2G9v`+Z@9Z@WG-EXROgne&Bs%`BiO6KJndmpJdq7aztJ$?B`yZC}K z@`)$5xhTCw%V#n6euXjoLAE8x6HVr6GqjVWT-f<_bCQCNp8+tT3FGoz80n!Ce1$B* zU~U6D&aT49l9#9Xpp*u{W*cycdzMW%1j*=*wm{efeBnIqeOxzVuZ%1s5JBHUld_N1 zzI^kp3Kn&ok<`?Afo_OL|LIH^Aqk!&vPH@G;Pm(|%xUFdWn^MIWI~RAyTb_22jsQs zhzwO)=eq)U$C&x(XoyrxtZd@AlRZNq>olD|Fllb=IO5nuNa{oP{udoOYzml$amP}J z8?u#i6cN@K1x;U$=Fd9O3r3Q=_Twd2PcH>u{9Je3Npw$Fzg{J2DbigcHo8qADWvA2 zReWi52(s0=jcolSJ&AInBNiiPseL_cGAo3mC2o_k4LuvO@BIw0{ zB$#Vw!G^pXQnX(zbGIb(6pZ46-AX_&gUOHJq_g1m;daJO@r)qnO7K|$)TV+87@C6j z27Tvu$fo)T%{dKMdh_W*sp@X?Ew*(y^?cm}uoHI!1LJu=d>XJ4+W@7I=#@(~nEUhv z!SqNyWE}KX$=nS1U*Cw-i%UoI4#CRR%2VCHevE#lVf`#rB34T)r?@LlwMwun5 z+ul9zKun_3{VdQn6X* zssSqxskmuaf@~MI=w9QLSr&;FA)XbfEPKS!x%~|6*1g2`;~kgOV(*sxY~Ap8>7Z(X zeb{AYQa>F9R+^{zKG@%<2(4iY;JMo`%K_+>prCVWcfapX3C16VD}-iT1WhH!c_U(v z`Jft}8fN6NcDflw9JR6&a>jC?&Q8+Ql!pT49{ERlpUl&AyELD3P*JGPYzQxrwq@3} zQFbaN>0y~)Y@XuXVve_(s#iN(GmRUvEiJ9SSTwuXyYrNmNbQxpsu2lF*Cj`xS2bYL zgJ@?8Zv9#h?ev@WWBFqu=LGUwKQMG8Egdt>EF&tY@m>G!}q=+d3zYD|k#a27lKIF`WL zG_vQ`Mq#*D`#$Jk%BjI4<~<@=0;JB1|b4JjtIhQJ;()4-e%|{je)1@hVUOUQ)8Z$IEeIe_G zI%Onu_^q`AITjQjz4BVt+m%r*3W@5~A>Us1)+l7Ue2B2_^jgqu-Qbvfre8i&A#A|< zfbnU=GGSI!s>`)hCDyKS%lke4rR_z%?IHM`2-i$K=HLd18{jGD0uUDic0GHsJ&#evLyggm^Cj?m62*ukvaB> zOb0n3A)h^J&R8a%;Xkfm%D%Q>C0(<5_wD=S=NhW`u%X;ub*rD+2oC!xpL$X7lnNOjD6j!ohqb(O@-}6(i3e4#RU4%1z zTtm{Y^QvNe)BDT!KaeC(tHwOgU2j;j zJ3~P7HJ;*=_OKsw{^hcUhkadfQ%a+;MSbTFVp8a&{WXQFm}6 z;Z_xWG$D7FZ@z{56C|Ij=on$3#s_MHQzVb?SQqafgc{tTa3{lV6_0+7qjQ@xL~ zkfBXgORci|koZOhm%2pR8&=&iIKj{|k4d+E+vwugQj7>QwZHCV^o!O!ywnzZ1YuA9u9fHqq;pQ zb9s<7f^DpV2Mw!&-zTDmRU%x~@RgOLUqPbxiFTGOse1F1k4B3i5A?Qs6SEcOs{(_w zX86qbluZ-u?bSLzHkI|Y30=H%$vkIAr9|PY9B=q;ioa#0Rjh+%x5BRe#ddE8;XF9+ z_Rp-5w1B=6I1kdHVWUqm-ezW>iwt*Sh@pVlB>D+44hp}oFl`4du?rXEeRT)Rxg?)m zTY2BNli=JkGr+w@xPA+QFi`2YLXYLMnY<0@xZLSAH)!Sgm&gIOMuJ@g~qW0QI6zM*nNU*ldJkNAWC_~4|GiE9?ROP z*K(G9Ujq!2!_(WVrl{NP<#;_pw>$sn!T1kxkKP!NXv(bcL_FnCV%M;FmVJ0Nh3eu|Sq()%m|xKm42~i2Ao3KVq~G^iP1X5t&DyI=gT{mJW?v(F`AWK@Hw#ya)L)}U_J$IM8pRD=pR>w}5_@zm0SXUQYZ$0xK({kPUV#N>l0knHg9rdrYURt`o?xgzR(jEhg zfW-M&fsS-s;KIm!jJ?C0W$6@-^+{NNL<#E}nw;m7+vSj*q^~1%iEdLzhdxIM-R695 zrmD}W(;v!EFl*t1lTTLeC$nE=?T3v!M}*4W9dcTp3Sw9V`a5HzmM+kr8TqE5pf5dX zVXjgm6;sQqTT1?nE^{kaW75Ty5pHA$Rkn#>8o3TrS-1*KpK=|jeIGC+OcaLj~+qPg!Jb`$?${q$}>odYZnRzOR93f22hYyQkA{ZHTg z#f9f@*|z`boB#C9->|d`xqj!%Y$N-NI(NShX=N-hjMPO~m)UlqEp|mr|IkF#{9QK! zORr&Y#X2aCO8Q+D=C3<`m^e-S$9xas%QEbiLhkbd_puFt&Y?k z^C&$1DtDIVth2^Q;!x)uP*%)hHa_%`H`cMo>vhYs>27LdAp5@2o>t z*P5>oQG1=Qe|ot=?3SyYYh)U=3~+WF@BDgu|I}ySkp{+%J~L|LAsX%d>iHGSz3X`? zl_Hw=!0yE>rK-s5+ssFOxAYEMQhLku%X?+r!cV6@bM>$0pb$zfsTaJJj$Xh{!1K*M zTg@}}SB5@o6TKY3sWa`AlDav31pc)=CNR`zMPYKKT+?{YKTu+rZku+}f@s#53GkH! zpj7oOBcZh;ad=l;H)-}AQq)%Q#*BR`;?gJ4Yr-q^G5^c^l= zOAwoUs{r*`!+;V2o-w;pEG?QL415J&;Z}DPdUwJn?7DGteZWWCV8`t5xm*8--mCu{ znVJs2P#JVG^K9}EH&A&crWz)0D)CdKTDn%a2^j&6rzpF-eD0q z2X@v2x`wpIl;L8Wr~>(0x>SLyJk>irSa{dY?Erdg)}gTkDFnjiQZkA;pDOqVs|>z- zoqes~1gFk>))&U)?8wq+n_FLyf$p;NWi9>*Vy5+TG>uh$+AKW$j<}pl!ubZnL#8*? zg1#o2TgpazRVcXL1gf4P-yC}GL=_!;P?R=#$^0$>z8kV&v|>f(yXQsifZ8^=+@-7# zOtuSe<7X-@T47%;xYlhf!0O%f~VCYKt;VR*fz-(pYPFe#A+uZTB!r zr7FI&;ya`ct$Y{MrymM61zc+|2;UlP&p6y$b773mcOl9~TMVuG_Gqz=VA9q2k~?(~ zT_vj@;Vqrcx7Bm=Ec9>YC)>xed=m}bu;1)6Yu1t#eeinl!o|_!3md-qwfh>kG9JG^ z)H@aFwze}#_xO1sr+0Jh8QAlX=3a02eKwS>C9ThE{P_v;rkY2cHH3IDDtfcdEurHg zclw+0_+c?QYrTWKagISE+~rqJ9EV=~8S?`vljw5R&rV2rD{eI1-#5HiqR`c)ep>9cjQc=2uc!8YDz{?nHz9iGE4 z$Ytd@PVL!W9OL#fwp?@WhBwBkgs_Tx&bvs17%rjhHM*afmhg5BzV8d3thBV$=j6J& zcKpnnpi89V2yq{o&E1eW)m?=^zUL^8AX~RQY?L69smJ=@Hl)>qav3&Q6+x4M&ST(o z*0!&cw`{9VrV-Tw=2A$3)z0b%ZRjz2A{j5OoX}f( zT%`zdY{VLD%uunz*Z(#;PX8$bPIpcjOphHtau$t!pDZ=6CGzDFe2P@4WDHQ%a{Z3t zSJ8;W##DXDfDRhw#Lx3!%}9&g^5qg}K8_LRyc)HNi1|yIq7v>teEFa=Y#q#~+W7&l zcH+P8V*V{V(an{0kh6&Q$79#l6d6IKi&ZdMG{J}N*9>sx-K0W72SaOw6Wu>FvIQyh z`iz^f=|=x~HvGMQ?_XN|?|%JtHe8s*5$2D{l;2u;=D1;h`dy35!_I{o@38~&^?3FX z80}PyR3T&?hWSUYueRnZHU{pEZtS!U_FRAE#((py=m*JZxx`r~+%MNKq~{XRTZe7I zLs<{j6iP3|tcY~h+;OWkMj5Ld534zj&b7TGSDhB3<4pK0k6abm%b~8MIwF1O`Cz%P zc!CF|&wafx7Ocm~NU+v10U`&A#K9?IG#1>nO3KKW8>qqS+DkaD{=s&)!&;1%ng^xyfgYcDkA70l7jWX1r{lPu< ztnhT>J{na0)i_^o-r6g#O^a<9DY1$x_TlWxy@d;QLLh)V0k+o62(Y!zVf2!5^nJ2m z69{l4nsd-miqF~FPSa7lIYq(j)N+S3=ps3dc+_tq(4^dYo_o#9~)`Xngn{SGa5TtR*zb-sd zn!5A(D0a;@iG2$fOZaw1T@V=@>>0Xl5e}#d1t!9Ezbm_8RChojR z<@3_1zZ}H;I@>cpe^!b6_24gG3WEL;vPJ zXXb3mX~z&C0$9BSUykqx_6DC>yDkI1EU8i*ge#q=fw7jz(su}-&VNq(Plx>993d{S8s3tCZJw#ZK5^;?t&yHhewVP<%lekvlp9=+-f5bCUu~|E zULmoaD~)VBrSVSzx&Hv?{+GXR(C=-&D$6;mT-zug@3j8*tFo-=p&jPA|;=&z8k-FXD4k6ywU=rBhg~nTdhx8-@y?J*=w~g%lD?mId2ARn> zJ-DrdyVnUnd>;j;7|*e^T=aShe5?RH3s9!_<$!Ea_&n!Nu93ex1PT)VdhVZ1Bme8b z|7X6eLb*V8hDF^aq#jNnSQ9+YiJtVBV%h7~zzS+?Zm$=fD@;XSci&9KEwlr|Tz}W) zzl(62eH?kKGfYPJ0Z0g(q_E;MkJ+fPTYC!vven;gPGE|t>p;!u1&Oa8Y*D)gq-O*- ztBDe{blIS~Dm3E}pn!hw@}jN$%Qd*2z=RMV~<1OcfJNN+&_K@d@T4;H#q=^a6O5tWVvQIHOTfPxf31O!2( z1nCk8Hi}e9q$Nl%2~q-t_>IqL>hr$eDeJ87TkD+n7p%Q^X3xx?x#ymH?(4cD^?yW^ zcA(6Fj-?jdeGKjvGXA}Qk-G1{sv}fCt(cqIZR`IA65HPI=|#~=^hN{{hLA93lHN@N zw;qf9+4Hsjb+Pi7S2CAvT$A7qx1!lKj~60i|B2>zXL<`Uam z*Ee*f?1NwA6@{j+ZV3rWHR$wvb>R`K^wa)qOEsRKdPASt_01gPxhtM1BoHNC3o&~A z1BGtMOJK$ZCE^DMQMbY-_h$U_21ROh^ zt7pu$T?YKLonU-)kS!arDw!S_d&^1uR&kj`33I8|y|Rm*8&RIuB}T43@f7PE&u{+Ad@oO>mX2#A}PY`y_C=4mF*ID=57X z;uCFuvCZezT}yOA()e3{haN>rIipT^9rK+CXRMB_KG&9tZFBZGMH9mKmHd$o@!pg? zpo{wiuQk|}NJ)wz+3z#I;R?2xgrJzM@;BLDx4_FvRYs({KK zDZQWlJLEG5m>L(=AfbrA7-NFeZ=xo36!UEYM1)I)m%4nSSuKxw!CgNF8GE^&hoZ(C zRjbWfL;F?KhQSnOE9z4A6D08wQXnkmX^8P0(^YW3a)< z+Ezh4qTyK8%{-N^c=d|Xa&f=oN54#G@vUBd{2kKTO!S^mKjy8h)xLjrNjdf2q0_mN zN#|+PAjb|}6mXz9|I}9q9VHdwf)!1P&}%ZsM#yf+CZ8*UgXO|sW76)lmg~lLtm5Uo zmZM2#JU!hnf~4a2s-s(^rtefuEWQ*$zB_oHg}I+DFUs_A`h79C@YZvH;f_$lakWU! zBui<>iVPN=&Utbx z8Jg*x)=ay*hqu+YT+eVjCE%zFBz2Bd4{2)c~_fmu5p!9v@PF$`~Ln=s-fl$ zGAFSa=g75qcBu_Ybl$F@Nkg3g@zrRySw3iHnt*y{KZ(=U{sJ;zbxdkaIHOy^K-%l& zJFX<#$4V3$qS3)OdL)tpGAyTIq*MMx%LX_;={uxT>L79Z9oPkW+$vs$0V?nQ?8UtS znwDjB5?cFSAio}ZY&F9g{Z84IW_+H_6r#b_c&_5Ab7OkA zqsm9ID_??Q(b77QP4X$rYwx-BUQ)3{(=Iz6?=Lr)fgTR|HuK`ObFg|VV|{{qc8Zpg z(C4RO%=_3VH2`X~?52muPeNOVsS6IWB{O?6Pf_D~J2M%eK_k-}%5cUT_=v!L?am2z z)Ta>NwhyIChx%x3cBp4r??kRkeci_;3EXvSnG3}cWw29F4~vy!b#3^~8&-(Q=8Ikd zWKw#hc|A6dhRo9cd33aQ%;%Lz{qSqPwXCZdGz(nJolzoM%2wZ75zF;R5vP!c|~#WX5KEox-coYg6=H%?QSYzNo_o0b|bs zx=EJ+M&9vF!5*<5KsTMLO1HCL*CtMrUfQ$oYj)2{c$Jo48yALmT!@U^q`1*D#U5ca zeJnUUa2i^-koK`gvmEZz)fTjN?*r{eX|K6V!qILSqPOYT*3==m>taLB#hkpBDGUox zs48!DL03HZ@>(Sh$1jmhoMG&4U%^~uTyPHH85e%iv`$CSkIPxEH`$o!M{|NEn{t)j=nY>4flNAwX2t**`$1z5odyw1kb(NF> z%iTHucn#e?xtOp~9RtJH!DcRbPT`Z`ok9nRU+s1s(NNEQL)ArvwegMlpcR(}8GGnT zJ8;z!jP{QhfR(re63!2tOQ<~gU#UdFLW_003&+>CWBtEF=qkt$58BCU?Te+^Kb@m^R6EeV6?4pGAfKd!%&!?`2l!w!22QNrC;6)Il|HB>$A+0q1g@?On0}O4mMP zd-}R>IFf1nCS5Z%D$fQ ze&4WPCinqnCv@s`kl+5)J;kyrUX(uJ1irjQKz!f(pm@dVo9gP6ylQp!dKh398X;tm z4RbpjcYw$9rzb{SHddE~@u@@MohVv4BW2_V)CAcGjRD^}d3R!{L8i}p#pb`|RPX1k z&)xlP;2_?2M^0_+N`d|Q7gaE=kN0JNhd2ZP4UCoxf8KWdaa$DJ#*lv8Zu@cj8rWza zijwvCJM^-DQ^8UK@P>C23P^Eb-ysKg{NS6HEwduu7i{RuN$oQN53oqE+LB=3G8V}= z`r<{gr(3R3z9Q~i`ihGaMBwRIZe*{GKt&-*uDxMQ7Sk$^HL%g;;BDj)6}u8gjqc#P zs?%Q&3HT17TJa@W5)i2TV`Il{n?ERFR>)qlELry-u;j;>A4=6Q@Qoa9V!Yc%^=j;J zi)R^T>go9zGa8R^UU8#(;?-T!i*cXhIkwK7zLp7I#z4s`;I_fBNEU#45V* zrTF+8ND|cMUROgqOQedUXOsPUj3_?;wy$DNaI0i{5M9=8rv4u#(NT@_8DAi##HsQR z;rRKPpz^YJP1e&X*wC{hIb7DMa|V}*7#uS*$zr5MrI<(oH6JF;UA~^xFF@%;wfo>K zH*Y)&0<{Z*LrKsw$Hhqcp%#Uri7E7FLuZfG7ibeUXBYE{sB33hjrc5UJRP_P>NtW1 zHVsq^-1kv^pN>gxp{YF%k!T4Rt#tVvGm3{m8@I=1cW6d4xjnJnqndl!X45lRy+F2T z{HpN>Zq{8d4YiS@lmLe{)~`Gkqw0;X#m<%Bpi~RK)r&lchdUhCT$|RNR+_b}_;KPI zLVU*5W2>-2&mBib+^7TkY?<{0s{Gm?{$k^%clU0>OzgB#AC{AirlpXW5918kM>TnM zk1egvGGwfUjg}^8ccrHII~VEB(5D_*Nc(c6%B@|pS&*f9&P+1O5D0;8geUu>ncw8x zonj_Q6^9tssY|4N*+a=gR7%6HB84ob65c z)f`8!Yn={gv|;*7vOw|f08KBMmaqy40df`a{#|gIw>c5DGV~APbu)zBm3B{Te}~vz{xccLGRv4`c2H8!%iHyB(~)uUl}+Q)GfUIto*jhF)Xsv% zv-^Zplxb*CHk5X2*(_z^J0#M=?W>S5W1Gf15e<~K4UWuD?oT6rK<@CYcPYvBs#r9) zWRh+-a7f(G4osIGmu%d|u~B>?_vX~29=8eMPn1n9+DPJ5z2Hq&PotPM-ZPV!YO8=( zOss@2-v(xk^ZA}7GS6s6s%L`Lh~8?Mr}W->(I0kS9$soQPRn!_DmrXj$+Dp_9nOPp z!p}8KHHc(2G-(nBEhw8vwlz`kCrwW8k_*=qQDFnr?W@ew2L7l>_MtUZC1&*6&DUtl zI<5(E=_tKBNS3;Y);EgtcM7JV$vIMSTdOc+n;d>KOe#+Di>A+DhiZK;7u}QC1*>^T zI8GJY>>o##Ao$1dUTVab#yEBby$WsjOW>dM2^p{T`;vbhcvN9bd8GVhZ9+E6KR$=L zx|}EtKeC9vlrUrz+^BoJ;vOc;%uUtF`I@w$2PFVg0z9KH5jbF?2DqvHI3Q~76S$cf zfx-I&o8HsD!vZ?v^Uop)KbzeD7ynD-5>tOfUb^Aihg-mD0kgfxZ(D=~%HH;?M!O<8 z*$1&D;E6vh8^-$KwU&vhN`)l(VadQ=xc-nI)FNFoVPjj-{sEGff%1=lG_707;WVUE zaFFc%bq1Vk^MKR%ZsWsnrU=DPs&W+}IpmQlKijUMN7YZ7TthZ&&YNqPY!t}F9#OsW zN_IVZQecq8Uqy5n{0_0;v8WeJ*RitTH7)G%IQna|O^N1Gm+Yb0IO`f_K#WT~eWI1KbqkPojE0{;%7PJ1Z^#+^)y~)V<_4(WUa}!C8_OBV!40Tm&!$wnYlQ>I5Xpm0i|dw?Osljb{wUHdQnN26;;{Q~ceT>AWx6wxg&dArEJP(fvJF{pD{|}TzEtN`UBKl+1tKG}JUriy^o;v943ztP-oM@!} z@)WPTnDPwK;xgT_0C(%Jn-|IsKXCZCNrVG*UscGy+o0Xt&ZUV z*?Gw{MlJ0lr^e1ftb4C23m3+iQ`KB}`!kqN#SxiQ=odmLh*S{5O8))W2jh7c!+M z%zfyjPpn7&5STnV!){E^P znE6{-f8@J;S?yEC1(13nx&bq-JnN2iW1>U87_-`mSqGo41a3W+#_L+6LNr1-vh9ou zXvwc%C$pbnF!qj@hU^XF_uu8EV69U{GlmLRZEk`v$P_mWL_rRNz~uUYWP02E%H#{3 zIn)&|Y`ylf?z;z;p?&t%hF`{}OIBJ3AxvV0Q*YR8{>^yhzfb`E7yeR!h{ozw;E1;0 zYhT_lIyltYj%?qMSajT)X9iB{Ts2z12dxm#F{JU5Q@6}hVKA|5{%)aTwm(ff@rDBi z-;SkD#Q7c;9B3P!zl4aDxR=G60QEa_WGV9UUf2N5jlYBQ0WqL&w+iOTw=;pQ&n577 z4MnIQRGcQ6oX#1$-&s?4?UCw}Gu|R`Y5PX!ja-J<2Yv~L{~(}rlm~1&KLyCONpk%M zy0Bf4cDgD{v6%@NEPuZ8kKg~)SO0GRK_bA}SH?5K`au_bvq5=Jug&QoZ+(uy+yi4H z#@WcVaBd?mzgnBDkwu(sH2BP|*ssXlqqi6NZ`^~wXNF32sh-<6SRg|Qr%Q_sW|kLS zht|HSuIWB;XW!5Ry%V=Naa@Xd>ik~J7mEs^OLvb2(;e9c5U6WK34~M* z@*t1V-4^RI4@+gn)vgBVU4v8C3oWMkq9W@kRyHl~e2yI6liV)$^=RX3*J{kX!r*p^ zv5SFRzYc`K98_@qXdYxon_L@y6?OYYut-7nqx2awdE&?(3nmCgHxFQzvekR+)iC@? zI57vZ$C^O#mMXYfgqTQJ>zSEPbUfcQP$gyWtQ)Z~Z$_oy!vdhL^_meofI`Ew1U~Qr zBu?B08?Uah*2S^Jvc(`oSqaA++k=xz9am|fFCf-MEeLEdYF{cgUl=iXdeb&>JO7j4 z-I~5K$mwMS6?Dy=P^CcT8PWq}TQ*=;9s)bV_(J9j12iQjj$n(4wDEM@lyHDg zn}S3?xz$J(0$ZdcJ|(aEoZslDsS9(JhM0uwS~A2RIxzE7?CPh`q|-bm&4bT|VRaF! zZDvp8L&KG4`R3t^4xojr2CuKKVQF=29KRjB3LS^CB+&BCrrYC-da zN_YbF=!-V4#UKSlm`_vm%vC|?(~ff#UX-C+BI1#qo8fb)d)9&O_f znPZNNWHksHeXlRPHFEkc~gfTzIQAM3bc_fNwW!%C6DTSu<-mmI5w+erjD+* ziFzV-f^vKs4!yq`pJjbv?QLJkp(vH-5(R{@#N&8abTvs+tzx3*>esaxzLUNi;(_Y9 zwM5J0-@Xa3RwC^4?Q~>GbcBg=S>52XA;8Shk~it|WM?;b&xrxRLG3LQBhKfu;j@aX zdi};uIv>e=qJ_3&8ZTr_keF{LdK*ZPW4!xGbdKZ`%>^+acvDFh^~xT#$ho)|Zr%AR zE6ZvBwvS7c80FvspwTh6r$L70R|^|RFK(w#$m(6QJI;Y-_QA2w!11FwmIriW1w^)X zk^$t_5zSC{q*RK$BWsI+da`%X7b{iyNyd2cUH?z@_qh4hdpBG&iU}CF9e7t&-E#=K!*ffF_6YL)a{% zyj&=EY*mjOZG@CkqQ$zUfU44l!5>%pX zfd6saJkUUS%4$$b_QQyzZzv_^W8w6JKyl>8i5Hf!A@{Z)4@JPRzD8Qv$l%NB1;LUP zItX#f2iKdUdbm*@hk_0=Bbco2moG0JSvc*C`wlr~`n!h2xx&aHv|B6IKt?AO8GNnb zNih5K_haJcIj=Rx^(gjvPl!=={jQtwJCg4y;ohpK=M0p~%Z8ziCuecx#75GG5H=WO zo|j2^)UROQeB5!#V)RaDHcM`Ny5!uJ;Y1e$&b<}l2}YWDh!8ot4a|*>I2f@PihrL^ z3xbl>AoKY+Gg-y~;~;}uM+=N~H~?7s55Up`V)tMx$3KXU`lBv)JDOr1Tb@6TN$}Ue+?WExgYqq~8ow%{ z{QhOD?qN$&R_a_{791H1ue?rdb39PCqurjyaf#osgZ`)6UOEkWzBI7~`fT}=ZT)jc zVwAu({)S$L{Z@65 zL-WE1zF-0%J{@0yot7Anpu{eaf~OOiSuS{tdWOzjq0R_3NS6-m=nI-J4TC)Scd&)_ znb!)~$f8I*QvYRZfqsSwXNK%CQ)hvXr*FJfs+I;7s;>b{p%$1{lwc{0D`YMbtGYbX zlX8U^KSMR<%)1v7XG&wHN8N`CjIFCV#@_2*yc#Uju#yIU zodga)uWClD|2|3`%7FuW3U*Xg=0@eYQuTbn7VpbP-wTVi*+d ziUbT{KJjSBB<--Orev{0Np|)_4uhDTx8-9rTod_uWt2~f+JgU5X!Ql+Wx{pl1a0#_ zJXt;4$J-2p`-H!#_L39MCKtSbgh{d|W7q$vzDqg=_NlgVgP+g4ovB!rN*RCC9dhs2 zL3E2nGc>!iKWQ5*j9dEqVzSn~^N5VfoQmpY);lS4+G_QQqH-}jrrZG)SRPp{U2qcHq zvpX6$?^EXn23`Khfp2N1K&=)&cE?v2{8(3i9#vwL3kec$Bl$?T>WMKp+D)#TM=Aw$ z986>;Xed4U&emC01KNOyHMqCFppH6ABbZ^Oe-6eccixS%^OU2yX*eCGv+U);BHVLbSIZ z)DqkiHz(*|j0Rp~-)JxPhH#w-$2s+e-}_*AVYU%9UaRb-nHkDqADuVz8y0w-xe@T85-#lGm(1Aox4w3jB-k>s6_$g zSohR{g^*HG*dCL=@Y&!icQ?_1M48uS-Q#Ej*%6nRe*xRBjQ$R}Twe>$IM3^lKS^u0 z?_cC^e#n6Puv7iS15(sti=|m*;k>OH0H5i>4^8pHqz(ifX?K9>URzN_tpu*xO_AhU zpqnS&0U0DPSW#t^3urMKL6*rDIM%4=Gnt?GW|I@YymZ(}w}lWQ)VGESf&!tPZ90j0 zDWZ1>Y{4J{L~||xB#-4lj_>sF%?ka2e5=>DPaJu?`lS#DOa9^27Gn!~xX9cg`55gC z4PX6L4)2>MI3q2-G*^A`fqm(_G1*w~YgxuLpXx09@5$Z9Lg_ti-gi3jB>!nSTUr-* z{jSL*;S|~5L|70%7SM00srMN$*25Y)2k+TdOStiJp-{b$uv_fkvVUz@#g`UdtQ;Zu zPTfSPWO7;iz1}}Kr)tyBHdCqrEdalSZv}}kj-eT+!Am(ZUM|4;HO#-?Ahi~(G~8&% zl!W&DTH23p0%1Qmc8f4|dqq_%%dN{Hv|wS*NXG3QxB52q4TPG?s6w}Y{35<@ok3CM3!PmFF+H>(b@7-O$ahGf{@piRY#diN8N@XkqjVAPX~8mnUpSTeBwv8My$Hc>;7{UM{zP89S`+|`=ME8ZufRLra61r#0c z0gIB)ZY2Q2Wf$7K zA@g|E&X^{hJk$mWDE~}E=piJx8*KIKHJ3$oFogZ~sA@N&`Seq~C=$bXGL62+QJoOA zKZp>Hi&=B`~iV?Kyv;85K+Gur+t?ME%!!!o=Bu+Ktc8ua1ASb zk!BQNM+Phcqd(2Tkyr5Pw{XJq^+-07M=Cb90)AB>7VTVn+ih~p!H?8%HaRf?vPCDM z(xr^pW{#CJa6)dUt^k|Yl7@-sm!$XYW0Fa7r*2^;^Gq`D9R=xLZ_<8X$0#;^*=MKd zBbB-dGTjP1(jLsu9{Qk{dljzOV}MgEFSYaS@piSz@M-d!XZH3h-_-l*Kh!Et)a#<) zbdZ|ARBu_GmjqA5LX%tuE+eZ;9~}#g_!c6J`t;cMGb|4h&d6rj=f2%=_bknuSFX^# zBg_D<_JfXEVj7AThw>3|MtCgIbH!l&QR1C2;qh1U@aC89Dgk4y;pV_%_3ag`S|8+9 z*pEZ0LkryUW~L6xlQC9FxOcb`52C_0SXl2OP&RJS5u)2LMBg#6@2qR-mr~o_y#RYy z$Q)eMaK%1i64Sm(V+%MvXY<;xKQ@W-pV&VxQK_qn8- zFoNRR=b04co@heY&->ErzJBzqad4$1v(I{Rg8Siqy7&Pb#p5=CPbPOx+;^%h6-;!c zg1)cwD2fvAEm_==kwtLG55AqSpRo`{n2N(zz!vj%7M#e`K4V!{c&NhY+2;xUIlFP& z-V-gYL?Z09Md=L z%P6eZ#eC_$@ozt9)r82g98Y#hHfPZ=H|K&db(kq|a0Dm42==7SPdHJuT_cojP&idb6+%u z|57#ZCTXtY4KY^`@yC0sD;3ncU9&qpYK_})aMhkKmh-h%T190UsnLR84k}x?s zIVi*bl%?bDngq{bs=aB`et*Vc2m6m_dj)PZXfnWrOieV{;58urL~RWu3YEb@jTNG{ zq1M7yKctZ1`b8a1Sf&A}vB&Y(F-48>BFRm~WlrIna+iPUh$XQ@^xhJ-YE!Nav5drt zuUecz%I;8`EUV)D6Dh9NLe8<4+%)*ozr4!8-`U;m<7ifzhLzL9V)}yjl_naDH+5Y+ zX3cLpnPalqE$Cqs`NK>8)ljXS&9mgQkd2utCff24%-x zJ%xu>?LTL^d9bA$T@SDnE2Q&$>RF@nO1l(YT+UGWQcN&q8e0X(Ff_L1)0ILcorC=J zWt}o~WS2z*6IHHh3&v%q4uUQ?d`={@a*#6%&3R)a=L{fP3==zq*!E2&?P9(|rb@v0 zt_7r53=Kg;ZM!d?+;8#=c_Z7uf`RUSLwtv{gClCU1PFu8nDWKY7xM z;n2d79^7RU4fgh0ANYLV6!}1kXdYv(NteKG<^(wdDJhCNo-;Z*eMgn$y*8wYGPSRm z+zYls1uF3U&Gs1!k3#AqVGmY0GxKTjBnpEZG=0*oBCfBPp)l&6c`%NCF4v5JN<*;< zo1Ob)_D?fITdqX`as-=VtVA))7a7R;TXP`NVlKDkFYusRgTQRgqAfM9?Mg2L&$1Mt z3N#@WKUd_kCYA9?tK&Kk9;YQh`e%SnJ@=`zeYq!+T^*Y3&#^QAUbHr2i~Mxl@f5+( zV{8m$vqd4@;*;VMPnIgBnP&`(q9ovMU~>&9&<^$-@#W49(Ni$@SVctO=i4`S%^nz2 z+Ou9fdAy?HntANGGT2W&mm_va%-47I-I;TI7x8+6+@$B=1WtU3+sY|gnillsFXfhY zd-_sxL{Ex6Ok$0r=$QeZfr8>Tm8$@)+S2cz7IJ|-ua3Em*TcmxH~kEw0r=Lo`|>^H z2$0FJJ_u&0vWkS2D>HkY7_Rt~6AN*8)0o1%FVD3r!`)AJHiPxso_T`UA*!0XWMq#w zo%9B`3nU>QT#@moXT4;S9x7ZmciW#X?V?Gv5|tSCX;Bnia$(HFtoS2px+dT=vLuF_ zdm9VepEY}6qQT&CJm?fb=;&}Jb;im7yq^nH;Wl{a@YyHv7%85!TjGrB36Ru(yG3#P zHqZ<0iB)29O}5&6XY8roOG6^0l8NjhY!C<=gc>qUfzBalAEUl#(PMy=1*QX53l5-F zK@g|yu$q~8R3SteauSTS7S9u^T|b^te0Gq-yo-Y#;KlXCDA>)}#Knx2A!l_6Pos{o z*zzkd43!nqlK=TNY+IU|onj^n)IW-7628MK{&G25#$aC-`V9r!pZ@VdO<2#yjhF>? zaFw`P+9}6^^hIDa{;dgyI)i5}dQ{{$Yn>c6J|taHZfV@HMdkKr+XFVA1mEcZwwL;; zr$9uVdB1%zcga3##C^(JLHg_?~n*O^H^b@ryixlVr+Y2kg|Vi+m9~njuv)$$9j^V*7)S+ zKk*_%y|7(lTd>P20Ub_QZMa>t}2<)tE~JXo-Xw zxBxL+Mm*<7-BoK6E~zeDmd(SI!Qtz zSMmPnnXc)x?w21k;F+n6X^KtE{OheMH+hq7#GbXr^18jYS~ZjT_$1hwLXcJaT)sC= z2b5J77PqI?_vFc~BKG?1_c^@vX7?4}3QL@M!~Le;Wl@9wDm#*>k44?V>B`j>VZ5j@ znpC~P!g|LaFitJKy<&Ji<1OEnN}>YR?GDbLc9NLhv&x|ynDh!HnlIHn_?)oP<9!BG ze@|(vkf|+!Fm_Pd0%^(~&kS_G7o-`3WnCh+ba_7LxJ?ZU>`EkX7c+lGiFE0xT#B<7D^(_n!yW|9Uj~-%gnI_r&S` zCtm++4$&@RdWw{%kP2TD`VJ|n0q`G+j}aFLt=UKr<(OCwZg$WVu&<<=?mxRxsG8dN-sqxwcT{&&k!xNZLsVROqOk_fqb4{L1N#%RYI>&+-0kqA zsbA~lw}UozgEcel-`zKfQrcyviCHo9{uBYW_+8{<1kJ3}@`y7doAf8|#I`j`?_N8s z#=p7wO$g(oVDc7Ygz!I5~^OZ4^;pasuL>b~{xy4kk%;ot&B*=m*u zVZvBaUHw2{p8iE!_r_N_DwYA)2;W#^>Fb&$G8Na911^&kiAJH=Rr>C*oi1CY)vZ*P z-Lx)*iL|cIYsNV$KkYtF4>c;6nnEVr%z6yq45N>rv63AZYE;Pa$C)?iKkZg|o%D^S-G3y+={wUyata_&H^j2w71UnvTm(_y|maKYK>4q4pE)2=> zc;8WZKCg7`UQg4`q6Xhow7LiaDS1MQf@F#h$Bauf9?iY>X5?YIJuOB&x@XQbq~lHX zvs0%f{biTE^OSXF>vBXw1f-hYYMG__Txkm;^u(zPlB@AmP_#%+w+dYdy}R!0mDW;R{F3i}{&=5S86_By@ecf{-R<>kHf&Ff zFgN2}k`S61D;aG5Z=wr2>(#kQ2EH`gL1UWB4~9w74x_?pB+OIMcU0j@&M9xyD%?%+ z+qF`w;ZMCy7A;?tXu5Xl&-hL171X|OluCa6j*@%bj83Tic!*!Rdk7xqQV+S&WEsngY&%XgQ0v65TMi#<2O7lpUZ;MT1t3MX z1FNyph>IYN;5E>a59tPUbbjLN-Eao4Y#5h1pPfgO-0WUZK_Dc{);lO<^}c%&sf$63 zPNv`4G-MsQ*So%YVS3eONUycP08yLl){-)j!xfi){emLbD4wkGtCpY(*_shIp;f)7QaU*xiipk~P)K z*X=Z`N z*S}>r*+-q3ZdIboVetG2I6w**3yK5?DI;X+u1G!r8^4q+Ajjz~O3-vEGP&FR|&CHD!=i?kp_lj}uIo{DID#+lTcZP=Y+}pYyx_iE#NpDO~us#0>v8USs|X zjLeZAL)`X{fz{C@)rTi@SND#L%+gaD%|=vT7iMnuc6C-$*{b^R6EqeAu(5w1SNqR! zjGv*lKjUiuXa1Oy>|aX)$DYyvr1UjNyOG-+zpOe~f|u@)%(LKK_3I5zE>_ literal 0 HcmV?d00001 diff --git a/docs/src/plasma/plasmac-user-guide.txt b/docs/src/plasma/plasmac-user-guide.txt index 2abac057488..4d56ea419a8 100644 --- a/docs/src/plasma/plasmac-user-guide.txt +++ b/docs/src/plasma/plasmac-user-guide.txt @@ -288,11 +288,15 @@ After creating a new configuration some initial setup is required before using t === Initial Setup +The following heights diagram will help the user visualize the different heights involved in plasma cutting and how they are measured: + +image::images/plasmac_heights_diagram.png[width=800,align="center"] + After running the command at the end of section 5.1, LinuxCNC should be running with the PlasmaC panels visible. -Click on the Config tab to open the Config Panel and ensure every one of these settings is tailored to the machine. +Click on the Config tab to open the <> and ensure every one of these settings is tailored to the machine. -See <> +To set the Z axis DRO relative to the Z axis MINIMUM_LIMIT, the user should perform the following steps. It is important to understand that in PlasmaC, touching off the Z axis DRO has no effect on the Z axis position while running a G-Code program. These steps simply allow the user to more easily set the probe height as after performing the steps, the displayed Z axis DRO value will be relative to Z axis MINIMUM_LIMIT. . The user should be familiar with the recommended <> From 1d0343e3add43eeda00aefa0e3809f6688c6551f Mon Sep 17 00:00:00 2001 From: andypugh Date: Thu, 21 Oct 2021 22:55:15 +0100 Subject: [PATCH 55/85] Update M51 description M61 works in auto mode in addition to manual and MDI. The description indicated that this was not the case. --- docs/src/gcode/m-code.txt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/src/gcode/m-code.txt b/docs/src/gcode/m-code.txt index be7f96e5f08..cfe618a1d97 100644 --- a/docs/src/gcode/m-code.txt +++ b/docs/src/gcode/m-code.txt @@ -334,10 +334,10 @@ cutters and wire spark eroders but it is not limited to such applications. == M61 Set Current Tool (((M61 Set Current Tool))) -* 'M61 Q-' - change the current tool number while in MDI or Manual mode without - a tool change. One use is when you power up LinuxCNC with a tool - currently in the spindle you can set that tool number without - doing a tool change. +* 'M61 Q-' - change the current tool number without a tool change. One use is + when you power up LinuxCNC with a tool currently in the spindle, + you can then set that tool number without doing a tool change. + M61 Q0 will set the spindle to the tool-unloaded state. [WARNING] The tool length offset is not changed by 'M61', use '<>' after From 2e94d346a37716981587039e5cb88bcd41f70589 Mon Sep 17 00:00:00 2001 From: John Date: Fri, 22 Oct 2021 06:16:18 -0500 Subject: [PATCH 56/85] Docs: spell out abbreviation at least once Signed-off-by: John --- docs/src/gcode/g-code.txt | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/docs/src/gcode/g-code.txt b/docs/src/gcode/g-code.txt index ef1fe8804a2..d53384cea0b 100755 --- a/docs/src/gcode/g-code.txt +++ b/docs/src/gcode/g-code.txt @@ -1184,10 +1184,10 @@ redundant and need not be supplied), but it may be any valid tool number. 'G41/G42 D0' is a little special. Its behavior is different on random tool changer machines and nonrandom tool changer machines (see the <> section). On nonrandom -tool changer machines, 'G41/G42 D0' applies the TLO of the tool currently -in the spindle, or a TLO of 0 if no tool is in the spindle. On random -tool changer machines, 'G41/G42 D0' applies the TLO of the tool T0 defined -in the tool table file (or causes an error if T0 is not defined in the +tool changer machines, 'G41/G42 D0' applies the Tool Length Offset of the tool +currently in the spindle, or a TLO of 0 if no tool is in the spindle. On +random tool changer machines, 'G41/G42 D0' applies the TLO of the tool T0 +defined in the tool table file (or causes an error if T0 is not defined in the tool table). To start cutter compensation to the left of the part profile, use G41. @@ -1259,8 +1259,8 @@ that axis's endpoint is the compensated location. 'G43 H0' is a little special. Its behavior is different on random tool changer machines and nonrandom tool changer machines (see the <> section). On nonrandom tool changer -machines, 'G43 H0' applies the TLO of the tool currently in the spindle, -or a TLO of 0 if no tool is in the spindle. On random tool changer +machines, 'G43 H0' applies the Tool Length Offset of the tool currently in the +spindle, or a TLO of 0 if no tool is in the spindle. On random tool changer machines, 'G43 H0' applies the TLO of the tool T0 defined in the tool table file (or causes an error if T0 is not defined in the tool table). From f599a9be9971912e742746c4acac78960a190b31 Mon Sep 17 00:00:00 2001 From: Petter Reinholdtsen Date: Thu, 14 Oct 2021 08:56:12 +0200 Subject: [PATCH 57/85] Remove use of unknown .HTML macro. As far as I can tell this
do not make it into HTML pages, and it is useless in the 'man' rendering of the text. --- docs/man/man1/iov2.1 | 1 - 1 file changed, 1 deletion(-) diff --git a/docs/man/man1/iov2.1 b/docs/man/man1/iov2.1 index b46b1fc2f1f..fd6d2c5be02 100644 --- a/docs/man/man1/iov2.1 +++ b/docs/man/man1/iov2.1 @@ -139,7 +139,6 @@ mechanism) of the tool requested by the most recent T-word. \fBiocontrol.0.state (S32,OUT) Debugging pin reflecting internal state -.HTML
.PP See .UR http://wiki.linuxcnc.org/cgi-bin/wiki.pl?ToolchangerProtocolProposal From 30f7380c8d97d35d2b1afa05752c68f05ec1a653 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Steffen=20M=C3=B6ller?= Date: Thu, 4 Nov 2021 19:36:03 +0100 Subject: [PATCH 58/85] FIxed IRC webclient URL Somewhat ironic that it is me fixing this. --- docs/src/getting-started/about-linuxcnc.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/src/getting-started/about-linuxcnc.txt b/docs/src/getting-started/about-linuxcnc.txt index 0669fa39c96..3e67046cec4 100644 --- a/docs/src/getting-started/about-linuxcnc.txt +++ b/docs/src/getting-started/about-linuxcnc.txt @@ -50,8 +50,8 @@ It is a live connection to other LinuxCNC users. The LinuxCNC IRC channel is #linuxcnc on freenode. The simplest way to get on the IRC is to use -the embedded java client on this -https://webchat.freenode.net/?channels=%23linuxcnc[page]. +the embedded client on this +https://web.libera.chat/#linuxcnc[page]. .Some IRC etiquette From 33dec06b3054c680849d9ecab5bbea0548aea59d Mon Sep 17 00:00:00 2001 From: Chris Morley Date: Mon, 28 Dec 2020 05:07:06 -0800 Subject: [PATCH 59/85] emc: add a system param :_metric_machine we read the INI file to check [TRAJ]LINEAR_AXES for 'inch'. and then set th eparam accordingly. Useful for remaps to decide how some varibles should be interpreted. (cherry picked from commit fc0170259c11ef2af00f3505b9b4fb22e1196449) --- src/emc/rs274ngc/interp_namedparams.cc | 36 ++++++++++++++++++++++++-- src/emc/rs274ngc/rs274ngc_interp.hh | 1 + 2 files changed, 35 insertions(+), 2 deletions(-) diff --git a/src/emc/rs274ngc/interp_namedparams.cc b/src/emc/rs274ngc/interp_namedparams.cc index 3dfa1ce6f9f..90021ea2bb2 100644 --- a/src/emc/rs274ngc/interp_namedparams.cc +++ b/src/emc/rs274ngc/interp_namedparams.cc @@ -744,7 +744,6 @@ int Interp::lookup_named_param(const char *nameBuf, *value = _task; break; - default: ERS(_("BUG: lookup_named_param(%s): unhandled index=%fn"), nameBuf,index); @@ -781,12 +780,16 @@ int Interp::init_named_parameters() const char *pkgversion = PACKAGE_VERSION; //examples: 2.4.6, 2.5.0~pre const char *version_major = "_vmajor";// named_parameter name (use lower case) const char *version_minor = "_vminor";// named_parameter name (use lower case) - double vmajor=0.0, vminor=0.0; + const char *metric_machine = "_metric_machine";// named_parameter name (use lower case) + double vmajor=0.0, vminor=0.0, munits = 1.0; sscanf(pkgversion, "%lf%lf", &vmajor, &vminor); init_readonly_param(version_major,vmajor,0); init_readonly_param(version_minor,vminor,0); + munits = inicheck(); + init_readonly_param(metric_machine,munits,0); + // params tagged with PA_USE_LOOKUP will call the lookup_named_param() // method. The value is used as a index for the switch() statement. @@ -906,3 +909,32 @@ int Interp::init_named_parameters() return INTERP_OK; } + +double Interp::inicheck() +{ + IniFile inifile; + const char *filename; + const char *inistring; + double result = -1.0; + + if ((filename = getenv("INI_FILE_NAME")) == NULL) { + return -1.0; + } + + // open it + if (inifile.Open(filename) == false) { + return -1.0; + } + + if (NULL != (inistring = inifile.Find("LINEAR_UNITS", "TRAJ"))) { + if (!strcmp(inistring, "inch")) { + result = 0.0; + } else { + result = 1.0; + } + } + // close it + inifile.Close(); + + return result; +} diff --git a/src/emc/rs274ngc/rs274ngc_interp.hh b/src/emc/rs274ngc/rs274ngc_interp.hh index 3e5cd4da2e9..83b4339fd98 100644 --- a/src/emc/rs274ngc/rs274ngc_interp.hh +++ b/src/emc/rs274ngc/rs274ngc_interp.hh @@ -134,6 +134,7 @@ public: int add_named_param(const char *nameBuf, int attr = 0); int fetch_ini_param( const char *nameBuf, int *status, double *value); int fetch_hal_param( const char *nameBuf, int *status, double *value); + double inicheck(); // common combination of add_named_param and store_named_param // int assign_named_param(const char *nameBuf, int attr = 0, double value = 0.0); From 88ba23a147841e98f119613c8e170dfaa98e7341 Mon Sep 17 00:00:00 2001 From: Chris Morley Date: Mon, 28 Dec 2020 06:12:18 -0800 Subject: [PATCH 60/85] runtest: fix remap introspection I forgot to run these testa again. broken it when I added '_metric_machine' (cherry picked from commit bf4012b9c359cce5c3f0e54459b4218f9ddd5360) --- tests/remap/introspect/expected | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/remap/introspect/expected b/tests/remap/introspect/expected index 0277cc19670..ec7f3c61363 100644 --- a/tests/remap/introspect/expected +++ b/tests/remap/introspect/expected @@ -30,8 +30,8 @@ speed= 3000.0 global parameter set in test.ngc: 47.11 parameter set via test.ini: 3.14159 locals: ['a_new_local'] -globals: ['_a', '_a_global_set_in_test_dot_ngc', '_a_new_global', '_absolute', '_adaptive_feed', '_b', '_c', '_call_level', '_ccomp', '_coord_system', '_current_pocket', '_current_tool', '_feed', '_feed_hold', '_feed_override', '_flood', '_ijk_absolute_mode', '_imperial', '_incremental', '_ini[example]variable', '_inverse_time', '_lathe_diameter_mode', '_lathe_radius_mode', '_line', '_metric', '_mist', '_motion_mode', '_plane', '_remap_level', '_retract_old_z', '_retract_r_plane', '_rpm', '_selected_pocket', '_selected_tool', '_speed_override', '_spindle_css_mode', '_spindle_cw', '_spindle_on', '_spindle_rpm_mode', '_task', '_tool_offset', '_u', '_units_per_minute', '_units_per_rev', '_v', '_value', '_value_returned', '_vmajor', '_vminor', '_w', '_x', '_y', '_z', 'foo'] -params(): ['a_new_local', '_a', '_a_global_set_in_test_dot_ngc', '_a_new_global', '_absolute', '_adaptive_feed', '_b', '_c', '_call_level', '_ccomp', '_coord_system', '_current_pocket', '_current_tool', '_feed', '_feed_hold', '_feed_override', '_flood', '_ijk_absolute_mode', '_imperial', '_incremental', '_ini[example]variable', '_inverse_time', '_lathe_diameter_mode', '_lathe_radius_mode', '_line', '_metric', '_mist', '_motion_mode', '_plane', '_remap_level', '_retract_old_z', '_retract_r_plane', '_rpm', '_selected_pocket', '_selected_tool', '_speed_override', '_spindle_css_mode', '_spindle_cw', '_spindle_on', '_spindle_rpm_mode', '_task', '_tool_offset', '_u', '_units_per_minute', '_units_per_rev', '_v', '_value', '_value_returned', '_vmajor', '_vminor', '_w', '_x', '_y', '_z', 'foo'] +globals: ['_a', '_a_global_set_in_test_dot_ngc', '_a_new_global', '_absolute', '_adaptive_feed', '_b', '_c', '_call_level', '_ccomp', '_coord_system', '_current_pocket', '_current_tool', '_feed', '_feed_hold', '_feed_override', '_flood', '_ijk_absolute_mode', '_imperial', '_incremental', '_ini[example]variable', '_inverse_time', '_lathe_diameter_mode', '_lathe_radius_mode', '_line', '_metric', '_metric_machine', '_mist', '_motion_mode', '_plane', '_remap_level', '_retract_old_z', '_retract_r_plane', '_rpm', '_selected_pocket', '_selected_tool', '_speed_override', '_spindle_css_mode', '_spindle_cw', '_spindle_on', '_spindle_rpm_mode', '_task', '_tool_offset', '_u', '_units_per_minute', '_units_per_rev', '_v', '_value', '_value_returned', '_vmajor', '_vminor', '_w', '_x', '_y', '_z', 'foo'] +params(): ['a_new_local', '_a', '_a_global_set_in_test_dot_ngc', '_a_new_global', '_absolute', '_adaptive_feed', '_b', '_c', '_call_level', '_ccomp', '_coord_system', '_current_pocket', '_current_tool', '_feed', '_feed_hold', '_feed_override', '_flood', '_ijk_absolute_mode', '_imperial', '_incremental', '_ini[example]variable', '_inverse_time', '_lathe_diameter_mode', '_lathe_radius_mode', '_line', '_metric', '_metric_machine', '_mist', '_motion_mode', '_plane', '_remap_level', '_retract_old_z', '_retract_r_plane', '_rpm', '_selected_pocket', '_selected_tool', '_speed_override', '_spindle_css_mode', '_spindle_cw', '_spindle_on', '_spindle_rpm_mode', '_task', '_tool_offset', '_u', '_units_per_minute', '_units_per_rev', '_v', '_value', '_value_returned', '_vmajor', '_vminor', '_w', '_x', '_y', '_z', 'foo'] 15 N..... MESSAGE(" after introspect: return value=2.718280 call_level= 0.000000") 16 N..... SET_G5X_OFFSET(1, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000) 17 N..... SET_XY_ROTATION(0.0000) From dafdb9f1f43ffa506d1b227cb3bd86d377d3e858 Mon Sep 17 00:00:00 2001 From: ddotldot <94646173+ddotldot@users.noreply.github.com> Date: Fri, 19 Nov 2021 12:32:15 +0300 Subject: [PATCH 61/85] Update axis.tcl Fix alignment slider labels --- share/axis/tcl/axis.tcl | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/share/axis/tcl/axis.tcl b/share/axis/tcl/axis.tcl index cae2ac9d122..19c3c03c17b 100644 --- a/share/axis/tcl/axis.tcl +++ b/share/axis/tcl/axis.tcl @@ -1419,9 +1419,9 @@ label ${pane_top}.ajogspeed.l1 scale ${pane_top}.ajogspeed.s -bigincrement 0 -from .06 -to 1 -resolution .020 -showvalue 0 -variable ajog_slider_val -command update_ajog_slider_vel -orient h -takefocus 0 label ${pane_top}.ajogspeed.l -textv jog_aspeed -width 6 -anchor e pack ${pane_top}.ajogspeed.l0 -side left -pack ${pane_top}.ajogspeed.l -side left -pack ${pane_top}.ajogspeed.l1 -side left pack ${pane_top}.ajogspeed.s -side right +pack ${pane_top}.ajogspeed.l1 -side right +pack ${pane_top}.ajogspeed.l -side right bind . [regsub %W [bind Scale ] ${pane_top}.ajogspeed.s] bind . [regsub %W [bind Scale ] ${pane_top}.ajogspeed.s] @@ -1432,9 +1432,9 @@ label ${pane_top}.jogspeed.l1 scale ${pane_top}.jogspeed.s -bigincrement 0 -from .06 -to 1 -resolution .020 -showvalue 0 -variable jog_slider_val -command update_jog_slider_vel -orient h -takefocus 0 label ${pane_top}.jogspeed.l -textv jog_speed -width 6 -anchor e pack ${pane_top}.jogspeed.l0 -side left -pack ${pane_top}.jogspeed.l -side left -pack ${pane_top}.jogspeed.l1 -side left pack ${pane_top}.jogspeed.s -side right +pack ${pane_top}.jogspeed.l1 -side right +pack ${pane_top}.jogspeed.l -side right bind . , [regsub %W [bind Scale ] ${pane_top}.jogspeed.s] bind . . [regsub %W [bind Scale ] ${pane_top}.jogspeed.s] @@ -1444,9 +1444,9 @@ label ${pane_top}.maxvel.l1 scale ${pane_top}.maxvel.s -bigincrement 0 -from .06 -to 1 -resolution .020 -showvalue 0 -variable maxvel_slider_val -command update_maxvel_slider_vel -orient h -takefocus 0 label ${pane_top}.maxvel.l -textv maxvel_speed -width 6 -anchor e pack ${pane_top}.maxvel.l0 -side left -pack ${pane_top}.maxvel.l -side left -pack ${pane_top}.maxvel.l1 -side left pack ${pane_top}.maxvel.s -side right +pack ${pane_top}.maxvel.l1 -side right +pack ${pane_top}.maxvel.l -side right bind . [regsub %W [bind Scale ] ${pane_top}.maxvel.s] bind . ' [regsub %W [bind Scale ] ${pane_top}.maxvel.s] From 840b1cf821a5207e53013dceb55a0dbf4d67612a Mon Sep 17 00:00:00 2001 From: Hans Unzner Date: Sat, 4 Dec 2021 20:43:01 +0100 Subject: [PATCH 62/85] de.po: merge from master and update from pot --- src/po/de.po | 3735 +++++++++++++++++++++++++++++--------------------- 1 file changed, 2193 insertions(+), 1542 deletions(-) diff --git a/src/po/de.po b/src/po/de.po index ddc45f1c017..a405accea1b 100644 --- a/src/po/de.po +++ b/src/po/de.po @@ -1,8 +1,9 @@ +#, fuzzy msgid "" msgstr "" "Project-Id-Version: de\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-08-04 21:36+0100\n" +"POT-Creation-Date: 2021-12-04 19:44+0100\n" "PO-Revision-Date: 2020-02-09 13:45+0200\n" "Last-Translator: Benjamin Weis \n" "Language-Team: German Translation Team \n" @@ -10,6 +11,10 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" +"#-#-#-#-# de2.po (de) #-#-#-#-#\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Generator: Weblate 0.5\n" +"#-#-#-#-# de_master.po (de) #-#-#-#-#\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Weblate 0.5\n" @@ -279,6 +284,8 @@ msgstr "" #: src/emc/rs274ngc/interp_convert.cc:4478 msgid "Cannot feed with zero spindle speed in feed per rev mode" msgstr "" +"kann nicht zustellen ohne Spindelgeschwindigkeit im Vorschub pro Umdrehung " +"Modus" #: src/emc/rs274ngc/interp_convert.cc:407 #: src/emc/rs274ngc/interp_convert.cc:413 @@ -458,6 +465,8 @@ msgid "" "Spindle ($) number out of range in M3 Command\n" "num_spindles =%i. $=%d\n" msgstr "" +"Spindel ($) Nummer ausserhalb des Limits in M3 Befehl\n" +"num_spindles =%i. $=%d\n" #: src/emc/rs274ngc/interp_convert.cc:3162 #, c-format @@ -465,6 +474,8 @@ msgid "" "Spindle ($) number out of range in M4 Command\n" "num_spindles =%i. $=%d\n" msgstr "" +"Spindel ($) Nummer ausserhalb des Limits in M4 Befehl\n" +"num_spindles =%i. $=%d\n" #: src/emc/rs274ngc/interp_convert.cc:3179 #, c-format @@ -472,14 +483,16 @@ msgid "" "Spindle ($) number out of range in M5 Command\n" "num_spindles =%i. $=%d\n" msgstr "" +"Spindel ($) Nummer ausserhalb des Limits in M5 Befehl\n" +"num_spindles =%i. $=%d\n" #: src/emc/rs274ngc/interp_convert.cc:3198 msgid "Spindle ($) number out of range in M19 Command" -msgstr "" +msgstr "Spindel ($) Nummer ausserhalb des Limits in M19 Befehl" #: src/emc/rs274ngc/interp_convert.cc:3205 msgid "Q word with M19 requires a value > 0" -msgstr "" +msgstr "Q Befehl mit M19 benötigt einen Wrt > 0" #: src/emc/rs274ngc/interp_convert.cc:3234 msgid "Cannot restore context from invalid stack frame - missing M70/M73?" @@ -505,7 +518,7 @@ msgstr "Ebene kann nicht bei aktiver Werkzeugradiuskorrektur gewechselt werden" #: src/emc/rs274ngc/interp_convert.cc:3311 msgid "Invalid spindle ($) number in M51 command" -msgstr "" +msgstr "Unbekannte Spindle Nummer ($) in M51 Befehl" #: src/emc/rs274ngc/interp_convert.cc:3463 #: src/emc/rs274ngc/interp_convert.cc:3464 @@ -568,28 +581,32 @@ msgstr "" #: src/emc/rs274ngc/interp_convert.cc:4535 msgid "Invalid spindle ($) number in G33 move" -msgstr "" +msgstr "Ungültige Spindel Nummer in G33 Bewegung" #: src/emc/rs274ngc/interp_convert.cc:4540 msgid "Spindle not turning in G33" -msgstr "" +msgstr "Spindel nicht eingeschaltet in M33 Befehl" #: src/emc/rs274ngc/interp_convert.cc:4550 msgid "Invalid spindle ($) number in G33.1 move" -msgstr "" +msgstr "Ungültige Spindel Nummer in G33.1 Bewegung" #: src/emc/rs274ngc/interp_convert.cc:4555 msgid "Spindle not turning in G33.1" -msgstr "" +msgstr "Spindel nicht eingeschaltet in M33.1 Befehl" #: src/emc/rs274ngc/interp_convert.cc:4570 msgid "Invalid D-number in G76 cycle" -msgstr "" +msgstr "Ungültige D Nummer in G76 Zyklus" #: src/emc/rs274ngc/interp_convert.cc:4575 #, fuzzy, c-format msgid "Chosen spindle (%i) not turning in G76" -msgstr "G86, aber Werkzeug-Spindel nicht in Rotation" +msgstr "" +"#-#-#-#-# de2.po (de) #-#-#-#-#\n" +"G86, aber Werkzeug-Spindel nicht in Rotation\n" +"#-#-#-#-# de_master.po (de) #-#-#-#-#\n" +"Gewählte Spindel (%i) ohne Bewegung in G76" #: src/emc/rs274ngc/interp_convert.cc:4613 msgid "BUG: An axis incorrectly moved along with an indexer" @@ -602,30 +619,32 @@ msgstr "" #: src/emc/rs274ngc/interp_convert.cc:4718 #, fuzzy msgid "Cannot use G76 threading cycle with cutter radius compensation on" -msgstr "Ebene kann nicht bei aktiver Werkzeugradiuskorrektur gewechselt werden" +msgstr "" +"#-#-#-#-# de2.po (de) #-#-#-#-#\n" +"Ebene kann nicht bei aktiver Werkzeugradiuskorrektur gewechselt werden\n" +"#-#-#-#-# de_master.po (de) #-#-#-#-#\n" +"G76 Zyklus kann nicht bei aktiver Werkzeugradiuskorrektur verwendet werden" #: src/emc/rs274ngc/interp_convert.cc:4721 msgid "In G76, I must not be 0" -msgstr "" +msgstr "Bei G76 Befehl darf I nicht Null sein" #: src/emc/rs274ngc/interp_convert.cc:4723 -#, fuzzy msgid "In G76, J must be greater than 0" -msgstr "Zeilennummer größer als 99999" +msgstr "Bei G76 Befehl muss J größer Null sein" #: src/emc/rs274ngc/interp_convert.cc:4725 -#, fuzzy msgid "In G76, K must be greater than J" -msgstr "Zeilennummer größer als 99999" +msgstr "Bei G76 Befehl mus sK größer J sein" #: src/emc/rs274ngc/interp_convert.cc:4868 msgid "" "Length of cutter compensation entry move is not greater than the tool radius" -msgstr "" +msgstr "Der Werkzeugeinlaufpfad ist nicht größer wie der Werkzeugradius" #: src/emc/rs274ngc/interp_convert.cc:5087 msgid "Zero degree inside corner is invalid for cutter compensation" -msgstr "" +msgstr "Null Grad Innenecke ist bei Werkzeugradienkorrektur unzulässig" #: src/emc/rs274ngc/interp_convert.cc:5125 #: src/emc/rs274ngc/interp_convert.cc:5133 @@ -633,6 +652,8 @@ msgid "" "Arc to straight motion makes a corner the compensated tool can't fit in " "without gouging" msgstr "" +"Bogen zu linearer Bewegung bildet eine Ecke die der Fräser nicht ohne " +"Kollision erreichen kann" #: src/emc/rs274ngc/interp_convert.cc:5217 #, fuzzy @@ -677,27 +698,24 @@ msgid "" msgstr "" #: src/emc/rs274ngc/interp_cycles.cc:275 -#, fuzzy, c-format +#, c-format msgid "Spindle not turning in %s" -msgstr "G86, aber Werkzeug-Spindel nicht in Rotation" +msgstr "Spindel dreht nicht in %s" #: src/emc/rs274ngc/interp_cycles.cc:277 -#, fuzzy msgid "Spindle turning clockwise in G74" -msgstr "G84, aber Werkzeug-Spindel dreht sich nicht im Uhrzeigersinn" +msgstr "G74, aber Werkzeug-Spindel dreht sich im Uhrzeigersinn" #: src/emc/rs274ngc/interp_cycles.cc:280 -#, fuzzy msgid "Spindle turning counterclockwise in G84" -msgstr "G84, aber Werkzeug-Spindel dreht sich nicht im Uhrzeigersinn" +msgstr "G84, aber Werkzeug-Spindel dreht sich im Gegenuhrzeigersinn" #: src/emc/rs274ngc/interp_cycles.cc:283 #, c-format msgid "Spindle state unknown for %s" -msgstr "" +msgstr "Unbekannter Spindel Status in %s" #: src/emc/rs274ngc/interp_cycles.cc:724 -#, fuzzy msgid "Cannot feed with zero feed rate" msgstr "" "G1 kann nicht mit einer Vorschubgeschwindigkeit von 0 ausgeführt werden" @@ -730,7 +748,7 @@ msgstr "" #: src/emc/rs274ngc/interp_cycles.cc:2077 #: src/emc/rs274ngc/interp_cycles.cc:2101 msgid "Invalid spindle ($) number in G74/G84 cycle" -msgstr "" +msgstr "Unbekannte Spindel Nummer ($) in G74/G84 Zyklus" #: src/emc/rs274ngc/interp_cycles.cc:1120 msgid "G17.1 canned cycle is not possible on a machine without W axis" @@ -758,15 +776,15 @@ msgstr "" #: src/emc/rs274ngc/interp_execute.cc:250 msgid "Invalid spindle ($) number in Spindle Mode command" -msgstr "" +msgstr "Unbekannte Spindel ($) im Spindel Modus Befehl" #: src/emc/rs274ngc/interp_execute.cc:260 msgid "Invalid spindle ($) number in Spindle Feed command" -msgstr "" +msgstr "Unbekannte Spindel ($) im Spindel Vorschub Befehl" #: src/emc/rs274ngc/interp_execute.cc:284 msgid "Invalid spindle ($) number in Spindle speed command" -msgstr "" +msgstr "Unbekannte Spindel ($) im Spindel Geschwindigkeits Befehl" #: src/emc/rs274ngc/interp_find.cc:171 #, fuzzy @@ -915,48 +933,48 @@ msgstr "" msgid "File:%s line:%d redefining sub: o|%s| already defined in file:%s" msgstr "" -#: src/emc/rs274ngc/interp_o_word.cc:822 +#: src/emc/rs274ngc/interp_o_word.cc:823 #, fuzzy, c-format msgid "%d: not in a subroutine definition: '%s'" msgstr "Nicht in der Definition der Unterfunktion" -#: src/emc/rs274ngc/interp_o_word.cc:871 src/emc/rs274ngc/interp_o_word.cc:921 +#: src/emc/rs274ngc/interp_o_word.cc:872 src/emc/rs274ngc/interp_o_word.cc:922 #, c-format msgid "%d: duplicate O-word label: '%s' - defined in line %d" msgstr "" -#: src/emc/rs274ngc/interp_o_word.cc:974 +#: src/emc/rs274ngc/interp_o_word.cc:975 #, c-format msgid "%d: duplicate O-word label - already defined in line %d: '%s'" msgstr "" -#: src/emc/rs274ngc/interp_o_word.cc:998 src/emc/rs274ngc/interp_o_word.cc:1056 -#: src/emc/rs274ngc/interp_o_word.cc:1090 -#: src/emc/rs274ngc/interp_o_word.cc:1108 -#: src/emc/rs274ngc/interp_o_word.cc:1125 -#: src/emc/rs274ngc/interp_o_word.cc:1150 +#: src/emc/rs274ngc/interp_o_word.cc:999 src/emc/rs274ngc/interp_o_word.cc:1057 +#: src/emc/rs274ngc/interp_o_word.cc:1091 +#: src/emc/rs274ngc/interp_o_word.cc:1109 +#: src/emc/rs274ngc/interp_o_word.cc:1126 +#: src/emc/rs274ngc/interp_o_word.cc:1151 #, c-format msgid "%d: undefined O-word label: '%s'" msgstr "" -#: src/emc/rs274ngc/interp_o_word.cc:1001 -#: src/emc/rs274ngc/interp_o_word.cc:1059 +#: src/emc/rs274ngc/interp_o_word.cc:1002 +#: src/emc/rs274ngc/interp_o_word.cc:1060 #, c-format msgid "%d: no matching 'if' label: '%s' (found '%s' in line %d)" msgstr "" -#: src/emc/rs274ngc/interp_o_word.cc:1093 +#: src/emc/rs274ngc/interp_o_word.cc:1094 #, c-format msgid "%d: no matching label: '%s' (found '%s' in line %d): '%s'" msgstr "" -#: src/emc/rs274ngc/interp_o_word.cc:1111 -#: src/emc/rs274ngc/interp_o_word.cc:1128 +#: src/emc/rs274ngc/interp_o_word.cc:1112 +#: src/emc/rs274ngc/interp_o_word.cc:1129 #, c-format msgid "%d: no matching while/do label: '%s' (found '%s' in line %d)" msgstr "" -#: src/emc/rs274ngc/interp_o_word.cc:1154 +#: src/emc/rs274ngc/interp_o_word.cc:1155 #, c-format msgid "%d: no matching label: '%s' (found '%s' in line %d)" msgstr "" @@ -996,7 +1014,7 @@ msgstr "" msgid "Cannot assign to read-only parameter #<%s>" msgstr "" -#: src/emc/rs274ngc/interp_namedparams.cc:749 +#: src/emc/rs274ngc/interp_namedparams.cc:748 #, c-format msgid "BUG: lookup_named_param(%s): unhandled index=%fn" msgstr "" @@ -1345,7 +1363,11 @@ msgstr "Radius- und IJK-Format durcheinandergewürfelt" #: src/emc/rs274ngc/rs274ngc_return.hh:94 #, fuzzy msgid "Multiple spindle choice ($) words on one line" -msgstr "Mehrere C-Wörter in einem Satz" +msgstr "" +"#-#-#-#-# de2.po (de) #-#-#-#-#\n" +"Mehrere C-Wörter in einem Satz\n" +"#-#-#-#-# de_master.po (de) #-#-#-#-#\n" +"Mehrere Spindelauswahl Befehle ($) in einem Satz" #: src/emc/rs274ngc/rs274ngc_return.hh:95 msgid "Multiple a words on one line" @@ -1875,7 +1897,7 @@ msgid "" msgstr "FEHLER: Kein Pin-, Signal- oder Parameter-Name mit -s\n" #: src/hal/utils/meter.c:242 tcl/tklinuxcnc.tcl:793 -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:6646 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:8081 msgid "Hal Meter" msgstr "HAL-Meter" @@ -1907,7 +1929,7 @@ msgstr " Para_meter " msgid "_Close" msgstr "_Schließen" -#: src/hal/utils/scope.c:127 +#: src/hal/utils/scope.c:126 msgid "" "Usage:\n" " halscope [-h] [-i infile] [-o outfile] [num_samples]\n" @@ -1915,67 +1937,67 @@ msgstr "" "Aufruf:\n" " halscope [-h] [-i Eingabedatei] [-o Ausgabedatei] [Anzahl der Samples]\n" -#: src/hal/utils/scope.c:478 src/hal/utils/scope.c:505 +#: src/hal/utils/scope.c:477 src/hal/utils/scope.c:504 msgid "Open Configuration File:" msgstr "Konfigurationsdatei öffnen:" -#: src/hal/utils/scope.c:539 +#: src/hal/utils/scope.c:538 msgid "_Open Configuration..." msgstr "K_onfiguration laden..." -#: src/hal/utils/scope.c:545 +#: src/hal/utils/scope.c:544 msgid "_Save Configuration..." msgstr "Konfiguration _speichern..." -#: src/hal/utils/scope.c:554 +#: src/hal/utils/scope.c:553 msgid "O_pen Data File..." msgstr "_Datendatei öffnen..." -#: src/hal/utils/scope.c:561 +#: src/hal/utils/scope.c:560 msgid "S_ave Data File..." msgstr "D_atendatei speichern..." -#: src/hal/utils/scope.c:570 share/axis/tcl/axis.tcl:102 +#: src/hal/utils/scope.c:569 share/axis/tcl/axis.tcl:102 msgid "_Quit" msgstr "_Beenden" -#: src/hal/utils/scope.c:576 +#: src/hal/utils/scope.c:575 msgid "_About Halscope" msgstr "Über Halscope" -#: src/hal/utils/scope.c:582 share/axis/tcl/axis.tcl:470 +#: src/hal/utils/scope.c:581 share/axis/tcl/axis.tcl:470 msgid "_File" msgstr "_Datei" -#: src/hal/utils/scope.c:586 share/axis/tcl/axis.tcl:482 +#: src/hal/utils/scope.c:585 share/axis/tcl/axis.tcl:482 msgid "_Help" msgstr "_Hilfe" -#: src/hal/utils/scope.c:645 +#: src/hal/utils/scope.c:644 msgid "HAL Oscilloscope" msgstr "HAL-Oszilloskop" -#: src/hal/utils/scope.c:673 +#: src/hal/utils/scope.c:672 msgid "Horizontal" msgstr "Horizontal" -#: src/hal/utils/scope.c:681 +#: src/hal/utils/scope.c:680 msgid "Selected Channel" msgstr "Ausgewähler Kanal" -#: src/hal/utils/scope.c:687 +#: src/hal/utils/scope.c:686 msgid "Run Mode" msgstr "Modus" -#: src/hal/utils/scope.c:690 +#: src/hal/utils/scope.c:689 msgid "Trigger" msgstr "Trigger" -#: src/hal/utils/scope.c:696 +#: src/hal/utils/scope.c:695 msgid "Vertical" msgstr "Vertikal" -#: src/hal/utils/scope.c:704 src/hal/classicladder/classicladder_gtk.c:343 +#: src/hal/utils/scope.c:703 src/hal/classicladder/classicladder_gtk.c:343 #: src/hal/classicladder/classicladder_gtk.c:856 share/axis/tcl/axis.tcl:144 #: share/axis/tcl/axis.tcl:1044 src/emc/usr_intf/gscreen/gscreen.py:4455 #: src/emc/usr_intf/gscreen/gscreen.py:4456 @@ -1983,27 +2005,27 @@ msgstr "Vertikal" msgid "Stop" msgstr "Stopp" -#: src/hal/utils/scope.c:707 src/hal/utils/scope_trig.c:196 +#: src/hal/utils/scope.c:706 src/hal/utils/scope_trig.c:196 msgid "Normal" msgstr "Normal" -#: src/hal/utils/scope.c:710 +#: src/hal/utils/scope.c:709 msgid "Single" msgstr "Single" -#: src/hal/utils/scope.c:713 +#: src/hal/utils/scope.c:712 msgid "Roll" msgstr "Roll" -#: src/hal/utils/scope_horiz.c:131 src/emc/usr_intf/gscreen/gscreen.glade:3454 +#: src/hal/utils/scope_horiz.c:129 src/emc/usr_intf/gscreen/gscreen.glade:3454 msgid "Zoom" msgstr "Zoom" -#: src/hal/utils/scope_horiz.c:132 +#: src/hal/utils/scope_horiz.c:130 msgid " Pos " msgstr " Pos " -#: src/hal/utils/scope_horiz.c:165 +#: src/hal/utils/scope_horiz.c:163 msgid "" "----- Samples\n" "at ---- KHz" @@ -2011,11 +2033,11 @@ msgstr "" "----- Samples\n" "bei ---- kHz" -#: src/hal/utils/scope_horiz.c:460 +#: src/hal/utils/scope_horiz.c:458 msgid "Realtime component not loaded" msgstr "Echtzeicht-Komponente nicht geladen" -#: src/hal/utils/scope_horiz.c:461 +#: src/hal/utils/scope_horiz.c:459 #, fuzzy msgid "" "HALSCOPE uses a realtime component called scope_rt'\n" @@ -2041,11 +2063,11 @@ msgstr "" "oder\n" "wählen Sie »Beenden« um HALSCOPE zu beenden" -#: src/hal/utils/scope_horiz.c:496 +#: src/hal/utils/scope_horiz.c:494 msgid "Realtime function not linked" msgstr "Echtzeitfunktion nicht gelinkt" -#: src/hal/utils/scope_horiz.c:497 +#: src/hal/utils/scope_horiz.c:495 msgid "" "The HALSCOPE realtime sampling function\n" "must be called from a HAL thread in to\n" @@ -2067,11 +2089,11 @@ msgstr "" "oder\n" "klicken Sie 'Quit' um HALSCOPE zu verlassen." -#: src/hal/utils/scope_horiz.c:504 +#: src/hal/utils/scope_horiz.c:502 msgid "Select Sample Rate" msgstr "Abtastrate auswählen" -#: src/hal/utils/scope_horiz.c:505 +#: src/hal/utils/scope_horiz.c:503 #, fuzzy msgid "" "Select a thread name and multiplier then click 'OK'\n" @@ -2083,63 +2105,63 @@ msgstr "" "oder\n" "wählen Sie »Beenden« um HALSCOPE zu beenden\n" -#: src/hal/utils/scope_horiz.c:527 +#: src/hal/utils/scope_horiz.c:525 msgid "Thread:" msgstr "Thread:" -#: src/hal/utils/scope_horiz.c:535 +#: src/hal/utils/scope_horiz.c:533 msgid "Sample Period:" msgstr "Abtastperiode:" -#: src/hal/utils/scope_horiz.c:543 +#: src/hal/utils/scope_horiz.c:541 msgid "Sample Rate:" msgstr "Abtastrate:" -#: src/hal/utils/scope_horiz.c:559 src/emc/usr_intf/touchy/mdi.py:80 +#: src/hal/utils/scope_horiz.c:557 src/emc/usr_intf/touchy/mdi.py:80 #: src/emc/usr_intf/gscreen/mdi.py:78 msgid "Thread" msgstr "Thread" -#: src/hal/utils/scope_horiz.c:560 +#: src/hal/utils/scope_horiz.c:558 msgid "Period" msgstr "Periode" -#: src/hal/utils/scope_horiz.c:620 +#: src/hal/utils/scope_horiz.c:618 msgid "Multiplier:" msgstr "Vervielfacher:" -#: src/hal/utils/scope_horiz.c:637 +#: src/hal/utils/scope_horiz.c:635 #, fuzzy msgid "Record Length" msgstr "Länge der Aufzeichnung" -#: src/hal/utils/scope_horiz.c:640 +#: src/hal/utils/scope_horiz.c:638 #, c-format msgid "%5d samples (1 channel)" msgstr "%5d Samples (1 Kanal)" -#: src/hal/utils/scope_horiz.c:642 +#: src/hal/utils/scope_horiz.c:640 #, c-format msgid "%5d samples (2 channels)" msgstr "%5d Samples (2 Kanäle)" -#: src/hal/utils/scope_horiz.c:646 +#: src/hal/utils/scope_horiz.c:644 #, c-format msgid "%5d samples (4 channels)" msgstr "%5d Samples (4 Kanäle)" -#: src/hal/utils/scope_horiz.c:650 +#: src/hal/utils/scope_horiz.c:648 #, c-format msgid "%5d samples (8 channels)" msgstr "%5d Samples (8 Kanäle)" -#: src/hal/utils/scope_horiz.c:654 +#: src/hal/utils/scope_horiz.c:652 #, c-format msgid "%5d samples (16 channels)" msgstr "%5d Samples (16 Kanäle)" -#: src/hal/utils/scope_horiz.c:709 src/hal/utils/scope_horiz.c:755 -#: src/hal/utils/scope_horiz.c:967 src/hal/utils/scope_vert.c:763 +#: src/hal/utils/scope_horiz.c:707 src/hal/utils/scope_horiz.c:753 +#: src/hal/utils/scope_horiz.c:965 src/hal/utils/scope_vert.c:763 #: src/hal/utils/scope_vert.c:855 tcl/bin/emccalib.tcl:276 #: tcl/bin/emcdebug.tcl:201 tcl/bin/genedit.tcl:180 tcl/bin/genedit.tcl:450 #: tcl/bin/halconfig.tcl:682 tcl/bin/halconfig.tcl:733 @@ -2149,29 +2171,29 @@ msgstr "%5d Samples (16 Kanäle)" #: tcl/tklinuxcnc.tcl:1225 tcl/tklinuxcnc.tcl:1296 tcl/tklinuxcnc.tcl:1327 #: tcl/tklinuxcnc.tcl:1358 tcl/tklinuxcnc.tcl:1892 tcl/tklinuxcnc.tcl:1911 #: tcl/tklinuxcnc.tcl:1930 tcl/tklinuxcnc.tcl:1977 -#: src/emc/usr_intf/axis/scripts/axis.py:1139 -#: src/emc/usr_intf/axis/scripts/axis.py:1240 -#: src/emc/usr_intf/axis/scripts/axis.py:1605 -#: src/emc/usr_intf/axis/scripts/axis.py:2907 -#: src/emc/usr_intf/axis/scripts/axis.py:4120 +#: src/emc/usr_intf/axis/scripts/axis.py:1154 +#: src/emc/usr_intf/axis/scripts/axis.py:1255 +#: src/emc/usr_intf/axis/scripts/axis.py:1620 +#: src/emc/usr_intf/axis/scripts/axis.py:2925 +#: src/emc/usr_intf/axis/scripts/axis.py:4140 #: src/emc/usr_intf/axis/scripts/image-to-gcode.py:723 #: lib/python/propertywindow.py:34 share/axis/tcl/axis.tcl:1600 #: share/axis/tcl/axis.tcl:1637 msgid "OK" msgstr "OK" -#: src/hal/utils/scope_horiz.c:714 src/hal/utils/scope_horiz.c:755 +#: src/hal/utils/scope_horiz.c:712 src/hal/utils/scope_horiz.c:753 #: src/hal/classicladder/classicladder_gtk.c:899 tcl/bin/emccalib.tcl:104 #: tcl/bin/halconfig.tcl:103 tcl/tooledit.tcl:468 #: src/emc/usr_intf/pncconf/dialogs.glade:600 msgid "Quit" msgstr "Beenden" -#: src/hal/utils/scope_horiz.c:746 +#: src/hal/utils/scope_horiz.c:744 msgid "Realtime thread(s) not running" msgstr "Echtzeit-Thread ist nicht gestarted" -#: src/hal/utils/scope_horiz.c:747 +#: src/hal/utils/scope_horiz.c:745 msgid "" "HALSCOPE uses code in a realtime HAL thread to sample\n" "signals for display. The HAL thread(s) are not running.\n" @@ -2196,15 +2218,15 @@ msgstr "" "oder\n" "klicken Sie 'Quit', um HALSCOPE zu verlassen." -#: src/hal/utils/scope_horiz.c:780 +#: src/hal/utils/scope_horiz.c:778 msgid "Pick log file to write to:" msgstr "Wählen Sie eine Log-Datei zum Speichern:" -#: src/hal/utils/scope_horiz.c:963 +#: src/hal/utils/scope_horiz.c:961 msgid "Not enough channels" msgstr "Nicht genügend Kanäle" -#: src/hal/utils/scope_horiz.c:964 +#: src/hal/utils/scope_horiz.c:962 msgid "" "This record length cannot handle the channels\n" "that are currently enabled. Pick a shorter\n" @@ -2215,7 +2237,7 @@ msgstr "" "sind. Wählen Sie einen kürzeren Wert,\n" "um mehr Kanäle zu unterstützen." -#: src/hal/utils/scope_horiz.c:1052 +#: src/hal/utils/scope_horiz.c:1050 #, fuzzy, c-format msgid "" "%s\n" @@ -2224,7 +2246,7 @@ msgstr "" "%s\n" "pro Teilstrich" -#: src/hal/utils/scope_horiz.c:1067 +#: src/hal/utils/scope_horiz.c:1065 #, c-format msgid "" "%s samples\n" @@ -2233,19 +2255,19 @@ msgstr "" "%s Samples\n" "bei %s" -#: src/hal/utils/scope_horiz.c:1171 +#: src/hal/utils/scope_horiz.c:1169 msgid "nSec" msgstr "ns" -#: src/hal/utils/scope_horiz.c:1174 +#: src/hal/utils/scope_horiz.c:1172 msgid "uSec" msgstr "µs" -#: src/hal/utils/scope_horiz.c:1178 +#: src/hal/utils/scope_horiz.c:1176 msgid "mSec" msgstr "ms" -#: src/hal/utils/scope_horiz.c:1182 +#: src/hal/utils/scope_horiz.c:1180 #: src/emc/usr_intf/pncconf/external.glade:2562 #: src/emc/usr_intf/pncconf/external.glade:3534 #: src/emc/usr_intf/pncconf/external.glade:4511 @@ -2253,7 +2275,7 @@ msgstr "ms" msgid "Sec" msgstr "s" -#: src/hal/utils/scope_horiz.c:1199 src/emc/usr_intf/stepconf/spindle.glade:112 +#: src/hal/utils/scope_horiz.c:1197 src/emc/usr_intf/stepconf/spindle.glade:112 #: src/emc/usr_intf/stepconf/axisx.glade:359 #: src/emc/usr_intf/stepconf/axisy.glade:357 #: src/emc/usr_intf/stepconf/axisz.glade:357 @@ -2269,11 +2291,11 @@ msgstr "s" msgid "Hz" msgstr "Hz" -#: src/hal/utils/scope_horiz.c:1202 +#: src/hal/utils/scope_horiz.c:1200 msgid "KHz" msgstr "kHz" -#: src/hal/utils/scope_horiz.c:1206 +#: src/hal/utils/scope_horiz.c:1204 msgid "Mhz" msgstr "MHz" @@ -2294,12 +2316,12 @@ msgstr "Gain" msgid "Pos" msgstr "Pos" -#: src/hal/utils/scope_vert.c:646 tcl/ngcgui_ttt.tcl:214 -#: src/emc/usr_intf/pncconf/x_motor.glade:1337 -#: src/emc/usr_intf/pncconf/y_motor.glade:1337 -#: src/emc/usr_intf/pncconf/z_motor.glade:1337 +#: src/hal/utils/scope_vert.c:646 tcl/ngcgui_ttt.tcl:215 +#: src/emc/usr_intf/pncconf/x_motor.glade:1592 +#: src/emc/usr_intf/pncconf/y_motor.glade:1592 +#: src/emc/usr_intf/pncconf/z_motor.glade:1592 #: src/emc/usr_intf/pncconf/a_motor.glade:1337 -#: src/emc/usr_intf/pncconf/s_motor.glade:1932 +#: src/emc/usr_intf/pncconf/s_motor.glade:1730 msgid "Scale" msgstr "Skala" @@ -2341,10 +2363,10 @@ msgstr "AC-Kopplung" #: tcl/bin/pickconfig.tcl:625 tcl/tklinuxcnc.tcl:163 tcl/tklinuxcnc.tcl:214 #: tcl/tklinuxcnc.tcl:421 tcl/tklinuxcnc.tcl:1227 tcl/tklinuxcnc.tcl:1297 #: tcl/tklinuxcnc.tcl:1328 tcl/tklinuxcnc.tcl:1359 tcl/tklinuxcnc.tcl:1978 -#: src/emc/usr_intf/axis/scripts/axis.py:1550 -#: src/emc/usr_intf/axis/scripts/axis.py:1606 -#: src/emc/usr_intf/axis/scripts/axis.py:1834 -#: src/emc/usr_intf/axis/scripts/axis.py:2248 +#: src/emc/usr_intf/axis/scripts/axis.py:1565 +#: src/emc/usr_intf/axis/scripts/axis.py:1621 +#: src/emc/usr_intf/axis/scripts/axis.py:1849 +#: src/emc/usr_intf/axis/scripts/axis.py:2263 #: src/emc/usr_intf/axis/scripts/image-to-gcode.py:725 #: src/emc/usr_intf/stepconf/main_page.glade:475 #: src/emc/usr_intf/pncconf/main_page.glade:98 @@ -2474,47 +2496,50 @@ msgstr "G38.4: Bewegung ohne Kontaktöffnung beendet." msgid "G38.2 move finished without making contact." msgstr "G38.4: Bewegung ohne Kontaktschließung beendet." -#: src/emc/motion/control.c:666 -msgid "Probe tripped during non-probe MDI command." +#: src/emc/motion/control.c:665 +#, fuzzy +msgid "Probe tripped during non-probe move." msgstr "Tastspitze bei inaktivem MDI-Befehl ausgelöst." -#: src/emc/motion/control.c:704 +#: src/emc/motion/control.c:703 msgid "Probe tripped during homing motion." msgstr "Tastspitze bei Referenzfahrt ausgelöst." -#: src/emc/motion/control.c:708 -#, fuzzy +#: src/emc/motion/control.c:707 msgid "Probe tripped during a joint jog." -msgstr "Tastspitze bei Eilfahrt ausgelöst." +msgstr "Tastspitze bei Motorfahrt (joint) ausgelöst." -#: src/emc/motion/control.c:711 -#, fuzzy +#: src/emc/motion/control.c:710 msgid "Probe tripped during a coordinate jog." -msgstr "Tastspitze bei Eilfahrt ausgelöst." +msgstr "Tastspitze bei Koordinatenbewegung ausgelöst." -#: src/emc/motion/control.c:727 +#: src/emc/motion/control.c:726 msgid "motion stopped by enable input" msgstr "Bewegung durch Enable-Eingabe angehalten." -#: src/emc/motion/control.c:734 -#, fuzzy, c-format +#: src/emc/motion/control.c:733 +#, c-format msgid "spindle %d amplifier fault" -msgstr "Verstärkerfehler an Achse/Gelenk %d" +msgstr "Verstärkerfehler an Spindel %d" -#: src/emc/motion/control.c:757 -#, c-format +#: src/emc/motion/control.c:756 +#, fuzzy, c-format msgid "joint %d on limit switch error" -msgstr "Fehler: Achse/Gelenk %d am Endschalter" +msgstr "" +"#-#-#-#-# de2.po (de) #-#-#-#-#\n" +"Fehler: Achse/Gelenk %d am Endschalter\n" +"#-#-#-#-# de_master.po (de) #-#-#-#-#\n" +"Achsen- oder Gelenkfehler %d am Endschalter" -#: src/emc/motion/control.c:769 +#: src/emc/motion/control.c:768 #, c-format msgid "joint %d amplifier fault" msgstr "Verstärkerfehler an Achse/Gelenk %d" -#: src/emc/motion/control.c:778 +#: src/emc/motion/control.c:777 #, c-format msgid "joint %d following error" -msgstr "" +msgstr "Motor %d Positionssfehler" #: src/emc/motion/control.c:1369 src/emc/motion/control.c:1455 #, c-format @@ -2526,9 +2551,9 @@ msgid "kinematicsInverse failed" msgstr "" #: src/emc/motion/control.c:1551 -#, fuzzy, c-format +#, c-format msgid "Exceeded NEGATIVE soft limit (%.5f) on joint %d\n" -msgstr "Positiver Softanschlag bei Achse/Gelenk %d überschritten" +msgstr "Negatives Softlimit bei (%.5f) Motor %d überschritten\n" #: src/emc/motion/control.c:1554 src/emc/motion/control.c:1563 msgid "Joint must be unhomed, jogged into limits, rehomed" @@ -2610,182 +2635,182 @@ msgstr "" msgid "all joints must be homed before going into coordinated mode" msgstr "" -#: src/emc/motion/command.c:813 src/emc/motion/command.c:909 -#: src/emc/motion/command.c:1011 +#: src/emc/motion/command.c:813 src/emc/motion/command.c:903 +#: src/emc/motion/command.c:1002 msgid "Can't jog joint when not enabled." msgstr "" -#: src/emc/motion/command.c:818 src/emc/motion/command.c:1016 +#: src/emc/motion/command.c:818 src/emc/motion/command.c:1007 msgid "Can't jog any joints while homing." msgstr "Keine Handsteuerung während der Referenzfahrt." -#: src/emc/motion/command.c:914 +#: src/emc/motion/command.c:908 msgid "Can't jog any joint while homing." msgstr "Keine Handsteuerung während der Referenzfahrt." -#: src/emc/motion/command.c:1098 +#: src/emc/motion/command.c:1085 msgid "need to be enabled, in coord mode for linear move" msgstr "" -#: src/emc/motion/command.c:1103 +#: src/emc/motion/command.c:1090 msgid "invalid params in linear command" msgstr "" -#: src/emc/motion/command.c:1109 +#: src/emc/motion/command.c:1096 msgid "can't do linear move with limits exceeded" msgstr "Keine Linearbewegung jenseits der Grenzen" -#: src/emc/motion/command.c:1133 +#: src/emc/motion/command.c:1120 #, fuzzy, c-format msgid "can't add linear move at line %d, error code %d" msgstr "Keine Linearbewegung jenseits der Grenzen" -#: src/emc/motion/command.c:1160 +#: src/emc/motion/command.c:1147 msgid "need to be enabled, in coord mode for circular move" msgstr "" -#: src/emc/motion/command.c:1170 +#: src/emc/motion/command.c:1157 msgid "can't do circular move with limits exceeded" msgstr "Keine Kreisbewegung jenseits der Grenzen" -#: src/emc/motion/command.c:1188 +#: src/emc/motion/command.c:1175 #, fuzzy, c-format msgid "can't add circular move at line %d, error code %d" msgstr "Keine Kreisbewegung jenseits der Grenzen" -#: src/emc/motion/command.c:1303 +#: src/emc/motion/command.c:1290 msgid "MOTION: can't STEP while already executing" msgstr "MOTION: bereits begonnen, STEP nicht möglich" -#: src/emc/motion/command.c:1405 +#: src/emc/motion/command.c:1392 msgid "can't enable motion, enable input is false" msgstr "Bewegung nicht möglich, Enable-Eingang ist falsch" -#: src/emc/motion/command.c:1469 +#: src/emc/motion/command.c:1456 msgid "must be in joint mode to home" msgstr "Referenzfahrt nur im Gelenk-Modus möglich" -#: src/emc/motion/command.c:1473 +#: src/emc/motion/command.c:1460 #, c-format msgid "Homing denied by motion.homing-inhibit joint=%d\n" msgstr "" -#: src/emc/motion/command.c:1487 +#: src/emc/motion/command.c:1474 msgid "homing sequence already in progress" msgstr "Referenzfahrt bereits begonnen" -#: src/emc/motion/command.c:1522 +#: src/emc/motion/command.c:1509 msgid "must be in joint mode or disabled to unhome" msgstr "" "Kann nur im Gelenk-Modus oder abgeschaltet aus der Referenzpos. gefahren " "werden" -#: src/emc/motion/command.c:1534 src/emc/motion/command.c:1557 +#: src/emc/motion/command.c:1521 src/emc/motion/command.c:1544 #, c-format msgid "Cannot unhome while homing, joint %d" msgstr "" "Achse/Gelenk %d: Während Referenzfahrt kann nicht aus der Referenzpos. " "gefahren werden" -#: src/emc/motion/command.c:1538 src/emc/motion/command.c:1561 +#: src/emc/motion/command.c:1525 src/emc/motion/command.c:1548 #, c-format msgid "Cannot unhome while moving, joint %d" msgstr "" "Achse/Gelenk %d: Während der Bewegung kann nicht aus der Referenzpos. " "gefahren werden" -#: src/emc/motion/command.c:1566 +#: src/emc/motion/command.c:1553 #, c-format msgid "Cannot unhome inactive joint %d" msgstr "" "Inaktive(s) Achse/Gelenk %d kann nicht aus der Referenzpos. gefahren werden" -#: src/emc/motion/command.c:1570 +#: src/emc/motion/command.c:1557 #, c-format msgid "Cannot unhome invalid joint %d (max %d)" msgstr "" "Achse/Gelenk %d: Ungültige(s) Achse/Gelenk kann nicht aus der Referenzpos. " "gefahren werden (max. %d)" -#: src/emc/motion/command.c:1588 +#: src/emc/motion/command.c:1575 msgid "need to be enabled, in coord mode for probe move" msgstr "" -#: src/emc/motion/command.c:1598 +#: src/emc/motion/command.c:1585 msgid "can't do probe move with limits exceeded" msgstr "Kann Tastspitze nicht außerhalb der Grenzen bewegen" -#: src/emc/motion/command.c:1612 +#: src/emc/motion/command.c:1599 msgid "Probe is already clear when starting G38.4 or G38.5 move" msgstr "Tastspitze schon abgehoben bei Start durch G38.4 oder G38.5" -#: src/emc/motion/command.c:1614 +#: src/emc/motion/command.c:1601 msgid "Probe is already tripped when starting G38.2 or G38.3 move" msgstr "Tastspitze schon ausgelöst bei Start durch G38.4 oder G38.5" -#: src/emc/motion/command.c:1626 +#: src/emc/motion/command.c:1613 msgid "can't add probe move" msgstr "Keine weitere Bewegung der Tastspitze möglich" -#: src/emc/motion/command.c:1648 +#: src/emc/motion/command.c:1635 msgid "need to be enabled, in coord mode for rigid tap move" msgstr "Muß aktiviert werden, im Koordinatenmodus für Gewindebohren" -#: src/emc/motion/command.c:1658 +#: src/emc/motion/command.c:1645 msgid "can't do rigid tap move with limits exceeded" msgstr "Kein Gewindebohren außerhalb der Grenzen" -#: src/emc/motion/command.c:1670 +#: src/emc/motion/command.c:1657 #, fuzzy, c-format msgid "can't add rigid tap move at line %d, error code %d" msgstr "Kein Gewindebohren außerhalb der Grenzen" -#: src/emc/motion/command.c:1712 +#: src/emc/motion/command.c:1699 msgid "Attempt to start non-existent spindle" -msgstr "" +msgstr "Versuch eine nicht existierende Spindel einzuschalten" -#: src/emc/motion/command.c:1760 +#: src/emc/motion/command.c:1747 #, c-format msgid "Attempt to stop non-existent spindle <%d>" -msgstr "" +msgstr "Versuch eine nicht existierende Spindel auszuschalten" -#: src/emc/motion/command.c:1790 +#: src/emc/motion/command.c:1777 #, c-format msgid "Attempt to orient non-existent spindle <%d>" -msgstr "" +msgstr "Versuch eine nicht existierende Spindel zu orrientieren" -#: src/emc/motion/command.c:1836 +#: src/emc/motion/command.c:1823 #, c-format msgid "Attempt to increase non-existent spindle <%d>" -msgstr "" +msgstr "Versuche Geschwindigkeit einer nicht existierenden Spindel zu erhöhen" -#: src/emc/motion/command.c:1859 +#: src/emc/motion/command.c:1846 #, c-format msgid "Attempt to decreasenon-existent spindle <%d>" msgstr "" +"Versuche Geschwindigkeit einer nicht existierenden Spindel zu verringern" -#: src/emc/motion/command.c:1874 +#: src/emc/motion/command.c:1861 #, c-format msgid "Attempt to engage brake of non-existent spindle <%d>" -msgstr "" +msgstr "Versuch Bremse einer nicht existierenden Spindel zu schalten" -#: src/emc/motion/command.c:1896 -#, fuzzy, c-format +#: src/emc/motion/command.c:1883 +#, c-format msgid "Attempt to release brake of non-existent spindle <%d>" -msgstr "" -"Negative Zahl kann nicht mit einem nicht ganzzahligem Wert potenziert werden" +msgstr "Versuch Bremse einer nicht existierenden Spindel zu lösen" -#: src/emc/motion/command.c:1918 +#: src/emc/motion/command.c:1905 #, c-format msgid "joint %d: too many compensation entries" msgstr "Achse/Gelenk %d: zu viele Kompensationseingaben" -#: src/emc/motion/command.c:1924 +#: src/emc/motion/command.c:1911 #, c-format msgid "joint %d: compensation values must increase" msgstr "Achse/Gelenk %d: Kompensationswerte müssen ansteigen" -#: src/emc/motion/command.c:2002 +#: src/emc/motion/command.c:1989 #, c-format msgid "unrecognized command %d" msgstr "Unerkannter Befehl %d" @@ -2806,7 +2831,11 @@ msgstr "MOTION: num_joints ist %d, muß zwischen 1 und %d liegen\n" #: src/emc/motion/motion.c:222 #, fuzzy, c-format msgid "MOTION: num_spindles is %d, must be between 0 and %d\n" -msgstr "MOTION: num_joints ist %d, muß zwischen 1 und %d liegen\n" +msgstr "" +"#-#-#-#-# de2.po (de) #-#-#-#-#\n" +"MOTION: num_joints ist %d, muß zwischen 1 und %d liegen\n" +"#-#-#-#-# de_master.po (de) #-#-#-#-#\n" +"MOTION: num_joints ist %d, muß zwischen 0 und %d liegen\n" #: src/emc/motion/motion.c:230 #, c-format @@ -2850,9 +2879,9 @@ msgid "MOTION: emcmot_hal_data malloc failed\n" msgstr "MOTION: emcmot_hal_data malloc fehlgeschlagen\n" #: src/emc/motion/motion.c:450 -#, fuzzy, c-format +#, c-format msgid "MOTION: spindle %d pin export failed" -msgstr "MOTION: Achse/Gelenk %d Pin/Parameterexport fehlgeschlagen\n" +msgstr "MOTION: Spindel %d Pinexport fehlgeschlagen" #: src/emc/motion/motion.c:462 #, c-format @@ -2860,9 +2889,9 @@ msgid "MOTION: joint %d pin/param export failed\n" msgstr "MOTION: Achse/Gelenk %d Pin/Parameterexport fehlgeschlagen\n" #: src/emc/motion/motion.c:503 -#, fuzzy, c-format +#, c-format msgid "MOTION: axis %c pin/param export failed\n" -msgstr "MOTION: Achse/Gelenk %d Pin/Parameterexport fehlgeschlagen\n" +msgstr "MOTION: Achse %c Pin/Parameterexport fehlgeschlagen\n" #: src/emc/motion/homing.c:93 #, c-format @@ -3029,7 +3058,7 @@ msgstr "" #: src/hal/classicladder/symbols_gtk.c:122 #: src/hal/classicladder/symbols_gtk.c:138 #: src/hal/classicladder/symbols_gtk.c:140 -#: src/emc/usr_intf/axis/scripts/axis.py:1549 +#: src/emc/usr_intf/axis/scripts/axis.py:1564 msgid "Ok" msgstr "Ok" @@ -3119,19 +3148,19 @@ msgstr "" #: src/hal/classicladder/classicladder_gtk.c:649 tcl/bin/pickconfig.tcl:625 #: tcl/tooledit.tcl:906 src/emc/usr_intf/axis/scripts/axis.py:153 #: src/emc/usr_intf/axis/scripts/image-to-gcode.py:568 -#: src/emc/usr_intf/pncconf/x_axis.glade:33 -#: src/emc/usr_intf/pncconf/y_axis.glade:33 -#: src/emc/usr_intf/pncconf/z_axis.glade:33 -#: src/emc/usr_intf/pncconf/a_axis.glade:33 +#: src/emc/usr_intf/pncconf/x_axis.glade:690 +#: src/emc/usr_intf/pncconf/y_axis.glade:690 +#: src/emc/usr_intf/pncconf/z_axis.glade:690 +#: src/emc/usr_intf/pncconf/a_axis.glade:690 msgid "Yes" msgstr "Ja" #: src/hal/classicladder/classicladder_gtk.c:650 tcl/tooledit.tcl:906 #: src/emc/usr_intf/axis/scripts/axis.py:153 -#: src/emc/usr_intf/pncconf/x_axis.glade:30 -#: src/emc/usr_intf/pncconf/y_axis.glade:30 -#: src/emc/usr_intf/pncconf/z_axis.glade:30 -#: src/emc/usr_intf/pncconf/a_axis.glade:30 +#: src/emc/usr_intf/pncconf/x_axis.glade:687 +#: src/emc/usr_intf/pncconf/y_axis.glade:687 +#: src/emc/usr_intf/pncconf/z_axis.glade:687 +#: src/emc/usr_intf/pncconf/a_axis.glade:687 msgid "No" msgstr "Nein" @@ -3185,7 +3214,7 @@ msgstr "" #: src/hal/classicladder/classicladder_gtk.c:841 tcl/bin/emccalib.tcl:123 #: tcl/bin/genedit.tcl:82 tcl/bin/halconfig.tcl:155 -#: src/emc/usr_intf/axis/scripts/axis.py:2247 +#: src/emc/usr_intf/axis/scripts/axis.py:2262 msgid "Save" msgstr "Speichern" @@ -3219,7 +3248,7 @@ msgid "Config" msgstr "HAL konfigurieren" #: src/hal/classicladder/classicladder_gtk.c:883 share/axis/tcl/axis.tcl:1333 -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:880 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:873 msgid "Preview" msgstr "Vorschau" @@ -3658,7 +3687,7 @@ msgid "Edit mode..." msgstr "Bearbeiten..." #: src/hal/classicladder/edit_gtk.c:186 src/hal/classicladder/edit_gtk.c:360 -#: tcl/tooledit.tcl:488 src/emc/usr_intf/gmoccapy/gmoccapy.glade:6929 +#: tcl/tooledit.tcl:488 src/emc/usr_intf/gmoccapy/gmoccapy.glade:8358 msgid "Delete" msgstr "Löschen" @@ -3667,7 +3696,7 @@ msgid "Do you really want to delete the current rung ?" msgstr "" #: src/hal/classicladder/edit_gtk.c:350 -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:6947 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:8375 msgid "Add" msgstr "Dazuzählen" @@ -3867,7 +3896,7 @@ msgid "Parameter" msgstr "Parameter" #: src/hal/classicladder/editproperties_gtk.c:213 -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:6983 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:8409 msgid "Apply" msgstr "" @@ -4057,7 +4086,7 @@ msgstr "" #: src/hal/classicladder/manager_gtk.c:72 #: src/hal/classicladder/manager_gtk.c:234 tcl/bin/halconfig.tcl:196 -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:2867 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:4344 msgid "Main" msgstr "Haupt" @@ -4714,7 +4743,7 @@ msgid "Renumber File..." msgstr "Zeilennummerierung aktualisieren..." #: tcl/bin/genedit.tcl:140 tcl/tklinuxcnc.tcl:775 -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:5681 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:7139 msgid "Settings" msgstr "Einstellungen" @@ -4893,12 +4922,22 @@ msgid "Expand Pins" msgstr "Pins aufklappen" #: tcl/bin/halconfig.tcl:177 tcl/bin/halshow.tcl:116 +#, fuzzy msgid "Expand Parameters" -msgstr "Parameters aufklappen" +msgstr "" +"#-#-#-#-# de2.po (de) #-#-#-#-#\n" +"Parameters aufklappen\n" +"#-#-#-#-# de_master.po (de) #-#-#-#-#\n" +"Parameter aufklappen" #: tcl/bin/halconfig.tcl:179 tcl/bin/halshow.tcl:118 +#, fuzzy msgid "Expand Signals" -msgstr "Signals aufklappen" +msgstr "" +"#-#-#-#-# de2.po (de) #-#-#-#-#\n" +"Signals aufklappen\n" +"#-#-#-#-# de_master.po (de) #-#-#-#-#\n" +"Signale aufklappen" #: tcl/bin/halconfig.tcl:182 tcl/bin/halshow.tcl:121 msgid "Erase Watch" @@ -4975,21 +5014,25 @@ msgid " WATCH " msgstr " BEOBACHTEN " #: tcl/bin/halshow.tcl:87 -#, fuzzy msgid "Save Watch List" -msgstr "Beobachtungsliste laden" +msgstr "Beobachtungsliste speichern" #: tcl/bin/halshow.tcl:88 msgid "Save Watch List (multiline)" -msgstr "" +msgstr "Beobachtungsliste speichern (mehrzeilig)" #: tcl/bin/halshow.tcl:93 msgid "Load Watch List" msgstr "Beobachtungsliste laden" #: tcl/bin/halshow.tcl:107 +#, fuzzy msgid "Tree View" -msgstr "Ansicht" +msgstr "" +"#-#-#-#-# de2.po (de) #-#-#-#-#\n" +"Ansicht\n" +"#-#-#-#-# de_master.po (de) #-#-#-#-#\n" +"Menübaum" #: tcl/bin/halshow.tcl:288 msgid "Test HAL command :" @@ -5135,11 +5178,11 @@ msgstr "RICHTUNG" msgid "SIZE :" msgstr "GRÖSSE :" -#: tcl/show_errors.tcl:77 +#: tcl/show_errors.tcl:78 msgid "LinuxCNC Errors" msgstr "LinuxCNC-Fehler" -#: tcl/show_errors.tcl:80 +#: tcl/show_errors.tcl:81 #, fuzzy msgid "" "LinuxCNC terminated with an error. When reporting problems, please create a " @@ -5148,12 +5191,12 @@ msgstr "" "EMC2 wurde mit einem Fehler beendet. Falls Sie den Fehler melden wollen, " "fügen Sie bitte Ihrer Mitteilung die unten stehenden Informationen bei." -#: tcl/show_errors.tcl:106 +#: tcl/show_errors.tcl:107 #, fuzzy msgid "Create Report File" msgstr "Erstellen oder Bearbeiten" -#: tcl/show_errors.tcl:108 tcl/scripts/Set_Coordinates.tcl:107 +#: tcl/show_errors.tcl:109 tcl/scripts/Set_Coordinates.tcl:107 msgid "Close" msgstr "Schließen" @@ -5232,7 +5275,7 @@ msgstr "Werkzeugoffset" msgid "Tool:" msgstr "Werkzeug:" -#: tcl/tklinuxcnc.tcl:466 src/emc/usr_intf/axis/scripts/axis.py:2168 +#: tcl/tklinuxcnc.tcl:466 src/emc/usr_intf/axis/scripts/axis.py:2183 #: src/emc/usr_intf/axis/scripts/image-to-gcode.py:759 msgid "All files" msgstr "Alle Dateien" @@ -5299,27 +5342,27 @@ msgstr "Maßeinheit" msgid "auto" msgstr "Auto" -#: tcl/tklinuxcnc.tcl:785 src/emc/usr_intf/pncconf/tests.py:511 +#: tcl/tklinuxcnc.tcl:785 src/emc/usr_intf/pncconf/tests.py:515 msgid "inches" msgstr "Zoll" -#: tcl/tklinuxcnc.tcl:786 src/emc/usr_intf/axis/scripts/axis.py:1705 -#: src/emc/usr_intf/axis/scripts/axis.py:1985 -#: src/emc/usr_intf/axis/scripts/axis.py:2556 +#: tcl/tklinuxcnc.tcl:786 src/emc/usr_intf/axis/scripts/axis.py:1720 +#: src/emc/usr_intf/axis/scripts/axis.py:2000 +#: src/emc/usr_intf/axis/scripts/axis.py:2574 #: src/emc/usr_intf/touchy/touchy.glade:3301 #: src/emc/usr_intf/stepconf/stepconf.py:1404 #: src/emc/usr_intf/stepconf/pages.py:785 #: src/emc/usr_intf/stepconf/main_page.glade:240 -#: src/emc/usr_intf/pncconf/tests.py:506 +#: src/emc/usr_intf/pncconf/tests.py:510 #: src/emc/usr_intf/pncconf/external.glade:1998 #: src/emc/usr_intf/pncconf/external.glade:2213 #: src/emc/usr_intf/pncconf/base.glade:57 -#: src/emc/usr_intf/pncconf/x_motor.glade:1591 -#: src/emc/usr_intf/pncconf/x_motor.glade:1660 -#: src/emc/usr_intf/pncconf/y_motor.glade:1591 -#: src/emc/usr_intf/pncconf/y_motor.glade:1660 -#: src/emc/usr_intf/pncconf/z_motor.glade:1591 -#: src/emc/usr_intf/pncconf/z_motor.glade:1660 +#: src/emc/usr_intf/pncconf/x_motor.glade:1904 +#: src/emc/usr_intf/pncconf/x_motor.glade:1978 +#: src/emc/usr_intf/pncconf/y_motor.glade:1904 +#: src/emc/usr_intf/pncconf/y_motor.glade:1978 +#: src/emc/usr_intf/pncconf/z_motor.glade:1904 +#: src/emc/usr_intf/pncconf/z_motor.glade:1978 #: src/emc/usr_intf/pncconf/a_motor.glade:1591 #: src/emc/usr_intf/pncconf/a_motor.glade:1660 #: src/emc/usr_intf/pncconf/dialogs.glade:3577 @@ -5494,20 +5537,40 @@ msgid "Set feed override:" msgstr "Vorschubübersteuerung:" #: tcl/tklinuxcnc.tcl:1349 +#, fuzzy msgid "Set Spindle Override" -msgstr "Spindelübersteuerung" +msgstr "" +"#-#-#-#-# de2.po (de) #-#-#-#-#\n" +"Spindelübersteuerung\n" +"#-#-#-#-# de_master.po (de) #-#-#-#-#\n" +"Spindelübersteuerung setzen" #: tcl/tklinuxcnc.tcl:1355 +#, fuzzy msgid "Set spindle speed override:" -msgstr "Spindelübersteuerung:" +msgstr "" +"#-#-#-#-# de2.po (de) #-#-#-#-#\n" +"Spindelübersteuerung:\n" +"#-#-#-#-# de_master.po (de) #-#-#-#-#\n" +"Spindelübersteuerung setzen:" #: tcl/tklinuxcnc.tcl:1410 +#, fuzzy msgid "Linear Jog Speed" -msgstr "Lineare Schrittgeschwindigkeit" +msgstr "" +"#-#-#-#-# de2.po (de) #-#-#-#-#\n" +"Lineare Schrittgeschwindigkeit\n" +"#-#-#-#-# de_master.po (de) #-#-#-#-#\n" +"Lineare Verfahrgeschwindigkeit" #: tcl/tklinuxcnc.tcl:1441 +#, fuzzy msgid "Angular Jog Speed (deg)/min:" -msgstr "Winkel-Schrittgeschwindigkeit Grad/min:" +msgstr "" +"#-#-#-#-# de2.po (de) #-#-#-#-#\n" +"Winkel-Schrittgeschwindigkeit Grad/min:\n" +"#-#-#-#-# de_master.po (de) #-#-#-#-#\n" +"Winkelgeschwindigkeit Grad/min:" #: tcl/tklinuxcnc.tcl:1465 share/axis/tcl/axis.tcl:1511 msgid "Feed Override:" @@ -5550,16 +5613,16 @@ msgstr "Überprüfen" msgid "Optional Stop" msgstr "Wahlweiser Halt" -#: tcl/tklinuxcnc.tcl:1945 tcl/ngcgui_ttt.tcl:46 +#: tcl/tklinuxcnc.tcl:1945 tcl/ngcgui_ttt.tcl:47 msgid "Set Font" msgstr "Schrift auswählen" -#: tcl/tklinuxcnc.tcl:1954 tcl/ngcgui_ttt.tcl:283 -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:5421 +#: tcl/tklinuxcnc.tcl:1954 tcl/ngcgui_ttt.tcl:284 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:6881 msgid "Font" msgstr "Schriftart" -#: tcl/tklinuxcnc.tcl:1961 src/emc/usr_intf/gmoccapy/gmoccapy.glade:3565 +#: tcl/tklinuxcnc.tcl:1961 src/emc/usr_intf/gmoccapy/gmoccapy.glade:5053 msgid "Size" msgstr "Größe" @@ -5668,7 +5731,7 @@ msgid "Coordinate System Control Window" msgstr "Koordinatensystem Kontroll-Fenster" #: tcl/scripts/Set_Coordinates.tcl:83 -#: src/emc/usr_intf/axis/scripts/axis.py:3567 +#: src/emc/usr_intf/axis/scripts/axis.py:3585 msgid "Axis " msgstr "Achse " @@ -6225,9 +6288,9 @@ msgstr "entfernen" msgid "move" msgstr "" -#: tcl/ngcgui.tcl:3716 src/emc/usr_intf/pncconf/pncconf.py:3859 -#: src/emc/usr_intf/pncconf/pncconf.py:3965 -#: src/emc/usr_intf/pncconf/pncconf.py:4125 +#: tcl/ngcgui.tcl:3716 src/emc/usr_intf/pncconf/pncconf.py:3866 +#: src/emc/usr_intf/pncconf/pncconf.py:3972 +#: src/emc/usr_intf/pncconf/pncconf.py:4136 msgid "Custom" msgstr "Benutzerdefiniert" @@ -6247,8 +6310,8 @@ msgstr "" msgid "using path" msgstr "" -#: tcl/ngcgui.tcl:3802 src/emc/usr_intf/axis/scripts/axis.py:2617 -#: src/emc/usr_intf/axis/scripts/axis.py:2644 +#: tcl/ngcgui.tcl:3802 src/emc/usr_intf/axis/scripts/axis.py:2635 +#: src/emc/usr_intf/axis/scripts/axis.py:2662 msgid "Warning" msgstr "Warnung" @@ -6321,158 +6384,158 @@ msgstr "INI-Datei" msgid "not found" msgstr "nicht gefunden" -#: tcl/ngcgui_ttt.tcl:67 +#: tcl/ngcgui_ttt.tcl:68 msgid "found truetype-tracer v4 -OK" msgstr "" -#: tcl/ngcgui_ttt.tcl:70 +#: tcl/ngcgui_ttt.tcl:71 msgid "Note truetype-tracer v4 is required" msgstr "" -#: tcl/ngcgui_ttt.tcl:71 +#: tcl/ngcgui_ttt.tcl:72 msgid "Note: truetype-tracer v4 is required" msgstr "" -#: tcl/ngcgui_ttt.tcl:81 +#: tcl/ngcgui_ttt.tcl:82 msgid "ngcgui_app.tcl must be loaded before" msgstr "" -#: tcl/ngcgui_ttt.tcl:89 +#: tcl/ngcgui_ttt.tcl:90 msgid "Create a subroutine file from truetype-tracer (V4 reqd)" msgstr "" -#: tcl/ngcgui_ttt.tcl:102 tcl/ngcgui_ttt.tcl:115 +#: tcl/ngcgui_ttt.tcl:103 tcl/ngcgui_ttt.tcl:116 msgid "problem with" msgstr "Problem mit" -#: tcl/ngcgui_ttt.tcl:106 +#: tcl/ngcgui_ttt.tcl:107 msgid "No entry for" msgstr "Kein Eintrag für" -#: tcl/ngcgui_ttt.tcl:109 +#: tcl/ngcgui_ttt.tcl:110 msgid "wrong version of truetype-tracer" msgstr "" -#: tcl/ngcgui_ttt.tcl:125 +#: tcl/ngcgui_ttt.tcl:126 msgid "not writable, using" msgstr "" -#: tcl/ngcgui_ttt.tcl:125 +#: tcl/ngcgui_ttt.tcl:126 msgid "and setting expandsub" msgstr "" -#: tcl/ngcgui_ttt.tcl:161 src/emc/usr_intf/pncconf/external.glade:721 +#: tcl/ngcgui_ttt.tcl:162 src/emc/usr_intf/pncconf/external.glade:721 msgid "Text" msgstr "Text" -#: tcl/ngcgui_ttt.tcl:171 +#: tcl/ngcgui_ttt.tcl:172 msgid "Linescale" msgstr "" -#: tcl/ngcgui_ttt.tcl:177 src/emc/usr_intf/gmoccapy/gmoccapy.glade:3956 +#: tcl/ngcgui_ttt.tcl:178 src/emc/usr_intf/gmoccapy/gmoccapy.glade:5427 msgid "none" msgstr "keine" -#: tcl/ngcgui_ttt.tcl:192 +#: tcl/ngcgui_ttt.tcl:193 msgid "Subdiv" msgstr "" -#: tcl/ngcgui_ttt.tcl:199 +#: tcl/ngcgui_ttt.tcl:200 msgid "default" msgstr "Standard" -#: tcl/ngcgui_ttt.tcl:239 +#: tcl/ngcgui_ttt.tcl:240 msgid "Mode" msgstr "Modus" -#: tcl/ngcgui_ttt.tcl:247 +#: tcl/ngcgui_ttt.tcl:248 msgid "normal" msgstr "normal" -#: tcl/ngcgui_ttt.tcl:248 +#: tcl/ngcgui_ttt.tcl:249 msgid "date" msgstr "" -#: tcl/ngcgui_ttt.tcl:249 +#: tcl/ngcgui_ttt.tcl:250 msgid "fontname" msgstr "Schriftname" -#: tcl/ngcgui_ttt.tcl:262 +#: tcl/ngcgui_ttt.tcl:263 msgid "Switches" msgstr "" -#: tcl/ngcgui_ttt.tcl:270 +#: tcl/ngcgui_ttt.tcl:271 msgid "Unicode" msgstr "Unicode" -#: tcl/ngcgui_ttt.tcl:275 +#: tcl/ngcgui_ttt.tcl:276 msgid "Allow Rotation" msgstr "Drehung erlauben" -#: tcl/ngcgui_ttt.tcl:295 +#: tcl/ngcgui_ttt.tcl:296 msgid "Make ngcgui-compatible subfile and new tab page" msgstr "" -#: tcl/ngcgui_ttt.tcl:353 +#: tcl/ngcgui_ttt.tcl:354 msgid "Null text" msgstr "" -#: tcl/ngcgui_ttt.tcl:384 +#: tcl/ngcgui_ttt.tcl:385 msgid "Using truetype-tracer default font" msgstr "" -#: tcl/ngcgui_ttt.tcl:388 +#: tcl/ngcgui_ttt.tcl:389 msgid "no such file" msgstr "keine solche Datei" -#: tcl/ngcgui_ttt.tcl:393 +#: tcl/ngcgui_ttt.tcl:394 msgid "file not readable" msgstr "Datei ist nicht lesbar" -#: tcl/ngcgui_ttt.tcl:507 +#: tcl/ngcgui_ttt.tcl:508 msgid "Creating new tab page" msgstr "" -#: tcl/ngcgui_app.tcl:25 +#: tcl/ngcgui_app.tcl:26 msgid "" "requires command inifindall\n" "from axis.py (LinuxCNC 2.5) or" msgstr "" -#: tcl/ngcgui_app.tcl:55 +#: tcl/ngcgui_app.tcl:56 #, fuzzy msgid "Substituting" msgstr "Einstellungen" -#: tcl/ngcgui_app.tcl:55 +#: tcl/ngcgui_app.tcl:56 #, fuzzy msgid "for" msgstr "oder" -#: tcl/ngcgui_app.tcl:59 +#: tcl/ngcgui_app.tcl:60 #, fuzzy msgid "not readable" msgstr "Datei ist nicht lesbar" -#: tcl/ngcgui_app.tcl:65 tcl/ngcgui_app.tcl:68 +#: tcl/ngcgui_app.tcl:66 tcl/ngcgui_app.tcl:69 msgid "Unexpected: multiple startups for ngcgui" msgstr "" -#: tcl/ngcgui_app.tcl:66 +#: tcl/ngcgui_app.tcl:67 #, fuzzy msgid "LinuxCNC" msgstr "TKLinuxCNC" -#: tcl/ngcgui_app.tcl:67 +#: tcl/ngcgui_app.tcl:68 msgid "for linuxCNC 2.5.xxx, Do not include tkapp.py in the ini file" msgstr "" -#: tcl/ngcgui_app.tcl:86 +#: tcl/ngcgui_app.tcl:87 #, fuzzy msgid "LinuxCNC version" msgstr "LinuxCNC-Fehler" -#: tcl/ngcgui_app.tcl:87 +#: tcl/ngcgui_app.tcl:88 msgid "for LinuxCNC 2.5.xxx, Do not include tkapp.py in the ini file" msgstr "" @@ -6771,407 +6834,407 @@ msgstr "" msgid "Confirm Close" msgstr "Konfiguration kopiert" -#: src/emc/usr_intf/axis/scripts/axis.py:177 +#: src/emc/usr_intf/axis/scripts/axis.py:178 msgid "Emergency stop" msgstr "Notaus" -#: src/emc/usr_intf/axis/scripts/axis.py:178 +#: src/emc/usr_intf/axis/scripts/axis.py:179 msgid "Turn machine on" msgstr "Maschine an" -#: src/emc/usr_intf/axis/scripts/axis.py:180 +#: src/emc/usr_intf/axis/scripts/axis.py:181 msgid "Activate first axis" msgstr "Erste Achse aktivieren" -#: src/emc/usr_intf/axis/scripts/axis.py:181 +#: src/emc/usr_intf/axis/scripts/axis.py:182 msgid "Activate second axis" msgstr "Zweite Achse aktivieren" -#: src/emc/usr_intf/axis/scripts/axis.py:182 +#: src/emc/usr_intf/axis/scripts/axis.py:183 msgid "Activate third axis" msgstr "Dritte Achse aktivieren" -#: src/emc/usr_intf/axis/scripts/axis.py:183 +#: src/emc/usr_intf/axis/scripts/axis.py:184 msgid "Activate fourth axis" msgstr "Vierte Achse aktivieren" -#: src/emc/usr_intf/axis/scripts/axis.py:184 +#: src/emc/usr_intf/axis/scripts/axis.py:185 #, fuzzy msgid "Activate first through ninth joint" msgstr "Fünfte bis neunte Achse aktivieren" -#: src/emc/usr_intf/axis/scripts/axis.py:185 +#: src/emc/usr_intf/axis/scripts/axis.py:186 msgid "if joints radiobuttons visible" msgstr "" -#: src/emc/usr_intf/axis/scripts/axis.py:186 +#: src/emc/usr_intf/axis/scripts/axis.py:187 msgid "Set Feed Override from 0% to 100%" msgstr "Vorschubübersteuerung von 0% bis 100%" -#: src/emc/usr_intf/axis/scripts/axis.py:187 +#: src/emc/usr_intf/axis/scripts/axis.py:188 msgid "if axes radiobuttons visible" msgstr "" -#: src/emc/usr_intf/axis/scripts/axis.py:188 +#: src/emc/usr_intf/axis/scripts/axis.py:189 msgid ", and ." msgstr ", und ." -#: src/emc/usr_intf/axis/scripts/axis.py:188 +#: src/emc/usr_intf/axis/scripts/axis.py:189 msgid "Select jog speed" msgstr "Schrittgeschwindigkeit auswählen" -#: src/emc/usr_intf/axis/scripts/axis.py:189 +#: src/emc/usr_intf/axis/scripts/axis.py:190 msgid "< and >" msgstr "< und >" -#: src/emc/usr_intf/axis/scripts/axis.py:189 +#: src/emc/usr_intf/axis/scripts/axis.py:190 msgid "Select angular jog speed" msgstr "Winkelgeschwindigkeit auswählen" -#: src/emc/usr_intf/axis/scripts/axis.py:190 +#: src/emc/usr_intf/axis/scripts/axis.py:191 msgid "I, Shift-I" msgstr "I, Umsch.-I" -#: src/emc/usr_intf/axis/scripts/axis.py:190 share/axis/tcl/axis.tcl:2281 +#: src/emc/usr_intf/axis/scripts/axis.py:191 share/axis/tcl/axis.tcl:2281 msgid "Select jog increment" msgstr "Schrittweite auswählen" -#: src/emc/usr_intf/axis/scripts/axis.py:191 +#: src/emc/usr_intf/axis/scripts/axis.py:192 msgid "Continuous jog" msgstr "Durchgehende Bewegung" -#: src/emc/usr_intf/axis/scripts/axis.py:192 +#: src/emc/usr_intf/axis/scripts/axis.py:193 msgid "Home" msgstr "Pos1" -#: src/emc/usr_intf/axis/scripts/axis.py:192 +#: src/emc/usr_intf/axis/scripts/axis.py:193 #, fuzzy msgid "Send active joint home" msgstr "Referenzfahrt mit der aktiven Achse" -#: src/emc/usr_intf/axis/scripts/axis.py:193 +#: src/emc/usr_intf/axis/scripts/axis.py:194 msgid "Ctrl-Home" msgstr "Strg-Pos1" -#: src/emc/usr_intf/axis/scripts/axis.py:193 +#: src/emc/usr_intf/axis/scripts/axis.py:194 #, fuzzy msgid "Home all joints" msgstr "Referenzfahrt mit allen Achsen" -#: src/emc/usr_intf/axis/scripts/axis.py:194 +#: src/emc/usr_intf/axis/scripts/axis.py:195 msgid "Shift-Home" msgstr "Umsch.-Pos1" -#: src/emc/usr_intf/axis/scripts/axis.py:194 +#: src/emc/usr_intf/axis/scripts/axis.py:195 msgid "Zero G54 offset for active axis" msgstr "Nullpunktverschiebung für die aktive Achse löschen" -#: src/emc/usr_intf/axis/scripts/axis.py:195 +#: src/emc/usr_intf/axis/scripts/axis.py:196 msgid "End" msgstr "Ende" -#: src/emc/usr_intf/axis/scripts/axis.py:195 +#: src/emc/usr_intf/axis/scripts/axis.py:196 msgid "Set G54 offset for active axis" msgstr "Absolute Nullpunktverschiebung für die aktive Achse setzen" -#: src/emc/usr_intf/axis/scripts/axis.py:196 +#: src/emc/usr_intf/axis/scripts/axis.py:197 #, fuzzy msgid "Ctrl-End" msgstr "Strg-R" -#: src/emc/usr_intf/axis/scripts/axis.py:196 +#: src/emc/usr_intf/axis/scripts/axis.py:197 #, fuzzy msgid "Set tool offset for loaded tool" msgstr "Absolute Nullpunktverschiebung für die aktive Achse setzen" -#: src/emc/usr_intf/axis/scripts/axis.py:197 +#: src/emc/usr_intf/axis/scripts/axis.py:198 #, fuzzy msgid "Jog active axis or joint" msgstr "Aktive Achse verfahren" -#: src/emc/usr_intf/axis/scripts/axis.py:198 +#: src/emc/usr_intf/axis/scripts/axis.py:199 #, fuzzy msgid "Select Max velocity" msgstr "Max. Geschwindigkeit:" -#: src/emc/usr_intf/axis/scripts/axis.py:201 +#: src/emc/usr_intf/axis/scripts/axis.py:202 msgid "Left, Right" msgstr "Links, Rechts" -#: src/emc/usr_intf/axis/scripts/axis.py:201 +#: src/emc/usr_intf/axis/scripts/axis.py:202 #, fuzzy msgid "Jog first axis or joint" msgstr "Erste Achse verfahren" -#: src/emc/usr_intf/axis/scripts/axis.py:202 +#: src/emc/usr_intf/axis/scripts/axis.py:203 msgid "Up, Down" msgstr "Hoch, Runter" -#: src/emc/usr_intf/axis/scripts/axis.py:202 +#: src/emc/usr_intf/axis/scripts/axis.py:203 #, fuzzy msgid "Jog second axis or joint" msgstr "Zweite Achse verfahren" -#: src/emc/usr_intf/axis/scripts/axis.py:203 +#: src/emc/usr_intf/axis/scripts/axis.py:204 msgid "Pg Up, Pg Dn" msgstr "Bild auf, Bild ab" -#: src/emc/usr_intf/axis/scripts/axis.py:203 +#: src/emc/usr_intf/axis/scripts/axis.py:204 #, fuzzy msgid "Jog third axis or joint" msgstr "Dritte Achse verfahren" -#: src/emc/usr_intf/axis/scripts/axis.py:204 +#: src/emc/usr_intf/axis/scripts/axis.py:205 msgid "Shift+above jogs" msgstr "" -#: src/emc/usr_intf/axis/scripts/axis.py:204 +#: src/emc/usr_intf/axis/scripts/axis.py:205 msgid "Jog at traverse speed" msgstr "" -#: src/emc/usr_intf/axis/scripts/axis.py:205 +#: src/emc/usr_intf/axis/scripts/axis.py:206 #, fuzzy msgid "Jog fourth axis or joint" msgstr "Vierte Achse verfahren" -#: src/emc/usr_intf/axis/scripts/axis.py:208 +#: src/emc/usr_intf/axis/scripts/axis.py:209 msgid "Toggle between Drag and Rotate mode" msgstr "Zwischen verschieben und drehen umschalten" -#: src/emc/usr_intf/axis/scripts/axis.py:209 +#: src/emc/usr_intf/axis/scripts/axis.py:210 msgid "Left Button" msgstr "Linke Maustaste" -#: src/emc/usr_intf/axis/scripts/axis.py:209 +#: src/emc/usr_intf/axis/scripts/axis.py:210 msgid "Pan, rotate or select line" msgstr "Verschieben, drehen oder Linie auswählen" -#: src/emc/usr_intf/axis/scripts/axis.py:210 +#: src/emc/usr_intf/axis/scripts/axis.py:211 #, fuzzy msgid "Shift+Left Button" msgstr "Umschalt+Linke Maustaste" -#: src/emc/usr_intf/axis/scripts/axis.py:210 +#: src/emc/usr_intf/axis/scripts/axis.py:211 msgid "Rotate or pan" msgstr "Drehen oder verschieben" -#: src/emc/usr_intf/axis/scripts/axis.py:211 +#: src/emc/usr_intf/axis/scripts/axis.py:212 msgid "Right Button" msgstr "Rechte Mausaste" -#: src/emc/usr_intf/axis/scripts/axis.py:211 -#: src/emc/usr_intf/axis/scripts/axis.py:213 +#: src/emc/usr_intf/axis/scripts/axis.py:212 #: src/emc/usr_intf/axis/scripts/axis.py:214 +#: src/emc/usr_intf/axis/scripts/axis.py:215 msgid "Zoom view" msgstr "Maßstab der Vorschau ändern" -#: src/emc/usr_intf/axis/scripts/axis.py:212 +#: src/emc/usr_intf/axis/scripts/axis.py:213 msgid "Wheel Button" msgstr "Mausrad-Taste" -#: src/emc/usr_intf/axis/scripts/axis.py:212 +#: src/emc/usr_intf/axis/scripts/axis.py:213 msgid "Rotate view" msgstr "Vorschau drehen" -#: src/emc/usr_intf/axis/scripts/axis.py:213 +#: src/emc/usr_intf/axis/scripts/axis.py:214 msgid "Rotate Wheel" msgstr "Mausrad" -#: src/emc/usr_intf/axis/scripts/axis.py:214 +#: src/emc/usr_intf/axis/scripts/axis.py:215 msgid "Control+Left Button" msgstr "Strg+Linke Maustaste" -#: src/emc/usr_intf/axis/scripts/axis.py:217 +#: src/emc/usr_intf/axis/scripts/axis.py:218 msgid "Manual control" msgstr "Manuelle Kontrolle" -#: src/emc/usr_intf/axis/scripts/axis.py:218 +#: src/emc/usr_intf/axis/scripts/axis.py:219 msgid "Code entry (MDI)" msgstr "Befehlseingabe (MDI)" -#: src/emc/usr_intf/axis/scripts/axis.py:219 +#: src/emc/usr_intf/axis/scripts/axis.py:220 msgid "Control-M" msgstr "Strg-M" -#: src/emc/usr_intf/axis/scripts/axis.py:219 +#: src/emc/usr_intf/axis/scripts/axis.py:220 msgid "Clear MDI history" msgstr "MDI-Verlauf leeren" -#: src/emc/usr_intf/axis/scripts/axis.py:220 +#: src/emc/usr_intf/axis/scripts/axis.py:221 msgid "Control-H" msgstr "Strg-H" -#: src/emc/usr_intf/axis/scripts/axis.py:220 +#: src/emc/usr_intf/axis/scripts/axis.py:221 msgid "Copy selected MDI history elements" msgstr "Markierte Befehle aus MDI-Verlauf" -#: src/emc/usr_intf/axis/scripts/axis.py:221 +#: src/emc/usr_intf/axis/scripts/axis.py:222 msgid "to clipboard" msgstr "in die Zwischenablage kopieren" -#: src/emc/usr_intf/axis/scripts/axis.py:222 +#: src/emc/usr_intf/axis/scripts/axis.py:223 msgid "Control-Shift-H" msgstr "Strg-Umsch.-H" -#: src/emc/usr_intf/axis/scripts/axis.py:222 +#: src/emc/usr_intf/axis/scripts/axis.py:223 msgid "Paste clipboard to MDI history" msgstr "Zwischenablage in den MDI-Verlauf einfügen" -#: src/emc/usr_intf/axis/scripts/axis.py:223 share/axis/tcl/axis.tcl:950 +#: src/emc/usr_intf/axis/scripts/axis.py:224 share/axis/tcl/axis.tcl:950 #: src/emc/usr_intf/touchy/touchy.glade:508 msgid "Override Limits" msgstr "Grenzwerte aufheben" -#: src/emc/usr_intf/axis/scripts/axis.py:225 +#: src/emc/usr_intf/axis/scripts/axis.py:226 msgid "Open program" msgstr "Programm öffnen" -#: src/emc/usr_intf/axis/scripts/axis.py:226 +#: src/emc/usr_intf/axis/scripts/axis.py:227 msgid "Control-R" msgstr "Strg-R" -#: src/emc/usr_intf/axis/scripts/axis.py:226 +#: src/emc/usr_intf/axis/scripts/axis.py:227 msgid "Reload program" msgstr "Programm neu laden" -#: src/emc/usr_intf/axis/scripts/axis.py:227 +#: src/emc/usr_intf/axis/scripts/axis.py:228 msgid "Control-S" msgstr "Strg-S" -#: src/emc/usr_intf/axis/scripts/axis.py:227 +#: src/emc/usr_intf/axis/scripts/axis.py:228 msgid "Save g-code as" msgstr "G-Code in Datei speichern" -#: src/emc/usr_intf/axis/scripts/axis.py:228 +#: src/emc/usr_intf/axis/scripts/axis.py:229 msgid "Run program" msgstr "Programm ausführen" -#: src/emc/usr_intf/axis/scripts/axis.py:229 +#: src/emc/usr_intf/axis/scripts/axis.py:230 msgid "Step program" msgstr "Programm schrittweise ausführen" -#: src/emc/usr_intf/axis/scripts/axis.py:230 +#: src/emc/usr_intf/axis/scripts/axis.py:231 msgid "Pause program" msgstr "Programm unterbrechen" -#: src/emc/usr_intf/axis/scripts/axis.py:231 +#: src/emc/usr_intf/axis/scripts/axis.py:232 msgid "Resume program" msgstr "Programm fortsetzen" -#: src/emc/usr_intf/axis/scripts/axis.py:232 +#: src/emc/usr_intf/axis/scripts/axis.py:233 msgid "Stop running program, or" msgstr "Programmausführung oder Laden der" -#: src/emc/usr_intf/axis/scripts/axis.py:233 +#: src/emc/usr_intf/axis/scripts/axis.py:234 msgid "stop loading program preview" msgstr "Programm-Vorschau abbrechen" -#: src/emc/usr_intf/axis/scripts/axis.py:235 +#: src/emc/usr_intf/axis/scripts/axis.py:236 msgid "Toggle mist" msgstr "Kühlnebel an/aus" -#: src/emc/usr_intf/axis/scripts/axis.py:236 +#: src/emc/usr_intf/axis/scripts/axis.py:237 msgid "Toggle flood" msgstr "Kühlmittel an/aus" -#: src/emc/usr_intf/axis/scripts/axis.py:237 +#: src/emc/usr_intf/axis/scripts/axis.py:238 msgid "Spindle brake off" msgstr "Spindelbremse aus" -#: src/emc/usr_intf/axis/scripts/axis.py:238 +#: src/emc/usr_intf/axis/scripts/axis.py:239 msgid "Shift-B" msgstr "Umschalt-B" -#: src/emc/usr_intf/axis/scripts/axis.py:238 +#: src/emc/usr_intf/axis/scripts/axis.py:239 msgid "Spindle brake on" msgstr "Spindelbremse an" -#: src/emc/usr_intf/axis/scripts/axis.py:239 +#: src/emc/usr_intf/axis/scripts/axis.py:240 msgid "Turn spindle clockwise" msgstr "Spindel dreht im Uhrzeigersinn" -#: src/emc/usr_intf/axis/scripts/axis.py:240 +#: src/emc/usr_intf/axis/scripts/axis.py:241 msgid "Turn spindle counterclockwise" msgstr "Spindel dreht gegen Uhrzeigersinn" -#: src/emc/usr_intf/axis/scripts/axis.py:241 +#: src/emc/usr_intf/axis/scripts/axis.py:242 msgid "Turn spindle more slowly" msgstr "Spindel langsamer" -#: src/emc/usr_intf/axis/scripts/axis.py:242 +#: src/emc/usr_intf/axis/scripts/axis.py:243 msgid "Turn spindle more quickly" msgstr "Spindel schneller" -#: src/emc/usr_intf/axis/scripts/axis.py:243 +#: src/emc/usr_intf/axis/scripts/axis.py:244 msgid "Control-K" msgstr "Strg-K" -#: src/emc/usr_intf/axis/scripts/axis.py:243 +#: src/emc/usr_intf/axis/scripts/axis.py:244 msgid "Clear live plot" msgstr "Werkzeugpfad löschen" -#: src/emc/usr_intf/axis/scripts/axis.py:244 +#: src/emc/usr_intf/axis/scripts/axis.py:245 msgid "Cycle among preset views" msgstr "Perspektive wechseln" -#: src/emc/usr_intf/axis/scripts/axis.py:245 +#: src/emc/usr_intf/axis/scripts/axis.py:246 #, fuzzy msgid "Cycle among preview, DRO, and user tabs" msgstr "Perspektive wechseln" -#: src/emc/usr_intf/axis/scripts/axis.py:246 +#: src/emc/usr_intf/axis/scripts/axis.py:247 msgid "toggle Actual/Commanded" msgstr "" -#: src/emc/usr_intf/axis/scripts/axis.py:247 +#: src/emc/usr_intf/axis/scripts/axis.py:248 msgid "toggle Relative/Machine" msgstr "" -#: src/emc/usr_intf/axis/scripts/axis.py:248 +#: src/emc/usr_intf/axis/scripts/axis.py:249 msgid "Ctrl-Space" msgstr "Strg-Leertaste" -#: src/emc/usr_intf/axis/scripts/axis.py:248 +#: src/emc/usr_intf/axis/scripts/axis.py:249 msgid "Clear notifications" msgstr "Mitteilungen löschen" -#: src/emc/usr_intf/axis/scripts/axis.py:249 +#: src/emc/usr_intf/axis/scripts/axis.py:250 msgid "Alt-F, M, V" msgstr "" -#: src/emc/usr_intf/axis/scripts/axis.py:249 +#: src/emc/usr_intf/axis/scripts/axis.py:250 #, fuzzy msgid "Open a Menu" msgstr "Eine neue Unterdatei öffnen" -#: src/emc/usr_intf/axis/scripts/axis.py:891 +#: src/emc/usr_intf/axis/scripts/axis.py:906 #, python-format msgid "Unknown tool %d" msgstr "Unbekanntes Werkzeug %d" -#: src/emc/usr_intf/axis/scripts/axis.py:893 share/axis/tcl/axis.tcl:1889 +#: src/emc/usr_intf/axis/scripts/axis.py:908 share/axis/tcl/axis.tcl:1889 msgid "No tool" msgstr "Kein Werkzeug" -#: src/emc/usr_intf/axis/scripts/axis.py:895 +#: src/emc/usr_intf/axis/scripts/axis.py:910 #, python-format msgid "Tool %(tool)d, offset %(zo)g, diameter %(dia)g" msgstr "Werkzeug %(tool)d, Werkzeugverschiebung %(zo)g, Durchmesser %(dia)g" -#: src/emc/usr_intf/axis/scripts/axis.py:897 +#: src/emc/usr_intf/axis/scripts/axis.py:912 #, python-format msgid "Tool %(tool)d, zo %(zo)g, xo %(xo)g, dia %(dia)g" msgstr "Werkzeug %(tool)d, Zo %(zo)g, Xo %(xo)g, Durchmesser %(dia)g" -#: src/emc/usr_intf/axis/scripts/axis.py:1072 +#: src/emc/usr_intf/axis/scripts/axis.py:1087 msgid "Filtering..." msgstr "Arbeite..." -#: src/emc/usr_intf/axis/scripts/axis.py:1135 +#: src/emc/usr_intf/axis/scripts/axis.py:1150 msgid "Filter failed" msgstr "Konvertierung fehlgeschlagen" -#: src/emc/usr_intf/axis/scripts/axis.py:1136 +#: src/emc/usr_intf/axis/scripts/axis.py:1151 #, python-format msgid "" "The program %(program)r exited with code %(code)d. Any error messages it " @@ -7180,12 +7243,12 @@ msgstr "" "Der Konverter %(program)r hat den Vorgang mit Status %(code)d beendet. " "Folgende Fehlermeldungen sind vorhanden:" -#: src/emc/usr_intf/axis/scripts/axis.py:1238 +#: src/emc/usr_intf/axis/scripts/axis.py:1253 #, python-format msgid "G-Code error in %s" msgstr "G-Code Fehler in %s" -#: src/emc/usr_intf/axis/scripts/axis.py:1239 +#: src/emc/usr_intf/axis/scripts/axis.py:1254 #, python-format msgid "" "Near line %(seq)d of %(f)s:\n" @@ -7194,130 +7257,130 @@ msgstr "" "Nahe Zeile %(seq)d in %(f)s:\n" "%(error_str)s" -#: src/emc/usr_intf/axis/scripts/axis.py:1433 -#: src/emc/usr_intf/axis/scripts/axis.py:3189 share/axis/tcl/axis.tcl:922 +#: src/emc/usr_intf/axis/scripts/axis.py:1448 +#: src/emc/usr_intf/axis/scripts/axis.py:3207 share/axis/tcl/axis.tcl:922 #: share/axis/tcl/axis.tcl:924 share/axis/tcl/axis.tcl:2068 -#: src/emc/usr_intf/gmoccapy/gmoccapy.py:1018 +#: src/emc/usr_intf/gmoccapy/gmoccapy.py:1010 msgid "Continuous" msgstr "Durchgehend" -#: src/emc/usr_intf/axis/scripts/axis.py:1696 +#: src/emc/usr_intf/axis/scripts/axis.py:1711 msgid "T Tool Table" msgstr "T Werkzeugtabelle" -#: src/emc/usr_intf/axis/scripts/axis.py:1706 -#: src/emc/usr_intf/axis/scripts/axis.py:1989 -#: src/emc/usr_intf/axis/scripts/axis.py:2557 +#: src/emc/usr_intf/axis/scripts/axis.py:1721 +#: src/emc/usr_intf/axis/scripts/axis.py:2004 +#: src/emc/usr_intf/axis/scripts/axis.py:2575 #: src/emc/usr_intf/stepconf/stepconf.py:1418 #: src/emc/usr_intf/stepconf/pages.py:791 msgid "in" msgstr "in" -#: src/emc/usr_intf/axis/scripts/axis.py:1709 +#: src/emc/usr_intf/axis/scripts/axis.py:1724 msgid " radius" msgstr " Radius" -#: src/emc/usr_intf/axis/scripts/axis.py:1711 +#: src/emc/usr_intf/axis/scripts/axis.py:1726 msgid " diameter" msgstr " Durchmesser" -#: src/emc/usr_intf/axis/scripts/axis.py:1712 +#: src/emc/usr_intf/axis/scripts/axis.py:1727 msgid "°" msgstr "°" -#: src/emc/usr_intf/axis/scripts/axis.py:1722 +#: src/emc/usr_intf/axis/scripts/axis.py:1737 msgid "Coordinate System:" msgstr "Koordinatensystem:" -#: src/emc/usr_intf/axis/scripts/axis.py:1740 +#: src/emc/usr_intf/axis/scripts/axis.py:1755 msgid "fixture" msgstr "" -#: src/emc/usr_intf/axis/scripts/axis.py:1741 +#: src/emc/usr_intf/axis/scripts/axis.py:1756 msgid "workpiece" msgstr "Werkstück" -#: src/emc/usr_intf/axis/scripts/axis.py:1762 +#: src/emc/usr_intf/axis/scripts/axis.py:1777 msgid "Name:" msgstr "Name:" -#: src/emc/usr_intf/axis/scripts/axis.py:1762 +#: src/emc/usr_intf/axis/scripts/axis.py:1777 msgid "Size:" msgstr "Größe:" -#: src/emc/usr_intf/axis/scripts/axis.py:1763 +#: src/emc/usr_intf/axis/scripts/axis.py:1778 msgid "Tool order:" msgstr "Werkzeugreichenfolge:" -#: src/emc/usr_intf/axis/scripts/axis.py:1763 +#: src/emc/usr_intf/axis/scripts/axis.py:1778 msgid "Rapid distance:" msgstr "Eilgang-Weg:" -#: src/emc/usr_intf/axis/scripts/axis.py:1764 +#: src/emc/usr_intf/axis/scripts/axis.py:1779 msgid "Feed distance:" msgstr "Vorschub-Weg:" -#: src/emc/usr_intf/axis/scripts/axis.py:1764 +#: src/emc/usr_intf/axis/scripts/axis.py:1779 msgid "Total distance:" msgstr "Gesamter Weg:" -#: src/emc/usr_intf/axis/scripts/axis.py:1765 +#: src/emc/usr_intf/axis/scripts/axis.py:1780 msgid "Run time:" msgstr "Laufzeit:" -#: src/emc/usr_intf/axis/scripts/axis.py:1765 +#: src/emc/usr_intf/axis/scripts/axis.py:1780 msgid "X bounds:" msgstr "X-Bereich:" -#: src/emc/usr_intf/axis/scripts/axis.py:1766 +#: src/emc/usr_intf/axis/scripts/axis.py:1781 msgid "Y bounds:" msgstr "Y-Bereich:" -#: src/emc/usr_intf/axis/scripts/axis.py:1766 +#: src/emc/usr_intf/axis/scripts/axis.py:1781 msgid "Z bounds:" msgstr "Z-Bereich:" -#: src/emc/usr_intf/axis/scripts/axis.py:1767 +#: src/emc/usr_intf/axis/scripts/axis.py:1782 msgid "A bounds:" msgstr "A-Bereich:" -#: src/emc/usr_intf/axis/scripts/axis.py:1767 +#: src/emc/usr_intf/axis/scripts/axis.py:1782 msgid "B bounds:" msgstr "B-Bereich:" -#: src/emc/usr_intf/axis/scripts/axis.py:1768 +#: src/emc/usr_intf/axis/scripts/axis.py:1783 msgid "C bounds:" msgstr "C-Bereich:" -#: src/emc/usr_intf/axis/scripts/axis.py:1823 +#: src/emc/usr_intf/axis/scripts/axis.py:1838 #, python-format msgid "Program exceeds machine minimum on axis %s" msgstr "Programm überschreitet den unteren Grenzwert der Achse %s" -#: src/emc/usr_intf/axis/scripts/axis.py:1826 +#: src/emc/usr_intf/axis/scripts/axis.py:1841 #, python-format msgid "Program exceeds machine maximum on axis %s" msgstr "Programm überschreitet den oberen Grenzwert der Achse %s" -#: src/emc/usr_intf/axis/scripts/axis.py:1831 +#: src/emc/usr_intf/axis/scripts/axis.py:1846 msgid "Program exceeds machine limits" msgstr "Programm überschreitet die Maschinengrenzwerte" -#: src/emc/usr_intf/axis/scripts/axis.py:1834 +#: src/emc/usr_intf/axis/scripts/axis.py:1849 msgid "Run Anyway" msgstr "Trotzdem ausführen" -#: src/emc/usr_intf/axis/scripts/axis.py:1967 -#: src/emc/usr_intf/gmoccapy/gmoccapy.py:2395 +#: src/emc/usr_intf/axis/scripts/axis.py:1982 +#: src/emc/usr_intf/gmoccapy/gmoccapy.py:2411 msgid "No file loaded" msgstr "Keine Datei geladen" -#: src/emc/usr_intf/axis/scripts/axis.py:1975 +#: src/emc/usr_intf/axis/scripts/axis.py:1990 #, python-format msgid "generated from %s" msgstr "Erstellt von »%«" -#: src/emc/usr_intf/axis/scripts/axis.py:1981 +#: src/emc/usr_intf/axis/scripts/axis.py:1996 #, python-format msgid "" "%(size)s bytes\n" @@ -7326,44 +7389,44 @@ msgstr "" "%(size)s Byte\n" "%(lines)s Zeilen" -#: src/emc/usr_intf/axis/scripts/axis.py:2007 +#: src/emc/usr_intf/axis/scripts/axis.py:2022 #, python-format msgid "%.1f minutes" msgstr "%.1f Minuten" -#: src/emc/usr_intf/axis/scripts/axis.py:2009 +#: src/emc/usr_intf/axis/scripts/axis.py:2024 #, python-format msgid "%d seconds" msgstr "%d s" -#: src/emc/usr_intf/axis/scripts/axis.py:2017 +#: src/emc/usr_intf/axis/scripts/axis.py:2032 #, python-format msgid "%(a)f to %(b)f = %(diff)f %(units)s" msgstr "%(a)f bis %(b)f = %(diff)f %(units)s" -#: src/emc/usr_intf/axis/scripts/axis.py:2018 +#: src/emc/usr_intf/axis/scripts/axis.py:2033 msgid "G-Code Properties" msgstr "G-Code Eigenschaften" -#: src/emc/usr_intf/axis/scripts/axis.py:2166 +#: src/emc/usr_intf/axis/scripts/axis.py:2181 msgid "All machinable files" msgstr "Alle einlesbaren Dateien" -#: src/emc/usr_intf/axis/scripts/axis.py:2167 -#: src/emc/usr_intf/axis/scripts/axis.py:2894 +#: src/emc/usr_intf/axis/scripts/axis.py:2182 +#: src/emc/usr_intf/axis/scripts/axis.py:2912 msgid "rs274ngc files" msgstr "NC Dateien" -#: src/emc/usr_intf/axis/scripts/axis.py:2183 +#: src/emc/usr_intf/axis/scripts/axis.py:2198 msgid "axis cannot accept remote command while running" msgstr "" -#: src/emc/usr_intf/axis/scripts/axis.py:2238 +#: src/emc/usr_intf/axis/scripts/axis.py:2253 #, fuzzy msgid "File not Writable:" msgstr "Datei ist nicht lesbar" -#: src/emc/usr_intf/axis/scripts/axis.py:2239 +#: src/emc/usr_intf/axis/scripts/axis.py:2254 msgid "" "This file is not writable\n" "You can Edit-readonly\n" @@ -7374,65 +7437,65 @@ msgid "" "then open that saved, writable file" msgstr "" -#: src/emc/usr_intf/axis/scripts/axis.py:2246 +#: src/emc/usr_intf/axis/scripts/axis.py:2261 msgid "Edit-readonly" msgstr "" -#: src/emc/usr_intf/axis/scripts/axis.py:2558 +#: src/emc/usr_intf/axis/scripts/axis.py:2576 #, fuzzy msgid "Custom Grid" msgstr "Benutzerdefiniert" -#: src/emc/usr_intf/axis/scripts/axis.py:2558 +#: src/emc/usr_intf/axis/scripts/axis.py:2576 msgid "Enter grid size" msgstr "" -#: src/emc/usr_intf/axis/scripts/axis.py:2617 +#: src/emc/usr_intf/axis/scripts/axis.py:2635 msgid "Joint is already homed, are you sure you want to re-home?" msgstr "" -#: src/emc/usr_intf/axis/scripts/axis.py:2632 +#: src/emc/usr_intf/axis/scripts/axis.py:2650 #, fuzzy, python-format msgid "home_joint <%s> Use joint mode for homing" msgstr "Referenzfahrt nur im Gelenk-Modus möglich" -#: src/emc/usr_intf/axis/scripts/axis.py:2635 +#: src/emc/usr_intf/axis/scripts/axis.py:2653 #, python-format msgid "" "\n" "Individual axis homing disallowed for duplicated letter:<%s> " msgstr "" -#: src/emc/usr_intf/axis/scripts/axis.py:2644 +#: src/emc/usr_intf/axis/scripts/axis.py:2662 msgid "This joint is already homed, are you sure you want to re-home?" msgstr "" -#: src/emc/usr_intf/axis/scripts/axis.py:2654 +#: src/emc/usr_intf/axis/scripts/axis.py:2672 #, python-format msgid "unhome_joint <%s> Use joint mode for unhoming" msgstr "" -#: src/emc/usr_intf/axis/scripts/axis.py:2696 +#: src/emc/usr_intf/axis/scripts/axis.py:2714 #, fuzzy msgid "Touch Off (system)" msgstr "Antasten" -#: src/emc/usr_intf/axis/scripts/axis.py:2697 -#: src/emc/usr_intf/axis/scripts/axis.py:2738 +#: src/emc/usr_intf/axis/scripts/axis.py:2715 +#: src/emc/usr_intf/axis/scripts/axis.py:2756 #, python-format msgid "Enter %s coordinate relative to %%s:" msgstr "%s-Koordinate relativ zu %%s:" -#: src/emc/usr_intf/axis/scripts/axis.py:2737 +#: src/emc/usr_intf/axis/scripts/axis.py:2755 #, fuzzy, python-format msgid "Tool %s TouchOff" msgstr "Antasten" -#: src/emc/usr_intf/axis/scripts/axis.py:2906 +#: src/emc/usr_intf/axis/scripts/axis.py:2924 msgid "Error saving file" msgstr "Fehler beim Speichern der Datei" -#: src/emc/usr_intf/axis/scripts/axis.py:3357 +#: src/emc/usr_intf/axis/scripts/axis.py:3375 #, python-format msgid "" "\n" @@ -7441,7 +7504,7 @@ msgid "" "See the 'INI Configuration' documents\n" msgstr "" -#: src/emc/usr_intf/axis/scripts/axis.py:3370 +#: src/emc/usr_intf/axis/scripts/axis.py:3388 #, python-format msgid "" "\n" @@ -7450,7 +7513,7 @@ msgid "" "See the 'INI Configuration' documents\n" msgstr "" -#: src/emc/usr_intf/axis/scripts/axis.py:3383 +#: src/emc/usr_intf/axis/scripts/axis.py:3401 #, python-format msgid "" "\n" @@ -7459,91 +7522,91 @@ msgid "" "See the 'INI Configuration' documents\n" msgstr "" -#: src/emc/usr_intf/axis/scripts/axis.py:3484 +#: src/emc/usr_intf/axis/scripts/axis.py:3502 msgid "Axes" msgstr "" -#: src/emc/usr_intf/axis/scripts/axis.py:3486 +#: src/emc/usr_intf/axis/scripts/axis.py:3504 #, fuzzy msgid "Joints" msgstr "Achse/Gelenk:" -#: src/emc/usr_intf/axis/scripts/axis.py:3488 +#: src/emc/usr_intf/axis/scripts/axis.py:3506 #: src/emc/usr_intf/touchy/touchy.glade:577 #: src/emc/usr_intf/gscreen/gscreen.glade:2968 msgid "Home All" msgstr "Referenzfahrt" -#: src/emc/usr_intf/axis/scripts/axis.py:3490 +#: src/emc/usr_intf/axis/scripts/axis.py:3508 #, fuzzy, python-format msgid "Home all %s [Ctrl-Home]" msgstr "Referenzfahrt mit allen Achsen [Strg-Pos1]" -#: src/emc/usr_intf/axis/scripts/axis.py:3493 +#: src/emc/usr_intf/axis/scripts/axis.py:3511 #, fuzzy, python-format msgid "Home All %s" msgstr "Referenzfahrt" -#: src/emc/usr_intf/axis/scripts/axis.py:3495 +#: src/emc/usr_intf/axis/scripts/axis.py:3513 #, fuzzy, python-format msgid "Unhome All %s" msgstr "Referenzfahrt aufheben bei allen Achsen" -#: src/emc/usr_intf/axis/scripts/axis.py:3536 +#: src/emc/usr_intf/axis/scripts/axis.py:3554 #, python-format msgid "Warning: Forward kinematics must handle duplicate coordinate letters:%s" msgstr "" -#: src/emc/usr_intf/axis/scripts/axis.py:3539 +#: src/emc/usr_intf/axis/scripts/axis.py:3557 #, python-format msgid "Note: number of [TRAJ]COORDINATES=%(t)s exceeds [KINS]JOINTS=%(l)d" msgstr "" -#: src/emc/usr_intf/axis/scripts/axis.py:3571 +#: src/emc/usr_intf/axis/scripts/axis.py:3589 msgid "" "\n" "Note:\n" "Individual axis homing is not currently supported for" msgstr "" -#: src/emc/usr_intf/axis/scripts/axis.py:3572 +#: src/emc/usr_intf/axis/scripts/axis.py:3590 #, python-format msgid "KINEMATICS_IDENTITY with duplicate axis letter <%s>\n" msgstr "" -#: src/emc/usr_intf/axis/scripts/axis.py:3584 +#: src/emc/usr_intf/axis/scripts/axis.py:3602 #, fuzzy msgid "Joint" msgstr "Achse/Gelenk:" -#: src/emc/usr_intf/axis/scripts/axis.py:3586 +#: src/emc/usr_intf/axis/scripts/axis.py:3604 #, fuzzy msgid "Home Joint" msgstr "_Referenzpunkt:" -#: src/emc/usr_intf/axis/scripts/axis.py:3594 +#: src/emc/usr_intf/axis/scripts/axis.py:3612 #, python-format msgid "Home %(name)s _%(id)s" msgstr "" -#: src/emc/usr_intf/axis/scripts/axis.py:3596 +#: src/emc/usr_intf/axis/scripts/axis.py:3614 #, fuzzy, python-format msgid "Unhome %(name)s _%(id)s" msgstr "Referenzfahrt aufheben bei _%s-Achse" -#: src/emc/usr_intf/axis/scripts/axis.py:3790 +#: src/emc/usr_intf/axis/scripts/axis.py:3808 msgid "Run from here" msgstr "Ab hier ausführen" -#: src/emc/usr_intf/axis/scripts/axis.py:3848 +#: src/emc/usr_intf/axis/scripts/axis.py:3868 msgid "toggle PYVCP panel visibility" msgstr "" -#: src/emc/usr_intf/axis/scripts/axis.py:3850 share/axis/tcl/axis.tcl:387 +#: src/emc/usr_intf/axis/scripts/axis.py:3870 share/axis/tcl/axis.tcl:387 msgid "Show pyVCP pan_el" msgstr "" -#: src/emc/usr_intf/axis/scripts/axis.py:4119 +#: src/emc/usr_intf/axis/scripts/axis.py:4139 msgid "Error in ~/.axisrc" msgstr "Fehler in »~/.axisrc«" @@ -8190,11 +8253,11 @@ msgstr "Zeilen beginnend mit '/' überspringen [Alt-M /]" msgid "Toggle optional pause [Alt-M 1]" msgstr "Wahlweiser Halt ein/aus [Alt-M 1]" -#: share/axis/tcl/axis.tcl:586 src/emc/usr_intf/gmoccapy/gmoccapy.glade:638 +#: share/axis/tcl/axis.tcl:586 src/emc/usr_intf/gmoccapy/gmoccapy.glade:640 msgid "Zoom in" msgstr "Vergrößern" -#: share/axis/tcl/axis.tcl:594 src/emc/usr_intf/gmoccapy/gmoccapy.glade:657 +#: share/axis/tcl/axis.tcl:594 src/emc/usr_intf/gmoccapy/gmoccapy.glade:658 msgid "Zoom out" msgstr "Verkleinern" @@ -8531,10 +8594,9 @@ msgid "Temporarily allow jogging outside machine limits [L]" msgstr "Erlaubt über die Endschalter zu verfahren [L]" #: src/emc/usr_intf/touchy/touchy.py:142 -#: src/emc/usr_intf/pncconf/pncconf.py:1686 -#: src/emc/usr_intf/pncconf/pncconf.py:1689 +#: src/emc/usr_intf/pncconf/pncconf.py:1693 +#: src/emc/usr_intf/pncconf/pncconf.py:1696 #: src/emc/usr_intf/gscreen/gscreen.py:1321 -#: src/emc/usr_intf/gmoccapy/gmoccapy.py:1821 #, fuzzy msgid "Follow System Theme" msgstr "Systemthema folgen\n" @@ -8552,9 +8614,8 @@ msgid "Spindle CCW" msgstr "Spindel links" #: src/emc/usr_intf/touchy/mdi.py:50 -#, fuzzy msgid "Set tool number" -msgstr "Anwenden" +msgstr "Setze Werkzeugnummer" #: src/emc/usr_intf/touchy/mdi.py:51 src/emc/usr_intf/gscreen/mdi.py:50 msgid "Input control" @@ -8563,22 +8624,22 @@ msgstr "" #: src/emc/usr_intf/touchy/mdi.py:54 src/emc/usr_intf/touchy/mdi.py:55 #: src/emc/usr_intf/gscreen/mdi.py:53 src/emc/usr_intf/gscreen/mdi.py:54 msgid "Straight rapid" -msgstr "" +msgstr "Linearer Eilgang" #: src/emc/usr_intf/touchy/mdi.py:56 src/emc/usr_intf/touchy/mdi.py:57 #: src/emc/usr_intf/gscreen/mdi.py:55 src/emc/usr_intf/gscreen/mdi.py:56 msgid "Straight feed" -msgstr "" +msgstr "Linearer Vorschub" #: src/emc/usr_intf/touchy/mdi.py:58 src/emc/usr_intf/touchy/mdi.py:59 #: src/emc/usr_intf/gscreen/mdi.py:57 src/emc/usr_intf/gscreen/mdi.py:58 msgid "Arc CW" -msgstr "" +msgstr "Bogen rechts" #: src/emc/usr_intf/touchy/mdi.py:60 src/emc/usr_intf/touchy/mdi.py:61 #: src/emc/usr_intf/gscreen/mdi.py:59 src/emc/usr_intf/gscreen/mdi.py:60 msgid "Arc CCW" -msgstr "" +msgstr "Bogen links" #: src/emc/usr_intf/touchy/mdi.py:62 src/emc/usr_intf/touchy/mdi.py:63 #: src/emc/usr_intf/gscreen/mdi.py:61 src/emc/usr_intf/gscreen/mdi.py:62 @@ -8591,7 +8652,7 @@ msgstr "Einrichtung" #: src/emc/usr_intf/touchy/mdi.py:65 src/emc/usr_intf/gscreen/mdi.py:64 msgid "Spindle synchronized feed" -msgstr "" +msgstr "Syncrongeschwindigkeit Spindel" #: src/emc/usr_intf/touchy/mdi.py:66 src/emc/usr_intf/gscreen/mdi.py:65 msgid "Rigid tap" @@ -8606,35 +8667,42 @@ msgid "Probe" msgstr "Sensor" #: src/emc/usr_intf/touchy/mdi.py:71 src/emc/usr_intf/gscreen/mdi.py:70 +#, fuzzy msgid "Radius compensation left" -msgstr "Radiusausgleich links" +msgstr "" +"#-#-#-#-# de2.po (de) #-#-#-#-#\n" +"Radiusausgleich links\n" +"#-#-#-#-# de_master.po (de) #-#-#-#-#\n" +"Werkzeugradienkorrektur links" #: src/emc/usr_intf/touchy/mdi.py:72 src/emc/usr_intf/gscreen/mdi.py:71 +#, fuzzy msgid "Radius compensation right" -msgstr "Radiusausgleich rechts" +msgstr "" +"#-#-#-#-# de2.po (de) #-#-#-#-#\n" +"Radiusausgleich rechts\n" +"#-#-#-#-# de_master.po (de) #-#-#-#-#\n" +"Werkzeugradienkorrektur rechts" #: src/emc/usr_intf/touchy/mdi.py:73 src/emc/usr_intf/gscreen/mdi.py:72 msgid "Radius compensation left, immediate" -msgstr "" +msgstr "sofortige Werkzeugradienkorrektur links" #: src/emc/usr_intf/touchy/mdi.py:74 src/emc/usr_intf/gscreen/mdi.py:73 msgid "Radius compensation right, immediate" -msgstr "" +msgstr "sofortige Werkzeugradienkorrektur rechts" #: src/emc/usr_intf/touchy/mdi.py:75 src/emc/usr_intf/gscreen/mdi.py:74 -#, fuzzy msgid "Tool length offset" -msgstr "Werkzeug-Längen-Index zu groß" +msgstr "Werkzeug-Längen-Ausgleich" #: src/emc/usr_intf/touchy/mdi.py:76 src/emc/usr_intf/gscreen/mdi.py:75 -#, fuzzy msgid "Tool length offset immediate" -msgstr "Werkzeug-Längen-Index zu groß" +msgstr "sofortiger Werkzeug-Längen-Ausgleich" #: src/emc/usr_intf/touchy/mdi.py:77 -#, fuzzy msgid "Tool length offset additional" -msgstr "Werkzeug-Längen-Index zu groß" +msgstr "zusätzlicher Werkzeug-Längen-Ausgleich" #: src/emc/usr_intf/touchy/mdi.py:78 src/emc/usr_intf/gscreen/mdi.py:76 msgid "Motion in unoffset coordinates" @@ -9000,7 +9068,7 @@ msgid "label26" msgstr "" #: src/emc/usr_intf/touchy/touchy.glade:1539 -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:4662 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:6128 msgid "Spindle" msgstr "Spindel" @@ -9168,7 +9236,7 @@ msgstr "" "3" #: src/emc/usr_intf/touchy/touchy.glade:3009 -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:6628 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:8064 msgid "Status" msgstr "Status" @@ -9371,7 +9439,7 @@ msgstr "Schritt" #: src/emc/usr_intf/stepconf/stepconf.py:240 #: src/emc/usr_intf/stepconf/main_page.glade:581 #: src/emc/usr_intf/pncconf/private_data.py:39 -#: src/emc/usr_intf/pncconf/private_data.py:998 +#: src/emc/usr_intf/pncconf/private_data.py:1050 #: src/emc/usr_intf/pncconf/main_page.glade:226 #: src/emc/usr_intf/gscreen/gscreen.py:4453 #: src/emc/usr_intf/gscreen/gscreen.py:4454 @@ -9450,78 +9518,78 @@ msgid "Almost Done" msgstr "" #: src/emc/usr_intf/stepconf/stepconf.py:151 -#: src/emc/usr_intf/pncconf/private_data.py:959 +#: src/emc/usr_intf/pncconf/private_data.py:1012 msgid "Gecko 201" msgstr "Gecko 201" #: src/emc/usr_intf/stepconf/stepconf.py:152 -#: src/emc/usr_intf/pncconf/private_data.py:960 +#: src/emc/usr_intf/pncconf/private_data.py:1013 msgid "Gecko 202" msgstr "Gecko 202" #: src/emc/usr_intf/stepconf/stepconf.py:153 -#: src/emc/usr_intf/pncconf/private_data.py:961 +#: src/emc/usr_intf/pncconf/private_data.py:1014 msgid "Gecko 203v" msgstr "Gecko 203v" #: src/emc/usr_intf/stepconf/stepconf.py:154 -#: src/emc/usr_intf/pncconf/private_data.py:962 +#: src/emc/usr_intf/pncconf/private_data.py:1015 msgid "Gecko 210" msgstr "Gecko 210" #: src/emc/usr_intf/stepconf/stepconf.py:155 -#: src/emc/usr_intf/pncconf/private_data.py:963 +#: src/emc/usr_intf/pncconf/private_data.py:1016 msgid "Gecko 212" msgstr "Gecko 212" #: src/emc/usr_intf/stepconf/stepconf.py:156 -#: src/emc/usr_intf/pncconf/private_data.py:964 +#: src/emc/usr_intf/pncconf/private_data.py:1017 msgid "Gecko 320" msgstr "Gecko 320" #: src/emc/usr_intf/stepconf/stepconf.py:157 -#: src/emc/usr_intf/pncconf/private_data.py:965 +#: src/emc/usr_intf/pncconf/private_data.py:1018 msgid "Gecko 540" msgstr "Gecko 540" #: src/emc/usr_intf/stepconf/stepconf.py:158 -#: src/emc/usr_intf/pncconf/private_data.py:966 +#: src/emc/usr_intf/pncconf/private_data.py:1019 msgid "L297" msgstr "L297" #: src/emc/usr_intf/stepconf/stepconf.py:159 -#: src/emc/usr_intf/pncconf/private_data.py:967 +#: src/emc/usr_intf/pncconf/private_data.py:1020 msgid "PMDX-150" msgstr "PMDX-150" #: src/emc/usr_intf/stepconf/stepconf.py:160 #: src/emc/usr_intf/stepconf/pport1.glade:32 -#: src/emc/usr_intf/pncconf/private_data.py:968 +#: src/emc/usr_intf/pncconf/private_data.py:1021 msgid "Sherline" msgstr "Sherline" #: src/emc/usr_intf/stepconf/stepconf.py:161 -#: src/emc/usr_intf/pncconf/private_data.py:969 +#: src/emc/usr_intf/pncconf/private_data.py:1022 msgid "Xylotex 8S-3" msgstr "Xylotex 8S-3" #: src/emc/usr_intf/stepconf/stepconf.py:162 -#: src/emc/usr_intf/pncconf/private_data.py:970 +#: src/emc/usr_intf/pncconf/private_data.py:1023 msgid "Parker-Compumotor oem750" msgstr "Parker-Compumotor oem750" #: src/emc/usr_intf/stepconf/stepconf.py:163 -#: src/emc/usr_intf/pncconf/private_data.py:971 +#: src/emc/usr_intf/pncconf/private_data.py:1024 msgid "JVL-SMD41 or 42" msgstr "JVL-SMD41 oder 42" #: src/emc/usr_intf/stepconf/stepconf.py:164 -#: src/emc/usr_intf/pncconf/private_data.py:972 +#: src/emc/usr_intf/pncconf/private_data.py:1025 msgid "Hobbycnc Pro Chopper" msgstr "Hobbycnc Pro Chopper" #: src/emc/usr_intf/stepconf/stepconf.py:165 -#: src/emc/usr_intf/pncconf/private_data.py:973 +#: src/emc/usr_intf/pncconf/private_data.py:1026 msgid "Keling 4030" msgstr "Keling 4030" @@ -9886,18 +9954,18 @@ msgid "Digital in 3" msgstr "Digitaler Eingang 3" #: src/emc/usr_intf/stepconf/stepconf.py:241 -#: src/emc/usr_intf/pncconf/private_data.py:999 +#: src/emc/usr_intf/pncconf/private_data.py:1051 #, fuzzy msgid "Forward" msgstr "Spindel vorwärts" #: src/emc/usr_intf/stepconf/stepconf.py:242 -#: src/emc/usr_intf/pncconf/private_data.py:1000 +#: src/emc/usr_intf/pncconf/private_data.py:1052 msgid "Done" msgstr "" #: src/emc/usr_intf/stepconf/stepconf.py:243 -#: src/emc/usr_intf/pncconf/private_data.py:1001 +#: src/emc/usr_intf/pncconf/private_data.py:1053 msgid "" "OK to replace existing custom ladder program?\n" "Existing Custom.clp will be renamed custom_backup.clp.\n" @@ -9909,7 +9977,7 @@ msgstr "" #: src/emc/usr_intf/stepconf/stepconf.py:244 #: src/emc/usr_intf/pncconf/pages.py:1341 -#: src/emc/usr_intf/pncconf/private_data.py:1002 +#: src/emc/usr_intf/pncconf/private_data.py:1054 msgid "" "You edited a ladder program and have selected a different program to copy to " "your configuration file.\n" @@ -9924,7 +9992,7 @@ msgstr "" "Sind Sie sicher?" #: src/emc/usr_intf/stepconf/stepconf.py:245 -#: src/emc/usr_intf/pncconf/private_data.py:1003 +#: src/emc/usr_intf/pncconf/private_data.py:1055 msgid "" "You need to designate an E-stop input pin in the Parallel Port Setup page " "for this program." @@ -9948,21 +10016,21 @@ msgid "Quit Stepconf and discard changes?" msgstr "Maschinenkonfiguration beenden und Änderungen verwerfen?" #: src/emc/usr_intf/stepconf/stepconf.py:248 -#: src/emc/usr_intf/pncconf/private_data.py:1007 +#: src/emc/usr_intf/pncconf/private_data.py:1059 msgid "" "The configuration has been built and saved.\n" "Do you want to quit?" msgstr "" #: src/emc/usr_intf/stepconf/stepconf.py:249 -#: src/emc/usr_intf/pncconf/private_data.py:1008 +#: src/emc/usr_intf/pncconf/private_data.py:1060 msgid "" "You are using a simulated-realtime version of LinuxCNC, so testing / tuning " "of hardware is unavailable." msgstr "" #: src/emc/usr_intf/stepconf/stepconf.py:250 -#: src/emc/usr_intf/pncconf/private_data.py:1009 +#: src/emc/usr_intf/pncconf/private_data.py:1061 #, python-format msgid "" "You are using a realtime version of LinuxCNC but didn't load a realtime " @@ -9992,17 +10060,17 @@ msgstr "" "die außerhalb von stepconf vorgenommen wurden, verworfen." #: src/emc/usr_intf/stepconf/stepconf.py:608 -#: src/emc/usr_intf/pncconf/data.py:877 +#: src/emc/usr_intf/pncconf/data.py:878 msgid "Continue? " msgstr "Fortsetzen? " #: src/emc/usr_intf/stepconf/stepconf.py:609 -#: src/emc/usr_intf/pncconf/data.py:878 +#: src/emc/usr_intf/pncconf/data.py:879 msgid "yY" msgstr "jJ" #: src/emc/usr_intf/stepconf/stepconf.py:694 -#: src/emc/usr_intf/pncconf/data.py:1058 +#: src/emc/usr_intf/pncconf/data.py:1059 #, python-format msgid "launch %s" msgstr "%s starten" @@ -10020,7 +10088,7 @@ msgid "Other" msgstr "Benutzerdefiniert" #: src/emc/usr_intf/stepconf/stepconf.py:1385 -#: src/emc/usr_intf/pncconf/tests.py:1025 +#: src/emc/usr_intf/pncconf/tests.py:1031 #, python-format msgid "%s Axis Test" msgstr "Test %s-Achse" @@ -10048,11 +10116,11 @@ msgstr "Grad" #: src/emc/usr_intf/stepconf/axisu.glade:305 #: src/emc/usr_intf/stepconf/axisv.glade:304 #: src/emc/usr_intf/stepconf/axisa.glade:302 -#: src/emc/usr_intf/pncconf/x_motor.glade:1775 -#: src/emc/usr_intf/pncconf/y_motor.glade:1775 -#: src/emc/usr_intf/pncconf/z_motor.glade:1775 +#: src/emc/usr_intf/pncconf/x_motor.glade:2106 +#: src/emc/usr_intf/pncconf/y_motor.glade:2106 +#: src/emc/usr_intf/pncconf/z_motor.glade:2106 #: src/emc/usr_intf/pncconf/a_motor.glade:1775 -#: src/emc/usr_intf/pncconf/s_motor.glade:2237 +#: src/emc/usr_intf/pncconf/s_motor.glade:1983 msgid "mm / s" msgstr "mm / s" @@ -10064,11 +10132,11 @@ msgstr "mm / s" #: src/emc/usr_intf/stepconf/axisu.glade:318 #: src/emc/usr_intf/stepconf/axisv.glade:317 #: src/emc/usr_intf/stepconf/axisa.glade:315 -#: src/emc/usr_intf/pncconf/x_motor.glade:1790 -#: src/emc/usr_intf/pncconf/y_motor.glade:1790 -#: src/emc/usr_intf/pncconf/z_motor.glade:1790 +#: src/emc/usr_intf/pncconf/x_motor.glade:2122 +#: src/emc/usr_intf/pncconf/y_motor.glade:2122 +#: src/emc/usr_intf/pncconf/z_motor.glade:2122 #: src/emc/usr_intf/pncconf/a_motor.glade:1790 -#: src/emc/usr_intf/pncconf/s_motor.glade:2253 +#: src/emc/usr_intf/pncconf/s_motor.glade:1999 msgid "mm / s²" msgstr "mm / s²" @@ -10087,7 +10155,7 @@ msgid "LinuxCNC 'stepconf' configuration files" msgstr "LinuxCNC »stepconf«-Konfigurationsdateien" #: src/emc/usr_intf/stepconf/pages.py:215 -#: src/emc/usr_intf/pncconf/pncconf.py:854 +#: src/emc/usr_intf/pncconf/pncconf.py:863 msgid "Modify Existing Configuration" msgstr "Bestehende Konfiguration bearbeiten" @@ -10163,40 +10231,40 @@ msgid "# add halui MDI commands here (max 64) " msgstr "# HalUI-MDI-Befehle hier einfügen (max. 64)" #: src/emc/usr_intf/stepconf/build_HAL.py:287 -#: src/emc/usr_intf/pncconf/build_HAL.py:726 +#: src/emc/usr_intf/pncconf/build_HAL.py:733 msgid "# **** Setup for external estop ladder program -START ****" msgstr "" #: src/emc/usr_intf/stepconf/build_HAL.py:294 -#: src/emc/usr_intf/pncconf/build_HAL.py:733 +#: src/emc/usr_intf/pncconf/build_HAL.py:740 msgid "# **** Setup for external estop ladder program -END ****" msgstr "" #: src/emc/usr_intf/stepconf/build_HAL.py:314 -#: src/emc/usr_intf/pncconf/build_HAL.py:760 +#: src/emc/usr_intf/pncconf/build_HAL.py:767 msgid "" "# Load Classicladder with modbus master included (GUI must run for Modbus)" msgstr "" #: src/emc/usr_intf/stepconf/build_HAL.py:317 -#: src/emc/usr_intf/pncconf/build_HAL.py:765 +#: src/emc/usr_intf/pncconf/build_HAL.py:772 msgid "# Load Classicladder without GUI (can reload LADDER GUI in AXIS GUI" msgstr "" #: src/emc/usr_intf/stepconf/build_HAL.py:327 -#: src/emc/usr_intf/pncconf/build_HAL.py:847 +#: src/emc/usr_intf/pncconf/build_HAL.py:854 msgid "Include your PyVCP panel here.\n" msgstr "Benutzerdefiniertes PyVCP-Panel hier einbinden.\n" #: src/emc/usr_intf/stepconf/build_HAL.py:340 #: src/emc/usr_intf/stepconf/build_HAL.py:354 #: src/emc/usr_intf/stepconf/build_HAL.py:395 -#: src/emc/usr_intf/pncconf/build_HAL.py:860 +#: src/emc/usr_intf/pncconf/build_HAL.py:867 msgid "# These files are loaded post GUI, in the order they appear" msgstr "" #: src/emc/usr_intf/stepconf/build_HAL.py:358 -#: src/emc/usr_intf/pncconf/build_HAL.py:881 +#: src/emc/usr_intf/pncconf/build_HAL.py:888 msgid "# **** Setup of spindle speed display using pyvcp -START ****" msgstr "" @@ -10308,9 +10376,9 @@ msgstr "LinuxCNC Maschinenkonfiguration" #: src/emc/usr_intf/pncconf/external.glade:2420 #: src/emc/usr_intf/pncconf/external.glade:2434 #: src/emc/usr_intf/pncconf/external.glade:2448 -#: src/emc/usr_intf/pncconf/x_motor.glade:384 -#: src/emc/usr_intf/pncconf/y_motor.glade:384 -#: src/emc/usr_intf/pncconf/z_motor.glade:384 +#: src/emc/usr_intf/pncconf/x_motor.glade:458 +#: src/emc/usr_intf/pncconf/y_motor.glade:458 +#: src/emc/usr_intf/pncconf/z_motor.glade:458 #: src/emc/usr_intf/pncconf/a_motor.glade:384 #: src/emc/usr_intf/pncconf/dialogs.glade:4814 #: src/emc/usr_intf/pncconf/dialogs.glade:4827 @@ -10812,7 +10880,7 @@ msgstr "" #: src/emc/usr_intf/stepconf/options.glade:67 msgid "Use Gmoccapy Screen" -msgstr "" +msgstr "Benutze Gmoccapy Benutzeroberfläche" #: src/emc/usr_intf/stepconf/options.glade:91 #, fuzzy @@ -10969,10 +11037,10 @@ msgstr "" #: src/emc/usr_intf/stepconf/axisu.glade:12 #: src/emc/usr_intf/stepconf/axisv.glade:12 #: src/emc/usr_intf/stepconf/axisa.glade:12 -#: src/emc/usr_intf/pncconf/x_axis.glade:44 -#: src/emc/usr_intf/pncconf/y_axis.glade:44 -#: src/emc/usr_intf/pncconf/z_axis.glade:44 -#: src/emc/usr_intf/pncconf/a_axis.glade:44 +#: src/emc/usr_intf/pncconf/x_axis.glade:701 +#: src/emc/usr_intf/pncconf/y_axis.glade:701 +#: src/emc/usr_intf/pncconf/z_axis.glade:701 +#: src/emc/usr_intf/pncconf/a_axis.glade:701 msgid "Same" msgstr "" @@ -10982,10 +11050,10 @@ msgstr "" #: src/emc/usr_intf/stepconf/axisu.glade:15 #: src/emc/usr_intf/stepconf/axisv.glade:15 #: src/emc/usr_intf/stepconf/axisa.glade:15 -#: src/emc/usr_intf/pncconf/x_axis.glade:47 -#: src/emc/usr_intf/pncconf/y_axis.glade:47 -#: src/emc/usr_intf/pncconf/z_axis.glade:47 -#: src/emc/usr_intf/pncconf/a_axis.glade:47 +#: src/emc/usr_intf/pncconf/x_axis.glade:704 +#: src/emc/usr_intf/pncconf/y_axis.glade:704 +#: src/emc/usr_intf/pncconf/z_axis.glade:704 +#: src/emc/usr_intf/pncconf/a_axis.glade:704 #, fuzzy msgid "Opposite" msgstr "" @@ -11077,11 +11145,11 @@ msgstr "_Spindelsteigung:" #: src/emc/usr_intf/stepconf/axisu.glade:499 #: src/emc/usr_intf/stepconf/axisv.glade:496 #: src/emc/usr_intf/stepconf/axisa.glade:494 -#: src/emc/usr_intf/pncconf/x_motor.glade:1747 -#: src/emc/usr_intf/pncconf/y_motor.glade:1747 -#: src/emc/usr_intf/pncconf/z_motor.glade:1747 +#: src/emc/usr_intf/pncconf/x_motor.glade:2076 +#: src/emc/usr_intf/pncconf/y_motor.glade:2076 +#: src/emc/usr_intf/pncconf/z_motor.glade:2076 #: src/emc/usr_intf/pncconf/a_motor.glade:1747 -#: src/emc/usr_intf/pncconf/s_motor.glade:2207 +#: src/emc/usr_intf/pncconf/s_motor.glade:1953 msgid "Maximum _Velocity:" msgstr "Maximale _Geschwindigkeit:" @@ -11091,11 +11159,11 @@ msgstr "Maximale _Geschwindigkeit:" #: src/emc/usr_intf/stepconf/axisu.glade:513 #: src/emc/usr_intf/stepconf/axisv.glade:510 #: src/emc/usr_intf/stepconf/axisa.glade:507 -#: src/emc/usr_intf/pncconf/x_motor.glade:1761 -#: src/emc/usr_intf/pncconf/y_motor.glade:1761 -#: src/emc/usr_intf/pncconf/z_motor.glade:1761 +#: src/emc/usr_intf/pncconf/x_motor.glade:2091 +#: src/emc/usr_intf/pncconf/y_motor.glade:2091 +#: src/emc/usr_intf/pncconf/z_motor.glade:2091 #: src/emc/usr_intf/pncconf/a_motor.glade:1761 -#: src/emc/usr_intf/pncconf/s_motor.glade:2222 +#: src/emc/usr_intf/pncconf/s_motor.glade:1968 msgid "Maximum _Acceleration:" msgstr "Maximale Bes_chleunigung:" @@ -11234,47 +11302,47 @@ msgstr "" "Informationen können bei der Behebung hilfreich sein:\n" "\n" -#: src/emc/usr_intf/pncconf/pncconf.py:260 +#: src/emc/usr_intf/pncconf/pncconf.py:261 msgid "**** PNCCONF ERROR: custom firmware loading error" msgstr "" -#: src/emc/usr_intf/pncconf/pncconf.py:263 +#: src/emc/usr_intf/pncconf/pncconf.py:264 msgid "**** PNCCONF INFO: Found extra firmware in file" msgstr "" -#: src/emc/usr_intf/pncconf/pncconf.py:327 +#: src/emc/usr_intf/pncconf/pncconf.py:328 msgid "Discovery metadata update" msgstr "" -#: src/emc/usr_intf/pncconf/pncconf.py:363 +#: src/emc/usr_intf/pncconf/pncconf.py:372 #, python-format msgid "%s metadata update" msgstr "" -#: src/emc/usr_intf/pncconf/pncconf.py:383 +#: src/emc/usr_intf/pncconf/pncconf.py:392 msgid "Pncconf setup" msgstr "" -#: src/emc/usr_intf/pncconf/pncconf.py:395 +#: src/emc/usr_intf/pncconf/pncconf.py:404 msgid "Pncconf is setting up" msgstr "" -#: src/emc/usr_intf/pncconf/pncconf.py:409 +#: src/emc/usr_intf/pncconf/pncconf.py:418 msgid "" "\n" "**** Debug Pause! ****" msgstr "" -#: src/emc/usr_intf/pncconf/pncconf.py:482 +#: src/emc/usr_intf/pncconf/pncconf.py:491 #, fuzzy msgid "Specific Help page is unavailable\n" msgstr "Hilfeseite ist nicht verfügbar\n" -#: src/emc/usr_intf/pncconf/pncconf.py:484 +#: src/emc/usr_intf/pncconf/pncconf.py:493 msgid "Help Pages" msgstr "Hilfeseiten" -#: src/emc/usr_intf/pncconf/pncconf.py:536 +#: src/emc/usr_intf/pncconf/pncconf.py:545 #, python-format msgid "" "You have no hostmot2 firmware downloaded in folder:\n" @@ -11282,22 +11350,22 @@ msgid "" "PNCconf will use internal firmware data" msgstr "" -#: src/emc/usr_intf/pncconf/pncconf.py:853 +#: src/emc/usr_intf/pncconf/pncconf.py:862 msgid "LinuxCNC 'PNCconf' configuration files" msgstr "LinuxCNC »PNCconf«-Konfigurationsdateien" -#: src/emc/usr_intf/pncconf/pncconf.py:883 +#: src/emc/usr_intf/pncconf/pncconf.py:892 msgid "" "It seems data in this file is from too old of a version of PNCConf to " "continue.\n" "." msgstr "" -#: src/emc/usr_intf/pncconf/pncconf.py:1249 +#: src/emc/usr_intf/pncconf/pncconf.py:1256 msgid "No board was found\n" msgstr "" -#: src/emc/usr_intf/pncconf/pncconf.py:1287 +#: src/emc/usr_intf/pncconf/pncconf.py:1294 #, python-format msgid "" "Discovery is got an error\n" @@ -11307,33 +11375,33 @@ msgid "" " %s" msgstr "" -#: src/emc/usr_intf/pncconf/pncconf.py:1301 +#: src/emc/usr_intf/pncconf/pncconf.py:1308 #, fuzzy msgid "Discovery is unavailable\n" msgstr "Gerätenamen sind nicht verfügbar\n" -#: src/emc/usr_intf/pncconf/pncconf.py:1558 +#: src/emc/usr_intf/pncconf/pncconf.py:1565 msgid "USB device Info Search" msgstr "" -#: src/emc/usr_intf/pncconf/pncconf.py:1572 +#: src/emc/usr_intf/pncconf/pncconf.py:1579 msgid "USB device page is unavailable\n" msgstr "USB-Gerät-Seite ist nicht verfügbar\n" -#: src/emc/usr_intf/pncconf/pncconf.py:1637 +#: src/emc/usr_intf/pncconf/pncconf.py:1644 #: src/emc/usr_intf/pncconf/tests.py:86 msgid "Pin names are unavailable\n" msgstr "Pin-Namen sind nicht verfügbar\n" -#: src/emc/usr_intf/pncconf/pncconf.py:1660 +#: src/emc/usr_intf/pncconf/pncconf.py:1667 msgid "Device names are unavailable\n" msgstr "Gerätenamen sind nicht verfügbar\n" -#: src/emc/usr_intf/pncconf/pncconf.py:1663 +#: src/emc/usr_intf/pncconf/pncconf.py:1670 msgid "No Pncconf made device rules were found\n" msgstr "" -#: src/emc/usr_intf/pncconf/pncconf.py:1708 +#: src/emc/usr_intf/pncconf/pncconf.py:1715 #, fuzzy msgid "" "OK to replace existing glade panel ?\n" @@ -11346,7 +11414,7 @@ msgstr "" "Eine bestehende »Custom.clp«-Datei wird in custom_backup.clp« umbenannt.\n" "Eine bestehende »custom_backup.clp«-Dateien geht somit verloren." -#: src/emc/usr_intf/pncconf/pncconf.py:1715 +#: src/emc/usr_intf/pncconf/pncconf.py:1722 #, fuzzy msgid "" "OK to replace existing custom pyvcp panel?\n" @@ -11357,169 +11425,169 @@ msgstr "" "Eine bestehende »Custom.clp«-Datei wird in custom_backup.clp« umbenannt.\n" "Eine bestehende »custom_backup.clp«-Dateien geht somit verloren." -#: src/emc/usr_intf/pncconf/pncconf.py:3488 +#: src/emc/usr_intf/pncconf/pncconf.py:3495 #: src/emc/usr_intf/pncconf/private_data.py:534 msgid "Unused Channel" msgstr "Unbenutzter Kanal" -#: src/emc/usr_intf/pncconf/pncconf.py:3759 +#: src/emc/usr_intf/pncconf/pncconf.py:3766 msgid "You can not have both steppers and pwm signals for spindle control\n" msgstr "" -#: src/emc/usr_intf/pncconf/pncconf.py:3763 +#: src/emc/usr_intf/pncconf/pncconf.py:3770 #, python-format msgid "You forgot to designate a stepper or pwm signal for axis %s\n" msgstr "" -#: src/emc/usr_intf/pncconf/pncconf.py:3766 +#: src/emc/usr_intf/pncconf/pncconf.py:3773 #, python-format msgid "You forgot to designate an encoder /resolver signal for axis %s servo\n" msgstr "" -#: src/emc/usr_intf/pncconf/pncconf.py:3769 +#: src/emc/usr_intf/pncconf/pncconf.py:3776 #, python-format msgid "You forgot to designate a pwm signal or stepper signal for axis %s\n" msgstr "" -#: src/emc/usr_intf/pncconf/pncconf.py:3772 +#: src/emc/usr_intf/pncconf/pncconf.py:3779 #, python-format msgid "You can not have both steppers and pwm signals for axis %s\n" msgstr "" -#: src/emc/usr_intf/pncconf/pncconf.py:3775 +#: src/emc/usr_intf/pncconf/pncconf.py:3782 #, python-format msgid "" "If using a tandem axis stepper, you must select a master stepgen for axis " "%s\n" msgstr "" -#: src/emc/usr_intf/pncconf/pncconf.py:3783 +#: src/emc/usr_intf/pncconf/pncconf.py:3790 msgid "Touchy require an external cycle start signal\n" msgstr "" -#: src/emc/usr_intf/pncconf/pncconf.py:3786 +#: src/emc/usr_intf/pncconf/pncconf.py:3793 msgid "Touchy require an external abort signal\n" msgstr "" -#: src/emc/usr_intf/pncconf/pncconf.py:3789 +#: src/emc/usr_intf/pncconf/pncconf.py:3796 msgid "Touchy require an external single-step signal\n" msgstr "" -#: src/emc/usr_intf/pncconf/pncconf.py:3792 +#: src/emc/usr_intf/pncconf/pncconf.py:3799 msgid "" "Touchy require an external multi handwheel MPG encoder signal on the mesa " "page\n" msgstr "" -#: src/emc/usr_intf/pncconf/pncconf.py:3795 +#: src/emc/usr_intf/pncconf/pncconf.py:3802 msgid "" "Touchy require 'external mpg jogging' to be selected on the external control " "page\n" msgstr "" -#: src/emc/usr_intf/pncconf/pncconf.py:3798 +#: src/emc/usr_intf/pncconf/pncconf.py:3805 msgid "" "Touchy require the external mpg to be in 'shared mpg' mode on the external " "controls page\n" msgstr "" -#: src/emc/usr_intf/pncconf/pncconf.py:3801 +#: src/emc/usr_intf/pncconf/pncconf.py:3808 msgid "" "Touchy require selectable increments to be unchecked on the external " "controls page\n" msgstr "" -#: src/emc/usr_intf/pncconf/pncconf.py:3814 +#: src/emc/usr_intf/pncconf/pncconf.py:3821 msgid "" "The 7i29 daughter board requires PWM type generators and a PWM base " "frequency of 20 khz\n" msgstr "" -#: src/emc/usr_intf/pncconf/pncconf.py:3817 +#: src/emc/usr_intf/pncconf/pncconf.py:3824 msgid "" "The 7i30 daughter board requires PWM type generators and a PWM base " "frequency of 20 khz\n" msgstr "" -#: src/emc/usr_intf/pncconf/pncconf.py:3820 +#: src/emc/usr_intf/pncconf/pncconf.py:3827 msgid "" "The 7i33 daughter board requires PDM type generators and a PDM base " "frequency of 6 Mhz\n" msgstr "" -#: src/emc/usr_intf/pncconf/pncconf.py:3823 +#: src/emc/usr_intf/pncconf/pncconf.py:3830 msgid "" "The 7i40 daughter board requires PWM type generators and a PWM base " "frequency of 50 khz\n" msgstr "" -#: src/emc/usr_intf/pncconf/pncconf.py:3826 +#: src/emc/usr_intf/pncconf/pncconf.py:3833 msgid "" "The 7i48 daughter board requires UDM type generators and a PWM base " "frequency of 24 khz\n" msgstr "" -#: src/emc/usr_intf/pncconf/pncconf.py:3974 +#: src/emc/usr_intf/pncconf/pncconf.py:3981 msgid "Gearbox Reduction Ratio" msgstr "" -#: src/emc/usr_intf/pncconf/pncconf.py:3977 +#: src/emc/usr_intf/pncconf/pncconf.py:3984 msgid "Reduction Ratio" msgstr "" -#: src/emc/usr_intf/pncconf/pncconf.py:3980 +#: src/emc/usr_intf/pncconf/pncconf.py:3987 msgid "Leadscrew Pitch" msgstr "Spindelsteigung" -#: src/emc/usr_intf/pncconf/pncconf.py:3983 +#: src/emc/usr_intf/pncconf/pncconf.py:3990 #: src/emc/usr_intf/pncconf/dialogs.glade:2004 #: src/emc/usr_intf/pncconf/dialogs.glade:2385 msgid "Leadscrew TPI" msgstr "Spindelsteigung TPI" -#: src/emc/usr_intf/pncconf/pncconf.py:3987 -#: src/emc/usr_intf/pncconf/pncconf.py:3988 +#: src/emc/usr_intf/pncconf/pncconf.py:3994 +#: src/emc/usr_intf/pncconf/pncconf.py:3995 msgid "(" msgstr "(" -#: src/emc/usr_intf/pncconf/pncconf.py:3989 -#: src/emc/usr_intf/pncconf/pncconf.py:3999 -#: src/emc/usr_intf/pncconf/pncconf.py:4000 -#: src/emc/usr_intf/pncconf/pncconf.py:4001 +#: src/emc/usr_intf/pncconf/pncconf.py:3996 +#: src/emc/usr_intf/pncconf/pncconf.py:4006 +#: src/emc/usr_intf/pncconf/pncconf.py:4007 +#: src/emc/usr_intf/pncconf/pncconf.py:4008 msgid " / min" msgstr " / min" -#: src/emc/usr_intf/pncconf/pncconf.py:3990 +#: src/emc/usr_intf/pncconf/pncconf.py:3997 msgid " / sec²" msgstr " / sec²" -#: src/emc/usr_intf/pncconf/pncconf.py:3993 +#: src/emc/usr_intf/pncconf/pncconf.py:4000 msgid " / Step" msgstr " / Schritt" -#: src/emc/usr_intf/pncconf/pncconf.py:3994 +#: src/emc/usr_intf/pncconf/pncconf.py:4001 msgid "Steps / " msgstr "Schritte / " -#: src/emc/usr_intf/pncconf/pncconf.py:3996 +#: src/emc/usr_intf/pncconf/pncconf.py:4003 msgid " / encoder pulse" msgstr "" -#: src/emc/usr_intf/pncconf/pncconf.py:3997 +#: src/emc/usr_intf/pncconf/pncconf.py:4004 msgid "Encoder pulses / " msgstr "" -#: src/emc/usr_intf/pncconf/pncconf.py:4005 +#: src/emc/usr_intf/pncconf/pncconf.py:4012 #, fuzzy msgid "Resolver Scale:" msgstr "Zeit zwischen zwei _Schritten:" -#: src/emc/usr_intf/pncconf/pncconf.py:4338 +#: src/emc/usr_intf/pncconf/pncconf.py:4350 #, fuzzy msgid "Spindle Scale Calculation" msgstr "Konfiguration der Spindel" -#: src/emc/usr_intf/pncconf/pncconf.py:4450 +#: src/emc/usr_intf/pncconf/pncconf.py:4462 msgid "Axis Scale Calculation" msgstr "" @@ -11603,8 +11671,8 @@ msgstr "" #: src/emc/usr_intf/pncconf/build_INI.py:17 #: src/emc/usr_intf/pncconf/build_HAL.py:53 -#: src/emc/usr_intf/pncconf/build_HAL.py:979 -#: src/emc/usr_intf/pncconf/build_HAL.py:999 +#: src/emc/usr_intf/pncconf/build_HAL.py:986 +#: src/emc/usr_intf/pncconf/build_HAL.py:1006 #, python-format msgid "# Generated by PNCconf at %s" msgstr "# Erstellt von PNCconf am %s" @@ -11621,172 +11689,172 @@ msgstr "" msgid "# overwritten when you run PNCconf again" msgstr "# wird überschrieben, wenn Sie PNCconf erneut ausführen" -#: src/emc/usr_intf/pncconf/build_HAL.py:407 +#: src/emc/usr_intf/pncconf/build_HAL.py:415 msgid "# connect miscellaneous signals" msgstr "" -#: src/emc/usr_intf/pncconf/build_HAL.py:410 +#: src/emc/usr_intf/pncconf/build_HAL.py:418 msgid "# ---HALUI signals---" msgstr "" -#: src/emc/usr_intf/pncconf/build_HAL.py:438 +#: src/emc/usr_intf/pncconf/build_HAL.py:445 msgid "# ---charge pump signals---" msgstr "" -#: src/emc/usr_intf/pncconf/build_HAL.py:442 +#: src/emc/usr_intf/pncconf/build_HAL.py:449 msgid "# ---coolant signals---" msgstr "" -#: src/emc/usr_intf/pncconf/build_HAL.py:447 +#: src/emc/usr_intf/pncconf/build_HAL.py:454 msgid "# ---probe signal---" msgstr "" -#: src/emc/usr_intf/pncconf/build_HAL.py:452 +#: src/emc/usr_intf/pncconf/build_HAL.py:459 msgid "# ---jog button signals---" msgstr "" -#: src/emc/usr_intf/pncconf/build_HAL.py:457 +#: src/emc/usr_intf/pncconf/build_HAL.py:464 msgid "# ---USB device jog button signals---" msgstr "" -#: src/emc/usr_intf/pncconf/build_HAL.py:498 -#: src/emc/usr_intf/pncconf/build_HAL.py:524 +#: src/emc/usr_intf/pncconf/build_HAL.py:505 +#: src/emc/usr_intf/pncconf/build_HAL.py:531 msgid "# ---mpg signals---" msgstr "" -#: src/emc/usr_intf/pncconf/build_HAL.py:706 +#: src/emc/usr_intf/pncconf/build_HAL.py:713 msgid "# ---motion control signals---" msgstr "" -#: src/emc/usr_intf/pncconf/build_HAL.py:711 +#: src/emc/usr_intf/pncconf/build_HAL.py:718 msgid "# ---digital in / out signals---" msgstr "" -#: src/emc/usr_intf/pncconf/build_HAL.py:721 +#: src/emc/usr_intf/pncconf/build_HAL.py:728 msgid "# ---estop signals---" msgstr "" -#: src/emc/usr_intf/pncconf/build_HAL.py:740 +#: src/emc/usr_intf/pncconf/build_HAL.py:747 msgid "# ---manual tool change signals---" msgstr "" -#: src/emc/usr_intf/pncconf/build_HAL.py:749 +#: src/emc/usr_intf/pncconf/build_HAL.py:756 msgid "# ---toolchange signals for custom tool changer---" msgstr "" -#: src/emc/usr_intf/pncconf/build_HAL.py:771 +#: src/emc/usr_intf/pncconf/build_HAL.py:778 msgid "# --- Classicladder signals for Z axis Auto touch off program---" msgstr "" -#: src/emc/usr_intf/pncconf/build_HAL.py:790 +#: src/emc/usr_intf/pncconf/build_HAL.py:797 msgid "# These files are loaded post gladeVCP, in the order they appear" msgstr "" -#: src/emc/usr_intf/pncconf/build_HAL.py:804 -#: src/emc/usr_intf/pncconf/build_HAL.py:877 +#: src/emc/usr_intf/pncconf/build_HAL.py:811 +#: src/emc/usr_intf/pncconf/build_HAL.py:884 msgid "# _DO NOT_ include your HAL commands here." msgstr "" -#: src/emc/usr_intf/pncconf/build_HAL.py:805 +#: src/emc/usr_intf/pncconf/build_HAL.py:812 msgid "# Put custom HAL commands in custom_gvcp.hal" msgstr "" -#: src/emc/usr_intf/pncconf/build_HAL.py:808 +#: src/emc/usr_intf/pncconf/build_HAL.py:815 msgid "# **** Setup of spindle speed display using gladevcp ****" msgstr "" -#: src/emc/usr_intf/pncconf/build_HAL.py:817 +#: src/emc/usr_intf/pncconf/build_HAL.py:824 msgid "# **** Setup GLADE MDI buttons ****" msgstr "" -#: src/emc/usr_intf/pncconf/build_HAL.py:830 +#: src/emc/usr_intf/pncconf/build_HAL.py:837 msgid "" "# **** Z axis touch-off button - requires the touch-off classicladder " "program ****" msgstr "" -#: src/emc/usr_intf/pncconf/build_HAL.py:878 +#: src/emc/usr_intf/pncconf/build_HAL.py:885 msgid "# Put custom HAL commands in custom_postgui.hal" msgstr "" -#: src/emc/usr_intf/pncconf/build_HAL.py:879 +#: src/emc/usr_intf/pncconf/build_HAL.py:886 #, fuzzy msgid "# The commands in this file are run after the GUI loads" msgstr "# Die Befehle in dieser Datei werden nach dem Laden der GUI ausgeführt" -#: src/emc/usr_intf/pncconf/build_HAL.py:889 +#: src/emc/usr_intf/pncconf/build_HAL.py:896 msgid "# **** Setup of spindle speed display using pyvcp -END ****" msgstr "" -#: src/emc/usr_intf/pncconf/build_HAL.py:901 +#: src/emc/usr_intf/pncconf/build_HAL.py:908 #, fuzzy msgid "# This file will not be overwritten when you run PNCconf again" msgstr "" "# Diese Datei wird nicht überschrieben, wenn Sie PNCconf erneut ausführen" -#: src/emc/usr_intf/pncconf/build_HAL.py:907 +#: src/emc/usr_intf/pncconf/build_HAL.py:914 msgid "# These commands are required for Touchy GUI" msgstr "" -#: src/emc/usr_intf/pncconf/build_HAL.py:1007 +#: src/emc/usr_intf/pncconf/build_HAL.py:1014 #, python-format msgid "Generated by PNCconf at %s" msgstr "Generiert von PNCconf am %s" -#: src/emc/usr_intf/pncconf/build_HAL.py:1019 +#: src/emc/usr_intf/pncconf/build_HAL.py:1026 msgid "configures LinuxCNC as:\n" msgstr "" -#: src/emc/usr_intf/pncconf/build_HAL.py:1020 +#: src/emc/usr_intf/pncconf/build_HAL.py:1027 msgid "type CNC\n" msgstr "" -#: src/emc/usr_intf/pncconf/build_HAL.py:1021 +#: src/emc/usr_intf/pncconf/build_HAL.py:1028 msgid "will be used as the frontend display" msgstr "" -#: src/emc/usr_intf/pncconf/build_HAL.py:1030 +#: src/emc/usr_intf/pncconf/build_HAL.py:1037 msgid " connector" msgstr " Verbinder" -#: src/emc/usr_intf/pncconf/build_HAL.py:1042 +#: src/emc/usr_intf/pncconf/build_HAL.py:1049 msgid "invrt" msgstr "" -#: src/emc/usr_intf/pncconf/build_HAL.py:1051 +#: src/emc/usr_intf/pncconf/build_HAL.py:1058 #, python-format msgid "%(name)s Parport" msgstr "%(name)s Parallelport" -#: src/emc/usr_intf/pncconf/build_HAL.py:1056 -#: src/emc/usr_intf/pncconf/build_HAL.py:1064 +#: src/emc/usr_intf/pncconf/build_HAL.py:1063 +#: src/emc/usr_intf/pncconf/build_HAL.py:1071 msgid "-> inverted" msgstr "-> invertiert" -#: src/emc/usr_intf/pncconf/build_HAL.py:1058 +#: src/emc/usr_intf/pncconf/build_HAL.py:1065 #, python-format msgid "pin# %(pinnum)d is connected to input signal:'%(data)s' %(mesag)s" msgstr "" -#: src/emc/usr_intf/pncconf/build_HAL.py:1066 +#: src/emc/usr_intf/pncconf/build_HAL.py:1073 #, python-format msgid "pin# %(pinnum)d is connected to output signal:'%(data)s' %(mesag)s" msgstr "" -#: src/emc/usr_intf/pncconf/build_HAL.py:1473 +#: src/emc/usr_intf/pncconf/build_HAL.py:1482 msgid "# Use ACTUAL spindle velocity from spindle encoder" msgstr "" -#: src/emc/usr_intf/pncconf/build_HAL.py:1474 +#: src/emc/usr_intf/pncconf/build_HAL.py:1483 msgid "# spindle-velocity bounces around so we filter it with lowpass" msgstr "" -#: src/emc/usr_intf/pncconf/build_HAL.py:1475 +#: src/emc/usr_intf/pncconf/build_HAL.py:1484 msgid "" "# spindle-velocity is signed so we use absolute component to remove sign" msgstr "" -#: src/emc/usr_intf/pncconf/build_HAL.py:1476 +#: src/emc/usr_intf/pncconf/build_HAL.py:1485 msgid "# ACTUAL velocity is in RPS not RPM so we scale it." msgstr "" @@ -12887,7 +12955,7 @@ msgid "Digital" msgstr "Digital" #: src/emc/usr_intf/pncconf/private_data.py:451 -#: src/emc/usr_intf/pncconf/private_data.py:806 +#: src/emc/usr_intf/pncconf/private_data.py:859 msgid "Axis Selection" msgstr "Achsenauswahl" @@ -13299,126 +13367,126 @@ msgstr "7i64 E/A-Karte" msgid "Unused Analog In" msgstr "Unbenutzter analoger Ausgang" -#: src/emc/usr_intf/pncconf/private_data.py:814 +#: src/emc/usr_intf/pncconf/private_data.py:867 msgid "" "7i64-Input\n" "P3 and P4" msgstr "" -#: src/emc/usr_intf/pncconf/private_data.py:814 +#: src/emc/usr_intf/pncconf/private_data.py:867 msgid "" "7i64-Output\n" "P2 and P5" msgstr "" -#: src/emc/usr_intf/pncconf/private_data.py:814 +#: src/emc/usr_intf/pncconf/private_data.py:867 msgid "7i64-Analog In" msgstr "" -#: src/emc/usr_intf/pncconf/private_data.py:827 +#: src/emc/usr_intf/pncconf/private_data.py:880 msgid "" "7i69\n" "P2" msgstr "" -#: src/emc/usr_intf/pncconf/private_data.py:827 +#: src/emc/usr_intf/pncconf/private_data.py:880 msgid "" "7i69\n" "P3" msgstr "" -#: src/emc/usr_intf/pncconf/private_data.py:839 +#: src/emc/usr_intf/pncconf/private_data.py:892 msgid "" "7i70-Input\n" "TB3" msgstr "" -#: src/emc/usr_intf/pncconf/private_data.py:839 +#: src/emc/usr_intf/pncconf/private_data.py:892 msgid "" "7i70-Input\n" "TB2" msgstr "" -#: src/emc/usr_intf/pncconf/private_data.py:851 +#: src/emc/usr_intf/pncconf/private_data.py:904 msgid "" "7i71-Output\n" "TB3" msgstr "" -#: src/emc/usr_intf/pncconf/private_data.py:851 +#: src/emc/usr_intf/pncconf/private_data.py:904 msgid "" "7i71-Output\n" "TB2" msgstr "" -#: src/emc/usr_intf/pncconf/private_data.py:863 -#: src/emc/usr_intf/pncconf/private_data.py:875 +#: src/emc/usr_intf/pncconf/private_data.py:916 +#: src/emc/usr_intf/pncconf/private_data.py:928 msgid "" "7i76-I/O\n" "TB6" msgstr "" -#: src/emc/usr_intf/pncconf/private_data.py:863 -#: src/emc/usr_intf/pncconf/private_data.py:875 +#: src/emc/usr_intf/pncconf/private_data.py:916 +#: src/emc/usr_intf/pncconf/private_data.py:928 msgid "" "7i76-I/O\n" "TB5" msgstr "" -#: src/emc/usr_intf/pncconf/private_data.py:863 -#: src/emc/usr_intf/pncconf/private_data.py:875 +#: src/emc/usr_intf/pncconf/private_data.py:916 +#: src/emc/usr_intf/pncconf/private_data.py:928 #, fuzzy msgid "" "7i76-Analog Output\n" "TB4" msgstr "Unbenutzter analoger Ausgang" -#: src/emc/usr_intf/pncconf/private_data.py:887 -#: src/emc/usr_intf/pncconf/private_data.py:899 +#: src/emc/usr_intf/pncconf/private_data.py:940 +#: src/emc/usr_intf/pncconf/private_data.py:952 msgid "" "7i77-I/O\n" "TB8" msgstr "" -#: src/emc/usr_intf/pncconf/private_data.py:887 -#: src/emc/usr_intf/pncconf/private_data.py:899 +#: src/emc/usr_intf/pncconf/private_data.py:940 +#: src/emc/usr_intf/pncconf/private_data.py:952 msgid "" "7i77-I/O\n" "TB7" msgstr "" -#: src/emc/usr_intf/pncconf/private_data.py:887 -#: src/emc/usr_intf/pncconf/private_data.py:899 +#: src/emc/usr_intf/pncconf/private_data.py:940 +#: src/emc/usr_intf/pncconf/private_data.py:952 #, fuzzy msgid "" "7i77-Analog Output\n" "TB5" msgstr "Unbenutzter analoger Ausgang" -#: src/emc/usr_intf/pncconf/private_data.py:911 +#: src/emc/usr_intf/pncconf/private_data.py:964 msgid "7i73-I/O\n" msgstr "" -#: src/emc/usr_intf/pncconf/private_data.py:924 +#: src/emc/usr_intf/pncconf/private_data.py:977 msgid "" "7i84-I/O\n" "TB3" msgstr "" -#: src/emc/usr_intf/pncconf/private_data.py:924 -#: src/emc/usr_intf/pncconf/private_data.py:939 +#: src/emc/usr_intf/pncconf/private_data.py:977 +#: src/emc/usr_intf/pncconf/private_data.py:992 msgid "" "7i84-I/O\n" "TB2" msgstr "" -#: src/emc/usr_intf/pncconf/private_data.py:939 +#: src/emc/usr_intf/pncconf/private_data.py:992 msgid "" "7i84-I/O-MPG\n" "TB3" msgstr "" -#: src/emc/usr_intf/pncconf/private_data.py:1004 +#: src/emc/usr_intf/pncconf/private_data.py:1056 msgid "" "OK to replace existing custom pyvcp panel and custom_postgui.hal file ?\n" "Existing custompanel.xml and custom_postgui.hal will be renamed " @@ -13433,17 +13501,17 @@ msgstr "" "Bereits bestehende Dateien »custompanel_backup.xml« and »custom_postgui.hal« " "werden überschrieben." -#: src/emc/usr_intf/pncconf/private_data.py:1005 +#: src/emc/usr_intf/pncconf/private_data.py:1057 #, fuzzy msgid "Quit PNCconf and discard changes?" msgstr "PNCconfig beenden und Änderungen verwerfen?" -#: src/emc/usr_intf/pncconf/private_data.py:1006 +#: src/emc/usr_intf/pncconf/private_data.py:1058 #, fuzzy msgid "Do you want to quit?" msgstr "Folgende Optionen stehen zur Verfügung:" -#: src/emc/usr_intf/pncconf/private_data.py:1012 +#: src/emc/usr_intf/pncconf/private_data.py:1064 msgid "" "Ok to replace AXIS's .axisrc file?\n" " If you haven't added custom commands to this hidden file, outside of " @@ -13458,80 +13526,89 @@ msgid "" "machine-named folder.." msgstr "" -#: src/emc/usr_intf/pncconf/tests.py:487 +#: src/emc/usr_intf/pncconf/tests.py:468 +msgid "" +"± = move on both sides of start position\n" +"\n" +"+ = move on positive side of start position\n" +"\n" +"- = move on negative side of start position" +msgstr "" + +#: src/emc/usr_intf/pncconf/tests.py:491 msgid "Servo tuning is not tested in PNCconf yet\n" msgstr "" -#: src/emc/usr_intf/pncconf/tests.py:496 +#: src/emc/usr_intf/pncconf/tests.py:500 msgid "degrees" msgstr "Grad" -#: src/emc/usr_intf/pncconf/tests.py:497 +#: src/emc/usr_intf/pncconf/tests.py:501 msgid "degrees / minute" msgstr "Grad / Minute" -#: src/emc/usr_intf/pncconf/tests.py:498 +#: src/emc/usr_intf/pncconf/tests.py:502 msgid "degrees / second²" msgstr "Grad / Sekunde²" -#: src/emc/usr_intf/pncconf/tests.py:501 +#: src/emc/usr_intf/pncconf/tests.py:505 msgid "revolutions" msgstr "Umdrehungen" -#: src/emc/usr_intf/pncconf/tests.py:502 +#: src/emc/usr_intf/pncconf/tests.py:506 msgid "rpm" msgstr "UPM" -#: src/emc/usr_intf/pncconf/tests.py:503 +#: src/emc/usr_intf/pncconf/tests.py:507 msgid "revs / second²" msgstr "Umdrehungen / Sekunde²" -#: src/emc/usr_intf/pncconf/tests.py:507 -#: src/emc/usr_intf/pncconf/x_axis.glade:287 -#: src/emc/usr_intf/pncconf/x_axis.glade:405 -#: src/emc/usr_intf/pncconf/x_axis.glade:603 -#: src/emc/usr_intf/pncconf/y_axis.glade:287 -#: src/emc/usr_intf/pncconf/y_axis.glade:405 -#: src/emc/usr_intf/pncconf/y_axis.glade:603 -#: src/emc/usr_intf/pncconf/z_axis.glade:287 -#: src/emc/usr_intf/pncconf/z_axis.glade:405 -#: src/emc/usr_intf/pncconf/z_axis.glade:603 -#: src/emc/usr_intf/pncconf/a_axis.glade:287 -#: src/emc/usr_intf/pncconf/a_axis.glade:405 -#: src/emc/usr_intf/pncconf/a_axis.glade:603 +#: src/emc/usr_intf/pncconf/tests.py:511 +#: src/emc/usr_intf/pncconf/x_axis.glade:512 +#: src/emc/usr_intf/pncconf/x_axis.glade:547 +#: src/emc/usr_intf/pncconf/x_axis.glade:563 +#: src/emc/usr_intf/pncconf/y_axis.glade:512 +#: src/emc/usr_intf/pncconf/y_axis.glade:547 +#: src/emc/usr_intf/pncconf/y_axis.glade:563 +#: src/emc/usr_intf/pncconf/z_axis.glade:512 +#: src/emc/usr_intf/pncconf/z_axis.glade:547 +#: src/emc/usr_intf/pncconf/z_axis.glade:563 +#: src/emc/usr_intf/pncconf/a_axis.glade:512 +#: src/emc/usr_intf/pncconf/a_axis.glade:547 +#: src/emc/usr_intf/pncconf/a_axis.glade:563 msgid "mm / minute" msgstr "mm / Minute" -#: src/emc/usr_intf/pncconf/tests.py:508 +#: src/emc/usr_intf/pncconf/tests.py:512 msgid "mm / second²" msgstr "mm / Sekunde²" -#: src/emc/usr_intf/pncconf/tests.py:512 +#: src/emc/usr_intf/pncconf/tests.py:516 msgid "inches / minute" msgstr "Zoll / Minute" -#: src/emc/usr_intf/pncconf/tests.py:513 +#: src/emc/usr_intf/pncconf/tests.py:517 msgid "inches / second²" msgstr "Zoll / Sekunde²" -#: src/emc/usr_intf/pncconf/tests.py:713 +#: src/emc/usr_intf/pncconf/tests.py:719 #, python-format msgid "%s Axis Tune" msgstr "Achse %s einstellen" -#: src/emc/usr_intf/pncconf/tests.py:907 +#: src/emc/usr_intf/pncconf/tests.py:913 msgid "" " You must designate a ENCODER / RESOLVER signal and an ANALOG SPINDLE signal " "for this axis test" msgstr "" -#: src/emc/usr_intf/pncconf/tests.py:911 +#: src/emc/usr_intf/pncconf/tests.py:917 msgid "" " You must designate a ENCODER / RESOLVER signal and a PWM signal for this " "axis test" msgstr "" -#: src/emc/usr_intf/pncconf/tests.py:1200 +#: src/emc/usr_intf/pncconf/tests.py:1206 msgid "" "Do to technical reasons this test panel can be loaded only once without " "reloading pncconf.You also will not be able to do any other testing untill " @@ -13544,7 +13621,7 @@ msgstr "" msgid "my_LinuxCNC_machine" msgstr "meine_LinuxCNC-Maschine" -#: src/emc/usr_intf/pncconf/data.py:849 +#: src/emc/usr_intf/pncconf/data.py:850 msgid "" "This configuration was saved with an earlier version of pncconf which may be " "incompatible.\n" @@ -13554,12 +13631,12 @@ msgid "" "version of PNConf - ask on the LinuxCNC forum - it may be possible.." msgstr "" -#: src/emc/usr_intf/pncconf/data.py:855 +#: src/emc/usr_intf/pncconf/data.py:856 #, python-format msgid "File %r was modified since it was written by PNCconf" msgstr "Die Datei %r wurde geändert, seitdem sie von PNCconf geschrieben wurde" -#: src/emc/usr_intf/pncconf/data.py:859 +#: src/emc/usr_intf/pncconf/data.py:860 msgid "" "Saving this configuration file will discard configuration changes made " "outside PNCconf." @@ -13567,7 +13644,7 @@ msgstr "" "Beim Speichern dieser Konfigurationsdatei werden Konfigurationsänderungen, " "die außerhalb von PNCconf vorgenommen wurden, verworfen." -#: src/emc/usr_intf/pncconf/data.py:1062 +#: src/emc/usr_intf/pncconf/data.py:1063 #, fuzzy msgid "Desktop Launcher for LinuxCNC config made by PNCconf" msgstr "" @@ -15778,11 +15855,11 @@ msgstr "Standardwerte verwenden" #: src/emc/usr_intf/pncconf/screen.glade:1836 msgid "Force Gmoccapy to Maximize after positioning" -msgstr "" +msgstr "strtae gmoccapy maximiert" #: src/emc/usr_intf/pncconf/screen.glade:2174 msgid "Gmoccapy Defaults" -msgstr "" +msgstr "gmoccapy Grundeinstellungen" #: src/emc/usr_intf/pncconf/vcp.glade:27 msgid "Virtual Control Panel" @@ -15873,669 +15950,670 @@ msgstr "Gladevcp-Details" msgid "Include custom GladeVCP GUI panel" msgstr "Benutzerdefiniertes PyVCP-Panel einbinden" -#: src/emc/usr_intf/pncconf/x_axis.glade:16 -#: src/emc/usr_intf/pncconf/y_axis.glade:16 -#: src/emc/usr_intf/pncconf/z_axis.glade:16 -#: src/emc/usr_intf/pncconf/a_axis.glade:16 -#, fuzzy -msgid "Type 1" -msgstr "" -"Typ 1\n" -"Typ 2" - -#: src/emc/usr_intf/pncconf/x_axis.glade:19 -#: src/emc/usr_intf/pncconf/y_axis.glade:19 -#: src/emc/usr_intf/pncconf/z_axis.glade:19 -#: src/emc/usr_intf/pncconf/a_axis.glade:19 -#, fuzzy -msgid "Type 2" -msgstr "" -"Typ 1\n" -"Typ 2" - -#: src/emc/usr_intf/pncconf/x_axis.glade:58 -#: src/emc/usr_intf/pncconf/y_axis.glade:58 -#: src/emc/usr_intf/pncconf/z_axis.glade:58 -#: src/emc/usr_intf/pncconf/a_axis.glade:58 -msgid "Towards Negative Limit" -msgstr "" - -#: src/emc/usr_intf/pncconf/x_axis.glade:61 -#: src/emc/usr_intf/pncconf/y_axis.glade:61 -#: src/emc/usr_intf/pncconf/z_axis.glade:61 -#: src/emc/usr_intf/pncconf/a_axis.glade:61 -msgid "Towards Positive Limit" -msgstr "" - -#: src/emc/usr_intf/pncconf/x_axis.glade:273 -#: src/emc/usr_intf/pncconf/y_axis.glade:273 -#: src/emc/usr_intf/pncconf/z_axis.glade:273 -#: src/emc/usr_intf/pncconf/a_axis.glade:273 +#: src/emc/usr_intf/pncconf/x_axis.glade:15 +#: src/emc/usr_intf/pncconf/y_axis.glade:15 +#: src/emc/usr_intf/pncconf/z_axis.glade:15 +#: src/emc/usr_intf/pncconf/a_axis.glade:15 msgid "Use Encoder Index For Home:" msgstr "" -#: src/emc/usr_intf/pncconf/x_axis.glade:321 -#: src/emc/usr_intf/pncconf/y_axis.glade:321 -#: src/emc/usr_intf/pncconf/z_axis.glade:321 -#: src/emc/usr_intf/pncconf/a_axis.glade:321 +#: src/emc/usr_intf/pncconf/x_axis.glade:29 +#: src/emc/usr_intf/pncconf/y_axis.glade:29 +#: src/emc/usr_intf/pncconf/z_axis.glade:29 +#: src/emc/usr_intf/pncconf/a_axis.glade:29 #, fuzzy msgid "Home Final Velocity:" msgstr "Gesch_windigkeit Referenzfahrt:" -#: src/emc/usr_intf/pncconf/x_axis.glade:354 -#: src/emc/usr_intf/pncconf/y_axis.glade:354 -#: src/emc/usr_intf/pncconf/z_axis.glade:354 -#: src/emc/usr_intf/pncconf/a_axis.glade:354 +#: src/emc/usr_intf/pncconf/x_axis.glade:42 +#: src/emc/usr_intf/pncconf/y_axis.glade:42 +#: src/emc/usr_intf/pncconf/z_axis.glade:42 +#: src/emc/usr_intf/pncconf/a_axis.glade:42 #, fuzzy msgid "Home Latch Direction:" msgstr "Ric_htung beim Übernehmen des Referenzpunkt:" -#: src/emc/usr_intf/pncconf/x_axis.glade:390 -#: src/emc/usr_intf/pncconf/y_axis.glade:390 -#: src/emc/usr_intf/pncconf/z_axis.glade:390 -#: src/emc/usr_intf/pncconf/a_axis.glade:390 +#: src/emc/usr_intf/pncconf/x_axis.glade:57 +#: src/emc/usr_intf/pncconf/y_axis.glade:57 +#: src/emc/usr_intf/pncconf/z_axis.glade:57 +#: src/emc/usr_intf/pncconf/a_axis.glade:57 #, fuzzy msgid "Home Search Direction:" msgstr "Ric_htung beim Übernehmen des Referenzpunkt:" -#: src/emc/usr_intf/pncconf/x_axis.glade:439 -#: src/emc/usr_intf/pncconf/y_axis.glade:439 -#: src/emc/usr_intf/pncconf/z_axis.glade:439 -#: src/emc/usr_intf/pncconf/a_axis.glade:439 +#: src/emc/usr_intf/pncconf/x_axis.glade:72 +#: src/emc/usr_intf/pncconf/y_axis.glade:72 +#: src/emc/usr_intf/pncconf/z_axis.glade:72 +#: src/emc/usr_intf/pncconf/a_axis.glade:72 #, fuzzy msgid "Home latch Velocity:" msgstr "Gesch_windigkeit Referenzfahrt:" -#: src/emc/usr_intf/pncconf/x_axis.glade:470 -#: src/emc/usr_intf/pncconf/y_axis.glade:470 -#: src/emc/usr_intf/pncconf/z_axis.glade:470 -#: src/emc/usr_intf/pncconf/a_axis.glade:470 -msgid "filename:" -msgstr "Dateiname:" - -#: src/emc/usr_intf/pncconf/x_axis.glade:538 -#: src/emc/usr_intf/pncconf/y_axis.glade:538 -#: src/emc/usr_intf/pncconf/z_axis.glade:538 -#: src/emc/usr_intf/pncconf/a_axis.glade:538 -msgid "Use Compensation File:" +#: src/emc/usr_intf/pncconf/x_axis.glade:104 +#: src/emc/usr_intf/pncconf/y_axis.glade:104 +#: src/emc/usr_intf/pncconf/z_axis.glade:104 +#: src/emc/usr_intf/pncconf/a_axis.glade:104 +#, fuzzy +msgid "Use Compensation Filename:" msgstr "Kompensationsdatei verwenden:" -#: src/emc/usr_intf/pncconf/x_axis.glade:552 -#: src/emc/usr_intf/pncconf/y_axis.glade:552 -#: src/emc/usr_intf/pncconf/z_axis.glade:552 -#: src/emc/usr_intf/pncconf/a_axis.glade:552 +#: src/emc/usr_intf/pncconf/x_axis.glade:120 +#: src/emc/usr_intf/pncconf/y_axis.glade:120 +#: src/emc/usr_intf/pncconf/z_axis.glade:120 +#: src/emc/usr_intf/pncconf/a_axis.glade:120 msgid "Use Backlash Compensation:" msgstr "" -#: src/emc/usr_intf/pncconf/x_axis.glade:569 -#: src/emc/usr_intf/pncconf/y_axis.glade:569 -#: src/emc/usr_intf/pncconf/z_axis.glade:569 -#: src/emc/usr_intf/pncconf/a_axis.glade:569 -msgid "Home Position location (offset from machine zero Origin):" +#: src/emc/usr_intf/pncconf/x_axis.glade:140 +#: src/emc/usr_intf/pncconf/y_axis.glade:140 +#: src/emc/usr_intf/pncconf/z_axis.glade:140 +#: src/emc/usr_intf/pncconf/a_axis.glade:140 +msgid "Final Home Position location (Offset from machine zero Origin):" msgstr "" -#: src/emc/usr_intf/pncconf/x_axis.glade:586 -#: src/emc/usr_intf/pncconf/y_axis.glade:586 -#: src/emc/usr_intf/pncconf/z_axis.glade:586 -#: src/emc/usr_intf/pncconf/a_axis.glade:586 +#: src/emc/usr_intf/pncconf/x_axis.glade:156 +#: src/emc/usr_intf/pncconf/y_axis.glade:156 +#: src/emc/usr_intf/pncconf/z_axis.glade:156 +#: src/emc/usr_intf/pncconf/a_axis.glade:156 msgid "Negative Travel Distance (Machine zero Origin to end of - travel): " msgstr "" -#: src/emc/usr_intf/pncconf/x_axis.glade:637 -#: src/emc/usr_intf/pncconf/y_axis.glade:637 -#: src/emc/usr_intf/pncconf/z_axis.glade:637 -#: src/emc/usr_intf/pncconf/a_axis.glade:637 -msgid "Home Switch location (Offset from machine zero Origin):" +#: src/emc/usr_intf/pncconf/x_axis.glade:172 +#: src/emc/usr_intf/pncconf/y_axis.glade:172 +#: src/emc/usr_intf/pncconf/z_axis.glade:172 +#: src/emc/usr_intf/pncconf/a_axis.glade:172 +msgid "Tandem Home Switch location (Offset from machine zero Origin):" msgstr "" -#: src/emc/usr_intf/pncconf/x_axis.glade:654 -#: src/emc/usr_intf/pncconf/y_axis.glade:654 -#: src/emc/usr_intf/pncconf/z_axis.glade:654 -#: src/emc/usr_intf/pncconf/a_axis.glade:654 +#: src/emc/usr_intf/pncconf/x_axis.glade:188 +#: src/emc/usr_intf/pncconf/y_axis.glade:188 +#: src/emc/usr_intf/pncconf/z_axis.glade:188 +#: src/emc/usr_intf/pncconf/a_axis.glade:188 #, fuzzy msgid "Home Search Velocity:" msgstr "Gesch_windigkeit Referenzfahrt:" -#: src/emc/usr_intf/pncconf/x_axis.glade:670 -#: src/emc/usr_intf/pncconf/y_axis.glade:670 -#: src/emc/usr_intf/pncconf/z_axis.glade:670 -#: src/emc/usr_intf/pncconf/a_axis.glade:670 +#: src/emc/usr_intf/pncconf/x_axis.glade:203 +#: src/emc/usr_intf/pncconf/y_axis.glade:203 +#: src/emc/usr_intf/pncconf/z_axis.glade:203 +#: src/emc/usr_intf/pncconf/a_axis.glade:203 msgid "Positive Travel Distance (Machine zero Origin to end of + travel): " msgstr "" -#: src/emc/usr_intf/pncconf/x_axis.glade:978 -#: src/emc/usr_intf/pncconf/y_axis.glade:978 -#: src/emc/usr_intf/pncconf/z_axis.glade:978 -#: src/emc/usr_intf/pncconf/a_axis.glade:978 +#: src/emc/usr_intf/pncconf/x_axis.glade:219 +#: src/emc/usr_intf/pncconf/y_axis.glade:219 +#: src/emc/usr_intf/pncconf/z_axis.glade:219 +#: src/emc/usr_intf/pncconf/a_axis.glade:219 #, fuzzy msgid "Home Search Sequence:" msgstr "Gesch_windigkeit Referenzfahrt:" -#: src/emc/usr_intf/pncconf/x_motor.glade:48 -#: src/emc/usr_intf/pncconf/y_motor.glade:48 -#: src/emc/usr_intf/pncconf/z_motor.glade:48 +#: src/emc/usr_intf/pncconf/x_axis.glade:234 +#: src/emc/usr_intf/pncconf/y_axis.glade:234 +#: src/emc/usr_intf/pncconf/z_axis.glade:234 +#: src/emc/usr_intf/pncconf/a_axis.glade:234 +msgid "Home Switch location (offset from machine zero Origin):" +msgstr "" + +#: src/emc/usr_intf/pncconf/x_axis.glade:673 +#: src/emc/usr_intf/pncconf/y_axis.glade:673 +#: src/emc/usr_intf/pncconf/z_axis.glade:673 +#: src/emc/usr_intf/pncconf/a_axis.glade:673 +#, fuzzy +msgid "Type 1" +msgstr "" +"Typ 1\n" +"Typ 2" + +#: src/emc/usr_intf/pncconf/x_axis.glade:676 +#: src/emc/usr_intf/pncconf/y_axis.glade:676 +#: src/emc/usr_intf/pncconf/z_axis.glade:676 +#: src/emc/usr_intf/pncconf/a_axis.glade:676 +#, fuzzy +msgid "Type 2" +msgstr "" +"Typ 1\n" +"Typ 2" + +#: src/emc/usr_intf/pncconf/x_axis.glade:715 +#: src/emc/usr_intf/pncconf/y_axis.glade:715 +#: src/emc/usr_intf/pncconf/z_axis.glade:715 +#: src/emc/usr_intf/pncconf/a_axis.glade:715 +msgid "Towards Negative Limit" +msgstr "" + +#: src/emc/usr_intf/pncconf/x_axis.glade:718 +#: src/emc/usr_intf/pncconf/y_axis.glade:718 +#: src/emc/usr_intf/pncconf/z_axis.glade:718 +#: src/emc/usr_intf/pncconf/a_axis.glade:718 +msgid "Towards Positive Limit" +msgstr "" + +#: src/emc/usr_intf/pncconf/x_motor.glade:74 +#: src/emc/usr_intf/pncconf/y_motor.glade:74 +#: src/emc/usr_intf/pncconf/z_motor.glade:74 #: src/emc/usr_intf/pncconf/a_motor.glade:48 -#: src/emc/usr_intf/pncconf/s_motor.glade:216 +#: src/emc/usr_intf/pncconf/s_motor.glade:72 #, fuzzy msgid "Max Output" msgstr "Ausgabe" -#: src/emc/usr_intf/pncconf/x_motor.glade:116 -#: src/emc/usr_intf/pncconf/y_motor.glade:116 -#: src/emc/usr_intf/pncconf/z_motor.glade:116 +#: src/emc/usr_intf/pncconf/x_motor.glade:155 +#: src/emc/usr_intf/pncconf/y_motor.glade:155 +#: src/emc/usr_intf/pncconf/z_motor.glade:155 #: src/emc/usr_intf/pncconf/a_motor.glade:116 -#: src/emc/usr_intf/pncconf/s_motor.glade:297 +#: src/emc/usr_intf/pncconf/s_motor.glade:153 #: src/emc/usr_intf/pncconf/dialogs.glade:4005 msgid "FF2" msgstr "FF2" -#: src/emc/usr_intf/pncconf/x_motor.glade:129 -#: src/emc/usr_intf/pncconf/y_motor.glade:129 -#: src/emc/usr_intf/pncconf/z_motor.glade:129 +#: src/emc/usr_intf/pncconf/x_motor.glade:169 +#: src/emc/usr_intf/pncconf/y_motor.glade:169 +#: src/emc/usr_intf/pncconf/z_motor.glade:169 #: src/emc/usr_intf/pncconf/a_motor.glade:129 -#: src/emc/usr_intf/pncconf/s_motor.glade:311 +#: src/emc/usr_intf/pncconf/s_motor.glade:167 #: src/emc/usr_intf/pncconf/dialogs.glade:3994 msgid "FF1" msgstr "FF1" -#: src/emc/usr_intf/pncconf/x_motor.glade:142 -#: src/emc/usr_intf/pncconf/y_motor.glade:142 -#: src/emc/usr_intf/pncconf/z_motor.glade:142 +#: src/emc/usr_intf/pncconf/x_motor.glade:183 +#: src/emc/usr_intf/pncconf/y_motor.glade:183 +#: src/emc/usr_intf/pncconf/z_motor.glade:183 #: src/emc/usr_intf/pncconf/a_motor.glade:142 -#: src/emc/usr_intf/pncconf/s_motor.glade:325 +#: src/emc/usr_intf/pncconf/s_motor.glade:181 #: src/emc/usr_intf/pncconf/dialogs.glade:3983 msgid "FF0" msgstr "FF0" -#: src/emc/usr_intf/pncconf/x_motor.glade:191 -#: src/emc/usr_intf/pncconf/y_motor.glade:191 -#: src/emc/usr_intf/pncconf/z_motor.glade:191 +#: src/emc/usr_intf/pncconf/x_motor.glade:241 +#: src/emc/usr_intf/pncconf/y_motor.glade:241 +#: src/emc/usr_intf/pncconf/z_motor.glade:241 #: src/emc/usr_intf/pncconf/a_motor.glade:191 -#: src/emc/usr_intf/pncconf/s_motor.glade:383 +#: src/emc/usr_intf/pncconf/s_motor.glade:239 msgid "Deadband" msgstr "Totzone" -#: src/emc/usr_intf/pncconf/x_motor.glade:204 -#: src/emc/usr_intf/pncconf/y_motor.glade:204 -#: src/emc/usr_intf/pncconf/z_motor.glade:204 +#: src/emc/usr_intf/pncconf/x_motor.glade:255 +#: src/emc/usr_intf/pncconf/y_motor.glade:255 +#: src/emc/usr_intf/pncconf/z_motor.glade:255 #: src/emc/usr_intf/pncconf/a_motor.glade:204 -#: src/emc/usr_intf/pncconf/s_motor.glade:397 +#: src/emc/usr_intf/pncconf/s_motor.glade:253 #: src/emc/usr_intf/pncconf/dialogs.glade:4235 msgid "Bias" msgstr "" -#: src/emc/usr_intf/pncconf/x_motor.glade:217 -#: src/emc/usr_intf/pncconf/y_motor.glade:217 -#: src/emc/usr_intf/pncconf/z_motor.glade:217 +#: src/emc/usr_intf/pncconf/x_motor.glade:269 +#: src/emc/usr_intf/pncconf/y_motor.glade:269 +#: src/emc/usr_intf/pncconf/z_motor.glade:269 #: src/emc/usr_intf/pncconf/a_motor.glade:217 -#: src/emc/usr_intf/pncconf/s_motor.glade:411 +#: src/emc/usr_intf/pncconf/s_motor.glade:267 msgid "P" msgstr "P" -#: src/emc/usr_intf/pncconf/x_motor.glade:228 -#: src/emc/usr_intf/pncconf/y_motor.glade:228 -#: src/emc/usr_intf/pncconf/z_motor.glade:228 +#: src/emc/usr_intf/pncconf/x_motor.glade:281 +#: src/emc/usr_intf/pncconf/y_motor.glade:281 +#: src/emc/usr_intf/pncconf/z_motor.glade:281 #: src/emc/usr_intf/pncconf/a_motor.glade:228 -#: src/emc/usr_intf/pncconf/s_motor.glade:423 +#: src/emc/usr_intf/pncconf/s_motor.glade:279 msgid "I" msgstr "I" -#: src/emc/usr_intf/pncconf/x_motor.glade:241 -#: src/emc/usr_intf/pncconf/y_motor.glade:241 -#: src/emc/usr_intf/pncconf/z_motor.glade:241 +#: src/emc/usr_intf/pncconf/x_motor.glade:295 +#: src/emc/usr_intf/pncconf/y_motor.glade:295 +#: src/emc/usr_intf/pncconf/z_motor.glade:295 #: src/emc/usr_intf/pncconf/a_motor.glade:241 -#: src/emc/usr_intf/pncconf/s_motor.glade:437 +#: src/emc/usr_intf/pncconf/s_motor.glade:293 msgid "D" msgstr "D" -#: src/emc/usr_intf/pncconf/x_motor.glade:315 -#: src/emc/usr_intf/pncconf/s_motor.glade:518 +#: src/emc/usr_intf/pncconf/x_motor.glade:382 +#: src/emc/usr_intf/pncconf/s_motor.glade:380 #, fuzzy msgid "PID Info" msgstr "Info" -#: src/emc/usr_intf/pncconf/x_motor.glade:344 -#: src/emc/usr_intf/pncconf/y_motor.glade:344 -#: src/emc/usr_intf/pncconf/z_motor.glade:344 +#: src/emc/usr_intf/pncconf/x_motor.glade:415 +#: src/emc/usr_intf/pncconf/y_motor.glade:415 +#: src/emc/usr_intf/pncconf/z_motor.glade:415 #: src/emc/usr_intf/pncconf/a_motor.glade:344 -#: src/emc/usr_intf/pncconf/s_motor.glade:605 +#: src/emc/usr_intf/pncconf/s_motor.glade:413 msgid "3pwm Scale:" msgstr "" -#: src/emc/usr_intf/pncconf/x_motor.glade:355 -#: src/emc/usr_intf/pncconf/y_motor.glade:355 -#: src/emc/usr_intf/pncconf/z_motor.glade:355 +#: src/emc/usr_intf/pncconf/x_motor.glade:427 +#: src/emc/usr_intf/pncconf/y_motor.glade:427 +#: src/emc/usr_intf/pncconf/z_motor.glade:427 #: src/emc/usr_intf/pncconf/a_motor.glade:355 -#: src/emc/usr_intf/pncconf/s_motor.glade:617 +#: src/emc/usr_intf/pncconf/s_motor.glade:425 msgid "3pwm Deadtime:" msgstr "" -#: src/emc/usr_intf/pncconf/x_motor.glade:368 -#: src/emc/usr_intf/pncconf/y_motor.glade:368 -#: src/emc/usr_intf/pncconf/z_motor.glade:368 +#: src/emc/usr_intf/pncconf/x_motor.glade:441 +#: src/emc/usr_intf/pncconf/y_motor.glade:441 +#: src/emc/usr_intf/pncconf/z_motor.glade:441 #: src/emc/usr_intf/pncconf/a_motor.glade:368 msgid "Quad Pulses / Rev:" msgstr "" -#: src/emc/usr_intf/pncconf/x_motor.glade:449 -#: src/emc/usr_intf/pncconf/y_motor.glade:449 -#: src/emc/usr_intf/pncconf/z_motor.glade:449 +#: src/emc/usr_intf/pncconf/x_motor.glade:537 +#: src/emc/usr_intf/pncconf/y_motor.glade:537 +#: src/emc/usr_intf/pncconf/z_motor.glade:537 #: src/emc/usr_intf/pncconf/a_motor.glade:449 -#: src/emc/usr_intf/pncconf/s_motor.glade:2553 +#: src/emc/usr_intf/pncconf/s_motor.glade:2309 msgid "" "Open Loop\n" " Test" msgstr "" -#: src/emc/usr_intf/pncconf/x_motor.glade:473 -#: src/emc/usr_intf/pncconf/y_motor.glade:473 -#: src/emc/usr_intf/pncconf/z_motor.glade:473 +#: src/emc/usr_intf/pncconf/x_motor.glade:564 +#: src/emc/usr_intf/pncconf/y_motor.glade:564 +#: src/emc/usr_intf/pncconf/z_motor.glade:564 #: src/emc/usr_intf/pncconf/a_motor.glade:473 #, fuzzy msgid "Analog Min Limit:" msgstr "Endschalter Mimimum X" -#: src/emc/usr_intf/pncconf/x_motor.glade:487 -#: src/emc/usr_intf/pncconf/y_motor.glade:487 -#: src/emc/usr_intf/pncconf/z_motor.glade:487 +#: src/emc/usr_intf/pncconf/x_motor.glade:579 +#: src/emc/usr_intf/pncconf/y_motor.glade:579 +#: src/emc/usr_intf/pncconf/z_motor.glade:579 #: src/emc/usr_intf/pncconf/a_motor.glade:487 #, fuzzy msgid "Analog Max limit:" msgstr "Endschalter Maximum X" -#: src/emc/usr_intf/pncconf/x_motor.glade:501 -#: src/emc/usr_intf/pncconf/y_motor.glade:501 -#: src/emc/usr_intf/pncconf/z_motor.glade:501 +#: src/emc/usr_intf/pncconf/x_motor.glade:594 +#: src/emc/usr_intf/pncconf/y_motor.glade:594 +#: src/emc/usr_intf/pncconf/z_motor.glade:594 #: src/emc/usr_intf/pncconf/a_motor.glade:501 msgid "Analog Max Scale:" msgstr "" -#: src/emc/usr_intf/pncconf/x_motor.glade:616 -#: src/emc/usr_intf/pncconf/y_motor.glade:616 -#: src/emc/usr_intf/pncconf/z_motor.glade:616 +#: src/emc/usr_intf/pncconf/x_motor.glade:722 +#: src/emc/usr_intf/pncconf/y_motor.glade:722 +#: src/emc/usr_intf/pncconf/z_motor.glade:722 #: src/emc/usr_intf/pncconf/a_motor.glade:616 msgid "Output Info" msgstr "Ausgang-Info" -#: src/emc/usr_intf/pncconf/x_motor.glade:644 -#: src/emc/usr_intf/pncconf/y_motor.glade:644 -#: src/emc/usr_intf/pncconf/z_motor.glade:644 +#: src/emc/usr_intf/pncconf/x_motor.glade:755 +#: src/emc/usr_intf/pncconf/y_motor.glade:755 +#: src/emc/usr_intf/pncconf/z_motor.glade:755 #: src/emc/usr_intf/pncconf/a_motor.glade:644 -#: src/emc/usr_intf/pncconf/s_motor.glade:844 +#: src/emc/usr_intf/pncconf/s_motor.glade:696 msgid "Step On-Time" msgstr "" -#: src/emc/usr_intf/pncconf/x_motor.glade:657 -#: src/emc/usr_intf/pncconf/y_motor.glade:657 -#: src/emc/usr_intf/pncconf/z_motor.glade:657 +#: src/emc/usr_intf/pncconf/x_motor.glade:769 +#: src/emc/usr_intf/pncconf/y_motor.glade:769 +#: src/emc/usr_intf/pncconf/z_motor.glade:769 #: src/emc/usr_intf/pncconf/a_motor.glade:657 -#: src/emc/usr_intf/pncconf/s_motor.glade:858 +#: src/emc/usr_intf/pncconf/s_motor.glade:710 msgid "Step Space" msgstr "" -#: src/emc/usr_intf/pncconf/x_motor.glade:702 -#: src/emc/usr_intf/pncconf/y_motor.glade:702 -#: src/emc/usr_intf/pncconf/z_motor.glade:702 +#: src/emc/usr_intf/pncconf/x_motor.glade:823 +#: src/emc/usr_intf/pncconf/y_motor.glade:823 +#: src/emc/usr_intf/pncconf/z_motor.glade:823 #: src/emc/usr_intf/pncconf/a_motor.glade:702 -#: src/emc/usr_intf/pncconf/s_motor.glade:912 +#: src/emc/usr_intf/pncconf/s_motor.glade:764 #, fuzzy msgid "Direction Hold" msgstr "Zeit zwischen Schritt und _Richtungswechsel" -#: src/emc/usr_intf/pncconf/x_motor.glade:715 -#: src/emc/usr_intf/pncconf/y_motor.glade:715 -#: src/emc/usr_intf/pncconf/z_motor.glade:715 +#: src/emc/usr_intf/pncconf/x_motor.glade:837 +#: src/emc/usr_intf/pncconf/y_motor.glade:837 +#: src/emc/usr_intf/pncconf/z_motor.glade:837 #: src/emc/usr_intf/pncconf/a_motor.glade:715 -#: src/emc/usr_intf/pncconf/s_motor.glade:926 +#: src/emc/usr_intf/pncconf/s_motor.glade:778 #, fuzzy msgid "Direction Setup" msgstr "Zeit zwischen Richtungs_wechsel und Schritt" -#: src/emc/usr_intf/pncconf/x_motor.glade:760 -#: src/emc/usr_intf/pncconf/y_motor.glade:760 -#: src/emc/usr_intf/pncconf/z_motor.glade:760 +#: src/emc/usr_intf/pncconf/x_motor.glade:891 +#: src/emc/usr_intf/pncconf/y_motor.glade:891 +#: src/emc/usr_intf/pncconf/z_motor.glade:891 #: src/emc/usr_intf/pncconf/a_motor.glade:760 -#: src/emc/usr_intf/pncconf/s_motor.glade:980 +#: src/emc/usr_intf/pncconf/s_motor.glade:832 msgid "Driver Type:" msgstr "Treibertyp:" -#: src/emc/usr_intf/pncconf/x_motor.glade:817 -#: src/emc/usr_intf/pncconf/y_motor.glade:817 -#: src/emc/usr_intf/pncconf/z_motor.glade:817 +#: src/emc/usr_intf/pncconf/x_motor.glade:950 +#: src/emc/usr_intf/pncconf/y_motor.glade:950 +#: src/emc/usr_intf/pncconf/z_motor.glade:950 #: src/emc/usr_intf/pncconf/a_motor.glade:817 -#: src/emc/usr_intf/pncconf/s_motor.glade:1045 +#: src/emc/usr_intf/pncconf/s_motor.glade:891 msgid "Stepper Info" msgstr "" -#: src/emc/usr_intf/pncconf/x_motor.glade:864 -#: src/emc/usr_intf/pncconf/y_motor.glade:864 -#: src/emc/usr_intf/pncconf/z_motor.glade:864 +#: src/emc/usr_intf/pncconf/x_motor.glade:1003 +#: src/emc/usr_intf/pncconf/y_motor.glade:1003 +#: src/emc/usr_intf/pncconf/z_motor.glade:1003 #: src/emc/usr_intf/pncconf/a_motor.glade:864 -#: src/emc/usr_intf/pncconf/s_motor.glade:1357 +#: src/emc/usr_intf/pncconf/s_motor.glade:1141 msgid "No feedback" msgstr "Keine Rückmeldung" -#: src/emc/usr_intf/pncconf/x_motor.glade:877 -#: src/emc/usr_intf/pncconf/y_motor.glade:877 -#: src/emc/usr_intf/pncconf/z_motor.glade:877 +#: src/emc/usr_intf/pncconf/x_motor.glade:1019 +#: src/emc/usr_intf/pncconf/y_motor.glade:1019 +#: src/emc/usr_intf/pncconf/z_motor.glade:1019 #: src/emc/usr_intf/pncconf/a_motor.glade:877 msgid "Absolute Feedback" msgstr "Absolute Rückmeldung" -#: src/emc/usr_intf/pncconf/x_motor.glade:889 -#: src/emc/usr_intf/pncconf/y_motor.glade:889 -#: src/emc/usr_intf/pncconf/z_motor.glade:889 +#: src/emc/usr_intf/pncconf/x_motor.glade:1034 +#: src/emc/usr_intf/pncconf/y_motor.glade:1034 +#: src/emc/usr_intf/pncconf/z_motor.glade:1034 #: src/emc/usr_intf/pncconf/a_motor.glade:889 -#: src/emc/usr_intf/pncconf/s_motor.glade:1386 +#: src/emc/usr_intf/pncconf/s_motor.glade:1172 msgid "Incremental Feedback" msgstr "Inkrementelle Rückmeldung" -#: src/emc/usr_intf/pncconf/x_motor.glade:901 -#: src/emc/usr_intf/pncconf/y_motor.glade:901 -#: src/emc/usr_intf/pncconf/z_motor.glade:901 +#: src/emc/usr_intf/pncconf/x_motor.glade:1049 +#: src/emc/usr_intf/pncconf/y_motor.glade:1049 +#: src/emc/usr_intf/pncconf/z_motor.glade:1049 #: src/emc/usr_intf/pncconf/a_motor.glade:901 -#: src/emc/usr_intf/pncconf/s_motor.glade:1400 +#: src/emc/usr_intf/pncconf/s_motor.glade:1187 msgid "Incremental Encoder" msgstr "Bild invertieren" -#: src/emc/usr_intf/pncconf/x_motor.glade:913 -#: src/emc/usr_intf/pncconf/y_motor.glade:913 -#: src/emc/usr_intf/pncconf/z_motor.glade:913 +#: src/emc/usr_intf/pncconf/x_motor.glade:1064 +#: src/emc/usr_intf/pncconf/y_motor.glade:1064 +#: src/emc/usr_intf/pncconf/z_motor.glade:1064 #: src/emc/usr_intf/pncconf/a_motor.glade:913 -#: src/emc/usr_intf/pncconf/s_motor.glade:1414 +#: src/emc/usr_intf/pncconf/s_motor.glade:1202 msgid "Hall sensors" msgstr "" -#: src/emc/usr_intf/pncconf/x_motor.glade:925 -#: src/emc/usr_intf/pncconf/y_motor.glade:925 -#: src/emc/usr_intf/pncconf/z_motor.glade:925 +#: src/emc/usr_intf/pncconf/x_motor.glade:1079 +#: src/emc/usr_intf/pncconf/y_motor.glade:1079 +#: src/emc/usr_intf/pncconf/z_motor.glade:1079 #: src/emc/usr_intf/pncconf/a_motor.glade:925 -#: src/emc/usr_intf/pncconf/s_motor.glade:1428 +#: src/emc/usr_intf/pncconf/s_motor.glade:1217 msgid "Fanuc Red Cap " msgstr "" -#: src/emc/usr_intf/pncconf/x_motor.glade:937 -#: src/emc/usr_intf/pncconf/y_motor.glade:937 -#: src/emc/usr_intf/pncconf/z_motor.glade:937 +#: src/emc/usr_intf/pncconf/x_motor.glade:1094 +#: src/emc/usr_intf/pncconf/y_motor.glade:1094 +#: src/emc/usr_intf/pncconf/z_motor.glade:1094 #: src/emc/usr_intf/pncconf/a_motor.glade:937 -#: src/emc/usr_intf/pncconf/s_motor.glade:1442 +#: src/emc/usr_intf/pncconf/s_motor.glade:1232 msgid "Use encoder Index" msgstr "" -#: src/emc/usr_intf/pncconf/x_motor.glade:970 -#: src/emc/usr_intf/pncconf/y_motor.glade:970 -#: src/emc/usr_intf/pncconf/z_motor.glade:970 +#: src/emc/usr_intf/pncconf/x_motor.glade:1137 +#: src/emc/usr_intf/pncconf/y_motor.glade:1137 +#: src/emc/usr_intf/pncconf/z_motor.glade:1137 #: src/emc/usr_intf/pncconf/a_motor.glade:970 -#: src/emc/usr_intf/pncconf/s_motor.glade:1484 +#: src/emc/usr_intf/pncconf/s_motor.glade:1275 msgid "Input Options" msgstr "Eingabeoptionen" -#: src/emc/usr_intf/pncconf/x_motor.glade:992 -#: src/emc/usr_intf/pncconf/y_motor.glade:992 -#: src/emc/usr_intf/pncconf/z_motor.glade:992 +#: src/emc/usr_intf/pncconf/x_motor.glade:1164 +#: src/emc/usr_intf/pncconf/y_motor.glade:1164 +#: src/emc/usr_intf/pncconf/z_motor.glade:1164 #: src/emc/usr_intf/pncconf/a_motor.glade:992 -#: src/emc/usr_intf/pncconf/s_motor.glade:1511 +#: src/emc/usr_intf/pncconf/s_motor.glade:1302 msgid "Digital instead of PWM outputs" msgstr "Digital anstatt PWM-Ausgaben" -#: src/emc/usr_intf/pncconf/x_motor.glade:1004 -#: src/emc/usr_intf/pncconf/y_motor.glade:1004 -#: src/emc/usr_intf/pncconf/z_motor.glade:1004 +#: src/emc/usr_intf/pncconf/x_motor.glade:1179 +#: src/emc/usr_intf/pncconf/y_motor.glade:1179 +#: src/emc/usr_intf/pncconf/z_motor.glade:1179 #: src/emc/usr_intf/pncconf/a_motor.glade:1004 -#: src/emc/usr_intf/pncconf/s_motor.glade:1525 +#: src/emc/usr_intf/pncconf/s_motor.glade:1317 msgid "6 outputs instead of 3 " msgstr "6 Ausgaben statt 3 " -#: src/emc/usr_intf/pncconf/x_motor.glade:1016 -#: src/emc/usr_intf/pncconf/y_motor.glade:1016 -#: src/emc/usr_intf/pncconf/z_motor.glade:1016 +#: src/emc/usr_intf/pncconf/x_motor.glade:1194 +#: src/emc/usr_intf/pncconf/y_motor.glade:1194 +#: src/emc/usr_intf/pncconf/z_motor.glade:1194 #: src/emc/usr_intf/pncconf/a_motor.glade:1016 -#: src/emc/usr_intf/pncconf/s_motor.glade:1539 +#: src/emc/usr_intf/pncconf/s_motor.glade:1332 msgid "Force Trapezoid Mode" msgstr "" -#: src/emc/usr_intf/pncconf/x_motor.glade:1028 -#: src/emc/usr_intf/pncconf/y_motor.glade:1028 -#: src/emc/usr_intf/pncconf/z_motor.glade:1028 +#: src/emc/usr_intf/pncconf/x_motor.glade:1209 +#: src/emc/usr_intf/pncconf/y_motor.glade:1209 +#: src/emc/usr_intf/pncconf/z_motor.glade:1209 #: src/emc/usr_intf/pncconf/a_motor.glade:1028 -#: src/emc/usr_intf/pncconf/s_motor.glade:1553 +#: src/emc/usr_intf/pncconf/s_motor.glade:1347 msgid "Emulate feedback " msgstr "Rückmeldung emulieren " -#: src/emc/usr_intf/pncconf/x_motor.glade:1040 -#: src/emc/usr_intf/pncconf/y_motor.glade:1040 -#: src/emc/usr_intf/pncconf/z_motor.glade:1040 +#: src/emc/usr_intf/pncconf/x_motor.glade:1224 +#: src/emc/usr_intf/pncconf/y_motor.glade:1224 +#: src/emc/usr_intf/pncconf/z_motor.glade:1224 #: src/emc/usr_intf/pncconf/a_motor.glade:1040 -#: src/emc/usr_intf/pncconf/s_motor.glade:1567 +#: src/emc/usr_intf/pncconf/s_motor.glade:1362 msgid "Emulated Hall sensors" msgstr "" -#: src/emc/usr_intf/pncconf/x_motor.glade:1053 -#: src/emc/usr_intf/pncconf/y_motor.glade:1053 -#: src/emc/usr_intf/pncconf/z_motor.glade:1053 +#: src/emc/usr_intf/pncconf/x_motor.glade:1240 +#: src/emc/usr_intf/pncconf/y_motor.glade:1240 +#: src/emc/usr_intf/pncconf/z_motor.glade:1240 #: src/emc/usr_intf/pncconf/a_motor.glade:1053 -#: src/emc/usr_intf/pncconf/s_motor.glade:1582 +#: src/emc/usr_intf/pncconf/s_motor.glade:1378 msgid "Emulated Fanuc Red Cap" msgstr "" -#: src/emc/usr_intf/pncconf/x_motor.glade:1081 -#: src/emc/usr_intf/pncconf/y_motor.glade:1081 -#: src/emc/usr_intf/pncconf/z_motor.glade:1081 +#: src/emc/usr_intf/pncconf/x_motor.glade:1278 +#: src/emc/usr_intf/pncconf/y_motor.glade:1278 +#: src/emc/usr_intf/pncconf/z_motor.glade:1278 #: src/emc/usr_intf/pncconf/a_motor.glade:1081 -#: src/emc/usr_intf/pncconf/s_motor.glade:1619 +#: src/emc/usr_intf/pncconf/s_motor.glade:1416 msgid "8i20 Max Current" msgstr "8i20 Max. Strom" -#: src/emc/usr_intf/pncconf/x_motor.glade:1115 -#: src/emc/usr_intf/pncconf/y_motor.glade:1115 -#: src/emc/usr_intf/pncconf/z_motor.glade:1115 +#: src/emc/usr_intf/pncconf/x_motor.glade:1323 +#: src/emc/usr_intf/pncconf/y_motor.glade:1323 +#: src/emc/usr_intf/pncconf/z_motor.glade:1323 #: src/emc/usr_intf/pncconf/a_motor.glade:1115 -#: src/emc/usr_intf/pncconf/s_motor.glade:1664 +#: src/emc/usr_intf/pncconf/s_motor.glade:1461 msgid "Output Options" msgstr "Ausgabeoptionen" -#: src/emc/usr_intf/pncconf/x_motor.glade:1167 -#: src/emc/usr_intf/pncconf/y_motor.glade:1167 -#: src/emc/usr_intf/pncconf/z_motor.glade:1167 +#: src/emc/usr_intf/pncconf/x_motor.glade:1389 +#: src/emc/usr_intf/pncconf/y_motor.glade:1389 +#: src/emc/usr_intf/pncconf/z_motor.glade:1389 #: src/emc/usr_intf/pncconf/a_motor.glade:1167 msgid "alignment current" msgstr "" -#: src/emc/usr_intf/pncconf/x_motor.glade:1177 -#: src/emc/usr_intf/pncconf/y_motor.glade:1177 -#: src/emc/usr_intf/pncconf/z_motor.glade:1177 +#: src/emc/usr_intf/pncconf/x_motor.glade:1400 +#: src/emc/usr_intf/pncconf/y_motor.glade:1400 +#: src/emc/usr_intf/pncconf/z_motor.glade:1400 #: src/emc/usr_intf/pncconf/a_motor.glade:1177 -#: src/emc/usr_intf/pncconf/s_motor.glade:1741 +#: src/emc/usr_intf/pncconf/s_motor.glade:1538 msgid "lead angle" msgstr "Steigungswinkel" -#: src/emc/usr_intf/pncconf/x_motor.glade:1277 -#: src/emc/usr_intf/pncconf/y_motor.glade:1277 -#: src/emc/usr_intf/pncconf/z_motor.glade:1277 +#: src/emc/usr_intf/pncconf/x_motor.glade:1526 +#: src/emc/usr_intf/pncconf/y_motor.glade:1526 +#: src/emc/usr_intf/pncconf/z_motor.glade:1526 #: src/emc/usr_intf/pncconf/a_motor.glade:1277 -#: src/emc/usr_intf/pncconf/s_motor.glade:1866 +#: src/emc/usr_intf/pncconf/s_motor.glade:1664 msgid "Reverse" msgstr "Umkehren" -#: src/emc/usr_intf/pncconf/x_motor.glade:1287 -#: src/emc/usr_intf/pncconf/y_motor.glade:1287 -#: src/emc/usr_intf/pncconf/z_motor.glade:1287 +#: src/emc/usr_intf/pncconf/x_motor.glade:1537 +#: src/emc/usr_intf/pncconf/y_motor.glade:1537 +#: src/emc/usr_intf/pncconf/z_motor.glade:1537 #: src/emc/usr_intf/pncconf/a_motor.glade:1287 -#: src/emc/usr_intf/pncconf/s_motor.glade:1877 +#: src/emc/usr_intf/pncconf/s_motor.glade:1675 msgid "Input-pattern" msgstr "Eingangsmuster" -#: src/emc/usr_intf/pncconf/x_motor.glade:1297 -#: src/emc/usr_intf/pncconf/y_motor.glade:1297 -#: src/emc/usr_intf/pncconf/z_motor.glade:1297 +#: src/emc/usr_intf/pncconf/x_motor.glade:1548 +#: src/emc/usr_intf/pncconf/y_motor.glade:1548 +#: src/emc/usr_intf/pncconf/z_motor.glade:1548 #: src/emc/usr_intf/pncconf/a_motor.glade:1297 -#: src/emc/usr_intf/pncconf/s_motor.glade:1888 +#: src/emc/usr_intf/pncconf/s_motor.glade:1686 msgid "output-pattern" msgstr "Ausgangsmuster" -#: src/emc/usr_intf/pncconf/x_motor.glade:1307 -#: src/emc/usr_intf/pncconf/y_motor.glade:1307 -#: src/emc/usr_intf/pncconf/z_motor.glade:1307 +#: src/emc/usr_intf/pncconf/x_motor.glade:1559 +#: src/emc/usr_intf/pncconf/y_motor.glade:1559 +#: src/emc/usr_intf/pncconf/z_motor.glade:1559 #: src/emc/usr_intf/pncconf/a_motor.glade:1307 -#: src/emc/usr_intf/pncconf/s_motor.glade:1899 +#: src/emc/usr_intf/pncconf/s_motor.glade:1697 msgid "Drive-offset" msgstr "" -#: src/emc/usr_intf/pncconf/x_motor.glade:1317 -#: src/emc/usr_intf/pncconf/y_motor.glade:1317 -#: src/emc/usr_intf/pncconf/z_motor.glade:1317 +#: src/emc/usr_intf/pncconf/x_motor.glade:1570 +#: src/emc/usr_intf/pncconf/y_motor.glade:1570 +#: src/emc/usr_intf/pncconf/z_motor.glade:1570 #: src/emc/usr_intf/pncconf/a_motor.glade:1317 -#: src/emc/usr_intf/pncconf/s_motor.glade:1910 +#: src/emc/usr_intf/pncconf/s_motor.glade:1708 msgid "Encoder-offset" msgstr "" -#: src/emc/usr_intf/pncconf/x_motor.glade:1327 -#: src/emc/usr_intf/pncconf/y_motor.glade:1327 -#: src/emc/usr_intf/pncconf/z_motor.glade:1327 +#: src/emc/usr_intf/pncconf/x_motor.glade:1581 +#: src/emc/usr_intf/pncconf/y_motor.glade:1581 +#: src/emc/usr_intf/pncconf/z_motor.glade:1581 #: src/emc/usr_intf/pncconf/a_motor.glade:1327 -#: src/emc/usr_intf/pncconf/s_motor.glade:1921 +#: src/emc/usr_intf/pncconf/s_motor.glade:1719 msgid "Poles" msgstr "Pole" -#: src/emc/usr_intf/pncconf/x_motor.glade:1347 -#: src/emc/usr_intf/pncconf/y_motor.glade:1347 -#: src/emc/usr_intf/pncconf/z_motor.glade:1347 +#: src/emc/usr_intf/pncconf/x_motor.glade:1603 +#: src/emc/usr_intf/pncconf/y_motor.glade:1603 +#: src/emc/usr_intf/pncconf/z_motor.glade:1603 #: src/emc/usr_intf/pncconf/a_motor.glade:1347 -#: src/emc/usr_intf/pncconf/s_motor.glade:1943 +#: src/emc/usr_intf/pncconf/s_motor.glade:1741 msgid "Configuration" msgstr "Konfiguration" -#: src/emc/usr_intf/pncconf/x_motor.glade:1361 -#: src/emc/usr_intf/pncconf/y_motor.glade:1361 -#: src/emc/usr_intf/pncconf/z_motor.glade:1361 +#: src/emc/usr_intf/pncconf/x_motor.glade:1620 +#: src/emc/usr_intf/pncconf/y_motor.glade:1620 +#: src/emc/usr_intf/pncconf/z_motor.glade:1620 #: src/emc/usr_intf/pncconf/a_motor.glade:1361 -#: src/emc/usr_intf/pncconf/s_motor.glade:1960 +#: src/emc/usr_intf/pncconf/s_motor.glade:1758 msgid "Details" msgstr "Details" -#: src/emc/usr_intf/pncconf/x_motor.glade:1376 -#: src/emc/usr_intf/pncconf/y_motor.glade:1376 -#: src/emc/usr_intf/pncconf/z_motor.glade:1376 +#: src/emc/usr_intf/pncconf/x_motor.glade:1637 +#: src/emc/usr_intf/pncconf/y_motor.glade:1637 +#: src/emc/usr_intf/pncconf/z_motor.glade:1637 #: src/emc/usr_intf/pncconf/a_motor.glade:1376 -#: src/emc/usr_intf/pncconf/s_motor.glade:1976 +#: src/emc/usr_intf/pncconf/s_motor.glade:1775 msgid "Use BLDC Motor Commutation Control" msgstr "" -#: src/emc/usr_intf/pncconf/x_motor.glade:1412 -#: src/emc/usr_intf/pncconf/y_motor.glade:1412 -#: src/emc/usr_intf/pncconf/z_motor.glade:1412 +#: src/emc/usr_intf/pncconf/x_motor.glade:1682 +#: src/emc/usr_intf/pncconf/y_motor.glade:1682 +#: src/emc/usr_intf/pncconf/z_motor.glade:1682 #: src/emc/usr_intf/pncconf/a_motor.glade:1412 msgid "Scale:" msgstr "Skala:" -#: src/emc/usr_intf/pncconf/x_motor.glade:1434 -#: src/emc/usr_intf/pncconf/y_motor.glade:1434 -#: src/emc/usr_intf/pncconf/z_motor.glade:1434 +#: src/emc/usr_intf/pncconf/x_motor.glade:1711 +#: src/emc/usr_intf/pncconf/y_motor.glade:1711 +#: src/emc/usr_intf/pncconf/z_motor.glade:1711 #: src/emc/usr_intf/pncconf/a_motor.glade:1434 -#: src/emc/usr_intf/pncconf/s_motor.glade:2436 +#: src/emc/usr_intf/pncconf/s_motor.glade:2182 msgid "% " msgstr "% " -#: src/emc/usr_intf/pncconf/x_motor.glade:1453 -#: src/emc/usr_intf/pncconf/y_motor.glade:1453 -#: src/emc/usr_intf/pncconf/z_motor.glade:1453 +#: src/emc/usr_intf/pncconf/x_motor.glade:1734 +#: src/emc/usr_intf/pncconf/y_motor.glade:1734 +#: src/emc/usr_intf/pncconf/z_motor.glade:1734 #: src/emc/usr_intf/pncconf/a_motor.glade:1453 msgid "Range:" msgstr "" -#: src/emc/usr_intf/pncconf/x_motor.glade:1478 -#: src/emc/usr_intf/pncconf/y_motor.glade:1478 -#: src/emc/usr_intf/pncconf/z_motor.glade:1478 +#: src/emc/usr_intf/pncconf/x_motor.glade:1765 +#: src/emc/usr_intf/pncconf/y_motor.glade:1765 +#: src/emc/usr_intf/pncconf/z_motor.glade:1765 #: src/emc/usr_intf/pncconf/a_motor.glade:1478 -#: src/emc/usr_intf/pncconf/s_motor.glade:2449 +#: src/emc/usr_intf/pncconf/s_motor.glade:2195 #: src/emc/usr_intf/pncconf/dialogs.glade:1791 #: src/emc/usr_intf/pncconf/dialogs.glade:1802 #: src/emc/usr_intf/pncconf/dialogs.glade:3097 msgid "RPM" msgstr "UPM" -#: src/emc/usr_intf/pncconf/x_motor.glade:1498 -#: src/emc/usr_intf/pncconf/y_motor.glade:1498 -#: src/emc/usr_intf/pncconf/z_motor.glade:1498 +#: src/emc/usr_intf/pncconf/x_motor.glade:1788 +#: src/emc/usr_intf/pncconf/y_motor.glade:1788 +#: src/emc/usr_intf/pncconf/z_motor.glade:1788 #: src/emc/usr_intf/pncconf/a_motor.glade:1498 msgid "Use Spindle-At-Speed" msgstr "" -#: src/emc/usr_intf/pncconf/x_motor.glade:1523 -#: src/emc/usr_intf/pncconf/y_motor.glade:1523 -#: src/emc/usr_intf/pncconf/z_motor.glade:1523 +#: src/emc/usr_intf/pncconf/x_motor.glade:1819 +#: src/emc/usr_intf/pncconf/y_motor.glade:1819 +#: src/emc/usr_intf/pncconf/z_motor.glade:1819 #: src/emc/usr_intf/pncconf/a_motor.glade:1523 msgid "Filter gain:" msgstr "" -#: src/emc/usr_intf/pncconf/x_motor.glade:1559 -#: src/emc/usr_intf/pncconf/y_motor.glade:1559 -#: src/emc/usr_intf/pncconf/z_motor.glade:1559 +#: src/emc/usr_intf/pncconf/x_motor.glade:1864 +#: src/emc/usr_intf/pncconf/y_motor.glade:1864 +#: src/emc/usr_intf/pncconf/z_motor.glade:1864 #: src/emc/usr_intf/pncconf/a_motor.glade:1559 msgid "Spindle Display Filter Settings" msgstr "Filtereinstellungen für die Spindelanzeige" -#: src/emc/usr_intf/pncconf/x_motor.glade:1604 -#: src/emc/usr_intf/pncconf/y_motor.glade:1604 -#: src/emc/usr_intf/pncconf/z_motor.glade:1604 +#: src/emc/usr_intf/pncconf/x_motor.glade:1918 +#: src/emc/usr_intf/pncconf/y_motor.glade:1918 +#: src/emc/usr_intf/pncconf/z_motor.glade:1918 #: src/emc/usr_intf/pncconf/a_motor.glade:1604 msgid "Rapid Speed Following Error:" msgstr "" -#: src/emc/usr_intf/pncconf/x_motor.glade:1616 -#: src/emc/usr_intf/pncconf/y_motor.glade:1616 -#: src/emc/usr_intf/pncconf/z_motor.glade:1616 +#: src/emc/usr_intf/pncconf/x_motor.glade:1931 +#: src/emc/usr_intf/pncconf/y_motor.glade:1931 +#: src/emc/usr_intf/pncconf/z_motor.glade:1931 #: src/emc/usr_intf/pncconf/a_motor.glade:1616 msgid "Feed Speed Following Error:" msgstr "" -#: src/emc/usr_intf/pncconf/x_motor.glade:1628 -#: src/emc/usr_intf/pncconf/y_motor.glade:1628 -#: src/emc/usr_intf/pncconf/z_motor.glade:1628 +#: src/emc/usr_intf/pncconf/x_motor.glade:1943 +#: src/emc/usr_intf/pncconf/y_motor.glade:1943 +#: src/emc/usr_intf/pncconf/z_motor.glade:1943 #: src/emc/usr_intf/pncconf/a_motor.glade:1628 -#: src/emc/usr_intf/pncconf/s_motor.glade:2071 +#: src/emc/usr_intf/pncconf/s_motor.glade:1822 msgid "Invert Motor Direction" msgstr "Motor-Drehrichtung umkehren" -#: src/emc/usr_intf/pncconf/x_motor.glade:1643 -#: src/emc/usr_intf/pncconf/y_motor.glade:1643 -#: src/emc/usr_intf/pncconf/z_motor.glade:1643 +#: src/emc/usr_intf/pncconf/x_motor.glade:1959 +#: src/emc/usr_intf/pncconf/y_motor.glade:1959 +#: src/emc/usr_intf/pncconf/z_motor.glade:1959 #: src/emc/usr_intf/pncconf/a_motor.glade:1643 -#: src/emc/usr_intf/pncconf/s_motor.glade:2086 +#: src/emc/usr_intf/pncconf/s_motor.glade:1838 msgid "Invert Encoder Direction " msgstr "" -#: src/emc/usr_intf/pncconf/x_motor.glade:1701 -#: src/emc/usr_intf/pncconf/y_motor.glade:1701 -#: src/emc/usr_intf/pncconf/z_motor.glade:1701 +#: src/emc/usr_intf/pncconf/x_motor.glade:2027 +#: src/emc/usr_intf/pncconf/y_motor.glade:2027 +#: src/emc/usr_intf/pncconf/z_motor.glade:2027 #: src/emc/usr_intf/pncconf/a_motor.glade:1701 -#: src/emc/usr_intf/pncconf/s_motor.glade:2101 +#: src/emc/usr_intf/pncconf/s_motor.glade:1854 #, fuzzy msgid "Single Input Encoder" msgstr "Bild invertieren" -#: src/emc/usr_intf/pncconf/x_motor.glade:1834 -#: src/emc/usr_intf/pncconf/y_motor.glade:1834 -#: src/emc/usr_intf/pncconf/z_motor.glade:1834 +#: src/emc/usr_intf/pncconf/x_motor.glade:2175 +#: src/emc/usr_intf/pncconf/y_motor.glade:2175 +#: src/emc/usr_intf/pncconf/z_motor.glade:2175 #: src/emc/usr_intf/pncconf/a_motor.glade:1834 -#: src/emc/usr_intf/pncconf/s_motor.glade:2306 +#: src/emc/usr_intf/pncconf/s_motor.glade:2052 msgid "encoder Scale:" msgstr "" -#: src/emc/usr_intf/pncconf/x_motor.glade:1859 -#: src/emc/usr_intf/pncconf/y_motor.glade:1859 -#: src/emc/usr_intf/pncconf/z_motor.glade:1859 +#: src/emc/usr_intf/pncconf/x_motor.glade:2205 +#: src/emc/usr_intf/pncconf/y_motor.glade:2205 +#: src/emc/usr_intf/pncconf/z_motor.glade:2205 #: src/emc/usr_intf/pncconf/a_motor.glade:1859 -#: src/emc/usr_intf/pncconf/s_motor.glade:2336 +#: src/emc/usr_intf/pncconf/s_motor.glade:2082 #, fuzzy msgid "Stepper Scale:" msgstr "Zeit zwischen zwei _Schritten:" -#: src/emc/usr_intf/pncconf/x_motor.glade:1886 -#: src/emc/usr_intf/pncconf/y_motor.glade:1886 -#: src/emc/usr_intf/pncconf/z_motor.glade:1886 +#: src/emc/usr_intf/pncconf/x_motor.glade:2236 +#: src/emc/usr_intf/pncconf/y_motor.glade:2236 +#: src/emc/usr_intf/pncconf/z_motor.glade:2236 #: src/emc/usr_intf/pncconf/a_motor.glade:1886 -#: src/emc/usr_intf/pncconf/s_motor.glade:2512 +#: src/emc/usr_intf/pncconf/s_motor.glade:2266 msgid "" "Calculate\n" "Scale" @@ -16543,78 +16621,78 @@ msgstr "" "Skala\n" "berechnen" -#: src/emc/usr_intf/pncconf/x_motor.glade:1959 -#: src/emc/usr_intf/pncconf/y_motor.glade:1959 -#: src/emc/usr_intf/pncconf/z_motor.glade:1959 +#: src/emc/usr_intf/pncconf/x_motor.glade:2318 +#: src/emc/usr_intf/pncconf/y_motor.glade:2318 +#: src/emc/usr_intf/pncconf/z_motor.glade:2318 #: src/emc/usr_intf/pncconf/a_motor.glade:1959 -#: src/emc/usr_intf/pncconf/s_motor.glade:2603 +#: src/emc/usr_intf/pncconf/s_motor.glade:2360 msgid "Test / Tune Axis" msgstr "Achse testen / einstellen" -#: src/emc/usr_intf/pncconf/y_motor.glade:315 -#: src/emc/usr_intf/pncconf/z_motor.glade:315 +#: src/emc/usr_intf/pncconf/y_motor.glade:382 +#: src/emc/usr_intf/pncconf/z_motor.glade:382 #: src/emc/usr_intf/pncconf/a_motor.glade:315 msgid "Servo Info" msgstr "Servo-Info" -#: src/emc/usr_intf/pncconf/s_motor.glade:671 +#: src/emc/usr_intf/pncconf/s_motor.glade:479 msgid "analog Max Voltage:" msgstr "" -#: src/emc/usr_intf/pncconf/s_motor.glade:745 +#: src/emc/usr_intf/pncconf/s_motor.glade:553 #, fuzzy msgid "Use +- voltage for direction" msgstr "Motor-Drehrichtung umkehren" -#: src/emc/usr_intf/pncconf/s_motor.glade:765 -#: src/emc/usr_intf/pncconf/s_motor.glade:1192 +#: src/emc/usr_intf/pncconf/s_motor.glade:574 +#: src/emc/usr_intf/pncconf/s_motor.glade:966 #, fuzzy msgid "Range 1 Max RPM:" msgstr "Max. UPM" -#: src/emc/usr_intf/pncconf/s_motor.glade:776 -#: src/emc/usr_intf/pncconf/s_motor.glade:1203 +#: src/emc/usr_intf/pncconf/s_motor.glade:585 +#: src/emc/usr_intf/pncconf/s_motor.glade:977 #, fuzzy msgid "Range 2 Max RPM" msgstr "Max. UPM" -#: src/emc/usr_intf/pncconf/s_motor.glade:799 +#: src/emc/usr_intf/pncconf/s_motor.glade:663 #, fuzzy msgid "Output Voltage Info" msgstr "Ausgang-Info" -#: src/emc/usr_intf/pncconf/s_motor.glade:1283 +#: src/emc/usr_intf/pncconf/s_motor.glade:995 #, fuzzy msgid "Slave number:" msgstr "Anwenden" -#: src/emc/usr_intf/pncconf/s_motor.glade:1305 +#: src/emc/usr_intf/pncconf/s_motor.glade:1089 msgid "Serial Spindle VFD Info" msgstr "" -#: src/emc/usr_intf/pncconf/s_motor.glade:1372 +#: src/emc/usr_intf/pncconf/s_motor.glade:1157 #, fuzzy msgid "sbsolute Feedback" msgstr "Absolute Rückmeldung" -#: src/emc/usr_intf/pncconf/s_motor.glade:1730 +#: src/emc/usr_intf/pncconf/s_motor.glade:1527 msgid "slignment current" msgstr "" -#: src/emc/usr_intf/pncconf/s_motor.glade:2113 +#: src/emc/usr_intf/pncconf/s_motor.glade:1867 msgid "Use At-Speed Calculation" msgstr "" -#: src/emc/usr_intf/pncconf/s_motor.glade:2388 +#: src/emc/usr_intf/pncconf/s_motor.glade:2134 #, fuzzy msgid "Spindle Display Filter:" msgstr "Filtereinstellungen für die Spindelanzeige" -#: src/emc/usr_intf/pncconf/s_motor.glade:2463 +#: src/emc/usr_intf/pncconf/s_motor.glade:2206 msgid "Use Near Range" msgstr "" -#: src/emc/usr_intf/pncconf/s_motor.glade:2478 +#: src/emc/usr_intf/pncconf/s_motor.glade:2222 #, fuzzy msgid "Use Near Scale" msgstr "Zeit zwischen zwei _Schritten:" @@ -17442,9 +17520,9 @@ msgstr "" #: src/emc/usr_intf/gscreen/gscreen.py:4261 #: src/emc/usr_intf/gscreen/gscreen.py:4267 #: src/emc/usr_intf/gscreen/gscreen.py:4270 -#: src/emc/usr_intf/gmoccapy/gmoccapy.py:3676 +#: src/emc/usr_intf/gmoccapy/gmoccapy.py:3709 msgid "INFO:" -msgstr "" +msgstr "INFO" #: src/emc/usr_intf/gscreen/gscreen.py:1935 #: src/emc/usr_intf/gscreen/gscreen.py:1954 @@ -17613,15 +17691,14 @@ msgstr "AXIS Manueller Werkzeugwechsel" #: src/emc/usr_intf/gmoccapy/dialogs.py:126 #: src/emc/usr_intf/gmoccapy/dialogs.py:140 msgid "Operator Message" -msgstr "" +msgstr "Anwender Nachricht" #: src/emc/usr_intf/gscreen/gscreen.py:3774 #: src/emc/usr_intf/gscreen/gscreen.py:3778 #: src/emc/usr_intf/gmoccapy/dialogs.py:178 #: src/emc/usr_intf/gmoccapy/dialogs.py:182 -#, fuzzy msgid "Restart Entry" -msgstr "Anfang an" +msgstr "Eingabe Neustart" #: src/emc/usr_intf/gscreen/gscreen.py:3787 #: src/emc/usr_intf/gmoccapy/dialogs.py:194 @@ -17631,7 +17708,7 @@ msgstr "Aufwärts" #: src/emc/usr_intf/gscreen/gscreen.py:3789 #: src/emc/usr_intf/gmoccapy/dialogs.py:196 msgid "Enter" -msgstr "" +msgstr "Eingabe" #: src/emc/usr_intf/gscreen/gscreen.py:3791 #: src/emc/usr_intf/gmoccapy/dialogs.py:198 @@ -17864,41 +17941,44 @@ msgid "Status" msgstr " a)" #: src/emc/usr_intf/gscreen/gscreen.glade:1715 -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:2789 -#, fuzzy +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:4266 msgid "" "Search\n" " Text:" -msgstr "Suchpfad" +msgstr "" +"Such-\n" +"Text" #: src/emc/usr_intf/gscreen/gscreen.glade:1743 -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:2719 -#, fuzzy +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:4199 msgid "" "Replace\n" " Text:" -msgstr "Ersetzen mit:" +msgstr "" +"Ersetzen\n" +" mit:" #: src/emc/usr_intf/gscreen/gscreen.glade:1762 -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:2729 -#, fuzzy +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:4209 msgid "" "Replace\n" " All" -msgstr "Alle ersetzen" +msgstr "" +" Alles\n" +"ersetzen" #: src/emc/usr_intf/gscreen/gscreen.glade:1775 -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:2744 -#, fuzzy +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:4223 msgid "" "Ignore\n" " Case" -msgstr "M1 ignorieren" +msgstr "" +"Groß-/Klein\n" +"ignorieren" #: src/emc/usr_intf/gscreen/gscreen.glade:1801 -#, fuzzy msgid "Mode" -msgstr "Leistung" +msgstr "Modus" #: src/emc/usr_intf/gscreen/gscreen.glade:1817 #, fuzzy @@ -17906,8 +17986,7 @@ msgid "Main Level" msgstr "Schwelle" #: src/emc/usr_intf/gscreen/gscreen.glade:1858 -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:4061 -#, fuzzy +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:5531 msgid "Themes" msgstr "Thema:" @@ -17922,26 +18001,23 @@ msgid "DTG Text Color" msgstr "DTG-Textfarbe" #: src/emc/usr_intf/gscreen/gscreen.glade:1951 -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:4095 -#, fuzzy +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:5565 msgid "Warning Audio" -msgstr "Warnung" +msgstr "Warnung Töne" #: src/emc/usr_intf/gscreen/gscreen.glade:1961 -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:4109 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:5579 msgid "Alert Audio" -msgstr "" +msgstr "Gefahren Töne" #: src/emc/usr_intf/gscreen/gscreen.glade:1982 -#, fuzzy msgid "Grid Size" -msgstr "Größe" +msgstr "Raster Größe" #: src/emc/usr_intf/gscreen/gscreen.glade:2021 -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:4546 -#, fuzzy +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:6012 msgid "Starting RPM" -msgstr "Einstellungen" +msgstr "Anfangsdrehzahl" #: src/emc/usr_intf/gscreen/gscreen.glade:2050 msgid "Metric\n" @@ -18021,10 +18097,9 @@ msgid "" msgstr "" #: src/emc/usr_intf/gscreen/gscreen.glade:2328 -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:6665 -#, fuzzy +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:8099 msgid "Calibration" -msgstr "_Kalibrierung" +msgstr "Kalibrierung" #: src/emc/usr_intf/gscreen/gscreen.glade:2339 #, fuzzy @@ -18301,12 +18376,12 @@ msgid "" msgstr "Suchpfad" #: src/emc/usr_intf/gscreen/gscreen.glade:3550 -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:2629 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:4113 msgid "Undo" msgstr "Rückgängig" #: src/emc/usr_intf/gscreen/gscreen.glade:3561 -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:2680 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:4161 msgid "Redo" msgstr "Wiederherstellen" @@ -18396,158 +18471,158 @@ msgstr "" msgid "screen 2" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.py:246 -#: src/emc/usr_intf/gmoccapy/gmoccapy.py:251 +#: src/emc/usr_intf/gmoccapy/gmoccapy.py:232 +#: src/emc/usr_intf/gmoccapy/gmoccapy.py:237 msgid "**** GMOCCAPY INI Entry **** \n" -msgstr "" +msgstr "**** GMOCCAPY INI Eintrag **** \n" -#: src/emc/usr_intf/gmoccapy/gmoccapy.py:247 -#, fuzzy +#: src/emc/usr_intf/gmoccapy/gmoccapy.py:233 msgid "user mode selected" -msgstr "Aktive Achse verfahren" +msgstr "Anwender Modus gewählt" -#: src/emc/usr_intf/gmoccapy/gmoccapy.py:252 +#: src/emc/usr_intf/gmoccapy/gmoccapy.py:238 #, python-brace-format msgid "logo entry found = {0}" -msgstr "" +msgstr "Logo Eintrag = {0} gefunden " -#: src/emc/usr_intf/gmoccapy/gmoccapy.py:257 +#: src/emc/usr_intf/gmoccapy/gmoccapy.py:243 msgid "**** GMOCCAPY INI Entry Error **** \n" -msgstr "" +msgstr "**** GMOCCAPY Fehler in INI Eintrag **** \n" -#: src/emc/usr_intf/gmoccapy/gmoccapy.py:258 +#: src/emc/usr_intf/gmoccapy/gmoccapy.py:244 msgid "Logofile entry found, but could not be converted to path.\n" msgstr "" +"Logodatei eintrag gefunden, konnte aber nicht in eine Pfad gewandelt werden\n" -#: src/emc/usr_intf/gmoccapy/gmoccapy.py:259 +#: src/emc/usr_intf/gmoccapy/gmoccapy.py:245 msgid "The file path should not contain any spaces" -msgstr "" +msgstr "Der Dateipfad darf keine Leerzeichen enthalten" -#: src/emc/usr_intf/gmoccapy/gmoccapy.py:640 -#, python-brace-format +#: src/emc/usr_intf/gmoccapy/gmoccapy.py:632 +#, fuzzy, python-brace-format msgid "Press to home all {0}" -msgstr "" +msgstr "Drücken um alle Achsen zu referenzieren" -#: src/emc/usr_intf/gmoccapy/gmoccapy.py:649 -#: src/emc/usr_intf/gmoccapy/gmoccapy.py:899 +#: src/emc/usr_intf/gmoccapy/gmoccapy.py:641 +#: src/emc/usr_intf/gmoccapy/gmoccapy.py:891 msgid "Press to display previous homing button" -msgstr "" +msgstr "Drücken um vorherige Refernzbutton zu zeigen" -#: src/emc/usr_intf/gmoccapy/gmoccapy.py:667 +#: src/emc/usr_intf/gmoccapy/gmoccapy.py:659 #, python-brace-format msgid "Press to home {0} {1}" -msgstr "" +msgstr "Drücken um zu referenzieren {0} {1}" -#: src/emc/usr_intf/gmoccapy/gmoccapy.py:680 -#: src/emc/usr_intf/gmoccapy/gmoccapy.py:923 +#: src/emc/usr_intf/gmoccapy/gmoccapy.py:672 +#: src/emc/usr_intf/gmoccapy/gmoccapy.py:915 msgid "Press to display next homing button" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.py:695 +#: src/emc/usr_intf/gmoccapy/gmoccapy.py:687 #, python-brace-format msgid "Press to unhome all {0}" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.py:701 -#: src/emc/usr_intf/gmoccapy/gmoccapy.py:959 +#: src/emc/usr_intf/gmoccapy/gmoccapy.py:693 +#: src/emc/usr_intf/gmoccapy/gmoccapy.py:951 msgid "Press to return to main button list" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.py:731 -#: src/emc/usr_intf/gmoccapy/gmoccapy.py:1795 -#: src/emc/usr_intf/gmoccapy/gmoccapy.py:2026 +#: src/emc/usr_intf/gmoccapy/gmoccapy.py:723 +#: src/emc/usr_intf/gmoccapy/gmoccapy.py:1801 +#: src/emc/usr_intf/gmoccapy/gmoccapy.py:2042 msgid "**** GMOCCAPY ERROR ****\n" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.py:732 +#: src/emc/usr_intf/gmoccapy/gmoccapy.py:724 #, python-brace-format msgid "" "**** could not resolv the image path '{0}' given for macro button '{1}' ****" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.py:888 +#: src/emc/usr_intf/gmoccapy/gmoccapy.py:880 msgid "" " edit\n" "offsets" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.py:890 +#: src/emc/usr_intf/gmoccapy/gmoccapy.py:882 msgid "Press to edit the offsets" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.py:910 +#: src/emc/usr_intf/gmoccapy/gmoccapy.py:902 #, python-brace-format msgid "Press to set touch off value for axis {0}" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.py:936 +#: src/emc/usr_intf/gmoccapy/gmoccapy.py:928 msgid "" "zero\n" " G92" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.py:938 +#: src/emc/usr_intf/gmoccapy/gmoccapy.py:930 msgid "Press to reset all G92 offsets" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.py:944 +#: src/emc/usr_intf/gmoccapy/gmoccapy.py:936 msgid "" " Block\n" "Height" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.py:946 +#: src/emc/usr_intf/gmoccapy/gmoccapy.py:938 msgid "Press to enter new value for block height" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.py:951 +#: src/emc/usr_intf/gmoccapy/gmoccapy.py:943 msgid "" " set\n" "selected" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.py:953 +#: src/emc/usr_intf/gmoccapy/gmoccapy.py:945 msgid "Press to set the selected coordinate system to be the active one" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.py:974 -#: src/emc/usr_intf/gmoccapy/gmoccapy.py:990 +#: src/emc/usr_intf/gmoccapy/gmoccapy.py:966 +#: src/emc/usr_intf/gmoccapy/gmoccapy.py:982 #: src/emc/usr_intf/gmoccapy/gmoccapy.py:1127 -#: src/emc/usr_intf/gmoccapy/gmoccapy.py:1699 -#: src/emc/usr_intf/gmoccapy/gmoccapy.py:1857 -#: src/emc/usr_intf/gmoccapy/gmoccapy.py:1870 -#: src/emc/usr_intf/gmoccapy/gmoccapy.py:1880 -#: src/emc/usr_intf/gmoccapy/gmoccapy.py:1941 -#: src/emc/usr_intf/gmoccapy/gmoccapy.py:1948 -#: src/emc/usr_intf/gmoccapy/gmoccapy.py:1951 +#: src/emc/usr_intf/gmoccapy/gmoccapy.py:1700 +#: src/emc/usr_intf/gmoccapy/gmoccapy.py:1863 +#: src/emc/usr_intf/gmoccapy/gmoccapy.py:1876 +#: src/emc/usr_intf/gmoccapy/gmoccapy.py:1886 +#: src/emc/usr_intf/gmoccapy/gmoccapy.py:1957 +#: src/emc/usr_intf/gmoccapy/gmoccapy.py:1964 +#: src/emc/usr_intf/gmoccapy/gmoccapy.py:1967 msgid "**** GMOCCAPY INFO ****" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.py:975 +#: src/emc/usr_intf/gmoccapy/gmoccapy.py:967 msgid "**** no valid probe config in INI File ****" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.py:976 +#: src/emc/usr_intf/gmoccapy/gmoccapy.py:968 msgid "**** disabled tool measurement ****" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.py:991 +#: src/emc/usr_intf/gmoccapy/gmoccapy.py:983 msgid "**** found valid probe config in INI File ****" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.py:992 +#: src/emc/usr_intf/gmoccapy/gmoccapy.py:984 msgid "**** will use auto tool measurement ****" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.py:1007 +#: src/emc/usr_intf/gmoccapy/gmoccapy.py:999 msgid "**** GMOCCAPY build_GUI INFO ****" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.py:1008 +#: src/emc/usr_intf/gmoccapy/gmoccapy.py:1000 msgid "**** To many increments given in INI File for this screen ****" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.py:1009 +#: src/emc/usr_intf/gmoccapy/gmoccapy.py:1001 msgid "**** Only the first 10 will be reachable through this screen ****" msgstr "" @@ -18591,347 +18666,344 @@ msgstr "" msgid "Press to display the virtual keyboard" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.py:1355 +#: src/emc/usr_intf/gmoccapy/gmoccapy.py:1350 msgid "***** GMOCCAPY ERROR *****" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.py:1356 +#: src/emc/usr_intf/gmoccapy/gmoccapy.py:1351 msgid "this is not a lathe, as a lathe must have at least\n" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.py:1357 +#: src/emc/usr_intf/gmoccapy/gmoccapy.py:1352 msgid "an X and an Z axis\n" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.py:1358 +#: src/emc/usr_intf/gmoccapy/gmoccapy.py:1353 msgid "Wrong lathe configuration, we will leave here" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.py:1359 -#: src/emc/usr_intf/gmoccapy/gmoccapy.py:1798 -#: src/emc/usr_intf/gmoccapy/gmoccapy.py:2029 +#: src/emc/usr_intf/gmoccapy/gmoccapy.py:1354 +#: src/emc/usr_intf/gmoccapy/gmoccapy.py:1804 +#: src/emc/usr_intf/gmoccapy/gmoccapy.py:2045 msgid "Very critical situation" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.py:1509 +#: src/emc/usr_intf/gmoccapy/gmoccapy.py:1504 msgid "***** GMOCCAPY INFO *****" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.py:1510 +#: src/emc/usr_intf/gmoccapy/gmoccapy.py:1505 #, fuzzy msgid "this is not a usual config\n" msgstr "Achse reagiert nicht" -#: src/emc/usr_intf/gmoccapy/gmoccapy.py:1511 +#: src/emc/usr_intf/gmoccapy/gmoccapy.py:1506 msgid "we miss one of X , Y or Z axis\n" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.py:1512 +#: src/emc/usr_intf/gmoccapy/gmoccapy.py:1507 msgid "We will use by axisletter ordered jog button" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.py:1676 -#: src/emc/usr_intf/gmoccapy/gmoccapy.py:2688 +#: src/emc/usr_intf/gmoccapy/gmoccapy.py:1673 +#: src/emc/usr_intf/gmoccapy/gmoccapy.py:2712 #, fuzzy msgid "mm/min" msgstr "mm/min " -#: src/emc/usr_intf/gmoccapy/gmoccapy.py:1679 -#: src/emc/usr_intf/gmoccapy/gmoccapy.py:2691 +#: src/emc/usr_intf/gmoccapy/gmoccapy.py:1676 +#: src/emc/usr_intf/gmoccapy/gmoccapy.py:2715 #, fuzzy msgid "inch/min" msgstr "Zoll / min" -#: src/emc/usr_intf/gmoccapy/gmoccapy.py:1700 +#: src/emc/usr_intf/gmoccapy/gmoccapy.py:1701 msgid "**** Invalid embedded tab configuration ****" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.py:1701 +#: src/emc/usr_intf/gmoccapy/gmoccapy.py:1702 msgid "**** No tabs will be added! ****" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.py:1714 +#: src/emc/usr_intf/gmoccapy/gmoccapy.py:1719 msgid "ERROR, trying to initialize the user tabs or panels, check for typos" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.py:1796 +#: src/emc/usr_intf/gmoccapy/gmoccapy.py:1802 msgid "**** Did not find a toolfile file in [EMCIO] TOOL_TABLE ****" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.py:1858 +#: src/emc/usr_intf/gmoccapy/gmoccapy.py:1864 msgid "**** audio available! ****" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.py:1871 +#: src/emc/usr_intf/gmoccapy/gmoccapy.py:1877 msgid "**** no audio available! ****" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.py:1872 +#: src/emc/usr_intf/gmoccapy/gmoccapy.py:1878 msgid "**** PYGST libray not installed? ****" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.py:1873 +#: src/emc/usr_intf/gmoccapy/gmoccapy.py:1879 msgid "**** is python-gstX.XX installed? ****" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.py:1881 +#: src/emc/usr_intf/gmoccapy/gmoccapy.py:1887 msgid "**** Entering init gremlin ****" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.py:1901 -#: src/emc/usr_intf/gmoccapy/gmoccapy.py:4752 +#: src/emc/usr_intf/gmoccapy/gmoccapy.py:1907 +#: src/emc/usr_intf/gmoccapy/gmoccapy.py:4804 #, fuzzy msgid "" " Joint\n" "mode" msgstr "Gelenk-Modus" -#: src/emc/usr_intf/gmoccapy/gmoccapy.py:1942 +#: src/emc/usr_intf/gmoccapy/gmoccapy.py:1958 msgid "**** virtual keyboard program found : " msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.py:1949 +#: src/emc/usr_intf/gmoccapy/gmoccapy.py:1965 msgid "**** virtual keyboard program found : " msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.py:1952 +#: src/emc/usr_intf/gmoccapy/gmoccapy.py:1968 msgid "" "**** No virtual keyboard installed, we checked for and ." msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.py:1963 -#: src/emc/usr_intf/gmoccapy/gmoccapy.py:3132 -#: src/emc/usr_intf/gmoccapy/gmoccapy.py:3142 +#: src/emc/usr_intf/gmoccapy/gmoccapy.py:1979 +#: src/emc/usr_intf/gmoccapy/gmoccapy.py:3156 +#: src/emc/usr_intf/gmoccapy/gmoccapy.py:3166 msgid "**** GMOCCAPY ERROR ****" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.py:1964 +#: src/emc/usr_intf/gmoccapy/gmoccapy.py:1980 msgid "**** Error with launching virtual keyboard," msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.py:1965 +#: src/emc/usr_intf/gmoccapy/gmoccapy.py:1981 msgid "**** is onboard or matchbox-keyboard installed? ****" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.py:1997 -#: src/emc/usr_intf/gmoccapy/gmoccapy.py:2812 +#: src/emc/usr_intf/gmoccapy/gmoccapy.py:2013 +#: src/emc/usr_intf/gmoccapy/gmoccapy.py:2836 msgid "interrupt running macro" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.py:2027 +#: src/emc/usr_intf/gmoccapy/gmoccapy.py:2043 msgid "**** Did not find a parameter file in [RS274NGC] PARAMETER_FILE ****" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.py:2097 +#: src/emc/usr_intf/gmoccapy/gmoccapy.py:2113 msgid "Select the file you want to be loaded at program start" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.py:2131 -#: src/emc/usr_intf/gmoccapy/gmoccapy.py:2155 +#: src/emc/usr_intf/gmoccapy/gmoccapy.py:2147 +#: src/emc/usr_intf/gmoccapy/gmoccapy.py:2171 #, python-brace-format msgid "**** GMOCCAPY ERROR **** /n Message type {0} not supported" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.py:2268 +#: src/emc/usr_intf/gmoccapy/gmoccapy.py:2284 msgid "Unknown error type and no error text given" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.py:2282 +#: src/emc/usr_intf/gmoccapy/gmoccapy.py:2298 msgid "Important Warning" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.py:2302 -msgid "ERROR : External ESTOP is set, could not change state!" +#: src/emc/usr_intf/gmoccapy/gmoccapy.py:2318 +msgid "External ESTOP is set, could not change state!" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.py:2315 -msgid "ERROR : Could not switch the machine on, is limit switch activated?" +#: src/emc/usr_intf/gmoccapy/gmoccapy.py:2331 +msgid "Could not switch the machine on, is limit switch activated?" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.py:2578 +#: src/emc/usr_intf/gmoccapy/gmoccapy.py:2602 msgid "It is not possible to change to MDI Mode at the moment" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.py:2610 +#: src/emc/usr_intf/gmoccapy/gmoccapy.py:2634 msgid "It is not possible to change to Auto Mode at the moment" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.py:2771 +#: src/emc/usr_intf/gmoccapy/gmoccapy.py:2795 msgid "Enter value:" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.py:2772 +#: src/emc/usr_intf/gmoccapy/gmoccapy.py:2796 #, fuzzy, python-brace-format msgid "Set parameter {0} to:" msgstr "Noch keine Parameter" -#: src/emc/usr_intf/gmoccapy/gmoccapy.py:2774 +#: src/emc/usr_intf/gmoccapy/gmoccapy.py:2798 #, fuzzy msgid "conversion error" msgstr "Unbekannter Fehler" -#: src/emc/usr_intf/gmoccapy/gmoccapy.py:2775 -#: src/emc/usr_intf/gmoccapy/gmoccapy.py:4455 -#: src/emc/usr_intf/gmoccapy/gmoccapy.py:4478 +#: src/emc/usr_intf/gmoccapy/gmoccapy.py:2799 +#: src/emc/usr_intf/gmoccapy/gmoccapy.py:4501 +#: src/emc/usr_intf/gmoccapy/gmoccapy.py:4524 msgid "Conversion error !" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.py:2810 +#: src/emc/usr_intf/gmoccapy/gmoccapy.py:2834 msgid "This button will show or hide the keyboard" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.py:2918 +#: src/emc/usr_intf/gmoccapy/gmoccapy.py:2942 #, fuzzy msgid "Mode change is only allowed if the interpreter is idle!" msgstr "" "%s kann im automatischen Modus nicht ausgeführt werden, wenn der Interpreter " "stillsteht" -#: src/emc/usr_intf/gmoccapy/gmoccapy.py:3133 +#: src/emc/usr_intf/gmoccapy/gmoccapy.py:3157 #, python-brace-format msgid "**** {0} ****" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.py:3143 +#: src/emc/usr_intf/gmoccapy/gmoccapy.py:3167 #, python-brace-format msgid "**** No widget named: {0} to sensitize ****" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.py:3305 -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:1671 +#: src/emc/usr_intf/gmoccapy/gmoccapy.py:3329 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:3163 #, fuzzy msgid "No tool description available" msgstr "Es ist keine Beschreibung verfügbar." -#: src/emc/usr_intf/gmoccapy/gmoccapy.py:3426 +#: src/emc/usr_intf/gmoccapy/gmoccapy.py:3470 #, python-brace-format msgid "Halo, welcome to the test message {0}" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.py:3522 +#: src/emc/usr_intf/gmoccapy/gmoccapy.py:3566 msgid "Hal Pin is low, Access denied" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.py:3524 +#: src/emc/usr_intf/gmoccapy/gmoccapy.py:3568 msgid "wrong code entered, Access denied" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.py:3525 +#: src/emc/usr_intf/gmoccapy/gmoccapy.py:3569 msgid "Just to warn you" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.py:3628 -msgid "ERROR : No limit switch is active, ignore limits will not be set." -msgstr "" - -#: src/emc/usr_intf/gmoccapy/gmoccapy.py:3677 +#: src/emc/usr_intf/gmoccapy/gmoccapy.py:3710 #, fuzzy msgid "Classicladder real-time component not detected" msgstr "Echtzeicht-Komponente nicht geladen" -#: src/emc/usr_intf/gmoccapy/gmoccapy.py:3792 +#: src/emc/usr_intf/gmoccapy/gmoccapy.py:3825 #, python-brace-format msgid "Something went wrong, we have an unknown spindle widget {0}" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.py:3903 +#: src/emc/usr_intf/gmoccapy/gmoccapy.py:3936 msgid "Do you really want to delete the MDI history?\n" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.py:3904 +#: src/emc/usr_intf/gmoccapy/gmoccapy.py:3937 msgid "this will not delete the MDI History file, but will\n" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.py:3905 +#: src/emc/usr_intf/gmoccapy/gmoccapy.py:3938 msgid "delete the listbox entries for this session" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.py:3906 +#: src/emc/usr_intf/gmoccapy/gmoccapy.py:3939 +#: src/emc/usr_intf/gmoccapy/gmoccapy.py:3987 msgid "Attention!!" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.py:4024 +#: src/emc/usr_intf/gmoccapy/gmoccapy.py:4064 #, fuzzy msgid "Enter value for diameter" msgstr "" "Angabe eines nicht-ganzzahligen Wertes, obwohl eine Ganzzahl erwartet wurde" -#: src/emc/usr_intf/gmoccapy/gmoccapy.py:4025 +#: src/emc/usr_intf/gmoccapy/gmoccapy.py:4065 #, fuzzy msgid "Set diameter to:" msgstr " Durchmesser" -#: src/emc/usr_intf/gmoccapy/gmoccapy.py:4028 +#: src/emc/usr_intf/gmoccapy/gmoccapy.py:4068 #, fuzzy msgid "Enter value for radius" msgstr "" "Angabe eines nicht-ganzzahligen Wertes, obwohl eine Ganzzahl erwartet wurde" -#: src/emc/usr_intf/gmoccapy/gmoccapy.py:4029 +#: src/emc/usr_intf/gmoccapy/gmoccapy.py:4069 #, fuzzy msgid "Set radius to:" msgstr " Radius" -#: src/emc/usr_intf/gmoccapy/gmoccapy.py:4032 +#: src/emc/usr_intf/gmoccapy/gmoccapy.py:4072 #, fuzzy, python-brace-format msgid "Enter value for axis {0}" msgstr "" "Angabe eines nicht-ganzzahligen Wertes, obwohl eine Ganzzahl erwartet wurde" -#: src/emc/usr_intf/gmoccapy/gmoccapy.py:4033 +#: src/emc/usr_intf/gmoccapy/gmoccapy.py:4073 #, fuzzy, python-brace-format msgid "Set axis {0} to:" msgstr "Achsenwert festlegen:" -#: src/emc/usr_intf/gmoccapy/gmoccapy.py:4037 +#: src/emc/usr_intf/gmoccapy/gmoccapy.py:4077 msgid "Conversion error in btn_set_value" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.py:4038 +#: src/emc/usr_intf/gmoccapy/gmoccapy.py:4078 msgid "Conversion error in btn_set_value!" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.py:4039 +#: src/emc/usr_intf/gmoccapy/gmoccapy.py:4079 msgid "Please enter only numerical values. Values have not been applied" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.py:4053 +#: src/emc/usr_intf/gmoccapy/gmoccapy.py:4093 msgid "" "you did not selected a system to be changed to, so nothing will be changed" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.py:4054 -#: src/emc/usr_intf/gmoccapy/gmoccapy.py:4484 -#: src/emc/usr_intf/gmoccapy/gmoccapy.py:4498 -#: src/emc/usr_intf/gmoccapy/gmoccapy.py:4502 -#: src/emc/usr_intf/gmoccapy/gmoccapy.py:4517 +#: src/emc/usr_intf/gmoccapy/gmoccapy.py:4094 +#: src/emc/usr_intf/gmoccapy/gmoccapy.py:4530 +#: src/emc/usr_intf/gmoccapy/gmoccapy.py:4544 +#: src/emc/usr_intf/gmoccapy/gmoccapy.py:4548 +#: src/emc/usr_intf/gmoccapy/gmoccapy.py:4563 msgid "Important Warning!" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.py:4104 +#: src/emc/usr_intf/gmoccapy/gmoccapy.py:4144 msgid "Enter the block height" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.py:4105 +#: src/emc/usr_intf/gmoccapy/gmoccapy.py:4145 msgid "Block height measured from base table" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.py:4117 +#: src/emc/usr_intf/gmoccapy/gmoccapy.py:4157 msgid "Conversion error in btn_block_height!" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.py:4118 +#: src/emc/usr_intf/gmoccapy/gmoccapy.py:4158 msgid "" "Please enter only numerical values\n" "Values have not been applied" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.py:4377 +#: src/emc/usr_intf/gmoccapy/gmoccapy.py:4423 msgid "Please remove the mounted tool and press OK when done" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.py:4380 +#: src/emc/usr_intf/gmoccapy/gmoccapy.py:4426 #, python-brace-format msgid "" "Please change to tool\n" @@ -18941,164 +19013,164 @@ msgid "" " then click OK." msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.py:4381 +#: src/emc/usr_intf/gmoccapy/gmoccapy.py:4427 #, fuzzy msgid "Manual Tool change" msgstr "AXIS Manueller Werkzeugwechsel" -#: src/emc/usr_intf/gmoccapy/gmoccapy.py:4390 +#: src/emc/usr_intf/gmoccapy/gmoccapy.py:4436 msgid "Tool Change has been aborted!\n" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.py:4391 +#: src/emc/usr_intf/gmoccapy/gmoccapy.py:4437 msgid "The old tool will remain set!" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.py:4399 +#: src/emc/usr_intf/gmoccapy/gmoccapy.py:4445 msgid "You are trying to delete the tool mounted in the spindle\n" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.py:4400 +#: src/emc/usr_intf/gmoccapy/gmoccapy.py:4446 msgid "This is not allowed, please change tool prior to delete it" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.py:4401 +#: src/emc/usr_intf/gmoccapy/gmoccapy.py:4447 msgid "Warning Tool can not be deleted!" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.py:4420 +#: src/emc/usr_intf/gmoccapy/gmoccapy.py:4466 msgid "No or more than one tool selected in tool table" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.py:4421 +#: src/emc/usr_intf/gmoccapy/gmoccapy.py:4467 msgid "Please select only one tool in the table" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.py:4422 -#: src/emc/usr_intf/gmoccapy/gmoccapy.py:4428 -#: src/emc/usr_intf/gmoccapy/gmoccapy.py:4436 +#: src/emc/usr_intf/gmoccapy/gmoccapy.py:4468 +#: src/emc/usr_intf/gmoccapy/gmoccapy.py:4474 +#: src/emc/usr_intf/gmoccapy/gmoccapy.py:4482 msgid "Warning Tool Touch off not possible!" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.py:4426 +#: src/emc/usr_intf/gmoccapy/gmoccapy.py:4472 msgid "you can not touch of a tool, witch is not mounted in the spindle" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.py:4427 +#: src/emc/usr_intf/gmoccapy/gmoccapy.py:4473 msgid "your selection has been reseted to the tool in spindle" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.py:4434 +#: src/emc/usr_intf/gmoccapy/gmoccapy.py:4480 #, fuzzy msgid "" "Tool touch off is not possible with cutter radius compensation switched on!\n" msgstr "Ebene kann nicht bei aktiver Werkzeugradiuskorrektur gewechselt werden" -#: src/emc/usr_intf/gmoccapy/gmoccapy.py:4435 +#: src/emc/usr_intf/gmoccapy/gmoccapy.py:4481 msgid "Please emit an G40 before tool touch off" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.py:4444 +#: src/emc/usr_intf/gmoccapy/gmoccapy.py:4490 msgid "Real big error!" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.py:4445 +#: src/emc/usr_intf/gmoccapy/gmoccapy.py:4491 msgid "" "You managed to come to a place that is not possible in on_btn_tool_touchoff" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.py:4449 +#: src/emc/usr_intf/gmoccapy/gmoccapy.py:4495 #, python-brace-format msgid "Enter value for axis {0} to set:" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.py:4450 +#: src/emc/usr_intf/gmoccapy/gmoccapy.py:4496 #, python-brace-format msgid "Set parameter of tool {0:d} and axis {1} to:" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.py:4454 +#: src/emc/usr_intf/gmoccapy/gmoccapy.py:4500 #, python-brace-format msgid "Conversion error because of wrong entry for touch off axis {0}" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.py:4473 +#: src/emc/usr_intf/gmoccapy/gmoccapy.py:4519 msgid "Enter the tool number as integer " msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.py:4474 +#: src/emc/usr_intf/gmoccapy/gmoccapy.py:4520 #, fuzzy msgid "Select the tool to change" msgstr "Element zum Anzeigen auswählen" -#: src/emc/usr_intf/gmoccapy/gmoccapy.py:4476 +#: src/emc/usr_intf/gmoccapy/gmoccapy.py:4522 msgid "Conversion error because of wrong entry for tool number\n" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.py:4477 +#: src/emc/usr_intf/gmoccapy/gmoccapy.py:4523 msgid "enter only integer numbers" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.py:4483 -#: src/emc/usr_intf/gmoccapy/gmoccapy.py:4501 +#: src/emc/usr_intf/gmoccapy/gmoccapy.py:4529 +#: src/emc/usr_intf/gmoccapy/gmoccapy.py:4547 msgid "Selected tool is already in spindle, no change needed." msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.py:4497 +#: src/emc/usr_intf/gmoccapy/gmoccapy.py:4543 msgid "" "you selected no or more than one tool, the tool selection must be unique" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.py:4516 +#: src/emc/usr_intf/gmoccapy/gmoccapy.py:4562 msgid "Could not understand the entered tool number. Will not change anything" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.py:4757 +#: src/emc/usr_intf/gmoccapy/gmoccapy.py:4809 #, fuzzy msgid "" "World\n" "mode" msgstr "World-Modus" -#: src/emc/usr_intf/gmoccapy/gmoccapy.py:4943 +#: src/emc/usr_intf/gmoccapy/gmoccapy.py:4995 msgid "Axis jogging is only allowed in world mode, but you are in joint mode!" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.py:4979 +#: src/emc/usr_intf/gmoccapy/gmoccapy.py:5031 #, python-brace-format msgid "Recieved a not clasified signal from pin {0}" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.py:4984 +#: src/emc/usr_intf/gmoccapy/gmoccapy.py:5036 #, python-brace-format msgid "Could not translate {0} to number" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.py:4989 +#: src/emc/usr_intf/gmoccapy/gmoccapy.py:5041 #, fuzzy msgid "no button here" msgstr "Aktive Achse verfahren" -#: src/emc/usr_intf/gmoccapy/gmoccapy.py:4992 +#: src/emc/usr_intf/gmoccapy/gmoccapy.py:5044 msgid "the button is not sensitive" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.py:4997 +#: src/emc/usr_intf/gmoccapy/gmoccapy.py:5049 #, python-brace-format msgid "Button {0} has been toggled" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.py:5001 +#: src/emc/usr_intf/gmoccapy/gmoccapy.py:5053 #, python-brace-format msgid "Button {0} has been pressed" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.py:5004 +#: src/emc/usr_intf/gmoccapy/gmoccapy.py:5056 #, python-brace-format msgid "Button {0} has been clicked" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.py:5017 +#: src/emc/usr_intf/gmoccapy/gmoccapy.py:5069 msgid "got wrong location to locate the childs" msgstr "" @@ -19132,54 +19204,54 @@ msgid "" "\n" msgstr "" -#: src/emc/usr_intf/gmoccapy/getiniinfo.py:402 +#: src/emc/usr_intf/gmoccapy/getiniinfo.py:433 msgid "**** GMOCCAPY GETINIINFO ****\n" msgstr "" -#: src/emc/usr_intf/gmoccapy/getiniinfo.py:403 +#: src/emc/usr_intf/gmoccapy/getiniinfo.py:434 msgid "" "**** No subroutine folder or program prefix is given in the ini file **** \n" msgstr "" #: src/emc/usr_intf/gmoccapy/notification.py:205 -#, python-format -msgid "Error trying to delet the message with number %s" +#, python-brace-format +msgid "Error trying to delet the message with number {0}" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:426 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:423 msgid "left rotate, middle move, right zoom" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:430 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:427 msgid "left zoom, middle move, right rotate" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:434 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:431 msgid "left move, middle rotate, right zoom" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:438 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:435 msgid "left zoom, middle rotate, right move" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:442 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:439 msgid "left move, middle zoom, right rotate" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:446 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:443 msgid "left rotate, middle zoom, right move" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:535 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:538 #, fuzzy msgid "No Program loaded" msgstr "Programmdatei" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:579 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:582 msgid "blockheight = 0.0" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:613 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:616 #, fuzzy msgid "clear plot" msgstr "Werkzeugpfad löschen" @@ -19189,488 +19261,492 @@ msgstr "Werkzeugpfad löschen" msgid "view perspective" msgstr "Perspektivische Ansicht" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:701 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:700 msgid "view along the X axis from positive to negative" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:728 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:726 msgid "view along the Y axis from positive to negative" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:755 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:752 msgid "view along the Z axis from positive to negative" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:784 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:780 msgid "Show or hide tool path" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:809 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:804 msgid "Show or hide dimensions" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:834 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:828 msgid "" "view along the Y axis from positive to negative as viewn for a back tool " "lathe" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:902 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:895 #, fuzzy msgid "Offset Page" msgstr "Offset-Wert " -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:922 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:915 #, fuzzy msgid "Tooledit" msgstr "Werkzeuge" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:946 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:939 #, fuzzy msgid "File Selection" msgstr "Achsenauswahl" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:1208 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:2100 msgid "jog axes" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:1294 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:2786 #, fuzzy msgid "jog joints" msgstr "Achse/Gelenk" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:1315 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:2807 msgid "Logo" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:1331 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:2823 #, fuzzy msgid "Ignore limits" msgstr "Grenzw. aufheben" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:1399 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:2890 #, fuzzy msgid "Jogging" msgstr "Referenzfahrt" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:1529 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:3021 msgid "Information over the tool in spindle" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:1550 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:3042 #, fuzzy msgid "Tool no." msgstr "Werkzeug-Info" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:1578 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:3070 #, fuzzy msgid "Diameter" msgstr "Durchmesser:" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:1609 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:3101 #, fuzzy msgid "offset z" msgstr "Offsets" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:1640 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:3132 #, fuzzy msgid "offset x" msgstr "Offsets" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:1688 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:3180 msgid "Vc= 0.00" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:1705 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:3197 #, fuzzy msgid "Tool information" msgstr "Konfiguration" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:1720 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:3212 msgid "G and M code information as well as speed and feed" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:1743 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:3235 #, fuzzy msgid "active_mcodes_label" msgstr "Aktive Codes:" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:1806 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:3298 #, fuzzy msgid "active_gcodes_label" msgstr "Aktive Codes:" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:1870 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:3362 #, fuzzy msgid "G-Code" msgstr "Leistung" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:1972 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:3462 #, fuzzy msgid "Cooling" msgstr "Kühlflüssigkeit" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:2283 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:3769 #, fuzzy msgid "Spindle [rpm]" msgstr "Spindel" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:2370 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:3856 msgid "Vel." msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:2389 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:3875 msgid "Displays the current velocity" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:2438 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:3924 #, fuzzy msgid "Rapid Override" msgstr "Eilgangübersteuerung:" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:2477 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:3962 msgid "Displayes the programmed feed rate" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:2500 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:3985 #, fuzzy msgid "reset feed override to 100 %" msgstr "Vorschubübersteuerung von 0% bis 100%" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:2542 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:4026 #, fuzzy msgid "Feed Override" msgstr "Externe Vorschubübersteuerung" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:2644 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:4127 #, fuzzy msgid "" "Search\n" " back" msgstr "Suchpfad" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:2662 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:4144 #, fuzzy msgid "" "Search\n" " fwd" msgstr "Suchpfad" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:2770 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:4248 msgid "Replace" msgstr "Ersetzen" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:2909 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:4386 msgid "Start as fullscreen" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:2926 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:4402 msgid "Start maximized" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:2943 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:4418 msgid "Start as window" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:2971 -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:4894 -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:5549 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:4445 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:6358 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:7008 #, fuzzy msgid "X Pos." msgstr " Pos " -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:2985 -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:4906 -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:5533 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:4459 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:6370 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:6992 #, fuzzy msgid "Y Pos." msgstr " Pos " -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:3001 -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:5451 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:4475 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:6911 msgid "Width" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:3017 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:4491 msgid "Height" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:3125 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:4599 msgid "hide cursor" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:3148 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:4615 +msgid "hide tooltips" +msgstr "" + +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:4636 #, fuzzy msgid "Main Window" msgstr "Maschinen-Grundlagen" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:3178 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:4666 #, fuzzy msgid "Show keyboard on offset" msgstr "_Offsets anzeigen" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:3195 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:4682 msgid "Show keyboard on tooledit" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:3212 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:4698 msgid "Show keyboard on MDI" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:3229 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:4714 msgid "Show keyboard on EDIT" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:3246 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:4730 msgid "Show keyboard on load file" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:3268 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:4751 #, fuzzy msgid "Keyboard" msgstr "Leistung" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:3299 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:4782 #, fuzzy msgid "show preview" msgstr "Vorschau" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:3316 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:4798 #, fuzzy msgid "show offsets" msgstr "_Offsets anzeigen" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:3338 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:4819 msgid "On Touch off" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:3387 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:4880 #, fuzzy msgid "Relative Color" msgstr "Relative Textfarbe" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:3416 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:4908 #, fuzzy msgid "Absolute Color" msgstr "Absolut" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:3449 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:4940 #, fuzzy msgid "DTG Color" msgstr "DTG-Textfarbe" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:3493 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:4983 #, fuzzy msgid "Homed color" msgstr "Referenzfahrt" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:3508 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:4998 #, fuzzy msgid "Unhomed color" msgstr "Referenzfahrt aufheben bei allen Achsen" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:3613 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:5101 #, fuzzy msgid "Digits" msgstr "Digital" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:3663 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:5151 msgid "" "toggle DRO mode \n" "clicking on the DRO" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:3702 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:5177 #, fuzzy msgid "DRO" msgstr " a)" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:3739 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:5214 #, fuzzy msgid "Grid size" msgstr "Größe" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:3776 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:5251 #, fuzzy msgid "Show DRO" msgstr "Anzeigen" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:3792 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:5266 #, fuzzy msgid "Show offsets" msgstr "_Offsets anzeigen" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:3808 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:5281 #, fuzzy msgid "Show DTG" msgstr "Anzeigen" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:3838 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:5310 #, fuzzy msgid "Mouse Button mode" msgstr "Bewegungsdaten" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:3878 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:5350 #, fuzzy msgid "Preview" msgstr "Seite" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:3937 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:5409 #, fuzzy msgid "" "current\n" " file" msgstr "in der aktuellen Unterdatei" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:3986 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:5456 msgid "File to load on start" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:4016 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:5486 #, fuzzy msgid "Select user dir" msgstr "Schrittgeschwindigkeit auswählen" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:4026 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:5496 #, fuzzy msgid "Select jump to dir" msgstr "Element zum Anzeigen auswählen" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:4156 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:5626 #, fuzzy msgid "Themes and sound" msgstr "Standardeinstellungen und Optionen" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:4193 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:5663 msgid "Appearance" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:4233 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:5703 #, fuzzy msgid "Scale rapid override" msgstr "Spindelübersteuerung" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:4249 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:5719 #, fuzzy msgid "Scale jog velocity" msgstr "Geschwi_ndigkeit anzeigen" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:4263 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:5733 #, fuzzy msgid "Scale feed override" msgstr "Vorschubübersteuerung:" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:4279 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:5749 #, fuzzy msgid "Scale spindle override" msgstr "Spindelübersteuerung" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:4382 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:5852 #, fuzzy msgid "Hardware MPG Scale" msgstr "Schrittmotor-Skala" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:4408 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:5878 msgid "Use keyboard shortcuts" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:4423 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:5892 msgid "Keyboard shortcuts" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:4453 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:5922 msgid "Use unlock code" msgstr "" # Anmerkung:FJ: Hmmmm .... -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:4470 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:5938 #, fuzzy msgid "Do not use unlock code" msgstr "Das Koordinaten-Wort C kann hier nicht verwendet werden" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:4487 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:5954 msgid "Use hal pin to unlock" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:4510 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:5976 #, fuzzy msgid "Unlock settings" msgstr "Werkzeugeinstellung" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:4631 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:6097 #, fuzzy msgid "Spindle bar min" msgstr "Spindelbremse an" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:4645 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:6111 #, fuzzy msgid "Spindle bar max" msgstr "Spindelbremse" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:4692 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:6158 msgid "Hide turtle Jog Button" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:4729 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:6194 msgid "Turtle jog Factor" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:4770 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:6235 #, fuzzy msgid "Turtle Jog" msgstr "Frontend" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:4817 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:6282 msgid "Hardware" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:4855 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:6320 msgid "Use auto tool measurement" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:4920 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:6384 #, fuzzy msgid "Probe Height" msgstr "Sensor" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:4958 -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:4972 -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:5003 -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:5034 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:6422 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:6436 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:6467 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:6498 msgid "0.000" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:4989 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:6453 #, fuzzy msgid "Z Pos." msgstr " Pos " -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:5020 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:6484 #, fuzzy msgid "Max. Probe" msgstr "Sensor" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:5054 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:6518 #, fuzzy msgid "Probe Informations" msgstr "Programmoptionen" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:5090 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:6554 #, fuzzy msgid "Search Vel." msgstr "Suchpfad" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:5102 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:6566 #, fuzzy msgid "Probe Vel." msgstr "Sensor" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:5163 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:6627 #, fuzzy msgid "Probe velocitys" msgstr "GUI-Frontend-Liste" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:5178 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:6642 msgid "" "No valid configuration\n" "found in your INI file,\n" @@ -19679,17 +19755,17 @@ msgid "" "to configure the settings." msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:5199 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:6663 #, fuzzy msgid "Tool Measurement" msgstr "Kühlflüssigkeit" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:5229 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:6693 #, fuzzy msgid "Reload Tool on Start" msgstr "Werkzeugtabelle neu laden" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:5233 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:6697 msgid "" "If checked, the tool in spindle\n" "will be saved on each change\n" @@ -19698,418 +19774,977 @@ msgid "" "length offset will be reloaded.\n" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:5254 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:6717 msgid "" "You use NO_FORCE_HOMING,\n" "so the reload of a tool at start\n" "is not possible." msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:5272 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:6735 #, fuzzy msgid "Reload Tool" msgstr "Werkzeugtabelle neu laden" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:5314 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:6777 msgid "Do not use run from line" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:5331 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:6793 #, fuzzy msgid "Use run from line" msgstr "Ab gewählter _Zeile ausführen" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:5354 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:6815 #, fuzzy msgid "Run from line" msgstr "Referenzfahrt" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:5398 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:6859 msgid "Use frames" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:5402 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:6863 msgid "" "If checked, the messages\n" "will be in a frame." msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:5435 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:6895 msgid "max." msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:5465 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:6925 msgid "The font to use" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:5481 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:6940 msgid "The maximum messages you want to be shown\t" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:5505 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:6964 msgid "The width of the messages" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:5560 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:7019 msgid "X-position in pixel from top left corner of the screen" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:5582 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:7041 msgid "Y-position in pixel from top left corner of the screen" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:5604 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:7063 msgid "Launch test message" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:5608 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:7067 msgid "" "Push here to launch a test message\n" "to test your settings." msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:5627 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:7085 msgid "" " gmoccapy message\n" " behavior and appearance " msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:5664 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:7122 #, fuzzy msgid "" "Advanced\n" " Settings" msgstr "Erweiterte Optionen" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:5705 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:7163 msgid "User tab 1" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:5720 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:7178 msgid "User tabs" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:5761 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:7219 msgid "" "Estop the machine\n" "[F1]" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:5786 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:7243 #, fuzzy msgid "" "Turn the machine on/off\n" "[F2]" msgstr "Maschine an" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:5811 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:7267 msgid "" "enter manual mode to jog axis by hand or touch off\n" "[F3]" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:5833 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:7288 msgid "" "enter MDI mode to launch g-code commands\n" "[F5]" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:5854 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:7308 #, fuzzy msgid "enter auto mode to run programs" msgstr "Serielles Modbus-Programm" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:5873 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:7326 msgid "Enter the settings page, the default code is \"123\"" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:5897 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:7349 #, fuzzy msgid "show user tabs" msgstr "Status anzeigen" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:5955 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:7406 msgid "open homing button list" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:5973 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:7423 msgid "open touch off button list" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:6004 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:7453 msgid "Open the tooleditor page" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:6050 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:7498 #, fuzzy msgid "" "World\n" "Mode" msgstr "World-Modus" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:6057 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:7505 msgid "" "Switch motion mode between Joint and World mode\n" "F12 or $ key does the same" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:6101 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:7548 msgid "make the preview as large as possible" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:6119 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:7565 msgid "Close gmoccapy / leave the program" -msgstr "" +msgstr "gmoccapy beenden" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:6208 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:7653 #, fuzzy msgid "Load a new program" msgstr "Programm neu laden" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:6247 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:7691 #, fuzzy msgid "Run the loaded program" msgstr "Programm neu laden" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:6265 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:7709 #, fuzzy msgid "Stop the running program" msgstr "Programmausführung oder Laden der" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:6283 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:7727 #, fuzzy msgid "Pause the running program" msgstr "Programmausführung oder Laden der" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:6292 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:7735 #, fuzzy msgid "pause the running program" msgstr "Programmausführung oder Laden der" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:6310 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:7754 msgid "Run the loaded program step by step" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:6327 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:7770 msgid "" "run the program from a certain line, attention, that is dangerous, because " "the previous lines will not checed!" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:6345 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:7787 msgid "" "Machine or not the optional blocks of the program. If the button is pressed, " "the optional blocks will not be machined. The button will indicate this by a " "yellow background." msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:6388 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:7828 #, fuzzy msgid "Edit the loaded program" msgstr "SPS-Programm bearbeiten" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:6532 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:7971 #, fuzzy msgid "delete MDI" msgstr "Löschen" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:6538 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:7977 #, fuzzy msgid "delete MDI history" msgstr "MDI-Verlauf leeren" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:6592 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:8030 msgid "Cl.-ladder" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:6598 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:8036 #, fuzzy msgid "Open classicladder" msgstr "SPS (Classicladder) einbinden" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:6610 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:8047 #, fuzzy msgid "Hal-Scope" msgstr "HAL-Scope" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:6616 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:8053 #, fuzzy msgid "launch hal scope" msgstr "%s starten" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:6634 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:8070 msgid "launch linuxcnc status" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:6652 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:8087 msgid "launch hal meter" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:6671 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:8105 #, fuzzy msgid "launch calibration" msgstr "_Kalibrierung" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:6683 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:8116 msgid "Halshow" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:6689 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:8122 msgid "opens the show hal tool" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:6759 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:8192 msgid "save the file using the original name" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:6782 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:8215 msgid "save the file with a new name" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:6831 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:8263 msgid "clear the edit field and make a new file" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:6870 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:8301 msgid "Show or hide the virtual keyboard" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:6896 -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:7125 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:8326 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:8545 msgid "Go back to main button list" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:6935 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:8364 #, fuzzy msgid "delete selected tool or tools" msgstr "Angegebene Werkzeug-Nummer zu groß" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:6953 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:8381 #, fuzzy msgid "add a new tool to tool table" msgstr "We_rkzeugtabelle neu laden" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:6965 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:8392 #, fuzzy msgid "Reload" msgstr "_Neu laden" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:6971 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:8398 #, fuzzy msgid "reload tool table from file" msgstr "We_rkzeugtabelle neu laden" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:6989 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:8415 msgid "" "apply the changes you made, G43 will be excecuted only if it is active g-code" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:7006 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:8431 #, fuzzy msgid "Select a tool by number" msgstr "Angegebene Werkzeug-Nummer zu groß" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:7030 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:8454 msgid "change tool with the command M61 Q?, no machine move will be done" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:7054 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:8477 msgid "change tool to the selected one" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:7067 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:8489 msgid "" "touchoff\n" " tool x" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:7075 -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:7108 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:8497 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:8529 #, fuzzy msgid "touch off the tool and set the value to the tool table" msgstr "Angefordertes Werkzeug %d nicht in der Werkzeugtabelle gefunden" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:7100 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:8521 msgid "" "touchoff\n" " tool z" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:7164 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:8583 msgid "Move to your home directory" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:7182 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:8600 #, fuzzy msgid "Move to parrent directory" msgstr "Aktuelles Verzeichnis" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:7213 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:8630 #, fuzzy msgid "Select the previos file" msgstr "Element zum Anzeigen auswählen" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:7232 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:8648 #, fuzzy msgid "Select the next file" msgstr "Element zum Anzeigen auswählen" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:7251 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:8666 msgid "Jump to user defined directory" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:7283 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:8697 msgid "select the highlighted file and return the path" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:7315 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:8728 msgid "Close without returning a file path" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:7335 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:8747 #, fuzzy msgid "Load File" msgstr "Geladene Datei:" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:7395 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:8807 #, fuzzy msgid "home joints" msgstr "Achse/Gelenk" -#~ msgid "Unexpected realtime delay: check dmesg for details." -#~ msgstr "" -#~ "Unerwartete Echtzeitverzögerung.\n" -#~ "Details stehen in dmesg." +#~ msgid "button" +#~ msgstr "Taste" +#, fuzzy #~ msgid "" -#~ "\n" -#~ "In recent history there were\n" -#~ "%ld, %ld, %ld, %ld, and %ld\n" -#~ "elapsed clocks between calls to the motion controller.\n" -#~ msgstr "" -#~ "\n" -#~ "In der letzten Zeit sind \n" -#~ "%ld,%ld,%ld,%ld und %ld\n" -#~ "Clockimpulse zwischen den Impulsen an \n" -#~ "die Motorsteuerung ausgefallen.\n" +#~ "D word with no G41, G41.1, G42, G42.1, G71, G71.1, G71.2 or G96 to use it" +#~ msgstr "E-Wort ohne zugehörige Angabe von G76 oder M66" -#~ msgid "" -#~ "This time, there were %ld which is so anomalously\n" -#~ "large that it probably signifies a problem with your\n" -#~ "realtime configuration. For the rest of this run of\n" -#~ "EMC, this message will be suppressed.\n" -#~ "\n" -#~ msgstr "" -#~ "Dieses Mal waren es %ld, also unnormal viele,\n" -#~ "was auf ein Problem mit Ihrer Echtzeitkon-\n" -#~ "figuration hinweist. Für die Restlaufzeit\n" -#~ "von EMC wird diese Meldung unterdrückt.\n" +#, fuzzy +#~ msgid "can't open ini file '%s'" +#~ msgstr "INI-Datei »%s« kann nicht geöffnet werden" -#~ msgid "Exceeded negative soft limit on joint %d" -#~ msgstr "Negativer Softanschlag bei Achse/Gelenk %d überschritten" +#, fuzzy +#~ msgid "Negative tool id (tool not found)" +#~ msgstr "Negative Werkzeugnummer verwendet" -#~ msgid "%s move in MDI would exceed joint %d's positive limit" -#~ msgstr "" +#, fuzzy +#~ msgid "_Cancel" +#~ msgstr "Abbrechen" + +#, fuzzy +#~ msgid "_Open" +#~ msgstr "Öffnen..." + +#, fuzzy +#~ msgid "Save Configuration File:" +#~ msgstr "Konfigurationsdatei öffnen:" + +#, fuzzy +#~ msgid "_Save" +#~ msgstr "Speichern" + +#, fuzzy +#~ msgid "" +#~ "----- Samples\n" +#~ "at ---- kHz" +#~ msgstr "" +#~ "----- Samples\n" +#~ "bei ---- kHz" + +#, fuzzy +#~ msgid "_OK" +#~ msgstr "OK" + +#, fuzzy +#~ msgid "Cannot unhome extrajoint <%d> with motion enabled" +#~ msgstr "" +#~ "Achse/Gelenk %d: Ungültige(s) Achse/Gelenk kann nicht aus der " +#~ "Referenzpos. gefahren werden (max. %d)" + +#, fuzzy +#~ msgid "" +#~ "\n" +#~ "MOTION: num_extrajoints is %d, must be between 0 and %d\n" +#~ "\n" +#~ msgstr "MOTION: num_joints ist %d, muß zwischen 1 und %d liegen\n" + +#, fuzzy +#~ msgid "MOTION: num_misc_error is %d, must be between 0 and %d\n" +#~ msgstr "MOTION: num_dio ist %d, muß zwischen 1 und %d liegen\n" + +#~ msgid "MOTION: export_joint_home_pins failed\n" +#~ msgstr "MOTION: export_joint_home_pins fehlgeschlagen\n" + +#~ msgid "MOTION: ejoint %d pin/param export failed\n" +#~ msgstr "MOTION: Achse/Gelenk %d Pin/Parameterexport fehlgeschlagen\n" + +#~ msgid "HOMING: all_joints_home_data_t malloc failed\n" +#~ msgstr "MOTION: all_joints_home_data_t malloc fehlgeschlagen\n" + +#~ msgid "Add pin" +#~ msgstr "Pin hinzufügen" + +#~ msgid "Add to watch" +#~ msgstr "Hinzufügen" + +#~ msgid "Add signal" +#~ msgstr "Signal hinzufügen" + +#~ msgid "Add parameter" +#~ msgstr "Parameter hinzufügen" + +#~ msgid "Reload Watch" +#~ msgstr "Ansicht neu laden" + +#~ msgid "Set to .." +#~ msgstr "Setzen auf .." + +#~ msgid "Remove" +#~ msgstr "Entfernen" + +#~ msgid "Set" +#~ msgstr "Setzen" + +#, fuzzy +#~ msgid "User input" +#~ msgstr "Unbenutzter Eingang" + +#, fuzzy +#~ msgid "State Tags" +#~ msgstr "Status" + +#, fuzzy +#~ msgid "Edit _tool data..." +#~ msgstr "_Werkzeugtabelle bearbeiten..." + +#, fuzzy +#~ msgid "Reload tool _data" +#~ msgstr "We_rkzeugtabelle neu laden" + +#, fuzzy +#~ msgid "_Clear Recents List" +#~ msgstr "Einträge löschen" + +#, fuzzy +#~ msgid "User Buttons" +#~ msgstr "Null-X-Taste" + +#, fuzzy +#~ msgid "Tandem X Step" +#~ msgstr "Spindel StepGen" + +#, fuzzy +#~ msgid "Tandem X Direction" +#~ msgstr "X Richtung" + +#, fuzzy +#~ msgid "Tandem Y Step" +#~ msgstr "Spindel StepGen" + +#, fuzzy +#~ msgid "Tandem Y Direction" +#~ msgstr "Y Richtung" + +#, fuzzy +#~ msgid "Home Tandem X" +#~ msgstr "Referenzschalter X" + +#, fuzzy +#~ msgid "Home Tandem Y" +#~ msgstr "Referenzschalter Y" + +#, fuzzy +#~ msgid "Minimum Limit + Home Tandem X" +#~ msgstr "Min. End. + Ref. X" + +#, fuzzy +#~ msgid "Minimum Limit + Home Tandem Y" +#~ msgstr "Min. End. + Ref. Y" + +#, fuzzy +#~ msgid "Maximum Limit + Home Tandem X" +#~ msgstr "Max. End. + Ref. X" + +#, fuzzy +#~ msgid "Maximum Limit + Home Tandem Y" +#~ msgstr "Max. End. + Ref. Y" + +#, fuzzy +#~ msgid "Both Limit + Home Tandem X" +#~ msgstr "Beide End. + Ref. X" + +#, fuzzy +#~ msgid "Both Limit + Home Tandem Y" +#~ msgstr "Beide End. + Ref. Y" + +#, fuzzy +#~ msgid "Minimum Limit Tandem X" +#~ msgstr "Endschalter Mimimum X" + +#, fuzzy +#~ msgid "Minimum Limit Tandem Y" +#~ msgstr "Endschalter Mimimum Y" + +#, fuzzy +#~ msgid "Maximum Limit Tandem X" +#~ msgstr "Endschalter Maximum X" + +#, fuzzy +#~ msgid "Maximum Limit Tandem Y" +#~ msgstr "Endschalter Maximum Y" + +#, fuzzy +#~ msgid "Both Limit Tandem X" +#~ msgstr "Beide Endschalter X" + +#, fuzzy +#~ msgid "Both Limit Tandem Y" +#~ msgstr "Beide Endschalter Y" + +#, fuzzy +#~ msgid "Plasma Move Down" +#~ msgstr "Abwärts" + +#, fuzzy +#~ msgid "" +#~ "Loading configuration error:\n" +#~ "\n" +#~ "{}" +#~ msgstr "LinuxCNC-Konfigurationswähler" + +#, fuzzy +#~ msgid "# Include your custom HAL commands here" +#~ msgstr "" +#~ "# Benutzerdefinierte HAL-Anweisungen können nachfolgend angegeben werden" + +#, fuzzy +#~ msgid "# Include your custom_postgui HAL commands here" +#~ msgstr "" +#~ "# Benutzerdefinierte HAL-Anweisungen können nachfolgend angegeben werden" + +#, fuzzy +#~ msgid " Pin _1:" +#~ msgstr "Pin _1:" + +#, fuzzy +#~ msgid " Pin _2:" +#~ msgstr "Pin _2:" + +#, fuzzy +#~ msgid " Pin _4:" +#~ msgstr "Pin _4:" + +#, fuzzy +#~ msgid " Pin _3:" +#~ msgstr "Pin _3:" + +#, fuzzy +#~ msgid " Pin _5:" +#~ msgstr "Pin _5:" + +#, fuzzy +#~ msgid " Pin _6:" +#~ msgstr "Pin _6:" + +#, fuzzy +#~ msgid " Pin _7:" +#~ msgstr "Pin _7:" + +#, fuzzy +#~ msgid " Pin _8:" +#~ msgstr "Pin _8:" + +#, fuzzy +#~ msgid " Pin _9:" +#~ msgstr "Pin _9:" + +#, fuzzy +#~ msgid "Parport _Number:" +#~ msgstr "Nächste Nummer:" + +#, fuzzy +#~ msgid "Gmoccapy" +#~ msgstr "gmoccapy Grundeinstellungen" + +#, fuzzy +#~ msgid "Estop Button:" +#~ msgstr "Notaus gesetzt" + +#, fuzzy +#~ msgid "4:3" +#~ msgstr "47:" + +#, fuzzy +#~ msgid "Button" +#~ msgstr "Taste" + +#, fuzzy +#~ msgid "Mode:" +#~ msgstr "Modus" + +#, fuzzy +#~ msgid "NUM" +#~ msgstr "NML" + +#, fuzzy +#~ msgid "11" +#~ msgstr "11:" + +#, fuzzy +#~ msgid "12" +#~ msgstr "123" + +#, fuzzy +#~ msgid "13" +#~ msgstr "13:" + +#, fuzzy +#~ msgid "14" +#~ msgstr "1" + +#, fuzzy +#~ msgid "15" +#~ msgstr "15:" + +#, fuzzy +#~ msgid "16" +#~ msgstr "1" + +#, fuzzy +#~ msgid "18" +#~ msgstr "1" + +#, fuzzy +#~ msgid "19" +#~ msgstr "19:" + +#, fuzzy +#~ msgid "20" +#~ msgstr "0" + +#, fuzzy +#~ msgid "IDX" +#~ msgstr "PID" + +#, fuzzy +#~ msgid "32" +#~ msgstr "3" + +#, fuzzy +#~ msgid "64" +#~ msgstr "6" + +#, fuzzy +#~ msgid "128" +#~ msgstr "123" + +#, fuzzy +#~ msgid "Model" +#~ msgstr "Modus" + +#, fuzzy +#~ msgid "" +#~ "All the necessary information has now been gathered.\n" +#~ "Click \"Done\" to write your configuration files to disk.\n" +#~ "\n" +#~ "If you experience lockups while running LinuxCNC:\n" +#~ "-you will need to decrease the maximum velocity which will have the " +#~ "effect of increasing\n" +#~ " BASE_PERIOD.\n" +#~ "\n" +#~ "If you experience lost steps while running LinuxCNC:\n" +#~ "-first verify that you entered the proper timings for your stepper " +#~ "drivers.\n" +#~ "-then run a more thorough latency test as described on the linuxcnc.org " +#~ "wiki.\n" +#~ " http://wiki.linuxcnc.org/cgi-bin/wiki.pl?TroubleShooting\n" +#~ "\n" +#~ "If you experience the \"Unexpected Realtime Delay\" message:\n" +#~ "-run a more thorough latency test as described on the linuxcnc.org wiki:\n" +#~ " http://wiki.linuxcnc.org/cgi-bin/wiki.pl?TroubleShooting" +#~ msgstr "" +#~ "Alle notwendigen Informationen wurden erfasst. Bestätigen Sie mit " +#~ "»Anwenden«, um die Konfiguration zu speichern.\n" +#~ "Falls EMC2 nicht mehr reagieren sollte, verkleinern Sie die maximale " +#~ "Geschwindigkeit, was die Zeit für einen Systemtakt (BASE_PERIOD) " +#~ "vergrößert.\n" +#~ "\n" +#~ "Falls Sie Schrittverluste bemerken sollten, überprüfen Sie zuerst die " +#~ "Zeiteinstellungen für ihre Endstufe. Wird das Problem hierdurch nicht " +#~ "behoben, dann führen bitte weiter Maßnahmen durch, wie sie im EMC2-Wiki " +#~ "beschrieben werden:\n" +#~ " http://wiki.linuxcnc.org/cgi-bin/emcinfo.pl?TroubleShooting\n" +#~ "\n" +#~ "Falls Sie die Fehlermeldung »Unexpected Realtime Delay« erhalten, dann " +#~ "führen bitte weiter Maßnahmen durch, wie sie im EMC2-Wiki beschrieben " +#~ "werden:\n" +#~ " http://wiki.linuxcnc.org/cgi-bin/emcinfo.pl?TroubleShooting" + +#, fuzzy +#~ msgid "" +#~ "PNCconf encountered an error. The following information may be useful in " +#~ "troubleshooting:\n" +#~ "\n" +#~ "LinuxCNC Version: %s\n" +#~ "\n" +#~ msgstr "" +#~ "Beim Ausführen von PNCconf ist ein Fehler aufgetreten. Die folgenden " +#~ "Informationen können bei der Behebung hilfreich sein:\n" +#~ "\n" + +#, fuzzy +#~ msgid "" +#~ "OK to replace existing custom pyvcp panel?\n" +#~ "Existing pyvcp-panel.xml will be renamed and added to 'backups' folder\n" +#~ "Clicking 'existing custom program' will avoid this warning. " +#~ msgstr "" +#~ "Mit »OK« wird das bestehende benutzerdefinierte SPS-Programm ersetzt.\n" +#~ "Eine bestehende »Custom.clp«-Datei wird in custom_backup.clp« umbenannt.\n" +#~ "Eine bestehende »custom_backup.clp«-Dateien geht somit verloren." + +#, fuzzy +#~ msgid "Parallel Port 0" +#~ msgstr "Konfiguration der Druckerschnittstelle" + +#, fuzzy +#~ msgid "Arc OK" +#~ msgstr "Bogen rechts" + +#, fuzzy +#~ msgid "Ohmic Contact" +#~ msgstr "Aktivieren" + +#, fuzzy +#~ msgid "Plasma Encoder" +#~ msgstr "Bild invertieren" + +#, fuzzy +#~ msgid "Ohmic Enable" +#~ msgstr "Aktivieren" + +#, fuzzy +#~ msgid "Scribe On" +#~ msgstr "Maschine an" + +#, fuzzy +#~ msgid "Torch On" +#~ msgstr "Antasten" + +#, fuzzy +#~ msgid "QtPlasmaC Options" +#~ msgstr "SPS-Optionen" + +#, fuzzy +#~ msgid "Encoder" +#~ msgstr "Unicode" + +#, fuzzy +#~ msgid "Invalid embedded tab configuration" +#~ msgstr "Benutzerdefinierte _HAL-Konfiguration einbinden" + +#, fuzzy +#~ msgid "Move to parent directory" +#~ msgstr "Aktuelles Verzeichnis" + +#, fuzzy +#~ msgid "Select the previous file" +#~ msgstr "Element zum Anzeigen auswählen" + +#, fuzzy +#~ msgid "Toolfile does not exist" +#~ msgstr "Werkzeugdatei ist »%s«" + +#, fuzzy +#~ msgid "Reloading tooltable into linuxcnc failed" +#~ msgstr "We_rkzeugtabelle neu laden" + +#, fuzzy +#~ msgid "Tool file was modified since it was last read" +#~ msgstr "" +#~ "Die Datei %r wurde geändert, seitdem sie von stepconf geschrieben wurde" + +#, fuzzy +#~ msgid "radiobutton" +#~ msgstr "Taste" + +#, fuzzy +#~ msgid "checkbutton" +#~ msgstr "Taste" + +#, fuzzy +#~ msgid "togglebutton" +#~ msgstr "Taste" + +#, fuzzy +#~ msgid "Tool" +#~ msgstr "Werkzeug:" + +#, fuzzy +#~ msgid "black" +#~ msgstr "Schwarz" + +#, fuzzy +#~ msgid "Rotation of Z" +#~ msgstr "XY-Drehung:" + +#, fuzzy +#~ msgid "G92" +#~ msgstr "_G92" + +#, fuzzy +#~ msgid "G59.1" +#~ msgstr "P7 G59._1" + +#, fuzzy +#~ msgid "G59.2" +#~ msgstr "P8 G59._2" + +#, fuzzy +#~ msgid "G59.3" +#~ msgstr "P9 G59._3" + +#, fuzzy +#~ msgid "Offset" +#~ msgstr "Werkzeugoffset:" + +#, fuzzy +#~ msgid "Offset Name" +#~ msgstr "Offset-Wert " + +#, fuzzy +#~ msgid "" +#~ "Zero\n" +#~ "G92" +#~ msgstr "G59.2 auf Null setzen" + +#, fuzzy +#~ msgid "" +#~ " Zero\n" +#~ "Rotational" +#~ msgstr "Horizontal" + +#, fuzzy +#~ msgid "Select" +#~ msgstr "_Auswahl ändern" + +#, fuzzy +#~ msgid "Tool#" +#~ msgstr "Werkzeug:" + +#, fuzzy +#~ msgid "Front" +#~ msgstr "vorne" + +#, fuzzy +#~ msgid "Orientation" +#~ msgstr "Vorgang" + +#, fuzzy +#~ msgid "Comments" +#~ msgstr "Bemerkung" + +#, fuzzy +#~ msgid "All Offsets" +#~ msgstr "Achsoffset" + +#, fuzzy +#~ msgid "DIameter" +#~ msgstr "Durchmesser:" + +#, fuzzy +#~ msgid "Lathe Wear Offsets" +#~ msgstr "Arbeitsoffset:" + +#, fuzzy +#~ msgid "X Tool" +#~ msgstr "Werkzeug:" + +#, fuzzy +#~ msgid "Z Tool" +#~ msgstr "Werkzeug:" + +#, fuzzy +#~ msgid "Lathe Tool Offsets" +#~ msgstr "Werkzeugoffset" + +#~ msgid "filename:" +#~ msgstr "Dateiname:" + +#~ msgid "Unexpected realtime delay: check dmesg for details." +#~ msgstr "" +#~ "Unerwartete Echtzeitverzögerung.\n" +#~ "Details stehen in dmesg." + +#~ msgid "" +#~ "\n" +#~ "In recent history there were\n" +#~ "%ld, %ld, %ld, %ld, and %ld\n" +#~ "elapsed clocks between calls to the motion controller.\n" +#~ msgstr "" +#~ "\n" +#~ "In der letzten Zeit sind \n" +#~ "%ld,%ld,%ld,%ld und %ld\n" +#~ "Clockimpulse zwischen den Impulsen an \n" +#~ "die Motorsteuerung ausgefallen.\n" + +#~ msgid "" +#~ "This time, there were %ld which is so anomalously\n" +#~ "large that it probably signifies a problem with your\n" +#~ "realtime configuration. For the rest of this run of\n" +#~ "EMC, this message will be suppressed.\n" +#~ "\n" +#~ msgstr "" +#~ "Dieses Mal waren es %ld, also unnormal viele,\n" +#~ "was auf ein Problem mit Ihrer Echtzeitkon-\n" +#~ "figuration hinweist. Für die Restlaufzeit\n" +#~ "von EMC wird diese Meldung unterdrückt.\n" + +#~ msgid "Exceeded negative soft limit on joint %d" +#~ msgstr "Negativer Softanschlag bei Achse/Gelenk %d überschritten" + +#~ msgid "%s move in MDI would exceed joint %d's positive limit" +#~ msgstr "" #~ "Bewegung %s in MDI würde pos. Anschlag von Achse/Gelenk %d überschreiten" #~ msgid "%s move in MDI would exceed joint %d's negative limit" @@ -20609,7 +21244,11 @@ msgstr "Achse/Gelenk" #, fuzzy #~ msgid "Spindle Motor/Encoder Configuration" -#~ msgstr "Konfiguration der X-Achse" +#~ msgstr "" +#~ "#-#-#-#-# de2.po (de) #-#-#-#-#\n" +#~ "Konfiguration der X-Achse\n" +#~ "#-#-#-#-# de_master.po (de) #-#-#-#-#\n" +#~ "Konfiguration Spindel/Motor/Encoder" #, fuzzy #~ msgid "%s Axis Motor/Encoder Configuration" @@ -20868,9 +21507,6 @@ msgstr "Achse/Gelenk" #~ msgid "Step generator" #~ msgstr "Schrittgenerator" -#~ msgid "button" -#~ msgstr "Taste" - #~ msgid "Minimum Software Limit on axis %d exceeded." #~ msgstr "Unteres Software-Limit der Achse %d ist erreicht." @@ -21446,3 +22082,18 @@ msgstr "Achse/Gelenk" #~ msgid "No error" #~ msgstr "Kein Fehler" + +#, fuzzy +#~ msgid " Y Offset" +#~ msgstr "Werkzeugoffset:" + +#, fuzzy +#~ msgid " X Offset" +#~ msgstr "Werkzeugoffset:" + +#, fuzzy +#~ msgid "Ohmic Probe" +#~ msgstr "Sensor" + +#~ msgid "Input value" +#~ msgstr "Eingabe" From aba660a2f2e3a9c45acfa8fe3d2e821e9a82880a Mon Sep 17 00:00:00 2001 From: CMorley Date: Tue, 7 Dec 2021 01:22:56 -0800 Subject: [PATCH 63/85] gscreen -fix INI parsing of jog increments that uses space as a delimiter adding a missing ', continuous' before parsing broke the assumptions. Now we add a missing 'continuous' after parsing. --- src/emc/usr_intf/gscreen/gscreen.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/emc/usr_intf/gscreen/gscreen.py b/src/emc/usr_intf/gscreen/gscreen.py index df360407626..da66639c7a8 100755 --- a/src/emc/usr_intf/gscreen/gscreen.py +++ b/src/emc/usr_intf/gscreen/gscreen.py @@ -648,12 +648,12 @@ def __init__(self): # jogging increments increments = self.inifile.find("DISPLAY", "INCREMENTS") if increments: - if not "continuous" in increments: - increments +=",continuous" if "," in increments: self.data.jog_increments = [i.strip() for i in increments.split(",")] else: self.data.jog_increments = increments.split() + if not "continuous" in increments.lower(): + self.data.jog_increments += ["continuous"] else: if self.machine_units_mm ==self.data._MM: self.data.jog_increments = [".001 mm",".01 mm",".1 mm","1 mm","continuous"] @@ -664,12 +664,12 @@ def __init__(self): # angular jogging increments increments = self.inifile.find("DISPLAY", "ANGULAR_INCREMENTS") if increments: - if not "continuous" in increments: - increments +=",continuous" if "," in increments: self.data.angular_jog_increments = [i.strip() for i in increments.split(",")] else: self.data.angular_jog_increments = increments.split() + if not "continuous" in increments.lower(): + self.data.angular_jog_increments += ["continuous"] else: self.data.angular_jog_increments = ["1","45","180","360","continuous"] self.add_alarm_entry(_("No default angular jog increments entry found in [DISPLAY] of INI file")) From 1cc45e2643ddb2e44876fe2394d300673102673d Mon Sep 17 00:00:00 2001 From: Phillip Carter Date: Thu, 9 Dec 2021 12:54:37 +1100 Subject: [PATCH 64/85] plasmac: fix reconfigure mode for breakaway switch --- configs/by_machine/plasmac/configurator.py | 4 ++-- configs/by_machine/plasmac/plasmac_config.py | 6 ++++-- configs/by_machine/plasmac/versions.html | 7 ++++++- src/hal/components/plasmac.comp | 2 +- 4 files changed, 13 insertions(+), 6 deletions(-) diff --git a/configs/by_machine/plasmac/configurator.py b/configs/by_machine/plasmac/configurator.py index ff17fffdab2..709f80c96d1 100755 --- a/configs/by_machine/plasmac/configurator.py +++ b/configs/by_machine/plasmac/configurator.py @@ -1865,7 +1865,7 @@ def reconfigure(self): outFile.write(line) else: outFile.write('# {}'.format(line)) - elif 'breakaway' in line: + elif ':breakaway' in line: if self.breakPin.get_text(): if self.oldBreakPin != self.breakPin.get_text(): a, b = line.strip('#').strip().split(self.oldBreakPin) @@ -2016,7 +2016,7 @@ def populate_reconfigure(self): self.oldFloatPin = (line.split('-switch', 1)[1].strip().split(' ', 1)[0].strip()) if not line.strip().startswith('#'): self.floatPin.set_text(self.oldFloatPin) - elif 'breakaway' in line: + elif ':breakaway' in line: self.oldBreakPin = (line.split('breakaway', 1)[1].strip().split(' ', 1)[0].strip()) if not line.strip().startswith('#'): self.breakPin.set_text(self.oldBreakPin) diff --git a/configs/by_machine/plasmac/plasmac_config.py b/configs/by_machine/plasmac/plasmac_config.py index ef7db6d61a9..0f1fc394f12 100644 --- a/configs/by_machine/plasmac/plasmac_config.py +++ b/configs/by_machine/plasmac/plasmac_config.py @@ -349,8 +349,10 @@ def idle_changed(self, halpin): self.builder.get_object(key).update() def __init__(self, halcomp,builder,useropts): - - self.plasmacVersion = 'PlasmaC v0.189' + # *** set VERSION in plasmac.comp *** + # *** update versions.html *** + # *** for major updates see check_version function in plasmac_config.py + self.plasmacVersion = 'PlasmaC v0.190' self.W = gtk.Window() self.halcomp = halcomp diff --git a/configs/by_machine/plasmac/versions.html b/configs/by_machine/plasmac/versions.html index 59b29217ebf..0600c5695db 100644 --- a/configs/by_machine/plasmac/versions.html +++ b/configs/by_machine/plasmac/versions.html @@ -19,6 +19,11 @@

PlasmaC Updates

+
v0.190 - 2021 Sep 24 +
    +
  • fix reconfigure mode for breakaway switch
  • +
+
v0.189 - 2021 Sep 24
  • change default thc delay to 0.5
  • @@ -26,7 +31,7 @@

    PlasmaC Updates


    v0.188 - 2021 Feb 22
      -
    • fix material verter for sheetcam update
    • +
    • fix materialverter for sheetcam update

    v0.187 - 2020 Dec 13 diff --git a/src/hal/components/plasmac.comp b/src/hal/components/plasmac.comp index 26496fd16e9..fd9d48bc46e 100644 --- a/src/hal/components/plasmac.comp +++ b/src/hal/components/plasmac.comp @@ -7,7 +7,7 @@ A plasma cutting table control component for use with the LinuxCNC V2.8 or later .I VERSION: .br -0.187 - 2020 Dec 13 +0.190 - 2020 Dec 13 .I SUMMARY: .br From 1c0bc247bd19ebd565da08517c1dd985b0bd822e Mon Sep 17 00:00:00 2001 From: Phillip Carter Date: Thu, 9 Dec 2021 12:58:54 +1100 Subject: [PATCH 65/85] plasmac: fix date typo --- configs/by_machine/plasmac/versions.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configs/by_machine/plasmac/versions.html b/configs/by_machine/plasmac/versions.html index 0600c5695db..8f3a362a841 100644 --- a/configs/by_machine/plasmac/versions.html +++ b/configs/by_machine/plasmac/versions.html @@ -19,7 +19,7 @@

    PlasmaC Updates

    -
    v0.190 - 2021 Sep 24 +
    v0.190 - 2021 Dec 08
    • fix reconfigure mode for breakaway switch
    From 16755deba88bcb2a428aefd005a8559fc3e2b197 Mon Sep 17 00:00:00 2001 From: Hans Unzner Date: Sat, 4 Dec 2021 20:58:31 +0100 Subject: [PATCH 66/85] improved german translation --- src/po/README | 13 +- src/po/de.po | 900 ++++++++++++++++++++------------------------------ 2 files changed, 365 insertions(+), 548 deletions(-) diff --git a/src/po/README b/src/po/README index ddafc95104f..662739e01ee 100644 --- a/src/po/README +++ b/src/po/README @@ -17,6 +17,15 @@ in the experimental "weblate" interface. If you are working by hand, you can also update just a single pofile: msgmerge -U xx.po linuxcnc.pot +To merge a po-file e.g. from the master into the current branch: + + msgcat master.po current.po -o new.po + +To compare the real changes without the changed line numbers in comments, you can create a file without comments in this way: + grep -v ^# language.po > language_wo_comments.po +or + msgcat language.po --no-location > language_wo_comments.po + When you are done, "git commit" the new .po file. If you have push access, "git push". Otherwise, format your changes as a patch with "git format-patch" and send it to the emc-developers mailing list or create a Pull Request on GitHub. @@ -25,8 +34,8 @@ and send it to the emc-developers mailing list or create a Pull Request on GitHu Graphical tools for editing .po files ===================================== On Dapper there seem to be three graphical front-ends for editing .po files: -- gtranslator (a part of the Gnome desktop), -- lokalize (former kbabel as part of KDE) and +- lokalize (recommend - former kbabel as part of KDE) +- gtranslator (a part of the Gnome desktop) and - poedit diff --git a/src/po/de.po b/src/po/de.po index a405accea1b..de03108f5fd 100644 --- a/src/po/de.po +++ b/src/po/de.po @@ -1,22 +1,21 @@ -#, fuzzy +# +# +# Benjamin Weis , 2021. +# Hans , 2021. msgid "" msgstr "" "Project-Id-Version: de\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-12-04 19:44+0100\n" -"PO-Revision-Date: 2020-02-09 13:45+0200\n" -"Last-Translator: Benjamin Weis \n" -"Language-Team: German Translation Team \n" +"POT-Creation-Date: 2020-08-04 21:36+0100\n" +"PO-Revision-Date: 2021-12-07 21:14+0100\n" +"Last-Translator: Hans \n" +"Language-Team: German \n" "Language: de\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"#-#-#-#-# de2.po (de) #-#-#-#-#\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Generator: Weblate 0.5\n" -"#-#-#-#-# de_master.po (de) #-#-#-#-#\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Generator: Weblate 0.5\n" +"X-Generator: Lokalize 2.0\n" #: src/emc/task/emctaskmain.cc:867 #, c-format @@ -28,9 +27,9 @@ msgstr "" "Maschine nicht eingeschaltet ist" #: src/emc/task/emctaskmain.cc:997 -#, fuzzy, c-format +#, c-format msgid "can't do that (%s:%d) in manual mode" -msgstr "%s kann im manuellen Modus nicht ausgeführt werden" +msgstr "%s:%d kann im manuellen Modus nicht ausgeführt werden" #: src/emc/task/emctaskmain.cc:1104 #, c-format @@ -61,9 +60,9 @@ msgstr "" "wartet" #: src/emc/task/emctaskmain.cc:1458 -#, fuzzy, c-format +#, c-format msgid "can't do that (%s:%d) in MDI mode" -msgstr "%s kann im MDI-Modus nicht ausgeführt werden" +msgstr "%s:%d kann im MDI-Modus nicht ausgeführt werden" #: src/emc/task/emctaskmain.cc:2120 msgid "Can't switch mode while mode is AUTO and interpreter is not IDLE" @@ -72,9 +71,8 @@ msgstr "" "Interpreter stillsteht" #: src/emc/task/emctaskmain.cc:2173 -#, fuzzy msgid "failed to close file" -msgstr "Datei kann nicht geöffnet werden" +msgstr "Datei kann nicht geschlossen werden" #: src/emc/task/emctaskmain.cc:2187 tcl/bin/genedit.tcl:197 #: tcl/tklinuxcnc.tcl:452 @@ -95,91 +93,82 @@ msgid "Can't run a program when not homed" msgstr "Programm kann ohne vorherige Referenzfahrt nicht ausgeführt werden" #: src/emc/rs274ngc/interp_arc.cc:111 src/emc/rs274ngc/interp_arc.cc:287 -#, fuzzy, c-format +#, c-format msgid "" "Zero-radius arc: start=(%c%.4f,%c%.4f) center=(%c%.4f,%c%.4f) end=(%c%.4f,%c" "%.4f) r1=%.4f r2=%.4f" msgstr "" -"Radius am Kreisanfang unterscheidet sich vom Radius am Kreisende: Anfang=(%c" -"%.4f,%c%.4f), Mittelpunkt=(%c%.4f,%c%.4f), Ende=(%c%.4f,%c%.4f), Radius 1=" -"%.4f, Radius 2=%.4f" +"Kreisbogen mit Radius Null: Anfang=(%c%.4f,%c%.4f), Mittelpunkt=(%c%.4f,%c" +"%.4f), Ende=(%c%.4f,%c%.4f), Radius 1=%.4f, Radius 2=%.4f" #: src/emc/rs274ngc/interp_arc.cc:122 src/emc/rs274ngc/interp_arc.cc:296 -#, fuzzy, c-format +#, c-format msgid "" "Radius to end of arc differs from radius to start: start=(%c%.4f,%c%.4f) " "center=(%c%.4f,%c%.4f) end=(%c%.4f,%c%.4f) r1=%.4f r2=%.4f abs_err=%.4g " "rel_err=%.4f%%" msgstr "" -"Radius am Kreisanfang unterscheidet sich vom Radius am Kreisende: Anfang=(%c" +"Radius am Kreisende unterscheidet sich vom Radius am Kreisanfang: Anfang=(%c" "%.4f,%c%.4f), Mittelpunkt=(%c%.4f,%c%.4f), Ende=(%c%.4f,%c%.4f), Radius 1=" -"%.4f, Radius 2=%.4f" +"%.4f, Radius 2=%.4f Abs. Fehler=%.4g Rel. Fehler=%.4f%%" #: src/emc/rs274ngc/interp_check.cc:89 msgid "G4 not allowed with G2 or G3 because they both use P" msgstr "" #: src/emc/rs274ngc/interp_check.cc:92 -#, fuzzy msgid "Line with G10 does not have L1, L10, L11, L2, or L20" -msgstr "Zeile mit G10 enthält kein L2" +msgstr "Zeile mit G10 hat kein L1, L10, L11, L2, oder L20" #: src/emc/rs274ngc/interp_check.cc:93 msgid "P value not an integer with G10" msgstr "" #: src/emc/rs274ngc/interp_check.cc:94 -#, fuzzy, c-format +#, c-format msgid "P value out of range (0-9) with G10 L%d" -msgstr "P-Wert ausserhalb des gültigen Bereichs bei G10 L2" +msgstr "P-Wert ausserhalb des gültigen Bereichs bei G10 L%d" #: src/emc/rs274ngc/interp_check.cc:95 -#, fuzzy, c-format +#, c-format msgid "P value out of range with G10 L%d" -msgstr "P-Wert ausserhalb des gültigen Bereichs bei G10 L2" +msgstr "P-Wert ausserhalb des gültigen Bereichs bei G10 L%d" #: src/emc/rs274ngc/interp_check.cc:99 msgid "Between G5.2 and G5.3 codes, only additional G5.2 codes are allowed." msgstr "" #: src/emc/rs274ngc/interp_check.cc:258 -#, fuzzy msgid "D word with no G41, G41.1, G42, G42.1, or G96 to use it" -msgstr "E-Wort ohne zugehörige Angabe von G76 oder M66" +msgstr "D-Wort ohne zugehörige Angabe von G41, G41.1, G42, G42.1, oder G96" #: src/emc/rs274ngc/interp_check.cc:267 -#, fuzzy msgid "" "$ (spindle selection) word with no G41, G41.1, G42, G42.1, G76 G95 or G96 to " "use it" -msgstr "E-Wort ohne zugehörige Angabe von G76 oder M66" +msgstr "$ (Spindelauswahl) Wort ohne G41, G41.1, G42, G42.1, G76 G95 oder G96" #: src/emc/rs274ngc/interp_check.cc:274 -#, fuzzy msgid "E word with no G76, M3, M4, M5, M19, M51, M66, M67 or M68 to use it" -msgstr "E-Wort ohne zugehörige Angabe von G76 oder M66" +msgstr "" +"E-Wort ohne zugehörige Angabe G76, M3, M4, M5, M19, M51, M66, M67 oder M68" #: src/emc/rs274ngc/interp_check.cc:279 -#, fuzzy msgid "H word with no G43 or G76 to use it" -msgstr "E-Wort ohne zugehörige Angabe von G76 oder M66" +msgstr "H-Wort ohne zugehörige Angabe von G43 oder G76" #: src/emc/rs274ngc/interp_check.cc:285 -#, fuzzy msgid "I word with no G2, G3, G5, G5.1, G10, G33.1, G76, or G87 to use it" msgstr "" -"K-Wort ohne zugehörige Angabe von G2, G3, G33, G33.1, G76, G87, oder G43.1" +"I-Wort ohne zugehörige Angabe von G2, G3, G5, G5.1, G10, G33.1, G76, oder G87" #: src/emc/rs274ngc/interp_check.cc:291 -#, fuzzy msgid "J word with no G2, G3, G5, G5.1, G10, G76 or G87 to use it" -msgstr "J-Wörters ohne zugehörige Angabe von G2, G3 oder G87" +msgstr "J-Wort ohne zugehörige Angabe von G2, G3, G5, G5.1, G10, G76 oder G87" #: src/emc/rs274ngc/interp_check.cc:297 -#, fuzzy msgid "K word with no G2, G3, G33, G33.1, G76, or G87 to use it" -msgstr "" -"K-Wort ohne zugehörige Angabe von G2, G3, G33, G33.1, G76, G87, oder G43.1" +msgstr "K-Wort ohne zugehörige Angabe von G2, G3, G33, G33.1, G76, oder G87" #: src/emc/rs274ngc/interp_check.cc:309 msgid "" @@ -228,15 +217,13 @@ msgid "Must specify positive weight P for every Control Point" msgstr "" #: src/emc/rs274ngc/interp_convert.cc:152 -#, fuzzy msgid "Cannot make a NURBS with 0 feedrate" msgstr "" "Ein Kreisbogen mit einer Vorschubgeschwindigkeit von 0 ist nicht möglich" #: src/emc/rs274ngc/interp_convert.cc:189 -#, fuzzy msgid "Cannot use G5.3 without G5.2 first" -msgstr "G53 kann nicht mit aktiver Werkzeugbahnkorrektur verwendet werden" +msgstr "G5.3 kann nicht ohne G5.2 verwendet werden" #: src/emc/rs274ngc/interp_convert.cc:190 #, c-format @@ -246,9 +233,8 @@ msgid "" msgstr "" #: src/emc/rs274ngc/interp_convert.cc:219 -#, fuzzy msgid "Cannot convert spline with cutter radius compensation" -msgstr "Ebene kann nicht bei aktiver Werkzeugradiuskorrektur gewechselt werden" +msgstr "Spline kann nicht mit Radiuskorrektur konvertiert werden" #: src/emc/rs274ngc/interp_convert.cc:229 msgid "Splines must be in the XY plane" @@ -293,11 +279,9 @@ msgstr "" #: src/emc/rs274ngc/interp_convert.cc:428 #: src/emc/rs274ngc/interp_convert.cc:437 #: src/emc/rs274ngc/interp_convert.cc:443 -#, fuzzy, c-format +#, c-format msgid "%c word missing in absolute center arc" msgstr "" -"Angabe eines F-Wörters zum Fahren eines Kreisbogens im zeitreziproken " -"Vorschub-Modus fehlt" #: src/emc/rs274ngc/interp_convert.cc:668 msgid "" @@ -343,7 +327,7 @@ msgstr "" #: src/emc/rs274ngc/interp_convert.cc:1926 #, c-format msgid "G%d.1 with no D word" -msgstr "G%S.1 ohne D-Wort" +msgstr "G%d.1 ohne D-Wort" #: src/emc/rs274ngc/interp_convert.cc:1929 #, c-format @@ -361,9 +345,8 @@ msgid "G%d with lathe tool, but plane is not G18" msgstr "" #: src/emc/rs274ngc/interp_convert.cc:2346 -#, fuzzy msgid "Cannot set reference point with cutter compensation in effect" -msgstr "Ebene kann nicht bei aktiver Werkzeugradiuskorrektur gewechselt werden" +msgstr "" #: src/emc/rs274ngc/interp_convert.cc:2866 #, c-format @@ -392,18 +375,19 @@ msgid "M7x: restore_settings failed executing: '%s': %s" msgstr "" #: src/emc/rs274ngc/interp_convert.cc:2974 -#, fuzzy msgid "Cannot set motion output with cutter radius compensation on" -msgstr "Ebene kann nicht bei aktiver Werkzeugradiuskorrektur gewechselt werden" +msgstr "" +"motion-Ausgang kann nicht gesetzt werden bei aktiver Werkzeugradiuskorrektur" #: src/emc/rs274ngc/interp_convert.cc:2975 msgid "No valid P word with M62" msgstr "Kein gültiges P-Wort mit M62" #: src/emc/rs274ngc/interp_convert.cc:2979 -#, fuzzy msgid "Cannot set motion digital output with cutter radius compensation on" -msgstr "Ebene kann nicht bei aktiver Werkzeugradiuskorrektur gewechselt werden" +msgstr "" +"motion-Digitalausgang kann nicht gesetzt werden bei aktiver" +" Werkzeugradiuskorrektur" #: src/emc/rs274ngc/interp_convert.cc:2980 msgid "No valid P word with M63" @@ -411,9 +395,10 @@ msgstr "Kein gültiges P-Wort mit M63" #: src/emc/rs274ngc/interp_convert.cc:2984 #: src/emc/rs274ngc/interp_convert.cc:2989 -#, fuzzy msgid "Cannot set auxiliary digital output with cutter radius compensation on" -msgstr "Ebene kann nicht bei aktiver Werkzeugradiuskorrektur gewechselt werden" +msgstr "" +"motion-auxiliary-Digitalausgang kann nicht gesetzt werden bei aktiver" +" Werkzeugradiuskorrektur" #: src/emc/rs274ngc/interp_convert.cc:2985 msgid "No valid P word with M64" @@ -428,28 +413,29 @@ msgid "invalid P-word with M66" msgstr "" #: src/emc/rs274ngc/interp_convert.cc:3035 -#, fuzzy msgid "Cannot wait for digital input with cutter radius compensation on" -msgstr "Ebene kann nicht bei aktiver Werkzeugradiuskorrektur gewechselt werden" +msgstr "" #: src/emc/rs274ngc/interp_convert.cc:3047 -#, fuzzy msgid "Cannot wait for analog input with cutter radius compensation on" -msgstr "Ebene kann nicht bei aktiver Werkzeugradiuskorrektur gewechselt werden" +msgstr "" +"Kann nicht auf den Analogeingang warten bei aktiver Werkzeugradiuskorrektur" #: src/emc/rs274ngc/interp_convert.cc:3062 -#, fuzzy msgid "Cannot set motion analog output with cutter radius compensation on" -msgstr "Ebene kann nicht bei aktiver Werkzeugradiuskorrektur gewechselt werden" +msgstr "" +"motion-Analogausgang kann nicht gesetzt werden bei aktiver" +" Werkzeugradiuskorrektur" #: src/emc/rs274ngc/interp_convert.cc:3063 msgid "Invalid analog index with M67" msgstr "" #: src/emc/rs274ngc/interp_convert.cc:3069 -#, fuzzy msgid "Cannot set auxiliary analog output with cutter radius compensation on" -msgstr "Ebene kann nicht bei aktiver Werkzeugradiuskorrektur gewechselt werden" +msgstr "" +"motion-auxiliary-Analogausgang kann nicht gesetzt werden bei aktiver" +" Werkzeugradiuskorrektur" #: src/emc/rs274ngc/interp_convert.cc:3070 msgid "Invalid analog index with M68" @@ -503,18 +489,19 @@ msgstr "" #: src/emc/rs274ngc/interp_convert.cc:3316 #: src/emc/rs274ngc/interp_convert.cc:3338 #: src/emc/rs274ngc/interp_convert.cc:3352 -#, fuzzy msgid "Cannot enable overrides with cutter radius compensation on" -msgstr "Ebene kann nicht bei aktiver Werkzeugradiuskorrektur gewechselt werden" +msgstr "" +"Übersteuerung kann nicht aktiviert werden bei aktiver Werkzeugradiuskorrektur" #: src/emc/rs274ngc/interp_convert.cc:3284 #: src/emc/rs274ngc/interp_convert.cc:3301 #: src/emc/rs274ngc/interp_convert.cc:3325 #: src/emc/rs274ngc/interp_convert.cc:3343 #: src/emc/rs274ngc/interp_convert.cc:3357 -#, fuzzy msgid "Cannot disable overrides with cutter radius compensation on" -msgstr "Ebene kann nicht bei aktiver Werkzeugradiuskorrektur gewechselt werden" +msgstr "" +"Übersteuerung kann nicht deaktiviert werden bei aktiver" +" Werkzeugradiuskorrektur" #: src/emc/rs274ngc/interp_convert.cc:3311 msgid "Invalid spindle ($) number in M51 command" @@ -535,14 +522,14 @@ msgid "Indexing axis %c can only be moved alone" msgstr "" #: src/emc/rs274ngc/interp_convert.cc:3573 -#, fuzzy msgid "Cannot probe with feed per rev mode" -msgstr "Abtast-Fahrt mit einer Verfahrgeschwindigkeit von 0 nicht möglich" +msgstr "Kann nicht antasten im Modus \"Vorschub pro Umdrehung\"" #: src/emc/rs274ngc/interp_convert.cc:3621 -#, fuzzy msgid "Cannot change retract mode with cutter radius compensation on" -msgstr "Ebene kann nicht bei aktiver Werkzeugradiuskorrektur gewechselt werden" +msgstr "" +"Rückzug-Modus kann nicht geändert werden werden bei aktiver" +" Werkzeugradiuskorrektur" #: src/emc/rs274ngc/interp_convert.cc:3655 msgid "G10 L1 without offsets has no effect" @@ -557,18 +544,15 @@ msgid "Invalid tool orientation" msgstr "" #: src/emc/rs274ngc/interp_convert.cc:3885 -#, fuzzy msgid "I J words not allowed with G10 L2" -msgstr "" -"Befehle G43.1, G41 R, und G42 R dürfen keine X-, Y-, Z-, A-, B-, C-. oder J-" -"Wörter enthalten" +msgstr "I- / J-Wörter nicht zulässig mit G10 L2" #: src/emc/rs274ngc/interp_convert.cc:3906 -#, fuzzy msgid "" "Cannot change the active coordinate system with cutter radius compensation on" msgstr "" -"Koordinatensystem kann nicht bei aktiver Werkzeugradiuskorrektur gewechselt " +"Aktives Koordinatensystem kann nicht bei aktiver Werkzeugradiuskorrektur" +" gewechselt " "werden" #: src/emc/rs274ngc/interp_convert.cc:3914 @@ -600,13 +584,9 @@ msgid "Invalid D-number in G76 cycle" msgstr "Ungültige D Nummer in G76 Zyklus" #: src/emc/rs274ngc/interp_convert.cc:4575 -#, fuzzy, c-format +#, c-format msgid "Chosen spindle (%i) not turning in G76" -msgstr "" -"#-#-#-#-# de2.po (de) #-#-#-#-#\n" -"G86, aber Werkzeug-Spindel nicht in Rotation\n" -"#-#-#-#-# de_master.po (de) #-#-#-#-#\n" -"Gewählte Spindel (%i) ohne Bewegung in G76" +msgstr "Gewählte Spindel (%i) ohne Bewegung in G76" #: src/emc/rs274ngc/interp_convert.cc:4613 msgid "BUG: An axis incorrectly moved along with an indexer" @@ -617,12 +597,8 @@ msgid "BUG: trying to index incorrect axis" msgstr "" #: src/emc/rs274ngc/interp_convert.cc:4718 -#, fuzzy msgid "Cannot use G76 threading cycle with cutter radius compensation on" msgstr "" -"#-#-#-#-# de2.po (de) #-#-#-#-#\n" -"Ebene kann nicht bei aktiver Werkzeugradiuskorrektur gewechselt werden\n" -"#-#-#-#-# de_master.po (de) #-#-#-#-#\n" "G76 Zyklus kann nicht bei aktiver Werkzeugradiuskorrektur verwendet werden" #: src/emc/rs274ngc/interp_convert.cc:4721 @@ -631,11 +607,11 @@ msgstr "Bei G76 Befehl darf I nicht Null sein" #: src/emc/rs274ngc/interp_convert.cc:4723 msgid "In G76, J must be greater than 0" -msgstr "Bei G76 Befehl muss J größer Null sein" +msgstr "Bei G76 Befehl muss J größer als Null sein" #: src/emc/rs274ngc/interp_convert.cc:4725 msgid "In G76, K must be greater than J" -msgstr "Bei G76 Befehl mus sK größer J sein" +msgstr "Bei G76 befehl muss K größer sein als J" #: src/emc/rs274ngc/interp_convert.cc:4868 msgid "" @@ -656,14 +632,14 @@ msgstr "" "Kollision erreichen kann" #: src/emc/rs274ngc/interp_convert.cc:5217 -#, fuzzy msgid "Cannot change tools with cutter radius compensation on" -msgstr "Ebene kann nicht bei aktiver Werkzeugradiuskorrektur gewechselt werden" +msgstr "" +"Werkzeug kann nicht bei aktiver Werkzeugradiuskorrektur gewechselt werden" #: src/emc/rs274ngc/interp_convert.cc:5341 -#, fuzzy msgid "Cannot change tool offset with cutter radius compensation on" -msgstr "Ebene kann nicht bei aktiver Werkzeugradiuskorrektur gewechselt werden" +msgstr "" +"Werkzeugoffset kann nicht bei aktiver Werkzeugradiuskorrektur geändert werden" #: src/emc/rs274ngc/interp_convert.cc:5383 msgid "G43.2: H-word missing" @@ -688,9 +664,9 @@ msgid "" msgstr "" #: src/emc/rs274ngc/interp_queue.cc:667 -#, fuzzy, c-format +#, c-format msgid "BUG: Unsupported plane [%d] in cutter compensation" -msgstr "Nicht untersützte Ebene in Werkzeugradiuskorrektur" +msgstr "BUG: Nicht unterstützte Ebene [%d] in Werkzeugradiuskorrektur" #: src/emc/rs274ngc/interp_queue.cc:678 msgid "" @@ -700,7 +676,7 @@ msgstr "" #: src/emc/rs274ngc/interp_cycles.cc:275 #, c-format msgid "Spindle not turning in %s" -msgstr "Spindel dreht nicht in %s" +msgstr "Spindel dreht sich nicht in %s" #: src/emc/rs274ngc/interp_cycles.cc:277 msgid "Spindle turning clockwise in G74" @@ -708,7 +684,7 @@ msgstr "G74, aber Werkzeug-Spindel dreht sich im Uhrzeigersinn" #: src/emc/rs274ngc/interp_cycles.cc:280 msgid "Spindle turning counterclockwise in G84" -msgstr "G84, aber Werkzeug-Spindel dreht sich im Gegenuhrzeigersinn" +msgstr "G84, aber Werkzeug-Spindel dreht sich gegen den Uhrzeigersinn" #: src/emc/rs274ngc/interp_cycles.cc:283 #, c-format @@ -717,8 +693,7 @@ msgstr "Unbekannter Spindel Status in %s" #: src/emc/rs274ngc/interp_cycles.cc:724 msgid "Cannot feed with zero feed rate" -msgstr "" -"G1 kann nicht mit einer Vorschubgeschwindigkeit von 0 ausgeführt werden" +msgstr "Kann nicht mit einer Vorschubgeschwindigkeit von 0 ausgeführt werden" # Anmerkung:FJ: Who the fuck is "inverse time feed mode"? :-))) # Angabe des Weges, der in einer Minuten zurückgelegt werden soll??? @@ -726,14 +701,12 @@ msgstr "" # F100 -> 60/100 = Weg im Raum wird in 0,6s zurückgelegt. Einige CAM Systeme erzeugen solchen Code... # Anmerkung:FJ: DIN66025 nennt das "Zeitreziproke Vorschubverschlüsselung". Was es nicht alles gibt :-) !!!!! #: src/emc/rs274ngc/interp_cycles.cc:725 -#, fuzzy msgid "Cannot use inverse time feed with canned cycles" -msgstr "Abtast-Fahrten sind im zeitreziproken Vorschub-Modus nicht möglich" +msgstr "Zeitreziproker Vorschub nicht möglich bei Festzyklen" #: src/emc/rs274ngc/interp_cycles.cc:726 -#, fuzzy msgid "Cannot use canned cycles with cutter compensation on" -msgstr "Ebene kann nicht bei aktiver Werkzeugradiuskorrektur gewechselt werden" +msgstr "" #: src/emc/rs274ngc/interp_cycles.cc:914 msgid "G17 canned cycle is not possible on a machine without Z axis" @@ -787,9 +760,8 @@ msgid "Invalid spindle ($) number in Spindle speed command" msgstr "Unbekannte Spindel ($) im Spindel Geschwindigkeits Befehl" #: src/emc/rs274ngc/interp_find.cc:171 -#, fuzzy msgid "Cannot use polar coordinates with G53" -msgstr "Rotations-Achse kann nicht mit G76 bewegt werden" +msgstr "Polarkoordinaten können nicht in Verbindung mit G53 verwendet werden" #: src/emc/rs274ngc/interp_find.cc:267 src/emc/rs274ngc/interp_find.cc:272 #: src/emc/rs274ngc/interp_find.cc:279 src/emc/rs274ngc/interp_find.cc:338 @@ -854,31 +826,28 @@ msgstr "" # Anmerkung:FJ: Schrägstrich, atan? Klären? Division wie bei c-Funktion atan2(x,y) ??? #: src/emc/rs274ngc/interp_read.cc:1807 -#, fuzzy msgid "Left bracket missing after 'while'" -msgstr "Fehlende linke Klammer nach Schrägstrich bei atan" +msgstr "Fehlende linke Klammer nach 'while'" #: src/emc/rs274ngc/interp_read.cc:1822 -#, fuzzy msgid "Left bracket missing after 'repeat'" -msgstr "Fehlende linke Klammer nach unärem Befehlssnamen" +msgstr "Fehlende linke Klammer nach 'repeat'" # Anmerkung:FJ: Schrägstrich, atan? Klären? Division wie bei c-Funktion atan2(x,y) ??? #: src/emc/rs274ngc/interp_read.cc:1837 -#, fuzzy msgid "Left bracket missing after 'if'" -msgstr "Fehlende linke Klammer nach Schrägstrich bei atan" +msgstr "Fehlende linke Klammer nach 'if'" # Anmerkung:FJ: Schrägstrich, atan? Klären? Division wie bei c-Funktion atan2(x,y) ??? #: src/emc/rs274ngc/interp_read.cc:1852 -#, fuzzy msgid "Left bracket missing after 'elseif'" -msgstr "Fehlende linke Klammer nach Schrägstrich bei atan" +msgstr "Fehlende linke Klammer nach 'elseif'" #: src/emc/rs274ngc/interp_read.cc:2056 -#, fuzzy msgid "Cannot read current position with cutter radius compensation on" -msgstr "Ebene kann nicht bei aktiver Werkzeugradiuskorrektur gewechselt werden" +msgstr "" +"Aktuelle Position kann nicht gelesen werden bei aktiver" +" Werkzeugradiuskorrektur" #: src/emc/rs274ngc/interp_read.cc:2071 msgid "Expected # reading parameter" @@ -933,10 +902,10 @@ msgstr "" msgid "File:%s line:%d redefining sub: o|%s| already defined in file:%s" msgstr "" -#: src/emc/rs274ngc/interp_o_word.cc:823 -#, fuzzy, c-format +#: src/emc/rs274ngc/interp_o_word.cc:822 +#, c-format msgid "%d: not in a subroutine definition: '%s'" -msgstr "Nicht in der Definition der Unterfunktion" +msgstr "%d: nicht in der Definition einer Unterfunktion: '%s'" #: src/emc/rs274ngc/interp_o_word.cc:872 src/emc/rs274ngc/interp_o_word.cc:922 #, c-format @@ -1024,23 +993,21 @@ msgid "Queue is not empty after tool change" msgstr "Warteschlange ist nach Werkzeugwechsel nicht leer" #: src/emc/rs274ngc/rs274ngc_pre.cc:1849 -#, fuzzy, c-format +#, c-format msgid "Unable to open parameter file: '%s'" -msgstr "Datei kann nicht geöffnet werden" +msgstr "Parameterdatei '%s' kann nicht geöffnet werden" #: src/emc/rs274ngc/rs274ngc_pre.cc:2407 -#, fuzzy msgid "Parameter file name is missing" -msgstr "Parameterdatei ist »%s«" +msgstr "Parameterdateinamen fehlt" #: src/emc/rs274ngc/rs274ngc_return.hh:19 msgid "A file is already open" msgstr "Eine Datei ist bereits geöffnet" #: src/emc/rs274ngc/rs274ngc_return.hh:21 -#, fuzzy msgid "All axes missing with g52 or g92" -msgstr "Keine Weginformation für G92 angegeben" +msgstr "Keine Axen fur G52 oder G92 angegeben" #: src/emc/rs274ngc/rs274ngc_return.hh:22 msgid "All axes missing with motion code" @@ -1100,9 +1067,8 @@ msgid "Bug code not g2 or g3" msgstr "Wort ist nicht G2 oder G3" #: src/emc/rs274ngc/rs274ngc_return.hh:37 -#, fuzzy msgid "Bug code not g4 g10 g28 g30 g52 g53 or g92 series" -msgstr "Wort ist nicht G4, G10, G28, G30, G53 oder aus G92-Serie" +msgstr "" #: src/emc/rs274ngc/rs274ngc_return.hh:38 msgid "Bug code not g61 g61.1 or g64" @@ -1117,9 +1083,8 @@ msgid "Bug code not g98 or g99" msgstr "Wort ist nicht G98 oder G99" #: src/emc/rs274ngc/rs274ngc_return.hh:41 -#, fuzzy msgid "Bug code not in g52 or g92 series" -msgstr "Wort ist nicht aus G92-Serie" +msgstr "" # Anmerkung:FJ: g593 ???? WM: wahrscheinlich g59.3 #: src/emc/rs274ngc/rs274ngc_return.hh:42 @@ -1127,9 +1092,8 @@ msgid "Bug code not in range g54 to g593" msgstr "Wort ist nicht im Bereich G54 bis G59.3" #: src/emc/rs274ngc/rs274ngc_return.hh:43 -#, fuzzy msgid "Bug code not m0 m1 m2 m30 m60 m99" -msgstr "Wort ist nicht M0, M1, M2, M30 oder M60" +msgstr "" # Anmerkung:FJ: distance mode? -> incremental oder absolut? Oder was ist hier gemeint!? # Anmerkung:FJ: Kettenmaß oder Absolutmaß -->> Bemaßungs-Modus, Maßmodus ... @@ -1352,22 +1316,17 @@ msgid "Left bracket missing after unary operation name" msgstr "Fehlende linke Klammer nach unärem Befehlssnamen" #: src/emc/rs274ngc/rs274ngc_return.hh:92 -#, fuzzy, c-format +#, c-format msgid "M code greater than 199: M%d" -msgstr "M-Wort größer als 199" +msgstr "M-Wort größer als 199: M%d" #: src/emc/rs274ngc/rs274ngc_return.hh:93 msgid "Mixed radius ijk format for arc" msgstr "Radius- und IJK-Format durcheinandergewürfelt" #: src/emc/rs274ngc/rs274ngc_return.hh:94 -#, fuzzy msgid "Multiple spindle choice ($) words on one line" -msgstr "" -"#-#-#-#-# de2.po (de) #-#-#-#-#\n" -"Mehrere C-Wörter in einem Satz\n" -"#-#-#-#-# de_master.po (de) #-#-#-#-#\n" -"Mehrere Spindelauswahl Befehle ($) in einem Satz" +msgstr "Mehrere Spindelauswahl Befehle ($) in einem Satz" #: src/emc/rs274ngc/rs274ngc_return.hh:95 msgid "Multiple a words on one line" @@ -1587,9 +1546,8 @@ msgstr "Zu viele M-Wörter in einer Zeile" # Anmerkung:FJ: Tool max? Was das? # Anmerkung:AJ: sollte "Index in tool table file too large" sein #: src/emc/rs274ngc/rs274ngc_return.hh:148 -#, fuzzy msgid "Pocket max too large" -msgstr "Werkzeug-Datei-Index zu groß" +msgstr "Tasche zu groß" #: src/emc/rs274ngc/rs274ngc_return.hh:149 msgid "Tool radius not less than arc radius with comp" @@ -1625,9 +1583,9 @@ msgid "Unknown g code used" msgstr "Unbekanntes G-Wort" #: src/emc/rs274ngc/rs274ngc_return.hh:156 -#, fuzzy, c-format +#, c-format msgid "Unknown m code used: M%d" -msgstr "Unbekanntes M-Wort" +msgstr "Unbekanntes M-Wort: M%d" #: src/emc/rs274ngc/rs274ngc_return.hh:157 msgid "Unknown operation" @@ -2037,8 +1995,7 @@ msgstr "" msgid "Realtime component not loaded" msgstr "Echtzeicht-Komponente nicht geladen" -#: src/hal/utils/scope_horiz.c:459 -#, fuzzy +#: src/hal/utils/scope_horiz.c:461 msgid "" "HALSCOPE uses a realtime component called scope_rt'\n" "to sample signals for display. It is not currently loaded\n" @@ -2053,13 +2010,14 @@ msgid "" msgstr "" "HALSCOPE benutzt eine Echtzeit-Komponente namens scope_rt\n" "um Werte aufzuzeichnen. Diese wurde nicht geladen und der\n" -"atomatische Versuch die Komponente zu laden schlug fehl.\n" -"Weitere Informationen könnten in der Konole verfügbar sein,\n" +"automatische Versuch die Komponente zu laden schlug fehl.\n" +"Weitere Informationen könnten in der Konsole verfügbar sein,\n" "aus der der Befehl »halscope« gestartet wurde.\n" "\n" "Wählen Sie eine der folgenden Möglichkeiten:\n" "\n" -"Laden der Komponente (mittels »halcmd loadrt scope_rt«). Wählen Sie »OK«\n" +"Laden Sie die Komponente (mittels »halcmd loadrt scope_rt«) und wählen Sie" +" »OK«\n" "oder\n" "wählen Sie »Beenden« um HALSCOPE zu beenden" @@ -2093,17 +2051,16 @@ msgstr "" msgid "Select Sample Rate" msgstr "Abtastrate auswählen" -#: src/hal/utils/scope_horiz.c:503 -#, fuzzy +#: src/hal/utils/scope_horiz.c:505 msgid "" "Select a thread name and multiplier then click 'OK'\n" "or\n" "Click 'Quit' to exit HALSCOPE" msgstr "" -"Wählen Sie einen Tread-Namen und Vervielfacher\n" +"Wählen Sie einen Thread-Namen und Multiplikator\n" "und bestätigen Sie mit »OK«\n" "oder\n" -"wählen Sie »Beenden« um HALSCOPE zu beenden\n" +"wählen Sie »Beenden« um HALSCOPE zu beenden" #: src/hal/utils/scope_horiz.c:525 msgid "Thread:" @@ -2130,8 +2087,7 @@ msgstr "Periode" msgid "Multiplier:" msgstr "Vervielfacher:" -#: src/hal/utils/scope_horiz.c:635 -#, fuzzy +#: src/hal/utils/scope_horiz.c:637 msgid "Record Length" msgstr "Länge der Aufzeichnung" @@ -2237,8 +2193,8 @@ msgstr "" "sind. Wählen Sie einen kürzeren Wert,\n" "um mehr Kanäle zu unterstützen." -#: src/hal/utils/scope_horiz.c:1050 -#, fuzzy, c-format +#: src/hal/utils/scope_horiz.c:1052 +#, c-format msgid "" "%s\n" "per div" @@ -2326,13 +2282,12 @@ msgid "Scale" msgstr "Skala" #: src/hal/utils/scope_vert.c:651 -#, fuzzy msgid "" "Offset\n" "----" msgstr "" "Offset\n" -"%s" +"----" #: src/hal/utils/scope_vert.c:659 msgid "Chan Off" @@ -2505,7 +2460,7 @@ msgstr "Tastspitze bei inaktivem MDI-Befehl ausgelöst." msgid "Probe tripped during homing motion." msgstr "Tastspitze bei Referenzfahrt ausgelöst." -#: src/emc/motion/control.c:707 +#: src/emc/motion/control.c:708 msgid "Probe tripped during a joint jog." msgstr "Tastspitze bei Motorfahrt (joint) ausgelöst." @@ -2517,19 +2472,15 @@ msgstr "Tastspitze bei Koordinatenbewegung ausgelöst." msgid "motion stopped by enable input" msgstr "Bewegung durch Enable-Eingabe angehalten." -#: src/emc/motion/control.c:733 +#: src/emc/motion/control.c:734 #, c-format msgid "spindle %d amplifier fault" msgstr "Verstärkerfehler an Spindel %d" #: src/emc/motion/control.c:756 -#, fuzzy, c-format +#, c-format msgid "joint %d on limit switch error" -msgstr "" -"#-#-#-#-# de2.po (de) #-#-#-#-#\n" -"Fehler: Achse/Gelenk %d am Endschalter\n" -"#-#-#-#-# de_master.po (de) #-#-#-#-#\n" -"Achsen- oder Gelenkfehler %d am Endschalter" +msgstr "Achse/Gelenk %d am Endschalter" #: src/emc/motion/control.c:768 #, c-format @@ -2553,7 +2504,7 @@ msgstr "" #: src/emc/motion/control.c:1551 #, c-format msgid "Exceeded NEGATIVE soft limit (%.5f) on joint %d\n" -msgstr "Negatives Softlimit bei (%.5f) Motor %d überschritten\n" +msgstr "Negatives Softlimit (%.5f) bei Achse/Gelenk %d überschritten\n" #: src/emc/motion/control.c:1554 src/emc/motion/control.c:1563 msgid "Joint must be unhomed, jogged into limits, rehomed" @@ -2564,9 +2515,9 @@ msgid "Hint: switch to joint mode to jog off soft limit" msgstr "" #: src/emc/motion/control.c:1560 -#, fuzzy, c-format +#, c-format msgid "Exceeded POSITIVE soft limit (%.5f) on joint %d\n" -msgstr "Positiver Softanschlag bei Achse/Gelenk %d überschritten" +msgstr "Positiver Softanschlag (%.5f) bei Achse/Gelenk %d überschritten\n" #: src/emc/motion/command.c:145 #, c-format @@ -2594,18 +2545,16 @@ msgid "Can't jog joint %d further past min soft limit." msgstr "Kann Achse/Gelenk %d nicht über min. Softanschlag bewegen" #: src/emc/motion/command.c:208 src/emc/motion/command.c:214 -#, fuzzy, c-format +#, c-format msgid "%s move on line %d would exceed %c's %s limit" msgstr "" -"Bewegung %s in Zeile %d würde pos. Anschlag von Achse/Gelenk %d überschreiten" +"Bewegung %s in Zeile %d würde von Achse/Gelenk %c den Anschlag %s überschreiten" #: src/emc/motion/command.c:209 -#, fuzzy msgid "negative" msgstr "Negativ" #: src/emc/motion/command.c:215 -#, fuzzy msgid "positive" msgstr "Positiv" @@ -2661,9 +2610,9 @@ msgid "can't do linear move with limits exceeded" msgstr "Keine Linearbewegung jenseits der Grenzen" #: src/emc/motion/command.c:1120 -#, fuzzy, c-format +#, c-format msgid "can't add linear move at line %d, error code %d" -msgstr "Keine Linearbewegung jenseits der Grenzen" +msgstr "Keine Linearbewegung möglich in Zeile %d, Fehlercode %d" #: src/emc/motion/command.c:1147 msgid "need to be enabled, in coord mode for circular move" @@ -2674,9 +2623,9 @@ msgid "can't do circular move with limits exceeded" msgstr "Keine Kreisbewegung jenseits der Grenzen" #: src/emc/motion/command.c:1175 -#, fuzzy, c-format +#, c-format msgid "can't add circular move at line %d, error code %d" -msgstr "Keine Kreisbewegung jenseits der Grenzen" +msgstr "Keine Kreisbewegung möglich in Zeile %d, Fehlercode %d" #: src/emc/motion/command.c:1290 msgid "MOTION: can't STEP while already executing" @@ -2761,9 +2710,9 @@ msgid "can't do rigid tap move with limits exceeded" msgstr "Kein Gewindebohren außerhalb der Grenzen" #: src/emc/motion/command.c:1657 -#, fuzzy, c-format +#, c-format msgid "can't add rigid tap move at line %d, error code %d" -msgstr "Kein Gewindebohren außerhalb der Grenzen" +msgstr "Kein Gewindebohren möglich in Zeile %d, Fehlercode %d" #: src/emc/motion/command.c:1699 msgid "Attempt to start non-existent spindle" @@ -2772,33 +2721,33 @@ msgstr "Versuch eine nicht existierende Spindel einzuschalten" #: src/emc/motion/command.c:1747 #, c-format msgid "Attempt to stop non-existent spindle <%d>" -msgstr "Versuch eine nicht existierende Spindel auszuschalten" +msgstr "Versuch eine nicht existierende Spindel (%d) auszuschalten" #: src/emc/motion/command.c:1777 #, c-format msgid "Attempt to orient non-existent spindle <%d>" -msgstr "Versuch eine nicht existierende Spindel zu orrientieren" +msgstr "Versuch eine nicht existierende Spindel (%d) zu orrientieren" #: src/emc/motion/command.c:1823 #, c-format msgid "Attempt to increase non-existent spindle <%d>" -msgstr "Versuche Geschwindigkeit einer nicht existierenden Spindel zu erhöhen" +msgstr "Versuche Geschwindigkeit einer nicht existierenden Spindel (%d) zu erhöhen" #: src/emc/motion/command.c:1846 #, c-format msgid "Attempt to decreasenon-existent spindle <%d>" msgstr "" -"Versuche Geschwindigkeit einer nicht existierenden Spindel zu verringern" +"Versuche Geschwindigkeit einer nicht existierenden Spindel (%d) zu verringern" #: src/emc/motion/command.c:1861 #, c-format msgid "Attempt to engage brake of non-existent spindle <%d>" -msgstr "Versuch Bremse einer nicht existierenden Spindel zu schalten" +msgstr "Versuch Bremse einer nicht existierenden Spindel (%d) zu schalten" #: src/emc/motion/command.c:1883 #, c-format msgid "Attempt to release brake of non-existent spindle <%d>" -msgstr "Versuch Bremse einer nicht existierenden Spindel zu lösen" +msgstr "Versuch Bremse einer nicht existierenden Spindel (%d) zu lösen" #: src/emc/motion/command.c:1905 #, c-format @@ -2829,13 +2778,9 @@ msgid "MOTION: num_joints is %d, must be between 1 and %d\n" msgstr "MOTION: num_joints ist %d, muß zwischen 1 und %d liegen\n" #: src/emc/motion/motion.c:222 -#, fuzzy, c-format +#, c-format msgid "MOTION: num_spindles is %d, must be between 0 and %d\n" -msgstr "" -"#-#-#-#-# de2.po (de) #-#-#-#-#\n" -"MOTION: num_joints ist %d, muß zwischen 1 und %d liegen\n" -"#-#-#-#-# de_master.po (de) #-#-#-#-#\n" -"MOTION: num_joints ist %d, muß zwischen 0 und %d liegen\n" +msgstr "MOTION: num_spindles ist %d, muß zwischen 0 und %d liegen\n" #: src/emc/motion/motion.c:230 #, c-format @@ -2881,7 +2826,7 @@ msgstr "MOTION: emcmot_hal_data malloc fehlgeschlagen\n" #: src/emc/motion/motion.c:450 #, c-format msgid "MOTION: spindle %d pin export failed" -msgstr "MOTION: Spindel %d Pinexport fehlgeschlagen" +msgstr "MOTION: Spindel %d Pin-Export fehlgeschlagen" #: src/emc/motion/motion.c:462 #, c-format @@ -2909,9 +2854,11 @@ msgid "unknown state '%d' during homing sequence" msgstr "Unbekannter Zustand '%d' bei Referenzfahrt" #: src/emc/motion/homing.c:362 -#, fuzzy, c-format +#, c-format msgid "Cannot home while shared home switch is closed j=%d" -msgstr "Keine Referenzfahrt bei geschlossenem gemeinsamem Endschalter" +msgstr "" +"Keine Referenzfahrt möglich wenn gemeinsamer Endschalter geschlossen ist" +" (Achse/Gelenk: %d)" #: src/emc/motion/homing.c:422 msgid "" @@ -2927,29 +2874,29 @@ msgstr "" "Ungültige Referenz-Konfiguration: SEARCH_VEL ungleich Null braucht LATCH_VEL" #: src/emc/motion/homing.c:579 -#, fuzzy, c-format +#, c-format msgid "Home switch inactive before start of backoff move j=%d" -msgstr "Referenzschalter inaktiv vor der Rückbewegung" +msgstr "Referenzschalter inaktiv vor der Rückbewegung (Achse/Gelenk: %d)" #: src/emc/motion/homing.c:628 -#, fuzzy, c-format +#, c-format msgid "Home switch active before start of latch move j=%d" -msgstr "Referenzschalter inaktiv vor der Rückbewegung" +msgstr "Referenzschalter aktiv vor der Auslösebewegung (Achse/Gelenk: %d)" #: src/emc/motion/homing.c:685 -#, fuzzy, c-format +#, c-format msgid "Home switch inactive before start of latch move j=%d" -msgstr "Referenzschalter inaktiv vor der Rückbewegung" +msgstr "Referenzschalter inaktiv vor der Auslösebewegung (Achse/Gelenk: %d)" #: src/emc/motion/homing.c:924 -#, fuzzy, c-format +#, c-format msgid "hit limit in home state j=%d" -msgstr "Grenze im Referenzstatus erreicht %d" +msgstr "Grenze im Referenzstatus erreicht (Achse/Gelenk: %d)" #: src/emc/motion/homing.c:981 -#, fuzzy, c-format +#, c-format msgid "unknown state '%d' during homing j=%d" -msgstr "Unbekannter Zustand '%d' während Referenzfahrt" +msgstr "Unbekannter Zustand '%d' während Referenzfahrt (Achse/Gelenk: %d)" #: src/hal/classicladder/classicladder.c:194 #, c-format @@ -3013,7 +2960,7 @@ msgstr "" #: src/hal/classicladder/classicladder_gtk.c:394 #, fuzzy msgid "Load Error" -msgstr "Fehler" +msgstr "Fehler beim Laden" #: src/hal/classicladder/classicladder_gtk.c:394 msgid "Failed to load the project file..." @@ -3070,7 +3017,7 @@ msgstr "" #: src/hal/classicladder/classicladder_gtk.c:426 #, fuzzy msgid "Save Error" -msgstr "Fehler" +msgstr "Fehler beim Speichern" #: src/hal/classicladder/classicladder_gtk.c:409 #: src/hal/classicladder/classicladder_gtk.c:426 @@ -3201,12 +3148,12 @@ msgstr "" #: src/hal/classicladder/classicladder_gtk.c:762 #, fuzzy msgid "Display symbols" -msgstr "Anzeigeoptionen" +msgstr "Symbole anzeigen" #: src/hal/classicladder/classicladder_gtk.c:816 #, fuzzy msgid "Statusbar" -msgstr "Status" +msgstr "Statusleiste" #: src/hal/classicladder/classicladder_gtk.c:836 msgid "Load" @@ -3255,7 +3202,7 @@ msgstr "Vorschau" #: src/hal/classicladder/classicladder_gtk.c:888 #, fuzzy msgid "Print" -msgstr "Drucker-Einstellungen" +msgstr "Drucken" #: src/hal/classicladder/classicladder_gtk.c:894 tcl/bin/halconfig.tcl:194 #: src/emc/usr_intf/pncconf/help.glade:514 @@ -3325,7 +3272,7 @@ msgstr "" #: src/hal/classicladder/config.c:86 #, fuzzy, c-format msgid "Cannot open %s file !!!\n" -msgstr "Sicherungsdatei kann nicht geöffnet werden" +msgstr "Kann Datei %s nicht öffnen!\n" #: src/hal/classicladder/config.c:117 #, c-format @@ -3345,32 +3292,32 @@ msgstr "" #: src/hal/classicladder/config_gtk.c:118 #, fuzzy, c-format msgid "Number of Bits " -msgstr " " +msgstr "Anzahl Bits " #: src/hal/classicladder/config_gtk.c:122 #, fuzzy, c-format msgid "Number of Error Bits " -msgstr " " +msgstr "Anzahl Fehlerbits " #: src/hal/classicladder/config_gtk.c:126 #, fuzzy, c-format msgid "Number of Words " -msgstr " " +msgstr "Anzahl Words " #: src/hal/classicladder/config_gtk.c:130 #, fuzzy, c-format msgid "Number of Counters " -msgstr "Tatsächliche Servoperiode: " +msgstr "Anzahl Zähler " #: src/hal/classicladder/config_gtk.c:134 #, fuzzy, c-format msgid "Number of Timers IEC " -msgstr "Tatsächliche Servoperiode: " +msgstr "Anzahl IEC Timer " #: src/hal/classicladder/config_gtk.c:138 #, fuzzy, c-format msgid "Number of Arithmetic Expressions " -msgstr "Digitale Eingänge:" +msgstr "Anzahl arithmetischer Ausdrücke" #: src/hal/classicladder/config_gtk.c:143 #, c-format @@ -3380,12 +3327,12 @@ msgstr "" #: src/hal/classicladder/config_gtk.c:147 #, fuzzy, c-format msgid "Number of Symbols " -msgstr " " +msgstr "Anzahl Symbole " #: src/hal/classicladder/config_gtk.c:152 #, fuzzy, c-format msgid "Number of Timers " -msgstr " " +msgstr "Anzahl Timer " #: src/hal/classicladder/config_gtk.c:156 #, c-format @@ -3415,12 +3362,12 @@ msgstr "" #: src/hal/classicladder/config_gtk.c:177 #, fuzzy, c-format msgid "Number of floatin HAL pins " -msgstr "Analoge Eingänge (float):" +msgstr "Anzahl HAL-Eingangspins (float)" #: src/hal/classicladder/config_gtk.c:181 #, fuzzy, c-format msgid "Number of floatout HAL pins " -msgstr "Analoge Ausgänge (float):" +msgstr "Anzahl HAL-Ausgangspins (float)" #: src/hal/classicladder/config_gtk.c:185 #, c-format @@ -3430,7 +3377,7 @@ msgstr "" #: src/hal/classicladder/config_gtk.c:384 #, fuzzy msgid "Inverted" -msgstr "Invertieren" +msgstr "Invertiert" #: src/hal/classicladder/config_gtk.c:504 #, c-format @@ -3451,7 +3398,7 @@ msgstr "" #: src/hal/classicladder/config_gtk.c:636 #, fuzzy, c-format msgid "Serial baud rate" -msgstr "Serielles Modbus-Programm" +msgstr "Serielle Baudrate" #: src/hal/classicladder/config_gtk.c:641 #, c-format @@ -3476,12 +3423,12 @@ msgstr "" #: src/hal/classicladder/config_gtk.c:658 #, fuzzy, c-format msgid "Modbus element offset" -msgstr "Werkzeug-Längen-Index zu groß" +msgstr "Offset Modbus-Element" #: src/hal/classicladder/config_gtk.c:662 #, fuzzy, c-format msgid "Debug level" -msgstr "Debug-Level" +msgstr "Debuglevel" #: src/hal/classicladder/config_gtk.c:666 #, c-format @@ -3510,9 +3457,7 @@ msgstr "" #: src/hal/classicladder/config_gtk.c:737 #, fuzzy msgid "YES" -msgstr "" -"NEIN\n" -"JA" +msgstr "JA" #: src/hal/classicladder/config_gtk.c:783 msgid "QUIET" @@ -4582,9 +4527,8 @@ msgid "Unknown variable (global error)" msgstr "" #: tcl/bin/emccalib.tcl:95 -#, fuzzy msgid "LinuxCNC Calibration" -msgstr "LinuxCNC Servoachsen-Kalibrierung" +msgstr "LinuxCNC Kalibrierung" #: tcl/bin/emccalib.tcl:103 msgid "Save To File" @@ -4716,7 +4660,6 @@ msgid "Paste" msgstr "Einfügen" #: tcl/bin/genedit.tcl:99 -#, fuzzy msgid "Select All" msgstr "Alles markieren" @@ -4922,22 +4865,12 @@ msgid "Expand Pins" msgstr "Pins aufklappen" #: tcl/bin/halconfig.tcl:177 tcl/bin/halshow.tcl:116 -#, fuzzy msgid "Expand Parameters" -msgstr "" -"#-#-#-#-# de2.po (de) #-#-#-#-#\n" -"Parameters aufklappen\n" -"#-#-#-#-# de_master.po (de) #-#-#-#-#\n" -"Parameter aufklappen" +msgstr "Parameter aufklappen" #: tcl/bin/halconfig.tcl:179 tcl/bin/halshow.tcl:118 -#, fuzzy msgid "Expand Signals" -msgstr "" -"#-#-#-#-# de2.po (de) #-#-#-#-#\n" -"Signals aufklappen\n" -"#-#-#-#-# de_master.po (de) #-#-#-#-#\n" -"Signale aufklappen" +msgstr "Signale aufklappen" #: tcl/bin/halconfig.tcl:182 tcl/bin/halshow.tcl:121 msgid "Erase Watch" @@ -4957,7 +4890,7 @@ msgid "Tune %d" msgstr "%d einstellen" #: tcl/bin/halconfig.tcl:883 -#, fuzzy, tcl-format +#, tcl-format msgid "" "The HAL parameter \n" " %s \n" @@ -5026,13 +4959,8 @@ msgid "Load Watch List" msgstr "Beobachtungsliste laden" #: tcl/bin/halshow.tcl:107 -#, fuzzy msgid "Tree View" -msgstr "" -"#-#-#-#-# de2.po (de) #-#-#-#-#\n" -"Ansicht\n" -"#-#-#-#-# de_master.po (de) #-#-#-#-#\n" -"Menübaum" +msgstr "Menübaum" #: tcl/bin/halshow.tcl:288 msgid "Test HAL command :" @@ -5183,18 +5111,16 @@ msgid "LinuxCNC Errors" msgstr "LinuxCNC-Fehler" #: tcl/show_errors.tcl:81 -#, fuzzy msgid "" "LinuxCNC terminated with an error. When reporting problems, please create a " "report file and include in your message." msgstr "" -"EMC2 wurde mit einem Fehler beendet. Falls Sie den Fehler melden wollen, " +"LinuxCNC wurde mit einem Fehler beendet. Falls Sie den Fehler melden wollen, " "fügen Sie bitte Ihrer Mitteilung die unten stehenden Informationen bei." #: tcl/show_errors.tcl:107 -#, fuzzy msgid "Create Report File" -msgstr "Erstellen oder Bearbeiten" +msgstr "Bericht erstellen" #: tcl/show_errors.tcl:109 tcl/scripts/Set_Coordinates.tcl:107 msgid "Close" @@ -5382,18 +5308,16 @@ msgid "Hal Scope" msgstr "HAL-Scope" #: tcl/tklinuxcnc.tcl:806 -#, fuzzy msgid "Set Coordinates" -msgstr "EMC2 Koordinaten-Setup" +msgstr "Koordinaten setzen" #: tcl/tklinuxcnc.tcl:814 msgid "HAL Show" msgstr "HAL anzeigen..." #: tcl/tklinuxcnc.tcl:815 -#, fuzzy msgid "HAL Config" -msgstr "HAL konfigurieren" +msgstr "HAL Config" #: tcl/tklinuxcnc.tcl:820 msgid "Help..." @@ -5537,40 +5461,20 @@ msgid "Set feed override:" msgstr "Vorschubübersteuerung:" #: tcl/tklinuxcnc.tcl:1349 -#, fuzzy msgid "Set Spindle Override" -msgstr "" -"#-#-#-#-# de2.po (de) #-#-#-#-#\n" -"Spindelübersteuerung\n" -"#-#-#-#-# de_master.po (de) #-#-#-#-#\n" -"Spindelübersteuerung setzen" +msgstr "Spindelübersteuerung setzen" #: tcl/tklinuxcnc.tcl:1355 -#, fuzzy msgid "Set spindle speed override:" -msgstr "" -"#-#-#-#-# de2.po (de) #-#-#-#-#\n" -"Spindelübersteuerung:\n" -"#-#-#-#-# de_master.po (de) #-#-#-#-#\n" -"Spindelübersteuerung setzen:" +msgstr "Spindelübersteuerung setzen:" #: tcl/tklinuxcnc.tcl:1410 -#, fuzzy msgid "Linear Jog Speed" -msgstr "" -"#-#-#-#-# de2.po (de) #-#-#-#-#\n" -"Lineare Schrittgeschwindigkeit\n" -"#-#-#-#-# de_master.po (de) #-#-#-#-#\n" -"Lineare Verfahrgeschwindigkeit" +msgstr "Lineare Verfahrgeschwindigkeit" #: tcl/tklinuxcnc.tcl:1441 -#, fuzzy msgid "Angular Jog Speed (deg)/min:" -msgstr "" -"#-#-#-#-# de2.po (de) #-#-#-#-#\n" -"Winkel-Schrittgeschwindigkeit Grad/min:\n" -"#-#-#-#-# de_master.po (de) #-#-#-#-#\n" -"Winkelgeschwindigkeit Grad/min:" +msgstr "Winkelgeschwindigkeit Grad/min:" #: tcl/tklinuxcnc.tcl:1465 share/axis/tcl/axis.tcl:1511 msgid "Feed Override:" @@ -5795,9 +5699,8 @@ msgid "sub label" msgstr "" #: tcl/ngcgui.tcl:528 tcl/ngcgui.tcl:583 -#, fuzzy msgid "does not match subroutine file name" -msgstr "Zu viele Ebenen für die Unterfunktion" +msgstr "Entspricht nicht dem Dateinamen des Unterprogramms" #: tcl/ngcgui.tcl:543 tcl/ngcgui.tcl:544 msgid "ignoring M2 after endsub" @@ -6360,7 +6263,6 @@ msgid "(Restart required after fixing ini file)" msgstr "" #: tcl/ngcgui.tcl:3844 -#, fuzzy msgid "Try to Continue" msgstr "Fortsetzen" @@ -6513,27 +6415,24 @@ msgid "for" msgstr "oder" #: tcl/ngcgui_app.tcl:60 -#, fuzzy msgid "not readable" -msgstr "Datei ist nicht lesbar" +msgstr "nicht lesbar" #: tcl/ngcgui_app.tcl:66 tcl/ngcgui_app.tcl:69 msgid "Unexpected: multiple startups for ngcgui" msgstr "" #: tcl/ngcgui_app.tcl:67 -#, fuzzy msgid "LinuxCNC" -msgstr "TKLinuxCNC" +msgstr "LinuxCNC" #: tcl/ngcgui_app.tcl:68 msgid "for linuxCNC 2.5.xxx, Do not include tkapp.py in the ini file" msgstr "" #: tcl/ngcgui_app.tcl:87 -#, fuzzy msgid "LinuxCNC version" -msgstr "LinuxCNC-Fehler" +msgstr "LinuxCNC-Version" #: tcl/ngcgui_app.tcl:88 msgid "for LinuxCNC 2.5.xxx, Do not include tkapp.py in the ini file" @@ -6830,9 +6729,8 @@ msgid "Do you really want to close LinuxCNC?" msgstr "" #: src/emc/usr_intf/axis/scripts/axis.py:153 -#, fuzzy msgid "Confirm Close" -msgstr "Konfiguration kopiert" +msgstr "Schließen bestätigen" #: src/emc/usr_intf/axis/scripts/axis.py:178 msgid "Emergency stop" @@ -6859,7 +6757,6 @@ msgid "Activate fourth axis" msgstr "Vierte Achse aktivieren" #: src/emc/usr_intf/axis/scripts/axis.py:185 -#, fuzzy msgid "Activate first through ninth joint" msgstr "Fünfte bis neunte Achse aktivieren" @@ -6910,14 +6807,14 @@ msgstr "Pos1" #: src/emc/usr_intf/axis/scripts/axis.py:193 #, fuzzy msgid "Send active joint home" -msgstr "Referenzfahrt mit der aktiven Achse" +msgstr "" +"Referenzfahrt mit der aktiven Achse --> Aktive Achse auf Home-Position fahren?" #: src/emc/usr_intf/axis/scripts/axis.py:194 msgid "Ctrl-Home" msgstr "Strg-Pos1" #: src/emc/usr_intf/axis/scripts/axis.py:194 -#, fuzzy msgid "Home all joints" msgstr "Referenzfahrt mit allen Achsen" @@ -6938,31 +6835,26 @@ msgid "Set G54 offset for active axis" msgstr "Absolute Nullpunktverschiebung für die aktive Achse setzen" #: src/emc/usr_intf/axis/scripts/axis.py:197 -#, fuzzy msgid "Ctrl-End" -msgstr "Strg-R" +msgstr "Strg-Ende" #: src/emc/usr_intf/axis/scripts/axis.py:197 -#, fuzzy msgid "Set tool offset for loaded tool" -msgstr "Absolute Nullpunktverschiebung für die aktive Achse setzen" +msgstr "Werkzeuglängenkorrektur aktives Werkzeug setzen" #: src/emc/usr_intf/axis/scripts/axis.py:198 -#, fuzzy msgid "Jog active axis or joint" msgstr "Aktive Achse verfahren" #: src/emc/usr_intf/axis/scripts/axis.py:199 -#, fuzzy msgid "Select Max velocity" -msgstr "Max. Geschwindigkeit:" +msgstr "Max. Geschwindigkeit wählen" #: src/emc/usr_intf/axis/scripts/axis.py:202 msgid "Left, Right" msgstr "Links, Rechts" #: src/emc/usr_intf/axis/scripts/axis.py:202 -#, fuzzy msgid "Jog first axis or joint" msgstr "Erste Achse verfahren" @@ -6971,7 +6863,6 @@ msgid "Up, Down" msgstr "Hoch, Runter" #: src/emc/usr_intf/axis/scripts/axis.py:203 -#, fuzzy msgid "Jog second axis or joint" msgstr "Zweite Achse verfahren" @@ -6980,7 +6871,6 @@ msgid "Pg Up, Pg Dn" msgstr "Bild auf, Bild ab" #: src/emc/usr_intf/axis/scripts/axis.py:204 -#, fuzzy msgid "Jog third axis or joint" msgstr "Dritte Achse verfahren" @@ -6993,7 +6883,6 @@ msgid "Jog at traverse speed" msgstr "" #: src/emc/usr_intf/axis/scripts/axis.py:206 -#, fuzzy msgid "Jog fourth axis or joint" msgstr "Vierte Achse verfahren" @@ -7010,7 +6899,6 @@ msgid "Pan, rotate or select line" msgstr "Verschieben, drehen oder Linie auswählen" #: src/emc/usr_intf/axis/scripts/axis.py:211 -#, fuzzy msgid "Shift+Left Button" msgstr "Umschalt+Linke Maustaste" @@ -7203,9 +7091,8 @@ msgid "Alt-F, M, V" msgstr "" #: src/emc/usr_intf/axis/scripts/axis.py:250 -#, fuzzy msgid "Open a Menu" -msgstr "Eine neue Unterdatei öffnen" +msgstr "Ein Menü öffnen" #: src/emc/usr_intf/axis/scripts/axis.py:906 #, python-format @@ -7378,7 +7265,7 @@ msgstr "Keine Datei geladen" #: src/emc/usr_intf/axis/scripts/axis.py:1990 #, python-format msgid "generated from %s" -msgstr "Erstellt von »%«" +msgstr "Erstellt von %s" #: src/emc/usr_intf/axis/scripts/axis.py:1996 #, python-format @@ -7422,9 +7309,8 @@ msgid "axis cannot accept remote command while running" msgstr "" #: src/emc/usr_intf/axis/scripts/axis.py:2253 -#, fuzzy msgid "File not Writable:" -msgstr "Datei ist nicht lesbar" +msgstr "Datei ist nicht schreibbar:" #: src/emc/usr_intf/axis/scripts/axis.py:2254 msgid "" @@ -7442,9 +7328,8 @@ msgid "Edit-readonly" msgstr "" #: src/emc/usr_intf/axis/scripts/axis.py:2576 -#, fuzzy msgid "Custom Grid" -msgstr "Benutzerdefiniert" +msgstr "Benutzerdefiniertes Raster" #: src/emc/usr_intf/axis/scripts/axis.py:2576 msgid "Enter grid size" @@ -7527,9 +7412,8 @@ msgid "Axes" msgstr "" #: src/emc/usr_intf/axis/scripts/axis.py:3504 -#, fuzzy msgid "Joints" -msgstr "Achse/Gelenk:" +msgstr "Achsen/Gelenke" #: src/emc/usr_intf/axis/scripts/axis.py:3506 #: src/emc/usr_intf/touchy/touchy.glade:577 @@ -7575,14 +7459,13 @@ msgid "KINEMATICS_IDENTITY with duplicate axis letter <%s>\n" msgstr "" #: src/emc/usr_intf/axis/scripts/axis.py:3602 -#, fuzzy msgid "Joint" -msgstr "Achse/Gelenk:" +msgstr "Achse/Gelenk" #: src/emc/usr_intf/axis/scripts/axis.py:3604 #, fuzzy msgid "Home Joint" -msgstr "_Referenzpunkt:" +msgstr "Referenzpunkt" #: src/emc/usr_intf/axis/scripts/axis.py:3612 #, python-format @@ -7836,9 +7719,8 @@ msgid "Depth images" msgstr "Bilddateien" #: src/emc/usr_intf/axis/scripts/debuglevel.py:22 -#, fuzzy msgid "LinuxCNC Debug Level" -msgstr "LinuxCNC Debug-Stufe" +msgstr "LinuxCNC Debug-Level" #: src/emc/usr_intf/axis/scripts/debuglevel.py:23 msgid "debuglevel" @@ -7998,12 +7880,10 @@ msgid "Show _Hal Configuration" msgstr "_HAL-Konfiguration anzeigen" #: share/axis/tcl/axis.tcl:183 -#, fuzzy msgid "H_al Meter" msgstr "H_al Meter" #: share/axis/tcl/axis.tcl:187 -#, fuzzy msgid "Ha_l Scope" msgstr "Ha_l Scope" @@ -8012,9 +7892,8 @@ msgid "Sho_w LinuxCNC Status" msgstr "LinuxCNC-Status an_zeigen" #: share/axis/tcl/axis.tcl:195 -#, fuzzy msgid "Set _Debug Level" -msgstr "Deb_ug-Stufe festlegen" +msgstr "_Debug-Level festlegen" #: share/axis/tcl/axis.tcl:201 msgid "Homin_g" @@ -8161,9 +8040,8 @@ msgid "_Clear live plot" msgstr "Werkzeugpfad _löschen" #: share/axis/tcl/axis.tcl:385 -#, fuzzy msgid "Ctrl-E" -msgstr "Strg-R" +msgstr "Strg-E" #: share/axis/tcl/axis.tcl:396 msgid "Show commanded position" @@ -8597,9 +8475,8 @@ msgstr "Erlaubt über die Endschalter zu verfahren [L]" #: src/emc/usr_intf/pncconf/pncconf.py:1693 #: src/emc/usr_intf/pncconf/pncconf.py:1696 #: src/emc/usr_intf/gscreen/gscreen.py:1321 -#, fuzzy msgid "Follow System Theme" -msgstr "Systemthema folgen\n" +msgstr "Systemthema folgen" #: src/emc/usr_intf/touchy/mdi.py:47 src/emc/usr_intf/stepconf/stepconf.py:209 #: src/emc/usr_intf/pncconf/private_data.py:494 @@ -8667,22 +8544,12 @@ msgid "Probe" msgstr "Sensor" #: src/emc/usr_intf/touchy/mdi.py:71 src/emc/usr_intf/gscreen/mdi.py:70 -#, fuzzy msgid "Radius compensation left" -msgstr "" -"#-#-#-#-# de2.po (de) #-#-#-#-#\n" -"Radiusausgleich links\n" -"#-#-#-#-# de_master.po (de) #-#-#-#-#\n" -"Werkzeugradienkorrektur links" +msgstr "Werkzeugradiuskorrektur links" #: src/emc/usr_intf/touchy/mdi.py:72 src/emc/usr_intf/gscreen/mdi.py:71 -#, fuzzy msgid "Radius compensation right" -msgstr "" -"#-#-#-#-# de2.po (de) #-#-#-#-#\n" -"Radiusausgleich rechts\n" -"#-#-#-#-# de_master.po (de) #-#-#-#-#\n" -"Werkzeugradienkorrektur rechts" +msgstr "Werkzeugradiuskorrektur rechts" #: src/emc/usr_intf/touchy/mdi.py:73 src/emc/usr_intf/gscreen/mdi.py:72 msgid "Radius compensation left, immediate" @@ -8869,9 +8736,8 @@ msgid "wa" msgstr "" #: src/emc/usr_intf/touchy/touchy.glade:332 -#, fuzzy msgid "ad" -msgstr "Ende" +msgstr "" #: src/emc/usr_intf/touchy/touchy.glade:346 msgid "bd" @@ -8894,9 +8760,8 @@ msgid "wd" msgstr "" #: src/emc/usr_intf/touchy/touchy.glade:448 -#, fuzzy msgid "Estop Reset" -msgstr "Notaus gesetzt" +msgstr "Notaus zurücksetzen" #: src/emc/usr_intf/touchy/touchy.glade:459 #: src/emc/usr_intf/stepconf/pport1.glade:21 @@ -9431,9 +9296,8 @@ msgstr "" "\n" #: src/emc/usr_intf/stepconf/stepconf.py:139 -#, fuzzy msgid "Stepconf" -msgstr "Schritt" +msgstr "Stepconf" #: src/emc/usr_intf/stepconf/stepconf.py:139 #: src/emc/usr_intf/stepconf/stepconf.py:240 @@ -18499,9 +18363,9 @@ msgid "The file path should not contain any spaces" msgstr "Der Dateipfad darf keine Leerzeichen enthalten" #: src/emc/usr_intf/gmoccapy/gmoccapy.py:632 -#, fuzzy, python-brace-format +#, python-brace-format msgid "Press to home all {0}" -msgstr "Drücken um alle Achsen zu referenzieren" +msgstr "Drücken um alle Achsen zu referenzieren {0}" #: src/emc/usr_intf/gmoccapy/gmoccapy.py:641 #: src/emc/usr_intf/gmoccapy/gmoccapy.py:891 @@ -18627,9 +18491,9 @@ msgid "**** Only the first 10 will be reachable through this screen ****" msgstr "" #: src/emc/usr_intf/gmoccapy/gmoccapy.py:1128 -#, fuzzy, python-brace-format +#, python-brace-format msgid "unknown jog command {0}" -msgstr "Unbekanntes G-Wort" +msgstr "Unbekannter Verfahr-Befehl {0}" #: src/emc/usr_intf/gmoccapy/gmoccapy.py:1155 #, python-brace-format @@ -18695,7 +18559,7 @@ msgstr "" #: src/emc/usr_intf/gmoccapy/gmoccapy.py:1505 #, fuzzy msgid "this is not a usual config\n" -msgstr "Achse reagiert nicht" +msgstr "Das ist keine normale Konfiguration\n" #: src/emc/usr_intf/gmoccapy/gmoccapy.py:1506 msgid "we miss one of X , Y or Z axis\n" @@ -18707,15 +18571,13 @@ msgstr "" #: src/emc/usr_intf/gmoccapy/gmoccapy.py:1673 #: src/emc/usr_intf/gmoccapy/gmoccapy.py:2712 -#, fuzzy msgid "mm/min" msgstr "mm/min " #: src/emc/usr_intf/gmoccapy/gmoccapy.py:1676 #: src/emc/usr_intf/gmoccapy/gmoccapy.py:2715 -#, fuzzy msgid "inch/min" -msgstr "Zoll / min" +msgstr "Inch/min" #: src/emc/usr_intf/gmoccapy/gmoccapy.py:1701 msgid "**** Invalid embedded tab configuration ****" @@ -18837,14 +18699,14 @@ msgid "Enter value:" msgstr "" #: src/emc/usr_intf/gmoccapy/gmoccapy.py:2796 -#, fuzzy, python-brace-format +#, python-brace-format msgid "Set parameter {0} to:" -msgstr "Noch keine Parameter" +msgstr "Parameter {0} setzen auf:" #: src/emc/usr_intf/gmoccapy/gmoccapy.py:2798 #, fuzzy msgid "conversion error" -msgstr "Unbekannter Fehler" +msgstr "Umwandlungsfehler" #: src/emc/usr_intf/gmoccapy/gmoccapy.py:2799 #: src/emc/usr_intf/gmoccapy/gmoccapy.py:4501 @@ -18857,11 +18719,10 @@ msgid "This button will show or hide the keyboard" msgstr "" #: src/emc/usr_intf/gmoccapy/gmoccapy.py:2942 -#, fuzzy msgid "Mode change is only allowed if the interpreter is idle!" msgstr "" -"%s kann im automatischen Modus nicht ausgeführt werden, wenn der Interpreter " -"stillsteht" +"Der Modus kann nur gewechselt werden, wenn der Interpreter nicht ausgeführt" +" wird!" #: src/emc/usr_intf/gmoccapy/gmoccapy.py:3157 #, python-brace-format @@ -18875,9 +18736,8 @@ msgstr "" #: src/emc/usr_intf/gmoccapy/gmoccapy.py:3329 #: src/emc/usr_intf/gmoccapy/gmoccapy.glade:3163 -#, fuzzy msgid "No tool description available" -msgstr "Es ist keine Beschreibung verfügbar." +msgstr "Keine Werkzeugbeschreibung verfügbar" #: src/emc/usr_intf/gmoccapy/gmoccapy.py:3470 #, python-brace-format @@ -18897,9 +18757,8 @@ msgid "Just to warn you" msgstr "" #: src/emc/usr_intf/gmoccapy/gmoccapy.py:3710 -#, fuzzy msgid "Classicladder real-time component not detected" -msgstr "Echtzeicht-Komponente nicht geladen" +msgstr "Classicladder Echtzeicht-Komponente nicht geladen" #: src/emc/usr_intf/gmoccapy/gmoccapy.py:3825 #, python-brace-format @@ -19506,10 +19365,9 @@ msgstr "" msgid "Keyboard" msgstr "Leistung" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:4782 -#, fuzzy +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:3299 msgid "show preview" -msgstr "Vorschau" +msgstr "Vorschau anzeigen" #: src/emc/usr_intf/gmoccapy/gmoccapy.glade:4798 #, fuzzy @@ -19535,20 +19393,18 @@ msgstr "Absolut" msgid "DTG Color" msgstr "DTG-Textfarbe" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:4983 -#, fuzzy +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:3493 msgid "Homed color" -msgstr "Referenzfahrt" +msgstr "Farbe wenn referenziert" #: src/emc/usr_intf/gmoccapy/gmoccapy.glade:4998 #, fuzzy msgid "Unhomed color" msgstr "Referenzfahrt aufheben bei allen Achsen" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:5101 -#, fuzzy +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:3613 msgid "Digits" -msgstr "Digital" +msgstr "Stellen (digits)" #: src/emc/usr_intf/gmoccapy/gmoccapy.glade:5151 msgid "" @@ -19556,90 +19412,80 @@ msgid "" "clicking on the DRO" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:5177 -#, fuzzy +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:3702 msgid "DRO" -msgstr " a)" +msgstr " DRO" #: src/emc/usr_intf/gmoccapy/gmoccapy.glade:5214 #, fuzzy msgid "Grid size" msgstr "Größe" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:5251 -#, fuzzy +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:3776 msgid "Show DRO" -msgstr "Anzeigen" +msgstr "DRO anzeigen" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:5266 -#, fuzzy +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:3792 msgid "Show offsets" -msgstr "_Offsets anzeigen" +msgstr "Offsets anzeigen" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:5281 -#, fuzzy +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:3808 msgid "Show DTG" -msgstr "Anzeigen" +msgstr "DTG anzeigen" #: src/emc/usr_intf/gmoccapy/gmoccapy.glade:5310 #, fuzzy msgid "Mouse Button mode" msgstr "Bewegungsdaten" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:5350 -#, fuzzy +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:3878 msgid "Preview" -msgstr "Seite" +msgstr "Vorschau" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:5409 -#, fuzzy +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:3937 msgid "" "current\n" " file" -msgstr "in der aktuellen Unterdatei" +msgstr "" +"aktuelle \n" +"Datei" #: src/emc/usr_intf/gmoccapy/gmoccapy.glade:5456 msgid "File to load on start" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:5486 -#, fuzzy +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:4016 msgid "Select user dir" -msgstr "Schrittgeschwindigkeit auswählen" +msgstr "Benutzerverzeichnis auswählen" #: src/emc/usr_intf/gmoccapy/gmoccapy.glade:5496 #, fuzzy msgid "Select jump to dir" msgstr "Element zum Anzeigen auswählen" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:5626 -#, fuzzy +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:4156 msgid "Themes and sound" -msgstr "Standardeinstellungen und Optionen" +msgstr "Themes und Sound" #: src/emc/usr_intf/gmoccapy/gmoccapy.glade:5663 msgid "Appearance" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:5703 -#, fuzzy +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:4233 msgid "Scale rapid override" -msgstr "Spindelübersteuerung" +msgstr "Skalierung Eilganggeschwindigkeit" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:5719 -#, fuzzy +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:4249 msgid "Scale jog velocity" -msgstr "Geschwi_ndigkeit anzeigen" +msgstr "Skalierung Jog-Geschwindigkeit" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:5733 -#, fuzzy +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:4263 msgid "Scale feed override" -msgstr "Vorschubübersteuerung:" +msgstr "Skalierung Vorschubübersteuerung:" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:5749 -#, fuzzy +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:4279 msgid "Scale spindle override" -msgstr "Spindelübersteuerung" +msgstr "Skalierung Spindelübersteuerung" #: src/emc/usr_intf/gmoccapy/gmoccapy.glade:5852 #, fuzzy @@ -19659,29 +19505,25 @@ msgid "Use unlock code" msgstr "" # Anmerkung:FJ: Hmmmm .... -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:5938 -#, fuzzy +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:4470 msgid "Do not use unlock code" -msgstr "Das Koordinaten-Wort C kann hier nicht verwendet werden" +msgstr "Entsperrcode nicht verwenden" #: src/emc/usr_intf/gmoccapy/gmoccapy.glade:5954 msgid "Use hal pin to unlock" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:5976 -#, fuzzy +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:4510 msgid "Unlock settings" -msgstr "Werkzeugeinstellung" +msgstr "Entsperr-Einstellungen" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:6097 -#, fuzzy +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:4631 msgid "Spindle bar min" -msgstr "Spindelbremse an" +msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:6111 -#, fuzzy +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:4645 msgid "Spindle bar max" -msgstr "Spindelbremse" +msgstr "" #: src/emc/usr_intf/gmoccapy/gmoccapy.glade:6158 msgid "Hide turtle Jog Button" @@ -19691,10 +19533,9 @@ msgstr "" msgid "Turtle jog Factor" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:6235 -#, fuzzy +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:4770 msgid "Turtle Jog" -msgstr "Frontend" +msgstr "Turtle Jog" #: src/emc/usr_intf/gmoccapy/gmoccapy.glade:6282 msgid "Hardware" @@ -19716,35 +19557,29 @@ msgstr "Sensor" msgid "0.000" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:6453 -#, fuzzy +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:4989 msgid "Z Pos." -msgstr " Pos " +msgstr "Z Pos." -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:6484 -#, fuzzy +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:5020 msgid "Max. Probe" -msgstr "Sensor" +msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:6518 -#, fuzzy +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:5054 msgid "Probe Informations" -msgstr "Programmoptionen" +msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:6554 -#, fuzzy +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:5090 msgid "Search Vel." -msgstr "Suchpfad" +msgstr "Suchgeschwindigkeit" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:6566 -#, fuzzy +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:5102 msgid "Probe Vel." -msgstr "Sensor" +msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:6627 -#, fuzzy +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:5163 msgid "Probe velocitys" -msgstr "GUI-Frontend-Liste" +msgstr "" #: src/emc/usr_intf/gmoccapy/gmoccapy.glade:6642 msgid "" @@ -19755,15 +19590,13 @@ msgid "" "to configure the settings." msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:6663 -#, fuzzy +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:5199 msgid "Tool Measurement" -msgstr "Kühlflüssigkeit" +msgstr "Werkzeugvermessung" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:6693 -#, fuzzy +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:5229 msgid "Reload Tool on Start" -msgstr "Werkzeugtabelle neu laden" +msgstr "Werkzeug beim Start neu laden" #: src/emc/usr_intf/gmoccapy/gmoccapy.glade:6697 msgid "" @@ -19781,24 +19614,21 @@ msgid "" "is not possible." msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:6735 -#, fuzzy +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:5272 msgid "Reload Tool" -msgstr "Werkzeugtabelle neu laden" +msgstr "Werkzeug neu laden" #: src/emc/usr_intf/gmoccapy/gmoccapy.glade:6777 msgid "Do not use run from line" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:6793 -#, fuzzy +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:5331 msgid "Use run from line" -msgstr "Ab gewählter _Zeile ausführen" +msgstr "Ab gewählter Zeile ausführen" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:6815 -#, fuzzy +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:5354 msgid "Run from line" -msgstr "Referenzfahrt" +msgstr "Starten von Zeile" #: src/emc/usr_intf/gmoccapy/gmoccapy.glade:6859 msgid "Use frames" @@ -19850,12 +19680,13 @@ msgid "" " behavior and appearance
    " msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:7122 -#, fuzzy +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:5664 msgid "" "Advanced\n" " Settings" -msgstr "Erweiterte Optionen" +msgstr "" +"Erweiterte \n" +"Optionen" #: src/emc/usr_intf/gmoccapy/gmoccapy.glade:7163 msgid "User tab 1" @@ -19871,12 +19702,13 @@ msgid "" "[F1]" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:7243 -#, fuzzy +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:5786 msgid "" "Turn the machine on/off\n" "[F2]" -msgstr "Maschine an" +msgstr "" +"Maschine an/aus\n" +"[F2]" #: src/emc/usr_intf/gmoccapy/gmoccapy.glade:7267 msgid "" @@ -19890,19 +19722,17 @@ msgid "" "[F5]" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:7308 -#, fuzzy +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:5854 msgid "enter auto mode to run programs" -msgstr "Serielles Modbus-Programm" +msgstr "Zu Automatik-Modus wechseln um Programm zu starten" #: src/emc/usr_intf/gmoccapy/gmoccapy.glade:7326 msgid "Enter the settings page, the default code is \"123\"" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:7349 -#, fuzzy +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:5897 msgid "show user tabs" -msgstr "Status anzeigen" +msgstr "User-Tabs anzeigen" #: src/emc/usr_intf/gmoccapy/gmoccapy.glade:7406 msgid "open homing button list" @@ -19916,12 +19746,13 @@ msgstr "" msgid "Open the tooleditor page" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:7498 -#, fuzzy +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:6050 msgid "" "World\n" "Mode" -msgstr "World-Modus" +msgstr "" +"World-\n" +"Modus" #: src/emc/usr_intf/gmoccapy/gmoccapy.glade:7505 msgid "" @@ -19937,30 +19768,25 @@ msgstr "" msgid "Close gmoccapy / leave the program" msgstr "gmoccapy beenden" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:7653 -#, fuzzy +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:6208 msgid "Load a new program" -msgstr "Programm neu laden" +msgstr "Neues Programm laden" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:7691 -#, fuzzy +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:6247 msgid "Run the loaded program" -msgstr "Programm neu laden" +msgstr "Geladenes Programm starten" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:7709 -#, fuzzy +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:6265 msgid "Stop the running program" -msgstr "Programmausführung oder Laden der" +msgstr "Programmausführung stoppen" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:7727 -#, fuzzy +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:6283 msgid "Pause the running program" -msgstr "Programmausführung oder Laden der" +msgstr "Programmausführung pausieren" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:7735 -#, fuzzy +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:6292 msgid "pause the running program" -msgstr "Programmausführung oder Laden der" +msgstr "Programmausführung pausieren" #: src/emc/usr_intf/gmoccapy/gmoccapy.glade:7754 msgid "Run the loaded program step by step" @@ -19979,18 +19805,15 @@ msgid "" "yellow background." msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:7828 -#, fuzzy +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:6388 msgid "Edit the loaded program" -msgstr "SPS-Programm bearbeiten" +msgstr "geladenes Programm bearbeiten" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:7971 -#, fuzzy +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:6532 msgid "delete MDI" -msgstr "Löschen" +msgstr "MDI löschen" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:7977 -#, fuzzy +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:6538 msgid "delete MDI history" msgstr "MDI-Verlauf leeren" @@ -19998,20 +19821,17 @@ msgstr "MDI-Verlauf leeren" msgid "Cl.-ladder" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:8036 -#, fuzzy +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:6598 msgid "Open classicladder" -msgstr "SPS (Classicladder) einbinden" +msgstr "SPS (Classicladder) öffnen" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:8047 -#, fuzzy +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:6610 msgid "Hal-Scope" msgstr "HAL-Scope" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:8053 -#, fuzzy +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:6616 msgid "launch hal scope" -msgstr "%s starten" +msgstr "HAL-Scope starten" #: src/emc/usr_intf/gmoccapy/gmoccapy.glade:8070 msgid "launch linuxcnc status" @@ -20021,10 +19841,9 @@ msgstr "" msgid "launch hal meter" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:8105 -#, fuzzy +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:6671 msgid "launch calibration" -msgstr "_Kalibrierung" +msgstr "Kalibrierung starten" #: src/emc/usr_intf/gmoccapy/gmoccapy.glade:8116 msgid "Halshow" @@ -20055,35 +19874,30 @@ msgstr "" msgid "Go back to main button list" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:8364 -#, fuzzy +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:6935 msgid "delete selected tool or tools" -msgstr "Angegebene Werkzeug-Nummer zu groß" +msgstr "Angegebene Werkzeuge löschen" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:8381 -#, fuzzy +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:6953 msgid "add a new tool to tool table" -msgstr "We_rkzeugtabelle neu laden" +msgstr "Neues Werkzeug zur Werkzeugtabelle hinzufügen" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:8392 -#, fuzzy +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:6965 msgid "Reload" -msgstr "_Neu laden" +msgstr "Neu laden" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:8398 -#, fuzzy +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:6971 msgid "reload tool table from file" -msgstr "We_rkzeugtabelle neu laden" +msgstr "Werkzeugtabelle aus Datei neu laden" #: src/emc/usr_intf/gmoccapy/gmoccapy.glade:8415 msgid "" "apply the changes you made, G43 will be excecuted only if it is active g-code" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:8431 -#, fuzzy +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:7006 msgid "Select a tool by number" -msgstr "Angegebene Werkzeug-Nummer zu groß" +msgstr "Werkzeug nach Nummer auswählen" #: src/emc/usr_intf/gmoccapy/gmoccapy.glade:8454 msgid "change tool with the command M61 Q?, no machine move will be done" @@ -20099,11 +19913,10 @@ msgid "" " tool x" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:8497 -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:8529 -#, fuzzy +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:7075 +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:7108 msgid "touch off the tool and set the value to the tool table" -msgstr "Angefordertes Werkzeug %d nicht in der Werkzeugtabelle gefunden" +msgstr "Werkzeug antasten und Wert in der Werkzeugtabelle speichern" #: src/emc/usr_intf/gmoccapy/gmoccapy.glade:8521 msgid "" @@ -20115,20 +19928,17 @@ msgstr "" msgid "Move to your home directory" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:8600 -#, fuzzy +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:7182 msgid "Move to parrent directory" -msgstr "Aktuelles Verzeichnis" +msgstr "Zum übergeordneten Verzeichnis wechseln" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:8630 -#, fuzzy +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:7213 msgid "Select the previos file" -msgstr "Element zum Anzeigen auswählen" +msgstr "Vorherige Datei auswählen" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:8648 -#, fuzzy +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:7232 msgid "Select the next file" -msgstr "Element zum Anzeigen auswählen" +msgstr "Nächste Datei auswählen" #: src/emc/usr_intf/gmoccapy/gmoccapy.glade:8666 msgid "Jump to user defined directory" @@ -20142,15 +19952,13 @@ msgstr "" msgid "Close without returning a file path" msgstr "" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:8747 -#, fuzzy +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:7335 msgid "Load File" -msgstr "Geladene Datei:" +msgstr "Datei laden" -#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:8807 -#, fuzzy +#: src/emc/usr_intf/gmoccapy/gmoccapy.glade:7395 msgid "home joints" -msgstr "Achse/Gelenk" +msgstr "Referenzschalter" #~ msgid "button" #~ msgstr "Taste" From 4d056d45a4bb6fd4aff2ab8d455988ba77f085a6 Mon Sep 17 00:00:00 2001 From: CMorley Date: Fri, 14 Jan 2022 19:46:14 -0800 Subject: [PATCH 67/85] mitsub_vfd -fix documention of the serial data/stop setting --- docs/man/man1/mitsub_vfd.1 | 2 +- src/hal/user_comps/mitsub_vfd.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/man/man1/mitsub_vfd.1 b/docs/man/man1/mitsub_vfd.1 index f02ba32c9d7..9375af12672 100644 --- a/docs/man/man1/mitsub_vfd.1 +++ b/docs/man/man1/mitsub_vfd.1 @@ -55,7 +55,7 @@ You must power cycle the inverter for some of these. (eg 79) .br (can be optionally set 48,96,192 if component is also set) -\fBPARAMETER 119\fR stop bit/data length - 0 +\fBPARAMETER 119\fR stop bit/data length - 1 .br (8 bits, two stop - don't change) diff --git a/src/hal/user_comps/mitsub_vfd.py b/src/hal/user_comps/mitsub_vfd.py index 6e58bc81af8..ea5176b88bc 100755 --- a/src/hal/user_comps/mitsub_vfd.py +++ b/src/hal/user_comps/mitsub_vfd.py @@ -28,7 +28,7 @@ # PR 79 - 1 or 0 # PR 117 station number - 1 (can be optionally set 0 - 31) if component is also set # PR 118 communication speed 96 (can be optionally set 48,96,192) if component is also set -# PR 119 stop bit/data length - 0 8 bits, two stop (don't change) +# PR 119 stop bit/data length - 1 8 bits, two stop (don't change) # PR 120 parity - 0 no parity (don't change) # PR 121 COM tries - 10 if 10 (maximuim) COM errors then inverter faults (can change) # PR 122 COM check time interval 9999 (never check) if communication is lost inverter will not know (can change) From 809881bffa315e216cb78b51a436268de170197d Mon Sep 17 00:00:00 2001 From: CMorley Date: Sun, 16 Jan 2022 01:55:49 -0800 Subject: [PATCH 68/85] mitsub_vfd -add open, close then open agaon - some systems require it. For some reason open then close then open works. --- src/hal/user_comps/mitsub_vfd.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/hal/user_comps/mitsub_vfd.py b/src/hal/user_comps/mitsub_vfd.py index ea5176b88bc..21c83631ede 100755 --- a/src/hal/user_comps/mitsub_vfd.py +++ b/src/hal/user_comps/mitsub_vfd.py @@ -52,8 +52,12 @@ def __init__(self,vfd_names=[['mitsub_vfd','00']],baudrate=9600,port='/dev/ttyUS self.ser.open() self.ser.isOpen() except: - print "ERROR : mitsub_vfd - No serial interface found at %s"% port - raise SystemExit + try: + self.ser.close() + self.ser.open() + except Exception as e: + print("ERROR : mitsub_vfd - No serial interface found at %s\nError: %s"% (port,e)) + raise SystemExit print "Mitsubishi VFD serial computer link has loaded" print "Port: %s,\nbaudrate: %d\n8 data bits, no parity, 2 stop bits\n"%(port,baudrate) From cd22b5e92c4840dfa1185e98fd32467484052003 Mon Sep 17 00:00:00 2001 From: CMorley Date: Sun, 16 Jan 2022 01:59:16 -0800 Subject: [PATCH 69/85] mitsub_vfd docs: add point we are not using MODBUS --- docs/man/man1/mitsub_vfd.1 | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/docs/man/man1/mitsub_vfd.1 b/docs/man/man1/mitsub_vfd.1 index 9375af12672..ff213d29c12 100644 --- a/docs/man/man1/mitsub_vfd.1 +++ b/docs/man/man1/mitsub_vfd.1 @@ -4,7 +4,8 @@ .SH NAME mitsub_vfd \- HAL userspace component for Mitsubishi A500 F500 E500 A500 D700 E700 F700-series VFDs (others may work) - +This uses the COMPUTER LINK protocol _not_ MODBUS. +The connection is made through the PU connector. .SH SYNOPSIS @@ -80,6 +81,10 @@ no wait time is added to the serial data frame (don't change) .br don't change +\fBPARAMETER 549\fR communication protocol - 0 +.br +computer link protocol - don't change - (not all VFDs have this) + .SH This driver assumes certain other VFD settings: From a82a4d4b23e62530b7c278c22771ba3e76eed303 Mon Sep 17 00:00:00 2001 From: Sebastian Kuzminsky Date: Fri, 21 Jan 2022 19:04:58 -0700 Subject: [PATCH 70/85] hal_lib: minor cosmetic fix to a seldom-seen debug message --- src/hal/hal_lib.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hal/hal_lib.c b/src/hal/hal_lib.c index d2744438e33..016f5cc2766 100644 --- a/src/hal/hal_lib.c +++ b/src/hal/hal_lib.c @@ -349,7 +349,7 @@ int hal_exit(int comp_id) --ref_cnt; #ifdef ULAPI if(ref_cnt == 0) { - rtapi_print_msg(RTAPI_MSG_DBG, "HAL: releasing RTAPI resources"); + rtapi_print_msg(RTAPI_MSG_DBG, "HAL: releasing RTAPI resources\n"); /* release RTAPI resources */ rtapi_shmem_delete(lib_mem_id, lib_module_id); rtapi_exit(lib_module_id); From 27d8149c8a3b033d69c0bba6c5a2daeeba8f32cd Mon Sep 17 00:00:00 2001 From: Sebastian Kuzminsky Date: Fri, 21 Jan 2022 22:19:04 -0700 Subject: [PATCH 71/85] hal_lib: whitespace fixes only, no code change --- src/hal/hal_lib.c | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/src/hal/hal_lib.c b/src/hal/hal_lib.c index 016f5cc2766..d7fe76b3d98 100644 --- a/src/hal/hal_lib.c +++ b/src/hal/hal_lib.c @@ -2783,14 +2783,13 @@ static int init_hal_data(void) { /* has the block already been initialized? */ if (hal_data->version != 0) { - /* yes, verify version code */ - if (hal_data->version == HAL_VER) { - return 0; - } else { - rtapi_print_msg(RTAPI_MSG_ERR, - "HAL: ERROR: version code mismatch\n"); - return -1; - } + /* yes, verify version code */ + if (hal_data->version == HAL_VER) { + return 0; + } else { + rtapi_print_msg(RTAPI_MSG_ERR, "HAL: ERROR: version code mismatch\n"); + return -1; + } } /* no, we need to init it, grab the mutex unconditionally */ rtapi_mutex_try(&(hal_data->mutex)); From d04578b40ce15ef3e4858f6a148a316b12ad9991 Mon Sep 17 00:00:00 2001 From: Sebastian Kuzminsky Date: Fri, 21 Jan 2022 22:23:47 -0700 Subject: [PATCH 72/85] docs: fix an omission in the rtapi_shmem manpage Make explicit an important promise made by rtapi_shmem_new(): When a block of memory is first allocated, it is initialized to all zero bytes. On Uspace rtapi_shmem_new() calls shmget(), which zeros the memory when creating a new shared memory block: https://man7.org/linux/man-pages/man2/shmget.2.html#DESCRIPTION On RTAI rtapi_shmem_new() calls rtai_kmalloc() and rtai_malloc(), which both end up calling _rt_shmem_new(). The documentation does not say anything about initialization of freshly allocated memory buffers, but Paolo Mantegazza (one of the main RTAI developers) said that RTAI *does* zeros shmem buffers, and pointed to this code: https://mail.rtai.org/pipermail/rtai/2022-January/028282.html http://cvs.savannah.nongnu.org/viewvc/rtai/magma/base/ipc/shm/shm.c?view=markup#l69 --- docs/man/man3/rtapi_shmem.3rtapi | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/man/man3/rtapi_shmem.3rtapi b/docs/man/man3/rtapi_shmem.3rtapi index ca6266b66c5..746088f6f10 100644 --- a/docs/man/man3/rtapi_shmem.3rtapi +++ b/docs/man/man3/rtapi_shmem.3rtapi @@ -35,8 +35,8 @@ wishing to access the same memory must use the same key. \fImodule_id\fR is the ID of the module that is making the call (see rtapi_init). The block will be at least \fIsize\fR bytes, and may be rounded up. Allocating many small blocks may be very wasteful. -When a particular block is allocated for the first time, the first -4 bytes are zeroed. Subsequent allocations of the same block +When a particular block is allocated for the first time, the contents +are zeroed. Subsequent allocations of the same block by other modules or processes will not touch the contents of the block. Applications can use those bytes to see if they need to initialize the block, or if another module already did so. From 0fe6babc44c4a5857c5de4baeedfef4dea9e3b3a Mon Sep 17 00:00:00 2001 From: Sebastian Kuzminsky Date: Fri, 21 Jan 2022 23:19:49 -0700 Subject: [PATCH 73/85] rtapi fix shmem comment --- src/rtapi/rtapi.h | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/rtapi/rtapi.h b/src/rtapi/rtapi.h index c931542bc06..ff6537f18b0 100644 --- a/src/rtapi/rtapi.h +++ b/src/rtapi/rtapi.h @@ -431,11 +431,10 @@ RTAPI_BEGIN_DECLS 'module_id' is the ID of the module that is making the call (see rtapi_init). The block will be at least 'size' bytes, and may be rounded up. Allocating many small blocks may be very wasteful. - When a particular block is allocated for the first time, the first - 4 bytes are zeroed. Subsequent allocations of the same block + When a particular block is allocated for the first time, all + bytes are zeroed. Subsequent allocations of the same block by other modules or processes will not touch the contents of the - block. Applications can use those bytes to see if they need to - initialize the block, or if another module already did so. + block. On success, it returns a positive integer ID, which is used for all subsequent calls dealing with the block. On failure it returns a negative error code. Call only from within user or From ff16585144aa0f4a91e25a0e23e2d45ed86bf843 Mon Sep 17 00:00:00 2001 From: Sebastian Kuzminsky Date: Fri, 21 Jan 2022 22:59:55 -0700 Subject: [PATCH 74/85] hal_lib: fix a race in hal_init() This commit makes two changes in init_hal_data() (which is called by hal_init()): 1. Take the `hal_data->mutex` using `rtapi_mutex_get()` instead of `rtapi_mutex_try()`. The `try` version tries to take the mutex and returns immediately, indicating by its return value whether it actually took the mutex or not. Before this commit, the `init_hal_data()` function called `try` but didn't check the return value, and just assumed that it got the mutex. This commit switches to the `get` version, which blocks until the mutex is available, then takes it. Note: this relies on the promise made by rtapi_shmem_new() that a freshly-allocated `hal_data` is initialized such that `hal_data->mutex` is a valid, un-locked mutex. Uspace RTAPI meets this criterion because it uses shmget(), which initializes all shared memory to all-bytes-zero. RTAI RTAPI also meets this criterion, though it's not mentioned in the documentation: https://mail.rtai.org/pipermail/rtai/2022-January/028282.html http://cvs.savannah.nongnu.org/viewvc/rtai/magma/base/ipc/shm/shm.c?view=markup#l69 2. Take the `hal_data->mutex`, locking `hal_data`, *before* checking whether the memory is initialized. This fixes the hal_init() race condition. --- src/hal/hal_lib.c | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/src/hal/hal_lib.c b/src/hal/hal_lib.c index d7fe76b3d98..f2885901624 100644 --- a/src/hal/hal_lib.c +++ b/src/hal/hal_lib.c @@ -2781,18 +2781,29 @@ static void thread_task(void *arg) static int init_hal_data(void) { - /* has the block already been initialized? */ + /* has the hal_data block already been initialized? */ + + /* Lock hal_data by taking the mutex, so that two processes + don't both try to initialize hal_data at the same time. NOTE: + The first time through, the hal_data memory buffer is fresh from + rtapi_shmem_new(), which means it's initialized to all zero bytes. + This means hal_data->mutex is valid and unlocked. */ + rtapi_mutex_get(&(hal_data->mutex)); + if (hal_data->version != 0) { - /* yes, verify version code */ + /* hal_data has been initialized already, verify version code */ if (hal_data->version == HAL_VER) { + rtapi_mutex_give(&(hal_data->mutex)); return 0; } else { rtapi_print_msg(RTAPI_MSG_ERR, "HAL: ERROR: version code mismatch\n"); + rtapi_mutex_give(&(hal_data->mutex)); return -1; } } - /* no, we need to init it, grab the mutex unconditionally */ - rtapi_mutex_try(&(hal_data->mutex)); + + /* hal_data has *NOT* been initialized yet, we get the honor */ + /* set version code so nobody else init's the block */ hal_data->version = HAL_VER; /* initialize everything */ From 29b489095973e707324451e96a20f8d25977db65 Mon Sep 17 00:00:00 2001 From: Sebastian Kuzminsky Date: Tue, 25 Jan 2022 11:42:17 -0700 Subject: [PATCH 75/85] add a test that verifies that rtapi shmem is initialized to zeros --- tests/rtapi-shmem/README.md | 2 + tests/rtapi-shmem/checkresult | 2 + tests/rtapi-shmem/setup.hal | 2 + tests/rtapi-shmem/test.sh | 5 + tests/rtapi-shmem/test_shmem_rtcomp.comp | 119 +++++++++++++++++++++++ 5 files changed, 130 insertions(+) create mode 100644 tests/rtapi-shmem/README.md create mode 100755 tests/rtapi-shmem/checkresult create mode 100644 tests/rtapi-shmem/setup.hal create mode 100644 tests/rtapi-shmem/test.sh create mode 100644 tests/rtapi-shmem/test_shmem_rtcomp.comp diff --git a/tests/rtapi-shmem/README.md b/tests/rtapi-shmem/README.md new file mode 100644 index 00000000000..7ecc1e14a53 --- /dev/null +++ b/tests/rtapi-shmem/README.md @@ -0,0 +1,2 @@ +This test allocates some shared memory from RTAPI, and verifies that it +is initialized to all bytes zero. diff --git a/tests/rtapi-shmem/checkresult b/tests/rtapi-shmem/checkresult new file mode 100755 index 00000000000..06bd986563d --- /dev/null +++ b/tests/rtapi-shmem/checkresult @@ -0,0 +1,2 @@ +#!/bin/bash +exit 0 diff --git a/tests/rtapi-shmem/setup.hal b/tests/rtapi-shmem/setup.hal new file mode 100644 index 00000000000..e276b5734fc --- /dev/null +++ b/tests/rtapi-shmem/setup.hal @@ -0,0 +1,2 @@ +debug 5 +loadrt test_shmem_rtcomp diff --git a/tests/rtapi-shmem/test.sh b/tests/rtapi-shmem/test.sh new file mode 100644 index 00000000000..e732675f904 --- /dev/null +++ b/tests/rtapi-shmem/test.sh @@ -0,0 +1,5 @@ +#!/bin/sh + +halcompile --install test_shmem_rtcomp.comp + +halrun -V setup.hal diff --git a/tests/rtapi-shmem/test_shmem_rtcomp.comp b/tests/rtapi-shmem/test_shmem_rtcomp.comp new file mode 100644 index 00000000000..11b8c1e55fe --- /dev/null +++ b/tests/rtapi-shmem/test_shmem_rtcomp.comp @@ -0,0 +1,119 @@ +// Copyright 2022 Sebastian Kuzminsky +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of version 2 of the GNU General +// Public License as published by the Free Software Foundation. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +component test_shmem_rtcomp "Validate rtapi's shmem initialization behavior"; + +option extra_setup; +option extra_cleanup; +option singleton; + +pin out bit ready = 0 "Goes true when shmem is initialized"; + +function _; +license "GPL"; + +;; + +#include + +#define SHMEM_KEY 9999 +#define SHMEM_SIZE (4096 * 100) // in bytes + +int shmem_id = -1; +void *mem = NULL; + +int shmem_alloc(void) { + int i; + int r; + uint8_t *p; + + rtapi_print_msg(RTAPI_MSG_ERR, "allocating shmem\n"); + + shmem_id = rtapi_shmem_new(SHMEM_KEY, comp_id, SHMEM_SIZE); + if (shmem_id < 0) { + rtapi_print_msg(RTAPI_MSG_ERR, "failed to make new rtapi shmem\n"); + return -EINVAL; + } + + r = rtapi_shmem_getptr(shmem_id, &mem); + if (r < 0) { + rtapi_print_msg(RTAPI_MSG_ERR, "failed to get new rtapi shmem\n"); + return -EINVAL; + } + if (mem == NULL) { + rtapi_print_msg(RTAPI_MSG_ERR, "new rtapi shmem is NULL??\n"); + return -EINVAL; + } + + p = mem; + for (i = 0; i < SHMEM_SIZE; ++i) { + if (p[i] != 0x00) { + rtapi_print_msg(RTAPI_MSG_ERR, "shmem is not initialized to 0x00!\n"); + return -EINVAL; + } + } + + rtapi_print_msg(RTAPI_MSG_ERR, "allocated shmem came initialized to all bytes zero\n"); + + return 0; +} + + +void shmem_free(void) { + if (shmem_id >= 0) { + rtapi_print_msg(RTAPI_MSG_ERR, "freeing shmem\n"); + rtapi_shmem_delete(shmem_id, comp_id); + } +} + + +EXTRA_SETUP() { + int i; + int r; + uint8_t *p; + + r = shmem_alloc(); + if (r < 0) { + rtapi_print_msg(RTAPI_MSG_ERR, "failed to alloc shmem\n"); + return -EINVAL; + } + + // dirty the shmem + p = mem; + for (i = 0; i < SHMEM_SIZE; ++i) { + p[i] = i % 256; + } + + shmem_free(); + + r = shmem_alloc(); + if (r < 0) { + rtapi_print_msg(RTAPI_MSG_ERR, "failed to alloc shmem\n"); + return -EINVAL; + } + + return 0; +} + + +EXTRA_CLEANUP() { + shmem_free(); +} + + +FUNCTION(_) { + ready = 1; +} + From dd7c0ea1d05afbbdece6c72e54679ce89d828ff0 Mon Sep 17 00:00:00 2001 From: Dewey Garrett Date: Sun, 23 Jan 2022 21:04:00 -0700 Subject: [PATCH 76/85] axis.py: stop continuous jogs if mdi tab #1519 candidate fix for #1519, lightly tested (master) --- src/emc/usr_intf/axis/scripts/axis.py | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/emc/usr_intf/axis/scripts/axis.py b/src/emc/usr_intf/axis/scripts/axis.py index cf642f35809..5a1a34d89b2 100755 --- a/src/emc/usr_intf/axis/scripts/axis.py +++ b/src/emc/usr_intf/axis/scripts/axis.py @@ -173,6 +173,7 @@ def General_Halt(): mdi_history_index= -1 resume_inhibit = 0 continuous_jog_in_progress = False +cjogindices = [] help1 = [ ("F1", _("Emergency stop")), @@ -774,6 +775,14 @@ def update(self): del self.stat return + global continuous_jog_in_progress,cjogindices + if continuous_jog_in_progress and not manual_tab_visible(): + jjogmode = get_jog_mode() + for idx in cjogindices: + c.jog(linuxcnc.JOG_STOP, jjogmode,idx) + continuous_jog_in_progress = 0 + cjogindices = [] + if ( (self.stat.motion_mode == linuxcnc.TRAJ_MODE_COORD) and (self.stat.task_mode == linuxcnc.MODE_MANUAL) ): @@ -3211,8 +3220,9 @@ def jog_on(a, b): jog(linuxcnc.JOG_INCREMENT, jjogmode, a, b, distance) jog_cont[a] = False else: - global continuous_jog_in_progress + global continuous_jog_in_progress,cjogindices continuous_jog_in_progress = True + if not a in cjogindices: cjogindices.append(a) jog(linuxcnc.JOG_CONTINUOUS, jjogmode, a, b) jog_cont[a] = True jogging[a] = b From e4d59ebed01118e5c1a2d5dc58d4a8061550d9af Mon Sep 17 00:00:00 2001 From: Dewey Garrett Date: Fri, 28 Jan 2022 09:02:11 -0700 Subject: [PATCH 77/85] getting-linuxcnc.txt list alternate keyserver users report: notok: keys.openpgp.org ok: keyserver.ubuntu.com https://forum.linuxcnc.org/9-installing-linuxcnc/44951-2-8-documentation-issue-archive-signing-key#233376 --- docs/src/getting-started/getting-linuxcnc.txt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/src/getting-started/getting-linuxcnc.txt b/docs/src/getting-started/getting-linuxcnc.txt index dfd7f22cbde..b475b81915d 100755 --- a/docs/src/getting-started/getting-linuxcnc.txt +++ b/docs/src/getting-started/getting-linuxcnc.txt @@ -357,6 +357,7 @@ uname -v + ---- sudo apt-key adv --keyserver hkp://keys.openpgp.org --recv-key 3cb9fd148f374fef +Alternate keyserver: keyserver.ubuntu.com ---- . Add the apt repository: @@ -399,6 +400,7 @@ at system shut-down. + ---- sudo apt-key adv --keyserver hkp://keys.openpgp.org --recv-key 3cb9fd148f374fef +Alternate keyserver: keyserver.ubuntu.com ---- . Add the apt repository: @@ -429,6 +431,7 @@ Reboot the machine, ensuring that the system boots from the new 4.19.195-rtai ke + ---- sudo apt-key adv --keyserver hkp://keys.openpgp.org --recv-key 3cb9fd148f374fef +Alternate keyserver: keyserver.ubuntu.com ---- . Add the apt repository: + @@ -473,6 +476,7 @@ sudo apt-get dist-upgrade + ---- sudo apt-key adv --keyserver hkp://keys.openpgp.org --recv-key 3cb9fd148f374fef +Alternate keyserver: keyserver.ubuntu.com ---- . Add a new apt source From 44a8f328f623448246e5559157f20c90a3e3c508 Mon Sep 17 00:00:00 2001 From: Hans Unzner Date: Mon, 31 Jan 2022 13:58:37 +0100 Subject: [PATCH 78/85] docs/python-interface: fix max_velocity description --- docs/src/config/python-interface.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/src/config/python-interface.txt b/docs/src/config/python-interface.txt index e8b47d728e4..591a2c0506c 100644 --- a/docs/src/config/python-interface.txt +++ b/docs/src/config/python-interface.txt @@ -259,10 +259,10 @@ machine linear units per mm, reflects [TRAJ]LINEAR_UNITS ini value. reflects 'iocontrol.0.lube_level'. *max_acceleration*:: '(returns float)' - -maximum acceleration. reflects [TRAJ]MAX_ACCELERATION. +maximum acceleration. Reflects [TRAJ]MAX_ACCELERATION. *max_velocity*:: '(returns float)' - -maximum velocity. reflects [TRAJ]MAX_VELOCITY. +maximum velocity. Reflects the current maximum velocity. If not modified by halui.max-velocity or similar it should reflect [TRAJ]MAX_VELOCITY. *mcodes*:: '(returns tuple of 10 integers)' - currently active M-codes. From cbd6a2ffaee5842cc491db83737829e10f874445 Mon Sep 17 00:00:00 2001 From: Hans Unzner Date: Mon, 31 Jan 2022 13:59:04 +0100 Subject: [PATCH 79/85] man: Add references to logic(9) --- src/hal/components/and2.comp | 10 ++++++++++ src/hal/components/or2.comp | 10 ++++++++++ src/hal/components/xor2.comp | 10 ++++++++++ 3 files changed, 30 insertions(+) diff --git a/src/hal/components/and2.comp b/src/hal/components/and2.comp index 345eeb0841e..d5a53dc3b0f 100644 --- a/src/hal/components/and2.comp +++ b/src/hal/components/and2.comp @@ -13,6 +13,16 @@ Otherwise, .RE""" ; function _ nofp; +see_also """ +.ie '\\*[.T]'html' \\{\\ +.UR logic.9.html +\\fBlogic\\fR(9) +.UE +\\} +.el \\{\\ +\\fBlogic\\fR(9) +\\} +"""; license "GPL"; ;; FUNCTION(_) { out = in0 && in1; } diff --git a/src/hal/components/or2.comp b/src/hal/components/or2.comp index 9d9ef8d9cee..089a7803ded 100644 --- a/src/hal/components/or2.comp +++ b/src/hal/components/or2.comp @@ -14,6 +14,16 @@ Otherwise, .RE""" ; function _ nofp; +see_also """ +.ie '\\*[.T]'html' \\{\\ +.UR logic.9.html +\\fBlogic\\fR(9) +.UE +\\} +.el \\{\\ +\\fBlogic\\fR(9) +\\} +"""; license "GPL"; ;; FUNCTION(_) { out = in0 || in1; } diff --git a/src/hal/components/xor2.comp b/src/hal/components/xor2.comp index f3f50f87114..7d26ce10863 100644 --- a/src/hal/components/xor2.comp +++ b/src/hal/components/xor2.comp @@ -14,6 +14,16 @@ to the following rule: Otherwise, \\fBout=FALSE\\fR"""; function _ nofp; +see_also """ +.ie '\\*[.T]'html' \\{\\ +.UR logic.9.html +\\fBlogic\\fR(9) +.UE +\\} +.el \\{\\ +\\fBlogic\\fR(9) +\\} +"""; license "GPL"; ;; FUNCTION(_) { From 33c749d485b8dde7c9edbb0e632b4b7d53a3cf7b Mon Sep 17 00:00:00 2001 From: Hans Unzner Date: Mon, 31 Jan 2022 14:01:21 +0100 Subject: [PATCH 80/85] docs: Updated/extended halshow doc --- docs/man/man1/halshow.1 | 21 +++++++++++++++------ docs/src/hal/halshow.txt | 1 + 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/docs/man/man1/halshow.1 b/docs/man/man1/halshow.1 index ec8300123cd..b2a4f191a03 100644 --- a/docs/man/man1/halshow.1 +++ b/docs/man/man1/halshow.1 @@ -24,17 +24,28 @@ .\" .TH HALSHOW "1" "2020-08-26" "LinuxCNC Documentation" "The Enhanced Machine Controller" .SH NAME -halshow \- short description +halshow \- Show HAL parameters, pins and signals .SH SYNOPSIS -.B halshow +.B halshow [Options] [watchfile] +.SH OPTIONS + --help (help) + --fformat format_string_for_float + --iformat format_string_for_int + +For format see +.UR https://www.tcl.tk/man/tcl8.6.11/TclCmd/format.html +.UE + +Example: +"%.5f" displays a float with 5 digits right of the decimal point .SH DESCRIPTION \fBhalshow\fR creates a GUI interface to view and interact with a running HAL session. It is documented in the PDF and HTML docs much more completely than is possible in a manpage: -http://linuxcnc.org/docs/html/hal/halshow.html - +.UR http://linuxcnc.org/docs/html/hal/halshow.html +.UE .SH "SEE ALSO" \fBLinuxCNC(1)\fR @@ -42,8 +53,6 @@ http://linuxcnc.org/docs/html/hal/halshow.html Much more information about LinuxCNC and HAL is available in the LinuxCNC and HAL User Manuals, found at /usr/share/doc/LinuxCNC/. -.SH HISTORY - .SH BUGS None known at this time. .PP diff --git a/docs/src/hal/halshow.txt b/docs/src/hal/halshow.txt index 879c86ebf58..031ec40ab81 100644 --- a/docs/src/hal/halshow.txt +++ b/docs/src/hal/halshow.txt @@ -42,6 +42,7 @@ and used a file named my.halshow in the current directory: ---- $ halshow --fformat ".5f" ./my.halshow ---- +For more information regarding the format, please refer to https://www.tcl.tk/man/tcl8.6.11/TclCmd/format.html == HAL Tree Area From ccf8f2d58006b58e7915ee6b53feaa5cbbc1e5c0 Mon Sep 17 00:00:00 2001 From: Dewey Garrett Date: Tue, 1 Feb 2022 09:02:23 -0700 Subject: [PATCH 81/85] check_config.tcl catch error in puts used for missing mandatory item $::kins(module) Ref: https://forum.linuxcnc.org/24-hal-components/44989-kinematics-module-load-error#233683 --- lib/hallib/check_config.tcl | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/lib/hallib/check_config.tcl b/lib/hallib/check_config.tcl index c33aa351f8a..c3b7552cabf 100644 --- a/lib/hallib/check_config.tcl +++ b/lib/hallib/check_config.tcl @@ -21,13 +21,15 @@ set ::DEFAULT_AXIS_MIN_LIMIT -1e99 set ::DEFAULT_AXIS_MAX_LIMIT +1e99 #---------------------------------------------------------------------- proc warnings msg { - puts "\n$::progname: ($::kins(module) kinematics) WARNING:" + puts -nonewline "\n$::progname:\n" + catch {puts ($::kins(module) kinematics) WARNING:"} foreach m $msg {puts " $m"} puts "" } ;# warnings proc err_exit msg { - puts "\n$::progname: ($::kins(module) kinematics) ERROR:" + puts -nonewline "\n$::progname:\n" + catch {puts ($::kins(module) kinematics) ERROR:"} foreach m $msg {puts " $m"} puts "" exit 1 From 42dce4367628ed3963a9772fa03a6c6456a57f12 Mon Sep 17 00:00:00 2001 From: CMorley Date: Sun, 13 Feb 2022 10:39:34 -0800 Subject: [PATCH 82/85] gscreen -fix error related to keyboard jogging and limit switch If keyboard jogging and one hits a limit switch, you would get an endless amount of error messages. Thanks Ivan the Red on forum for testing fixes --- src/emc/usr_intf/gscreen/emc_interface.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/emc/usr_intf/gscreen/emc_interface.py b/src/emc/usr_intf/gscreen/emc_interface.py index f0cbed19a8a..b978792778c 100644 --- a/src/emc/usr_intf/gscreen/emc_interface.py +++ b/src/emc/usr_intf/gscreen/emc_interface.py @@ -139,6 +139,7 @@ def set_motion_mode(self): def continuous_jog_velocity(self, velocity,angular=None): if self.masked: return + if self.is_machine_off(): return self.set_motion_mode() if velocity == None: rate = self.angular_jog_velocity = angular / 60.0 @@ -151,6 +152,7 @@ def continuous_jog_velocity(self, velocity,angular=None): def continuous_jog(self, axis, direction): if self.masked: return + if self.is_machine_off(): return self.set_motion_mode() if direction == 0: self.isjogging[axis] = 0 @@ -170,6 +172,7 @@ def stop_jog(self, axis): def incremental_jog(self, axis, direction, distance): if self.masked: return + if self.is_machine_off(): return self.set_motion_mode() self.isjogging[axis] = direction if axis in (3,4,5): @@ -292,6 +295,15 @@ def get_mode(self): self.emcstat.poll() return self.emcstat.task_mode + def is_machine_off(self): + self.emcstat.poll() + state = self.emcstat.task_state != self.emc.STATE_ON + if state: + # kill any jogging state + for i in range(0,len(self.isjogging)): + self.isjogging[i] = 0 + return state + class emc_status: def __init__(self, data, emc): self.data = data From 53d34420981dedfc2348202c4f96d2d9ca95891a Mon Sep 17 00:00:00 2001 From: Sebastian Kuzminsky Date: Mon, 14 Feb 2022 20:12:46 -0700 Subject: [PATCH 83/85] linuxcncrsh: check for errors when creating listening socket Thanks to Andy Howell for finding and fixing this bug. --- src/emc/usr_intf/emcrsh.cc | 21 +++++++++++++++---- tests/linuxcncrsh-tcp/test.sh | 5 +++++ tests/linuxcncrsh/test.sh | 5 +++++ tests/mdi-queue/oword-queue-buster/test.sh | 5 +++++ tests/mdi-queue/simple-queue-buster/test.sh | 5 +++++ tests/t0/shared-test.sh | 5 +++++ .../toolno-pocket-differ/shared-test.sh | 5 +++++ 7 files changed, 47 insertions(+), 4 deletions(-) diff --git a/src/emc/usr_intf/emcrsh.cc b/src/emc/usr_intf/emcrsh.cc index 933a4f9f441..5fbfbfe16cc 100644 --- a/src/emc/usr_intf/emcrsh.cc +++ b/src/emc/usr_intf/emcrsh.cc @@ -542,16 +542,26 @@ static void thisQuit() static int initSockets() { int optval = 1; - + int err; + server_sockfd = socket(AF_INET, SOCK_STREAM, 0); setsockopt(server_sockfd, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof(optval)); server_address.sin_family = AF_INET; server_address.sin_addr.s_addr = htonl(INADDR_ANY); server_address.sin_port = htons(port); server_len = sizeof(server_address); - bind(server_sockfd, (struct sockaddr *)&server_address, server_len); - listen(server_sockfd, 5); + err = bind(server_sockfd, (struct sockaddr *)&server_address, server_len); + if (err) { + rcs_print_error("error initializing sockets: %s\n", strerror(errno)); + return err; + } + err = listen(server_sockfd, 5); + if (err) { + rcs_print_error("error listening on socket: %s\n", strerror(errno)); + return err; + } + // ignore SIGCHLD { struct sigaction act; @@ -2950,7 +2960,10 @@ int main(int argc, char *argv[]) } // get configuration information iniLoad(emc_inifile); - initSockets(); + if (initSockets()) { + rcs_print_error("error initializing sockets\n"); + exit(1); + } // init NML if (tryNml() != 0) { rcs_print_error("can't connect to LinuxCNC\n"); diff --git a/tests/linuxcncrsh-tcp/test.sh b/tests/linuxcncrsh-tcp/test.sh index c0cd7f4a72e..a8da4840ac4 100755 --- a/tests/linuxcncrsh-tcp/test.sh +++ b/tests/linuxcncrsh-tcp/test.sh @@ -2,6 +2,11 @@ rm -f gcode-output +if nc -z localhost 5007; then + echo "Process already listening on port 5007. Exiting" + exit 1 +fi + linuxcnc -r linuxcncrsh-test.ini & diff --git a/tests/linuxcncrsh/test.sh b/tests/linuxcncrsh/test.sh index c0cd7f4a72e..a8da4840ac4 100755 --- a/tests/linuxcncrsh/test.sh +++ b/tests/linuxcncrsh/test.sh @@ -2,6 +2,11 @@ rm -f gcode-output +if nc -z localhost 5007; then + echo "Process already listening on port 5007. Exiting" + exit 1 +fi + linuxcnc -r linuxcncrsh-test.ini & diff --git a/tests/mdi-queue/oword-queue-buster/test.sh b/tests/mdi-queue/oword-queue-buster/test.sh index 21fcc35a505..c49c2c8b1a2 100755 --- a/tests/mdi-queue/oword-queue-buster/test.sh +++ b/tests/mdi-queue/oword-queue-buster/test.sh @@ -2,6 +2,11 @@ rm -f gcode-output +if nc -z localhost 5007; then + echo "Process already listening on port 5007. Exiting" + exit 1 +fi + linuxcnc -r linuxcncrsh-test.ini & diff --git a/tests/mdi-queue/simple-queue-buster/test.sh b/tests/mdi-queue/simple-queue-buster/test.sh index ee6264abb4f..f465472203c 100755 --- a/tests/mdi-queue/simple-queue-buster/test.sh +++ b/tests/mdi-queue/simple-queue-buster/test.sh @@ -2,6 +2,11 @@ rm -f gcode-output +if nc -z localhost 5007; then + echo "Process already listening on port 5007. Exiting" + exit 1 +fi + linuxcnc -r linuxcncrsh-test.ini & diff --git a/tests/t0/shared-test.sh b/tests/t0/shared-test.sh index a5f94a9f3be..287055e5bb2 100644 --- a/tests/t0/shared-test.sh +++ b/tests/t0/shared-test.sh @@ -9,6 +9,11 @@ cp tool.tbl.original tool.tbl rm -f gcode-output +if nc -z localhost 5007; then + echo "Process already listening on port 5007. Exiting" + exit 1 +fi + linuxcnc -r sim.ini & diff --git a/tests/toolchanger/toolno-pocket-differ/shared-test.sh b/tests/toolchanger/toolno-pocket-differ/shared-test.sh index 11b39955eb3..34426e36e4c 100755 --- a/tests/toolchanger/toolno-pocket-differ/shared-test.sh +++ b/tests/toolchanger/toolno-pocket-differ/shared-test.sh @@ -9,6 +9,11 @@ cp ../../simpockets.tbl.original simpockets.tbl rm -f gcode-output +if nc -z localhost 5007; then + echo "Process already listening on port 5007. Exiting" + exit 1 +fi + linuxcnc -r sim.ini & From 3fa39986a1de66ceec2f017c7297e8819d761bee Mon Sep 17 00:00:00 2001 From: Jerry Trantow Date: Tue, 1 Mar 2022 21:15:31 -0600 Subject: [PATCH 84/85] Updated the gantry example with what I gather from the forum is best practice. 1) Reduce from 4(XYZA) to 3(XYZY) coordinate. 2) Use negative HOME_SEQUENCE values for synchronous homing of the dual Y joints. 3) Rename signals such as adir, astep to y2dir, ystep. --- configs/by_interface/parport/gantry/README | 11 +- configs/by_interface/parport/gantry/README_es | 9 - .../by_interface/parport/gantry/gantry-hs.ini | 154 -------------- .../by_interface/parport/gantry/gantry.hal | 77 ++++--- .../by_interface/parport/gantry/gantry.ini | 189 ++++++++++-------- .../parport/gantry/gantry_joints.ini | 165 +++++++++++++++ configs/by_interface/parport/gantry/tool.tbl | 4 - 7 files changed, 325 insertions(+), 284 deletions(-) delete mode 100644 configs/by_interface/parport/gantry/README_es delete mode 100644 configs/by_interface/parport/gantry/gantry-hs.ini create mode 100644 configs/by_interface/parport/gantry/gantry_joints.ini delete mode 100644 configs/by_interface/parport/gantry/tool.tbl diff --git a/configs/by_interface/parport/gantry/README b/configs/by_interface/parport/gantry/README index 730f434db1c..a6cbb32041e 100644 --- a/configs/by_interface/parport/gantry/README +++ b/configs/by_interface/parport/gantry/README @@ -1,9 +1,10 @@ -Stepper Gantry basic configurations using gantrykins. +Stepper Gantry basic configurations. -gantry has no home switches +It is very important for gantry machines to set initial home switch positions before first homing so they reach home switches at a very similar time. To remove any skewing on the gantry adjust the home offset of one joint. After homing the configuration will switch from joint mode to world mode. -This configuration is a stepper based configuration for a gantry type of device using independent Y axis steppers on the gantry. When this configuration is started you will be in joint mode and each axis can be jogged independently. This allows you to square up the gantry to match marks then home each joint. Once this is completed switch to world mode before trying to jog the gantry. +gantry_joints.ini uses the same .hal file but uses kinstype=BOTH which requires independently homing each joint axis. -gantry-hs has home switches for each joint +gantry.ini implements a dual Y motor gantry. This is the configuration to use after you verify the directions and speeds of the individual joints using gantry_joints.ini. + +These configs use switches for min-home on the X,Y,Y2 axis and max-home for Z. Pay attention to the parallel input pin assignment for the switches. -This configuration is just like gantry.ini with the addition of home switches. Homing is done in joint mode. It is very important for gantries to set initial home switch positions before first homing so they reach home switches at a very similar time. To remove any skewing on the gantry adjust of home offset of one joint. After homing switch to world mode. diff --git a/configs/by_interface/parport/gantry/README_es b/configs/by_interface/parport/gantry/README_es deleted file mode 100644 index 614a7e1b68f..00000000000 --- a/configs/by_interface/parport/gantry/README_es +++ /dev/null @@ -1,9 +0,0 @@ -Configuraciones básicas de pórticos con pasos utilizando gantrykins. - -gantry no tiene interruptores home - -Esta configuración es una configuración basada en pasos para un tipo de dispositivo de pórtico que utiliza motores independientes en el eje Y. Cuando se inicia esta configuración, estará en modo articulación y cada eje se puede mover de forma independiente. Esto le permite cuadrar el pórtico para que coincida con las marcas y luego hacer home de cada articulación. Una vez que se complete esto, cambia al modo universal antes de intentar mover el pórtico. - -gantry-hs tiene interruptores home para cada junta - -Esta configuración es como gantry.ini con la adición de interruptores home. El homing se realiza en modo articulación. Es muy importante que los pórticos establezcan las posiciones iniciales de los interruptores home antes del primer homing para que lleguen a los interruptores en un momento muy similar. Para eliminar cualquier desviación del pórtico ajuste la compensación del home de una articulación. Después de homing, cambia al modo universal. diff --git a/configs/by_interface/parport/gantry/gantry-hs.ini b/configs/by_interface/parport/gantry/gantry-hs.ini deleted file mode 100644 index 00fc37d87c0..00000000000 --- a/configs/by_interface/parport/gantry/gantry-hs.ini +++ /dev/null @@ -1,154 +0,0 @@ -# Stepper Gantry with the Y axis driven by two steppers -# This configuration uses home switches for each joint - -[EMC] -# The version string for this INI file. -VERSION = 1.1 -MACHINE = gantry-hs -DEBUG = 0 - -[DISPLAY] -DISPLAY = axis -#EDITOR = gedit -POSITION_OFFSET = RELATIVE -POSITION_FEEDBACK = ACTUAL -MAX_FEED_OVERRIDE = 1.2 -INTRO_GRAPHIC = linuxcnc.gif -INTRO_TIME = 5 -PROGRAM_PREFIX = ../../nc_files/ -INCREMENTS = .1in .05in .01in .005in .001in .0005in .0001in - -[FILTER] -PROGRAM_EXTENSION = .png,.gif,.jpg Greyscale Depth Image -PROGRAM_EXTENSION = .py Python Script -png = image-to-gcode -gif = image-to-gcode -jpg = image-to-gcode -py = python - -[RS274NGC] -PARAMETER_FILE = emc.var - -[EMCMOT] -EMCMOT = motmod -COMM_TIMEOUT = 1.0 -BASE_PERIOD = 55555 -SERVO_PERIOD = 1000000 - -[TASK] -TASK = milltask -CYCLE_TIME = 0.010 - -[HAL] -HALFILE = gantry.hal -HALFILE = custom.hal -POSTGUI_HALFILE = custom_postgui.hal - -[HALUI] -#No Content - -[TRAJ] -COORDINATES = X Y Z A -MAX_ANGULAR_VELOCITY = 360.00 -DEFAULT_ANGULAR_VELOCITY = 36.00 -LINEAR_UNITS = inch -ANGULAR_UNITS = degree -DEFAULT_LINEAR_VELOCITY = 0.10 -MAX_LINEAR_VELOCITY = 1.00 - -[EMCIO] -EMCIO = io -CYCLE_TIME = 0.100 -TOOL_TABLE = tool.tbl - -[KINS] -KINEMATICS = trivkins coordinates=xyza kinematics=BOTH -JOINTS = 4 - -[AXIS_X] -MIN_LIMIT = -0.01 -MAX_LIMIT = 8.0 -MAX_VELOCITY = 1.0 -MAX_ACCELERATION = 30.0 - -[JOINT_0] -TYPE = LINEAR -HOME = 0.0 -MAX_VELOCITY = 1.0 -MAX_ACCELERATION = 30.0 -STEPGEN_MAXACCEL = 37.5 -SCALE = 8000.0 -FERROR = 0.05 -MIN_FERROR = 0.01 -MIN_LIMIT = -0.01 -MAX_LIMIT = 8.0 -HOME_OFFSET = 0.000000 -HOME_SEARCH_VEL = 0.050000 -HOME_LATCH_VEL = 0.050000 -HOME_SEQUENCE = 1 - -[AXIS_Y] -MIN_LIMIT = -0.01 -MAX_LIMIT = 8.0 -MAX_VELOCITY = 1.0 -MAX_ACCELERATION = 30.0 - -[JOINT_1] -TYPE = LINEAR -HOME = 0.0 -MAX_VELOCITY = 1.0 -MAX_ACCELERATION = 30.0 -STEPGEN_MAXACCEL = 37.5 -SCALE = 8000.0 -FERROR = 0.05 -MIN_FERROR = 0.01 -MIN_LIMIT = -0.01 -MAX_LIMIT = 8.0 -HOME_OFFSET = 0.000000 -HOME_SEARCH_VEL = 0.050000 -HOME_LATCH_VEL = 0.050000 -HOME_SEQUENCE = 2 - -[AXIS_Z] -MIN_LIMIT = -4.0 -MAX_LIMIT = 0.01 -MAX_VELOCITY = 1.0 -MAX_ACCELERATION = 30.0 - -[JOINT_2] -TYPE = LINEAR -HOME = 0.0 -MAX_VELOCITY = 1.0 -MAX_ACCELERATION = 30.0 -STEPGEN_MAXACCEL = 37.5 -SCALE = 8000.0 -FERROR = 0.05 -MIN_FERROR = 0.01 -MIN_LIMIT = -4.0 -MAX_LIMIT = 0.01 -HOME_OFFSET = 0.000000 -HOME_SEARCH_VEL = 0.050000 -HOME_LATCH_VEL = 0.050000 -HOME_SEQUENCE = 0 - -[AXIS_A] -MIN_LIMIT = -0.01 -MAX_LIMIT = 8.0 -MAX_VELOCITY = 1.0 -MAX_ACCELERATION = 30.0 - -[JOINT_3] -TYPE = LINEAR -HOME = 0.0 -MAX_VELOCITY = 1.0 -MAX_ACCELERATION = 30.0 -STEPGEN_MAXACCEL = 37.5 -SCALE = 8000.0 -FERROR = 0.05 -MIN_FERROR = 0.01 -MIN_LIMIT = -0.01 -MAX_LIMIT = 8.0 -HOME_OFFSET = 0.000000 -HOME_SEARCH_VEL = 0.050000 -HOME_LATCH_VEL = 0.050000 -HOME_SEQUENCE = 2 diff --git a/configs/by_interface/parport/gantry/gantry.hal b/configs/by_interface/parport/gantry/gantry.hal index 77629e8ddd5..fe000a27e9c 100644 --- a/configs/by_interface/parport/gantry/gantry.hal +++ b/configs/by_interface/parport/gantry/gantry.hal @@ -1,14 +1,9 @@ -# Kinematics +# Generated by stepconf 1.1 at Mon Feb 28 16:28:49 2022 +# If you make changes to this file, they will be +# overwritten when you run stepconf again loadrt [KINS]KINEMATICS - -# Settings for gantrykins -setp gantrykins.joint-0 0 -setp gantrykins.joint-1 1 -setp gantrykins.joint-2 2 -setp gantrykins.joint-3 1 - loadrt [EMCMOT]EMCMOT base_period_nsec=[EMCMOT]BASE_PERIOD servo_period_nsec=[EMCMOT]SERVO_PERIOD num_joints=[KINS]JOINTS -loadrt hal_parport cfg="0x378 out " +loadrt hal_parport cfg="0 out" setp parport.0.reset-time 5000 loadrt stepgen step_type=0,0,0,0 @@ -21,68 +16,88 @@ addf stepgen.capture-position servo-thread addf motion-command-handler servo-thread addf motion-controller servo-thread addf stepgen.update-freq servo-thread -net spindle-cmd <= spindle.0.speed-out +net spindle-cmd-rpm <= spindle.0.speed-out +net spindle-cmd-rpm-abs <= spindle.0.speed-out-abs +net spindle-cmd-rps <= spindle.0.speed-out-rps +net spindle-cmd-rps-abs <= spindle.0.speed-out-rps-abs +net spindle-at-speed => spindle.0.at-speed -net xstep => parport.0.pin-02-out +net xstep => parport.0.pin-02-out setp parport.0.pin-02-out-reset 1 -net xdir => parport.0.pin-03-out -net ystep => parport.0.pin-04-out +net xdir => parport.0.pin-03-out +net ystep => parport.0.pin-04-out setp parport.0.pin-04-out-reset 1 -net ydir => parport.0.pin-05-out -net zstep => parport.0.pin-06-out +net ydir => parport.0.pin-05-out +net zstep => parport.0.pin-06-out setp parport.0.pin-06-out-reset 1 -net zdir => parport.0.pin-07-out -net astep => parport.0.pin-08-out +net zdir => parport.0.pin-07-out +net y2step => parport.0.pin-08-out setp parport.0.pin-08-out-reset 1 -net adir => parport.0.pin-09-out +net y2dir => parport.0.pin-09-out + +# +# Very likely that you will have wired your limit/home switches differently. +# +net min-home-y2 <= parport.0.pin-10-in +net max-home-z <= parport.0.pin-11-in +net min-home-y <= parport.0.pin-12-in +net min-home-x <= parport.0.pin-13-in setp stepgen.0.position-scale [JOINT_0]SCALE setp stepgen.0.steplen 1 setp stepgen.0.stepspace 0 -setp stepgen.0.dirhold 40000 -setp stepgen.0.dirsetup 40000 +setp stepgen.0.dirhold 25000 +setp stepgen.0.dirsetup 25000 setp stepgen.0.maxaccel [JOINT_0]STEPGEN_MAXACCEL net xpos-cmd joint.0.motor-pos-cmd => stepgen.0.position-cmd net xpos-fb stepgen.0.position-fb => joint.0.motor-pos-fb net xstep <= stepgen.0.step net xdir <= stepgen.0.dir net xenable joint.0.amp-enable-out => stepgen.0.enable +net min-home-x => joint.0.home-sw-in +net min-home-x => joint.0.neg-lim-sw-in setp stepgen.1.position-scale [JOINT_1]SCALE setp stepgen.1.steplen 1 setp stepgen.1.stepspace 0 -setp stepgen.1.dirhold 40000 -setp stepgen.1.dirsetup 40000 +setp stepgen.1.dirhold 25000 +setp stepgen.1.dirsetup 25000 setp stepgen.1.maxaccel [JOINT_1]STEPGEN_MAXACCEL net ypos-cmd joint.1.motor-pos-cmd => stepgen.1.position-cmd net ypos-fb stepgen.1.position-fb => joint.1.motor-pos-fb net ystep <= stepgen.1.step net ydir <= stepgen.1.dir net yenable joint.1.amp-enable-out => stepgen.1.enable +net min-home-y => joint.1.home-sw-in +net min-home-y => joint.1.neg-lim-sw-in setp stepgen.2.position-scale [JOINT_2]SCALE setp stepgen.2.steplen 1 setp stepgen.2.stepspace 0 -setp stepgen.2.dirhold 40000 -setp stepgen.2.dirsetup 40000 +setp stepgen.2.dirhold 25000 +setp stepgen.2.dirsetup 25000 setp stepgen.2.maxaccel [JOINT_2]STEPGEN_MAXACCEL net zpos-cmd joint.2.motor-pos-cmd => stepgen.2.position-cmd net zpos-fb stepgen.2.position-fb => joint.2.motor-pos-fb net zstep <= stepgen.2.step net zdir <= stepgen.2.dir net zenable joint.2.amp-enable-out => stepgen.2.enable +net max-home-z => joint.2.home-sw-in +net max-home-z => joint.2.pos-lim-sw-in setp stepgen.3.position-scale [JOINT_3]SCALE setp stepgen.3.steplen 1 setp stepgen.3.stepspace 0 -setp stepgen.3.dirhold 40000 -setp stepgen.3.dirsetup 40000 +setp stepgen.3.dirhold 25000 +setp stepgen.3.dirsetup 25000 setp stepgen.3.maxaccel [JOINT_3]STEPGEN_MAXACCEL -net apos-cmd joint.3.motor-pos-cmd => stepgen.3.position-cmd -net apos-fb stepgen.3.position-fb => joint.3.motor-pos-fb -net astep <= stepgen.3.step -net adir <= stepgen.3.dir -net aenable joint.3.amp-enable-out => stepgen.3.enable +net y2pos-cmd joint.3.motor-pos-cmd => stepgen.3.position-cmd +net y2pos-fb stepgen.3.position-fb => joint.3.motor-pos-fb +net y2step <= stepgen.3.step +net y2dir <= stepgen.3.dir +net y2enable joint.3.amp-enable-out => stepgen.3.enable +net min-home-y2 => joint.3.home-sw-in +net min-home-y2 => joint.3.neg-lim-sw-in net estop-out <= iocontrol.0.user-enable-out net estop-out => iocontrol.0.emc-enable-in diff --git a/configs/by_interface/parport/gantry/gantry.ini b/configs/by_interface/parport/gantry/gantry.ini index 418b29762c8..c0f5c1fe27c 100644 --- a/configs/by_interface/parport/gantry/gantry.ini +++ b/configs/by_interface/parport/gantry/gantry.ini @@ -1,58 +1,70 @@ -# Stepper Gantry with the Y axis driven by two steppers +# This configuration was created using Stepconf wizarda as a XYZA configuration. +# Modified to a XYZY gantry. [EMC] -# The version string for this INI file. -VERSION = 1.1 MACHINE = gantry DEBUG = 0 +VERSION = 1.1 [DISPLAY] DISPLAY = axis -#EDITOR = gedit +EDITOR = gedit POSITION_OFFSET = RELATIVE POSITION_FEEDBACK = ACTUAL -MAX_FEED_OVERRIDE = 1.2 +ARCDIVISION = 64 +GRIDS = 10mm 20mm 50mm 100mm 1in 2in 5in 10in +MAX_FEED_OVERRIDE = 1.5 +MIN_SPINDLE_OVERRIDE = 0.5 +MAX_SPINDLE_OVERRIDE = 1.2 +DEFAULT_LINEAR_VELOCITY = 15.00 +MIN_LINEAR_VELOCITY = 0 +MAX_LINEAR_VELOCITY = 30.00 INTRO_GRAPHIC = linuxcnc.gif INTRO_TIME = 5 -PROGRAM_PREFIX = ../../nc_files/ -INCREMENTS = .1in .05in .01in .005in .001in .0005in .0001in +PROGRAM_PREFIX = ../../nc_files +INCREMENTS = 5mm 1mm .5mm .1mm .05mm .01mm .005mm + +[KINS] +JOINTS = 4 +KINEMATICS = trivkins coordinates=XYZY [FILTER] PROGRAM_EXTENSION = .png,.gif,.jpg Greyscale Depth Image PROGRAM_EXTENSION = .py Python Script +PROGRAM_EXTENSION = .nc,.tap G-Code File png = image-to-gcode gif = image-to-gcode jpg = image-to-gcode py = python +[TASK] +TASK = milltask +CYCLE_TIME = 0.010 + [RS274NGC] -PARAMETER_FILE = emc.var +PARAMETER_FILE = linuxcnc.var [EMCMOT] EMCMOT = motmod COMM_TIMEOUT = 1.0 -BASE_PERIOD = 55555 +BASE_PERIOD = 30000 SERVO_PERIOD = 1000000 -[TASK] -TASK = milltask -CYCLE_TIME = 0.010 - [HAL] +HALUI = halui HALFILE = gantry.hal -POSTGUI_HALFILE = postgui.hal +#HALFILE = custom.hal +#POSTGUI_HALFILE = postgui_call_list.hal [HALUI] -#No Content +# add halui MDI commands here (max 64) [TRAJ] -COORDINATES = X Y Z A -MAX_ANGULAR_VELOCITY = 360.00 -DEFAULT_ANGULAR_VELOCITY = 36.00 -LINEAR_UNITS = inch +COORDINATES = X Y Z Y +LINEAR_UNITS = mm ANGULAR_UNITS = degree -DEFAULT_LINEAR_VELOCITY = 0.10 -MAX_LINEAR_VELOCITY = 1.00 +DEFAULT_LINEAR_VELOCITY = 15.00 +MAX_LINEAR_VELOCITY = 30.00 [EMCIO] EMCIO = io @@ -60,81 +72,96 @@ CYCLE_TIME = 0.100 TOOL_TABLE = tool.tbl [KINS] -KINEMATICS = trivkins +KINEMATICS = trivkins coordinates=XYZY JOINTS = 4 [AXIS_X] -MIN_LIMIT = -0.01 -MAX_LIMIT = 8.0 -MAX_VELOCITY = 1.0 -MAX_ACCELERATION = 30.0 +MAX_VELOCITY = 20.0 +MAX_ACCELERATION = 750.0 +MIN_LIMIT = -0.001 +MAX_LIMIT = 700.0 + +[AXIS_Y] +MAX_VELOCITY = 10.0 +MAX_ACCELERATION = 750.0 +MIN_LIMIT = -1.0 +MAX_LIMIT = 1000.0 + +[AXIS_Z] +MAX_VELOCITY = 20.0 +MAX_ACCELERATION = 150.0 +MIN_LIMIT = -0.0 +MAX_LIMIT = 160.0 [JOINT_0] TYPE = LINEAR +MIN_LIMIT = -3 +MAX_LIMIT = 700.0 +MAX_VELOCITY = 20.0 +MAX_ACCELERATION = 750.0 +STEPGEN_MAXACCEL = 937.5 +SCALE = -400.0 +FERROR = 1 +MIN_FERROR = .25 HOME = 0.0 -MAX_VELOCITY = 1.0 -MAX_ACCELERATION = 30.0 -STEPGEN_MAXACCEL = 37.5 -SCALE = 8000.0 -FERROR = 0.05 -MIN_FERROR = 0.01 -MIN_LIMIT = -0.01 -MAX_LIMIT = 8.0 -HOME_OFFSET = 0.0 - -[AXIS_Y] -MIN_LIMIT = -0.01 -MAX_LIMIT = 8.0 -MAX_VELOCITY = 1.0 -MAX_ACCELERATION = 30.0 +HOME_OFFSET = -1.0 +HOME_SEARCH_VEL = -15.0 +HOME_LATCH_VEL = -2.0 +HOME_FINAL_VEL = 15.0 +HOME_IGNORE_LIMITS = YES +HOME_SEQUENCE = 1 [JOINT_1] TYPE = LINEAR +MIN_LIMIT = -1.0 +MAX_LIMIT = 1000.0 +MAX_VELOCITY = 10.0 +MAX_ACCELERATION = 750.0 +STEPGEN_MAXACCEL = 937.5 +SCALE = -787.4015 +FERROR = 1 +MIN_FERROR = .25 HOME = 0.0 -MAX_VELOCITY = 1.0 -MAX_ACCELERATION = 30.0 -STEPGEN_MAXACCEL = 37.5 -SCALE = 8000.0 -FERROR = 0.05 -MIN_FERROR = 0.01 -MIN_LIMIT = -0.01 -MAX_LIMIT = 8.0 -HOME_OFFSET = 0.0 - -[AXIS_Z] -MIN_LIMIT = -4.0 -MAX_LIMIT = 0.01 -MAX_VELOCITY = 1.0 -MAX_ACCELERATION = 30.0 +HOME_OFFSET = -1.0 +HOME_SEARCH_VEL = -10.00000 +HOME_LATCH_VEL = -2.0 +HOME_FINAL_VEL = 8.0 +HOME_IGNORE_LIMITS = YES +HOME_SEQUENCE = -2 [JOINT_2] TYPE = LINEAR -HOME = 0.0 -MAX_VELOCITY = 1.0 -MAX_ACCELERATION = 30.0 -STEPGEN_MAXACCEL = 37.5 -SCALE = 8000.0 -FERROR = 0.05 -MIN_FERROR = 0.01 -MIN_LIMIT = -4.0 -MAX_LIMIT = 0.01 -HOME_OFFSET = 0.0 - -[AXIS_A] -MIN_LIMIT = -0.01 -MAX_LIMIT = 8.0 -MAX_VELOCITY = 1.0 -MAX_ACCELERATION = 30.0 +MAX_VELOCITY = 20.0 +MAX_ACCELERATION = 750.0 +STEPGEN_MAXACCEL = 937.5 +SCALE = 400.0 +FERROR = 1 +MIN_FERROR = .25 +MIN_LIMIT = -0.0 +MAX_LIMIT = 160.0 +HOME = 155.0 +HOME_OFFSET = 160.0 +HOME_SEARCH_VEL = 15.0 +HOME_LATCH_VEL = -2.0 +HOME_FINAL_VEL = 15.0 +HOME_IGNORE_LIMITS = YES +HOME_SEQUENCE = 0 [JOINT_3] TYPE = LINEAR +MIN_LIMIT = -1.0 +MAX_LIMIT = 1000.0 +MAX_VELOCITY = 10.0 +MAX_ACCELERATION = 750.0 +STEPGEN_MAXACCEL = 937.5 +SCALE = -787.4015 +FERROR = 1 +MIN_FERROR = .25 HOME = 0.0 -MAX_VELOCITY = 1.0 -MAX_ACCELERATION = 30.0 -STEPGEN_MAXACCEL = 37.5 -SCALE = 8000.0 -FERROR = 0.05 -MIN_FERROR = 0.01 -MIN_LIMIT = -0.01 -MAX_LIMIT = 8.0 -HOME_OFFSET = 0.0 +HOME_OFFSET = -1.0 +HOME_SEARCH_VEL = -10.00000 +HOME_LATCH_VEL = -2.0 +HOME_FINAL_VEL = 8.0 +HOME_IGNORE_LIMITS = YES +HOME_SEQUENCE = -2 + diff --git a/configs/by_interface/parport/gantry/gantry_joints.ini b/configs/by_interface/parport/gantry/gantry_joints.ini new file mode 100644 index 00000000000..75b6a179960 --- /dev/null +++ b/configs/by_interface/parport/gantry/gantry_joints.ini @@ -0,0 +1,165 @@ +# This configuration was created using Stepconf wizarda as a XYZA configuration. +# Modified to a XYZY gantry. + +[EMC] +MACHINE = gantry_joints +DEBUG = 0 +VERSION = 1.1 + +[DISPLAY] +DISPLAY = axis +EDITOR = gedit +POSITION_OFFSET = RELATIVE +POSITION_FEEDBACK = ACTUAL +ARCDIVISION = 64 +GRIDS = 10mm 20mm 50mm 100mm 1in 2in 5in 10in +MAX_FEED_OVERRIDE = 1.5 +MIN_SPINDLE_OVERRIDE = 0.5 +MAX_SPINDLE_OVERRIDE = 1.2 +DEFAULT_LINEAR_VELOCITY = 15.00 +MIN_LINEAR_VELOCITY = 0 +MAX_LINEAR_VELOCITY = 30.00 +INTRO_GRAPHIC = linuxcnc.gif +INTRO_TIME = 5 +PROGRAM_PREFIX = /home/cncbox/linuxcnc/nc_files +INCREMENTS = 5mm 1mm .5mm .1mm .05mm .01mm .005mm + +[KINS] +JOINTS = 4 +KINEMATICS = trivkins coordinates=XYZY kinstype=BOTH + +[FILTER] +PROGRAM_EXTENSION = .png,.gif,.jpg Greyscale Depth Image +PROGRAM_EXTENSION = .py Python Script +PROGRAM_EXTENSION = .nc,.tap G-Code File +png = image-to-gcode +gif = image-to-gcode +jpg = image-to-gcode +py = python + +[TASK] +TASK = milltask +CYCLE_TIME = 0.010 + +[RS274NGC] +PARAMETER_FILE = linuxcnc.var + +[EMCMOT] +EMCMOT = motmod +COMM_TIMEOUT = 1.0 +BASE_PERIOD = 30000 +SERVO_PERIOD = 1000000 + +[HAL] +HALUI = halui +HALFILE = gantry.hal + +[HALUI] +# add halui MDI commands here (max 64) + +[TRAJ] +COORDINATES = X Y Z Y +LINEAR_UNITS = mm +ANGULAR_UNITS = degree +DEFAULT_LINEAR_VELOCITY = 15.00 +MAX_LINEAR_VELOCITY = 30.00 + +[EMCIO] +EMCIO = io +CYCLE_TIME = 0.100 +TOOL_TABLE = tool.tbl + +[KINS] +KINEMATICS = trivkins coordinates=XYZY kinstype=BOTH +JOINTS = 4 + +[AXIS_X] +MAX_VELOCITY = 20.0 +MAX_ACCELERATION = 750.0 +MIN_LIMIT = -0.001 +MAX_LIMIT = 700.0 + +[AXIS_Y] +MAX_VELOCITY = 10.0 +MAX_ACCELERATION = 750.0 +MIN_LIMIT = -1.0 +MAX_LIMIT = 1000.0 + +[AXIS_Z] +MAX_VELOCITY = 20.0 +MAX_ACCELERATION = 150.0 +MIN_LIMIT = -0.0 +MAX_LIMIT = 160.0 + +[JOINT_0] +TYPE = LINEAR +MIN_LIMIT = -3 +MAX_LIMIT = 700.0 +MAX_VELOCITY = 20.0 +MAX_ACCELERATION = 750.0 +STEPGEN_MAXACCEL = 937.5 +SCALE = -400.0 +FERROR = 1 +MIN_FERROR = .25 +HOME = 0.0 +HOME_OFFSET = -1.0 +HOME_SEARCH_VEL = -15.0 +HOME_LATCH_VEL = -2.0 +HOME_FINAL_VEL = 15.0 +HOME_IGNORE_LIMITS = YES +#HOME_SEQUENCE = 1 + +[JOINT_1] +TYPE = LINEAR +MIN_LIMIT = -1.0 +MAX_LIMIT = 1000.0 +MAX_VELOCITY = 10.0 +MAX_ACCELERATION = 750.0 +STEPGEN_MAXACCEL = 937.5 +SCALE = -787.4015 +FERROR = 1 +MIN_FERROR = .25 +HOME = 0.0 +HOME_OFFSET = -1.0 +HOME_SEARCH_VEL = -10.00000 +HOME_LATCH_VEL = -2.0 +HOME_FINAL_VEL = 8.0 +HOME_IGNORE_LIMITS = YES +#HOME_SEQUENCE = -2 + +[JOINT_2] +TYPE = LINEAR +MAX_VELOCITY = 20.0 +MAX_ACCELERATION = 750.0 +STEPGEN_MAXACCEL = 937.5 +SCALE = 400.0 +FERROR = 1 +MIN_FERROR = .25 +MIN_LIMIT = -0.0 +MAX_LIMIT = 160.0 +HOME = 155.0 +HOME_OFFSET = 160.0 +HOME_SEARCH_VEL = 15.0 +HOME_LATCH_VEL = -2.0 +HOME_FINAL_VEL = 15.0 +HOME_IGNORE_LIMITS = YES +#HOME_SEQUENCE = 0 + +[JOINT_3] +TYPE = LINEAR +MIN_LIMIT = -1.0 +MAX_LIMIT = 1000.0 +MAX_VELOCITY = 10.0 +MAX_ACCELERATION = 750.0 +STEPGEN_MAXACCEL = 937.5 +SCALE = -787.4015 +FERROR = 1 +MIN_FERROR = .25 +HOME = 0.0 +HOME_OFFSET = -1.0 +HOME_SEARCH_VEL = -10.00000 +HOME_LATCH_VEL = -2.0 +HOME_FINAL_VEL = 8.0 +HOME_IGNORE_LIMITS = YES +#HOME_SEQUENCE = -2 + diff --git a/configs/by_interface/parport/gantry/tool.tbl b/configs/by_interface/parport/gantry/tool.tbl deleted file mode 100644 index 4a511a96505..00000000000 --- a/configs/by_interface/parport/gantry/tool.tbl +++ /dev/null @@ -1,4 +0,0 @@ -T1 P1 D0.125000 Z+0.511000 ;1/8 end mill -T2 P2 D0.062500 Z+0.100000 ;1/16 end mill -T3 P3 D0.201000 Z+1.273000 ;#7 tap drill - From f895fa1fe53ed6bac1c5b752d2eabcf8f1acf4b7 Mon Sep 17 00:00:00 2001 From: Jerry Trantow Date: Wed, 2 Mar 2022 10:05:33 -0600 Subject: [PATCH 85/85] Change EDITOR = geany. Restore more generous dirhold and dirsetup timing. --- configs/by_interface/parport/gantry/gantry.hal | 16 ++++++++-------- .../parport/gantry/gantry_joints.ini | 2 +- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/configs/by_interface/parport/gantry/gantry.hal b/configs/by_interface/parport/gantry/gantry.hal index fe000a27e9c..0f1b05ad783 100644 --- a/configs/by_interface/parport/gantry/gantry.hal +++ b/configs/by_interface/parport/gantry/gantry.hal @@ -46,8 +46,8 @@ net min-home-x <= parport.0.pin-13-in setp stepgen.0.position-scale [JOINT_0]SCALE setp stepgen.0.steplen 1 setp stepgen.0.stepspace 0 -setp stepgen.0.dirhold 25000 -setp stepgen.0.dirsetup 25000 +setp stepgen.0.dirhold 40000 +setp stepgen.0.dirsetup 40000 setp stepgen.0.maxaccel [JOINT_0]STEPGEN_MAXACCEL net xpos-cmd joint.0.motor-pos-cmd => stepgen.0.position-cmd net xpos-fb stepgen.0.position-fb => joint.0.motor-pos-fb @@ -60,8 +60,8 @@ net min-home-x => joint.0.neg-lim-sw-in setp stepgen.1.position-scale [JOINT_1]SCALE setp stepgen.1.steplen 1 setp stepgen.1.stepspace 0 -setp stepgen.1.dirhold 25000 -setp stepgen.1.dirsetup 25000 +setp stepgen.1.dirhold 40000 +setp stepgen.1.dirsetup 40000 setp stepgen.1.maxaccel [JOINT_1]STEPGEN_MAXACCEL net ypos-cmd joint.1.motor-pos-cmd => stepgen.1.position-cmd net ypos-fb stepgen.1.position-fb => joint.1.motor-pos-fb @@ -74,8 +74,8 @@ net min-home-y => joint.1.neg-lim-sw-in setp stepgen.2.position-scale [JOINT_2]SCALE setp stepgen.2.steplen 1 setp stepgen.2.stepspace 0 -setp stepgen.2.dirhold 25000 -setp stepgen.2.dirsetup 25000 +setp stepgen.2.dirhold 40000 +setp stepgen.2.dirsetup 40000 setp stepgen.2.maxaccel [JOINT_2]STEPGEN_MAXACCEL net zpos-cmd joint.2.motor-pos-cmd => stepgen.2.position-cmd net zpos-fb stepgen.2.position-fb => joint.2.motor-pos-fb @@ -88,8 +88,8 @@ net max-home-z => joint.2.pos-lim-sw-in setp stepgen.3.position-scale [JOINT_3]SCALE setp stepgen.3.steplen 1 setp stepgen.3.stepspace 0 -setp stepgen.3.dirhold 25000 -setp stepgen.3.dirsetup 25000 +setp stepgen.3.dirhold 40000 +setp stepgen.3.dirsetup 40000 setp stepgen.3.maxaccel [JOINT_3]STEPGEN_MAXACCEL net y2pos-cmd joint.3.motor-pos-cmd => stepgen.3.position-cmd net y2pos-fb stepgen.3.position-fb => joint.3.motor-pos-fb diff --git a/configs/by_interface/parport/gantry/gantry_joints.ini b/configs/by_interface/parport/gantry/gantry_joints.ini index 75b6a179960..258beb2d151 100644 --- a/configs/by_interface/parport/gantry/gantry_joints.ini +++ b/configs/by_interface/parport/gantry/gantry_joints.ini @@ -8,7 +8,7 @@ VERSION = 1.1 [DISPLAY] DISPLAY = axis -EDITOR = gedit +EDITOR = geany POSITION_OFFSET = RELATIVE POSITION_FEEDBACK = ACTUAL ARCDIVISION = 64