Compare commits

..

7 Commits

Author SHA1 Message Date
joshua
a6e55e1918 Fix wrong element type 2021-02-24 20:51:33 +01:00
joshua
3f586b0b8e Fix wrong element type 2021-02-24 20:51:03 +01:00
Laurent Trinques
8ccfb93e89 DiagramView::mouseMoveEvent remove "DEV" in toolTip message mouse
postion
2021-02-24 19:44:12 +01:00
Lars Biskupek
54e2af4fb2 Tab-stop definitions inserted where appropriate
Tab stop definitions inserted in some dialogs, so that the order of tab-stops-moves corresponds as closely as possible to the fields' position in the window.
2021-02-24 19:43:37 +01:00
Lars Biskupek
3e95b51af6 Modifications to SaveFile-Dialog for "Save As PDF"
Fixed a typo that prevented existing PDF files from being displayed in SaveFileDialog for PDFs.

The way the file name for the PDF is generated has changed. If the project has already been saved, the PDF has the same file name (with .pdf of course); If not, the file name is generated from the project title (= same behavior as Save as - dialog for a .qet project file).
2021-02-24 19:43:04 +01:00
joshua
fb58ecacfc Fix typo
Fixed a typo that resulted in existing PDF files not being displayed in
the dialog box "Save As PDF".
Thanks Bisku
2021-02-24 19:42:26 +01:00
Pawel Śmiech
8053303ce5 Polish translation updated
Signed-off-by: Pawel Śmiech <pawel@localhost.localdomain>
2021-02-24 19:41:27 +01:00
2142 changed files with 170022 additions and 210028 deletions

View File

@@ -19,7 +19,7 @@ include(cmake/hoto_update_cmake_message.cmake)
cmake_minimum_required(VERSION 3.14...3.19 FATAL_ERROR) cmake_minimum_required(VERSION 3.14...3.19 FATAL_ERROR)
project(qelectrotech project(qelectrotech
VERSION 0.9.0 VERSION 0.8.0
DESCRIPTION "QET is a CAD/CAE editor focusing on schematics drawing features." DESCRIPTION "QET is a CAD/CAE editor focusing on schematics drawing features."
HOMEPAGE_URL "https://qelectrotech.org/" HOMEPAGE_URL "https://qelectrotech.org/"
LANGUAGES CXX) LANGUAGES CXX)
@@ -131,32 +131,3 @@ target_include_directories(
${QET_DIR}/sources/factory/ui ${QET_DIR}/sources/factory/ui
${QET_DIR}/sources/print ${QET_DIR}/sources/print
) )
install(TARGETS ${PROJECT_NAME})
if (NOT MINGW)
install(DIRECTORY ico/breeze-icons/16x16 DESTINATION ${QET_ICONS_PATH})
install(DIRECTORY ico/breeze-icons/22x22 DESTINATION ${QET_ICONS_PATH})
install(DIRECTORY ico/breeze-icons/32x32 DESTINATION ${QET_ICONS_PATH})
install(DIRECTORY ico/breeze-icons/48x48 DESTINATION ${QET_ICONS_PATH})
install(DIRECTORY ico/breeze-icons/64x64 DESTINATION ${QET_ICONS_PATH})
install(DIRECTORY ico/breeze-icons/128x128 DESTINATION ${QET_ICONS_PATH})
install(DIRECTORY ico/breeze-icons/256x256 DESTINATION ${QET_ICONS_PATH})
install(DIRECTORY elements DESTINATION share/qelectrotech)
install(DIRECTORY examples DESTINATION share/qelectrotech)
install(DIRECTORY titleblocks DESTINATION share/qelectrotech)
install(FILES LICENSE ELEMENTS.LICENSE CREDIT README ChangeLog DESTINATION share/doc/qelectrotech)
install(FILES misc/qelectrotech.desktop DESTINATION share/applications)
install(FILES misc/x-qet-element.xml
misc/x-qet-project.xml
misc/x-qet-titleblock.xml
DESTINATION share/mime/application)
install(FILES misc/x-qet-element.desktop
misc/x-qet-project.desktop
misc/x-qet-titleblock.desktop
DESTINATION share/mimelnk/application)
install(FILES misc/qelectrotech.xml DESTINATION share/mime/packages)
install(FILES misc/qelectrotech.appdata.xml DESTINATION ${QET_APPDATA_PATH})
install(FILES ${QM_FILES} DESTINATION ${QET_LANG_PATH})
endif()

View File

@@ -15,10 +15,10 @@ The main goal of the developers is to provide a libre, easy to use and effective
### Version ### Version
The current stable version is 0.80 and was released on 2021.02.21. The current stable version is 0.70 and was released on 2019.07.13.
Once it has been officialy released, the stable version is always frozen and is no longer developed. Once it has been officialy released, the stable version is always frozen and is no longer developed.
New functionalities, bug and issue fixings are further made in the development version (currently 0.9), which can also be [downloaded](https://qelectrotech.org/download.html). New functionalities, bug and issue fixings are further made in the development version (currently 0.8), which can also be [downloaded](https://qelectrotech.org/download.html).
Users who want to test and take benefits from the last software implementations should use the development version. But... use it at your own risk, since things are sometimes broken or only partialy implemented until they are done! Users who want to test and take benefits from the last software implementations should use the development version. But... use it at your own risk, since things are sometimes broken or only partialy implemented until they are done!
@@ -33,7 +33,6 @@ Like many other open source softwares, QElectroTech is provided as it is, withou
### Development / technical choices ### Development / technical choices
The development follows the classical way of free and open source software: the source code, written by a community of users, is freely accessible. The development follows the classical way of free and open source software: the source code, written by a community of users, is freely accessible.
If you are reading this on Github, be aware that this is an hourly synced mirror. Our real code repository [is located here](https://git.tuxfamily.org/qet/qet.git/).
Here are the technical choices made for the software development: Here are the technical choices made for the software development:
@@ -154,52 +153,6 @@ Alternatively, you can export to vector (svg) or pixel (png, jpg, bmp) format im
* conductors num can be exported to csv file. * conductors num can be exported to csv file.
* *** * ***
Nomenclature
A new nomenclature tool appears in the menu: project -> Add a nomenclature.
The nomenclature is presented in the form of a configurable table separated into two parts: the display (the form) and the content (the background).
- Display: the size and position of the table, the margins between text and the table cell, the alignment of the text in the cells and the font. The configuration of the table headers and the table itself are separate.
- Content: the information to display in the table and the order in which it should be displayed.
![](https://download.tuxfamily.org/qet/images_depeche_linuxfr/08/dialogue_nomenclature.png "nomenclature dialogue")
In order to speed up the establishment of a nomenclature, it is possible to export / import the display and content configurations separately. This is the "Configuration" part that can be seen in the photos above.
Behind the scenes, an SQLite database does the work, so setting up the content is nothing more or less than an SQL query created using a dialog (screenshot by right).
The SQL query is configured as follows (from top to bottom in the screenshot):
- “Available information”: the information to display;
- "Filter": filter the information (is not empty, is empty, contains, does not contain, is equal to, is not equal to) only one filter can be applied per information, it is not possible combine several;
- "Type of elements": allows you to filter on what type of element you want to obtain information.
At the bottom, a checkmark "SQL query" allows you to edit a personalized query, if the basic options are not sufficient.
When a nomenclature is too large to be contained in a single folio, it is possible to separate it on several folios, the tables of each folio are then linked together. When creating a nomenclature, this option is activated by default, which has the effect of adding the necessary number of folios, adding a table in each of them and linking them together.
Finally two buttons are available in the property panel:
- "Fit the table to the folio": positions and adjusts the size and determines the number of rows in the table in relation to the folio;
- "Apply geometry to all tables linked to this one": applies the three properties mentioned above to all linked tables in order to save time and maintain aesthetic consistency.
And to finish a table
![](https://download.tuxfamily.org/qet/images_depeche_linuxfr/08/tableau.png "table")
Summary
The old summary has been completely removed from the code in order to make room for the new one which is exactly the same as the nomenclature (a large amount of the code is common), with the exception of the SQL query (and its dialog to configure it) which offers specific information for editing a summary.
Export of the internal database
The database used by the nomenclature and the summary can be exported in a “.sqlite” file.
Currently this is irrelevant, as the function was created during development for debugging purposes, we left it.
Note that the database will become increasingly important in the future of Qet.
Export of the wiring list
In order to be able to use the wiring number printers more easily, the names of conductors can be exported in CSV format, the export respects the quantity of conductors in order to print the right quantity of numbers, for example a potential numbered 240 composed of 3 wires will give 6 × 240 (2 numbers per wire × 3 wires) in the CSV.
### Story ### Story
The QElectroTech project was founded in 2007 by two french students, Xavier and Benoit. The QElectroTech project was founded in 2007 by two french students, Xavier and Benoit.
@@ -219,7 +172,7 @@ Nowadays, QET is not only used by many individuals, teachers and students but al
If you love QElectroTech, you can help developers to buy new hardware to test If you love QElectroTech, you can help developers to buy new hardware to test
and implement new features. Thanks in advance for your generous donations. and implement new features. Thanks in advance for your generous donations.
For more information, look at [Paypal](https://www.paypal.com/donate/?token=rqf80cP0Ck1F2jn4Y46G7tIPv9bq7x0crXkwt3GZ6OZYG6ihJYi8lZxmmQ8itsFwMUdd1G&country.x=GB&locale.x=GB) For more information, look at [Paypal](https://www.paypal.com/donate/?token=rqf80cP0Ck1F2jn4Y46G7tIPv9bq7x0crXkwt3GZ6OZYG6ihJYi8lZxmmQ8itsFwMUdd1G&country.x=GB&locale.x=GB)
or at [leetchi.com](https://www.leetchi.com/c/qelectroteck)

View File

@@ -1,79 +1,12 @@
Changelog 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__ __3.0.18__
---------- ----------
* Fallback to standard QApplication class on iOS and Android systems where * Fallback to standard QApplication class on iOS and Android systems where
the library is not supported. the library is not supported.
* Added Build CI tests to verify the library builds successfully on Linux, Windows and MacOS across multiple Qt versions. * Added Build CI tests to verify the library builds successfully on Linux, Windows and MacOS across multiple Qt versions.
_Anton Filimonov_ _Anton Filimonov_

View File

@@ -1,40 +1,43 @@
cmake_minimum_required(VERSION 3.7.0) cmake_minimum_required(VERSION 3.1.0)
project(SingleApplication LANGUAGES CXX) project(SingleApplication)
set(CMAKE_INCLUDE_CURRENT_DIR ON)
set(CMAKE_AUTOMOC 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 add_library(${PROJECT_NAME} STATIC
singleapplication.cpp singleapplication.cpp
singleapplication_p.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 dependencies
set(QT_COMPONENTS Core Network) find_package(Qt5Network)
set(QT_LIBRARIES Qt${QT_DEFAULT_MAJOR_VERSION}::Core Qt${QT_DEFAULT_MAJOR_VERSION}::Network)
if(QAPPLICATION_CLASS STREQUAL QApplication) if(QAPPLICATION_CLASS STREQUAL QApplication)
list(APPEND QT_COMPONENTS Widgets) find_package(Qt5 COMPONENTS Widgets REQUIRED)
list(APPEND QT_LIBRARIES Qt${QT_DEFAULT_MAJOR_VERSION}::Widgets)
elseif(QAPPLICATION_CLASS STREQUAL QGuiApplication) elseif(QAPPLICATION_CLASS STREQUAL QGuiApplication)
list(APPEND QT_COMPONENTS Gui) find_package(Qt5 COMPONENTS Gui REQUIRED)
list(APPEND QT_LIBRARIES Qt${QT_DEFAULT_MAJOR_VERSION}::Gui)
else() else()
set(QAPPLICATION_CLASS QCoreApplication) find_package(Qt5 COMPONENTS Core REQUIRED)
endif() endif()
add_compile_definitions(QAPPLICATION_CLASS=${QAPPLICATION_CLASS})
find_package(Qt${QT_DEFAULT_MAJOR_VERSION} COMPONENTS ${QT_COMPONENTS} REQUIRED) # Link dependencies
target_link_libraries(${PROJECT_NAME} PRIVATE Qt5::Network)
target_link_libraries(${PROJECT_NAME} PUBLIC ${QT_LIBRARIES}) if(QAPPLICATION_CLASS STREQUAL QApplication)
target_link_libraries(${PROJECT_NAME} PRIVATE Qt5::Widgets)
elseif(QAPPLICATION_CLASS STREQUAL QGuiApplication)
target_link_libraries(${PROJECT_NAME} PRIVATE Qt5::Gui)
else()
target_link_libraries(${PROJECT_NAME} PRIVATE Qt5::Core)
endif()
if(WIN32) if(WIN32)
target_link_libraries(${PROJECT_NAME} PRIVATE advapi32) target_link_libraries(${PROJECT_NAME} PRIVATE advapi32)
endif() endif()
target_compile_definitions(${PROJECT_NAME} PUBLIC QAPPLICATION_CLASS=${QAPPLICATION_CLASS})
target_include_directories(${PROJECT_NAME} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) target_include_directories(${PROJECT_NAME} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})

View File

@@ -1,6 +1,6 @@
The MIT License (MIT) The MIT License (MIT)
Copyright (c) Itay Grudev 2015 - 2020 Copyright (c) Itay Grudev 2015 - 2016
Permission is hereby granted, free of charge, to any person obtaining a copy Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal of this software and associated documentation files (the "Software"), to deal

View File

@@ -1,8 +1,7 @@
SingleApplication 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` and `Qt6`. This is a replacement of the QtSingleApplication for `Qt5`.
Keeps the Primary Instance of your Application and kills each subsequent Keeps the Primary Instance of your Application and kills each subsequent
instances. It can (if enabled) spawn secondary (non-related to the primary) instances. It can (if enabled) spawn secondary (non-related to the primary)
@@ -16,6 +15,18 @@ 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` default). Further usage is similar to the use of the `Q[Core|Gui]Application`
classes. 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 You can use the library as if you use any other `QCoreApplication` derived
class: class:
@@ -32,7 +43,8 @@ int main( int argc, char* argv[] )
``` ```
To include the library files I would recommend that you add it as a git To include the library files I would recommend that you add it as a git
submodule to your project. Here is how: submodule to your project and include it's contents with a `.pri` file. Here is
how:
```bash ```bash
git submodule add git@github.com:itay-grudev/SingleApplication.git singleapplication git submodule add git@github.com:itay-grudev/SingleApplication.git singleapplication
@@ -54,27 +66,13 @@ Then include the subdirectory in your `CMakeLists.txt` project file.
```cmake ```cmake
set(QAPPLICATION_CLASS QApplication CACHE STRING "Inheritance class for SingleApplication") set(QAPPLICATION_CLASS QApplication CACHE STRING "Inheritance class for SingleApplication")
add_subdirectory(src/third-party/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 Also don't forget to specify which `QCoreApplication` class your app is using if it
is not `QCoreApplication` as in examples above. is not `QCoreApplication` as in examples above.
The `Instance Started` signal The `Instance Started` signal
----------------------------- ------------------------
The SingleApplication class implements a `instanceStarted()` signal. You can The SingleApplication class implements a `instanceStarted()` signal. You can
bind to that signal to raise your application's window when a new instance had bind to that signal to raise your application's window when a new instance had
@@ -139,22 +137,13 @@ app.isSecondary();
*__Note:__ If your Primary Instance is terminated a newly launched instance *__Note:__ If your Primary Instance is terminated a newly launched instance
will replace the Primary one even if the Secondary flag has been set.* 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 API
--- ---
### Members ### Members
```cpp ```cpp
SingleApplication::SingleApplication( int &argc, char *argv[], bool allowSecondary = false, Options options = Mode::User, int timeout = 100, QString userData = QString() ) SingleApplication::SingleApplication( int &argc, char *argv[], bool allowSecondary = false, Options options = Mode::User, int timeout = 100 )
``` ```
Depending on whether `allowSecondary` is set, this constructor may terminate Depending on whether `allowSecondary` is set, this constructor may terminate
@@ -163,7 +152,7 @@ can be specified to set whether the SingleApplication block should work
user-wide or system-wide. Additionally the `Mode::SecondaryNotification` may be user-wide or system-wide. Additionally the `Mode::SecondaryNotification` may be
used to notify the primary instance whenever a secondary instance had been used to notify the primary instance whenever a secondary instance had been
started (disabled by default). `timeout` specifies the maximum time in started (disabled by default). `timeout` specifies the maximum time in
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. milliseconds to wait for blocking operations.
*__Note:__ `argc` and `argv` may be changed as Qt removes arguments that it *__Note:__ `argc` and `argv` may be changed as Qt removes arguments that it
recognizes.* recognizes.*
@@ -215,22 +204,6 @@ qint64 SingleApplication::primaryPid()
Returns the process ID (PID) of the primary instance. 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 ### Signals
```cpp ```cpp

View File

@@ -1 +0,0 @@
#include "singleapplication.h"

View File

@@ -1,12 +0,0 @@
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)

0
SingleApplication/examples/basic/basic.pro Executable file → Normal file
View File

2
SingleApplication/examples/basic/main.cpp Executable file → Normal file
View File

@@ -5,7 +5,5 @@ int main(int argc, char *argv[])
// Allow secondary instances // Allow secondary instances
SingleApplication app( argc, argv ); SingleApplication app( argc, argv );
qWarning() << "Started a new instance";
return app.exec(); return app.exec();
} }

View File

@@ -1,21 +0,0 @@
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)

View File

@@ -82,27 +82,27 @@ Calculator::Calculator(QWidget *parent)
digitButtons[i] = createButton(QString::number(i), SLOT(digitClicked())); digitButtons[i] = createButton(QString::number(i), SLOT(digitClicked()));
} }
Button *pointButton = createButton(".", SLOT(pointClicked())); Button *pointButton = createButton(tr("."), SLOT(pointClicked()));
Button *changeSignButton = createButton("\302\261", SLOT(changeSignClicked())); Button *changeSignButton = createButton(tr("\302\261"), SLOT(changeSignClicked()));
Button *backspaceButton = createButton("Backspace", SLOT(backspaceClicked())); Button *backspaceButton = createButton(tr("Backspace"), SLOT(backspaceClicked()));
Button *clearButton = createButton("Clear", SLOT(clear())); Button *clearButton = createButton(tr("Clear"), SLOT(clear()));
Button *clearAllButton = createButton("Clear All", SLOT(clearAll())); Button *clearAllButton = createButton(tr("Clear All"), SLOT(clearAll()));
Button *clearMemoryButton = createButton("MC", SLOT(clearMemory())); Button *clearMemoryButton = createButton(tr("MC"), SLOT(clearMemory()));
Button *readMemoryButton = createButton("MR", SLOT(readMemory())); Button *readMemoryButton = createButton(tr("MR"), SLOT(readMemory()));
Button *setMemoryButton = createButton("MS", SLOT(setMemory())); Button *setMemoryButton = createButton(tr("MS"), SLOT(setMemory()));
Button *addToMemoryButton = createButton("M+", SLOT(addToMemory())); Button *addToMemoryButton = createButton(tr("M+"), SLOT(addToMemory()));
Button *divisionButton = createButton("\303\267", SLOT(multiplicativeOperatorClicked())); Button *divisionButton = createButton(tr("\303\267"), SLOT(multiplicativeOperatorClicked()));
Button *timesButton = createButton("\303\227", SLOT(multiplicativeOperatorClicked())); Button *timesButton = createButton(tr("\303\227"), SLOT(multiplicativeOperatorClicked()));
Button *minusButton = createButton("-", SLOT(additiveOperatorClicked())); Button *minusButton = createButton(tr("-"), SLOT(additiveOperatorClicked()));
Button *plusButton = createButton("+", SLOT(additiveOperatorClicked())); Button *plusButton = createButton(tr("+"), SLOT(additiveOperatorClicked()));
Button *squareRootButton = createButton("Sqrt", SLOT(unaryOperatorClicked())); Button *squareRootButton = createButton(tr("Sqrt"), SLOT(unaryOperatorClicked()));
Button *powerButton = createButton("x\302\262", SLOT(unaryOperatorClicked())); Button *powerButton = createButton(tr("x\302\262"), SLOT(unaryOperatorClicked()));
Button *reciprocalButton = createButton("1/x", SLOT(unaryOperatorClicked())); Button *reciprocalButton = createButton(tr("1/x"), SLOT(unaryOperatorClicked()));
Button *equalButton = createButton("=", SLOT(equalClicked())); Button *equalButton = createButton(tr("="), SLOT(equalClicked()));
//! [4] //! [4]
//! [5] //! [5]
@@ -140,7 +140,7 @@ Calculator::Calculator(QWidget *parent)
mainLayout->addWidget(equalButton, 5, 5); mainLayout->addWidget(equalButton, 5, 5);
setLayout(mainLayout); setLayout(mainLayout);
setWindowTitle("Calculator"); setWindowTitle(tr("Calculator"));
} }
//! [6] //! [6]
@@ -169,15 +169,15 @@ void Calculator::unaryOperatorClicked()
double operand = display->text().toDouble(); double operand = display->text().toDouble();
double result = 0.0; double result = 0.0;
if (clickedOperator == "Sqrt") { if (clickedOperator == tr("Sqrt")) {
if (operand < 0.0) { if (operand < 0.0) {
abortOperation(); abortOperation();
return; return;
} }
result = std::sqrt(operand); result = std::sqrt(operand);
} else if (clickedOperator == "x\302\262") { } else if (clickedOperator == tr("x\302\262")) {
result = std::pow(operand, 2.0); result = std::pow(operand, 2.0);
} else if (clickedOperator == "1/x") { } else if (clickedOperator == tr("1/x")) {
if (operand == 0.0) { if (operand == 0.0) {
abortOperation(); abortOperation();
return; return;
@@ -287,7 +287,7 @@ void Calculator::pointClicked()
if (waitingForOperand) if (waitingForOperand)
display->setText("0"); display->setText("0");
if (!display->text().contains('.')) if (!display->text().contains('.'))
display->setText(display->text() + "."); display->setText(display->text() + tr("."));
waitingForOperand = false; waitingForOperand = false;
} }
//! [22] //! [22]
@@ -299,7 +299,7 @@ void Calculator::changeSignClicked()
double value = text.toDouble(); double value = text.toDouble();
if (value > 0.0) { if (value > 0.0) {
text.prepend("-"); text.prepend(tr("-"));
} else if (value < 0.0) { } else if (value < 0.0) {
text.remove(0, 1); text.remove(0, 1);
} }
@@ -383,20 +383,20 @@ Button *Calculator::createButton(const QString &text, const char *member)
void Calculator::abortOperation() void Calculator::abortOperation()
{ {
clearAll(); clearAll();
display->setText("####"); display->setText(tr("####"));
} }
//! [36] //! [36]
//! [38] //! [38]
bool Calculator::calculate(double rightOperand, const QString &pendingOperator) bool Calculator::calculate(double rightOperand, const QString &pendingOperator)
{ {
if (pendingOperator == "+") { if (pendingOperator == tr("+")) {
sumSoFar += rightOperand; sumSoFar += rightOperand;
} else if (pendingOperator == "-") { } else if (pendingOperator == tr("-")) {
sumSoFar -= rightOperand; sumSoFar -= rightOperand;
} else if (pendingOperator == "\303\227") { } else if (pendingOperator == tr("\303\227")) {
factorSoFar *= rightOperand; factorSoFar *= rightOperand;
} else if (pendingOperator == "\303\267") { } else if (pendingOperator == tr("\303\267")) {
if (rightOperand == 0.0) if (rightOperand == 0.0)
return false; return false;
factorSoFar /= rightOperand; factorSoFar /= rightOperand;

View File

@@ -1,20 +0,0 @@
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)

3
SingleApplication/examples/sending_arguments/main.cpp Executable file → Normal file
View File

@@ -11,9 +11,6 @@ int main(int argc, char *argv[])
// If this is a secondary instance // If this is a secondary instance
if( app.isSecondary() ) { if( app.isSecondary() ) {
app.sendMessage( app.arguments().join(' ').toUtf8() ); app.sendMessage( app.arguments().join(' ').toUtf8() );
qDebug() << "App already running.";
qDebug() << "Primary instance PID: " << app.primaryPid();
qDebug() << "Primary instance user: " << app.primaryUser();
return 0; return 0;
} else { } else {
QObject::connect( QObject::connect(

View File

View File

@@ -1,6 +1,6 @@
// The MIT License (MIT) // The MIT License (MIT)
// //
// Copyright (c) Itay Grudev 2015 - 2020 // Copyright (c) Itay Grudev 2015 - 2018
// //
// Permission is hereby granted, free of charge, to any person obtaining a copy // Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal // of this software and associated documentation files (the "Software"), to deal
@@ -20,255 +20,176 @@
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE. // THE SOFTWARE.
#include <QtCore/QElapsedTimer> #include <QtCore/QTime>
#include <QtCore/QThread>
#include <QtCore/QDateTime>
#include <QtCore/QByteArray> #include <QtCore/QByteArray>
#include <QtCore/QSharedMemory> #include <QtCore/QSharedMemory>
#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 <QRandomGenerator>
#endif
#include "singleapplication.h" #include "singleapplication.h"
#include "singleapplication_p.h" #include "singleapplication_p.h"
/** /**
* @brief Constructor. Checks and fires up LocalServer or closes the program @brief Constructor. Checks and fires up LocalServer or closes the program
* if another instance already exists if another instance already exists
* @param argc @param argc
* @param argv @param argv
* @param allowSecondary Whether to enable secondary instance support @param {bool} allowSecondaryInstances
* @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 )
*/ : app_t( argc, argv ), d_ptr( new SingleApplicationPrivate( this ) )
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) #if defined(Q_OS_ANDROID) || defined(Q_OS_IOS)
// On Android and iOS since the library is not supported fallback to // On Android and iOS since the library is not supported fallback to
// standard QApplication behaviour by simply returning at this point. // standard QApplication behaviour by simply returning at this point.
qWarning() << "SingleApplication is not supported on Android and iOS systems."; qWarning() << "SingleApplication is not supported on Android and iOS systems.";
return; return;
#endif #endif
// Store the current mode of the program // Store the current mode of the program
d->options = options; d->options = options;
// Add any unique user data // Generating an application ID used for identifying the shared memory
if ( ! userData.isEmpty() ) // block and QLocalServer
d->addAppData( userData ); d->genBlockServerName();
// 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 #ifdef Q_OS_UNIX
// By explicitly attaching it and then deleting it we make sure that the // By explicitly attaching it and then deleting it we make sure that the
// memory is deleted even after the process has crashed on Unix. // memory is deleted even after the process has crashed on Unix.
d->memory = new QSharedMemory( d->blockServerName ); d->memory = new QSharedMemory( d->blockServerName );
d->memory->attach(); d->memory->attach();
delete d->memory; delete d->memory;
#endif #endif
// Guarantee thread safe behaviour with a shared memory block. // Guarantee thread safe behaviour with a shared memory block.
d->memory = new QSharedMemory( d->blockServerName ); d->memory = new QSharedMemory( d->blockServerName );
// Create a shared memory block // Create a shared memory block
if( d->memory->create( sizeof( InstancesInfo ) )){ if( d->memory->create( sizeof( InstancesInfo ) ) ) {
// Initialize the shared memory block // Initialize the shared memory block
if( ! d->memory->lock() ){ d->memory->lock();
qCritical() << "SingleApplication: Unable to lock memory block after create."; d->initializeMemoryBlock();
abortSafely(); d->memory->unlock();
} } else {
d->initializeMemoryBlock(); // Attempt to attach to the memory segment
} else { if( ! d->memory->attach() ) {
if( d->memory->error() == QSharedMemory::AlreadyExists ){ qCritical() << "SingleApplication: Unable to attach to shared memory block.";
// Attempt to attach to the memory segment qCritical() << d->memory->errorString();
if( ! d->memory->attach() ){ delete d;
qCritical() << "SingleApplication: Unable to attach to shared memory block."; ::exit( EXIT_FAILURE );
abortSafely(); }
} }
if( ! d->memory->lock() ){
qCritical() << "SingleApplication: Unable to lock memory block after attach.";
abortSafely();
}
} else {
qCritical() << "SingleApplication: Unable to create block.";
abortSafely();
}
}
auto *inst = static_cast<InstancesInfo*>( d->memory->data() ); InstancesInfo* inst = static_cast<InstancesInfo*>( d->memory->data() );
QElapsedTimer time; QElapsedTimer time;
time.start(); time.start();
// Make sure the shared memory block is initialised and in consistent state // Make sure the shared memory block is initialised and in consistent state
while( true ){ while( true ) {
// If the shared memory block's checksum is valid continue d->memory->lock();
if( d->blockChecksum() == inst->checksum ) break;
// If more than 5s have elapsed, assume the primary instance crashed and if( d->blockChecksum() == inst->checksum ) break;
// 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();
}
// Otherwise wait for a random period and try again. The random sleep here if( time.elapsed() > 5000 ) {
// limits the probability of a collision between two racing apps and qWarning() << "SingleApplication: Shared memory block has been in an inconsistent state from more than 5s. Assuming primary instance failure.";
// allows the app to initialise faster d->initializeMemoryBlock();
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();
}
}
if( inst->primary == false ){ d->memory->unlock();
d->startPrimary();
if( ! d->memory->unlock() ){
qDebug() << "SingleApplication: Unable to unlock memory after primary start.";
qDebug() << d->memory->errorString();
}
return;
}
// Check if another instance can be started // Random sleep here limits the probability of a collision between two racing apps
if( allowSecondary ){ #if QT_VERSION < QT_VERSION_CHECK(5, 10, 0) // ### Qt 6: remove
d->startSecondary(); qsrand( QDateTime::currentMSecsSinceEpoch() % std::numeric_limits<uint>::max() );
if( d->options & Mode::SecondaryNotification ){ QThread::sleep( 8 + static_cast <unsigned long>( static_cast <float>( qrand() ) / RAND_MAX * 10 ) );
d->connectToPrimary( timeout, SingleApplicationPrivate::SecondaryInstance ); #else
} #if TODO_LIST
if( ! d->memory->unlock() ){ #pragma message("@TODO remove code for QT 5.10 or later")
qDebug() << "SingleApplication: Unable to unlock memory after secondary start."; #endif
qDebug() << d->memory->errorString(); quint32 value = QRandomGenerator::global()->generate();
} QThread::sleep(8 + static_cast<unsigned long>(value / RAND_MAX * 10));
return; #endif
} }
if( ! d->memory->unlock() ){ if( inst->primary == false) {
qDebug() << "SingleApplication: Unable to unlock memory at end of execution."; d->startPrimary();
qDebug() << d->memory->errorString(); d->memory->unlock();
} return;
}
d->connectToPrimary( timeout, SingleApplicationPrivate::NewInstance ); // 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;
}
delete d; d->memory->unlock();
::exit( EXIT_SUCCESS ); d->connectToPrimary( timeout, SingleApplicationPrivate::NewInstance );
delete d;
::exit( EXIT_SUCCESS );
} }
/**
@brief Destructor
*/
SingleApplication::~SingleApplication() SingleApplication::~SingleApplication()
{ {
Q_D( SingleApplication ); Q_D(SingleApplication);
delete d; delete d;
} }
/** bool SingleApplication::isPrimary()
* Checks if the current application instance is primary.
* @return Returns true if the instance is primary, false otherwise.
*/
bool SingleApplication::isPrimary() const
{ {
Q_D( const SingleApplication ); Q_D(SingleApplication);
return d->server != nullptr; return d->server != nullptr;
} }
/** bool SingleApplication::isSecondary()
* Checks if the current application instance is secondary.
* @return Returns true if the instance is secondary, false otherwise.
*/
bool SingleApplication::isSecondary() const
{ {
Q_D( const SingleApplication ); Q_D(SingleApplication);
return d->server == nullptr; return d->server == nullptr;
} }
/** quint32 SingleApplication::instanceId()
* 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( const SingleApplication ); Q_D(SingleApplication);
return d->instanceNumber; return d->instanceNumber;
} }
/** qint64 SingleApplication::primaryPid()
* 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( const SingleApplication ); Q_D(SingleApplication);
return d->primaryPid(); return d->primaryPid();
} }
/** bool SingleApplication::sendMessage( QByteArray message, int timeout )
* 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( const SingleApplication ); Q_D(SingleApplication);
return d->primaryUser();
} // Nobody to connect to
if( isPrimary() ) return false;
/**
* Returns the username the current instance is running as. // Make sure the socket is connected
* @return Returns the username the current instance is running as. d->connectToPrimary( timeout, SingleApplicationPrivate::Reconnect );
*/
QString SingleApplication::currentUser() const d->socket->write( message );
{ bool dataWritten = d->socket->waitForBytesWritten( timeout );
return SingleApplicationPrivate::getUsername(); d->socket->flush();
} return dataWritten;
/**
* 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();
} }

View File

@@ -25,6 +25,7 @@
#include <QtCore/QtGlobal> #include <QtCore/QtGlobal>
#include <QtNetwork/QLocalSocket> #include <QtNetwork/QLocalSocket>
#include <QElapsedTimer>
#ifndef QAPPLICATION_CLASS #ifndef QAPPLICATION_CLASS
#define QAPPLICATION_CLASS QCoreApplication #define QAPPLICATION_CLASS QCoreApplication
@@ -35,118 +36,99 @@
class SingleApplicationPrivate; class SingleApplicationPrivate;
/** /**
* @brief The SingleApplication class handles multiple instances of the same @brief The SingleApplication class handles multiple instances of the same
* Application Application
* @see QCoreApplication @see QCoreApplication
*/ */
class SingleApplication : public QAPPLICATION_CLASS class SingleApplication : public QAPPLICATION_CLASS
{ {
Q_OBJECT Q_OBJECT
using app_t = QAPPLICATION_CLASS; typedef QAPPLICATION_CLASS app_t;
public: public:
/** /**
* @brief Mode of operation of SingleApplication. @brief Mode of operation of SingleApplication.
* Whether the block should be user-wide or system-wide and whether the Whether the block should be user-wide or system-wide and whether the
* primary instance should be notified when a secondary instance had been primary instance should be notified when a secondary instance had been
* started. started.
* @note Operating system can restrict the shared memory blocks to the same @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 user, in which case the User/System modes will have no effect and the
* block will be user wide. block will be user wide.
* @enum @enum
*/ */
enum Mode { enum Mode {
User = 1 << 0, User = 1 << 0,
System = 1 << 1, System = 1 << 1,
SecondaryNotification = 1 << 2, SecondaryNotification = 1 << 2,
ExcludeAppVersion = 1 << 3, ExcludeAppVersion = 1 << 3,
ExcludeAppPath = 1 << 4 ExcludeAppPath = 1 << 4
}; };
Q_DECLARE_FLAGS(Options, Mode) Q_DECLARE_FLAGS(Options, Mode)
/** /**
* @brief Intitializes a SingleApplication instance with argc command line @brief Intitializes a SingleApplication instance with argc command line
* arguments in argv arguments in argv
* @arg {int &} argc - Number of arguments in argv @arg {int &} argc - Number of arguments in argv
* @arg {const char *[]} argv - Supplied command line arguments @arg {const char *[]} argv - Supplied command line arguments
* @arg {bool} allowSecondary - Whether to start the instance as secondary @arg {bool} allowSecondary - Whether to start the instance as secondary
* if there is already a primary instance. if there is already a primary instance.
* @arg {Mode} mode - Whether for the SingleApplication block to be applied @arg {Mode} mode - Whether for the SingleApplication block to be applied
* User wide or System wide. User wide or System wide.
* @arg {int} timeout - Timeout to wait in milliseconds. @arg {int} timeout - Timeout to wait in milliseconds.
* @note argc and argv may be changed as Qt removes arguments that it @note argc and argv may be changed as Qt removes arguments that it
* recognizes recognizes
* @note Mode::SecondaryNotification only works if set on both the primary @note Mode::SecondaryNotification only works if set on both the primary
* instance and the secondary instance. instance and the secondary instance.
* @note The timeout is just a hint for the maximum time of blocking @note The timeout is just a hint for the maximum time of blocking
* operations. It does not guarantee that the SingleApplication operations. It does not guarantee that the SingleApplication
* initialisation will be completed in given time, though is a good hint. initialisation will be completed in given time, though is a good hint.
* Usually 4*timeout would be the worst case (fail) scenario. Usually 4*timeout would be the worst case (fail) scenario.
* @see See the corresponding QAPPLICATION_CLASS constructor for reference @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 = {} ); explicit SingleApplication( int &argc, char *argv[], bool allowSecondary = false, Options options = Mode::User, int timeout = 1000 );
~SingleApplication() override; ~SingleApplication();
/** /**
* @brief Returns if the instance is the primary instance @brief Returns if the instance is the primary instance
* @returns {bool} @returns {bool}
*/ */
bool isPrimary() const; bool isPrimary();
/** /**
* @brief Returns if the instance is a secondary instance @brief Returns if the instance is a secondary instance
* @returns {bool} @returns {bool}
*/ */
bool isSecondary() const; bool isSecondary();
/** /**
* @brief Returns a unique identifier for the current instance @brief Returns a unique identifier for the current instance
* @returns {qint32} @returns {qint32}
*/ */
quint32 instanceId() const; quint32 instanceId();
/** /**
* @brief Returns the process ID (PID) of the primary instance @brief Returns the process ID (PID) of the primary instance
* @returns {qint64} @returns {qint64}
*/ */
qint64 primaryPid() const; qint64 primaryPid();
/** /**
* @brief Returns the username of the user running the primary instance @brief Sends a message to the primary instance. Returns true on success.
* @returns {QString} @param {int} timeout - Timeout for connecting
*/ @returns {bool}
QString primaryUser() const; @note sendMessage() will return false if invoked from the primary
instance.
/** */
* @brief Returns the username of the current user bool sendMessage( QByteArray message, int timeout = 100 );
* @returns {QString}
*/ Q_SIGNALS:
QString currentUser() const; void instanceStarted();
void receivedMessage( quint32 instanceId, QByteArray message );
/**
* @brief Sends a message to the primary instance. Returns true on success. private:
* @param {int} timeout - Timeout for connecting SingleApplicationPrivate *d_ptr;
* @returns {bool} Q_DECLARE_PRIVATE(SingleApplication)
* @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) Q_DECLARE_OPERATORS_FOR_FLAGS(SingleApplication::Options)

View File

@@ -1,8 +1,7 @@
QT += core network QT += core network
CONFIG += c++11 CONFIG += c++17
HEADERS += $$PWD/SingleApplication \ HEADERS += $$PWD/singleapplication.h \
$$PWD/singleapplication.h \
$$PWD/singleapplication_p.h $$PWD/singleapplication_p.h
SOURCES += $$PWD/singleapplication.cpp \ SOURCES += $$PWD/singleapplication.cpp \
$$PWD/singleapplication_p.cpp $$PWD/singleapplication_p.cpp

View File

@@ -1,6 +1,6 @@
// The MIT License (MIT) // The MIT License (MIT)
// //
// Copyright (c) Itay Grudev 2015 - 2020 // Copyright (c) Itay Grudev 2015 - 2018
// //
// Permission is hereby granted, free of charge, to any person obtaining a copy // Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal // of this software and associated documentation files (the "Software"), to deal
@@ -33,454 +33,412 @@
#include <cstddef> #include <cstddef>
#include <QtCore/QDir> #include <QtCore/QDir>
#include <QtCore/QThread>
#include <QtCore/QByteArray> #include <QtCore/QByteArray>
#include <QtCore/QDataStream> #include <QtCore/QDataStream>
#include <QtCore/QElapsedTimer>
#include <QtCore/QCryptographicHash> #include <QtCore/QCryptographicHash>
#include <QtNetwork/QLocalServer> #include <QtNetwork/QLocalServer>
#include <QtNetwork/QLocalSocket> #include <QtNetwork/QLocalSocket>
#if QT_VERSION >= QT_VERSION_CHECK(5, 10, 0)
#include <QtCore/QRandomGenerator>
#else
#include <QtCore/QDateTime>
#endif
#include "singleapplication.h" #include "singleapplication.h"
#include "singleapplication_p.h" #include "singleapplication_p.h"
#ifdef Q_OS_UNIX #ifdef Q_OS_UNIX
#include <unistd.h> #include <unistd.h>
#include <sys/types.h> #include <sys/types.h>
#include <pwd.h> #include <pwd.h>
#endif #endif
#ifdef Q_OS_WIN #ifdef Q_OS_WIN
#ifndef NOMINMAX #include <windows.h>
#define NOMINMAX 1 #include <lmcons.h>
#endif
#include <windows.h>
#include <lmcons.h>
#endif #endif
SingleApplicationPrivate::SingleApplicationPrivate( SingleApplication *q_ptr ) SingleApplicationPrivate::SingleApplicationPrivate( SingleApplication *q_ptr )
: q_ptr( q_ptr ) : q_ptr( q_ptr )
{ {
server = nullptr; server = nullptr;
socket = nullptr; socket = nullptr;
memory = nullptr; memory = nullptr;
instanceNumber = 0; instanceNumber = -1;
} }
SingleApplicationPrivate::~SingleApplicationPrivate() SingleApplicationPrivate::~SingleApplicationPrivate()
{ {
if( socket != nullptr ){ if( socket != nullptr ) {
socket->close(); socket->close();
delete socket; delete socket;
} }
if( memory != nullptr ){ memory->lock();
memory->lock(); InstancesInfo* inst = static_cast<InstancesInfo*>(memory->data());
auto *inst = static_cast<InstancesInfo*>(memory->data()); if( server != nullptr ) {
if( server != nullptr ){ server->close();
server->close(); delete server;
delete server; inst->primary = false;
inst->primary = false; inst->primaryPid = -1;
inst->primaryPid = -1; inst->checksum = blockChecksum();
inst->primaryUser[0] = '\0'; }
inst->checksum = blockChecksum(); memory->unlock();
}
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() void SingleApplicationPrivate::genBlockServerName()
{ {
QCryptographicHash appData( QCryptographicHash::Sha256 ); QCryptographicHash appData( QCryptographicHash::Sha256 );
appData.addData( "SingleApplication", 17 ); appData.addData( "SingleApplication", 17 );
appData.addData( SingleApplication::app_t::applicationName().toUtf8() ); appData.addData( SingleApplication::app_t::applicationName().toUtf8() );
appData.addData( SingleApplication::app_t::organizationName().toUtf8() ); appData.addData( SingleApplication::app_t::organizationName().toUtf8() );
appData.addData( SingleApplication::app_t::organizationDomain().toUtf8() ); appData.addData( SingleApplication::app_t::organizationDomain().toUtf8() );
if ( ! appDataList.isEmpty() ) if( ! (options & SingleApplication::Mode::ExcludeAppVersion) ) {
appData.addData( appDataList.join( "" ).toUtf8() ); appData.addData( SingleApplication::app_t::applicationVersion().toUtf8() );
}
if( ! (options & SingleApplication::Mode::ExcludeAppVersion) ){ if( ! (options & SingleApplication::Mode::ExcludeAppPath) ) {
appData.addData( SingleApplication::app_t::applicationVersion().toUtf8() );
}
if( ! (options & SingleApplication::Mode::ExcludeAppPath) ){
#ifdef Q_OS_WIN #ifdef Q_OS_WIN
appData.addData( SingleApplication::app_t::applicationFilePath().toLower().toUtf8() ); appData.addData( SingleApplication::app_t::applicationFilePath().toLower().toUtf8() );
#else #else
appData.addData( SingleApplication::app_t::applicationFilePath().toUtf8() ); appData.addData( SingleApplication::app_t::applicationFilePath().toUtf8() );
#endif #endif
} }
// User level block requires a user specific data in the hash // User level block requires a user specific data in the hash
if( options & SingleApplication::Mode::User ){ if( options & SingleApplication::Mode::User ) {
appData.addData( getUsername().toUtf8() ); #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
}
// Replace the backslash in RFC 2045 Base64 [a-zA-Z0-9+/=] to comply with // Replace the backslash in RFC 2045 Base64 [a-zA-Z0-9+/=] to comply with
// server naming requirements. // server naming requirements.
blockServerName = appData.result().toBase64().replace("/", "_"); blockServerName = appData.result().toBase64().replace("/", "_");
} }
void SingleApplicationPrivate::initializeMemoryBlock() const void SingleApplicationPrivate::initializeMemoryBlock()
{ {
auto *inst = static_cast<InstancesInfo*>( memory->data() ); InstancesInfo* inst = static_cast<InstancesInfo*>( memory->data() );
inst->primary = false; inst->primary = false;
inst->secondary = 0; inst->secondary = 0;
inst->primaryPid = -1; inst->primaryPid = -1;
inst->primaryUser[0] = '\0'; inst->checksum = blockChecksum();
inst->checksum = blockChecksum();
} }
void SingleApplicationPrivate::startPrimary() void SingleApplicationPrivate::startPrimary()
{ {
// Reset the number of connections Q_Q(SingleApplication);
auto *inst = static_cast <InstancesInfo*>( memory->data() );
inst->primary = true; // Successful creation means that no main process exists
inst->primaryPid = QCoreApplication::applicationPid(); // So we start a QLocalServer to listen for connections
qstrncpy( inst->primaryUser, getUsername().toUtf8().data(), sizeof(inst->primaryUser) ); QLocalServer::removeServer( blockServerName );
inst->checksum = blockChecksum(); server = new QLocalServer();
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 // Restrict access to the socket according to the
// SingleApplication::Mode::User flag on User level or no restrictions // SingleApplication::Mode::User flag on User level or no restrictions
if( options & SingleApplication::Mode::User ){ if( options & SingleApplication::Mode::User ) {
server->setSocketOptions( QLocalServer::UserAccessOption ); server->setSocketOptions( QLocalServer::UserAccessOption );
} else { } else {
server->setSocketOptions( QLocalServer::WorldAccessOption ); server->setSocketOptions( QLocalServer::WorldAccessOption );
} }
server->listen( blockServerName ); server->listen( blockServerName );
QObject::connect( QObject::connect(
server, server,
&QLocalServer::newConnection, &QLocalServer::newConnection,
this, this,
&SingleApplicationPrivate::slotConnectionEstablished &SingleApplicationPrivate::slotConnectionEstablished
); );
// Reset the number of connections
InstancesInfo* inst = static_cast <InstancesInfo*>( memory->data() );
inst->primary = true;
inst->primaryPid = q->applicationPid();
inst->checksum = blockChecksum();
instanceNumber = 0;
} }
void SingleApplicationPrivate::startSecondary() void SingleApplicationPrivate::startSecondary()
{ {
auto *inst = static_cast <InstancesInfo*>( memory->data() );
inst->secondary += 1;
inst->checksum = blockChecksum();
instanceNumber = inst->secondary;
} }
bool SingleApplicationPrivate::connectToPrimary( int msecs, ConnectionType connectionType ) void SingleApplicationPrivate::connectToPrimary( int msecs, ConnectionType connectionType )
{ {
QElapsedTimer time; // Connect to the Local Server of the Primary Instance if not already
time.start(); // connected.
if( socket == nullptr ) {
socket = new QLocalSocket();
}
// Connect to the Local Server of the Primary Instance if not already // If already connected - we are done;
// connected. if( socket->state() == QLocalSocket::ConnectedState )
if( socket == nullptr ){ return;
socket = new QLocalSocket();
}
if( socket->state() == QLocalSocket::ConnectedState ) return true; // If not connect
if( socket->state() == QLocalSocket::UnconnectedState ||
socket->state() == QLocalSocket::ClosingState ) {
socket->connectToServer( blockServerName );
}
if( socket->state() != QLocalSocket::ConnectedState ){ // Wait for being connected
if( socket->state() == QLocalSocket::ConnectingState ) {
socket->waitForConnected( msecs );
}
while( true ){ // Initialisation message according to the SingleApplication protocol
randomSleep(); if( socket->state() == QLocalSocket::ConnectedState ) {
// Notify the parent that a new instance had been started;
if( socket->state() != QLocalSocket::ConnectingState ) QByteArray initMsg;
socket->connectToServer( blockServerName ); QDataStream writeStream(&initMsg, QIODevice::WriteOnly);
if( socket->state() == QLocalSocket::ConnectingState ){
socket->waitForConnected( static_cast<int>(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)) #if (QT_VERSION >= QT_VERSION_CHECK(5, 6, 0))
writeStream.setVersion(QDataStream::Qt_5_6); writeStream.setVersion(QDataStream::Qt_5_6);
#endif #endif
writeStream << blockServerName.toLatin1(); writeStream << blockServerName.toLatin1();
writeStream << static_cast<quint8>(connectionType); writeStream << static_cast<quint8>(connectionType);
writeStream << instanceNumber; writeStream << instanceNumber;
#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
quint16 checksum = qChecksum(QByteArray(initMsg, static_cast<quint32>(initMsg.length()))); #if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) // ### Qt 6: remove
quint16 checksum =
qChecksum(
initMsg.constData(),
static_cast<quint32>(initMsg.length()));
#else #else
quint16 checksum = qChecksum(initMsg.constData(), static_cast<quint32>(initMsg.length())); #if TODO_LIST
#pragma message("@TODO remove code for QT 6 or later")
#endif #endif
writeStream << checksum; quint16 checksum =
qChecksum(
QByteArrayView(
initMsg.constData(),
static_cast<quint32>(initMsg.length())));
#endif
writeStream << checksum;
// The header indicates the message length that follows // The header indicates the message length that follows
QByteArray header; QByteArray header;
QDataStream headerStream(&header, QIODevice::WriteOnly); QDataStream headerStream(&header, QIODevice::WriteOnly);
#if (QT_VERSION >= QT_VERSION_CHECK(5, 6, 0)) #if (QT_VERSION >= QT_VERSION_CHECK(5, 6, 0))
headerStream.setVersion(QDataStream::Qt_5_6); headerStream.setVersion(QDataStream::Qt_5_6);
#endif #endif
headerStream << static_cast <quint64>( initMsg.length() ); headerStream << static_cast <quint64>( initMsg.length() );
socket->write( header ); socket->write( header );
socket->write( initMsg ); socket->write( initMsg );
bool result = socket->waitForBytesWritten( static_cast<int>(msecs - time.elapsed()) ); socket->flush();
socket->flush(); socket->waitForBytesWritten( msecs );
return result; }
} }
quint16 SingleApplicationPrivate::blockChecksum() const quint16 SingleApplicationPrivate::blockChecksum()
{ {
#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) #if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) // ### Qt 6: remove
quint16 checksum = qChecksum(QByteArray(static_cast<const char*>(memory->constData()), offsetof(InstancesInfo, checksum))); return qChecksum(
static_cast <const char *>( memory->data() ),
offsetof( InstancesInfo, checksum )
);
#else #else
quint16 checksum = qChecksum(static_cast<const char*>(memory->constData()), offsetof(InstancesInfo, checksum)); #if TODO_LIST
#pragma message("@TODO remove code for QT 6 or later")
#endif
return qChecksum(
QByteArrayView(
static_cast <const char *>( memory->data() ),
offsetof( InstancesInfo, checksum )));
#endif #endif
return checksum;
} }
qint64 SingleApplicationPrivate::primaryPid() const qint64 SingleApplicationPrivate::primaryPid()
{ {
qint64 pid; qint64 pid;
memory->lock(); memory->lock();
auto *inst = static_cast<InstancesInfo*>( memory->data() ); InstancesInfo* inst = static_cast<InstancesInfo*>( memory->data() );
pid = inst->primaryPid; pid = inst->primaryPid;
memory->unlock(); memory->unlock();
return pid; return pid;
}
QString SingleApplicationPrivate::primaryUser() const
{
QByteArray username;
memory->lock();
auto *inst = static_cast<InstancesInfo*>( 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() void SingleApplicationPrivate::slotConnectionEstablished()
{ {
QLocalSocket *nextConnSocket = server->nextPendingConnection(); QLocalSocket *nextConnSocket = server->nextPendingConnection();
connectionMap.insert(nextConnSocket, ConnectionInfo()); connectionMap.insert(nextConnSocket, ConnectionInfo());
QObject::connect(nextConnSocket, &QLocalSocket::aboutToClose, QObject::connect(nextConnSocket, &QLocalSocket::aboutToClose,
[nextConnSocket, this](){ [nextConnSocket, this]() {
auto &info = connectionMap[nextConnSocket]; auto &info = connectionMap[nextConnSocket];
Q_EMIT this->slotClientConnectionClosed( nextConnSocket, info.instanceId ); Q_EMIT this->slotClientConnectionClosed( nextConnSocket, info.instanceId );
} }
); );
QObject::connect(nextConnSocket, &QLocalSocket::disconnected, nextConnSocket, &QLocalSocket::deleteLater); QObject::connect(nextConnSocket, &QLocalSocket::disconnected,
[nextConnSocket, this](){
connectionMap.remove(nextConnSocket);
nextConnSocket->deleteLater();
}
);
QObject::connect(nextConnSocket, &QLocalSocket::destroyed, QObject::connect(nextConnSocket, &QLocalSocket::readyRead,
[nextConnSocket, this](){ [nextConnSocket, this]() {
connectionMap.remove(nextConnSocket); auto &info = connectionMap[nextConnSocket];
} switch(info.stage) {
); case StageHeader:
readInitMessageHeader(nextConnSocket);
QObject::connect(nextConnSocket, &QLocalSocket::readyRead, break;
[nextConnSocket, this](){ case StageBody:
auto &info = connectionMap[nextConnSocket]; readInitMessageBody(nextConnSocket);
switch(info.stage){ break;
case StageHeader: case StageConnected:
readInitMessageHeader(nextConnSocket); Q_EMIT this->slotDataAvailable( nextConnSocket, info.instanceId );
break; break;
case StageBody: default:
readInitMessageBody(nextConnSocket); break;
break; };
case StageConnected: }
Q_EMIT this->slotDataAvailable( nextConnSocket, info.instanceId ); );
break;
default:
break;
};
}
);
} }
void SingleApplicationPrivate::readInitMessageHeader( QLocalSocket *sock ) void SingleApplicationPrivate::readInitMessageHeader( QLocalSocket *sock )
{ {
if (!connectionMap.contains( sock )){ if (!connectionMap.contains( sock )) {
return; return;
} }
if( sock->bytesAvailable() < ( qint64 )sizeof( quint64 ) ){ if( sock->bytesAvailable() < ( qint64 )sizeof( quint64 ) ) {
return; return;
} }
QDataStream headerStream( sock ); QDataStream headerStream( sock );
#if (QT_VERSION >= QT_VERSION_CHECK(5, 6, 0)) #if (QT_VERSION >= QT_VERSION_CHECK(5, 6, 0))
headerStream.setVersion( QDataStream::Qt_5_6 ); headerStream.setVersion( QDataStream::Qt_5_6 );
#endif #endif
// Read the header to know the message length // Read the header to know the message length
quint64 msgLen = 0; quint64 msgLen = 0;
headerStream >> msgLen; headerStream >> msgLen;
ConnectionInfo &info = connectionMap[sock]; ConnectionInfo &info = connectionMap[sock];
info.stage = StageBody; info.stage = StageBody;
info.msgLen = msgLen; info.msgLen = msgLen;
if ( sock->bytesAvailable() >= (qint64) msgLen ){ if ( sock->bytesAvailable() >= (qint64) msgLen ) {
readInitMessageBody( sock ); readInitMessageBody( sock );
} }
} }
void SingleApplicationPrivate::readInitMessageBody( QLocalSocket *sock ) void SingleApplicationPrivate::readInitMessageBody( QLocalSocket *sock )
{ {
Q_Q(SingleApplication); Q_Q(SingleApplication);
if (!connectionMap.contains( sock )){ if (!connectionMap.contains( sock )) {
return; return;
} }
ConnectionInfo &info = connectionMap[sock]; ConnectionInfo &info = connectionMap[sock];
if( sock->bytesAvailable() < ( qint64 )info.msgLen ){ if( sock->bytesAvailable() < ( qint64 )info.msgLen ) {
return; return;
} }
// Read the message body // Read the message body
QByteArray msgBytes = sock->read(info.msgLen); QByteArray msgBytes = sock->read(info.msgLen);
QDataStream readStream(msgBytes); QDataStream readStream(msgBytes);
#if (QT_VERSION >= QT_VERSION_CHECK(5, 6, 0)) #if (QT_VERSION >= QT_VERSION_CHECK(5, 6, 0))
readStream.setVersion( QDataStream::Qt_5_6 ); readStream.setVersion( QDataStream::Qt_5_6 );
#endif #endif
// server name // server name
QByteArray latin1Name; QByteArray latin1Name;
readStream >> latin1Name; readStream >> latin1Name;
// connection type // connection type
ConnectionType connectionType = InvalidConnection; ConnectionType connectionType = InvalidConnection;
quint8 connTypeVal = InvalidConnection; quint8 connTypeVal = InvalidConnection;
readStream >> connTypeVal; readStream >> connTypeVal;
connectionType = static_cast <ConnectionType>( connTypeVal ); connectionType = static_cast <ConnectionType>( connTypeVal );
// instance id // instance id
quint32 instanceId = 0; quint32 instanceId = 0;
readStream >> instanceId; readStream >> instanceId;
// checksum // checksum
quint16 msgChecksum = 0; quint16 msgChecksum = 0;
readStream >> msgChecksum; readStream >> msgChecksum;
#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) #if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) // ### Qt 6: remove
const quint16 actualChecksum = qChecksum(QByteArray(msgBytes, static_cast<quint32>(msgBytes.length() - sizeof(quint16)))); const quint16 actualChecksum =
qChecksum(
msgBytes.constData(),
static_cast<quint32>( msgBytes.length() - sizeof( quint16 ) ) );
#else #else
const quint16 actualChecksum = qChecksum(msgBytes.constData(), static_cast<quint32>(msgBytes.length() - sizeof(quint16))); #if TODO_LIST
#pragma message("@TODO remove code for QT 6 or later")
#endif #endif
const quint16 actualChecksum =
qChecksum(
QByteArrayView(
msgBytes.constData(),
static_cast<quint32>(msgBytes.length() - sizeof(quint16))));
#endif
bool isValid = readStream.status() == QDataStream::Ok &&
QLatin1String(latin1Name) == blockServerName &&
msgChecksum == actualChecksum;
bool isValid = readStream.status() == QDataStream::Ok && if( !isValid ) {
QLatin1String(latin1Name) == blockServerName && sock->close();
msgChecksum == actualChecksum; return;
}
if( !isValid ){ info.instanceId = instanceId;
sock->close(); info.stage = StageConnected;
return;
}
info.instanceId = instanceId; if( connectionType == NewInstance ||
info.stage = StageConnected; ( connectionType == SecondaryInstance &&
options & SingleApplication::Mode::SecondaryNotification ) )
{
Q_EMIT q->instanceStarted();
}
if( connectionType == NewInstance || if (sock->bytesAvailable() > 0) {
( connectionType == SecondaryInstance && Q_EMIT this->slotDataAvailable( sock, instanceId );
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 ) void SingleApplicationPrivate::slotDataAvailable( QLocalSocket *dataSocket, quint32 instanceId )
{ {
Q_Q(SingleApplication); Q_Q(SingleApplication);
Q_EMIT q->receivedMessage( instanceId, dataSocket->readAll() ); Q_EMIT q->receivedMessage( instanceId, dataSocket->readAll() );
} }
void SingleApplicationPrivate::slotClientConnectionClosed( QLocalSocket *closedSocket, quint32 instanceId ) void SingleApplicationPrivate::slotClientConnectionClosed( QLocalSocket *closedSocket, quint32 instanceId )
{ {
if( closedSocket->bytesAvailable() > 0 ) if( closedSocket->bytesAvailable() > 0 )
Q_EMIT slotDataAvailable( closedSocket, instanceId ); 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<uint>::max() );
QThread::msleep( 8 + static_cast <unsigned long>( static_cast <float>( qrand() ) / RAND_MAX * 10 ));
#endif
}
void SingleApplicationPrivate::addAppData(const QString &data)
{
appDataList.push_back(data);
}
QStringList SingleApplicationPrivate::appData() const
{
return appDataList;
} }

View File

@@ -1,6 +1,6 @@
// The MIT License (MIT) // The MIT License (MIT)
// //
// Copyright (c) Itay Grudev 2015 - 2020 // Copyright (c) Itay Grudev 2015 - 2016
// //
// Permission is hereby granted, free of charge, to any person obtaining a copy // Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal // of this software and associated documentation files (the "Software"), to deal
@@ -38,67 +38,62 @@
#include "singleapplication.h" #include "singleapplication.h"
struct InstancesInfo { struct InstancesInfo {
bool primary; bool primary;
quint32 secondary; quint32 secondary;
qint64 primaryPid; qint64 primaryPid;
char primaryUser[128]; quint16 checksum;
quint16 checksum; // Must be the last field
}; };
struct ConnectionInfo { struct ConnectionInfo {
qint64 msgLen = 0; explicit ConnectionInfo() :
quint32 instanceId = 0; msgLen(0), instanceId(0), stage(0) {}
quint8 stage = 0; qint64 msgLen;
quint32 instanceId;
quint8 stage;
}; };
class SingleApplicationPrivate : public QObject { class SingleApplicationPrivate : public QObject {
Q_OBJECT Q_OBJECT
public: public:
enum ConnectionType : quint8 { enum ConnectionType : quint8 {
InvalidConnection = 0, InvalidConnection = 0,
NewInstance = 1, NewInstance = 1,
SecondaryInstance = 2, SecondaryInstance = 2,
Reconnect = 3 Reconnect = 3
}; };
enum ConnectionStage : quint8 { enum ConnectionStage : quint8 {
StageHeader = 0, StageHeader = 0,
StageBody = 1, StageBody = 1,
StageConnected = 2, StageConnected = 2,
}; };
Q_DECLARE_PUBLIC(SingleApplication) Q_DECLARE_PUBLIC(SingleApplication)
SingleApplicationPrivate( SingleApplication *q_ptr ); SingleApplicationPrivate( SingleApplication *q_ptr );
~SingleApplicationPrivate() override; ~SingleApplicationPrivate();
static QString getUsername(); void genBlockServerName();
void genBlockServerName(); void initializeMemoryBlock();
void initializeMemoryBlock() const; void startPrimary();
void startPrimary(); void startSecondary();
void startSecondary(); void connectToPrimary(int msecs, ConnectionType connectionType );
bool connectToPrimary( int msecs, ConnectionType connectionType ); quint16 blockChecksum();
quint16 blockChecksum() const; qint64 primaryPid();
qint64 primaryPid() const; void readInitMessageHeader(QLocalSocket *socket);
QString primaryUser() const; void readInitMessageBody(QLocalSocket *socket);
void readInitMessageHeader(QLocalSocket *socket);
void readInitMessageBody(QLocalSocket *socket); SingleApplication *q_ptr;
static void randomSleep(); QSharedMemory *memory;
void addAppData(const QString &data); QLocalSocket *socket;
QStringList appData() const; QLocalServer *server;
quint32 instanceNumber;
SingleApplication *q_ptr; QString blockServerName;
QSharedMemory *memory; SingleApplication::Options options;
QLocalSocket *socket; QMap<QLocalSocket*, ConnectionInfo> connectionMap;
QLocalServer *server;
quint32 instanceNumber; public Q_SLOTS:
QString blockServerName; void slotConnectionEstablished();
SingleApplication::Options options; void slotDataAvailable( QLocalSocket*, quint32 );
QMap<QLocalSocket*, ConnectionInfo> connectionMap; void slotClientConnectionClosed( QLocalSocket*, quint32 );
QStringList appDataList;
public Q_SLOTS:
void slotConnectionEstablished();
void slotDataAvailable( QLocalSocket*, quint32 );
void slotClientConnectionClosed( QLocalSocket*, quint32 );
}; };
#endif // SINGLEAPPLICATION_P_H #endif // SINGLEAPPLICATION_P_H

View File

@@ -1,7 +1,7 @@
{ {
"id": "org.qelectrotech.QElectroTech", "id": "org.qelectrotech.QElectroTech",
"runtime": "org.kde.Platform", "runtime": "org.kde.Platform",
"runtime-version": "5.15", "runtime-version": "5.14",
"sdk": "org.kde.Sdk", "sdk": "org.kde.Sdk",
"command": "qelectrotech", "command": "qelectrotech",
"rename-desktop-file": "qelectrotech.desktop", "rename-desktop-file": "qelectrotech.desktop",
@@ -10,61 +10,17 @@
"copy-icon": true, "copy-icon": true,
"finish-args": [ "finish-args": [
"--socket=wayland", "--socket=wayland",
"--socket=fallback-x11", "--socket=x11",
"--device=dri", "--device=dri",
"--share=ipc", "--share=ipc",
"--filesystem=host" "--filesystem=host"
], ],
"modules": [ "modules": [
{
"name": "tkinter",
"buildsystem": "simple",
"build-commands": [
"pip3 install --prefix=${FLATPAK_DEST} ."
],
"sources": [
{
"type": "git",
"url": "https://github.com/iwalton3/tkinter-standalone",
"commit": "2301112d142ebaf7532b25600c77d1a2edc9ef04"
}
],
"modules": [
{
"name": "tcl",
"sources": [
{
"type": "archive",
"url": "https://sourceforge.net/projects/tcl/files/Tcl/8.6.11/tcl8.6.11-src.tar.gz",
"sha256": "8c0486668586672c5693d7d95817cb05a18c5ecca2f40e2836b9578064088258"
}
],
"subdir": "unix",
"post-install": [
"chmod +w ${FLATPAK_DEST}/lib/libtcl8.6.so"
]
},
{
"name": "tk",
"sources": [
{
"type": "archive",
"url": "https://sourceforge.net/projects/tcl/files/Tcl/8.6.11/tk8.6.11-src.tar.gz",
"sha256": "5228a8187a7f70fa0791ef0f975270f068ba9557f57456f51eb02d9d4ea31282"
}
],
"subdir": "unix",
"post-install": [
"chmod +w ${FLATPAK_DEST}/lib/libtk8.6.so"
]
}
]
},
{ {
"name": "qelectrotech", "name": "qelectrotech",
"buildsystem": "qmake", "buildsystem": "qmake",
"post-install": [ "post-install": [
"mv ${FLATPAK_DEST}/share/mime/packages/qelectrotech.xml ${FLATPAK_DEST}/share/mime/packages/org.qelectrotech.QElectroTech.xml" "mv /app/share/mime/packages/qelectrotech.xml /app/share/mime/packages/org.qelectrotech.QElectroTech.xml"
], ],
"sources": [ "sources": [
{ {
@@ -76,34 +32,6 @@
"path": "patches/0001-build-Fix-the-installation-paths.patch" "path": "patches/0001-build-Fix-the-installation-paths.patch"
} }
] ]
}, }
{
"name": "python3-PySimpleGUI",
"buildsystem": "simple",
"build-commands": [
"pip3 install --no-index --find-links=\"file://${PWD}\" --prefix=${FLATPAK_DEST} PySimpleGUI"
],
"sources": [
{
"type": "file",
"url": "https://files.pythonhosted.org/packages/d0/c3/c1ce811a1e48d5e0f2df0b393ff189fae4842ec840bb6e4db79c8da55e74/PySimpleGUI-4.41.2.tar.gz",
"sha256": "cf42d9f61f28c8e790a9c031ce900a9cee5fd2f950da2f055ed36bbc487dcf11"
}
]
},
{
"name": "python3-qet-tb-generator",
"buildsystem": "simple",
"build-commands": [
"pip3 install --no-index --find-links=\"file://${PWD}\" --prefix=${FLATPAK_DEST} qet-tb-generator"
],
"sources": [
{
"type": "file",
"url": "https://files.pythonhosted.org/packages/45/be/d5940d365ebf256e490bc6c10837244e0b8dda08a7d790691767263c318d/qet_tb_generator-1.2.5.tar.gz",
"sha256": "37c3298602244f3152fbb7601caba9b4862bac782991fbb472eab91afb70d09c"
}
]
}
] ]
} }

View File

@@ -60,7 +60,6 @@ parts:
plugin: python plugin: python
python-version: python3 python-version: python3
source: https://github.com/qelectrotech/qet_tb_generator.git source: https://github.com/qelectrotech/qet_tb_generator.git
python-packages: [PySimpleGUI]
stage-packages: stage-packages:
- python3-lxml - python3-lxml
- python3-tk - python3-tk

View File

@@ -39,12 +39,10 @@ if(${QET_LANG_PATH} STRGREATER "")
message("QET_LANG_PATH " ${INSTALL_PREFIX}${QET_LANG_PATH}) message("QET_LANG_PATH " ${INSTALL_PREFIX}${QET_LANG_PATH})
add_definitions(-DQET_LANG_PATH=${INSTALL_PREFIX}${QET_LANG_PATH}) add_definitions(-DQET_LANG_PATH=${INSTALL_PREFIX}${QET_LANG_PATH})
endif() endif()
if (NOT MINGW)
if(${QET_EXAMPLES_PATH} STRGREATER "") if(${QET_EXAMPLES_PATH} STRGREATER "")
message("QET_EXAMPLES_PATH " ${INSTALL_PREFIX}${QET_EXAMPLES_PATH}) message("QET_EXAMPLES_PATH " ${INSTALL_PREFIX}${QET_EXAMPLES_PATH})
add_definitions(-DQET_EXAMPLES_PATH=${INSTALL_PREFIX}${QET_EXAMPLES_PATH}) add_definitions(-DQET_EXAMPLES_PATH=${INSTALL_PREFIX}${QET_EXAMPLES_PATH})
endif() endif()
endif()
message("QET_LICENSE_PATH " ${QET_LICENSE_PATH}) message("QET_LICENSE_PATH " ${QET_LICENSE_PATH})
message("QET_MIME_XML_PATH " ${QET_MIME_XML_PATH}) message("QET_MIME_XML_PATH " ${QET_MIME_XML_PATH})

View File

@@ -19,9 +19,9 @@ message(" - fetch_kdeaddons")
if(DEFINED BUILD_WITH_KF5) if(DEFINED BUILD_WITH_KF5)
Include(FetchContent) Include(FetchContent)
option(BUILD_KF5 "Build KF5 libraries, use system ones otherwise" YES) set(BUILD_KF5_YES "YES")
if(BUILD_KF5) if(DEFINED BUILD_KF5_YES)
if(NOT DEFINED KF5_GIT_TAG) if(NOT DEFINED KF5_GIT_TAG)
#https://qelectrotech.org/forum/viewtopic.php?pid=13924#p13924 #https://qelectrotech.org/forum/viewtopic.php?pid=13924#p13924

View File

@@ -18,16 +18,9 @@ message(" - fetch_pugixml")
Include(FetchContent) Include(FetchContent)
option(BUILD_PUGIXML "Build pugixml library, use system one otherwise" YES) FetchContent_Declare(
pugixml
GIT_REPOSITORY https://github.com/zeux/pugixml.git
GIT_TAG v1.11.1)
if(BUILD_PUGIXML) FetchContent_MakeAvailable(pugixml)
FetchContent_Declare(
pugixml
GIT_REPOSITORY https://github.com/zeux/pugixml.git
GIT_TAG v1.11.4)
FetchContent_MakeAvailable(pugixml)
else()
find_package(pugixml REQUIRED)
endif()

View File

@@ -26,6 +26,6 @@ Include(FetchContent)
FetchContent_Declare( FetchContent_Declare(
SingleApplication SingleApplication
GIT_REPOSITORY https://github.com/itay-grudev/SingleApplication.git GIT_REPOSITORY https://github.com/itay-grudev/SingleApplication.git
GIT_TAG v3.2.0) GIT_TAG v3.1.5)
FetchContent_MakeAvailable(SingleApplication) FetchContent_MakeAvailable(SingleApplication)

View File

@@ -28,6 +28,9 @@ if(GIT_FOUND AND EXISTS "${PROJECT_SOURCE_DIR}/.git")
# This strips terminating newline in the variable # This strips terminating newline in the variable
string(REGEX REPLACE "\n$" "" GIT_COMMIT_SHA "${GIT_COMMIT_SHA}") string(REGEX REPLACE "\n$" "" GIT_COMMIT_SHA "${GIT_COMMIT_SHA}")
# This adds to definitions => .cpp
add_definitions(-DGIT_COMMIT_SHA="${GIT_COMMIT_SHA}")
if(NOT GIT_COMMIT_RESULT EQUAL "0") if(NOT GIT_COMMIT_RESULT EQUAL "0")
message( message(
FATAL_ERROR FATAL_ERROR
@@ -36,6 +39,3 @@ if(GIT_FOUND AND EXISTS "${PROJECT_SOURCE_DIR}/.git")
", please check") ", please check")
endif() endif()
endif() endif()
# This adds to definitions => .cpp
add_definitions(-DGIT_COMMIT_SHA="${GIT_COMMIT_SHA}")

View File

@@ -52,8 +52,6 @@ set(QET_RES_FILES
${QET_DIR}/sources/editor/ui/lineeditor.ui ${QET_DIR}/sources/editor/ui/lineeditor.ui
${QET_DIR}/sources/editor/ui/polygoneditor.ui ${QET_DIR}/sources/editor/ui/polygoneditor.ui
${QET_DIR}/sources/editor/ui/rectangleeditor.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/ElementsCollection/ui/renamedialog.ui
${QET_DIR}/sources/factory/ui/addtabledialog.ui ${QET_DIR}/sources/factory/ui/addtabledialog.ui
${QET_DIR}/sources/NameList/ui/namelistdialog.ui ${QET_DIR}/sources/NameList/ui/namelistdialog.ui
@@ -113,6 +111,9 @@ set(QET_SRC_FILES
${QET_DIR}/sources/conductorsegmentprofile.h ${QET_DIR}/sources/conductorsegmentprofile.h
${QET_DIR}/sources/configdialog.cpp ${QET_DIR}/sources/configdialog.cpp
${QET_DIR}/sources/configdialog.h ${QET_DIR}/sources/configdialog.h
${QET_DIR}/sources/configpage.h
${QET_DIR}/sources/configpages.cpp
${QET_DIR}/sources/configpages.h
${QET_DIR}/sources/createdxf.cpp ${QET_DIR}/sources/createdxf.cpp
${QET_DIR}/sources/createdxf.h ${QET_DIR}/sources/createdxf.h
${QET_DIR}/sources/diagramcommands.cpp ${QET_DIR}/sources/diagramcommands.cpp
@@ -158,6 +159,8 @@ set(QET_SRC_FILES
${QET_DIR}/sources/main.cpp ${QET_DIR}/sources/main.cpp
${QET_DIR}/sources/newelementwizard.cpp ${QET_DIR}/sources/newelementwizard.cpp
${QET_DIR}/sources/newelementwizard.h ${QET_DIR}/sources/newelementwizard.h
${QET_DIR}/sources/projectconfigpages.cpp
${QET_DIR}/sources/projectconfigpages.h
${QET_DIR}/sources/projectview.cpp ${QET_DIR}/sources/projectview.cpp
${QET_DIR}/sources/projectview.h ${QET_DIR}/sources/projectview.h
${QET_DIR}/sources/qetapp.cpp ${QET_DIR}/sources/qetapp.cpp
@@ -257,8 +260,12 @@ set(QET_SRC_FILES
${QET_DIR}/sources/editor/elementscene.h ${QET_DIR}/sources/editor/elementscene.h
${QET_DIR}/sources/editor/elementview.cpp ${QET_DIR}/sources/editor/elementview.cpp
${QET_DIR}/sources/editor/elementview.h ${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.cpp
${QET_DIR}/sources/editor/styleeditor.h ${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.cpp
${QET_DIR}/sources/editor/esevent/eseventaddarc.h ${QET_DIR}/sources/editor/esevent/eseventaddarc.h
@@ -313,12 +320,8 @@ set(QET_SRC_FILES
${QET_DIR}/sources/editor/ui/polygoneditor.h ${QET_DIR}/sources/editor/ui/polygoneditor.h
${QET_DIR}/sources/editor/ui/rectangleeditor.cpp ${QET_DIR}/sources/editor/ui/rectangleeditor.cpp
${QET_DIR}/sources/editor/ui/rectangleeditor.h ${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.cpp
${QET_DIR}/sources/editor/ui/texteditor.h ${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.cpp
${QET_DIR}/sources/editor/UndoCommand/pastepartscommand.h ${QET_DIR}/sources/editor/UndoCommand/pastepartscommand.h
@@ -368,8 +371,6 @@ set(QET_SRC_FILES
${QET_DIR}/sources/print/projectprintwindow.cpp ${QET_DIR}/sources/print/projectprintwindow.cpp
${QET_DIR}/sources/print/projectprintwindow.h ${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.cpp
${QET_DIR}/sources/properties/propertiesinterface.h ${QET_DIR}/sources/properties/propertiesinterface.h
${QET_DIR}/sources/properties/reportproperties.cpp ${QET_DIR}/sources/properties/reportproperties.cpp
@@ -378,8 +379,6 @@ set(QET_SRC_FILES
${QET_DIR}/sources/properties/terminaldata.h ${QET_DIR}/sources/properties/terminaldata.h
${QET_DIR}/sources/properties/xrefproperties.cpp ${QET_DIR}/sources/properties/xrefproperties.cpp
${QET_DIR}/sources/properties/xrefproperties.h ${QET_DIR}/sources/properties/xrefproperties.h
${QET_DIR}/sources/properties/userproperties.cpp
${QET_DIR}/sources/properties/userproperties.h
${QET_DIR}/sources/PropertiesEditor/propertieseditordialog.h ${QET_DIR}/sources/PropertiesEditor/propertieseditordialog.h
${QET_DIR}/sources/PropertiesEditor/propertieseditordockwidget.cpp ${QET_DIR}/sources/PropertiesEditor/propertieseditordockwidget.cpp
@@ -576,13 +575,9 @@ set(QET_SRC_FILES
${QET_DIR}/sources/ui/titleblockpropertieswidget.h ${QET_DIR}/sources/ui/titleblockpropertieswidget.h
${QET_DIR}/sources/ui/xrefpropertieswidget.cpp ${QET_DIR}/sources/ui/xrefpropertieswidget.cpp
${QET_DIR}/sources/ui/xrefpropertieswidget.h ${QET_DIR}/sources/ui/xrefpropertieswidget.h
${QET_DIR}/sources/ui/configpage/configpage.h
${QET_DIR}/sources/ui/configpage/configpages.cpp
${QET_DIR}/sources/ui/configpage/configpages.h
${QET_DIR}/sources/ui/configpage/generalconfigurationpage.cpp ${QET_DIR}/sources/ui/configpage/generalconfigurationpage.cpp
${QET_DIR}/sources/ui/configpage/generalconfigurationpage.h ${QET_DIR}/sources/ui/configpage/generalconfigurationpage.h
${QET_DIR}/sources/ui/configpage/projectconfigpages.cpp
${QET_DIR}/sources/ui/configpage/projectconfigpages.h
${QET_DIR}/sources/undocommand/addelementtextcommand.cpp ${QET_DIR}/sources/undocommand/addelementtextcommand.cpp
${QET_DIR}/sources/undocommand/addelementtextcommand.h ${QET_DIR}/sources/undocommand/addelementtextcommand.h

View File

@@ -14,7 +14,7 @@
<name lang="hu">Beérkező hivatkozás</name> <name lang="hu">Beérkező hivatkozás</name>
<name lang="nl">Referentie Vorig</name> <name lang="nl">Referentie Vorig</name>
</names> </names>
<informations>Author: The QElectroTech team <informations>Author: The QElectroTech team&#xd;
License: see http://qelectrotech.org/wiki/doc/elements_license</informations> License: see http://qelectrotech.org/wiki/doc/elements_license</informations>
<description> <description>
<polygon x2="-1" y2="4" y4="-4" x1="-1" x3="9" y3="0" closed="false" style="line-style:normal;line-weight:normal;filling:black;color:black" y1="-4" x4="-1" antialias="true"/> <polygon x2="-1" y2="4" y4="-4" x1="-1" x3="9" y3="0" closed="false" style="line-style:normal;line-weight:normal;filling:black;color:black" y1="-4" x4="-1" antialias="true"/>

View File

@@ -14,7 +14,7 @@
<name lang="ru">Следующая страница</name> <name lang="ru">Следующая страница</name>
<name lang="cs">Další list</name> <name lang="cs">Další list</name>
</names> </names>
<informations>Author: The QElectroTech team <informations>Author: The QElectroTech team&#xd;
License: see http://qelectrotech.org/wiki/doc/elements_license</informations> License: see http://qelectrotech.org/wiki/doc/elements_license</informations>
<description> <description>
<polygon y3="0" y2="4" x4="-9" x3="2" x1="-9" x2="-9" y4="-4" style="line-style:normal;line-weight:normal;filling:black;color:black" y1="-4" closed="false" antialias="true"/> <polygon y3="0" y2="4" x4="-9" x3="2" x1="-9" x2="-9" y4="-4" style="line-style:normal;line-weight:normal;filling:black;color:black" y1="-4" closed="false" antialias="true"/>

View File

@@ -29,7 +29,7 @@
<elementInformation name="plant" show="1"></elementInformation> <elementInformation name="plant" show="1"></elementInformation>
<elementInformation name="label" show="1"></elementInformation> <elementInformation name="label" show="1"></elementInformation>
</elementInformations> </elementInformations>
<informations>titus <informations>titus&#xd;
titus0818@yahoo.com</informations> titus0818@yahoo.com</informations>
<description> <description>
<line y1="-16" x1="0" style="line-style:normal;line-weight:hight;filling:none;color:black" end2="none" y2="13" length2="1.5" length1="1.5" x2="0" end1="none" antialias="false"/> <line y1="-16" x1="0" style="line-style:normal;line-weight:hight;filling:none;color:black" end2="none" y2="13" length2="1.5" length1="1.5" x2="0" end1="none" antialias="false"/>

View File

@@ -15,7 +15,7 @@
<name lang="ru">Однополюсный + нейтраль</name> <name lang="ru">Однополюсный + нейтраль</name>
<name lang="hu">F + N</name> <name lang="hu">F + N</name>
</names> </names>
<informations>Author: The QElectroTech team <informations>Author: The QElectroTech team&#xd;
License: see http://qelectrotech.org/wiki/doc/elements_license</informations> License: see http://qelectrotech.org/wiki/doc/elements_license</informations>
<description> <description>
<input x="-5" y="-25.45" tagg="label" size="9" rotate="true" text="_"/> <input x="-5" y="-25.45" tagg="label" size="9" rotate="true" text="_"/>

View File

@@ -15,7 +15,7 @@
<name lang="ru">Трёхполюсный</name> <name lang="ru">Трёхполюсный</name>
<name lang="hu">3F</name> <name lang="hu">3F</name>
</names> </names>
<informations>Author: The QElectroTech team <informations>Author: The QElectroTech team&#xd;
License: see http://qelectrotech.org/wiki/doc/elements_license</informations> License: see http://qelectrotech.org/wiki/doc/elements_license</informations>
<description> <description>
<input x="-2" y="-34.45" tagg="label" size="9" rotate="true" text="_"/> <input x="-2" y="-34.45" tagg="label" size="9" rotate="true" text="_"/>

View File

@@ -15,7 +15,7 @@
<name lang="ru">Трёхполюсный + нейтраль</name> <name lang="ru">Трёхполюсный + нейтраль</name>
<name lang="hu">3F + N</name> <name lang="hu">3F + N</name>
</names> </names>
<informations>Author: The QElectroTech team <informations>Author: The QElectroTech team&#xd;
License: see http://qelectrotech.org/wiki/doc/elements_license</informations> License: see http://qelectrotech.org/wiki/doc/elements_license</informations>
<description> <description>
<input x="-7" y="-44.45" tagg="label" size="9" rotate="true" text="_"/> <input x="-7" y="-44.45" tagg="label" size="9" rotate="true" text="_"/>

View File

@@ -15,7 +15,7 @@
<name lang="ru">Фаза</name> <name lang="ru">Фаза</name>
<name lang="hu">F</name> <name lang="hu">F</name>
</names> </names>
<informations>Author: The QElectroTech team <informations>Author: The QElectroTech team&#xd;
License: see http://qelectrotech.org/wiki/doc/elements_license</informations> License: see http://qelectrotech.org/wiki/doc/elements_license</informations>
<description> <description>
<input x="-6" y="-14.45" tagg="label" size="9" rotate="true" text="_"/> <input x="-6" y="-14.45" tagg="label" size="9" rotate="true" text="_"/>

View File

@@ -28,7 +28,7 @@
<elementInformation name="plant" show="1"></elementInformation> <elementInformation name="plant" show="1"></elementInformation>
<elementInformation name="label" show="1"></elementInformation> <elementInformation name="label" show="1"></elementInformation>
</elementInformations> </elementInformations>
<informations>Author: The QElectroTech team <informations>Author: The QElectroTech team&#xd;
License: see http://qelectrotech.org/wiki/doc/elements_license</informations> License: see http://qelectrotech.org/wiki/doc/elements_license</informations>
<description> <description>
<dynamic_text uuid="{0af57a27-1887-4576-8b51-200ca996e582}" Halignment="AlignLeft" frame="false" x="2" Valignment="AlignTop" text_from="ElementInfo" y="-22.5" font="Sans Serif,9,-1,5,50,0,0,0,0,0" z="1" rotation="0" text_width="-1"> <dynamic_text uuid="{0af57a27-1887-4576-8b51-200ca996e582}" Halignment="AlignLeft" frame="false" x="2" Valignment="AlignTop" text_from="ElementInfo" y="-22.5" font="Sans Serif,9,-1,5,50,0,0,0,0,0" z="1" rotation="0" text_width="-1">

View File

@@ -1,23 +1,17 @@
<definition width="20" version="0.90" type="element" height="20" hotspot_y="9" link_type="simple" hotspot_x="9"> <definition width="20" height="20" hotspot_y="9" type="element" link_type="simple" hotspot_x="9" version="0.60">
<uuid uuid="{1eefef79-1c23-413b-873a-3d84f4aa5c25}"/> <uuid uuid="{079913f8-18b5-4524-84bd-aadf75dfefbf}"/>
<names> <names>
<name lang="fr">connexion</name>
<name lang="en">connection</name>
<name lang="cs">Bod</name> <name lang="cs">Bod</name>
<name lang="de">Verbindung</name> <name lang="de">Verbindung</name>
<name lang="hu">Keresztezés pont alakzatban</name> <name lang="hu">Keresztezés pont alakzatban</name>
</names> </names>
<elementInformations/>
<informations></informations> <informations></informations>
<description> <description>
<circle y="-2" style="line-style:normal;line-weight:normal;filling:black;color:black" antialias="false" diameter="4" x="-2"/> <circle diameter="4" style="line-style:normal;line-weight:normal;filling:black;color:black" antialias="false" y="-2" x="-2"/>
<dynamic_text y="-14.5" Valignment="AlignTop" keep_visual_rotation="false" text_from="ElementInfo" uuid="{2aef950d-c62d-4d3c-939b-3e81653d5244}" Halignment="AlignLeft" x="-11" font="Sans Serif,9,-1,5,50,0,0,0,0,0" rotation="0" z="2" text_width="-1" frame="false"> <input rotate="true" text=" " tagg="label" size="9" y="-3" x="-11"/>
<text></text> <terminal orientation="e" y="0" x="2"/>
<info_name>label</info_name> <terminal orientation="w" y="0" x="-2"/>
</dynamic_text> <terminal orientation="s" y="2" x="0"/>
<terminal y="0" type="Generic" uuid="{9cc2fc56-976f-49ac-a0f8-63eb85f716c2}" orientation="e" x="2" name=""/> <terminal orientation="n" y="-2" x="0"/>
<terminal y="0" type="Generic" uuid="{3c4b4f5e-98a2-4daa-9a47-40b8e018166e}" orientation="w" x="-2" name=""/>
<terminal y="2" type="Generic" uuid="{8d99aa04-def0-4573-a0e8-41229ed2f1dc}" orientation="s" x="0" name=""/>
<terminal y="-2" type="Generic" uuid="{f2e49ff6-ee59-492e-a6ad-82708479afd6}" orientation="n" x="0" name=""/>
</description> </description>
</definition> </definition>

View File

@@ -1,24 +1,22 @@
<definition type="element" width="30" hotspot_y="12" version="0.90" height="30" link_type="simple" hotspot_x="14"> <definition hotspot_x="14" height="30" link_type="simple" width="30" version="0.80" type="element" hotspot_y="12">
<uuid uuid="{9b3513fd-694f-4fc7-8b7e-66b733b9b4e1}"/> <uuid uuid="{0b6817fe-dd44-42a8-8e7c-3c110d13b8a2}"/>
<names> <names>
<name lang="hu">Egyesítő négy vezetékhez</name>
<name lang="de">Klemmstelle (3)</name> <name lang="de">Klemmstelle (3)</name>
<name lang="cs">Všestranný spoj</name> <name lang="cs">Všestranný spoj</name>
<name lang="hu">Egyesítő négy vezetékhez</name>
<name lang="fr">
Connecteur pour quatre fils</name>
</names> </names>
<elementInformations/> <elementInformations/>
<informations></informations> <informations></informations>
<description> <description>
<dynamic_text frame="false" text_width="-1" rotation="0" Halignment="AlignLeft" y="-12" x="-13" keep_visual_rotation="true" uuid="{14c0b70c-c028-49ef-bf72-3c3c9cd64669}" Valignment="AlignTop" z="2" font="Sans Serif,9,-1,5,50,0,0,0,0,0" text_from="ElementInfo"> <dynamic_text Valignment="AlignTop" x="-13" text_from="ElementInfo" text_width="-1" z="2" uuid="{14c0b70c-c028-49ef-bf72-3c3c9cd64669}" y="-12" rotation="0" frame="false" Halignment="AlignLeft" font="Sans Serif,9,-1,5,50,0,0,0,0,0">
<text></text> <text></text>
<info_name>label</info_name> <info_name>label</info_name>
</dynamic_text> </dynamic_text>
<polygon x1="-10" y2="0" x4="5" y3="5" x3="0" x5="10" style="line-style:normal;line-weight:normal;filling:none;color:black" y1="0" y4="0" antialias="false" x2="-5" y5="0" closed="false"/> <polygon x1="-10" y5="0" x3="0" x5="10" y2="0" y3="5" closed="false" style="line-style:normal;line-weight:normal;filling:none;color:black" x4="5" x2="-5" antialias="false" y4="0" y1="0"/>
<line x1="0" y2="10" length2="1.5" end1="none" length1="1.5" style="line-style:normal;line-weight:normal;filling:none;color:black" end2="none" y1="-5" antialias="false" x2="0"/> <line x1="0" end1="none" y2="10" style="line-style:normal;line-weight:normal;filling:none;color:black" x2="0" length1="1.5" antialias="false" end2="none" y1="-5" length2="1.5"/>
<terminal type="Generic" name="" y="0" x="10" uuid="{06bf5c9f-6986-45bf-b11f-02e876abc4b8}" orientation="e"/> <terminal x="10" orientation="e" uuid="{06bf5c9f-6986-45bf-b11f-02e876abc4b8}" y="0" name=""/>
<terminal type="Generic" name="" y="-5" x="0" uuid="{33c03677-8555-4b42-ae2c-4b4308978086}" orientation="n"/> <terminal x="0" orientation="n" uuid="{33c03677-8555-4b42-ae2c-4b4308978086}" y="-5" name=""/>
<terminal type="Generic" name="" y="0" x="-10" uuid="{95bef6e9-343e-45d7-9705-4aa81f62bed0}" orientation="w"/> <terminal x="-10" orientation="w" uuid="{95bef6e9-343e-45d7-9705-4aa81f62bed0}" y="0" name=""/>
<terminal type="Generic" name="" y="10" x="0" uuid="{e9329e22-255b-4763-9dc6-65da277e1ac7}" orientation="s"/> <terminal x="0" orientation="s" uuid="{e9329e22-255b-4763-9dc6-65da277e1ac7}" y="10" name=""/>
</description> </description>
</definition> </definition>

View File

@@ -10,7 +10,7 @@
<name lang="cs">Kabel 3G</name> <name lang="cs">Kabel 3G</name>
<name lang="hu">Kábel 2 + PE</name> <name lang="hu">Kábel 2 + PE</name>
</names> </names>
<informations>Author: The QElectroTech team <informations>Author: The QElectroTech team&#xd;
License: see http://qelectrotech.org/wiki/doc/elements_license</informations> License: see http://qelectrotech.org/wiki/doc/elements_license</informations>
<description> <description>
<text x="12" y="9" size="4" text="2"/> <text x="12" y="9" size="4" text="2"/>

View File

@@ -10,7 +10,7 @@
<name lang="cs">Kabel 4G</name> <name lang="cs">Kabel 4G</name>
<name lang="hu">Kábel 3 + PE</name> <name lang="hu">Kábel 3 + PE</name>
</names> </names>
<informations>Author: The QElectroTech team <informations>Author: The QElectroTech team&#xd;
License: see http://qelectrotech.org/wiki/doc/elements_license</informations> License: see http://qelectrotech.org/wiki/doc/elements_license</informations>
<description> <description>
<line length1="1.5" length2="1.5" antialias="true" end1="none" end2="none" style="line-style:normal;line-weight:normal;filling:none;color:black" y1="7.95" x1="-12.05" y2="11.95" x2="-8.05"/> <line length1="1.5" length2="1.5" antialias="true" end1="none" end2="none" style="line-style:normal;line-weight:normal;filling:none;color:black" y1="7.95" x1="-12.05" y2="11.95" x2="-8.05"/>

View File

@@ -10,7 +10,7 @@
<name lang="cs">Kabel 3G</name> <name lang="cs">Kabel 3G</name>
<name lang="hu">Kábel 2 + PE</name> <name lang="hu">Kábel 2 + PE</name>
</names> </names>
<informations>Author: The QElectroTech team <informations>Author: The QElectroTech team&#xd;
License: see http://qelectrotech.org/wiki/doc/elements_license</informations> License: see http://qelectrotech.org/wiki/doc/elements_license</informations>
<description> <description>
<line length1="1.5" length2="1.5" antialias="true" end1="none" end2="none" style="line-style:normal;line-weight:normal;filling:none;color:black" y1="7.95" x1="17.95" y2="11.95" x2="21.95"/> <line length1="1.5" length2="1.5" antialias="true" end1="none" end2="none" style="line-style:normal;line-weight:normal;filling:none;color:black" y1="7.95" x1="17.95" y2="11.95" x2="21.95"/>

View File

@@ -8,7 +8,7 @@
<name lang="cs">Kabel 4G</name> <name lang="cs">Kabel 4G</name>
<name lang="hu">Kábel 3 + PE</name> <name lang="hu">Kábel 3 + PE</name>
</names> </names>
<informations>Author: The QElectroTech team <informations>Author: The QElectroTech team&#xd;
License: see http://qelectrotech.org/wiki/doc/elements_license</informations> License: see http://qelectrotech.org/wiki/doc/elements_license</informations>
<description> <description>
<line length1="1.5" length2="1.5" antialias="true" end1="none" end2="none" style="line-style:normal;line-weight:normal;filling:none;color:black" y1="7.95" x1="-33.05" y2="11.95" x2="-29.05"/> <line length1="1.5" length2="1.5" antialias="true" end1="none" end2="none" style="line-style:normal;line-weight:normal;filling:none;color:black" y1="7.95" x1="-33.05" y2="11.95" x2="-29.05"/>

View File

@@ -8,7 +8,7 @@
<name lang="cs">Kabel 5G</name> <name lang="cs">Kabel 5G</name>
<name lang="hu">Kábel 4 + N + PE</name> <name lang="hu">Kábel 4 + N + PE</name>
</names> </names>
<informations>Author: The QElectroTech team <informations>Author: The QElectroTech team&#xd;
License: see http://qelectrotech.org/wiki/doc/elements_license</informations> License: see http://qelectrotech.org/wiki/doc/elements_license</informations>
<description> <description>
<line end1="none" x1="-42.05" y1="7.95" x2="-38.05" length1="1.5" y2="11.95" antialias="true" end2="none" length2="1.5" style="line-style:normal;line-weight:normal;filling:none;color:black"/> <line end1="none" x1="-42.05" y1="7.95" x2="-38.05" length1="1.5" y2="11.95" antialias="true" end2="none" length2="1.5" style="line-style:normal;line-weight:normal;filling:none;color:black"/>

View File

@@ -8,7 +8,7 @@
<name lang="cs">Kabel 3G</name> <name lang="cs">Kabel 3G</name>
<name lang="hu">Kábel 2 + PE</name> <name lang="hu">Kábel 2 + PE</name>
</names> </names>
<informations>Author: The QElectroTech team <informations>Author: The QElectroTech team&#xd;
License: see http://qelectrotech.org/wiki/doc/elements_license</informations> License: see http://qelectrotech.org/wiki/doc/elements_license</informations>
<description> <description>
<line end1="none" x1="-23.05" y1="7.95" x2="-19.05" length1="1.5" y2="11.95" antialias="true" end2="none" length2="1.5" style="line-style:normal;line-weight:normal;filling:none;color:black"/> <line end1="none" x1="-23.05" y1="7.95" x2="-19.05" length1="1.5" y2="11.95" antialias="true" end2="none" length2="1.5" style="line-style:normal;line-weight:normal;filling:none;color:black"/>

View File

@@ -7,7 +7,7 @@
<name lang="hu">Kábel 2 + PE</name> <name lang="hu">Kábel 2 + PE</name>
</names> </names>
<elementInformations/> <elementInformations/>
<informations>Author: The QElectroTech team <informations>Author: The QElectroTech team&#xd;
License: see http://qelectrotech.org/wiki/doc/elements_license</informations> License: see http://qelectrotech.org/wiki/doc/elements_license</informations>
<description> <description>
<line x2="1.95" end1="none" style="line-style:normal;line-weight:normal;filling:none;color:black" y1="-2.05" length2="1.5" antialias="true" y2="1.95" end2="none" x1="-2.05" length1="1.5"/> <line x2="1.95" end1="none" style="line-style:normal;line-weight:normal;filling:none;color:black" y1="-2.05" length2="1.5" antialias="true" y2="1.95" end2="none" x1="-2.05" length1="1.5"/>

View File

@@ -10,7 +10,7 @@
<name lang="fr">Cable 3 phases+terre</name> <name lang="fr">Cable 3 phases+terre</name>
<name lang="hu">Kábel 3 + PE</name> <name lang="hu">Kábel 3 + PE</name>
</names> </names>
<informations>Author: The QElectroTech team <informations>Author: The QElectroTech team&#xd;
License: see http://qelectrotech.org/wiki/doc/elements_license</informations> License: see http://qelectrotech.org/wiki/doc/elements_license</informations>
<description> <description>
<line x1="-2.05" y1="-2.05" end1="none" style="line-style:normal;line-weight:normal;filling:none;color:black" end2="none" length1="1.5" length2="1.5" x2="1.95" y2="1.95" antialias="true"/> <line x1="-2.05" y1="-2.05" end1="none" style="line-style:normal;line-weight:normal;filling:none;color:black" end2="none" length1="1.5" length2="1.5" x2="1.95" y2="1.95" antialias="true"/>

View File

@@ -10,7 +10,7 @@
<name lang="fr">Cable 6 phases+terre</name> <name lang="fr">Cable 6 phases+terre</name>
<name lang="hu">Kábel 6 + PE</name> <name lang="hu">Kábel 6 + PE</name>
</names> </names>
<informations>Author: The QElectroTech team <informations>Author: The QElectroTech team&#xd;
License: see http://qelectrotech.org/wiki/doc/elements_license</informations> License: see http://qelectrotech.org/wiki/doc/elements_license</informations>
<description> <description>
<input size="4" tagg="none" rotate="true" x="38" y="-4" text="6"/> <input size="4" tagg="none" rotate="true" x="38" y="-4" text="6"/>

View File

@@ -9,7 +9,7 @@
<name lang="es">Sección 1 conductor</name> <name lang="es">Sección 1 conductor</name>
<name lang="hu">1 ér keresztmetszet</name> <name lang="hu">1 ér keresztmetszet</name>
</names> </names>
<informations>Author: The QElectroTech team <informations>Author: The QElectroTech team&#xd;
License: see http://qelectrotech.org/wiki/doc/elements_license</informations> License: see http://qelectrotech.org/wiki/doc/elements_license</informations>
<description> <description>
<line antialias="false" length1="1.5" x2="9.91885" end2="none" x1="-10.8483" end1="none" y2="0" length2="1.5" style="line-style:normal;line-weight:normal;filling:none;color:black" y1="0"/> <line antialias="false" length1="1.5" x2="9.91885" end2="none" x1="-10.8483" end1="none" y2="0" length2="1.5" style="line-style:normal;line-weight:normal;filling:none;color:black" y1="0"/>

View File

@@ -9,7 +9,7 @@
<name lang="es">Sección 2 conductores</name> <name lang="es">Sección 2 conductores</name>
<name lang="hu">2 ér keresztmetszet</name> <name lang="hu">2 ér keresztmetszet</name>
</names> </names>
<informations>Author: The QElectroTech team <informations>Author: The QElectroTech team&#xd;
License: see http://qelectrotech.org/wiki/doc/elements_license</informations> License: see http://qelectrotech.org/wiki/doc/elements_license</informations>
<description> <description>
<line antialias="true" length1="1.5" x2="41.95" end2="none" x1="37.95" end1="none" y2="1.95" length2="1.5" style="line-style:normal;line-weight:normal;filling:none;color:black" y1="-2.05"/> <line antialias="true" length1="1.5" x2="41.95" end2="none" x1="37.95" end1="none" y2="1.95" length2="1.5" style="line-style:normal;line-weight:normal;filling:none;color:black" y1="-2.05"/>

View File

@@ -9,7 +9,7 @@
<name lang="es">Sección 2 conductores</name> <name lang="es">Sección 2 conductores</name>
<name lang="hu">2 ér keresztmetszet</name> <name lang="hu">2 ér keresztmetszet</name>
</names> </names>
<informations>Author: The QElectroTech team <informations>Author: The QElectroTech team&#xd;
License: see http://qelectrotech.org/wiki/doc/elements_license</informations> License: see http://qelectrotech.org/wiki/doc/elements_license</informations>
<description> <description>
<line antialias="true" length1="1.5" x2="21.95" end2="none" x1="17.95" end1="none" y2="1.95" length2="1.5" style="line-style:normal;line-weight:normal;filling:none;color:black" y1="-2.05"/> <line antialias="true" length1="1.5" x2="21.95" end2="none" x1="17.95" end1="none" y2="1.95" length2="1.5" style="line-style:normal;line-weight:normal;filling:none;color:black" y1="-2.05"/>

View File

@@ -9,7 +9,7 @@
<name lang="es">Sección 3 conductores</name> <name lang="es">Sección 3 conductores</name>
<name lang="hu">3 ér keresztmetszet</name> <name lang="hu">3 ér keresztmetszet</name>
</names> </names>
<informations>Author: The QElectroTech team <informations>Author: The QElectroTech team&#xd;
License: see http://qelectrotech.org/wiki/doc/elements_license</informations> License: see http://qelectrotech.org/wiki/doc/elements_license</informations>
<description> <description>
<line antialias="true" length1="1.5" x2="41.95" end2="none" x1="37.95" end1="none" y2="1.95" length2="1.5" style="line-style:normal;line-weight:normal;filling:none;color:black" y1="-2.05"/> <line antialias="true" length1="1.5" x2="41.95" end2="none" x1="37.95" end1="none" y2="1.95" length2="1.5" style="line-style:normal;line-weight:normal;filling:none;color:black" y1="-2.05"/>

View File

@@ -14,7 +14,7 @@
<kindInformations> <kindInformations>
<kindInformation name="type" show="1">protection</kindInformation> <kindInformation name="type" show="1">protection</kindInformation>
</kindInformations> </kindInformations>
<informations>Author: The QElectroTech team <informations>Author: The QElectroTech team&#xd;
License: see http://qelectrotech.org/wiki/doc/elements_license</informations> License: see http://qelectrotech.org/wiki/doc/elements_license</informations>
<description> <description>
<polygon antialias="true" style="line-style:normal;line-weight:normal;filling:none;color:black" closed="false" y1="-10" x1="-15" y2="10" x2="-10" y3="20" x3="-10"/> <polygon antialias="true" style="line-style:normal;line-weight:normal;filling:none;color:black" closed="false" y1="-10" x1="-15" y2="10" x2="-10" y3="20" x3="-10"/>

View File

@@ -15,7 +15,7 @@
<kindInformations> <kindInformations>
<kindInformation name="type" show="1">protection</kindInformation> <kindInformation name="type" show="1">protection</kindInformation>
</kindInformations> </kindInformations>
<informations>Author: The QElectroTech team <informations>Author: The QElectroTech team&#xd;
License: see http://qelectrotech.org/wiki/doc/elements_license</informations> License: see http://qelectrotech.org/wiki/doc/elements_license</informations>
<description> <description>
<polygon antialias="true" style="line-style:normal;line-weight:normal;filling:none;color:black" closed="false" y1="-10" x1="25" y2="10" x2="30" y3="20" x3="30"/> <polygon antialias="true" style="line-style:normal;line-weight:normal;filling:none;color:black" closed="false" y1="-10" x1="25" y2="10" x2="30" y3="20" x3="30"/>

View File

@@ -15,7 +15,7 @@
<kindInformations> <kindInformations>
<kindInformation name="type" show="1">protection</kindInformation> <kindInformation name="type" show="1">protection</kindInformation>
</kindInformations> </kindInformations>
<informations>Author: The QElectroTech team <informations>Author: The QElectroTech team&#xd;
License: see http://qelectrotech.org/wiki/doc/elements_license</informations> License: see http://qelectrotech.org/wiki/doc/elements_license</informations>
<description> <description>
<line length1="1.5" length2="1.5" antialias="false" end1="none" end2="none" style="line-style:dashed;line-weight:thin;filling:none;color:black" y1="0" x1="-33" y2="0" x2="-26"/> <line length1="1.5" length2="1.5" antialias="false" end1="none" end2="none" style="line-style:dashed;line-weight:thin;filling:none;color:black" y1="0" x1="-33" y2="0" x2="-26"/>

View File

@@ -15,7 +15,7 @@
<kindInformations> <kindInformations>
<kindInformation name="type" show="1">protection</kindInformation> <kindInformation name="type" show="1">protection</kindInformation>
</kindInformations> </kindInformations>
<informations>Author: The QElectroTech team <informations>Author: The QElectroTech team&#xd;
License: see http://qelectrotech.org/wiki/doc/elements_license</informations> License: see http://qelectrotech.org/wiki/doc/elements_license</informations>
<description> <description>
<polygon antialias="true" style="line-style:normal;line-weight:normal;filling:none;color:black" closed="false" y1="-10" x1="-15" y2="10" x2="-10" y3="20" x3="-10"/> <polygon antialias="true" style="line-style:normal;line-weight:normal;filling:none;color:black" closed="false" y1="-10" x1="-15" y2="10" x2="-10" y3="20" x3="-10"/>

View File

@@ -12,7 +12,6 @@
<name lang="pt">Descarregador de faísca</name> <name lang="pt">Descarregador de faísca</name>
<name lang="fr">Éclateur</name> <name lang="fr">Éclateur</name>
<name lang="nl">Vonkbrug</name> <name lang="nl">Vonkbrug</name>
<name lang="hu">Szikraköz</name>
</names> </names>
<informations>Author: The QElectroTech team <informations>Author: The QElectroTech team
License: see http://qelectrotech.org/wiki/doc/elements_license</informations> License: see http://qelectrotech.org/wiki/doc/elements_license</informations>

View File

@@ -8,7 +8,6 @@
<name lang="cs">Varistor</name> <name lang="cs">Varistor</name>
<name lang="it">Varistore Metal-oxide</name> <name lang="it">Varistore Metal-oxide</name>
<name lang="nl">Varistor Metal-oxide</name> <name lang="nl">Varistor Metal-oxide</name>
<name lang="hu">Fém-oxid varisztor</name>
</names> </names>
<kindInformations> <kindInformations>
<kindInformation name="type" show="1">protection</kindInformation> <kindInformation name="type" show="1">protection</kindInformation>

View File

@@ -10,11 +10,10 @@
<name lang="el">Προστασία από υπέρταση</name> <name lang="el">Προστασία από υπέρταση</name>
<name lang="fr">Parafoudre</name> <name lang="fr">Parafoudre</name>
<name lang="en">Surge protection</name> <name lang="en">Surge protection</name>
<name lang="hu">Túlfeszültség védő</name>
<name lang="es">Protección contra descargas 2</name> <name lang="es">Protección contra descargas 2</name>
</names> </names>
<elementInformations/> <elementInformations/>
<informations>Author: The QElectroTech team <informations>Author: The QElectroTech team&#xd;
License: see http://qelectrotech.org/wiki/doc/elements_license</informations> License: see http://qelectrotech.org/wiki/doc/elements_license</informations>
<description> <description>
<dynamic_text z="1" text_from="ElementInfo" rotation="0" text_width="-1" Valignment="AlignTop" frame="false" x="18" font="Sans Serif,9,-1,5,50,0,0,0,0,0" y="-15.45" uuid="{daef117a-d243-49f7-b089-6a8ffe076f69}" Halignment="AlignLeft"> <dynamic_text z="1" text_from="ElementInfo" rotation="0" text_width="-1" Valignment="AlignTop" frame="false" x="18" font="Sans Serif,9,-1,5,50,0,0,0,0,0" y="-15.45" uuid="{daef117a-d243-49f7-b089-6a8ffe076f69}" Halignment="AlignLeft">

View File

@@ -2,7 +2,6 @@
<uuid uuid="{5FC5912D-A466-4E02-8051-7F08868D3FB5}"/><names> <uuid uuid="{5FC5912D-A466-4E02-8051-7F08868D3FB5}"/><names>
<name lang="de">Blitzschutz</name> <name lang="de">Blitzschutz</name>
<name lang="en">Surge protector</name> <name lang="en">Surge protector</name>
<name lang="hu">Túlfeszültség védő</name>
<name lang="es">Protección contra descargas</name> <name lang="es">Protección contra descargas</name>
<name lang="it">Scaricatore</name> <name lang="it">Scaricatore</name>
<name lang="fr">Parafoudre</name> <name lang="fr">Parafoudre</name>

View File

@@ -11,7 +11,6 @@
<name lang="pl">Ogranicznik przepięć</name> <name lang="pl">Ogranicznik przepięć</name>
<name lang="ar">حامي من الصواعق</name> <name lang="ar">حامي من الصواعق</name>
<name lang="en">Surge protection</name> <name lang="en">Surge protection</name>
<name lang="hu">Túlfeszültség védő</name>
</names> </names>
<elementInformations> <elementInformations>
<elementInformation show="1" name="unity"></elementInformation> <elementInformation show="1" name="unity"></elementInformation>

View File

@@ -8,7 +8,6 @@
<name lang="cs">Bleskojistka, ochrana proti přepětí</name> <name lang="cs">Bleskojistka, ochrana proti přepětí</name>
<name lang="fr">Parafoudre</name> <name lang="fr">Parafoudre</name>
<name lang="en">Surge protector</name> <name lang="en">Surge protector</name>
<name lang="hu">Túlfeszültség védő</name>
<name lang="es">Protección contra descargas</name> <name lang="es">Protección contra descargas</name>
</names> </names>
<elementInformations> <elementInformations>

View File

@@ -11,6 +11,5 @@
<name lang="el">Προστασία από υπέρταση</name> <name lang="el">Προστασία από υπέρταση</name>
<name lang="nl">Overspanningsbeveiliging</name> <name lang="nl">Overspanningsbeveiliging</name>
<name lang="da">Overspændingsbeskyttelse</name> <name lang="da">Overspændingsbeskyttelse</name>
<name lang="hu">Túlfeszültség védelem</name>
</names> </names>
</qet-directory> </qet-directory>

View File

@@ -8,7 +8,6 @@
<name lang="pl">Odgromnik gazowyładowczy dwuelektrodowy</name> <name lang="pl">Odgromnik gazowyładowczy dwuelektrodowy</name>
<name lang="cs">Plynová bleskojistka</name> <name lang="cs">Plynová bleskojistka</name>
<name lang="nl">gasontladingsbuis</name> <name lang="nl">gasontladingsbuis</name>
<name lang="hu">Védőgázas szimetrikus kisülőcső</name>
</names> </names>
<kindInformations> <kindInformations>
<kindInformation name="type" show="1">protection</kindInformation> <kindInformation name="type" show="1">protection</kindInformation>

View File

@@ -8,7 +8,6 @@
<name lang="pl">Odgromnik gazowyładowczy trójelektrodowy</name> <name lang="pl">Odgromnik gazowyładowczy trójelektrodowy</name>
<name lang="cs">Dvojitá plynová bleskojistka</name> <name lang="cs">Dvojitá plynová bleskojistka</name>
<name lang="nl">Symmetrische gasontlading buis</name> <name lang="nl">Symmetrische gasontlading buis</name>
<name lang="hu">Védőgázas kisülőcső</name>
</names> </names>
<kindInformations> <kindInformations>
<kindInformation name="type" show="1">protection</kindInformation> <kindInformation name="type" show="1">protection</kindInformation>

View File

@@ -11,7 +11,6 @@
<name lang="es">Bobina</name> <name lang="es">Bobina</name>
<name lang="cs">Cívka relé</name> <name lang="cs">Cívka relé</name>
<name lang="nl">Spoel</name> <name lang="nl">Spoel</name>
<name lang="hu">Tekercs</name>
<name lang="be">Relais spoel (algemeen)</name> <name lang="be">Relais spoel (algemeen)</name>
</names> </names>
<kindInformations> <kindInformations>

View File

@@ -12,7 +12,6 @@
<name lang="cs">Bistabilní remanentní relé</name> <name lang="cs">Bistabilní remanentní relé</name>
<name lang="nl">spoel remanent</name> <name lang="nl">spoel remanent</name>
<name lang="be">Spoel KA remanent</name> <name lang="be">Spoel KA remanent</name>
<name lang="hu">Tekercs</name>
</names> </names>
<kindInformations> <kindInformations>
<kindInformation name="type" show="1">coil</kindInformation> <kindInformation name="type" show="1">coil</kindInformation>

View File

@@ -11,7 +11,6 @@
<name lang="es">Bobina KA con enclavamiento mecánico</name> <name lang="es">Bobina KA con enclavamiento mecánico</name>
<name lang="cs">Mechanické blokovací relé</name> <name lang="cs">Mechanické blokovací relé</name>
<name lang="nl">spoel met vergrendeling</name> <name lang="nl">spoel met vergrendeling</name>
<name lang="hu">Tekercs</name>
<name lang="be">Spoel KA met mechanische vergrendeling</name> <name lang="be">Spoel KA met mechanische vergrendeling</name>
</names> </names>
<kindInformations> <kindInformations>

View File

@@ -9,7 +9,6 @@
<name lang="cs">Relé se zpožděným zapnutím a vypnutím</name> <name lang="cs">Relé se zpožděným zapnutím a vypnutím</name>
<name lang="de">Relais ansprech- und rückfallverzögert</name> <name lang="de">Relais ansprech- und rückfallverzögert</name>
<name lang="it">Bobina di relè ritardato</name> <name lang="it">Bobina di relè ritardato</name>
<name lang="hu">Tekercs be/ki késleltetéssel</name>
<name lang="el">Πηνίο χρονικού, καθυστέρηση ενεργοποίησης-απενεργοποίησης</name> <name lang="el">Πηνίο χρονικού, καθυστέρηση ενεργοποίησης-απενεργοποίησης</name>
<name lang="ar">ملف مُؤقت مع تأخير الإستجابة و تأخير الإعتاق</name> <name lang="ar">ملف مُؤقت مع تأخير الإستجابة و تأخير الإعتاق</name>
<name lang="pl">Cewka przekaźnika działającego ze zwłoką przy wzbudzeniu i odwzbudzeniu</name> <name lang="pl">Cewka przekaźnika działającego ze zwłoką przy wzbudzeniu i odwzbudzeniu</name>

View File

@@ -2,7 +2,6 @@
<uuid uuid="{7E996B1F-B537-44D9-A3E9-DB5F30487400}"/><names> <uuid uuid="{7E996B1F-B537-44D9-A3E9-DB5F30487400}"/><names>
<name lang="be">Spoel met uitschakel vertraging</name> <name lang="be">Spoel met uitschakel vertraging</name>
<name lang="en">Coil with off delay</name> <name lang="en">Coil with off delay</name>
<name lang="hu">Tekercs ki késleltetéssel</name>
<name lang="fr">Bobine tempo repos</name> <name lang="fr">Bobine tempo repos</name>
<name lang="ru">Обмотка</name> <name lang="ru">Обмотка</name>
<name lang="es">Bobina de reposo temporizado</name> <name lang="es">Bobina de reposo temporizado</name>

View File

@@ -2,7 +2,6 @@
<uuid uuid="{14D69713-ADDE-4ACD-8654-50E3E60B61F7}"/><names> <uuid uuid="{14D69713-ADDE-4ACD-8654-50E3E60B61F7}"/><names>
<name lang="be">Spoel met inschakel vertraging</name> <name lang="be">Spoel met inschakel vertraging</name>
<name lang="en">Coil with on delay</name> <name lang="en">Coil with on delay</name>
<name lang="hu">Tekercs be késleltetéssel</name>
<name lang="fr">Bobine tempo travail</name> <name lang="fr">Bobine tempo travail</name>
<name lang="ru">Обмотка</name> <name lang="ru">Обмотка</name>
<name lang="es">Bobina de trabajo temporizado</name> <name lang="es">Bobina de trabajo temporizado</name>

View File

@@ -1,34 +1,31 @@
<definition height="50" hotspot_y="25" type="element" link_type="master" hotspot_x="23" version="0.90" width="40"> <definition type="element" height="50" hotspot_y="25" version="0.70" width="40" hotspot_x="23" link_type="master">
<uuid uuid="{b0c301a0-f0d5-4a66-888a-66e550fd63c9}"/> <uuid uuid="{45a179e7-866e-4756-965f-d2445ced8dd2}"/>
<names> <names>
<name lang="hu">Időzítő relé</name>
<name lang="cs">Časové relé</name> <name lang="cs">Časové relé</name>
<name lang="en">Timer</name>
<name lang="fr">Relais temporisé</name>
</names> </names>
<kindInformations> <kindInformations>
<kindInformation name="type">coil</kindInformation> <kindInformation show="1" name="type">coil</kindInformation>
</kindInformations> </kindInformations>
<elementInformations/> <elementInformations/>
<informations></informations> <informations></informations>
<description> <description>
<rect height="15" x="-14" y="-8" antialias="false" rx="0" style="line-style:normal;line-weight:normal;filling:none;color:black" ry="0" width="28"/> <rect style="line-style:normal;line-weight:normal;filling:none;color:black" x="-14" height="15" rx="0" width="28" y="-8" ry="0" antialias="false"/>
<rect height="15" x="-20" y="-8" antialias="false" rx="0" style="line-style:normal;line-weight:normal;filling:black;color:black" ry="0" width="5"/> <rect style="line-style:normal;line-weight:normal;filling:black;color:black" x="-20" height="15" rx="0" width="5" y="-8" ry="0" antialias="false"/>
<dynamic_text x="-45" y="-12" keep_visual_rotation="true" font="Sans Serif,9,-1,5,50,0,0,0,0,0" frame="false" Halignment="AlignLeft" z="3" Valignment="AlignTop" text_width="-1" uuid="{bf273769-c856-4d5c-a56a-6a014b357999}" rotation="0" text_from="ElementInfo"> <dynamic_text z="3" Valignment="AlignTop" x="-45" text_from="ElementInfo" font="Sans Serif,9,-1,5,50,0,0,0,0,0" rotation="0" uuid="{bf273769-c856-4d5c-a56a-6a014b357999}" y="-12" Halignment="AlignLeft" frame="false" text_width="-1">
<text></text> <text></text>
<info_name>label</info_name> <info_name>label</info_name>
</dynamic_text> </dynamic_text>
<text x="2" y="-10" color="#000000" text="A1" font="Sans Serif,5,-1,5,50,0,0,0,0,0" rotation="0"/> <text x="2" font="Sans Serif,5,-1,5,50,0,0,0,0,0" rotation="0" y="-10" text="A1" color="#000000"/>
<text x="1" y="15" color="#000000" text="A2" font="Sans Serif,5,-1,5,50,0,0,0,0,0" rotation="0"/> <text x="1" font="Sans Serif,5,-1,5,50,0,0,0,0,0" rotation="0" y="15" text="A2" color="#000000"/>
<text x="-9" y="-10" color="#000000" text="S" font="Sans Serif,5,-1,5,50,0,0,0,0,0" rotation="0"/> <text x="-9" font="Sans Serif,5,-1,5,50,0,0,0,0,0" rotation="0" y="-10" text="S" color="#000000"/>
<line end1="none" end2="none" length2="1.5" antialias="false" x2="0" y2="-15" style="line-style:normal;line-weight:normal;filling:none;color:black" x1="0" y1="-8" length1="1.5"/> <line style="line-style:normal;line-weight:normal;filling:none;color:black" end2="none" x1="0" y2="-15" end1="none" y1="-8" length1="1.5" length2="1.5" antialias="false" x2="0"/>
<line end1="none" end2="none" length2="1.5" antialias="false" x2="0" y2="15" style="line-style:normal;line-weight:normal;filling:none;color:black" x1="0" y1="7" length1="1.5"/> <line style="line-style:normal;line-weight:normal;filling:none;color:black" end2="none" x1="0" y2="15" end1="none" y1="7" length1="1.5" length2="1.5" antialias="false" x2="0"/>
<line end1="none" end2="none" length2="1.5" antialias="false" x2="-10" y2="-15" style="line-style:normal;line-weight:normal;filling:none;color:black" x1="-10" y1="-8" length1="1.5"/> <line style="line-style:normal;line-weight:normal;filling:none;color:black" end2="none" x1="-10" y2="-15" end1="none" y1="-8" length1="1.5" length2="1.5" antialias="false" x2="-10"/>
<dynamic_text x="-9" y="-9" keep_visual_rotation="true" font="Sans Serif,5,-1,5,50,0,0,0,0,0" frame="false" Halignment="AlignLeft" z="10" Valignment="AlignTop" text_width="-1" uuid="{02030033-c6b1-4a95-b990-74fa2f7d147d}" rotation="0" text_from="UserText"> <dynamic_text z="10" Valignment="AlignTop" x="-9" text_from="UserText" font="Sans Serif,5,-1,5,50,0,0,0,0,0" rotation="0" uuid="{02030033-c6b1-4a95-b990-74fa2f7d147d}" y="-9" Halignment="AlignLeft" frame="false" text_width="-1">
<text>g</text> <text>g</text>
</dynamic_text> </dynamic_text>
<terminal x="0" y="15" type="Generic" orientation="s" uuid="{84fa8673-63b5-4398-a8ee-cb421df0aca5}" name=""/> <terminal orientation="s" x="0" y="15"/>
<terminal x="0" y="-15" type="Generic" orientation="n" uuid="{d0ca8801-050e-4160-abd8-eee62c44e9bf}" name=""/> <terminal orientation="n" x="0" y="-15"/>
<terminal x="-10" y="-15" type="Generic" orientation="n" uuid="{ea11c065-8d86-4041-b907-2cd28b877069}" name=""/> <terminal orientation="n" x="-10" y="-15"/>
</description> </description>
</definition> </definition>

View File

@@ -8,7 +8,6 @@
<name lang="pl">Przekaźnik prądu przemiennego</name> <name lang="pl">Przekaźnik prądu przemiennego</name>
<name lang="cs">Cívka relé pro AC napájení</name> <name lang="cs">Cívka relé pro AC napájení</name>
<name lang="es">Relé de CA</name> <name lang="es">Relé de CA</name>
<name lang="hu">Tekercs AC</name>
<name lang="nl">Relais voor wisselspanning</name> <name lang="nl">Relais voor wisselspanning</name>
<name lang="be">Relais AC (wisselspanning)</name> <name lang="be">Relais AC (wisselspanning)</name>
</names> </names>

View File

@@ -8,7 +8,6 @@
<name lang="cs">Cívka relé pro DC napájení</name> <name lang="cs">Cívka relé pro DC napájení</name>
<name lang="de">Spule mit Gleichstrombetätigung</name> <name lang="de">Spule mit Gleichstrombetätigung</name>
<name lang="it">Relè DC</name> <name lang="it">Relè DC</name>
<name lang="hu">Tekercs DC</name>
<name lang="el">Πηνίο συνεχούς</name> <name lang="el">Πηνίο συνεχούς</name>
<name lang="pl">Przekaźnik prądu przemiennego</name> <name lang="pl">Przekaźnik prądu przemiennego</name>
</names> </names>

View File

@@ -9,8 +9,7 @@
<name lang="cs">Elektronické relé</name> <name lang="cs">Elektronické relé</name>
<name lang="nl">relais electronisch</name> <name lang="nl">relais electronisch</name>
<name lang="es">Relé electrónico</name> <name lang="es">Relé electrónico</name>
<name lang="be">Electronisch relais</name> <name lang="be">Electronisch relais</name>
<name lang="hu">Tranzisztoros működtetés</name>
</names> </names>
<kindInformations> <kindInformations>
<kindInformation name="type" show="1">coil</kindInformation> <kindInformation name="type" show="1">coil</kindInformation>

View File

@@ -9,7 +9,6 @@
<name lang="es"> Relé insensible a la CA</name> <name lang="es"> Relé insensible a la CA</name>
<name lang="nl">relais ongevoelig voor wisselspanning</name> <name lang="nl">relais ongevoelig voor wisselspanning</name>
<name lang="el">Ρελέ με αντοχή σε AC</name> <name lang="el">Ρελέ με αντοχή σε AC</name>
<name lang="hu">AC-ra érzéketlen relé</name>
<name lang="be">Relais ongevoelig voor AC (wisselspanning)</name> <name lang="be">Relais ongevoelig voor AC (wisselspanning)</name>
</names> </names>
<kindInformations> <kindInformations>

View File

@@ -10,7 +10,6 @@
<name lang="cs">Polarizované relé</name> <name lang="cs">Polarizované relé</name>
<name lang="es">Relé polarizado</name> <name lang="es">Relé polarizado</name>
<name lang="nl">relay polair</name> <name lang="nl">relay polair</name>
<name lang="hu">Polarizált relé</name>
<name lang="be">Relais gepolariseerd</name> <name lang="be">Relais gepolariseerd</name>
</names> </names>
<kindInformations> <kindInformations>

View File

@@ -9,7 +9,6 @@
<name lang="cs">Rychlé relé</name> <name lang="cs">Rychlé relé</name>
<name lang="es">Relé rapido</name> <name lang="es">Relé rapido</name>
<name lang="nl">relais snel</name> <name lang="nl">relais snel</name>
<name lang="hu">Gyors működésű relé</name>
</names> </names>
<kindInformations> <kindInformations>
<kindInformation name="type" show="1">coil</kindInformation> <kindInformation name="type" show="1">coil</kindInformation>

View File

@@ -8,7 +8,6 @@
<name lang="es">Relé de remanencia</name> <name lang="es">Relé de remanencia</name>
<name lang="cs">Bistabilní remanentní relé</name> <name lang="cs">Bistabilní remanentní relé</name>
<name lang="nl">remanent relais</name> <name lang="nl">remanent relais</name>
<name lang="hu">Remanencia relé</name>
</names> </names>
<kindInformations> <kindInformations>
<kindInformation name="type" show="1">coil</kindInformation> <kindInformation name="type" show="1">coil</kindInformation>

View File

@@ -4,7 +4,6 @@
<name lang="fr">Relais à mise au repos retardée</name> <name lang="fr">Relais à mise au repos retardée</name>
<name lang="es">Relé con retardo de apertura</name> <name lang="es">Relé con retardo de apertura</name>
<name lang="nl">spoel afvalvertraagd</name> <name lang="nl">spoel afvalvertraagd</name>
<name lang="hu">Nyugvó (elejtés) késleltetésű relé</name>
<name lang="cs">Relé se zpožděným vypnutím</name> <name lang="cs">Relé se zpožděným vypnutím</name>
<name lang="de">Relais rückfallverzögert</name> <name lang="de">Relais rückfallverzögert</name>
<name lang="it">Relè ritardato all'apertura</name> <name lang="it">Relè ritardato all'apertura</name>

View File

@@ -9,7 +9,6 @@
<name lang="es">Relé de trabajo y reposo retardado</name> <name lang="es">Relé de trabajo y reposo retardado</name>
<name lang="cs">Relé se zpožděným zapnutím a vypnutím</name> <name lang="cs">Relé se zpožděným zapnutím a vypnutím</name>
<name lang="nl">spoel opkom en afval vertraagd</name> <name lang="nl">spoel opkom en afval vertraagd</name>
<name lang="hu">Meghúzás és elengedés késleltetésű relé</name>
</names> </names>
<kindInformations> <kindInformations>
<kindInformation name="type" show="1">coil</kindInformation> <kindInformation name="type" show="1">coil</kindInformation>

View File

@@ -9,7 +9,6 @@
<name lang="es">Relé de sobrecarga termica</name> <name lang="es">Relé de sobrecarga termica</name>
<name lang="cs">Tepelné relé</name> <name lang="cs">Tepelné relé</name>
<name lang="nl">Thermisch relais</name> <name lang="nl">Thermisch relais</name>
<name lang="hu">Thermikus túlterhelés védelmi relé</name>
</names> </names>
<kindInformations> <kindInformations>
<kindInformation name="type" show="1">coil</kindInformation> <kindInformation name="type" show="1">coil</kindInformation>

View File

@@ -7,7 +7,6 @@
<name lang="cs">Relé se zpožděným zapnutím</name> <name lang="cs">Relé se zpožděným zapnutím</name>
<name lang="de">Relais ansprechverzögert</name> <name lang="de">Relais ansprechverzögert</name>
<name lang="it">Relè ritardato alla chiusura</name> <name lang="it">Relè ritardato alla chiusura</name>
<name lang="hu">Meghúzás késleltetésű relé</name>
<name lang="el">Πηνίο χρονικού, καθυστέρηση ενεργοποίησης</name> <name lang="el">Πηνίο χρονικού, καθυστέρηση ενεργοποίησης</name>
<name lang="pl">Przekaźnik działający ze zwłoką przy wzbudzeniu</name> <name lang="pl">Przekaźnik działający ze zwłoką przy wzbudzeniu</name>
</names> </names>

View File

@@ -8,7 +8,6 @@
<name lang="pl">Przekaźnik z blokadą mechaniczną</name> <name lang="pl">Przekaźnik z blokadą mechaniczną</name>
<name lang="es">Relé con enclavamiento mecánico</name> <name lang="es">Relé con enclavamiento mecánico</name>
<name lang="cs">Mechanické blokovací relé</name> <name lang="cs">Mechanické blokovací relé</name>
<name lang="hu">Relé mechanikus retesszel</name>
</names> </names>
<kindInformations> <kindInformations>
<kindInformation name="type" show="1">coil</kindInformation> <kindInformation name="type" show="1">coil</kindInformation>

View File

@@ -14,6 +14,5 @@
<name lang="nl">Spoelen</name> <name lang="nl">Spoelen</name>
<name lang="be">Spoelen</name> <name lang="be">Spoelen</name>
<name lang="da">Spoler</name> <name lang="da">Spoler</name>
<name lang="hu">Tekercsek/relék</name>
</names> </names>
</qet-directory> </qet-directory>

View File

@@ -7,7 +7,6 @@
<name lang="de">Blinkrelais</name> <name lang="de">Blinkrelais</name>
<name lang="it">Relè ciclico</name> <name lang="it">Relè ciclico</name>
<name lang="el">Πηνίο ρελέ παλμού</name> <name lang="el">Πηνίο ρελέ παλμού</name>
<name lang="hu">"Villogó" relé</name>
<name lang="pl">Przekaźnik migowy (cykliczny)</name> <name lang="pl">Przekaźnik migowy (cykliczny)</name>
</names> </names>
<kindInformations> <kindInformations>

View File

@@ -1,48 +1,39 @@
<definition hotspot_x="47" type="element" width="90" link_type="simple" height="50" version="0.90" hotspot_y="24"> <definition width="100" version="0.3" hotspot_x="48" hotspot_y="30" height="60" type="element" ic="true" orientation="dnny">
<uuid uuid="{b421e3a2-41bb-41a0-8600-efc75811e20a}"/> <uuid uuid="{9EC34531-9367-4401-ADFE-7FB65430ED6D}"/><names>
<names> <name lang="el">Πηνίο ρελέ με πολικότητα</name>
<name lang="de">Relais polarisiert mit Wechsler</name>
<name lang="en">Polarized relay</name> <name lang="en">Polarized relay</name>
<name lang="de">Relais polarisiert mit Wechsler</name>
<name lang="it">Relè polarizzato</name> <name lang="it">Relè polarizzato</name>
<name lang="fr">Relais polarisé fonctionnant pour un seul sens du courant et retournant en position de repos après coupure</name> <name lang="fr">Relais polarisé fonctionnant pour un seul sens du courant et retournant en position de repos après coupure</name>
<name lang="nl">Polair relais</name>
<name lang="el">Πηνίο ρελέ με πολικότητα</name>
<name lang="es">Relé polarizado, de trabajo en una dirección de la corriente en la bobina</name>
<name lang="pl">Przekaźnik spolaryzowany, działający przy jednym kierunku prądu w cewce</name> <name lang="pl">Przekaźnik spolaryzowany, działający przy jednym kierunku prądu w cewce</name>
<name lang="es">Relé polarizado, de trabajo en una dirección de la corriente en la bobina</name>
<name lang="cs">Polarizované monostabilní relé</name> <name lang="cs">Polarizované monostabilní relé</name>
<name lang="nl">Polair relais</name>
</names> </names>
<elementInformations/>
<informations>License: see http://qelectrotech.org/wiki/doc/elements_license</informations> <informations>License: see http://qelectrotech.org/wiki/doc/elements_license</informations>
<description> <description>
<circle diameter="3" style="line-style:normal;line-weight:normal;filling:black;color:black" y="-16.5" antialias="true" x="34.5"/> <circle x="34.5" y="-16.5" antialias="true" style="line-style:normal;line-weight:normal;filling:black;color:black" diameter="3"/>
<text text="A2" font="Sans Serif,4,-1,5,50,0,0,0,0,0" y="19" rotation="0" x="-30" color="#000000"/> <line length1="1.5" length2="1.5" antialias="false" end1="none" end2="none" style="line-style:dashed;line-weight:thin;filling:none;color:black" y1="0" x1="-5" y2="0" x2="25"/>
<line style="line-style:dashed;line-weight:normal;filling:none;color:black" length1="1.5" x1="-5" x2="16" antialias="false" y2="0" end2="none" y1="0" length2="1.5" end1="none"/> <circle x="-13.5" y="13.5" antialias="true" style="line-style:normal;line-weight:normal;filling:black;color:black" diameter="3"/>
<circle diameter="3" style="line-style:normal;line-weight:normal;filling:black;color:black" y="13.5" antialias="true" x="-13.5"/> <input x="19.5" y="-15.45" size="4" text="2"/>
<dynamic_text text_width="-1" keep_visual_rotation="false" Valignment="AlignTop" font="Sans Serif,4,-1,5,25,0,0,0,0,0" y="-22.95" z="4" rotation="0" frame="false" x="19.5" text_from="UserText" uuid="{b78642aa-b230-4912-906b-6cbb070a3151}" Halignment="AlignLeft"> <input x="20" y="16" size="4" text="3"/>
<text>2</text> <input x="0" y="-16" size="4" text="1"/>
</dynamic_text> <line length1="1.5" length2="1.5" antialias="false" end1="none" end2="none" style="line-style:normal;line-weight:normal;filling:none;color:black" y1="-9" x1="10" y2="-9" x2="23"/>
<dynamic_text text_width="-1" keep_visual_rotation="false" Valignment="AlignTop" font="Sans Serif,4,-1,5,25,0,0,0,0,0" y="8.5" z="5" rotation="0" frame="false" x="10" text_from="UserText" uuid="{94edcc6b-71b0-4d35-ad29-3a4e09592ebe}" Halignment="AlignLeft"> <polygon style="line-style:normal;line-weight:normal;filling:black;color:black" x1="-42" x2="-42" x3="-38" x4="-38" antialias="false" x5="-42" x6="-42" x7="-35" x8="-35" x9="-42" y1="-10" y10="-7" y2="-7" y3="-7" y4="7" y5="7" x10="-42" y6="10" y7="10" y8="-10" y9="-10"/>
<text>3</text> <polygon antialias="true" style="line-style:normal;line-weight:normal;filling:none;color:black" closed="false" y1="20" x1="30" y2="10" x2="30" y3="-10" x3="20"/>
</dynamic_text> <rect width="7" x="-42" y="-10" antialias="false" height="20" style="line-style:normal;line-weight:normal;filling:none;color:black"/>
<dynamic_text text_width="-1" keep_visual_rotation="false" Valignment="AlignTop" font="Sans Serif,4,-1,5,25,0,0,0,0,0" y="-23.5" z="6" rotation="0" frame="false" x="0" text_from="UserText" uuid="{6ac8e0a6-c562-42f3-bb0e-2eaf7726ed93}" Halignment="AlignLeft"> <line length1="1.5" length2="1.5" antialias="false" end1="none" end2="none" style="line-style:normal;line-weight:normal;filling:none;color:black" y1="-20" x1="10" y2="-9" x2="10"/>
<text>1</text> <rect width="30" x="-35" y="-10" antialias="false" height="20" style="line-style:normal;line-weight:normal;filling:none;color:black"/>
</dynamic_text> <line length1="1.5" length2="1.5" antialias="false" end1="none" end2="none" style="line-style:normal;line-weight:normal;filling:none;color:black" y1="-20" x1="30" y2="-10" x2="30"/>
<polygon style="line-style:normal;line-weight:normal;filling:none;color:black" x1="20" x2="20" y3="-10" antialias="true" x3="12" y2="10" closed="false" y1="20"/> <line length1="1.5" length2="1.5" antialias="false" end1="none" end2="none" style="line-style:normal;line-weight:normal;filling:none;color:black" y1="20" x1="-20" y2="10" x2="-20"/>
<line style="line-style:normal;line-weight:normal;filling:none;color:black" length1="1.5" x1="-20" x2="-20" antialias="false" y2="-20" end2="none" y1="20" length2="1.5" end1="none"/> <line length1="1.5" length2="1.5" antialias="false" end1="none" end2="none" style="line-style:normal;line-weight:normal;filling:none;color:black" y1="-20" x1="-20" y2="-10" x2="-20"/>
<rect style="line-style:normal;line-weight:normal;filling:black;color:black" y="-10" width="7" ry="0" antialias="false" height="20" x="-42" rx="0"/> <input x="-34" y="18" size="4" text="A2"/>
<rect style="line-style:normal;line-weight:normal;filling:white;color:black" y="-10" width="30" ry="0" antialias="false" height="20" x="-35" rx="0"/> <input x="-34" y="-17" size="4" text="A1"/>
<line style="line-style:normal;line-weight:normal;filling:none;color:black" length1="1.5" x1="30" x2="30" antialias="false" y2="-10" end2="none" y1="-20" length2="1.5" end1="none"/> <input x="31" y="0.5" size="9" text="_" tagg="label"/>
<dynamic_text text_width="-1" keep_visual_rotation="false" Valignment="AlignTop" font="Sans Serif,9,-1,5,50,0,0,0,0,0" y="-11" z="14" rotation="0" frame="false" x="31" text_from="ElementInfo" uuid="{bb4158fb-c7dd-4a99-a8e9-1e640ae795f2}" Halignment="AlignLeft"> <terminal x="-20" y="-20" orientation="n"/>
<text></text> <terminal x="-20" y="20" orientation="s"/>
<info_name>label</info_name> <terminal x="10" y="-20" orientation="n"/>
</dynamic_text> <terminal x="30" y="-20" orientation="n"/>
<rect style="line-style:normal;line-weight:normal;filling:white;color:black" y="-7" width="4" ry="0" antialias="false" height="14" x="-42" rx="0"/> <terminal x="30" y="20" orientation="s"/>
<polygon style="line-style:normal;line-weight:normal;filling:none;color:black" x1="10" x2="10" y3="-9" antialias="false" x3="15" y2="-9" closed="false" y1="-20"/>
<text text="A1" font="Sans Serif,4,-1,5,50,0,0,0,0,0" y="-15" rotation="0" x="-30" color="#000000"/>
<terminal y="-20" x="30" orientation="n"/>
<terminal y="-20" x="-20" orientation="n"/>
<terminal y="20" x="20" orientation="s"/>
<terminal y="20" x="-20" orientation="s"/>
<terminal y="-20" x="10" orientation="n"/>
</description> </description>
</definition> </definition>

View File

@@ -10,7 +10,6 @@
<name lang="el">Ηλεκτρονικό ρελέ</name> <name lang="el">Ηλεκτρονικό ρελέ</name>
<name lang="ar">مُرحّل استاتيكي</name> <name lang="ar">مُرحّل استاتيكي</name>
<name lang="pl">Przekaźnik statyczny</name> <name lang="pl">Przekaźnik statyczny</name>
<name lang="hu">Szilárd test relé</name>
</names> </names>
<kindInformations/> <kindInformations/>
<informations>Author: The QElectroTech team <informations>Author: The QElectroTech team

View File

@@ -6,7 +6,6 @@
<name lang="fr">Relais temporisé repos à commande externe</name> <name lang="fr">Relais temporisé repos à commande externe</name>
<name lang="pl">Przekaźnik z opuźnionym powrotem, z wejściem sterującym</name> <name lang="pl">Przekaźnik z opuźnionym powrotem, z wejściem sterującym</name>
<name lang="cs">Zpožděné relé s externím ovládáním</name> <name lang="cs">Zpožděné relé s externím ovládáním</name>
<name lang="hu">Elengedeés késleltetésű relé külső paranccsal</name>
<name lang="el">Πηνίο καθυστέρησης απενεργοποίησης με εξωτερική εντολή</name> <name lang="el">Πηνίο καθυστέρησης απενεργοποίησης με εξωτερική εντολή</name>
</names> </names>
<kindInformations> <kindInformations>

View File

@@ -1,37 +1,34 @@
<definition link_type="master" width="40" height="50" version="0.90" hotspot_x="20" type="element" hotspot_y="24"> <definition width="60" version="0.3" hotspot_x="19" hotspot_y="37" height="70" type="element" link_type="master">
<uuid uuid="{fbebf37a-b316-447b-9f4d-16e87e2066a0}"/> <uuid uuid="{1CF30813-0219-4625-B019-A00A318ED8F9}"/><names>
<names>
<name lang="pl">Cewka</name>
<name lang="cs">Bistabilní relé</name>
<name lang="ar">مُرحّل ثنائي الإستقرار</name> <name lang="ar">مُرحّل ثنائي الإستقرار</name>
<name lang="de">Relais bistabil</name>
<name lang="ru">Обмотка</name> <name lang="ru">Обмотка</name>
<name lang="en">Coil</name> <name lang="en">Coil</name>
<name lang="de">Relais bistabil</name>
<name lang="it">Relè bistabile</name> <name lang="it">Relè bistabile</name>
<name lang="fr">Relais bistable</name> <name lang="fr">Relais bistable</name>
<name lang="pl">Cewka</name>
<name lang="es">Relé biestable</name> <name lang="es">Relé biestable</name>
<name lang="cs">Bistabilní relé</name>
</names> </names>
<kindInformations> <kindInformations>
<kindInformation name="type">coil</kindInformation> <kindInformation name="type" show="1">coil</kindInformation>
</kindInformations> </kindInformations>
<elementInformations/>
<informations>Author: The QElectroTech team <informations>Author: The QElectroTech team
License: see http://qelectrotech.org/wiki/doc/elements_license</informations> License: see http://qelectrotech.org/wiki/doc/elements_license</informations>
<description> <description>
<dynamic_text rotation="0" keep_visual_rotation="false" frame="false" x="4" text_from="UserText" font="Sans Serif,6,-1,5,50,0,0,0,0,0" y="11" Halignment="AlignLeft" z="4" uuid="{35e96436-b756-490c-95e4-87ddfc82d137}" text_width="-1" Valignment="AlignTop"> <line length1="1.5" length2="1.5" antialias="false" end1="none" end2="none" style="line-style:normal;line-weight:normal;filling:none;color:black" y1="1" x1="8" y2="4" x2="8"/>
<text>_</text> <line length1="1.5" length2="1.5" antialias="false" end1="none" end2="none" style="line-style:normal;line-weight:normal;filling:none;color:black" y1="0" x1="-8" y2="0" x2="8"/>
</dynamic_text> <line length1="1.5" length2="1.5" antialias="false" end1="none" end2="none" style="line-style:normal;line-weight:normal;filling:none;color:black" y1="-4" x1="-8" y2="0" x2="-8"/>
<dynamic_text rotation="0" keep_visual_rotation="false" frame="false" x="4" text_from="UserText" font="Sans Serif,6,-1,5,50,0,0,0,0,0" y="-31" Halignment="AlignLeft" z="5" uuid="{6f5de7cf-5691-4dd4-b659-0dde11e9f9ca}" text_width="-1" Valignment="AlignTop"> <input x="4" y="20" size="6" rotate="true" text="_"/>
<text>_</text> <input x="4" y="-22" size="6" rotate="true" text="_"/>
</dynamic_text> <line length1="1.5" length2="1.5" antialias="false" end1="none" end2="none" style="line-style:normal;line-weight:normal;filling:none;color:black" y1="-21" x1="0" y2="-8" x2="0"/>
<line end1="none" end2="none" length2="1.5" y2="20" antialias="false" style="line-style:normal;line-weight:normal;filling:none;color:black" y1="-20" x1="0" length1="1.5" x2="0"/> <line length1="1.5" length2="1.5" antialias="false" end1="none" end2="none" style="line-style:normal;line-weight:normal;filling:none;color:black" y1="9" x1="0" y2="21" x2="0"/>
<dynamic_text rotation="0" keep_visual_rotation="false" frame="false" x="20" text_from="ElementInfo" font="Sans Serif,9,-1,5,50,0,0,0,0,0" y="-8.8" Halignment="AlignLeft" z="10" uuid="{801ccb33-f4f0-4d97-929d-c9b2a1725bb2}" text_width="-1" Valignment="AlignTop"> <line length1="1.5" length2="1.5" antialias="false" end1="none" end2="none" style="line-style:normal;line-weight:normal;filling:none;color:black" y1="8" x1="14" y2="-8" x2="14"/>
<text></text> <line length1="1.5" length2="1.5" antialias="false" end1="none" end2="none" style="line-style:normal;line-weight:normal;filling:none;color:black" y1="8" x1="-14" y2="8" x2="14"/>
<info_name>label</info_name> <input x="20" y="2.6666" size="9" text="_" tagg="label"/>
</dynamic_text> <line length1="1.5" length2="1.5" antialias="false" end1="none" end2="none" style="line-style:normal;line-weight:normal;filling:none;color:black" y1="-8" x1="14" y2="-8" x2="-14"/>
<rect width="28" rx="0" x="-14" height="16" antialias="false" style="line-style:normal;line-weight:normal;filling:white;color:black" y="-8" ry="0"/> <line length1="1.5" length2="1.5" antialias="false" end1="none" end2="none" style="line-style:normal;line-weight:normal;filling:none;color:black" y1="-8" x1="-14" y2="8" x2="-14"/>
<polygon y3="0" closed="false" x4="8" x3="8" y2="0" antialias="false" style="line-style:normal;line-weight:normal;filling:none;color:black" y1="-4" y4="4" x1="-8" x2="-8"/> <terminal x="0" y="-20" orientation="n"/>
<terminal orientation="n" x="0" name="A1" y="-20" type="Generic"/> <terminal x="0" y="21" orientation="s"/>
<terminal orientation="s" x="0" name="A2" y="20" type="Generic"/>
</description> </description>
</definition> </definition>

View File

@@ -8,7 +8,6 @@
<name lang="pl">Łącznik zdalnie sterowany</name> <name lang="pl">Łącznik zdalnie sterowany</name>
<name lang="es">Interruptor a control remoto 1P1T</name> <name lang="es">Interruptor a control remoto 1P1T</name>
<name lang="cs">Dálkově ovládaný spínač</name> <name lang="cs">Dálkově ovládaný spínač</name>
<name lang="hu">Távoli vezérlésű relé</name>
<name lang="nl">Afstand bestuurbaar schakelaar</name> <name lang="nl">Afstand bestuurbaar schakelaar</name>
</names> </names>
<kindInformations> <kindInformations>

View File

@@ -4,7 +4,6 @@
<name lang="fr">Relais temporisé</name> <name lang="fr">Relais temporisé</name>
<name lang="en">Timed relay</name> <name lang="en">Timed relay</name>
<name lang="cs">Časové relé</name> <name lang="cs">Časové relé</name>
<name lang="hu">Ütemadó relé</name>
</names> </names>
<kindInformations> <kindInformations>
<kindInformation show="1" name="type">coil</kindInformation> <kindInformation show="1" name="type">coil</kindInformation>

View File

@@ -3,7 +3,6 @@
<names> <names>
<name lang="en">Timer T 816</name> <name lang="en">Timer T 816</name>
<name lang="cs">Timer T 816</name> <name lang="cs">Timer T 816</name>
<name lang="hu">Időzítő relé T 816</name>
</names> </names>
<kindInformations> <kindInformations>
<kindInformation name="type" show="1">coil</kindInformation> <kindInformation name="type" show="1">coil</kindInformation>

View File

@@ -3,7 +3,6 @@
<names> <names>
<name lang="en">Timer TMR48</name> <name lang="en">Timer TMR48</name>
<name lang="cs">Timer TMR48</name> <name lang="cs">Timer TMR48</name>
<name lang="hu">Időzítő relé TMR48</name>
</names> </names>
<kindInformations> <kindInformations>
<kindInformation name="type" show="1">coil</kindInformation> <kindInformation name="type" show="1">coil</kindInformation>

View File

@@ -0,0 +1,31 @@
<definition version="0.70" height="50" type="element" width="30" hotspot_x="12" link_type="slave" hotspot_y="24">
<uuid uuid="{90fe1aa6-d017-4064-8ce7-242a4b7b416a}"/>
<names>
<name lang="cs">Kontakt zpožděný odpad</name>
</names>
<kindInformations>
<kindInformation name="state" show="1">NO</kindInformation>
<kindInformation name="number" show="1">1</kindInformation>
<kindInformation name="type" show="1">delayOff</kindInformation>
</kindInformations>
<informations>Author: The QElectroTech team
License: see http://qelectrotech.org/wiki/doc/elements_license</informations>
<description>
<polygon x3="10" y1="-10" y3="20" style="line-style:normal;line-weight:normal;filling:none;color:black" x1="5" antialias="true" y2="10" closed="false" x2="10"/>
<line y1="-20" style="line-style:normal;line-weight:normal;filling:none;color:black" x1="10" length2="1.5" antialias="false" length1="1.5" end2="none" y2="-10" end1="none" x2="10"/>
<dynamic_text font="Sans Serif,9,-1,5,50,0,0,0,0,0" frame="false" x="-23" text_from="ElementInfo" y="-12" z="3" rotation="0" Valignment="AlignTop" text_width="-1" uuid="{87554fe0-c02a-4473-81d1-4cb89205402c}" Halignment="AlignLeft">
<text></text>
<info_name>label</info_name>
</dynamic_text>
<dynamic_text font="Sans Serif,5,-1,5,25,0,0,0,0,0" frame="false" x="7" text_from="UserText" y="-26" z="4" rotation="0" Valignment="AlignTop" text_width="-1" uuid="{07fe6bcb-92fd-4fef-bef4-595fab066fa2}" Halignment="AlignLeft">
<text>15</text>
</dynamic_text>
<dynamic_text font="Sans Serif,5,-1,5,25,0,0,0,0,0" frame="false" x="7" text_from="UserText" y="9" z="5" rotation="0" Valignment="AlignTop" text_width="-1" uuid="{bbc34c0f-1331-4499-8663-978b944c8287}" Halignment="AlignLeft">
<text>18</text>
</dynamic_text>
<line y1="0" style="line-style:normal;line-weight:normal;filling:none;color:black" x1="7" length2="1.5" antialias="false" length1="1.5" end2="none" y2="0" end1="none" x2="3"/>
<arc height="10" x="-7" style="line-style:normal;line-weight:normal;filling:none;color:black" angle="180" y="-5" width="10" start="270" antialias="true"/>
<terminal x="10" y="20" orientation="s"/>
<terminal x="10" y="-20" orientation="n"/>
</description>
</definition>

View File

@@ -1,33 +0,0 @@
<definition height="50" hotspot_y="24" type="element" link_type="slave" hotspot_x="5" version="0.90" width="20">
<uuid uuid="{ee2be6e2-521c-4129-a0ca-a266db12e1ce}"/>
<names>
<name lang="hu">Késleltetett működésű záróérintkező</name>
<name lang="cs">Kontakt zpožděný odpad</name>
<name lang="fr">Contact temporisé</name>
</names>
<kindInformations>
<kindInformation name="type">delayOff</kindInformation>
<kindInformation name="state">NO</kindInformation>
<kindInformation name="number">1</kindInformation>
</kindInformations>
<informations>Author: The QElectroTech team&#xd;
License: see http://qelectrotech.org/wiki/doc/elements_license</informations>
<description>
<polygon closed="false" antialias="true" x2="10" y2="10" style="line-style:normal;line-weight:normal;filling:none;color:black" x1="5" y3="20" y1="-10" x3="10"/>
<line end1="none" end2="none" length2="1.5" antialias="false" x2="10" y2="-10" style="line-style:normal;line-weight:normal;filling:none;color:black" x1="10" y1="-20" length1="1.5"/>
<dynamic_text x="-23" y="-12" keep_visual_rotation="true" font="Sans Serif,9,-1,5,50,0,0,0,0,0" frame="false" Halignment="AlignLeft" z="3" Valignment="AlignTop" text_width="-1" uuid="{87554fe0-c02a-4473-81d1-4cb89205402c}" rotation="0" text_from="ElementInfo">
<text></text>
<info_name>label</info_name>
</dynamic_text>
<dynamic_text x="7" y="-26" keep_visual_rotation="true" font="Sans Serif,5,-1,5,25,0,0,0,0,0" frame="false" Halignment="AlignLeft" z="4" Valignment="AlignTop" text_width="-1" uuid="{07fe6bcb-92fd-4fef-bef4-595fab066fa2}" rotation="0" text_from="UserText">
<text>15</text>
</dynamic_text>
<dynamic_text x="7" y="9" keep_visual_rotation="true" font="Sans Serif,5,-1,5,25,0,0,0,0,0" frame="false" Halignment="AlignLeft" z="5" Valignment="AlignTop" text_width="-1" uuid="{bbc34c0f-1331-4499-8663-978b944c8287}" rotation="0" text_from="UserText">
<text>18</text>
</dynamic_text>
<line end1="none" end2="none" length2="1.5" antialias="false" x2="3" y2="0" style="line-style:normal;line-weight:normal;filling:none;color:black" x1="7" y1="0" length1="1.5"/>
<arc height="10" start="270" x="-7" y="-5" antialias="true" angle="180" style="line-style:normal;line-weight:normal;filling:none;color:black" width="10"/>
<terminal x="10" y="20" type="Generic" orientation="s" uuid="{03048908-f3d8-4897-9742-6b3e2b4c7a62}" name="18"/>
<terminal x="10" y="-20" type="Generic" orientation="n" uuid="{0f9ebcab-1d47-4815-a390-e290573172b7}" name="15"/>
</description>
</definition>

View File

@@ -7,7 +7,7 @@
<name lang="es">Contacto relé térmico (NA)</name> <name lang="es">Contacto relé térmico (NA)</name>
<name lang="cs">Kontakt (NO) tepelného jističe</name> <name lang="cs">Kontakt (NO) tepelného jističe</name>
</names> </names>
<informations>Author: The QElectroTech team <informations>Author: The QElectroTech team&#xd;&#xd;&#xd;&#xd;&#xd;&#xd;&#xd;&#xd;
License: see http://qelectrotech.org/wiki/doc/elements_license</informations> License: see http://qelectrotech.org/wiki/doc/elements_license</informations>
<description> <description>
<line length1="1.5" length2="1.5" antialias="false" end1="none" end2="none" style="line-style:normal;line-weight:normal;filling:none;color:black" y1="3" x1="-12.6286" y2="3" x2="-16.1714"/> <line length1="1.5" length2="1.5" antialias="false" end1="none" end2="none" style="line-style:normal;line-weight:normal;filling:none;color:black" y1="3" x1="-12.6286" y2="3" x2="-16.1714"/>

View File

@@ -7,7 +7,7 @@
<name lang="es">Contacto relé térmico (NC)</name> <name lang="es">Contacto relé térmico (NC)</name>
<name lang="cs">Kontakt (NC) tepelného jističe</name> <name lang="cs">Kontakt (NC) tepelného jističe</name>
</names> </names>
<informations>Author: The QElectroTech team <informations>Author: The QElectroTech team&#xd;&#xd;&#xd;&#xd;&#xd;&#xd;&#xd;&#xd;
License: see http://qelectrotech.org/wiki/doc/elements_license</informations> License: see http://qelectrotech.org/wiki/doc/elements_license</informations>
<description> <description>
<line length1="1.5" length2="1.5" antialias="false" end1="none" end2="none" style="line-style:normal;line-weight:normal;filling:none;color:black" y1="0" x1="-7.67895" y2="0" x2="-10.9053"/> <line length1="1.5" length2="1.5" antialias="false" end1="none" end2="none" style="line-style:normal;line-weight:normal;filling:none;color:black" y1="0" x1="-7.67895" y2="0" x2="-10.9053"/>

View File

@@ -13,6 +13,5 @@
<name lang="cs">Relé, stykače a kontakty</name> <name lang="cs">Relé, stykače a kontakty</name>
<name lang="da">Relæer, kontaktorer og kontakter</name> <name lang="da">Relæer, kontaktorer og kontakter</name>
<name lang="ja">継電器、接触器、接点</name> <name lang="ja">継電器、接触器、接点</name>
<name lang="hu">Relék, kontaktorok és érintkezők</name>
</names> </names>
</qet-directory> </qet-directory>

View File

@@ -11,7 +11,7 @@
<name lang="cs">Jednofázový autotransformátor</name> <name lang="cs">Jednofázový autotransformátor</name>
<name lang="nl">enkelfase autotransformator</name> <name lang="nl">enkelfase autotransformator</name>
</names> </names>
<informations>Author: The QElectroTech team <informations>Author: The QElectroTech team&#xd;
License: see http://qelectrotech.org/wiki/doc/elements_license</informations> License: see http://qelectrotech.org/wiki/doc/elements_license</informations>
<description> <description>
<line length1="1.5" length2="1.5" antialias="false" end1="none" end2="none" style="line-style:normal;line-weight:normal;filling:none;color:black" y1="-20" x1="8" y2="-35" x2="8"/> <line length1="1.5" length2="1.5" antialias="false" end1="none" end2="none" style="line-style:normal;line-weight:normal;filling:none;color:black" y1="-20" x1="8" y2="-35" x2="8"/>

View File

@@ -11,7 +11,7 @@
<name lang="cs">Třífázový autotransformátor</name> <name lang="cs">Třífázový autotransformátor</name>
<name lang="nl">driefase autotransformator</name> <name lang="nl">driefase autotransformator</name>
</names> </names>
<informations>Author: The QElectroTech team <informations>Author: The QElectroTech team&#xd;
License: see http://qelectrotech.org/wiki/doc/elements_license</informations> License: see http://qelectrotech.org/wiki/doc/elements_license</informations>
<description> <description>
<input x="20" y="17.6667" size="5" text="___V"/> <input x="20" y="17.6667" size="5" text="___V"/>

Some files were not shown because too many files have changed in this diff Show More