diff --git a/CMakeLists.txt b/CMakeLists.txt index 2f2d1a9b8..5dd6eb707 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -19,7 +19,7 @@ include(cmake/hoto_update_cmake_message.cmake) cmake_minimum_required(VERSION 3.14...3.19 FATAL_ERROR) project(qelectrotech - VERSION 0.8.0 + VERSION 0.9.0 DESCRIPTION "QET is a CAD/CAE editor focusing on schematics drawing features." HOMEPAGE_URL "https://qelectrotech.org/" LANGUAGES CXX) diff --git a/SingleApplication/CHANGELOG.md b/SingleApplication/CHANGELOG.md index 45c197e3d..e2ba290e2 100644 --- a/SingleApplication/CHANGELOG.md +++ b/SingleApplication/CHANGELOG.md @@ -1,12 +1,79 @@ Changelog ========= +If by accident I have forgotten to credit someone in the CHANGELOG, email me and I will fix it. + +__3.2.0__ +--------- + +* Added support for Qt 6 - _Jonas Kvinge_ +* Fixed warning in `Qt 5.9` with `min`/`max` functions on Windows - _Nick Korotysh_ +* Fix return value of connectToPrimary() when connect is successful - _Jonas Kvinge_ +* Fix build issue with MinGW GCC pedantic mode - _Iakov Kirilenko_ +* Fixed conversion from `int` to `quint32` and Clang Tidy warnings - _Hennadii Chernyshchyk_ + +__3.1.5__ +--------- + +* Improved library stability in edge cases and very rapid process initialisation +* Fixed Bug where the shared memory block may have been modified without a lock +* Fixed Bug causing `instanceStarted()` to not get emitted when a second instance + has been started before the primary has initiated it's `QLocalServer`. + +__3.1.4__ +--------- +* Officially supporting and build-testing against Qt 5.15 +* Fixed an MSVC C4996 warning that suggests using `strncpy_s`. + + _Hennadii Chernyshchyk_ + +__3.1.3.1__ +--------- +* CMake build system improvements +* Fixed Clang Tidy warnings + + _Hennadii Chernyshchyk_ + +__3.1.3__ +--------- +* Improved `CMakeLists.txt` + + _Hennadii Chernyshchyk_ + +__3.1.2__ +--------- + +* Fix a crash when exiting an application on Android and iOS + + _Emeric Grange_ + +__3.1.1a__ +---------- + +* Added currentUser() method that returns the user the current instance is running as. + + _Leander Schulten_ + +__3.1.0a__ +---------- + +* Added primaryUser() method that returns the user the primary instance is running as. + +__3.0.19__ +---------- + +* Fixed code warning for depricated functions in Qt 5.10 related to `QTime` and `qrand()`. + + _Hennadii Chernyshchyk_ + _Anton Filimonov_ + _Jonas Kvinge_ + __3.0.18__ ---------- * Fallback to standard QApplication class on iOS and Android systems where the library is not supported. - + * Added Build CI tests to verify the library builds successfully on Linux, Windows and MacOS across multiple Qt versions. _Anton Filimonov_ diff --git a/SingleApplication/CMakeLists.txt b/SingleApplication/CMakeLists.txt index d61923043..ae1b1439b 100644 --- a/SingleApplication/CMakeLists.txt +++ b/SingleApplication/CMakeLists.txt @@ -1,43 +1,40 @@ -cmake_minimum_required(VERSION 3.1.0) +cmake_minimum_required(VERSION 3.7.0) -project(SingleApplication) +project(SingleApplication LANGUAGES CXX) -set(CMAKE_INCLUDE_CURRENT_DIR ON) set(CMAKE_AUTOMOC ON) -# SingleApplication base class -set(QAPPLICATION_CLASS QCoreApplication CACHE STRING "Inheritance class for SingleApplication") -set_property(CACHE QAPPLICATION_CLASS PROPERTY STRINGS QApplication QGuiApplication QCoreApplication) - -# Libary target add_library(${PROJECT_NAME} STATIC singleapplication.cpp singleapplication_p.cpp - ) +) +add_library(${PROJECT_NAME}::${PROJECT_NAME} ALIAS ${PROJECT_NAME}) + +if(NOT QT_DEFAULT_MAJOR_VERSION) + set(QT_DEFAULT_MAJOR_VERSION 5 CACHE STRING "Qt version to use (5 or 6), defaults to 5") +endif() # Find dependencies -find_package(Qt5Network) -if(QAPPLICATION_CLASS STREQUAL QApplication) - find_package(Qt5 COMPONENTS Widgets REQUIRED) -elseif(QAPPLICATION_CLASS STREQUAL QGuiApplication) - find_package(Qt5 COMPONENTS Gui REQUIRED) -else() - find_package(Qt5 COMPONENTS Core REQUIRED) -endif() -add_compile_definitions(QAPPLICATION_CLASS=${QAPPLICATION_CLASS}) +set(QT_COMPONENTS Core Network) +set(QT_LIBRARIES Qt${QT_DEFAULT_MAJOR_VERSION}::Core Qt${QT_DEFAULT_MAJOR_VERSION}::Network) -# Link dependencies -target_link_libraries(${PROJECT_NAME} PRIVATE Qt5::Network) if(QAPPLICATION_CLASS STREQUAL QApplication) - target_link_libraries(${PROJECT_NAME} PRIVATE Qt5::Widgets) + list(APPEND QT_COMPONENTS Widgets) + list(APPEND QT_LIBRARIES Qt${QT_DEFAULT_MAJOR_VERSION}::Widgets) elseif(QAPPLICATION_CLASS STREQUAL QGuiApplication) - target_link_libraries(${PROJECT_NAME} PRIVATE Qt5::Gui) + list(APPEND QT_COMPONENTS Gui) + list(APPEND QT_LIBRARIES Qt${QT_DEFAULT_MAJOR_VERSION}::Gui) else() - target_link_libraries(${PROJECT_NAME} PRIVATE Qt5::Core) + set(QAPPLICATION_CLASS QCoreApplication) endif() +find_package(Qt${QT_DEFAULT_MAJOR_VERSION} COMPONENTS ${QT_COMPONENTS} REQUIRED) + +target_link_libraries(${PROJECT_NAME} PUBLIC ${QT_LIBRARIES}) + if(WIN32) target_link_libraries(${PROJECT_NAME} PRIVATE advapi32) endif() +target_compile_definitions(${PROJECT_NAME} PUBLIC QAPPLICATION_CLASS=${QAPPLICATION_CLASS}) target_include_directories(${PROJECT_NAME} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) diff --git a/SingleApplication/LICENSE b/SingleApplication/LICENSE index 85b2a1495..a82e5a68f 100644 --- a/SingleApplication/LICENSE +++ b/SingleApplication/LICENSE @@ -1,6 +1,6 @@ The MIT License (MIT) -Copyright (c) Itay Grudev 2015 - 2016 +Copyright (c) Itay Grudev 2015 - 2020 Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/SingleApplication/README.md b/SingleApplication/README.md index 5d6098654..457ab3392 100644 --- a/SingleApplication/README.md +++ b/SingleApplication/README.md @@ -1,7 +1,8 @@ SingleApplication ================= +[![CI](https://github.com/itay-grudev/SingleApplication/workflows/CI:%20Build%20Test/badge.svg)](https://github.com/itay-grudev/SingleApplication/actions) -This is a replacement of the QtSingleApplication for `Qt5`. +This is a replacement of the QtSingleApplication for `Qt5` and `Qt6`. Keeps the Primary Instance of your Application and kills each subsequent instances. It can (if enabled) spawn secondary (non-related to the primary) @@ -15,18 +16,6 @@ class you specify via the `QAPPLICATION_CLASS` macro (`QCoreApplication` is the default). Further usage is similar to the use of the `Q[Core|Gui]Application` classes. -The library sets up a `QLocalServer` and a `QSharedMemory` block. The first -instance of your Application is your Primary Instance. It would check if the -shared memory block exists and if not it will start a `QLocalServer` and listen -for connections. Each subsequent instance of your application would check if the -shared memory block exists and if it does, it will connect to the QLocalServer -to notify the primary instance that a new instance had been started, after which -it would terminate with status code `0`. In the Primary Instance -`SingleApplication` would emit the `instanceStarted()` signal upon detecting -that a new instance had been started. - -The library uses `stdlib` to terminate the program with the `exit()` function. - You can use the library as if you use any other `QCoreApplication` derived class: @@ -43,8 +32,7 @@ int main( int argc, char* argv[] ) ``` To include the library files I would recommend that you add it as a git -submodule to your project and include it's contents with a `.pri` file. Here is -how: +submodule to your project. Here is how: ```bash git submodule add git@github.com:itay-grudev/SingleApplication.git singleapplication @@ -66,13 +54,27 @@ Then include the subdirectory in your `CMakeLists.txt` project file. ```cmake set(QAPPLICATION_CLASS QApplication CACHE STRING "Inheritance class for SingleApplication") add_subdirectory(src/third-party/singleapplication) +target_link_libraries(${PROJECT_NAME} SingleApplication::SingleApplication) ``` + +The library sets up a `QLocalServer` and a `QSharedMemory` block. The first +instance of your Application is your Primary Instance. It would check if the +shared memory block exists and if not it will start a `QLocalServer` and listen +for connections. Each subsequent instance of your application would check if the +shared memory block exists and if it does, it will connect to the QLocalServer +to notify the primary instance that a new instance had been started, after which +it would terminate with status code `0`. In the Primary Instance +`SingleApplication` would emit the `instanceStarted()` signal upon detecting +that a new instance had been started. + +The library uses `stdlib` to terminate the program with the `exit()` function. + Also don't forget to specify which `QCoreApplication` class your app is using if it is not `QCoreApplication` as in examples above. The `Instance Started` signal ------------------------- +----------------------------- The SingleApplication class implements a `instanceStarted()` signal. You can bind to that signal to raise your application's window when a new instance had @@ -137,13 +139,22 @@ app.isSecondary(); *__Note:__ If your Primary Instance is terminated a newly launched instance will replace the Primary one even if the Secondary flag has been set.* +Examples +-------- + +There are three examples provided in this repository: + +* Basic example that prevents a secondary instance from starting [`examples/basic`](https://github.com/itay-grudev/SingleApplication/tree/master/examples/basic) +* An example of a graphical application raising it's parent window [`examples/calculator`](https://github.com/itay-grudev/SingleApplication/tree/master/examples/calculator) +* A console application sending the primary instance it's command line parameters [`examples/sending_arguments`](https://github.com/itay-grudev/SingleApplication/tree/master/examples/sending_arguments) + API --- ### Members ```cpp -SingleApplication::SingleApplication( int &argc, char *argv[], bool allowSecondary = false, Options options = Mode::User, int timeout = 100 ) +SingleApplication::SingleApplication( int &argc, char *argv[], bool allowSecondary = false, Options options = Mode::User, int timeout = 100, QString userData = QString() ) ``` Depending on whether `allowSecondary` is set, this constructor may terminate @@ -152,7 +163,7 @@ can be specified to set whether the SingleApplication block should work user-wide or system-wide. Additionally the `Mode::SecondaryNotification` may be used to notify the primary instance whenever a secondary instance had been started (disabled by default). `timeout` specifies the maximum time in -milliseconds to wait for blocking operations. +milliseconds to wait for blocking operations. Setting `userData` provides additional data that will isolate this instance from other instances that do not have the same (or any) user data set. *__Note:__ `argc` and `argv` may be changed as Qt removes arguments that it recognizes.* @@ -204,6 +215,22 @@ qint64 SingleApplication::primaryPid() Returns the process ID (PID) of the primary instance. +--- + +```cpp +QString SingleApplication::primaryUser() +``` + +Returns the username the primary instance is running as. + +--- + +```cpp +QString SingleApplication::currentUser() +``` + +Returns the username the current instance is running as. + ### Signals ```cpp diff --git a/SingleApplication/SingleApplication b/SingleApplication/SingleApplication new file mode 100644 index 000000000..8ead1a428 --- /dev/null +++ b/SingleApplication/SingleApplication @@ -0,0 +1 @@ +#include "singleapplication.h" diff --git a/SingleApplication/examples/basic/CMakeLists.txt b/SingleApplication/examples/basic/CMakeLists.txt new file mode 100644 index 000000000..c1429230c --- /dev/null +++ b/SingleApplication/examples/basic/CMakeLists.txt @@ -0,0 +1,12 @@ +cmake_minimum_required(VERSION 3.7.0) + +project(basic LANGUAGES CXX) + +# SingleApplication base class +set(QAPPLICATION_CLASS QCoreApplication) +add_subdirectory(../.. SingleApplication) + +add_executable(basic main.cpp) + +target_link_libraries(${PROJECT_NAME} SingleApplication::SingleApplication) + diff --git a/SingleApplication/examples/basic/basic.pro b/SingleApplication/examples/basic/basic.pro old mode 100644 new mode 100755 diff --git a/SingleApplication/examples/basic/main.cpp b/SingleApplication/examples/basic/main.cpp old mode 100644 new mode 100755 index 1841902be..c22af037c --- a/SingleApplication/examples/basic/main.cpp +++ b/SingleApplication/examples/basic/main.cpp @@ -5,5 +5,7 @@ int main(int argc, char *argv[]) // Allow secondary instances SingleApplication app( argc, argv ); + qWarning() << "Started a new instance"; + return app.exec(); } diff --git a/SingleApplication/examples/calculator/CMakeLists.txt b/SingleApplication/examples/calculator/CMakeLists.txt new file mode 100644 index 000000000..82305f047 --- /dev/null +++ b/SingleApplication/examples/calculator/CMakeLists.txt @@ -0,0 +1,21 @@ +cmake_minimum_required(VERSION 3.7.0) + +project(calculator LANGUAGES CXX) + +set(CMAKE_AUTOMOC ON) + +# SingleApplication base class +set(QAPPLICATION_CLASS QApplication) +add_subdirectory(../.. SingleApplication) + +find_package(Qt${QT_DEFAULT_MAJOR_VERSION} COMPONENTS Core REQUIRED) + +add_executable(${PROJECT_NAME} + button.h + calculator.h + button.cpp + calculator.cpp + main.cpp +) + +target_link_libraries(${PROJECT_NAME} SingleApplication::SingleApplication) diff --git a/SingleApplication/examples/calculator/calculator.cpp b/SingleApplication/examples/calculator/calculator.cpp index c02b5604a..3d34c2a74 100644 --- a/SingleApplication/examples/calculator/calculator.cpp +++ b/SingleApplication/examples/calculator/calculator.cpp @@ -82,27 +82,27 @@ Calculator::Calculator(QWidget *parent) digitButtons[i] = createButton(QString::number(i), SLOT(digitClicked())); } - Button *pointButton = createButton(tr("."), SLOT(pointClicked())); - Button *changeSignButton = createButton(tr("\302\261"), SLOT(changeSignClicked())); + Button *pointButton = createButton(".", SLOT(pointClicked())); + Button *changeSignButton = createButton("\302\261", SLOT(changeSignClicked())); - Button *backspaceButton = createButton(tr("Backspace"), SLOT(backspaceClicked())); - Button *clearButton = createButton(tr("Clear"), SLOT(clear())); - Button *clearAllButton = createButton(tr("Clear All"), SLOT(clearAll())); + Button *backspaceButton = createButton("Backspace", SLOT(backspaceClicked())); + Button *clearButton = createButton("Clear", SLOT(clear())); + Button *clearAllButton = createButton("Clear All", SLOT(clearAll())); - Button *clearMemoryButton = createButton(tr("MC"), SLOT(clearMemory())); - Button *readMemoryButton = createButton(tr("MR"), SLOT(readMemory())); - Button *setMemoryButton = createButton(tr("MS"), SLOT(setMemory())); - Button *addToMemoryButton = createButton(tr("M+"), SLOT(addToMemory())); + Button *clearMemoryButton = createButton("MC", SLOT(clearMemory())); + Button *readMemoryButton = createButton("MR", SLOT(readMemory())); + Button *setMemoryButton = createButton("MS", SLOT(setMemory())); + Button *addToMemoryButton = createButton("M+", SLOT(addToMemory())); - Button *divisionButton = createButton(tr("\303\267"), SLOT(multiplicativeOperatorClicked())); - Button *timesButton = createButton(tr("\303\227"), SLOT(multiplicativeOperatorClicked())); - Button *minusButton = createButton(tr("-"), SLOT(additiveOperatorClicked())); - Button *plusButton = createButton(tr("+"), SLOT(additiveOperatorClicked())); + Button *divisionButton = createButton("\303\267", SLOT(multiplicativeOperatorClicked())); + Button *timesButton = createButton("\303\227", SLOT(multiplicativeOperatorClicked())); + Button *minusButton = createButton("-", SLOT(additiveOperatorClicked())); + Button *plusButton = createButton("+", SLOT(additiveOperatorClicked())); - Button *squareRootButton = createButton(tr("Sqrt"), SLOT(unaryOperatorClicked())); - Button *powerButton = createButton(tr("x\302\262"), SLOT(unaryOperatorClicked())); - Button *reciprocalButton = createButton(tr("1/x"), SLOT(unaryOperatorClicked())); - Button *equalButton = createButton(tr("="), SLOT(equalClicked())); + Button *squareRootButton = createButton("Sqrt", SLOT(unaryOperatorClicked())); + Button *powerButton = createButton("x\302\262", SLOT(unaryOperatorClicked())); + Button *reciprocalButton = createButton("1/x", SLOT(unaryOperatorClicked())); + Button *equalButton = createButton("=", SLOT(equalClicked())); //! [4] //! [5] @@ -140,7 +140,7 @@ Calculator::Calculator(QWidget *parent) mainLayout->addWidget(equalButton, 5, 5); setLayout(mainLayout); - setWindowTitle(tr("Calculator")); + setWindowTitle("Calculator"); } //! [6] @@ -169,15 +169,15 @@ void Calculator::unaryOperatorClicked() double operand = display->text().toDouble(); double result = 0.0; - if (clickedOperator == tr("Sqrt")) { + if (clickedOperator == "Sqrt") { if (operand < 0.0) { abortOperation(); return; } result = std::sqrt(operand); - } else if (clickedOperator == tr("x\302\262")) { + } else if (clickedOperator == "x\302\262") { result = std::pow(operand, 2.0); - } else if (clickedOperator == tr("1/x")) { + } else if (clickedOperator == "1/x") { if (operand == 0.0) { abortOperation(); return; @@ -287,7 +287,7 @@ void Calculator::pointClicked() if (waitingForOperand) display->setText("0"); if (!display->text().contains('.')) - display->setText(display->text() + tr(".")); + display->setText(display->text() + "."); waitingForOperand = false; } //! [22] @@ -299,7 +299,7 @@ void Calculator::changeSignClicked() double value = text.toDouble(); if (value > 0.0) { - text.prepend(tr("-")); + text.prepend("-"); } else if (value < 0.0) { text.remove(0, 1); } @@ -383,20 +383,20 @@ Button *Calculator::createButton(const QString &text, const char *member) void Calculator::abortOperation() { clearAll(); - display->setText(tr("####")); + display->setText("####"); } //! [36] //! [38] bool Calculator::calculate(double rightOperand, const QString &pendingOperator) { - if (pendingOperator == tr("+")) { + if (pendingOperator == "+") { sumSoFar += rightOperand; - } else if (pendingOperator == tr("-")) { + } else if (pendingOperator == "-") { sumSoFar -= rightOperand; - } else if (pendingOperator == tr("\303\227")) { + } else if (pendingOperator == "\303\227") { factorSoFar *= rightOperand; - } else if (pendingOperator == tr("\303\267")) { + } else if (pendingOperator == "\303\267") { if (rightOperand == 0.0) return false; factorSoFar /= rightOperand; diff --git a/SingleApplication/examples/sending_arguments/CMakeLists.txt b/SingleApplication/examples/sending_arguments/CMakeLists.txt new file mode 100644 index 000000000..2cc559757 --- /dev/null +++ b/SingleApplication/examples/sending_arguments/CMakeLists.txt @@ -0,0 +1,20 @@ +cmake_minimum_required(VERSION 3.7.0) + +project(sending_arguments LANGUAGES CXX) + +set(CMAKE_AUTOMOC ON) + +# SingleApplication base class +set(QAPPLICATION_CLASS QCoreApplication) +add_subdirectory(../.. SingleApplication) + +find_package(Qt${QT_DEFAULT_MAJOR_VERSION} COMPONENTS Core REQUIRED) + +add_executable(${PROJECT_NAME} + main.cpp + messagereceiver.cpp + messagereceiver.h + main.cpp +) + +target_link_libraries(${PROJECT_NAME} SingleApplication::SingleApplication) diff --git a/SingleApplication/examples/sending_arguments/main.cpp b/SingleApplication/examples/sending_arguments/main.cpp old mode 100644 new mode 100755 index d90b250ba..a9d34dd97 --- a/SingleApplication/examples/sending_arguments/main.cpp +++ b/SingleApplication/examples/sending_arguments/main.cpp @@ -11,6 +11,9 @@ int main(int argc, char *argv[]) // If this is a secondary instance if( app.isSecondary() ) { app.sendMessage( app.arguments().join(' ').toUtf8() ); + qDebug() << "App already running."; + qDebug() << "Primary instance PID: " << app.primaryPid(); + qDebug() << "Primary instance user: " << app.primaryUser(); return 0; } else { QObject::connect( diff --git a/SingleApplication/examples/sending_arguments/sending_arguments.pro b/SingleApplication/examples/sending_arguments/sending_arguments.pro old mode 100644 new mode 100755 diff --git a/SingleApplication/singleapplication.cpp b/SingleApplication/singleapplication.cpp index 461592ebe..7e153a004 100644 --- a/SingleApplication/singleapplication.cpp +++ b/SingleApplication/singleapplication.cpp @@ -1,6 +1,6 @@ // The MIT License (MIT) // -// Copyright (c) Itay Grudev 2015 - 2018 +// Copyright (c) Itay Grudev 2015 - 2020 // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal @@ -20,176 +20,255 @@ // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. -#include -#include -#include +#include #include #include -#if QT_VERSION < QT_VERSION_CHECK(5, 10, 0) // ### Qt 6: remove -#else -#if TODO_LIST -#pragma message("@TODO remove code for QT 5.10 or later") -#endif -#include -#endif + #include "singleapplication.h" #include "singleapplication_p.h" /** - @brief Constructor. Checks and fires up LocalServer or closes the program - if another instance already exists - @param argc - @param argv - @param {bool} allowSecondaryInstances -*/ -SingleApplication::SingleApplication( int &argc, char *argv[], bool allowSecondary, Options options, int timeout ) - : app_t( argc, argv ), d_ptr( new SingleApplicationPrivate( this ) ) + * @brief Constructor. Checks and fires up LocalServer or closes the program + * if another instance already exists + * @param argc + * @param argv + * @param allowSecondary Whether to enable secondary instance support + * @param options Optional flags to toggle specific behaviour + * @param timeout Maximum time blocking functions are allowed during app load + */ +SingleApplication::SingleApplication( int &argc, char *argv[], bool allowSecondary, Options options, int timeout, const QString &userData ) + : app_t( argc, argv ), d_ptr( new SingleApplicationPrivate( this ) ) { - Q_D(SingleApplication); + Q_D( SingleApplication ); #if defined(Q_OS_ANDROID) || defined(Q_OS_IOS) - // On Android and iOS since the library is not supported fallback to - // standard QApplication behaviour by simply returning at this point. - qWarning() << "SingleApplication is not supported on Android and iOS systems."; - return; + // On Android and iOS since the library is not supported fallback to + // standard QApplication behaviour by simply returning at this point. + qWarning() << "SingleApplication is not supported on Android and iOS systems."; + return; #endif - // Store the current mode of the program - d->options = options; + // Store the current mode of the program + d->options = options; - // Generating an application ID used for identifying the shared memory - // block and QLocalServer - d->genBlockServerName(); + // Add any unique user data + if ( ! userData.isEmpty() ) + d->addAppData( userData ); + + // Generating an application ID used for identifying the shared memory + // block and QLocalServer + d->genBlockServerName(); + + // To mitigate QSharedMemory issues with large amount of processes + // attempting to attach at the same time + SingleApplicationPrivate::randomSleep(); #ifdef Q_OS_UNIX - // By explicitly attaching it and then deleting it we make sure that the - // memory is deleted even after the process has crashed on Unix. - d->memory = new QSharedMemory( d->blockServerName ); - d->memory->attach(); - delete d->memory; + // By explicitly attaching it and then deleting it we make sure that the + // memory is deleted even after the process has crashed on Unix. + d->memory = new QSharedMemory( d->blockServerName ); + d->memory->attach(); + delete d->memory; #endif - // Guarantee thread safe behaviour with a shared memory block. - d->memory = new QSharedMemory( d->blockServerName ); + // Guarantee thread safe behaviour with a shared memory block. + d->memory = new QSharedMemory( d->blockServerName ); - // Create a shared memory block - if( d->memory->create( sizeof( InstancesInfo ) ) ) { - // Initialize the shared memory block - d->memory->lock(); - d->initializeMemoryBlock(); - d->memory->unlock(); - } else { - // Attempt to attach to the memory segment - if( ! d->memory->attach() ) { - qCritical() << "SingleApplication: Unable to attach to shared memory block."; - qCritical() << d->memory->errorString(); - delete d; - ::exit( EXIT_FAILURE ); - } - } + // Create a shared memory block + if( d->memory->create( sizeof( InstancesInfo ) )){ + // Initialize the shared memory block + if( ! d->memory->lock() ){ + qCritical() << "SingleApplication: Unable to lock memory block after create."; + abortSafely(); + } + d->initializeMemoryBlock(); + } else { + if( d->memory->error() == QSharedMemory::AlreadyExists ){ + // Attempt to attach to the memory segment + if( ! d->memory->attach() ){ + qCritical() << "SingleApplication: Unable to attach to shared memory block."; + abortSafely(); + } + if( ! d->memory->lock() ){ + qCritical() << "SingleApplication: Unable to lock memory block after attach."; + abortSafely(); + } + } else { + qCritical() << "SingleApplication: Unable to create block."; + abortSafely(); + } + } - InstancesInfo* inst = static_cast( d->memory->data() ); - QElapsedTimer time; - time.start(); + auto *inst = static_cast( d->memory->data() ); + QElapsedTimer time; + time.start(); - // Make sure the shared memory block is initialised and in consistent state - while( true ) { - d->memory->lock(); + // Make sure the shared memory block is initialised and in consistent state + while( true ){ + // If the shared memory block's checksum is valid continue + if( d->blockChecksum() == inst->checksum ) break; - if( d->blockChecksum() == inst->checksum ) break; + // If more than 5s have elapsed, assume the primary instance crashed and + // assume it's position + if( time.elapsed() > 5000 ){ + qWarning() << "SingleApplication: Shared memory block has been in an inconsistent state from more than 5s. Assuming primary instance failure."; + d->initializeMemoryBlock(); + } - if( time.elapsed() > 5000 ) { - qWarning() << "SingleApplication: Shared memory block has been in an inconsistent state from more than 5s. Assuming primary instance failure."; - d->initializeMemoryBlock(); - } + // Otherwise wait for a random period and try again. The random sleep here + // limits the probability of a collision between two racing apps and + // allows the app to initialise faster + if( ! d->memory->unlock() ){ + qDebug() << "SingleApplication: Unable to unlock memory for random wait."; + qDebug() << d->memory->errorString(); + } + SingleApplicationPrivate::randomSleep(); + if( ! d->memory->lock() ){ + qCritical() << "SingleApplication: Unable to lock memory after random wait."; + abortSafely(); + } + } - d->memory->unlock(); + if( inst->primary == false ){ + d->startPrimary(); + if( ! d->memory->unlock() ){ + qDebug() << "SingleApplication: Unable to unlock memory after primary start."; + qDebug() << d->memory->errorString(); + } + return; + } - // Random sleep here limits the probability of a collision between two racing apps -#if QT_VERSION < QT_VERSION_CHECK(5, 10, 0) // ### Qt 6: remove - qsrand( QDateTime::currentMSecsSinceEpoch() % std::numeric_limits::max() ); - QThread::sleep( 8 + static_cast ( static_cast ( qrand() ) / RAND_MAX * 10 ) ); -#else -#if TODO_LIST -#pragma message("@TODO remove code for QT 5.10 or later") -#endif - quint32 value = QRandomGenerator::global()->generate(); - QThread::sleep(8 + static_cast(value / RAND_MAX * 10)); -#endif - } + // Check if another instance can be started + if( allowSecondary ){ + d->startSecondary(); + if( d->options & Mode::SecondaryNotification ){ + d->connectToPrimary( timeout, SingleApplicationPrivate::SecondaryInstance ); + } + if( ! d->memory->unlock() ){ + qDebug() << "SingleApplication: Unable to unlock memory after secondary start."; + qDebug() << d->memory->errorString(); + } + return; + } - if( inst->primary == false) { - d->startPrimary(); - d->memory->unlock(); - return; - } + if( ! d->memory->unlock() ){ + qDebug() << "SingleApplication: Unable to unlock memory at end of execution."; + qDebug() << d->memory->errorString(); + } - // Check if another instance can be started - if( allowSecondary ) { - inst->secondary += 1; - inst->checksum = d->blockChecksum(); - d->instanceNumber = inst->secondary; - d->startSecondary(); - if( d->options & Mode::SecondaryNotification ) { - d->connectToPrimary( timeout, SingleApplicationPrivate::SecondaryInstance ); - } - d->memory->unlock(); - return; - } + d->connectToPrimary( timeout, SingleApplicationPrivate::NewInstance ); - d->memory->unlock(); + delete d; - d->connectToPrimary( timeout, SingleApplicationPrivate::NewInstance ); + ::exit( EXIT_SUCCESS ); +} - delete d; - - ::exit( EXIT_SUCCESS ); +SingleApplication::~SingleApplication() +{ + Q_D( SingleApplication ); + delete d; } /** - @brief Destructor -*/ -SingleApplication::~SingleApplication() + * Checks if the current application instance is primary. + * @return Returns true if the instance is primary, false otherwise. + */ +bool SingleApplication::isPrimary() const { - Q_D(SingleApplication); - delete d; + Q_D( const SingleApplication ); + return d->server != nullptr; } -bool SingleApplication::isPrimary() +/** + * Checks if the current application instance is secondary. + * @return Returns true if the instance is secondary, false otherwise. + */ +bool SingleApplication::isSecondary() const { - Q_D(SingleApplication); - return d->server != nullptr; + Q_D( const SingleApplication ); + return d->server == nullptr; } -bool SingleApplication::isSecondary() +/** + * Allows you to identify an instance by returning unique consecutive instance + * ids. It is reset when the first (primary) instance of your app starts and + * only incremented afterwards. + * @return Returns a unique instance id. + */ +quint32 SingleApplication::instanceId() const { - Q_D(SingleApplication); - return d->server == nullptr; + Q_D( const SingleApplication ); + return d->instanceNumber; } -quint32 SingleApplication::instanceId() +/** + * Returns the OS PID (Process Identifier) of the process running the primary + * instance. Especially useful when SingleApplication is coupled with OS. + * specific APIs. + * @return Returns the primary instance PID. + */ +qint64 SingleApplication::primaryPid() const { - Q_D(SingleApplication); - return d->instanceNumber; + Q_D( const SingleApplication ); + return d->primaryPid(); } -qint64 SingleApplication::primaryPid() +/** + * Returns the username the primary instance is running as. + * @return Returns the username the primary instance is running as. + */ +QString SingleApplication::primaryUser() const { - Q_D(SingleApplication); - return d->primaryPid(); + Q_D( const SingleApplication ); + return d->primaryUser(); } -bool SingleApplication::sendMessage( QByteArray message, int timeout ) +/** + * Returns the username the current instance is running as. + * @return Returns the username the current instance is running as. + */ +QString SingleApplication::currentUser() const { - Q_D(SingleApplication); - - // Nobody to connect to - if( isPrimary() ) return false; - - // Make sure the socket is connected - d->connectToPrimary( timeout, SingleApplicationPrivate::Reconnect ); - - d->socket->write( message ); - bool dataWritten = d->socket->waitForBytesWritten( timeout ); - d->socket->flush(); - return dataWritten; + return SingleApplicationPrivate::getUsername(); +} + +/** + * Sends message to the Primary Instance. + * @param message The message to send. + * @param timeout the maximum timeout in milliseconds for blocking functions. + * @return true if the message was sent successfuly, false otherwise. + */ +bool SingleApplication::sendMessage( const QByteArray &message, int timeout ) +{ + Q_D( SingleApplication ); + + // Nobody to connect to + if( isPrimary() ) return false; + + // Make sure the socket is connected + if( ! d->connectToPrimary( timeout, SingleApplicationPrivate::Reconnect ) ) + return false; + + d->socket->write( message ); + bool dataWritten = d->socket->waitForBytesWritten( timeout ); + d->socket->flush(); + return dataWritten; +} + +/** + * Cleans up the shared memory block and exits with a failure. + * This function halts program execution. + */ +void SingleApplication::abortSafely() +{ + Q_D( SingleApplication ); + + qCritical() << "SingleApplication: " << d->memory->error() << d->memory->errorString(); + delete d; + ::exit( EXIT_FAILURE ); +} + +QStringList SingleApplication::userData() const +{ + Q_D( const SingleApplication ); + return d->appData(); } diff --git a/SingleApplication/singleapplication.h b/SingleApplication/singleapplication.h index 5a9ab8318..91cabf93e 100644 --- a/SingleApplication/singleapplication.h +++ b/SingleApplication/singleapplication.h @@ -25,7 +25,6 @@ #include #include -#include #ifndef QAPPLICATION_CLASS #define QAPPLICATION_CLASS QCoreApplication @@ -36,99 +35,118 @@ class SingleApplicationPrivate; /** - @brief The SingleApplication class handles multiple instances of the same - Application - @see QCoreApplication -*/ + * @brief The SingleApplication class handles multiple instances of the same + * Application + * @see QCoreApplication + */ class SingleApplication : public QAPPLICATION_CLASS { - Q_OBJECT - - typedef QAPPLICATION_CLASS app_t; - - public: - /** - @brief Mode of operation of SingleApplication. - Whether the block should be user-wide or system-wide and whether the - primary instance should be notified when a secondary instance had been - started. - @note Operating system can restrict the shared memory blocks to the same - user, in which case the User/System modes will have no effect and the - block will be user wide. - @enum - */ - enum Mode { - User = 1 << 0, - System = 1 << 1, - SecondaryNotification = 1 << 2, - ExcludeAppVersion = 1 << 3, - ExcludeAppPath = 1 << 4 - }; - Q_DECLARE_FLAGS(Options, Mode) - - /** - @brief Intitializes a SingleApplication instance with argc command line - arguments in argv - @arg {int &} argc - Number of arguments in argv - @arg {const char *[]} argv - Supplied command line arguments - @arg {bool} allowSecondary - Whether to start the instance as secondary - if there is already a primary instance. - @arg {Mode} mode - Whether for the SingleApplication block to be applied - User wide or System wide. - @arg {int} timeout - Timeout to wait in milliseconds. - @note argc and argv may be changed as Qt removes arguments that it - recognizes - @note Mode::SecondaryNotification only works if set on both the primary - instance and the secondary instance. - @note The timeout is just a hint for the maximum time of blocking - operations. It does not guarantee that the SingleApplication - initialisation will be completed in given time, though is a good hint. - Usually 4*timeout would be the worst case (fail) scenario. - @see See the corresponding QAPPLICATION_CLASS constructor for reference - */ - explicit SingleApplication( int &argc, char *argv[], bool allowSecondary = false, Options options = Mode::User, int timeout = 1000 ); - ~SingleApplication(); - - /** - @brief Returns if the instance is the primary instance - @returns {bool} - */ - bool isPrimary(); - - /** - @brief Returns if the instance is a secondary instance - @returns {bool} - */ - bool isSecondary(); - - /** - @brief Returns a unique identifier for the current instance - @returns {qint32} - */ - quint32 instanceId(); - - /** - @brief Returns the process ID (PID) of the primary instance - @returns {qint64} - */ - qint64 primaryPid(); - - /** - @brief Sends a message to the primary instance. Returns true on success. - @param {int} timeout - Timeout for connecting - @returns {bool} - @note sendMessage() will return false if invoked from the primary - instance. - */ - bool sendMessage( QByteArray message, int timeout = 100 ); - - Q_SIGNALS: - void instanceStarted(); - void receivedMessage( quint32 instanceId, QByteArray message ); - - private: - SingleApplicationPrivate *d_ptr; - Q_DECLARE_PRIVATE(SingleApplication) + Q_OBJECT + + using app_t = QAPPLICATION_CLASS; + +public: + /** + * @brief Mode of operation of SingleApplication. + * Whether the block should be user-wide or system-wide and whether the + * primary instance should be notified when a secondary instance had been + * started. + * @note Operating system can restrict the shared memory blocks to the same + * user, in which case the User/System modes will have no effect and the + * block will be user wide. + * @enum + */ + enum Mode { + User = 1 << 0, + System = 1 << 1, + SecondaryNotification = 1 << 2, + ExcludeAppVersion = 1 << 3, + ExcludeAppPath = 1 << 4 + }; + Q_DECLARE_FLAGS(Options, Mode) + + /** + * @brief Intitializes a SingleApplication instance with argc command line + * arguments in argv + * @arg {int &} argc - Number of arguments in argv + * @arg {const char *[]} argv - Supplied command line arguments + * @arg {bool} allowSecondary - Whether to start the instance as secondary + * if there is already a primary instance. + * @arg {Mode} mode - Whether for the SingleApplication block to be applied + * User wide or System wide. + * @arg {int} timeout - Timeout to wait in milliseconds. + * @note argc and argv may be changed as Qt removes arguments that it + * recognizes + * @note Mode::SecondaryNotification only works if set on both the primary + * instance and the secondary instance. + * @note The timeout is just a hint for the maximum time of blocking + * operations. It does not guarantee that the SingleApplication + * initialisation will be completed in given time, though is a good hint. + * Usually 4*timeout would be the worst case (fail) scenario. + * @see See the corresponding QAPPLICATION_CLASS constructor for reference + */ + explicit SingleApplication( int &argc, char *argv[], bool allowSecondary = false, Options options = Mode::User, int timeout = 1000, const QString &userData = {} ); + ~SingleApplication() override; + + /** + * @brief Returns if the instance is the primary instance + * @returns {bool} + */ + bool isPrimary() const; + + /** + * @brief Returns if the instance is a secondary instance + * @returns {bool} + */ + bool isSecondary() const; + + /** + * @brief Returns a unique identifier for the current instance + * @returns {qint32} + */ + quint32 instanceId() const; + + /** + * @brief Returns the process ID (PID) of the primary instance + * @returns {qint64} + */ + qint64 primaryPid() const; + + /** + * @brief Returns the username of the user running the primary instance + * @returns {QString} + */ + QString primaryUser() const; + + /** + * @brief Returns the username of the current user + * @returns {QString} + */ + QString currentUser() const; + + /** + * @brief Sends a message to the primary instance. Returns true on success. + * @param {int} timeout - Timeout for connecting + * @returns {bool} + * @note sendMessage() will return false if invoked from the primary + * instance. + */ + bool sendMessage( const QByteArray &message, int timeout = 100 ); + + /** + * @brief Get the set user data. + * @returns {QStringList} + */ + QStringList userData() const; + +Q_SIGNALS: + void instanceStarted(); + void receivedMessage( quint32 instanceId, QByteArray message ); + +private: + SingleApplicationPrivate *d_ptr; + Q_DECLARE_PRIVATE(SingleApplication) + void abortSafely(); }; Q_DECLARE_OPERATORS_FOR_FLAGS(SingleApplication::Options) diff --git a/SingleApplication/singleapplication.pri b/SingleApplication/singleapplication.pri index c37471304..ae81f5997 100644 --- a/SingleApplication/singleapplication.pri +++ b/SingleApplication/singleapplication.pri @@ -1,7 +1,8 @@ QT += core network -CONFIG += c++17 +CONFIG += c++11 -HEADERS += $$PWD/singleapplication.h \ +HEADERS += $$PWD/SingleApplication \ + $$PWD/singleapplication.h \ $$PWD/singleapplication_p.h SOURCES += $$PWD/singleapplication.cpp \ $$PWD/singleapplication_p.cpp diff --git a/SingleApplication/singleapplication_p.cpp b/SingleApplication/singleapplication_p.cpp index b3553b0ee..e65bd9554 100644 --- a/SingleApplication/singleapplication_p.cpp +++ b/SingleApplication/singleapplication_p.cpp @@ -1,6 +1,6 @@ // The MIT License (MIT) // -// Copyright (c) Itay Grudev 2015 - 2018 +// Copyright (c) Itay Grudev 2015 - 2020 // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal @@ -33,412 +33,454 @@ #include #include +#include #include #include +#include #include #include #include +#if QT_VERSION >= QT_VERSION_CHECK(5, 10, 0) +#include +#else +#include +#endif + #include "singleapplication.h" #include "singleapplication_p.h" #ifdef Q_OS_UNIX - #include - #include - #include + #include + #include + #include #endif #ifdef Q_OS_WIN -#include -#include + #ifndef NOMINMAX + #define NOMINMAX 1 + #endif + #include + #include #endif SingleApplicationPrivate::SingleApplicationPrivate( SingleApplication *q_ptr ) - : q_ptr( q_ptr ) + : q_ptr( q_ptr ) { - server = nullptr; - socket = nullptr; - memory = nullptr; - instanceNumber = -1; + server = nullptr; + socket = nullptr; + memory = nullptr; + instanceNumber = 0; } SingleApplicationPrivate::~SingleApplicationPrivate() { - if( socket != nullptr ) { - socket->close(); - delete socket; - } + if( socket != nullptr ){ + socket->close(); + delete socket; + } - memory->lock(); - InstancesInfo* inst = static_cast(memory->data()); - if( server != nullptr ) { - server->close(); - delete server; - inst->primary = false; - inst->primaryPid = -1; - inst->checksum = blockChecksum(); - } - memory->unlock(); + if( memory != nullptr ){ + memory->lock(); + auto *inst = static_cast(memory->data()); + if( server != nullptr ){ + server->close(); + delete server; + inst->primary = false; + inst->primaryPid = -1; + inst->primaryUser[0] = '\0'; + inst->checksum = blockChecksum(); + } + memory->unlock(); - delete memory; + delete memory; + } +} + +QString SingleApplicationPrivate::getUsername() +{ +#ifdef Q_OS_WIN + wchar_t username[UNLEN + 1]; + // Specifies size of the buffer on input + DWORD usernameLength = UNLEN + 1; + if( GetUserNameW( username, &usernameLength ) ) + return QString::fromWCharArray( username ); +#if QT_VERSION < QT_VERSION_CHECK(5, 10, 0) + return QString::fromLocal8Bit( qgetenv( "USERNAME" ) ); +#else + return qEnvironmentVariable( "USERNAME" ); +#endif +#endif +#ifdef Q_OS_UNIX + QString username; + uid_t uid = geteuid(); + struct passwd *pw = getpwuid( uid ); + if( pw ) + username = QString::fromLocal8Bit( pw->pw_name ); + if ( username.isEmpty() ){ +#if QT_VERSION < QT_VERSION_CHECK(5, 10, 0) + username = QString::fromLocal8Bit( qgetenv( "USER" ) ); +#else + username = qEnvironmentVariable( "USER" ); +#endif + } + return username; +#endif } void SingleApplicationPrivate::genBlockServerName() { - QCryptographicHash appData( QCryptographicHash::Sha256 ); - appData.addData( "SingleApplication", 17 ); - appData.addData( SingleApplication::app_t::applicationName().toUtf8() ); - appData.addData( SingleApplication::app_t::organizationName().toUtf8() ); - appData.addData( SingleApplication::app_t::organizationDomain().toUtf8() ); + QCryptographicHash appData( QCryptographicHash::Sha256 ); + appData.addData( "SingleApplication", 17 ); + appData.addData( SingleApplication::app_t::applicationName().toUtf8() ); + appData.addData( SingleApplication::app_t::organizationName().toUtf8() ); + appData.addData( SingleApplication::app_t::organizationDomain().toUtf8() ); - if( ! (options & SingleApplication::Mode::ExcludeAppVersion) ) { - appData.addData( SingleApplication::app_t::applicationVersion().toUtf8() ); - } + if ( ! appDataList.isEmpty() ) + appData.addData( appDataList.join( "" ).toUtf8() ); - if( ! (options & SingleApplication::Mode::ExcludeAppPath) ) { + if( ! (options & SingleApplication::Mode::ExcludeAppVersion) ){ + appData.addData( SingleApplication::app_t::applicationVersion().toUtf8() ); + } + + if( ! (options & SingleApplication::Mode::ExcludeAppPath) ){ #ifdef Q_OS_WIN - appData.addData( SingleApplication::app_t::applicationFilePath().toLower().toUtf8() ); + appData.addData( SingleApplication::app_t::applicationFilePath().toLower().toUtf8() ); #else - appData.addData( SingleApplication::app_t::applicationFilePath().toUtf8() ); + appData.addData( SingleApplication::app_t::applicationFilePath().toUtf8() ); #endif - } + } - // User level block requires a user specific data in the hash - if( options & SingleApplication::Mode::User ) { -#ifdef Q_OS_WIN - wchar_t username [ UNLEN + 1 ]; - // Specifies size of the buffer on input - DWORD usernameLength = UNLEN + 1; - if( GetUserNameW( username, &usernameLength ) ) { - appData.addData( QString::fromWCharArray(username).toUtf8() ); - } else { - appData.addData( qgetenv("USERNAME") ); - } -#endif -#ifdef Q_OS_UNIX - QByteArray username; - uid_t uid = geteuid(); - struct passwd *pw = getpwuid(uid); - if( pw ) { - username = pw->pw_name; - } - if( username.isEmpty() ) { - username = qgetenv("USER"); - } - appData.addData(username); -#endif - } + // User level block requires a user specific data in the hash + if( options & SingleApplication::Mode::User ){ + appData.addData( getUsername().toUtf8() ); + } - // Replace the backslash in RFC 2045 Base64 [a-zA-Z0-9+/=] to comply with - // server naming requirements. - blockServerName = appData.result().toBase64().replace("/", "_"); + // Replace the backslash in RFC 2045 Base64 [a-zA-Z0-9+/=] to comply with + // server naming requirements. + blockServerName = appData.result().toBase64().replace("/", "_"); } -void SingleApplicationPrivate::initializeMemoryBlock() +void SingleApplicationPrivate::initializeMemoryBlock() const { - InstancesInfo* inst = static_cast( memory->data() ); - inst->primary = false; - inst->secondary = 0; - inst->primaryPid = -1; - inst->checksum = blockChecksum(); + auto *inst = static_cast( memory->data() ); + inst->primary = false; + inst->secondary = 0; + inst->primaryPid = -1; + inst->primaryUser[0] = '\0'; + inst->checksum = blockChecksum(); } void SingleApplicationPrivate::startPrimary() { - Q_Q(SingleApplication); + // Reset the number of connections + auto *inst = static_cast ( memory->data() ); - // Successful creation means that no main process exists - // So we start a QLocalServer to listen for connections - QLocalServer::removeServer( blockServerName ); - server = new QLocalServer(); + inst->primary = true; + inst->primaryPid = QCoreApplication::applicationPid(); + qstrncpy( inst->primaryUser, getUsername().toUtf8().data(), sizeof(inst->primaryUser) ); + inst->checksum = blockChecksum(); + instanceNumber = 0; + // Successful creation means that no main process exists + // So we start a QLocalServer to listen for connections + QLocalServer::removeServer( blockServerName ); + server = new QLocalServer(); - // Restrict access to the socket according to the - // SingleApplication::Mode::User flag on User level or no restrictions - if( options & SingleApplication::Mode::User ) { - server->setSocketOptions( QLocalServer::UserAccessOption ); - } else { - server->setSocketOptions( QLocalServer::WorldAccessOption ); - } + // Restrict access to the socket according to the + // SingleApplication::Mode::User flag on User level or no restrictions + if( options & SingleApplication::Mode::User ){ + server->setSocketOptions( QLocalServer::UserAccessOption ); + } else { + server->setSocketOptions( QLocalServer::WorldAccessOption ); + } - server->listen( blockServerName ); - QObject::connect( - server, - &QLocalServer::newConnection, - this, - &SingleApplicationPrivate::slotConnectionEstablished - ); - - // Reset the number of connections - InstancesInfo* inst = static_cast ( memory->data() ); - - inst->primary = true; - inst->primaryPid = q->applicationPid(); - inst->checksum = blockChecksum(); - - instanceNumber = 0; + server->listen( blockServerName ); + QObject::connect( + server, + &QLocalServer::newConnection, + this, + &SingleApplicationPrivate::slotConnectionEstablished + ); } void SingleApplicationPrivate::startSecondary() { + auto *inst = static_cast ( memory->data() ); + + inst->secondary += 1; + inst->checksum = blockChecksum(); + instanceNumber = inst->secondary; } -void SingleApplicationPrivate::connectToPrimary( int msecs, ConnectionType connectionType ) +bool SingleApplicationPrivate::connectToPrimary( int msecs, ConnectionType connectionType ) { - // Connect to the Local Server of the Primary Instance if not already - // connected. - if( socket == nullptr ) { - socket = new QLocalSocket(); - } + QElapsedTimer time; + time.start(); - // If already connected - we are done; - if( socket->state() == QLocalSocket::ConnectedState ) - return; + // Connect to the Local Server of the Primary Instance if not already + // connected. + if( socket == nullptr ){ + socket = new QLocalSocket(); + } - // If not connect - if( socket->state() == QLocalSocket::UnconnectedState || - socket->state() == QLocalSocket::ClosingState ) { - socket->connectToServer( blockServerName ); - } + if( socket->state() == QLocalSocket::ConnectedState ) return true; - // Wait for being connected - if( socket->state() == QLocalSocket::ConnectingState ) { - socket->waitForConnected( msecs ); - } + if( socket->state() != QLocalSocket::ConnectedState ){ - // Initialisation message according to the SingleApplication protocol - if( socket->state() == QLocalSocket::ConnectedState ) { - // Notify the parent that a new instance had been started; - QByteArray initMsg; - QDataStream writeStream(&initMsg, QIODevice::WriteOnly); + while( true ){ + randomSleep(); + + if( socket->state() != QLocalSocket::ConnectingState ) + socket->connectToServer( blockServerName ); + + if( socket->state() == QLocalSocket::ConnectingState ){ + socket->waitForConnected( static_cast(msecs - time.elapsed()) ); + } + + // If connected break out of the loop + if( socket->state() == QLocalSocket::ConnectedState ) break; + + // If elapsed time since start is longer than the method timeout return + if( time.elapsed() >= msecs ) return false; + } + } + + // Initialisation message according to the SingleApplication protocol + QByteArray initMsg; + QDataStream writeStream(&initMsg, QIODevice::WriteOnly); #if (QT_VERSION >= QT_VERSION_CHECK(5, 6, 0)) - writeStream.setVersion(QDataStream::Qt_5_6); + writeStream.setVersion(QDataStream::Qt_5_6); #endif - writeStream << blockServerName.toLatin1(); - writeStream << static_cast(connectionType); - writeStream << instanceNumber; - -#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) // ### Qt 6: remove - quint16 checksum = - qChecksum( - initMsg.constData(), - static_cast(initMsg.length())); + writeStream << blockServerName.toLatin1(); + writeStream << static_cast(connectionType); + writeStream << instanceNumber; +#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) + quint16 checksum = qChecksum(QByteArray(initMsg, static_cast(initMsg.length()))); #else -#if TODO_LIST -#pragma message("@TODO remove code for QT 6 or later") + quint16 checksum = qChecksum(initMsg.constData(), static_cast(initMsg.length())); #endif - quint16 checksum = - qChecksum( - QByteArrayView( - initMsg.constData(), - static_cast(initMsg.length()))); -#endif - writeStream << checksum; + writeStream << checksum; - // The header indicates the message length that follows - QByteArray header; - QDataStream headerStream(&header, QIODevice::WriteOnly); + // The header indicates the message length that follows + QByteArray header; + QDataStream headerStream(&header, QIODevice::WriteOnly); #if (QT_VERSION >= QT_VERSION_CHECK(5, 6, 0)) - headerStream.setVersion(QDataStream::Qt_5_6); + headerStream.setVersion(QDataStream::Qt_5_6); #endif - headerStream << static_cast ( initMsg.length() ); + headerStream << static_cast ( initMsg.length() ); - socket->write( header ); - socket->write( initMsg ); - socket->flush(); - socket->waitForBytesWritten( msecs ); - } + socket->write( header ); + socket->write( initMsg ); + bool result = socket->waitForBytesWritten( static_cast(msecs - time.elapsed()) ); + socket->flush(); + return result; } -quint16 SingleApplicationPrivate::blockChecksum() +quint16 SingleApplicationPrivate::blockChecksum() const { -#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) // ### Qt 6: remove - return qChecksum( - static_cast ( memory->data() ), - offsetof( InstancesInfo, checksum ) - ); +#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) + quint16 checksum = qChecksum(QByteArray(static_cast(memory->constData()), offsetof(InstancesInfo, checksum))); #else -#if TODO_LIST -#pragma message("@TODO remove code for QT 6 or later") -#endif - return qChecksum( - QByteArrayView( - static_cast ( memory->data() ), - offsetof( InstancesInfo, checksum ))); - + quint16 checksum = qChecksum(static_cast(memory->constData()), offsetof(InstancesInfo, checksum)); #endif + return checksum; } -qint64 SingleApplicationPrivate::primaryPid() +qint64 SingleApplicationPrivate::primaryPid() const { - qint64 pid; + qint64 pid; - memory->lock(); - InstancesInfo* inst = static_cast( memory->data() ); - pid = inst->primaryPid; - memory->unlock(); + memory->lock(); + auto *inst = static_cast( memory->data() ); + pid = inst->primaryPid; + memory->unlock(); - return pid; + return pid; +} + +QString SingleApplicationPrivate::primaryUser() const +{ + QByteArray username; + + memory->lock(); + auto *inst = static_cast( memory->data() ); + username = inst->primaryUser; + memory->unlock(); + + return QString::fromUtf8( username ); } /** - @brief Executed when a connection has been made to the LocalServer -*/ + * @brief Executed when a connection has been made to the LocalServer + */ void SingleApplicationPrivate::slotConnectionEstablished() { - QLocalSocket *nextConnSocket = server->nextPendingConnection(); - connectionMap.insert(nextConnSocket, ConnectionInfo()); + QLocalSocket *nextConnSocket = server->nextPendingConnection(); + connectionMap.insert(nextConnSocket, ConnectionInfo()); - QObject::connect(nextConnSocket, &QLocalSocket::aboutToClose, - [nextConnSocket, this]() { - auto &info = connectionMap[nextConnSocket]; - Q_EMIT this->slotClientConnectionClosed( nextConnSocket, info.instanceId ); - } - ); + QObject::connect(nextConnSocket, &QLocalSocket::aboutToClose, + [nextConnSocket, this](){ + auto &info = connectionMap[nextConnSocket]; + Q_EMIT this->slotClientConnectionClosed( nextConnSocket, info.instanceId ); + } + ); - QObject::connect(nextConnSocket, &QLocalSocket::disconnected, - [nextConnSocket, this](){ - connectionMap.remove(nextConnSocket); - nextConnSocket->deleteLater(); - } - ); + QObject::connect(nextConnSocket, &QLocalSocket::disconnected, nextConnSocket, &QLocalSocket::deleteLater); - QObject::connect(nextConnSocket, &QLocalSocket::readyRead, - [nextConnSocket, this]() { - auto &info = connectionMap[nextConnSocket]; - switch(info.stage) { - case StageHeader: - readInitMessageHeader(nextConnSocket); - break; - case StageBody: - readInitMessageBody(nextConnSocket); - break; - case StageConnected: - Q_EMIT this->slotDataAvailable( nextConnSocket, info.instanceId ); - break; - default: - break; - }; - } - ); + QObject::connect(nextConnSocket, &QLocalSocket::destroyed, + [nextConnSocket, this](){ + connectionMap.remove(nextConnSocket); + } + ); + + QObject::connect(nextConnSocket, &QLocalSocket::readyRead, + [nextConnSocket, this](){ + auto &info = connectionMap[nextConnSocket]; + switch(info.stage){ + case StageHeader: + readInitMessageHeader(nextConnSocket); + break; + case StageBody: + readInitMessageBody(nextConnSocket); + break; + case StageConnected: + Q_EMIT this->slotDataAvailable( nextConnSocket, info.instanceId ); + break; + default: + break; + }; + } + ); } void SingleApplicationPrivate::readInitMessageHeader( QLocalSocket *sock ) { - if (!connectionMap.contains( sock )) { - return; - } + if (!connectionMap.contains( sock )){ + return; + } - if( sock->bytesAvailable() < ( qint64 )sizeof( quint64 ) ) { - return; - } + if( sock->bytesAvailable() < ( qint64 )sizeof( quint64 ) ){ + return; + } - QDataStream headerStream( sock ); + QDataStream headerStream( sock ); #if (QT_VERSION >= QT_VERSION_CHECK(5, 6, 0)) - headerStream.setVersion( QDataStream::Qt_5_6 ); + headerStream.setVersion( QDataStream::Qt_5_6 ); #endif - // Read the header to know the message length - quint64 msgLen = 0; - headerStream >> msgLen; - ConnectionInfo &info = connectionMap[sock]; - info.stage = StageBody; - info.msgLen = msgLen; + // Read the header to know the message length + quint64 msgLen = 0; + headerStream >> msgLen; + ConnectionInfo &info = connectionMap[sock]; + info.stage = StageBody; + info.msgLen = msgLen; - if ( sock->bytesAvailable() >= (qint64) msgLen ) { - readInitMessageBody( sock ); - } + if ( sock->bytesAvailable() >= (qint64) msgLen ){ + readInitMessageBody( sock ); + } } void SingleApplicationPrivate::readInitMessageBody( QLocalSocket *sock ) { - Q_Q(SingleApplication); + Q_Q(SingleApplication); - if (!connectionMap.contains( sock )) { - return; - } + if (!connectionMap.contains( sock )){ + return; + } - ConnectionInfo &info = connectionMap[sock]; - if( sock->bytesAvailable() < ( qint64 )info.msgLen ) { - return; - } + ConnectionInfo &info = connectionMap[sock]; + if( sock->bytesAvailable() < ( qint64 )info.msgLen ){ + return; + } - // Read the message body - QByteArray msgBytes = sock->read(info.msgLen); - QDataStream readStream(msgBytes); + // Read the message body + QByteArray msgBytes = sock->read(info.msgLen); + QDataStream readStream(msgBytes); #if (QT_VERSION >= QT_VERSION_CHECK(5, 6, 0)) - readStream.setVersion( QDataStream::Qt_5_6 ); + readStream.setVersion( QDataStream::Qt_5_6 ); #endif - // server name - QByteArray latin1Name; - readStream >> latin1Name; + // server name + QByteArray latin1Name; + readStream >> latin1Name; - // connection type - ConnectionType connectionType = InvalidConnection; - quint8 connTypeVal = InvalidConnection; - readStream >> connTypeVal; - connectionType = static_cast ( connTypeVal ); + // connection type + ConnectionType connectionType = InvalidConnection; + quint8 connTypeVal = InvalidConnection; + readStream >> connTypeVal; + connectionType = static_cast ( connTypeVal ); - // instance id - quint32 instanceId = 0; - readStream >> instanceId; + // instance id + quint32 instanceId = 0; + readStream >> instanceId; - // checksum - quint16 msgChecksum = 0; - readStream >> msgChecksum; + // checksum + quint16 msgChecksum = 0; + readStream >> msgChecksum; -#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) // ### Qt 6: remove - const quint16 actualChecksum = - qChecksum( - msgBytes.constData(), - static_cast( msgBytes.length() - sizeof( quint16 ) ) ); +#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) + const quint16 actualChecksum = qChecksum(QByteArray(msgBytes, static_cast(msgBytes.length() - sizeof(quint16)))); #else -#if TODO_LIST -#pragma message("@TODO remove code for QT 6 or later") + const quint16 actualChecksum = qChecksum(msgBytes.constData(), static_cast(msgBytes.length() - sizeof(quint16))); #endif - const quint16 actualChecksum = - qChecksum( - QByteArrayView( - msgBytes.constData(), - static_cast(msgBytes.length() - sizeof(quint16)))); -#endif - bool isValid = readStream.status() == QDataStream::Ok && - QLatin1String(latin1Name) == blockServerName && - msgChecksum == actualChecksum; - if( !isValid ) { - sock->close(); - return; - } + bool isValid = readStream.status() == QDataStream::Ok && + QLatin1String(latin1Name) == blockServerName && + msgChecksum == actualChecksum; - info.instanceId = instanceId; - info.stage = StageConnected; + if( !isValid ){ + sock->close(); + return; + } - if( connectionType == NewInstance || - ( connectionType == SecondaryInstance && - options & SingleApplication::Mode::SecondaryNotification ) ) - { - Q_EMIT q->instanceStarted(); - } + info.instanceId = instanceId; + info.stage = StageConnected; - if (sock->bytesAvailable() > 0) { - Q_EMIT this->slotDataAvailable( sock, instanceId ); - } + if( connectionType == NewInstance || + ( connectionType == SecondaryInstance && + options & SingleApplication::Mode::SecondaryNotification ) ) + { + Q_EMIT q->instanceStarted(); + } + + if (sock->bytesAvailable() > 0){ + Q_EMIT this->slotDataAvailable( sock, instanceId ); + } } void SingleApplicationPrivate::slotDataAvailable( QLocalSocket *dataSocket, quint32 instanceId ) { - Q_Q(SingleApplication); - Q_EMIT q->receivedMessage( instanceId, dataSocket->readAll() ); + Q_Q(SingleApplication); + Q_EMIT q->receivedMessage( instanceId, dataSocket->readAll() ); } void SingleApplicationPrivate::slotClientConnectionClosed( QLocalSocket *closedSocket, quint32 instanceId ) { - if( closedSocket->bytesAvailable() > 0 ) - Q_EMIT slotDataAvailable( closedSocket, instanceId ); + if( closedSocket->bytesAvailable() > 0 ) + Q_EMIT slotDataAvailable( closedSocket, instanceId ); +} + +void SingleApplicationPrivate::randomSleep() +{ +#if QT_VERSION >= QT_VERSION_CHECK( 5, 10, 0 ) + QThread::msleep( QRandomGenerator::global()->bounded( 8u, 18u )); +#else + qsrand( QDateTime::currentMSecsSinceEpoch() % std::numeric_limits::max() ); + QThread::msleep( 8 + static_cast ( static_cast ( qrand() ) / RAND_MAX * 10 )); +#endif +} + +void SingleApplicationPrivate::addAppData(const QString &data) +{ + appDataList.push_back(data); +} + +QStringList SingleApplicationPrivate::appData() const +{ + return appDataList; } diff --git a/SingleApplication/singleapplication_p.h b/SingleApplication/singleapplication_p.h index ccbd56620..c49a46ddc 100644 --- a/SingleApplication/singleapplication_p.h +++ b/SingleApplication/singleapplication_p.h @@ -1,6 +1,6 @@ // The MIT License (MIT) // -// Copyright (c) Itay Grudev 2015 - 2016 +// Copyright (c) Itay Grudev 2015 - 2020 // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal @@ -38,62 +38,67 @@ #include "singleapplication.h" struct InstancesInfo { - bool primary; - quint32 secondary; - qint64 primaryPid; - quint16 checksum; + bool primary; + quint32 secondary; + qint64 primaryPid; + char primaryUser[128]; + quint16 checksum; // Must be the last field }; struct ConnectionInfo { - explicit ConnectionInfo() : - msgLen(0), instanceId(0), stage(0) {} - qint64 msgLen; - quint32 instanceId; - quint8 stage; + qint64 msgLen = 0; + quint32 instanceId = 0; + quint8 stage = 0; }; class SingleApplicationPrivate : public QObject { - Q_OBJECT - public: - enum ConnectionType : quint8 { - InvalidConnection = 0, - NewInstance = 1, - SecondaryInstance = 2, - Reconnect = 3 - }; - enum ConnectionStage : quint8 { - StageHeader = 0, - StageBody = 1, - StageConnected = 2, - }; - Q_DECLARE_PUBLIC(SingleApplication) - - SingleApplicationPrivate( SingleApplication *q_ptr ); - ~SingleApplicationPrivate(); - - void genBlockServerName(); - void initializeMemoryBlock(); - void startPrimary(); - void startSecondary(); - void connectToPrimary(int msecs, ConnectionType connectionType ); - quint16 blockChecksum(); - qint64 primaryPid(); - void readInitMessageHeader(QLocalSocket *socket); - void readInitMessageBody(QLocalSocket *socket); - - SingleApplication *q_ptr; - QSharedMemory *memory; - QLocalSocket *socket; - QLocalServer *server; - quint32 instanceNumber; - QString blockServerName; - SingleApplication::Options options; - QMap connectionMap; - - public Q_SLOTS: - void slotConnectionEstablished(); - void slotDataAvailable( QLocalSocket*, quint32 ); - void slotClientConnectionClosed( QLocalSocket*, quint32 ); +Q_OBJECT +public: + enum ConnectionType : quint8 { + InvalidConnection = 0, + NewInstance = 1, + SecondaryInstance = 2, + Reconnect = 3 + }; + enum ConnectionStage : quint8 { + StageHeader = 0, + StageBody = 1, + StageConnected = 2, + }; + Q_DECLARE_PUBLIC(SingleApplication) + + SingleApplicationPrivate( SingleApplication *q_ptr ); + ~SingleApplicationPrivate() override; + + static QString getUsername(); + void genBlockServerName(); + void initializeMemoryBlock() const; + void startPrimary(); + void startSecondary(); + bool connectToPrimary( int msecs, ConnectionType connectionType ); + quint16 blockChecksum() const; + qint64 primaryPid() const; + QString primaryUser() const; + void readInitMessageHeader(QLocalSocket *socket); + void readInitMessageBody(QLocalSocket *socket); + static void randomSleep(); + void addAppData(const QString &data); + QStringList appData() const; + + SingleApplication *q_ptr; + QSharedMemory *memory; + QLocalSocket *socket; + QLocalServer *server; + quint32 instanceNumber; + QString blockServerName; + SingleApplication::Options options; + QMap connectionMap; + QStringList appDataList; + +public Q_SLOTS: + void slotConnectionEstablished(); + void slotDataAvailable( QLocalSocket*, quint32 ); + void slotClientConnectionClosed( QLocalSocket*, quint32 ); }; #endif // SINGLEAPPLICATION_P_H diff --git a/build-aux/flatpak/org.qelectrotech.QElectroTech.json b/build-aux/flatpak/org.qelectrotech.QElectroTech.json index 55b6040e1..9bbb253db 100644 --- a/build-aux/flatpak/org.qelectrotech.QElectroTech.json +++ b/build-aux/flatpak/org.qelectrotech.QElectroTech.json @@ -1,7 +1,7 @@ { "id": "org.qelectrotech.QElectroTech", "runtime": "org.kde.Platform", - "runtime-version": "5.14", + "runtime-version": "5.15", "sdk": "org.kde.Sdk", "command": "qelectrotech", "rename-desktop-file": "qelectrotech.desktop", diff --git a/cmake/fetch_pugixml.cmake b/cmake/fetch_pugixml.cmake index ff118cc72..b5f870bea 100644 --- a/cmake/fetch_pugixml.cmake +++ b/cmake/fetch_pugixml.cmake @@ -21,6 +21,6 @@ Include(FetchContent) FetchContent_Declare( pugixml GIT_REPOSITORY https://github.com/zeux/pugixml.git - GIT_TAG v1.11.1) + GIT_TAG v1.11.4) FetchContent_MakeAvailable(pugixml) diff --git a/cmake/fetch_singleapplication.cmake b/cmake/fetch_singleapplication.cmake index e2d7758e5..c01cc408c 100644 --- a/cmake/fetch_singleapplication.cmake +++ b/cmake/fetch_singleapplication.cmake @@ -26,6 +26,6 @@ Include(FetchContent) FetchContent_Declare( SingleApplication GIT_REPOSITORY https://github.com/itay-grudev/SingleApplication.git - GIT_TAG v3.1.5) + GIT_TAG v3.2.0) FetchContent_MakeAvailable(SingleApplication) diff --git a/cmake/qet_compilation_vars.cmake b/cmake/qet_compilation_vars.cmake index e7e155bad..5fe2d715e 100644 --- a/cmake/qet_compilation_vars.cmake +++ b/cmake/qet_compilation_vars.cmake @@ -52,6 +52,8 @@ set(QET_RES_FILES ${QET_DIR}/sources/editor/ui/lineeditor.ui ${QET_DIR}/sources/editor/ui/polygoneditor.ui ${QET_DIR}/sources/editor/ui/rectangleeditor.ui + ${QET_DIR}/sources/editor/ui/qetelementeditor.ui + ${QET_DIR}/sources/editor/ui/terminaleditor.ui ${QET_DIR}/sources/ElementsCollection/ui/renamedialog.ui ${QET_DIR}/sources/factory/ui/addtabledialog.ui ${QET_DIR}/sources/NameList/ui/namelistdialog.ui @@ -260,12 +262,8 @@ set(QET_SRC_FILES ${QET_DIR}/sources/editor/elementscene.h ${QET_DIR}/sources/editor/elementview.cpp ${QET_DIR}/sources/editor/elementview.h - ${QET_DIR}/sources/editor/qetelementeditor.cpp - ${QET_DIR}/sources/editor/qetelementeditor.h ${QET_DIR}/sources/editor/styleeditor.cpp ${QET_DIR}/sources/editor/styleeditor.h - ${QET_DIR}/sources/editor/terminaleditor.cpp - ${QET_DIR}/sources/editor/terminaleditor.h ${QET_DIR}/sources/editor/esevent/eseventaddarc.cpp ${QET_DIR}/sources/editor/esevent/eseventaddarc.h @@ -320,8 +318,12 @@ set(QET_SRC_FILES ${QET_DIR}/sources/editor/ui/polygoneditor.h ${QET_DIR}/sources/editor/ui/rectangleeditor.cpp ${QET_DIR}/sources/editor/ui/rectangleeditor.h + ${QET_DIR}/sources/editor/ui/terminaleditor.cpp + ${QET_DIR}/sources/editor/ui/terminaleditor.h ${QET_DIR}/sources/editor/ui/texteditor.cpp ${QET_DIR}/sources/editor/ui/texteditor.h + ${QET_DIR}/sources/editor/ui/qetelementeditor.h + ${QET_DIR}/sources/editor/ui/qetelementeditor.cpp ${QET_DIR}/sources/editor/UndoCommand/pastepartscommand.cpp ${QET_DIR}/sources/editor/UndoCommand/pastepartscommand.h @@ -371,6 +373,8 @@ set(QET_SRC_FILES ${QET_DIR}/sources/print/projectprintwindow.cpp ${QET_DIR}/sources/print/projectprintwindow.h + ${QET_DIR}/sources/properties/elementdata.cpp + ${QET_DIR}/sources/properties/elementdata.h ${QET_DIR}/sources/properties/propertiesinterface.cpp ${QET_DIR}/sources/properties/propertiesinterface.h ${QET_DIR}/sources/properties/reportproperties.cpp diff --git a/elements/10_electric/20_manufacturers_articles/pinball/williams_em/common/pinball_em_williams_ground.elmt b/elements/10_electric/20_manufacturers_articles/pinball/williams_em/common/pinball_em_williams_ground.elmt new file mode 100644 index 000000000..1660e7862 --- /dev/null +++ b/elements/10_electric/20_manufacturers_articles/pinball/williams_em/common/pinball_em_williams_ground.elmt @@ -0,0 +1,16 @@ + + + + Ground + Aarde + + + + + + + + + + + diff --git a/elements/10_electric/20_manufacturers_articles/pinball/williams_em/common/pinball_em_williams_not_connected_east.elmt b/elements/10_electric/20_manufacturers_articles/pinball/williams_em/common/pinball_em_williams_not_connected_east.elmt new file mode 100644 index 000000000..f94230834 --- /dev/null +++ b/elements/10_electric/20_manufacturers_articles/pinball/williams_em/common/pinball_em_williams_not_connected_east.elmt @@ -0,0 +1,15 @@ + + + + Not connected (east) + Niet verbonden (oost) + + + + + + + + + + diff --git a/elements/10_electric/20_manufacturers_articles/pinball/williams_em/common/pinball_em_williams_not_connected_north.elmt b/elements/10_electric/20_manufacturers_articles/pinball/williams_em/common/pinball_em_williams_not_connected_north.elmt new file mode 100644 index 000000000..ac3f7ac14 --- /dev/null +++ b/elements/10_electric/20_manufacturers_articles/pinball/williams_em/common/pinball_em_williams_not_connected_north.elmt @@ -0,0 +1,15 @@ + + + + Not connected (north) + Niet verbonden (noord) + + + + + + + + + + diff --git a/elements/10_electric/20_manufacturers_articles/pinball/williams_em/common/pinball_em_williams_not_connected_south.elmt b/elements/10_electric/20_manufacturers_articles/pinball/williams_em/common/pinball_em_williams_not_connected_south.elmt new file mode 100644 index 000000000..fead19bda --- /dev/null +++ b/elements/10_electric/20_manufacturers_articles/pinball/williams_em/common/pinball_em_williams_not_connected_south.elmt @@ -0,0 +1,15 @@ + + + + Not connected (south) + Niet verbonden (zuid) + + + + + + + + + + diff --git a/elements/10_electric/20_manufacturers_articles/pinball/williams_em/common/pinball_em_williams_not_connected_west.elmt b/elements/10_electric/20_manufacturers_articles/pinball/williams_em/common/pinball_em_williams_not_connected_west.elmt new file mode 100644 index 000000000..cd923ec64 --- /dev/null +++ b/elements/10_electric/20_manufacturers_articles/pinball/williams_em/common/pinball_em_williams_not_connected_west.elmt @@ -0,0 +1,15 @@ + + + + Not connected (west) + Niet verbonden (west) + + + + + + + + + + diff --git a/elements/10_electric/20_manufacturers_articles/pinball/williams_em/common/qet_directory b/elements/10_electric/20_manufacturers_articles/pinball/williams_em/common/qet_directory new file mode 100644 index 000000000..8b76f5b20 --- /dev/null +++ b/elements/10_electric/20_manufacturers_articles/pinball/williams_em/common/qet_directory @@ -0,0 +1,6 @@ + + + Common + Algemeen + + diff --git a/elements/10_electric/20_manufacturers_articles/pinball/williams_em/jacks/pinball_em_williams_jack_02.elmt b/elements/10_electric/20_manufacturers_articles/pinball/williams_em/jacks/pinball_em_williams_jack_02.elmt new file mode 100644 index 000000000..24fa34ebf --- /dev/null +++ b/elements/10_electric/20_manufacturers_articles/pinball/williams_em/jacks/pinball_em_williams_jack_02.elmt @@ -0,0 +1,20 @@ + + + + Jack with 2 positions + Contact met 2 posities + + + + + + + + + + + + + + + diff --git a/elements/10_electric/20_manufacturers_articles/pinball/williams_em/jacks/pinball_em_williams_jack_03.elmt b/elements/10_electric/20_manufacturers_articles/pinball/williams_em/jacks/pinball_em_williams_jack_03.elmt new file mode 100644 index 000000000..a0a4c70d2 --- /dev/null +++ b/elements/10_electric/20_manufacturers_articles/pinball/williams_em/jacks/pinball_em_williams_jack_03.elmt @@ -0,0 +1,24 @@ + + + + Jack with 3 positions + Contact met 3 posities + + + + + + + + + + + + + + + + + + + diff --git a/elements/10_electric/20_manufacturers_articles/pinball/williams_em/jacks/pinball_em_williams_jack_04.elmt b/elements/10_electric/20_manufacturers_articles/pinball/williams_em/jacks/pinball_em_williams_jack_04.elmt new file mode 100644 index 000000000..54c6ea0a0 --- /dev/null +++ b/elements/10_electric/20_manufacturers_articles/pinball/williams_em/jacks/pinball_em_williams_jack_04.elmt @@ -0,0 +1,28 @@ + + + + Jack with 4 positions + Contact met 4 posities + + + + + + + + + + + + + + + + + + + + + + + diff --git a/elements/10_electric/20_manufacturers_articles/pinball/williams_em/jacks/pinball_em_williams_jack_05.elmt b/elements/10_electric/20_manufacturers_articles/pinball/williams_em/jacks/pinball_em_williams_jack_05.elmt new file mode 100644 index 000000000..a00f228b7 --- /dev/null +++ b/elements/10_electric/20_manufacturers_articles/pinball/williams_em/jacks/pinball_em_williams_jack_05.elmt @@ -0,0 +1,32 @@ + + + + Jack with 5 positions + Contact met 5 posities + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/elements/10_electric/20_manufacturers_articles/pinball/williams_em/jacks/pinball_em_williams_jack_06.elmt b/elements/10_electric/20_manufacturers_articles/pinball/williams_em/jacks/pinball_em_williams_jack_06.elmt new file mode 100644 index 000000000..e223c0f72 --- /dev/null +++ b/elements/10_electric/20_manufacturers_articles/pinball/williams_em/jacks/pinball_em_williams_jack_06.elmt @@ -0,0 +1,36 @@ + + + + Jack with 6 positions + Contact met 6 posities + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/elements/10_electric/20_manufacturers_articles/pinball/williams_em/jacks/pinball_em_williams_jack_07.elmt b/elements/10_electric/20_manufacturers_articles/pinball/williams_em/jacks/pinball_em_williams_jack_07.elmt new file mode 100644 index 000000000..ccad5c5a6 --- /dev/null +++ b/elements/10_electric/20_manufacturers_articles/pinball/williams_em/jacks/pinball_em_williams_jack_07.elmt @@ -0,0 +1,40 @@ + + + + Jack with 7 positions + Contact met 7 posities + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/elements/10_electric/20_manufacturers_articles/pinball/williams_em/jacks/pinball_em_williams_jack_08.elmt b/elements/10_electric/20_manufacturers_articles/pinball/williams_em/jacks/pinball_em_williams_jack_08.elmt new file mode 100644 index 000000000..b5d79e003 --- /dev/null +++ b/elements/10_electric/20_manufacturers_articles/pinball/williams_em/jacks/pinball_em_williams_jack_08.elmt @@ -0,0 +1,44 @@ + + + + Jack with 8 positions + Contact met 8 posities + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/elements/10_electric/20_manufacturers_articles/pinball/williams_em/jacks/pinball_em_williams_jack_09.elmt b/elements/10_electric/20_manufacturers_articles/pinball/williams_em/jacks/pinball_em_williams_jack_09.elmt new file mode 100644 index 000000000..66d501244 --- /dev/null +++ b/elements/10_electric/20_manufacturers_articles/pinball/williams_em/jacks/pinball_em_williams_jack_09.elmt @@ -0,0 +1,48 @@ + + + + Jack with 9 positions + Contact met 9 posities + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/elements/10_electric/20_manufacturers_articles/pinball/williams_em/jacks/pinball_em_williams_jack_10.elmt b/elements/10_electric/20_manufacturers_articles/pinball/williams_em/jacks/pinball_em_williams_jack_10.elmt new file mode 100644 index 000000000..542c3fa0a --- /dev/null +++ b/elements/10_electric/20_manufacturers_articles/pinball/williams_em/jacks/pinball_em_williams_jack_10.elmt @@ -0,0 +1,52 @@ + + + + Jack with 10 positions + Contact met 10 posities + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/elements/10_electric/20_manufacturers_articles/pinball/williams_em/jacks/pinball_em_williams_jack_plug.elmt b/elements/10_electric/20_manufacturers_articles/pinball/williams_em/jacks/pinball_em_williams_jack_plug.elmt new file mode 100644 index 000000000..06285b81f --- /dev/null +++ b/elements/10_electric/20_manufacturers_articles/pinball/williams_em/jacks/pinball_em_williams_jack_plug.elmt @@ -0,0 +1,16 @@ + + + + Plug + Contactpin + + + + + + + + + + + diff --git a/elements/10_electric/20_manufacturers_articles/pinball/williams_em/jacks/qet_directory b/elements/10_electric/20_manufacturers_articles/pinball/williams_em/jacks/qet_directory new file mode 100644 index 000000000..bbe2d1883 --- /dev/null +++ b/elements/10_electric/20_manufacturers_articles/pinball/williams_em/jacks/qet_directory @@ -0,0 +1,6 @@ + + + Jacks + Contacten + + diff --git a/elements/10_electric/20_manufacturers_articles/pinball/williams_em/output/pinball_em_williams_coil.elmt b/elements/10_electric/20_manufacturers_articles/pinball/williams_em/output/pinball_em_williams_coil.elmt new file mode 100644 index 000000000..9e597b1e3 --- /dev/null +++ b/elements/10_electric/20_manufacturers_articles/pinball/williams_em/output/pinball_em_williams_coil.elmt @@ -0,0 +1,19 @@ + + + + Coil + Spoel + + + + + + + + + + + + + + diff --git a/elements/10_electric/20_manufacturers_articles/pinball/williams_em/output/pinball_em_williams_flipper_coil.elmt b/elements/10_electric/20_manufacturers_articles/pinball/williams_em/output/pinball_em_williams_flipper_coil.elmt new file mode 100644 index 000000000..045cd6467 --- /dev/null +++ b/elements/10_electric/20_manufacturers_articles/pinball/williams_em/output/pinball_em_williams_flipper_coil.elmt @@ -0,0 +1,22 @@ + + + + Flipper coil + Flipperspoel + + + + + + + + + + + + + + + + + diff --git a/elements/10_electric/20_manufacturers_articles/pinball/williams_em/output/pinball_em_williams_lite.elmt b/elements/10_electric/20_manufacturers_articles/pinball/williams_em/output/pinball_em_williams_lite.elmt new file mode 100644 index 000000000..29cc021ed --- /dev/null +++ b/elements/10_electric/20_manufacturers_articles/pinball/williams_em/output/pinball_em_williams_lite.elmt @@ -0,0 +1,16 @@ + + + + Lite + Lamp + + + + + + + + + + + diff --git a/elements/10_electric/20_manufacturers_articles/pinball/williams_em/output/pinball_em_williams_motor.elmt b/elements/10_electric/20_manufacturers_articles/pinball/williams_em/output/pinball_em_williams_motor.elmt new file mode 100644 index 000000000..e72d4732f --- /dev/null +++ b/elements/10_electric/20_manufacturers_articles/pinball/williams_em/output/pinball_em_williams_motor.elmt @@ -0,0 +1,18 @@ + + + + Motor + Motor + + + + + + + + + + + + + diff --git a/elements/10_electric/20_manufacturers_articles/pinball/williams_em/output/qet_directory b/elements/10_electric/20_manufacturers_articles/pinball/williams_em/output/qet_directory new file mode 100644 index 000000000..f951f78e7 --- /dev/null +++ b/elements/10_electric/20_manufacturers_articles/pinball/williams_em/output/qet_directory @@ -0,0 +1,6 @@ + + + Output + Uitvoer + + diff --git a/elements/10_electric/20_manufacturers_articles/pinball/williams_em/power/pinball_em_williams_fuse.elmt b/elements/10_electric/20_manufacturers_articles/pinball/williams_em/power/pinball_em_williams_fuse.elmt new file mode 100644 index 000000000..f3376d506 --- /dev/null +++ b/elements/10_electric/20_manufacturers_articles/pinball/williams_em/power/pinball_em_williams_fuse.elmt @@ -0,0 +1,21 @@ + + + + Fuse + Zekering + + + + + + + + + + + + + + + + diff --git a/elements/10_electric/20_manufacturers_articles/pinball/williams_em/power/pinball_em_williams_power_cord.elmt b/elements/10_electric/20_manufacturers_articles/pinball/williams_em/power/pinball_em_williams_power_cord.elmt new file mode 100644 index 000000000..48a1d601e --- /dev/null +++ b/elements/10_electric/20_manufacturers_articles/pinball/williams_em/power/pinball_em_williams_power_cord.elmt @@ -0,0 +1,21 @@ + + + + Power cord + Stekker + + + + + + + + + + + + + + + + diff --git a/elements/10_electric/20_manufacturers_articles/pinball/williams_em/power/pinball_em_williams_power_cord_ground.elmt b/elements/10_electric/20_manufacturers_articles/pinball/williams_em/power/pinball_em_williams_power_cord_ground.elmt new file mode 100644 index 000000000..ff4392c59 --- /dev/null +++ b/elements/10_electric/20_manufacturers_articles/pinball/williams_em/power/pinball_em_williams_power_cord_ground.elmt @@ -0,0 +1,24 @@ + + + + Power cord with ground pin + Stekker met aardedraad + + + + + + + + + + + + + + + + + + + diff --git a/elements/10_electric/20_manufacturers_articles/pinball/williams_em/power/pinball_em_williams_service_outlet.elmt b/elements/10_electric/20_manufacturers_articles/pinball/williams_em/power/pinball_em_williams_service_outlet.elmt new file mode 100644 index 000000000..0433da6b7 --- /dev/null +++ b/elements/10_electric/20_manufacturers_articles/pinball/williams_em/power/pinball_em_williams_service_outlet.elmt @@ -0,0 +1,18 @@ + + + + Service outlet + Servicestopcontact + + + + + + + + + + + + + diff --git a/elements/10_electric/20_manufacturers_articles/pinball/williams_em/power/qet_directory b/elements/10_electric/20_manufacturers_articles/pinball/williams_em/power/qet_directory new file mode 100644 index 000000000..5bcaaf788 --- /dev/null +++ b/elements/10_electric/20_manufacturers_articles/pinball/williams_em/power/qet_directory @@ -0,0 +1,6 @@ + + + Power + Stroom + + diff --git a/elements/10_electric/20_manufacturers_articles/pinball/williams_em/qet_directory b/elements/10_electric/20_manufacturers_articles/pinball/williams_em/qet_directory new file mode 100644 index 000000000..94e8e0ae9 --- /dev/null +++ b/elements/10_electric/20_manufacturers_articles/pinball/williams_em/qet_directory @@ -0,0 +1,6 @@ + + + Williams EM Schematics + Williams EM Schema's + + diff --git a/elements/10_electric/20_manufacturers_articles/pinball/williams_em/switches_common/mirrored/pinball_em_williams_switch_mb_bottom_m.elmt b/elements/10_electric/20_manufacturers_articles/pinball/williams_em/switches_common/mirrored/pinball_em_williams_switch_mb_bottom_m.elmt new file mode 100644 index 000000000..478be59f9 --- /dev/null +++ b/elements/10_electric/20_manufacturers_articles/pinball/williams_em/switches_common/mirrored/pinball_em_williams_switch_mb_bottom_m.elmt @@ -0,0 +1,21 @@ + + + + Switch (M.B.) - Bottom input - Mirrored + Schakelaar (M.B.) - Input onder - Gespiegeld + + + + + + + + + + + + + + + + diff --git a/elements/10_electric/20_manufacturers_articles/pinball/williams_em/switches_common/mirrored/pinball_em_williams_switch_mb_bottom_mi.elmt b/elements/10_electric/20_manufacturers_articles/pinball/williams_em/switches_common/mirrored/pinball_em_williams_switch_mb_bottom_mi.elmt new file mode 100644 index 000000000..3e8ea363f --- /dev/null +++ b/elements/10_electric/20_manufacturers_articles/pinball/williams_em/switches_common/mirrored/pinball_em_williams_switch_mb_bottom_mi.elmt @@ -0,0 +1,21 @@ + + + + Schakelaar (M.B.) - Input onder - Gespiegeld en omgekeerd + Switch (M.B.) - Bottom input - Mirrored and inverted + + + + + + + + + + + + + + + + diff --git a/elements/10_electric/20_manufacturers_articles/pinball/williams_em/switches_common/mirrored/pinball_em_williams_switch_mb_center_m.elmt b/elements/10_electric/20_manufacturers_articles/pinball/williams_em/switches_common/mirrored/pinball_em_williams_switch_mb_center_m.elmt new file mode 100644 index 000000000..3d799b654 --- /dev/null +++ b/elements/10_electric/20_manufacturers_articles/pinball/williams_em/switches_common/mirrored/pinball_em_williams_switch_mb_center_m.elmt @@ -0,0 +1,21 @@ + + + + Schakelaar (M.B.) - Input midden - Gespiegeld + Switch (M.B.) - Center input - Mirrored + + + + + + + + + + + + + + + + diff --git a/elements/10_electric/20_manufacturers_articles/pinball/williams_em/switches_common/mirrored/pinball_em_williams_switch_mb_center_mi.elmt b/elements/10_electric/20_manufacturers_articles/pinball/williams_em/switches_common/mirrored/pinball_em_williams_switch_mb_center_mi.elmt new file mode 100644 index 000000000..8c017f9c4 --- /dev/null +++ b/elements/10_electric/20_manufacturers_articles/pinball/williams_em/switches_common/mirrored/pinball_em_williams_switch_mb_center_mi.elmt @@ -0,0 +1,21 @@ + + + + Schakelaar (M.B.) - Input midden - Gespiegeld en omgekeerd + Switch (M.B.) - Center input - Mirrored and inverted + + + + + + + + + + + + + + + + diff --git a/elements/10_electric/20_manufacturers_articles/pinball/williams_em/switches_common/mirrored/pinball_em_williams_switch_mb_top_m.elmt b/elements/10_electric/20_manufacturers_articles/pinball/williams_em/switches_common/mirrored/pinball_em_williams_switch_mb_top_m.elmt new file mode 100644 index 000000000..a75eadd5d --- /dev/null +++ b/elements/10_electric/20_manufacturers_articles/pinball/williams_em/switches_common/mirrored/pinball_em_williams_switch_mb_top_m.elmt @@ -0,0 +1,21 @@ + + + + Schakelaar (M.B.) - Input boven - Gespiegeld + Switch (M.B.) - Top input - Mirrored + + + + + + + + + + + + + + + + diff --git a/elements/10_electric/20_manufacturers_articles/pinball/williams_em/switches_common/mirrored/pinball_em_williams_switch_mb_top_mi.elmt b/elements/10_electric/20_manufacturers_articles/pinball/williams_em/switches_common/mirrored/pinball_em_williams_switch_mb_top_mi.elmt new file mode 100644 index 000000000..49fdf43c4 --- /dev/null +++ b/elements/10_electric/20_manufacturers_articles/pinball/williams_em/switches_common/mirrored/pinball_em_williams_switch_mb_top_mi.elmt @@ -0,0 +1,21 @@ + + + + Schakelaar (M.B.) - Input boven - Gespiegeld en omgekeerd + Switch (M.B.) - Top input - Mirrored and inverted + + + + + + + + + + + + + + + + diff --git a/elements/10_electric/20_manufacturers_articles/pinball/williams_em/switches_common/mirrored/qet_directory b/elements/10_electric/20_manufacturers_articles/pinball/williams_em/switches_common/mirrored/qet_directory new file mode 100644 index 000000000..7992e604b --- /dev/null +++ b/elements/10_electric/20_manufacturers_articles/pinball/williams_em/switches_common/mirrored/qet_directory @@ -0,0 +1,6 @@ + + + Mirrored + Gespiegeld + + diff --git a/elements/10_electric/20_manufacturers_articles/pinball/williams_em/switches_common/pinball_em_williams_switch_mb_bottom.elmt b/elements/10_electric/20_manufacturers_articles/pinball/williams_em/switches_common/pinball_em_williams_switch_mb_bottom.elmt new file mode 100644 index 000000000..9fa71c659 --- /dev/null +++ b/elements/10_electric/20_manufacturers_articles/pinball/williams_em/switches_common/pinball_em_williams_switch_mb_bottom.elmt @@ -0,0 +1,21 @@ + + + + Schakelaar (M.B.) - Input onder + Switch (M.B.) - Bottom input + + + + + + + + + + + + + + + + diff --git a/elements/10_electric/20_manufacturers_articles/pinball/williams_em/switches_common/pinball_em_williams_switch_mb_bottom_i.elmt b/elements/10_electric/20_manufacturers_articles/pinball/williams_em/switches_common/pinball_em_williams_switch_mb_bottom_i.elmt new file mode 100644 index 000000000..891ecbcea --- /dev/null +++ b/elements/10_electric/20_manufacturers_articles/pinball/williams_em/switches_common/pinball_em_williams_switch_mb_bottom_i.elmt @@ -0,0 +1,21 @@ + + + + Schakelaar (M.B.) - Input onder - Omgekeerd + Switch (M.B.) - Bottom input - Inverted + + + + + + + + + + + + + + + + diff --git a/elements/10_electric/20_manufacturers_articles/pinball/williams_em/switches_common/pinball_em_williams_switch_mb_center.elmt b/elements/10_electric/20_manufacturers_articles/pinball/williams_em/switches_common/pinball_em_williams_switch_mb_center.elmt new file mode 100644 index 000000000..82526f4e5 --- /dev/null +++ b/elements/10_electric/20_manufacturers_articles/pinball/williams_em/switches_common/pinball_em_williams_switch_mb_center.elmt @@ -0,0 +1,21 @@ + + + + Schakelaar (M.B.) - Input midden + Switch (M.B.) - Center input + + + + + + + + + + + + + + + + diff --git a/elements/10_electric/20_manufacturers_articles/pinball/williams_em/switches_common/pinball_em_williams_switch_mb_center_i.elmt b/elements/10_electric/20_manufacturers_articles/pinball/williams_em/switches_common/pinball_em_williams_switch_mb_center_i.elmt new file mode 100644 index 000000000..ab7d67691 --- /dev/null +++ b/elements/10_electric/20_manufacturers_articles/pinball/williams_em/switches_common/pinball_em_williams_switch_mb_center_i.elmt @@ -0,0 +1,21 @@ + + + + Schakelaar (M.B.) - Input midden - Omgekeerd + Switch (M.B.) - Center input - Inverted + + + + + + + + + + + + + + + + diff --git a/elements/10_electric/20_manufacturers_articles/pinball/williams_em/switches_common/pinball_em_williams_switch_mb_top.elmt b/elements/10_electric/20_manufacturers_articles/pinball/williams_em/switches_common/pinball_em_williams_switch_mb_top.elmt new file mode 100644 index 000000000..b936ef14f --- /dev/null +++ b/elements/10_electric/20_manufacturers_articles/pinball/williams_em/switches_common/pinball_em_williams_switch_mb_top.elmt @@ -0,0 +1,21 @@ + + + + Schakelaar (M.B.) - Input boven + Switch (M.B.) - Top input + + + + + + + + + + + + + + + + diff --git a/elements/10_electric/20_manufacturers_articles/pinball/williams_em/switches_common/pinball_em_williams_switch_mb_top_i.elmt b/elements/10_electric/20_manufacturers_articles/pinball/williams_em/switches_common/pinball_em_williams_switch_mb_top_i.elmt new file mode 100644 index 000000000..3dc513ffa --- /dev/null +++ b/elements/10_electric/20_manufacturers_articles/pinball/williams_em/switches_common/pinball_em_williams_switch_mb_top_i.elmt @@ -0,0 +1,21 @@ + + + + Schakelaar (M.B.) - Input boven - Omgekeerd + Switch (M.B) - Top input - Inverted + + + + + + + + + + + + + + + + diff --git a/elements/10_electric/20_manufacturers_articles/pinball/williams_em/switches_common/pinball_em_williams_switch_nc.elmt b/elements/10_electric/20_manufacturers_articles/pinball/williams_em/switches_common/pinball_em_williams_switch_nc.elmt new file mode 100644 index 000000000..a4592bc9e --- /dev/null +++ b/elements/10_electric/20_manufacturers_articles/pinball/williams_em/switches_common/pinball_em_williams_switch_nc.elmt @@ -0,0 +1,18 @@ + + + + Schakelaar (N.C.) + Switch (N.C.) + + + + + + + + + + + + + diff --git a/elements/10_electric/20_manufacturers_articles/pinball/williams_em/switches_common/pinball_em_williams_switch_no.elmt b/elements/10_electric/20_manufacturers_articles/pinball/williams_em/switches_common/pinball_em_williams_switch_no.elmt new file mode 100644 index 000000000..2277eec47 --- /dev/null +++ b/elements/10_electric/20_manufacturers_articles/pinball/williams_em/switches_common/pinball_em_williams_switch_no.elmt @@ -0,0 +1,17 @@ + + + + Schakelaar (N.O.) + Switch (N.O.) + + + + + + + + + + + + diff --git a/elements/10_electric/20_manufacturers_articles/pinball/williams_em/switches_common/qet_directory b/elements/10_electric/20_manufacturers_articles/pinball/williams_em/switches_common/qet_directory new file mode 100644 index 000000000..a87828d0f --- /dev/null +++ b/elements/10_electric/20_manufacturers_articles/pinball/williams_em/switches_common/qet_directory @@ -0,0 +1,6 @@ + + + Schakelaars - Algemeen + Switches - Common + + diff --git a/elements/10_electric/20_manufacturers_articles/pinball/williams_em/switches_score_motor/mirrored/pinball_em_williams_switch_mb_sm_bottom_m.elmt b/elements/10_electric/20_manufacturers_articles/pinball/williams_em/switches_score_motor/mirrored/pinball_em_williams_switch_mb_sm_bottom_m.elmt new file mode 100644 index 000000000..bac2425b8 --- /dev/null +++ b/elements/10_electric/20_manufacturers_articles/pinball/williams_em/switches_score_motor/mirrored/pinball_em_williams_switch_mb_sm_bottom_m.elmt @@ -0,0 +1,25 @@ + + + + Switch on Score Motor (M.B.) - Bottom input - Mirrored + Schakelaar op Score Motor (M.B.) - Input onder - Gespiegeld + + + + + + + + + + + + + + + + + + + + diff --git a/elements/10_electric/20_manufacturers_articles/pinball/williams_em/switches_score_motor/mirrored/pinball_em_williams_switch_mb_sm_bottom_mi.elmt b/elements/10_electric/20_manufacturers_articles/pinball/williams_em/switches_score_motor/mirrored/pinball_em_williams_switch_mb_sm_bottom_mi.elmt new file mode 100644 index 000000000..e7210a681 --- /dev/null +++ b/elements/10_electric/20_manufacturers_articles/pinball/williams_em/switches_score_motor/mirrored/pinball_em_williams_switch_mb_sm_bottom_mi.elmt @@ -0,0 +1,25 @@ + + + + Switch on Score Motor (M.B.) - Bottom input - Mirrored and inverted + Schakelaar op Score Motor (M.B.) - Input onder - Gespiegeld en omgekeerd + + + + + + + + + + + + + + + + + + + + diff --git a/elements/10_electric/20_manufacturers_articles/pinball/williams_em/switches_score_motor/mirrored/pinball_em_williams_switch_mb_sm_center_m.elmt b/elements/10_electric/20_manufacturers_articles/pinball/williams_em/switches_score_motor/mirrored/pinball_em_williams_switch_mb_sm_center_m.elmt new file mode 100644 index 000000000..fda2e0fb6 --- /dev/null +++ b/elements/10_electric/20_manufacturers_articles/pinball/williams_em/switches_score_motor/mirrored/pinball_em_williams_switch_mb_sm_center_m.elmt @@ -0,0 +1,25 @@ + + + + Switch on Score Motor (M.B.) - Center input - Mirrored + Schakelaar op Score Motor (M.B.) - Input midden - Gespiegeld + + + + + + + + + + + + + + + + + + + + diff --git a/elements/10_electric/20_manufacturers_articles/pinball/williams_em/switches_score_motor/mirrored/pinball_em_williams_switch_mb_sm_center_mi.elmt b/elements/10_electric/20_manufacturers_articles/pinball/williams_em/switches_score_motor/mirrored/pinball_em_williams_switch_mb_sm_center_mi.elmt new file mode 100644 index 000000000..0a4ccd414 --- /dev/null +++ b/elements/10_electric/20_manufacturers_articles/pinball/williams_em/switches_score_motor/mirrored/pinball_em_williams_switch_mb_sm_center_mi.elmt @@ -0,0 +1,25 @@ + + + + Switch on Score Motor (M.B.) - Center input - Mirrored and inverted + Schakelaar op Score Motor (M.B.) - Input midden - Gespiegeld en omgekeerd + + + + + + + + + + + + + + + + + + + + diff --git a/elements/10_electric/20_manufacturers_articles/pinball/williams_em/switches_score_motor/mirrored/pinball_em_williams_switch_mb_sm_top_m.elmt b/elements/10_electric/20_manufacturers_articles/pinball/williams_em/switches_score_motor/mirrored/pinball_em_williams_switch_mb_sm_top_m.elmt new file mode 100644 index 000000000..c1abef682 --- /dev/null +++ b/elements/10_electric/20_manufacturers_articles/pinball/williams_em/switches_score_motor/mirrored/pinball_em_williams_switch_mb_sm_top_m.elmt @@ -0,0 +1,25 @@ + + + + Switch on Score Motor (M.B.) - Top input - Mirrored + Schakelaar op Score Motor (M.B.) - Input boven - Gespiegeld + + + + + + + + + + + + + + + + + + + + diff --git a/elements/10_electric/20_manufacturers_articles/pinball/williams_em/switches_score_motor/mirrored/pinball_em_williams_switch_mb_sm_top_mi.elmt b/elements/10_electric/20_manufacturers_articles/pinball/williams_em/switches_score_motor/mirrored/pinball_em_williams_switch_mb_sm_top_mi.elmt new file mode 100644 index 000000000..b2441c7ea --- /dev/null +++ b/elements/10_electric/20_manufacturers_articles/pinball/williams_em/switches_score_motor/mirrored/pinball_em_williams_switch_mb_sm_top_mi.elmt @@ -0,0 +1,25 @@ + + + + Switch on Score Motor (M.B.) - Top input - Mirrored and inverted + Schakelaar op Score Motor (M.B.) - Input boven - Gespiegeld en omgekeerd + + + + + + + + + + + + + + + + + + + + diff --git a/elements/10_electric/20_manufacturers_articles/pinball/williams_em/switches_score_motor/mirrored/qet_directory b/elements/10_electric/20_manufacturers_articles/pinball/williams_em/switches_score_motor/mirrored/qet_directory new file mode 100644 index 000000000..7992e604b --- /dev/null +++ b/elements/10_electric/20_manufacturers_articles/pinball/williams_em/switches_score_motor/mirrored/qet_directory @@ -0,0 +1,6 @@ + + + Mirrored + Gespiegeld + + diff --git a/elements/10_electric/20_manufacturers_articles/pinball/williams_em/switches_score_motor/pinball_em_williams_switch_mb_sm_bottom.elmt b/elements/10_electric/20_manufacturers_articles/pinball/williams_em/switches_score_motor/pinball_em_williams_switch_mb_sm_bottom.elmt new file mode 100644 index 000000000..74041b710 --- /dev/null +++ b/elements/10_electric/20_manufacturers_articles/pinball/williams_em/switches_score_motor/pinball_em_williams_switch_mb_sm_bottom.elmt @@ -0,0 +1,25 @@ + + + + Schakelaar op Score Motor (M.B.) - Input onder + Switch on Score Motor (M.B.) - Bottom input + + + + + + + + + + + + + + + + + + + + diff --git a/elements/10_electric/20_manufacturers_articles/pinball/williams_em/switches_score_motor/pinball_em_williams_switch_mb_sm_bottom_i.elmt b/elements/10_electric/20_manufacturers_articles/pinball/williams_em/switches_score_motor/pinball_em_williams_switch_mb_sm_bottom_i.elmt new file mode 100644 index 000000000..e799d05dc --- /dev/null +++ b/elements/10_electric/20_manufacturers_articles/pinball/williams_em/switches_score_motor/pinball_em_williams_switch_mb_sm_bottom_i.elmt @@ -0,0 +1,25 @@ + + + + Schakelaar op Score Motor (M.B.) - Input onder - Omgekeerd + Switch on Score Motor (M.B.) - Bottom input - Inverted + + + + + + + + + + + + + + + + + + + + diff --git a/elements/10_electric/20_manufacturers_articles/pinball/williams_em/switches_score_motor/pinball_em_williams_switch_mb_sm_center.elmt b/elements/10_electric/20_manufacturers_articles/pinball/williams_em/switches_score_motor/pinball_em_williams_switch_mb_sm_center.elmt new file mode 100644 index 000000000..982a03048 --- /dev/null +++ b/elements/10_electric/20_manufacturers_articles/pinball/williams_em/switches_score_motor/pinball_em_williams_switch_mb_sm_center.elmt @@ -0,0 +1,25 @@ + + + + Switch on Score Motor (M.B.) - Center input + Schakelaar op Score Motor (M.B.) - Input midden + + + + + + + + + + + + + + + + + + + + diff --git a/elements/10_electric/20_manufacturers_articles/pinball/williams_em/switches_score_motor/pinball_em_williams_switch_mb_sm_center_i.elmt b/elements/10_electric/20_manufacturers_articles/pinball/williams_em/switches_score_motor/pinball_em_williams_switch_mb_sm_center_i.elmt new file mode 100644 index 000000000..631ddd402 --- /dev/null +++ b/elements/10_electric/20_manufacturers_articles/pinball/williams_em/switches_score_motor/pinball_em_williams_switch_mb_sm_center_i.elmt @@ -0,0 +1,25 @@ + + + + Switch on Score Motor (M.B.) - Center input - Inverted + Schakelaar op Score Motor (M.B.) - Input midden - Omgekeerd + + + + + + + + + + + + + + + + + + + + diff --git a/elements/10_electric/20_manufacturers_articles/pinball/williams_em/switches_score_motor/pinball_em_williams_switch_mb_sm_top.elmt b/elements/10_electric/20_manufacturers_articles/pinball/williams_em/switches_score_motor/pinball_em_williams_switch_mb_sm_top.elmt new file mode 100644 index 000000000..b8f419d3b --- /dev/null +++ b/elements/10_electric/20_manufacturers_articles/pinball/williams_em/switches_score_motor/pinball_em_williams_switch_mb_sm_top.elmt @@ -0,0 +1,25 @@ + + + + Switch on Score Motor (M.B.) - Top input + Schakelaar op Score Motor (M.B.) - Input boven + + + + + + + + + + + + + + + + + + + + diff --git a/elements/10_electric/20_manufacturers_articles/pinball/williams_em/switches_score_motor/pinball_em_williams_switch_mb_sm_top_i.elmt b/elements/10_electric/20_manufacturers_articles/pinball/williams_em/switches_score_motor/pinball_em_williams_switch_mb_sm_top_i.elmt new file mode 100644 index 000000000..fc0f6aa5b --- /dev/null +++ b/elements/10_electric/20_manufacturers_articles/pinball/williams_em/switches_score_motor/pinball_em_williams_switch_mb_sm_top_i.elmt @@ -0,0 +1,25 @@ + + + + Switch on Score Motor (M.B.) - Top input - Inverted + Schakelaar op Score Motor (M.B.) - Input boven - Omgekeerd + + + + + + + + + + + + + + + + + + + + diff --git a/elements/10_electric/20_manufacturers_articles/pinball/williams_em/switches_score_motor/pinball_em_williams_switch_nc_sm.elmt b/elements/10_electric/20_manufacturers_articles/pinball/williams_em/switches_score_motor/pinball_em_williams_switch_nc_sm.elmt new file mode 100644 index 000000000..bc33afb06 --- /dev/null +++ b/elements/10_electric/20_manufacturers_articles/pinball/williams_em/switches_score_motor/pinball_em_williams_switch_nc_sm.elmt @@ -0,0 +1,19 @@ + + + + Schakelaar op Score Motor (N.C.) + Switch on Score Motor (N.C.) + + + + + + + + + + + + + + diff --git a/elements/10_electric/20_manufacturers_articles/pinball/williams_em/switches_score_motor/pinball_em_williams_switch_no_sm.elmt b/elements/10_electric/20_manufacturers_articles/pinball/williams_em/switches_score_motor/pinball_em_williams_switch_no_sm.elmt new file mode 100644 index 000000000..df4f9c472 --- /dev/null +++ b/elements/10_electric/20_manufacturers_articles/pinball/williams_em/switches_score_motor/pinball_em_williams_switch_no_sm.elmt @@ -0,0 +1,18 @@ + + + + Schakelaar op Score Motor (N.O.) + Switch on Score Motor (N.O.) + + + + + + + + + + + + + diff --git a/elements/10_electric/20_manufacturers_articles/pinball/williams_em/switches_score_motor/qet_directory b/elements/10_electric/20_manufacturers_articles/pinball/williams_em/switches_score_motor/qet_directory new file mode 100644 index 000000000..215358b8a --- /dev/null +++ b/elements/10_electric/20_manufacturers_articles/pinball/williams_em/switches_score_motor/qet_directory @@ -0,0 +1,6 @@ + + + Schakelaars - Score Motor + Switches - Score Motor + + diff --git a/elements/10_electric/20_manufacturers_articles/pinball/williams_em/units/qet_directory b/elements/10_electric/20_manufacturers_articles/pinball/williams_em/units/qet_directory new file mode 100644 index 000000000..10f2d6745 --- /dev/null +++ b/elements/10_electric/20_manufacturers_articles/pinball/williams_em/units/qet_directory @@ -0,0 +1,6 @@ + + + Units + Units + + diff --git a/elements/10_electric/20_manufacturers_articles/pinball/williams_em/units/wiper_between/pinball_em_williams_unit_wiper_between_04.elmt b/elements/10_electric/20_manufacturers_articles/pinball/williams_em/units/wiper_between/pinball_em_williams_unit_wiper_between_04.elmt new file mode 100644 index 000000000..2b851160f --- /dev/null +++ b/elements/10_electric/20_manufacturers_articles/pinball/williams_em/units/wiper_between/pinball_em_williams_unit_wiper_between_04.elmt @@ -0,0 +1,39 @@ + + + + Wiper between 4 contact pairs + Sleepcontact tussen 4 contactparen + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/elements/10_electric/20_manufacturers_articles/pinball/williams_em/units/wiper_between/pinball_em_williams_unit_wiper_between_10.elmt b/elements/10_electric/20_manufacturers_articles/pinball/williams_em/units/wiper_between/pinball_em_williams_unit_wiper_between_10.elmt new file mode 100644 index 000000000..cfd385ce6 --- /dev/null +++ b/elements/10_electric/20_manufacturers_articles/pinball/williams_em/units/wiper_between/pinball_em_williams_unit_wiper_between_10.elmt @@ -0,0 +1,75 @@ + + + + Wiper between 10 contact pairs + Sleepcontact tussen 10 contactparen + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/elements/10_electric/20_manufacturers_articles/pinball/williams_em/units/wiper_between/pinball_em_williams_wiper_3_between_3.elmt b/elements/10_electric/20_manufacturers_articles/pinball/williams_em/units/wiper_between/pinball_em_williams_wiper_3_between_3.elmt new file mode 100644 index 000000000..7de4131f5 --- /dev/null +++ b/elements/10_electric/20_manufacturers_articles/pinball/williams_em/units/wiper_between/pinball_em_williams_wiper_3_between_3.elmt @@ -0,0 +1,39 @@ + + + + 3 wipers between 3 contact pairs + 3 sleepcontacten tussen 3 contactparen + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/elements/10_electric/20_manufacturers_articles/pinball/williams_em/units/wiper_between/qet_directory b/elements/10_electric/20_manufacturers_articles/pinball/williams_em/units/wiper_between/qet_directory new file mode 100644 index 000000000..c7997fa96 --- /dev/null +++ b/elements/10_electric/20_manufacturers_articles/pinball/williams_em/units/wiper_between/qet_directory @@ -0,0 +1,6 @@ + + + Wiper between + Sleepcontact tussen + + diff --git a/elements/10_electric/20_manufacturers_articles/pinball/williams_em/units/wiper_to/pinball_em_williams_unit_wiper_to_02.elmt b/elements/10_electric/20_manufacturers_articles/pinball/williams_em/units/wiper_to/pinball_em_williams_unit_wiper_to_02.elmt new file mode 100644 index 000000000..156b10c27 --- /dev/null +++ b/elements/10_electric/20_manufacturers_articles/pinball/williams_em/units/wiper_to/pinball_em_williams_unit_wiper_to_02.elmt @@ -0,0 +1,21 @@ + + + + Wiper to 2 contacts + Sleepcontact naar 2 polen + + + + + + + + + + + + + + + + diff --git a/elements/10_electric/20_manufacturers_articles/pinball/williams_em/units/wiper_to/pinball_em_williams_unit_wiper_to_03.elmt b/elements/10_electric/20_manufacturers_articles/pinball/williams_em/units/wiper_to/pinball_em_williams_unit_wiper_to_03.elmt new file mode 100644 index 000000000..b5aad9fb3 --- /dev/null +++ b/elements/10_electric/20_manufacturers_articles/pinball/williams_em/units/wiper_to/pinball_em_williams_unit_wiper_to_03.elmt @@ -0,0 +1,24 @@ + + + + Wiper to 3 contacts + Sleepcontact naar 3 polen + + + + + + + + + + + + + + + + + + + diff --git a/elements/10_electric/20_manufacturers_articles/pinball/williams_em/units/wiper_to/pinball_em_williams_unit_wiper_to_04.elmt b/elements/10_electric/20_manufacturers_articles/pinball/williams_em/units/wiper_to/pinball_em_williams_unit_wiper_to_04.elmt new file mode 100644 index 000000000..17cd34b8b --- /dev/null +++ b/elements/10_electric/20_manufacturers_articles/pinball/williams_em/units/wiper_to/pinball_em_williams_unit_wiper_to_04.elmt @@ -0,0 +1,27 @@ + + + + Wiper to 4 contacts + Sleepcontact naar 4 polen + + + + + + + + + + + + + + + + + + + + + + diff --git a/elements/10_electric/20_manufacturers_articles/pinball/williams_em/units/wiper_to/pinball_em_williams_unit_wiper_to_05.elmt b/elements/10_electric/20_manufacturers_articles/pinball/williams_em/units/wiper_to/pinball_em_williams_unit_wiper_to_05.elmt new file mode 100644 index 000000000..736822b54 --- /dev/null +++ b/elements/10_electric/20_manufacturers_articles/pinball/williams_em/units/wiper_to/pinball_em_williams_unit_wiper_to_05.elmt @@ -0,0 +1,30 @@ + + + + Wiper to 5 contacts + Sleepcontact naar 5 polen + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/elements/10_electric/20_manufacturers_articles/pinball/williams_em/units/wiper_to/pinball_em_williams_unit_wiper_to_06.elmt b/elements/10_electric/20_manufacturers_articles/pinball/williams_em/units/wiper_to/pinball_em_williams_unit_wiper_to_06.elmt new file mode 100644 index 000000000..b1915c3eb --- /dev/null +++ b/elements/10_electric/20_manufacturers_articles/pinball/williams_em/units/wiper_to/pinball_em_williams_unit_wiper_to_06.elmt @@ -0,0 +1,33 @@ + + + + Wiper to 6 contacts + Sleepcontact naar 6 polen + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/elements/10_electric/20_manufacturers_articles/pinball/williams_em/units/wiper_to/pinball_em_williams_unit_wiper_to_10.elmt b/elements/10_electric/20_manufacturers_articles/pinball/williams_em/units/wiper_to/pinball_em_williams_unit_wiper_to_10.elmt new file mode 100644 index 000000000..271638819 --- /dev/null +++ b/elements/10_electric/20_manufacturers_articles/pinball/williams_em/units/wiper_to/pinball_em_williams_unit_wiper_to_10.elmt @@ -0,0 +1,45 @@ + + + + Wiper to 10 contacts + Sleepcontact naar 10 polen + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/elements/10_electric/20_manufacturers_articles/pinball/williams_em/units/wiper_to/pinball_em_williams_unit_wiper_to_11.elmt b/elements/10_electric/20_manufacturers_articles/pinball/williams_em/units/wiper_to/pinball_em_williams_unit_wiper_to_11.elmt new file mode 100644 index 000000000..f5bee450d --- /dev/null +++ b/elements/10_electric/20_manufacturers_articles/pinball/williams_em/units/wiper_to/pinball_em_williams_unit_wiper_to_11.elmt @@ -0,0 +1,48 @@ + + + + Wiper to 11 contacts + Sleepcontact naar 11 polen + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/elements/10_electric/20_manufacturers_articles/pinball/williams_em/units/wiper_to/qet_directory b/elements/10_electric/20_manufacturers_articles/pinball/williams_em/units/wiper_to/qet_directory new file mode 100644 index 000000000..a4a4644d2 --- /dev/null +++ b/elements/10_electric/20_manufacturers_articles/pinball/williams_em/units/wiper_to/qet_directory @@ -0,0 +1,6 @@ + + + Wiper to + Sleepcontact naar + + diff --git a/examples/pinball_williams_em.qet b/examples/pinball_williams_em.qet new file mode 100644 index 000000000..f22f63b4b --- /dev/null +++ b/examples/pinball_williams_em.qet @@ -0,0 +1,3048 @@ + + + 23:00 + example + 3-2-2021 + C:/Users/Thomas/Application Data/qet/elements/pinball_em_williams_schematic/example.qet + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 3 positions + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Wiper to 6 contacts + + + + + + + + + + + + + + + + + + + + + + Wiper between 4 contacts + + + + + + + + + + + + + + + + + + + + + + + + + + Wiper to 11 contacts + + + + + + + + + + + + + + + + Switch (N.O.) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 4 positions + + + + + + + + + + + + + + + + Plug + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Switch (M.B.) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 10 positions + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Switch (N.C.) + + + + + + + + + + + + + + + + + + + + + + + + + + 6 positions + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 8 positions + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + N.C. (East) + + + + + + + + + + + + + + + N.C. (North) + + + + + + + + + + + + + + + N.C. (South) + + + + + + + + + + + + + + + N.C. (West) + + + + + + + + + + + + + + + + + + + + + + + + 5 positions + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 2 positions + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Coil + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 9 positions + + + + + + + + + + + + + + + + + + + + + + + + + + + + Ground + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Wiper to 10 contacts + + + + + + + + + + + + + + + + + + Wiper to 3 contacts + + + + + + + + + + + + + + + + + Wiper to 2 contacts + + + + + + + + + + + + + + + + + + + + Wiper to 5 contacts + + + + + + + + + + + + + + + + + + + + 3 wipers between 3 contacts + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Wiper between 10 contacts + + + + + + + + + + + + + + + + + + + Wiper to 4 contacts + + + + + + + + + + + + + + + + Switch (N.C.) + + + + + + + + + + + + + + + + + Flipper + + + + + + + + + + + + + + + + Lite + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Switch (M.B.) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Cord + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Switch (N.O.) + + + + + + + + + + + + + + + + + + + + + + + + + + + + 7 positions + + + + + + + + + + + + + + + + Socket + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Fuse + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Cord + + + + + + + + + + + + + + + + Motor + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Uvoženi elementi + Elementy importowane + Elementi importati + Elements importats + Elemente importate + Imported elements + Εισηγμένα στοιχεία + Импортированные элементы + İthal öğeler + elementos importados + Uvezeni elementi + Importierte elemente + Zavedené prvky + Elementos importados + Elementen geïmporteerd + Importerede elementer + Éléments importés + + + + Williams EM Schematics + Williams EM Schema's + + + + Common + Algemeen + + + + + + Ground + Aarde + + + + + + + + + + + + + + + + + Not connected (east) + Niet verbonden (oost) + + + + + + + + + + + + + + + + Not connected (north) + Niet verbonden (noord) + + + + + + + + + + + + + + + + Not connected (south) + Niet verbonden (zuid) + + + + + + + + + + + + + + + + Not connected (west) + Niet verbonden (west) + + + + + + + + + + + + + + + Jacks + Contacten + + + + + + Jack with 2 positions + Contact met 2 posities + + + + + + + + + + + + + + + + + + + + + Jack with 3 positions + Contact met 3 posities + + + + + + + + + + + + + + + + + + + + + + + + + Jack with 4 positions + Contact met 4 posities + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Jack with 6 positions + Contact met 6 posities + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Jack with 5 positions + Contact met 5 posities + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Jack with 7 positions + Contact met 7 posities + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Jack with 8 positions + Contact met 8 posities + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Jack with 9 positions + Contact met 9 posities + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Jack with 10 positions + Contact met 10 posities + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Plug + Contactpin + + + + + + + + + + + + + + + + Output + Uitvoer + + + + + + Coil + Spoel + + + + + + + + + + + + + + + + + + + + Flipper coil + Flipperspoel + + + + + + + + + + + + + + + + + + + + + + + Lite + Lamp + + + + + + + + + + + + + + + + + Motor + Motor + + + + + + + + + + + + + + + + + + Power + Stroom + + + + + + Fuse + Zekering + + + + + + + + + + + + + + + + + + + + + + Power cord + Stekker + + + + + + + + + + + + + + + + + + + + + + Power cord with ground pin + Stekker met aardedraad + + + + + + + + + + + + + + + + + + + + + + + + + Service outlet + Servicestopcontact + + + + + + + + + + + + + + + + + + Switches - Common + Schakelaars - Algemeen + + + + + + Schakelaar (M.B.) - Input onder + Switch (M.B.) - Bottom input + + + + + + + + + + + + + + + + + + + + + + Schakelaar (M.B.) - Input onder - Omgekeerd + Switch (M.B.) - Bottom input - Inverted + + + + + + + + + + + + + + + + + + + + + + Schakelaar (M.B.) - Input midden + Switch (M.B.) - Center input + + + + + + + + + + + + + + + + + + + + + + Schakelaar (M.B.) - Input midden - Omgekeerd + Switch (M.B.) - Center input - Inverted + + + + + + + + + + + + + + + + + + + + + + Schakelaar (M.B.) - Input boven + Switch (M.B.) - Top input + + + + + + + + + + + + + + + + + + + + + + Schakelaar (M.B.) - Input boven - Omgekeerd + Switch (M.B) - Top input - Inverted + + + + + + + + + + + + + + + + + + + + + + Schakelaar (N.C.) + Switch (N.C.) + + + + + + + + + + + + + + + + + + + Schakelaar (N.O.) + Switch (N.O.) + + + + + + + + + + + + + + + + Mirrored + Gespiegeld + + + + + + Switch (M.B.) - Bottom input - Mirrored + Schakelaar (M.B.) - Input onder - Gespiegeld + + + + + + + + + + + + + + + + + + + + + + Schakelaar (M.B.) - Input onder - Gespiegeld en omgekeerd + Switch (M.B.) - Bottom input - Mirrored and inverted + + + + + + + + + + + + + + + + + + + + + + Schakelaar (M.B.) - Input midden - Gespiegeld + Switch (M.B.) - Center input - Mirrored + + + + + + + + + + + + + + + + + + + + + + Schakelaar (M.B.) - Input midden - Gespiegeld en omgekeerd + Switch (M.B.) - Center input - Mirrored and inverted + + + + + + + + + + + + + + + + + + + + + + Schakelaar (M.B.) - Input boven - Gespiegeld + Switch (M.B.) - Top input - Mirrored + + + + + + + + + + + + + + + + + + + + + + Schakelaar (M.B.) - Input boven - Gespiegeld en omgekeerd + Switch (M.B.) - Top input - Mirrored and inverted + + + + + + + + + + + + + + + + + + + + + + Switches - Score Motor + Schakelaars - Score Motor + + + + + + Schakelaar op Score Motor (N.O.) + Switch on Score Motor (N.O.) + + + + + + + + + + + + + + + + + + + Schakelaar op Score Motor (N.C.) + Switch on Score Motor (N.C.) + + + + + + + + + + + + + + + + + + + + Schakelaar op Score Motor (M.B.) - Input onder + Switch on Score Motor (M.B.) - Bottom input + + + + + + + + + + + + + + + + + + + + + + + + + + Schakelaar op Score Motor (M.B.) - Input onder - Omgekeerd + Switch on Score Motor (M.B.) - Bottom input - Inverted + + + + + + + + + + + + + + + + + + + + + + + + + + Switch on Score Motor (M.B.) - Center input + Schakelaar op Score Motor (M.B.) - Input midden + + + + + + + + + + + + + + + + + + + + + + + + + + Switch on Score Motor (M.B.) - Center input - Inverted + Schakelaar op Score Motor (M.B.) - Input midden - Omgekeerd + + + + + + + + + + + + + + + + + + + + + + + + + + Switch on Score Motor (M.B.) - Top input + Schakelaar op Score Motor (M.B.) - Input boven + + + + + + + + + + + + + + + + + + + + + + + + + + Switch on Score Motor (M.B.) - Top input - Inverted + Schakelaar op Score Motor (M.B.) - Input boven - Omgekeerd + + + + + + + + + + + + + + + + + + + + + + + + Mirrored + Gespiegeld + + + + + + Switch on Score Motor (M.B.) - Bottom input - Mirrored + Schakelaar op Score Motor (M.B.) - Input onder - Gespiegeld + + + + + + + + + + + + + + + + + + + + + + + + + + Switch on Score Motor (M.B.) - Bottom input - Mirrored and inverted + Schakelaar op Score Motor (M.B.) - Input onder - Gespiegeld en omgekeerd + + + + + + + + + + + + + + + + + + + + + + + + + + Switch on Score Motor (M.B.) - Center input - Mirrored + Schakelaar op Score Motor (M.B.) - Input midden - Gespiegeld + + + + + + + + + + + + + + + + + + + + + + + + + + Switch on Score Motor (M.B.) - Center input - Mirrored and inverted + Schakelaar op Score Motor (M.B.) - Input midden - Gespiegeld en omgekeerd + + + + + + + + + + + + + + + + + + + + + + + + + + Switch on Score Motor (M.B.) - Top input - Mirrored + Schakelaar op Score Motor (M.B.) - Input boven - Gespiegeld + + + + + + + + + + + + + + + + + + + + + + + + + + Switch on Score Motor (M.B.) - Top input - Mirrored and inverted + Schakelaar op Score Motor (M.B.) - Input boven - Gespiegeld en omgekeerd + + + + + + + + + + + + + + + + + + + + + + + + + + Units + Units + + + + Wiper between + Sleepcontact tussen + + + + + + Wiper between 4 contact pairs + Sleepcontact tussen 4 contactparen + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Wiper between 10 contact pairs + Sleepcontact tussen 10 contactparen + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 3 wipers between 3 contact pairs + 3 sleepcontacten tussen 3 contactparen + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Wiper to + Sleepcontact naar + + + + + + Wiper to 2 contacts + Sleepcontact naar 2 polen + + + + + + + + + + + + + + + + + + + + + + Wiper to 3 contacts + Sleepcontact naar 3 polen + + + + + + + + + + + + + + + + + + + + + + + + + Wiper to 4 contacts + Sleepcontact naar 4 polen + + + + + + + + + + + + + + + + + + + + + + + + + + + + Wiper to 5 contacts + Sleepcontact naar 5 polen + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Wiper to 6 contacts + Sleepcontact naar 6 polen + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Wiper to 10 contacts + Sleepcontact naar 10 polen + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Wiper to 11 contacts + Sleepcontact naar 11 polen + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/lang/qet_cs.ts b/lang/qet_cs.ts index 8716c187b..b45b58aa4 100644 --- a/lang/qet_cs.ts +++ b/lang/qet_cs.ts @@ -1127,7 +1127,7 @@ Poznámka: tyto volby automatické číslování ani NEPOVOLÍ ani nezakáží, X: %1 Y: %2 - + X: %1 Y: %2 @@ -1811,12 +1811,12 @@ Poznámka: tyto volby automatické číslování ani NEPOVOLÍ ani nezakáží, Élément bornier - + Prvek svorkovnice Fonction - Funkce + Funkce @@ -1918,37 +1918,37 @@ Poznámka: tyto volby automatické číslování ani NEPOVOLÍ ani nezakáží, Générique - + Obecný Fusible - + Pojistka Séctionnable - + Oddílový Diode - + Dioda Phase - Fáze + Fáze Neutre - Nulový + Nulový Terre - Země + Země @@ -5147,7 +5147,7 @@ Následující proměnné jsou neslučitelné: Fichier (*.pdf) - + Soubor (*.pdf) @@ -6474,47 +6474,47 @@ Dostupné volby: QElectroTech - Éditeur d'élément - QElectroTech - Editor prvků + QElectroTech - Editor prvků &Aide - &Nápověda + &Nápověda Annulations - Zpět + Zpět Parties - Části + Části Informations - Informace + Informace Outils - Nástroje + Nástroje Affichage - + Pohled Élément - Prvek + Prvek Annulation - + Zrušení @@ -6524,17 +6524,17 @@ Dostupné volby: C&oller dans la zone - + &Vložit do oblasti Un fichier - + Soubor Un élément - + Prvek @@ -6549,52 +6549,52 @@ Dostupné volby: À &propos de QElectroTech - &O QElectroTechu + &O QElectroTechu Affiche des informations sur QElectroTech - Zobrazí informace o QElectroTechu + Zobrazí informace o QElectroTechu Manuel en ligne - Příručka na internetu + Příručka na internetu Lance le navigateur par défaut vers le manuel en ligne de QElectroTech - Spustit výchozí prohlížeč a zobrazit příručku k QElectroTechu na internetu + Spustí výchozí prohlížeč a zobrazí příručku k QElectroTechu na internetu Chaine Youtube - Kanál na YouTube + Kanál na YouTube Lance le navigateur par défaut vers la chaine Youtube de QElectroTech - Spustit výchozí prohlížeč a zobrazit kanál na YouTube věnovaný QElectroTechu + Spustí výchozí prohlížeč a zobrazí kanál na YouTube věnovaný QElectroTechu Soutenir le projet par un don - Podpora projektu darem + Podpora projektu darem Soutenir le projet QElectroTech par un don - Podpořit projekt QElectroTech darem + Podpořit projekt QElectroTech darem À propos de &Qt - O &Qt + O &Qt Affiche des informations sur la bibliothèque Qt - Zobrazí informace o knihovně Qt + Zobrazí informace o knihovně Qt @@ -6947,7 +6947,7 @@ Učiňte jej spustitelným: chmod +x ./DXFtoQET Afficher menu entry - Zobrazení + Zobrazení @@ -7346,14 +7346,16 @@ Co chcete dělat? Avertissement message box title - + Varování Le projet que vous tentez d'ouvrir est partiellement compatible avec votre version de QElectroTech. Afin de le rendre totalement compatible veuillez ouvrir ce même projet avec la version 0.8 de QElectroTech sauvegarder le projet et l'ouvrir à nouveau avec cette version. Que désirez vous faire ? - + Projekt, který se pokoušíte otevřít, je částečně kompatibilní s vaší verzí QElectroTech. +Aby byl plně kompatibilní, otevřete, prosím, stejný projekt s verzí QElectroTechu 0.8, uložte projekt a znovu jej otevřete s touto verzí. +Co chcete dělat? @@ -7757,7 +7759,7 @@ Que désirez vous faire ? un element graphique - + Grafický prvek @@ -7883,7 +7885,7 @@ Que désirez vous faire ? Modifier les propriétées de l'élément - + Upravit vlastnosti prvku @@ -9616,7 +9618,7 @@ Vytvořte svůj vlastní text pomocí následujících proměnných: Eléments bornier - Prvky svorky + Prvky svorkovnice @@ -12048,17 +12050,17 @@ Pole „Přírůstek“ se nepoužívá. Générique - + Obecný Bornier intérieur - + Vnitřní svorkovnice Bornier extérieur - + Vnější svorkovnice @@ -12068,37 +12070,37 @@ Pole „Přírůstek“ se nepoužívá. Modifier le type d'une borne - + Změnit typ svorky Form - Formulář + Formulář y : - + y: Orientation : - + Natočení: x : - + x: Nom : - Název: + Název: Type : - Typ: + Typ: diff --git a/lang/qet_da.qm b/lang/qet_da.qm index a5b081c83..9e37b6460 100644 Binary files a/lang/qet_da.qm and b/lang/qet_da.qm differ diff --git a/lang/qet_da.ts b/lang/qet_da.ts index c8b1287d4..397955218 100644 --- a/lang/qet_da.ts +++ b/lang/qet_da.ts @@ -1127,7 +1127,7 @@ Bemærk: Disse muligheder VIL IKKE tillade eller blokere autonummereringer, kun X: %1 Y: %2 - + X: %1 Y: %2 @@ -1811,12 +1811,12 @@ Bemærk: Disse muligheder VIL IKKE tillade eller blokere autonummereringer, kun Élément bornier - + Terminal symbol Fonction - Funktion + Funktion @@ -1918,37 +1918,37 @@ Bemærk: Disse muligheder VIL IKKE tillade eller blokere autonummereringer, kun Générique - + Generisk Fusible - + Sikirn Séctionnable - + Valgbar Diode - + Diode Phase - Fase + Fase Neutre - Neutral + Neutral Terre - Jord + Jord @@ -5145,7 +5145,7 @@ Følgende variabler er ikke kompatible: Fichier (*.pdf) - + Fil (*.pdf) @@ -6151,8 +6151,7 @@ Kommandovalg: Annulations dock title - Funktion beskrivende oversættelse - Redigeringshistorik + Annuleringer @@ -6476,47 +6475,47 @@ Kommandovalg: QElectroTech - Éditeur d'élément - QElectroTech - Symbol redigering + QElectroTech - Symbol redigering &Aide - &Hjælp + &Hjælp Annulations - Redigeringshistorik + Annulleringer Parties - Dele + Dele Informations - Informationer + Informationer Outils - Værktøjer + Værktøjer Affichage - Vise + Vise Élément - Symbol + Symbol Annulation - + Annullere @@ -6526,17 +6525,17 @@ Kommandovalg: C&oller dans la zone - + I&ndsæt i område Un fichier - + En fil Un élément - + Et symbol @@ -6551,52 +6550,52 @@ Kommandovalg: À &propos de QElectroTech - &Om QElectroTech + &Om QElectroTech Affiche des informations sur QElectroTech - Viser information om QElectroTech + Viser information om QElectroTech Manuel en ligne - Online manual + Online manual Lance le navigateur par défaut vers le manuel en ligne de QElectroTech - Starter standard netlæser til online QElectroTech manual + Starter standard netlæser til QElectroTech online manual Chaine Youtube - Youtube kanal + Youtube kanal Lance le navigateur par défaut vers la chaine Youtube de QElectroTech - Starter standard netlæser til QElectroTech Youtube kanal + Starter standard netlæser til QElectroTech Youtube kanal Soutenir le projet par un don - Støt projektet med donation + Støt projektet med donation Soutenir le projet QElectroTech par un don - Støt QElectroTech projektet med donation + Støt QElectroTech projektet med donation À propos de &Qt - Om &Qt + Om &Qt Affiche des informations sur la bibliothèque Qt - Viser information om Qt biblioteket + Viser information om Qt biblioteket @@ -6946,7 +6945,7 @@ Gør den kørbar: chmod +x ./DXFtoQET Afficher menu entry - Vis + Vis @@ -7346,14 +7345,15 @@ Hvad skal ske? Avertissement message box title - + Advarsel Le projet que vous tentez d'ouvrir est partiellement compatible avec votre version de QElectroTech. Afin de le rendre totalement compatible veuillez ouvrir ce même projet avec la version 0.8 de QElectroTech sauvegarder le projet et l'ouvrir à nouveau avec cette version. Que désirez vous faire ? - + Projektet, der forsøges åbnet, er delvist kompatibelt med kørende QElectroTech version. +For at gøre det fuldt kompatibelt skal projektet åbnes og gemmes med QElectroTech version 0.8 inden det åbnes med denne version. @@ -7758,7 +7758,7 @@ Que désirez vous faire ? un element graphique - + et grafik symbol @@ -7884,7 +7884,7 @@ Que désirez vous faire ? Modifier les propriétées de l'élément - + Ændre symbol egenskab @@ -11502,7 +11502,7 @@ De andre felter anvendes ikke. Cyan : Aquamarine element part filling - Turkis : Havvand + Turkis : Havvand @@ -12049,17 +12049,17 @@ De andre felter anvendes ikke. Générique - + Generisk Bornier intérieur - + Intern terminal Bornier extérieur - + Ekstern terminal @@ -12069,37 +12069,37 @@ De andre felter anvendes ikke. Modifier le type d'une borne - + Ændre terminal type Form - + Formular y : - + y: Orientation : - + Retning: x : - + x: Nom : - Navn: + Navn: Type : - Type: + Type: diff --git a/lang/qet_de.qm b/lang/qet_de.qm index 8a297791d..cef7e5691 100644 Binary files a/lang/qet_de.qm and b/lang/qet_de.qm differ diff --git a/lang/qet_de.ts b/lang/qet_de.ts index 0ebbb31d6..00f1e50b2 100644 --- a/lang/qet_de.ts +++ b/lang/qet_de.ts @@ -1114,7 +1114,7 @@ Bemerkung: diese Optionen verhindern NICHT das automatische Nummerieren. Ceci est la zone dans laquelle vous concevez vos schémas en y ajoutant des éléments et en posant des conducteurs entre leurs bornes. Il est également possible d'ajouter des textes indépendants. "What's this?" tip - In diesem Bereich wird der Schaltplan erstellt. + In diesem Bereich entwerfen Sie Ihre Schaltpläne, indem Sie Elemente hinzufügen und Leiter zwischen Anschlüssen verlegen. Es ist auch möglich, unabhängige Texte hinzuzufügen. @@ -1130,7 +1130,7 @@ Bemerkung: diese Optionen verhindern NICHT das automatische Nummerieren. X: %1 Y: %2 - + X: %1 Y: %2 @@ -1814,12 +1814,12 @@ Bemerkung: diese Optionen verhindern NICHT das automatische Nummerieren. Élément bornier - + Klemmblockelement Fonction - Funktion + Funktion @@ -1921,37 +1921,37 @@ Bemerkung: diese Optionen verhindern NICHT das automatische Nummerieren. Générique - + Generisch Fusible - + Sicherung Séctionnable - + Reihenklemme Diode - + Diode Phase - Phase + Phase Neutre - Neutralleiter + Neutralleiter Terre - Erde + Erde @@ -2358,7 +2358,7 @@ Bemerkung: diese Optionen verhindern NICHT das automatische Nummerieren. Recharger les collections - Sammlungen neu laden + Bauteilsammlungen neu laden @@ -2842,7 +2842,7 @@ Alle Bauteile und Unterordner von diesem Ordner werden ebenso gelöscht. Dessiner les bornes - Bauteilanschlüsse zeichnen + Anschlüsse zeichnen @@ -3094,7 +3094,7 @@ Hier unten kann der Standardwert dieses Textfeldes für Ihre eigenen Bauteile de Exporter les bornes dans la nomenclature - Klemmen in Betriebsmittelverzeichnis exportieren + Anschlüsse in Betriebsmittelverzeichnis exportieren @@ -5004,7 +5004,7 @@ Folgende Variablen sind inkompatibel: Dessiner les bornes - Bauteilanschlüsse zeichnen + Anschlüsse zeichnen @@ -5146,7 +5146,7 @@ Folgende Variablen sind inkompatibel: Fichier (*.pdf) - + Datei (*.pdf) @@ -5545,7 +5545,8 @@ Verfügbare Optionen: Annulations dock title - Abbrechen + Rückgängig + Arbeitsschritte @@ -5607,12 +5608,12 @@ Verfügbare Optionen: Annuler - Rückgängig + Rückgängig: Refaire - Wiederholen + Wiederholen: @@ -6034,12 +6035,12 @@ Verfügbare Optionen: Projets dock title - Projekte + Projektdaten Collections - Sammlungen + Bauteilsammlungen @@ -6492,47 +6493,47 @@ Verfügbare Optionen: QElectroTech - Éditeur d'élément - QElectroTech - Bauteileditor + QElectroTech - Bauteileditor &Aide - &Hilfe + &Hilfe Annulations - + Arbeitsschritte Parties - Teile + Bestandteile Informations - Informationen + Informationen Outils - Werkzeuge + Werkzeuge Affichage - + Anzeige Élément - Bauteil + Bauteil Annulation - + Rückgängig: @@ -6557,67 +6558,67 @@ Verfügbare Optionen: C&oller dans la zone - + In einen Bereich einfügen... Un fichier - + einer Datei Un élément - + einem Bauteil À &propos de QElectroTech - Ü&ber QElectroTech + Ü&ber QElectroTech Affiche des informations sur QElectroTech - Zeigt Informationen zu QElectroTech + Informationen zu QElectroTech anzeigen Manuel en ligne - Online Hilfe-Anleitung + Online-Dokumentation (englisch) Lance le navigateur par défaut vers le manuel en ligne de QElectroTech - Öffne die Online Hilfe-Anleitung von QElectroTech im Standard Webbrowser + Online-Dokumentation von QElectroTech im Standard Webbrowser öffnen Chaine Youtube - Youtube Kanal + Youtube-Kanal Lance le navigateur par défaut vers la chaine Youtube de QElectroTech - Öffne den Youtube Kanal von QElectroTech im Standard Webbrowser + Den Youtube-Kanal von QElectroTech im Standard Webbrowser öffnen Soutenir le projet par un don - QElectroTech durch eine Spende unterstützen + QElectroTech durch eine Spende unterstützen Soutenir le projet QElectroTech par un don - Das QElectroTech-Projekt durch eine Spende unterstützen + Das QElectroTech-Projekt durch eine Spende unterstützen À propos de &Qt - Über &Qt + Über &Qt Affiche des informations sur la bibliothèque Qt - Zeigt Informationen zur Qt-Bibliothek + Informationen zur Qt-Bibliothek anzeigen @@ -6739,13 +6740,13 @@ Ausführbar machen: chmod +x ./DXFtoQET Annuler - Abbrechen + Rückgängig: Afficher menu entry - Anzeige von Werkzeugsleisten + Werkzeugsleisten anzeigen @@ -7185,12 +7186,12 @@ les conditions requises ne sont pas valides Manuel en ligne - Online Hilfe-Anleitung + Online-Dokumentation (englisch) Chaine Youtube - Youtube Kanal + Youtube-Kanal @@ -7208,7 +7209,7 @@ les conditions requises ne sont pas valides Lance le navigateur par défaut vers la chaine Youtube de QElectroTech status bar tip - Öffne den Youtube Kanal von QElectroTech im Standard Webbrowser + Öffne den Youtube-Kanal von QElectroTech im Standard Webbrowser @@ -7340,14 +7341,16 @@ Que désirez vous faire ? Avertissement message box title - + Warnung Le projet que vous tentez d'ouvrir est partiellement compatible avec votre version de QElectroTech. Afin de le rendre totalement compatible veuillez ouvrir ce même projet avec la version 0.8 de QElectroTech sauvegarder le projet et l'ouvrir à nouveau avec cette version. Que désirez vous faire ? - + Das Projekt, das Sie öffnen möchten, ist nicht vollständig mit Ihrer Version von QElectroTech kompatibel. +Öffnen Sie das Projekt bitte mit Version 0.8 von QElectroTech und speichern Sie es dann erneut, um es mit sicher dieser Version öffnen zu können. +Was möchten Sie tun? @@ -7736,7 +7739,7 @@ Que désirez vous faire ? un element graphique - + ein grafisches Element @@ -7868,7 +7871,7 @@ Que désirez vous faire ? Modifier les propriétées de l'élément - + Bauteileigenschaften bearbeiten @@ -10067,331 +10070,331 @@ Andere Felder werden nicht verwendet. Pink : Pink element part color - Rosa : Rosa + Rosa: Rosa Pink : LightPink element part color - Rosa : Hellrosa + Rosa: Hellrosa Pink : HotPink element part color - Rosa : Leuchtendes Rosa + Rosa: Leuchtendes Rosa Pink : DeepPink element part color - Rosa : Tiefrosa + Rosa: Tiefrosa Pink : PaleVioletRed element part color - Rosa : Blasses Violettrot + Rosa: Blasses Violettrot Pink : MediumVioletRed element part color - Rosa : Mittleres Violettrot + Rosa: Mittleres Violettrot Red : LightSalmon element part color - Rot : Helle Lachsfarbe + Rot: Helle Lachsfarbe Red : Salmon element part color - Rot : Lachsfarben + Rot: Lachsfarben Red : DarkSalmon element part color - Rot : Dunkle Lachsfarbe + Rot: Dunkle Lachsfarbe Red : LightCoral element part color - Rot : Helles Korallenrot + Rot: Helles Korallenrot Red : IndianRed element part color - Rot : Indischrot + Rot: Indischrot Red : Crimson element part color - Rot : Karmesinrot + Rot: Karmesinrot Red : Firebrick element part color - Rot : Backstein + Rot: Backstein Red : DarkRed element part color - Rot : Dunkelrot + Rot: Dunkelrot Red : Red element part color - Rot : Rot + Rot: Rot Orange : OrangeRed element part color - Orange : Orangerot + Orange: Orangerot Orange : Tomato element part color - Orange : Tomate + Orange: Tomate Orange : Coral element part color - Orange : Koralle + Orange: Koralle Orange : DarkOrange element part color - Orange : Dunkles Orange + Orange: Dunkles Orange Orange : Orange element part color - Orange : Orange + Orange: Orange Yellow : Yellow element part color - Gelb : Gelb + Gelb: Gelb Yellow : LightYellow element part color - Gelb : Hellgelb + Gelb: Hellgelb Yellow : LemonChiffon element part color - Gelb : Chiffongelb + Gelb: Chiffongelb Yellow : LightGoldenrodYellow element part color - Gelb : Helles Goldrutengelb + Gelb: Helles Goldrutengelb Yellow : PapayaWhip element part color - Gelb : Papayacreme + Gelb: Papayacreme Yellow : Moccasin element part color - Gelb : Mokassingelb + Gelb: Mokassingelb Yellow : PeachPuff element part color - Gelb : Pfirsich + Gelb: Pfirsich Yellow : PaleGoldenrod element part color - Gelb : Blasse Goldrutenfarbe + Gelb: Blasse Goldrutenfarbe Yellow : Khaki element part color - Gelb : Khaki + Gelb: Khaki Yellow : DarkKhaki element part color - Gelb : Dunkelkhaki + Gelb: Dunkelkhaki Yellow : Gold element part color - Gelb : Goldgelb + Gelb: Goldgelb Brown : Cornsilk element part color - Braun : Mais + Braun: Mais Brown : BlanchedAlmond element part color - Braun : Mandelweiß + Braun: Mandelweiß Brown : Bisque element part color - Braun : Biskuit + Braun: Biskuit Brown : NavajoWhite element part color - Braun : Navajoweiß + Braun: Navajoweiß Brown : Wheat element part color - Braun : Weizenfarben + Braun: Weizenfarben Brown : Burlywood element part color - Braun : Gelbbraun + Braun: Gelbbraun Brown : Tan element part color - Braun : Hautfarben + Braun: Hautfarben Brown : RosyBrown element part color - Braun : Rosiges Braun + Braun: Rosiges Braun Brown : SandyBrown element part color - Braun : Sandbraun + Braun: Sandbraun Brown : Goldenrod element part color - Braun : Goldrute + Braun: Goldrute Brown : DarkGoldenrod element part color - Braun : Dunkle Goldrutenfarbe + Braun: Dunkle Goldrutenfarbe Brown : Peru element part color - Braun : Peru + Braun: Peru Brown : Chocolate element part color - Baun : Schokoladenbraun + Baun: Schokoladenbraun Brown : SaddleBrown element part color - Braun : Sattelbraun + Braun: Sattelbraun Brown : Sienna element part color - Braun : Siennaerde + Braun: Siennaerde Brown : Brown element part color - Braun : Braun + Braun: Braun Brown : Maroon element part color - Braun : Kastanienfarben + Braun: Kastanienfarben Green : DarkOliveGreen element part color - Grün : Dunkles Olivgrün + Grün: Dunkles Olivgrün Green : Olive element part color - Grün : Olivgrün + Grün: Olivgrün Green : OliveDrab element part color - Grün :Olivgraubraun + Grün:Olivgraubraun Green : YellowGreen element part color - Grün : Gelbgrün + Grün: Gelbgrün Green : LimeGreen element part color - Grün : Limonengrün + Grün: Limonengrün Green : Lime element part color - Grün : Limone + Grün: Limone Green : LawnGreen element part color - Grün : Rasengrün + Grün: Rasengrün @@ -10403,505 +10406,505 @@ Andere Felder werden nicht verwendet. Green : GreenYellow element part color - Grün : Grüngelb + Grün: Grüngelb Green : SpringGreen element part color - Grün : Frühlingsgrün + Grün: Frühlingsgrün Green : MediumSpringGreen element part color - Grün : Mittleres Frühlingsgrün + Grün: Mittleres Frühlingsgrün Green : LightGreen element part color - Grün : Hellgrün + Grün: Hellgrün Green : PaleGreen element part color - Grün : Blassgrün + Grün: Blassgrün Green : DarkSeaGreen element part color - Grün : Dunkles Seegrün + Grün: Dunkles Seegrün Green : MediumAquamarine element part color - Grün : Mittleres Aquamarin + Grün: Mittleres Aquamarin Green : MediumSeaGreen element part color - Grün : Mittleres Seegrün + Grün: Mittleres Seegrün Green : SeaGreen element part color - Grün : Seegrün + Grün: Seegrün Green : ForestGreen element part color - Grün : Waldgrün + Grün: Waldgrün Green : Green element part color - Grün : Grün + Grün: Grün Green : DarkGreen element part color - Grün : Dunkelgrün + Grün: Dunkelgrün Cyan : Aqua element part color - Türkis : Wasser + Türkis: Wasser Cyan : Cyan element part color - Türkis : Türkis + Türkis: Türkis Cyan : LightCyan element part color - Türkis : Helltürkis + Türkis: Helltürkis Cyan : PaleTurquoise element part color - Türkis : Blasstürkis + Türkis: Blasstürkis Cyan : Aquamarine element part color - Türkis : Aquamarinblau + Türkis: Aquamarinblau Cyan : Turquoise element part color - Türkis : Türkis + Türkis: Türkis Cyan : MediumTurquoise element part color - Türkis : Mittleres Türkis + Türkis: Mittleres Türkis Cyan : DarkTurquoise element part color - Türkis : Dunkeltürkis + Türkis: Dunkeltürkis Cyan : LightSeaGreen element part color - Türkis : Helles Seegrün + Türkis: Helles Seegrün Cyan : CadetBlue element part color - Türkis : Kadettenblau + Türkis: Kadettenblau Cyan : DarkCyan element part color - Türkis : Dunkeltürkis + Türkis: Dunkeltürkis Cyan : Teal element part color - Türkis : Krickentengrün + Türkis: Krickentengrün Blue : LightSteelBlue element part color - Blau : Helles Stahlblau + Blau: Helles Stahlblau Blue : PowderBlue element part color - Blau : Taubenblau + Blau: Taubenblau Blue : LightBlue element part color - Blau : Hellblau + Blau: Hellblau Blue : SkyBlue element part color - Blau : Himmelblau + Blau: Himmelblau Blue : LightSkyBlue element part color - Blau : Helles Himmelblau + Blau: Helles Himmelblau Blue : DeepSkyBlue element part color - Blau : Tiefes Himmelblau + Blau: Tiefes Himmelblau Blue : DodgerBlue element part color - Blau : Persenningblau + Blau: Persenningblau Blue : CornflowerBlue element part color - Blau : Kornblumenblau + Blau: Kornblumenblau Blue : SteelBlue element part color - Blau : Stahlblau + Blau: Stahlblau Blue : RoyalBlue element part color - Blau : Königsblau + Blau: Königsblau Blue : Blue element part color - Blau : Blau + Blau: Blau Blue : MediumBlue element part color - Blau : Mittleres Blau + Blau: Mittleres Blau Blue : DarkBlue element part color - Blau : Dunkelblau + Blau: Dunkelblau Blue : Navy element part color - Blau : Marineblau + Blau: Marineblau Blue : MidnightBlue element part color - Blau : Mitternachtsblau + Blau: Mitternachtsblau Purple : Lavender element part color - Violett : Lavendel + Violett: Lavendel Purple : Thistle element part color - Violett : Distel + Violett: Distel Purple : Plum element part color - Violett : Pflaume + Violett: Pflaume Purple : Violet element part color - Violett : Veilchen + Violett: Veilchen Purple : Orchid element part color - Violett : Orchidee + Violett: Orchidee Purple : Fuchsia element part color - Violett : Fuchsia + Violett: Fuchsia Purple : Magenta element part color - Violett : Magenta + Violett: Magenta Purple : MediumOrchid element part color - Violett : Mittlere Orchidee + Violett: Mittlere Orchidee Purple : MediumPurple element part color - Violett : Mittleres Violett + Violett: Mittleres Violett Purple : BlueViolet element part color - Violett : Blauviolett + Violett: Blauviolett Purple : DarkViolet element part color - Violett : Dunkelviolett + Violett: Dunkelviolett Purple : DarkOrchid element part color - Violett : Dunkle Orchidee + Violett: Dunkle Orchidee Purple : DarkMagenta element part color - Violett : Dunkelmagenta + Violett: Dunkelmagenta Purple : Purple element part color - Violett : Violett + Violett: Violett Purple : Indigo element part color - Violett : Indigo + Violett: Indigo Purple : DarkSlateBlue element part color - Violett : Dunkles Schieferblau + Violett: Dunkles Schieferblau Purple : SlateBlue element part color - Violett : Schieferblau + Violett: Schieferblau Purple : MediumSlateBlue element part color - Violett : Mittleres Schieferblau + Violett: Mittleres Schieferblau White : White element part color - Weiß : Weiß + Weiß: Weiß White : Snow element part color - Weiß : Schneeweiß + Weiß: Schneeweiß White : Honeydew element part color - Weiß : Honigmelone + Weiß: Honigmelone White : MintCream element part color - Weiß : Cremige Minze + Weiß: Cremige Minze White : Azure element part color - Weiß : Himmelblau + Weiß: Himmelblau White : AliceBlue element part color - Weiß : Eisfarben + Weiß: Eisfarben White : GhostWhite element part color - Weiß : Geisterweiß + Weiß: Geisterweiß White : WhiteSmoke element part color - Weiß : Rauchfarben + Weiß: Rauchfarben White : Seashell element part color - Weiß : Muschel + Weiß: Muschel White : Beige element part color - Weiß : Beige + Weiß: Beige White : OldLace element part color - Weiß : Alte Spitze + Weiß: Alte Spitze White : FloralWhite element part color - Weiß : Blütenweiß + Weiß: Blütenweiß White : Ivory element part color - Weiß : Elfenbein + Weiß: Elfenbein White : AntiqueWhite element part color - Weiß : Antikweiß + Weiß: Antikweiß White : Linen element part color - Weiß : Leinen + Weiß: Leinen White : LavenderBlush element part color - Weiß : Lavendelrosa + Weiß: Lavendelrosa White : MistyRose element part color - Weiß : Altrosa + Weiß: Altrosa Gray : Gainsboro element part color - Grau : Gainsboro-Grau + Grau: Gainsboro-Grau Gray : LightGray element part color - Grau : Hellgrau + Grau: Hellgrau Gray : Silver element part color - Grau : Silbergrau + Grau: Silbergrau Gray : DarkGray element part color - Grau : Dunkelgrau + Grau: Dunkelgrau Gray : Gray element part color - Grau : Grau + Grau: Grau Gray : DimGray element part color - Grau : Gedämpftes Grau + Grau: Gedämpftes Grau Gray : LightSlateGray element part color - Grau : Helles Schiefergrau + Grau: Helles Schiefergrau Gray : SlateGray element part color - Grau : Schiefergrau + Grau: Schiefergrau Gray : DarkSlateGray element part color - Grau : Dunkles Schiefergrau + Grau: Dunkles Schiefergrau Gray : Black element part color - Grau : Schwarz + Grau: Schwarz @@ -11045,331 +11048,331 @@ Andere Felder werden nicht verwendet. Pink : Pink element part filling - Rosa : Rosa + Rosa: Rosa Pink : LightPink element part filling - Rosa : Hellrosa + Rosa: Hellrosa Pink : HotPink element part filling - Rosa : Leuchtendes Rosa + Rosa: Leuchtendes Rosa Pink : DeepPink element part filling - Rosa : Tiefrosa + Rosa: Tiefrosa Pink : PaleVioletRed element part filling - Rosa : Blasses Violettrot + Rosa: Blasses Violettrot Pink : MediumVioletRed element part filling - Rosa : Mittleres Violettrot + Rosa: Mittleres Violettrot Red : LightSalmon element part filling - Rot : Helle Lachsfarbe + Rot: Helle Lachsfarbe Red : Salmon element part filling - Rot : Lachsfarben + Rot: Lachsfarben Red : DarkSalmon element part filling - Rot : Dunkle Lachsfarbe + Rot: Dunkle Lachsfarbe Red : LightCoral element part filling - Rot : Helles Korallenrot + Rot: Helles Korallenrot Red : IndianRed element part filling - Rot : Indischrot + Rot: Indischrot Red : Crimson element part filling - Rot : Karmesinrot + Rot: Karmesinrot Red : Firebrick element part filling - Rot : Backstein + Rot: Backstein Red : DarkRed element part filling - Rot : Dunkelrot + Rot: Dunkelrot Red : Red element part filling - Rot : Rot + Rot: Rot Orange : OrangeRed element part filling - Orange : Orangerot + Orange: Orangerot Orange : Tomato element part filling - Orange : Tomate + Orange: Tomate Orange : Coral element part filling - Orange : Koralle + Orange: Koralle Orange : DarkOrange element part filling - Orange : Dunkles Orange + Orange: Dunkles Orange Orange : Orange element part filling - Orange : Orange + Orange: Orange Yellow : Yellow element part filling - Gelb : Gelb + Gelb: Gelb Yellow : LightYellow element part filling - Gelb : Hellgelb + Gelb: Hellgelb Yellow : LemonChiffon element part filling - Gelb : Chiffongelb + Gelb: Chiffongelb Yellow : LightGoldenrodYellow element part filling - Gelb : Helles Goldrutengelb + Gelb: Helles Goldrutengelb Yellow : PapayaWhip element part filling - Gelb : Papayacreme + Gelb: Papayacreme Yellow : Moccasin element part filling - Gelb : Mokassingelb + Gelb: Mokassingelb Yellow : PeachPuff element part filling - Gelb : Pfirsich + Gelb: Pfirsich Yellow : PaleGoldenrod element part filling - Gelb : Blasse Goldrutenfarbe + Gelb: Blasse Goldrutenfarbe Yellow : Khaki element part filling - Gelb : Khaki + Gelb: Khaki Yellow : DarkKhaki element part filling - Gelb : Dunkelkhaki + Gelb: Dunkelkhaki Yellow : Gold element part filling - Gelb : Goldgelb + Gelb: Goldgelb Brown : Cornsilk element part filling - Braun : Mais + Braun: Mais Brown : BlanchedAlmond element part filling - Braun : Mandelweiß + Braun: Mandelweiß Brown : Bisque element part filling - Braun : Biskuit + Braun: Biskuit Brown : NavajoWhite element part filling - Braun : Navajoweiß + Braun: Navajoweiß Brown : Wheat element part filling - Braun : Weizenfarben + Braun: Weizenfarben Brown : Burlywood element part filling - Braun : Gelbbraun + Braun: Gelbbraun Brown : Tan element part filling - Braun : Hautfarben + Braun: Hautfarben Brown : RosyBrown element part filling - Braun : Rosiges Braun + Braun: Rosiges Braun Brown : SandyBrown element part filling - Braun : Sandbraun + Braun: Sandbraun Brown : Goldenrod element part filling - Braun : Goldrute + Braun: Goldrute Brown : DarkGoldenrod element part filling - Braun : Dunkle Goldrutenfarbe + Braun: Dunkle Goldrutenfarbe Brown : Peru element part filling - Braun : Peru + Braun: Peru Brown : Chocolate element part filling - Baun : Schokoladenbraun + Braun: Schokoladenbraun Brown : SaddleBrown element part filling - Braun : Sattelbraun + Braun: Sattelbraun Brown : Sienna element part filling - Braun : Siennaerde + Braun: Siennaerde Brown : Brown element part filling - Braun : Braun + Braun: Braun Brown : Maroon element part filling - Braun : Kastanienfarben + Braun: Kastanienfarben Green : DarkOliveGreen element part filling - Grün : Dunkles Olivgrün + Grün: Dunkles Olivgrün Green : Olive element part filling - Grün : Olivgrün + Grün: Olivgrün Green : OliveDrab element part filling - Grün :Olivgraubraun + Grün: Olivgraubraun Green : YellowGreen element part filling - Grün : Gelbgrün + Grün: Gelbgrün Green : LimeGreen element part filling - Grün : Limonengrün + Grün: Limonengrün Green : Lime element part filling - Grün : Limone + Grün: Limone Green : LawnGreen element part filling - Grün : Rasengrün + Grün: Rasengrün @@ -11381,205 +11384,205 @@ Andere Felder werden nicht verwendet. Green : GreenYellow element part filling - Grün : Grüngelb + Grün: Grüngelb Green : SpringGreen element part filling - Grün : Frühlingsgrün + Grün: Frühlingsgrün Green : MediumSpringGreen element part filling - Grün : Mittleres Frühlingsgrün + Grün: Mittleres Frühlingsgrün Green : LightGreen element part filling - Grün : Hellgrün + Grün: Hellgrün Green : PaleGreen element part filling - Grün : Blassgrün + Grün: Blassgrün Green : DarkSeaGreen element part filling - Grün : Dunkles Seegrün + Grün: Dunkles Seegrün Green : MediumAquamarine element part filling - Grün : Mittleres Aquamarin + Grün: Mittleres Aquamarin Green : MediumSeaGreen element part filling - Grün : Mittleres Seegrün + Grün: Mittleres Seegrün Green : SeaGreen element part filling - Grün : Seegrün + Grün: Seegrün Green : ForestGreen element part filling - Grün : Waldgrün + Grün: Waldgrün Green : Green element part filling - Grün : Grün + Grün: Grün Green : DarkGreen element part filling - Grün : Dunkelgrün + Grün: Dunkelgrün Cyan : Aqua element part filling - Türkis : Wasser + Türkis: Wasser Cyan : Cyan element part filling - Türkis : Türkis + Türkis: Türkis Cyan : LightCyan element part filling - Türkis : Helltürkis + Türkis: Helltürkis Cyan : PaleTurquoise element part filling - Türkis : Blasstürkis + Türkis: Blasstürkis Cyan : Aquamarine element part filling - Türkis : Aquamarinblau + Türkis: Aquamarinblau Cyan : Turquoise element part filling - Türkis : Türkis + Türkis: Türkis Cyan : MediumTurquoise element part filling - Türkis : Mittleres Türkis + Türkis: Mittleres Türkis Cyan : DarkTurquoise element part filling - Türkis : Dunkeltürkis + Türkis: Dunkeltürkis Cyan : LightSeaGreen element part filling - Türkis : Helles Seegrün + Türkis: Helles Seegrün Cyan : CadetBlue element part filling - Türkis : Kadettenblau + Türkis: Kadettenblau Cyan : DarkCyan element part filling - Türkis : Dunkeltürkis + Türkis: Dunkeltürkis Cyan : Teal element part filling - Türkis : Krickentengrün + Türkis: Krickentengrün Blue : LightSteelBlue element part filling - Blau : Helles Stahlblau + Blau: Helles Stahlblau Blue : PowderBlue element part filling - Blau : Taubenblau + Blau: Taubenblau Blue : LightBlue element part filling - Blau : Hellblau + Blau: Hellblau Blue : SkyBlue element part filling - Blau : Himmelblau + Blau: Himmelblau Blue : LightSkyBlue element part filling - Blau : Helles Himmelblau + Blau: Helles Himmelblau Blue : DeepSkyBlue element part filling - Blau : Tiefes Himmelblau + Blau: Tiefes Himmelblau Blue : DodgerBlue element part filling - Blau : Persenningblau + Blau: Persenningblau Blue : CornflowerBlue element part filling - Blau : Kornblumenblau + Blau: Kornblumenblau Blue : SteelBlue element part filling - Blau : Stahlblau + Blau: Stahlblau Blue : RoyalBlue element part filling - Blau : Königsblau + Blau: Königsblau @@ -11591,289 +11594,289 @@ Andere Felder werden nicht verwendet. Blue : MediumBlue element part filling - Blau : Mittleres Blau + Blau: Mittleres Blau Blue : DarkBlue element part filling - Blau : Dunkelblau + Blau: Dunkelblau Blue : Navy element part filling - Blau : Marineblau + Blau: Marineblau Blue : MidnightBlue element part filling - Blau : Mitternachtsblau + Blau: Mitternachtsblau Purple : Lavender element part filling - Violett : Lavendel + Violett: Lavendel Purple : Thistle element part filling - Violett : Distel + Violett: Distel Purple : Plum element part filling - Violett : Pflaume + Violett: Pflaume Purple : Violet element part filling - Violett : Veilchen + Violett: Veilchen Purple : Orchid element part filling - Violett : Orchidee + Violett: Orchidee Purple : Fuchsia element part filling - Violett : Fuchsia + Violett: Fuchsia Purple : Magenta element part filling - Violett : Magenta + Violett: Magenta Purple : MediumOrchid element part filling - Violett : Mittlere Orchidee + Violett: Mittlere Orchidee Purple : MediumPurple element part filling - Violett : Mittleres Violett + Violett: Mittleres Violett Purple : BlueViolet element part filling - Violett : Blauviolett + Violett: Blauviolett Purple : DarkViolet element part filling - Violett : Dunkelviolett + Violett: Dunkelviolett Purple : DarkOrchid element part filling - Violett : Dunkle Orchidee + Violett: Dunkle Orchidee Purple : DarkMagenta element part filling - Violett : Dunkelmagenta + Violett: Dunkelmagenta Purple : Purple element part filling - Violett : Violett + Violett: Violett Purple : Indigo element part filling - Violett : Indigo + Violett: Indigo Purple : DarkSlateBlue element part filling - Violett : Dunkles Schieferblau + Violett: Dunkles Schieferblau Purple : SlateBlue element part filling - Violett : Schieferblau + Violett: Schieferblau Purple : MediumSlateBlue element part filling - Violett : Mittleres Schieferblau + Violett: Mittleres Schieferblau White : White element part filling - Weiß : Weiß + Weiß: Weiß White : Snow element part filling - Weiß : Schneeweiß + Weiß: Schneeweiß White : Honeydew element part filling - Weiß : Honigmelone + Weiß: Honigmelone White : MintCream element part filling - Weiß : Cremige Minze + Weiß: Cremige Minze White : Azure element part filling - Weiß : Himmelblau + Weiß: Himmelblau White : AliceBlue element part filling - Weiß : Eisfarben + Weiß: Eisfarben White : GhostWhite element part filling - Weiß : Geisterweiß + Weiß: Geisterweiß White : WhiteSmoke element part filling - Weiß : Rauchfarben + Weiß: Rauchfarben White : Seashell element part filling - Weiß : Muschel + Weiß: Muschel White : Beige element part filling - Weiß : Beige + Weiß: Beige White : OldLace element part filling - Weiß : Alte Spitze + Weiß: Alte Spitze White : FloralWhite element part filling - Weiß : Blütenweiß + Weiß: Blütenweiß White : Ivory element part filling - Weiß : Elfenbein + Weiß: Elfenbein White : AntiqueWhite element part filling - Weiß : Antikweiß + Weiß: Antikweiß White : Linen element part filling - Weiß : Leinen + Weiß: Leinen White : LavenderBlush element part filling - Weiß : Lavendelrosa + Weiß: Lavendelrosa White : MistyRose element part filling - Weiß : Altrosa + Weiß: Altrosa Gray : Gainsboro element part filling - Grau : Gainsboro-Grau + Grau: Gainsboro-Grau Gray : LightGray element part filling - Grau : Hellgrau + Grau: Hellgrau Gray : Silver element part filling - Grau : Silbergrau + Grau: Silbergrau Gray : DarkGray element part filling - Grau : Dunkelgrau + Grau: Dunkelgrau Gray : Gray element part filling - Grau : Grau + Grau: Grau Gray : DimGray element part filling - Grau : Gedämpftes Grau + Grau: Gedämpftes Grau Gray : LightSlateGray element part filling - Grau : Helles Schiefergrau + Grau: Helles Schiefergrau Gray : SlateGray element part filling - Grau : Schiefergrau + Grau: Schiefergrau Gray : DarkSlateGray element part filling - Grau : Dunkles Schiefergrau + Grau: Dunkles Schiefergrau @@ -12040,57 +12043,57 @@ Andere Felder werden nicht verwendet. Générique - + Generisch Bornier intérieur - + interner Kontakt Bornier extérieur - + externer Kontakt Modifier le nom du terminal - Namen des Terminals ändern + Name des Anschlusses ändern Modifier le type d'une borne - + Typ des Anschlusses ändern Form - + Form y : - + y: Orientation : - + Ausrichtung: x : - + x: Nom : - Name: + Name: Type : - Typ: + Typ: diff --git a/lang/qet_hu.qm b/lang/qet_hu.qm index efae805bb..580cf19db 100644 Binary files a/lang/qet_hu.qm and b/lang/qet_hu.qm differ diff --git a/lang/qet_hu.ts b/lang/qet_hu.ts index 544b5bd1a..8d4f3880d 100644 --- a/lang/qet_hu.ts +++ b/lang/qet_hu.ts @@ -1136,7 +1136,7 @@ Megjegyzés: ezek a lehetőségek NEM engedélyezik, vagy blokkolják az Automat X: %1 Y: %2 - + X: %1 Y: %2 @@ -1820,12 +1820,12 @@ Megjegyzés: ezek a lehetőségek NEM engedélyezik, vagy blokkolják az Automat Élément bornier - + Sorkapocs elem Fonction - Funkció + Funkció @@ -1927,37 +1927,37 @@ Megjegyzés: ezek a lehetőségek NEM engedélyezik, vagy blokkolják az Automat Générique - + Általános Fusible - + Biztosíték Séctionnable - + Választható Diode - + Dióda Phase - Fázis + Fázis Neutre - Nulla + Nulla Terre - + Föld @@ -2709,7 +2709,7 @@ Az összes elem és fájl a mappában törölve lesz. Nom de fichier - Fáljnév + Fájlnév @@ -5149,7 +5149,7 @@ Az összeférhetetlen változók a következők: Fichier (*.pdf) - + Fájl (*.pdf) @@ -6497,47 +6497,47 @@ Elérhető lehetőségek: QElectroTech - Éditeur d'élément - QElectroTech - Elem Szerkesztő + QElectroTech - Elem Szerkesztő &Aide - &Segítség + &Segítség Annulations - Visszavonás + Visszavonás Parties - Alkatrészek + Alkatrészek Informations - Információ + Információ Outils - Eszközök + Eszközök Affichage - Megjelenítés + Megjelenítés Élément - Elem + Elem Annulation - + Visszavonás @@ -6562,67 +6562,67 @@ Elérhető lehetőségek: C&oller dans la zone - + &Beillesztés a területre Un fichier - + Egy fájl Un élément - + Egy elem À &propos de QElectroTech - &A QElectroTech-ről + &A QElectroTech-ről Affiche des informations sur QElectroTech - Információk megjelenítése a QElectroTech + Információk megjelenítése a QElectroTech Manuel en ligne - Interneten elérhető felhasználói kézikönyv + Interneten elérhető felhasználói kézikönyv Lance le navigateur par défaut vers le manuel en ligne de QElectroTech - Az alapértelmezett böngésző elindítása az internetes QElectrotech felhasználói kézikönyvhöz + Az alapértelmezett böngésző elindítása az internetes QElectrotech felhasználói kézikönyvhöz Chaine Youtube - Youtube csatorna + Youtube csatorna Lance le navigateur par défaut vers la chaine Youtube de QElectroTech - Az alapértelmezett böngésző elindítása a QElectrotech Youtube csatornájához + Az alapértelmezett böngésző elindítása a QElectrotech Youtube csatornájához Soutenir le projet par un don - A projekt támogatása adománnyal + A projekt támogatása adománnyal Soutenir le projet QElectroTech par un don - A QElectroTech projekt támogatása adománnyal + A QElectroTech projekt támogatása adománnyal À propos de &Qt - &Rólunk + &Rólunk Affiche des informations sur la bibliothèque Qt - Információk megjelenítése a Qt könyvtárról + Információk megjelenítése a Qt könyvtárról @@ -6957,7 +6957,7 @@ végrahajtásához : chmod +x ./DXFtoQET Afficher menu entry - Megjelenítés + Megjelenítés @@ -7343,14 +7343,16 @@ Que désirez vous faire ? Avertissement message box title - + Figyelem Le projet que vous tentez d'ouvrir est partiellement compatible avec votre version de QElectroTech. Afin de le rendre totalement compatible veuillez ouvrir ce même projet avec la version 0.8 de QElectroTech sauvegarder le projet et l'ouvrir à nouveau avec cette version. Que désirez vous faire ? - + A megnyitni kívánt projekt részben kompatibilis a QElectroTech verziójával. +Annak érdekében, hogy teljes mértékben kompatibilis legyen, kérjük, nyissa meg ugyanazt a projektet a QElectroTech 0.8 verziójával, mentse a projektet, és nyissa meg újra ezzel a verzióval. +Mit akarsz csinálni? @@ -7745,7 +7747,7 @@ Que désirez vous faire ? un element graphique - + egy grafikus elem @@ -7918,7 +7920,7 @@ Que désirez vous faire ? Modifier les propriétées de l'élément - + Elem tulajdonságainak szerkesztése @@ -8641,7 +8643,7 @@ Cserélni akarod? Nom du fichier - Fáljnév + Fájlnév @@ -12032,17 +12034,17 @@ A többi mező nincs használva. Générique - + Általános Bornier intérieur - + Belső sorkapocs Bornier extérieur - + Külső sorkapocs @@ -12052,37 +12054,37 @@ A többi mező nincs használva. Modifier le type d'une borne - + A csatlakozó típusának megváltoztatása Form - + Űrlap y : - + y : Orientation : - + Tájolás : x : - + x : Nom : - + Név: Type : - Típus : + Típus : diff --git a/lang/qet_nl.qm b/lang/qet_nl.qm index e96797c53..2797e78d4 100644 Binary files a/lang/qet_nl.qm and b/lang/qet_nl.qm differ diff --git a/lang/qet_nl.ts b/lang/qet_nl.ts index 0bd2814a5..03c6b14fd 100644 --- a/lang/qet_nl.ts +++ b/lang/qet_nl.ts @@ -1127,7 +1127,7 @@ Noot: Geen van deze opties bepalen het wel of niet automatisch nummeren, alleen X: %1 Y: %2 - + X: %1 Y: %2 @@ -1811,12 +1811,12 @@ Noot: Geen van deze opties bepalen het wel of niet automatisch nummeren, alleen Élément bornier - + Elementaansluiting Fonction - Functie + Functie @@ -1918,37 +1918,37 @@ Noot: Geen van deze opties bepalen het wel of niet automatisch nummeren, alleen Générique - + Algemeen Fusible - + Zekering Séctionnable - + Deelbaar Diode - + Diode Phase - Fase + Fase Neutre - Nul + Nul Terre - Aarde + Aarde @@ -5141,7 +5141,7 @@ De volgende variabelen zijn compatibel : Fichier (*.pdf) - + Bestand (*.pdf) @@ -6474,47 +6474,47 @@ Opties : QElectroTech - Éditeur d'élément - QElectroTech - Elementbewerker + QElectroTech - Elementbewerker &Aide - &Help + &Help Annulations - Geschiedenis + Geschiedenis Parties - Onderdelen + Onderdelen Informations - Informatie + Informatie Outils - + Gereedschappen Affichage - Weergave + Weergave Élément - Element + Element Annulation - + Geschiedenis @@ -6524,17 +6524,17 @@ Opties : C&oller dans la zone - + P&lakken in gebied Un fichier - + Een bestand Un élément - + Een element @@ -6549,52 +6549,52 @@ Opties : À &propos de QElectroTech - O&ver QElectroTech + O&ver QElectroTech Affiche des informations sur QElectroTech - Toon informatie over QElectroTech + Toon informatie over QElectroTech Manuel en ligne - Online gebruiksaanwijzing + Online gebruiksaanwijzing Lance le navigateur par défaut vers le manuel en ligne de QElectroTech - Bekijk met de standaardbrowser de online gebruiksaanwijzing van QElectroTech + Bekijk met de standaardbrowser de online gebruiksaanwijzing van QElectroTech Chaine Youtube - YouTube-kanaal + YouTube-kanaal Lance le navigateur par défaut vers la chaine Youtube de QElectroTech - Ga met de standaardbrowser naar het YouTube-kanaal van QElectroTech + Ga met de standaardbrowser naar het YouTube-kanaal van QElectroTech Soutenir le projet par un don - Steun het project met een donatie + Steun het project met een donatie Soutenir le projet QElectroTech par un don - Steun het QElectroTech-project met een donatie + Steun het QElectroTech-project met een donatie À propos de &Qt - Over &Qt + Over &Qt Affiche des informations sur la bibliothèque Qt - Toon informatie over Qt bibliotheek + Toon informatie over Qt bibliotheek @@ -6941,7 +6941,7 @@ de DXFtoQET.app binary in /Users/user_name/.qet/ directory Afficher menu entry - Weergave van panelen en werkbalken + Weergave van panelen en werkbalken @@ -7339,14 +7339,16 @@ Que désirez vous faire ? Avertissement message box title - + Waarschuwing Le projet que vous tentez d'ouvrir est partiellement compatible avec votre version de QElectroTech. Afin de le rendre totalement compatible veuillez ouvrir ce même projet avec la version 0.8 de QElectroTech sauvegarder le projet et l'ouvrir à nouveau avec cette version. Que désirez vous faire ? - + Het project dat u wilt openen is niet volledig compatibel met deze versie van Qelectrotech. +Om dit project compatibel te maken met Qelectrotech versie 0.8 slaat u het met deze versie op en opent u het opnieuw. +Wilt u dit doen ? @@ -7750,7 +7752,7 @@ Que désirez vous faire ? un element graphique - + een grafisch element @@ -8061,7 +8063,7 @@ Que désirez vous faire ? Modifier les propriétées de l'élément - + Eigenschappen van het element wijzigen @@ -12038,17 +12040,17 @@ De andere velden hebben nu geen betekenis. Générique - + Algemeen Bornier intérieur - + Interne aansluiting Bornier extérieur - + Externe aansluiting @@ -12058,37 +12060,37 @@ De andere velden hebben nu geen betekenis. Modifier le type d'une borne - + Type aansluiting wijzigen Form - + Aansluiting wijzigen y : - + y : Orientation : - + Oriëntatie : x : - + x : Nom : - + Naam : Type : - + Type : diff --git a/sources/editor/ui/elementpropertieseditorwidget.cpp b/sources/editor/ui/elementpropertieseditorwidget.cpp index 23db80ddf..dbdabafcc 100644 --- a/sources/editor/ui/elementpropertieseditorwidget.cpp +++ b/sources/editor/ui/elementpropertieseditorwidget.cpp @@ -188,13 +188,13 @@ void ElementPropertiesEditorWidget::updateTree() */ void ElementPropertiesEditorWidget::populateTree() { - auto keys = QETInformation::elementEditorElementInfoKeys(); + const auto keys = QETInformation::elementEditorElementInfoKeys(); for(const QString& key : keys) { QTreeWidgetItem *qtwi = new QTreeWidgetItem(ui->m_tree); qtwi->setFlags(Qt::ItemIsEnabled | Qt::ItemIsEditable); qtwi->setData(0, Qt::DisplayRole, - QETInformation::translatedInfoKey(key)); + QETInformation::translatedInfoKey(key)); qtwi->setData(0, Qt::UserRole, key); qtwi->setText(1, m_data.m_informations.value(key).toString()); } @@ -256,6 +256,8 @@ void ElementPropertiesEditorWidget::on_m_base_type_cb_currentIndexChanged(int in ui->m_slave_gb->setVisible(slave); ui->m_master_gb->setVisible(master); ui->m_terminal_gb->setVisible(terminal); - + ui->tabWidget->setTabVisible(1, + (type_ == ElementData::Simple || + type_ == ElementData::Master)); updateTree(); } diff --git a/sources/qetgraphicsitem/element.cpp b/sources/qetgraphicsitem/element.cpp index 404f4f935..0a57c5d2a 100644 --- a/sources/qetgraphicsitem/element.cpp +++ b/sources/qetgraphicsitem/element.cpp @@ -1325,6 +1325,15 @@ void Element::setElementInformations(DiagramContext dc) emit elementInfoChange(old_info, m_data.m_informations); } +/** + * @brief Element::elementData + * @return the element data used by this element + */ +ElementData Element::elementData() const +{ + return m_data; +} + /** @brief comparPos Compare position of the two elements. Compare 3 points: diff --git a/sources/qetgraphicsitem/element.h b/sources/qetgraphicsitem/element.h index 8f4a23d6c..2087cf379 100644 --- a/sources/qetgraphicsitem/element.h +++ b/sources/qetgraphicsitem/element.h @@ -1,4 +1,4 @@ -/* +/* Copyright 2006-2021 The QElectroTech Team This file is part of QElectroTech. @@ -103,6 +103,15 @@ class Element : public QetGraphicsItem // TODO: derive from propertiesInterface! DiagramContext elementInformations()const {return m_data.m_informations;} virtual void setElementInformations(DiagramContext dc); + + ElementData elementData() const; + + /** + * @brief kindInformations + * @deprecated + * use elementData function instead + * @return + */ DiagramContext kindInformations() const {return m_kind_informations;} //@kind_information_ is used to store more information @@ -159,8 +168,20 @@ class Element : public QetGraphicsItem // TODO: derive from propertiesInterface! virtual void unlinkElement(Element *) {} virtual void initLink(QETProject *); QList linkedElements (); + + /** + * @brief linkType + * use elementData function instead + * @return + */ virtual kind linkType() const {return m_link_type;} // return the linkable type + /** + * @brief linkTypeToString + * use elementData function instead + * @return + */ QString linkTypeToString() const; + void newUuid() {m_uuid = QUuid::createUuid();} //create new uuid for this element protected: diff --git a/sources/qetinformation.cpp b/sources/qetinformation.cpp index 817c41857..1206f6420 100644 --- a/sources/qetinformation.cpp +++ b/sources/qetinformation.cpp @@ -255,3 +255,16 @@ QStringList QETInformation::elementEditorElementInfoKeys() ELMT_MACHINE_MANUFACTURER_REF}; return list; } + +QStringList QETInformation::terminalElementInfoKeys() +{ + QStringList list = { ELMT_FORMULA, + ELMT_LABEL, + ELMT_COMMENT, + ELMT_DESIGNATION, + ELMT_MANUFACTURER, + ELMT_MANUFACTURER_REF, + ELMT_MACHINE_MANUFACTURER_REF, + ELMT_SUPPLIER }; + return list; +} diff --git a/sources/qetinformation.h b/sources/qetinformation.h index 7fc0aa2f5..6dbfde862 100644 --- a/sources/qetinformation.h +++ b/sources/qetinformation.h @@ -108,6 +108,8 @@ namespace QETInformation QStringList elementEditorElementInfoKeys(); QString elementInfoToVar(const QString &info); + QStringList terminalElementInfoKeys(); + QString infoToVar(const QString &info); QString translatedInfoKey(const QString &info); } diff --git a/sources/ui/elementinfowidget.cpp b/sources/ui/elementinfowidget.cpp index 50924010b..e4978d624 100644 --- a/sources/ui/elementinfowidget.cpp +++ b/sources/ui/elementinfowidget.cpp @@ -37,7 +37,6 @@ ElementInfoWidget::ElementInfoWidget(Element *elmt, QWidget *parent) : m_first_activation (false) { ui->setupUi(this); - buildInterface(); setElement(elmt); } @@ -179,7 +178,14 @@ void ElementInfoWidget::disableLiveEdit() */ void ElementInfoWidget::buildInterface() { - for (auto str : QETInformation::elementInfoKeys()) + QStringList keys; + auto type_ = m_element.data()->elementData().m_type; + if (type_ == ElementData::Terminale) + keys = QETInformation::terminalElementInfoKeys(); + else + keys = QETInformation::elementInfoKeys(); + + for (auto str : keys) { ElementInfoPartWidget *eipw = new ElementInfoPartWidget(str, QETInformation::translatedInfoKey(str), this); ui->scroll_vlayout->addWidget(eipw); @@ -212,6 +218,10 @@ ElementInfoPartWidget *ElementInfoWidget::infoPartWidgetForKey(const QString &ke */ void ElementInfoWidget::updateUi() { + if (!m_ui_builded) { + buildInterface(); + m_ui_builded = true; + } //We disable live edit to avoid wrong undo when we fill the line edit with new text if (m_live_edit) disableLiveEdit(); diff --git a/sources/ui/elementinfowidget.h b/sources/ui/elementinfowidget.h index 9b01b688a..c2942cc15 100644 --- a/sources/ui/elementinfowidget.h +++ b/sources/ui/elementinfowidget.h @@ -72,6 +72,7 @@ class ElementInfoWidget : public AbstractElementPropertiesEditorWidget Ui::ElementInfoWidget *ui; QList m_eipw_list; bool m_first_activation; + bool m_ui_builded = false; }; #endif // ELEMENTINFOWIDGET_H