Merge branch 'master' of ssh://git.tuxfamily.org/gitroot/qet/qet

This commit is contained in:
aitolos 2020-10-19 18:12:26 +03:00
commit 9d89719c21
8286 changed files with 190377 additions and 123245 deletions

5
.gitignore vendored
View File

@ -1,2 +1,7 @@
*.snap
.flatpak-builder
# Qt build output
*.user
# doxygen Doxyfile output
doc/
QElectroTech.tag

121
CONTRIBUTING.md Normal file
View File

@ -0,0 +1,121 @@
# How to contribute
I'm really glad you're reading this,
because we need volunteer developers to help
this project come to fruition.
Here are some important resources:
* [Qet code style](https://qelectrotech.org/wiki_new/doc/qt_creator#on_ajoute_le_style_de_code_qet)
* [git Documentation](https://git-scm.com/doc)
## Testing
## Submitting changes
Always write a clear log message for your commits.
One-line messages are fine for small changes,
but bigger changes should look like this:
$ git commit -m "A brief summary of the commit
>
> A paragraph describing what changed and its impact."
* It is always appropriate to keep the commits small.
* For major changes it is recommended to use branches.
### Interactive Staging
https://git-scm.com/book/en/v2/Git-Tools-Interactive-Staging
issue: you have modified a class but you want to write it in 2 commits
´git add -p´ or ´git add -i´
/qet> git add -i
staged unstaged path
1: unchanged +1/-1 sources/diagram.cpp
*** Commands ***
1: status 2: update 3: revert 4: add untracked
5: patch 6: diff 7: quit 8: help
What now> 5
staged unstaged path
1: unchanged +1/-1 sources/diagram.cpp
Patch update>> 1
staged unstaged path
* 1: unchanged +1/-1 sources/diagram.cpp
Patch update>>
diff --git a/sources/diagram.cpp b/sources/diagram.cpp
index bffca653f..9bd2280f7 100644
--- a/sources/diagram.cpp
+++ b/sources/diagram.cpp
@@ -103,9 +103,9 @@ Diagram::Diagram(QETProject *project) :
connect(&border_and_titleblock,
&BorderTitleBlock::titleBlockFolioChanged,
this, &Diagram::updateLabels);
- connect(this, &Diagram::diagramActivated,
+ foo(do_a);
- adjust(diagramActivated);
+ bar(do_c);
adjustSceneRect();
}
(1/1) Stage this hunk [y,n,q,a,d,s,e,?]? s
Split into 2 hunks.
@@ -103,5 +103,5 @@
connect(&border_and_titleblock,
&BorderTitleBlock::titleBlockFolioChanged,
this, &Diagram::updateLabels);
- connect(this, &Diagram::diagramActivated,
+ foo(do_a);
(1/2) Stage this hunk [y,n,q,a,d,j,J,g,/,e,?]? y
@@ -107,5 +107,5 @@
this, &Diagram::loadElmtFolioSeq);
- adjust(diagramActivated);
+ bar(do_c);
adjustSceneRect();
}
(2/2) Stage this hunk [y,n,q,a,d,K,g,/,e,?]? n
*** Commands ***
1: status 2: update 3: revert 4: add untracked
5: patch 6: diff 7: quit 8: help
What now>What now>7
Bye.
git commit -m "Mod Signal Slot to funsion"
## Coding conventions
Start reading our code and you'll get the hang of it.
We optimize for readability:
* We use tabs to indent, and interpret tabs as taking up to 8 spaces.
see https://qelectrotech.org/wiki_new/doc/qt_creator#on_ajoute_le_style_de_code_qet
* We try to keep to at most 80 characters per line.
* Try to make your code understandable.
You may put comments in, but comments invariably tend to stale out when
the code they were describing changes.
Often splitting a function into two
makes the intention of the code much clearer.
Thanks,
QElectroTech

152
ChangeLog
View File

@ -1,19 +1,96 @@
====== ChangeLog from 0.7 to 0.8 ======
* Element editor :
* with Ctrl key you can moving by keyboard primitives selected by 0.1 point instead by 1 points, added the same feature for moving the selected aera.
* Improve polygon widget editor on elements editor.
* Moving the main QET repository SVN trunk to GIT.
* Add a mirror of the main QET repository, which is synced to hosted at tuxfamily.org to Github.
* Doxyfile update add QCH file for doxygen-generated docs using qhelpgenerator and then import them into Qt Creator.
* Improve portability of Doxyfile (Simon).
* Fix deprecated warnings (Simon).
* Wrap code for better readability (Simon, Damian).
* Elements collection :
Improve collection 7378 elements in 1092 categories
Thanks Sebastien, Dinozzo, Simon, Rafał, Arnaud, Bisku, Fernando, Riesermauf, Alexis, david, Plc-user, Christophe, Michele, Galexis, Jevgenijs, Gabor,
Benoit Michel, Franck, Ludovic, Cyrille, ossau2mation, Mitzot, Edgar, Nuri, Friskolon, Baboune41, Wiktor, shateks, Dik, Shateks, Marcin
* Diagram editor :
* User can choose now folio list emplacement in project by select position number in settings :
1 for the first position
2 for the second position
etc
0 for always at the end of project
Because index folio is 0 and not 1 we apply -1 in formula to not complicate your life..
* The export of the nomenclature to csv file has been completely rewritten :
It is now possible to choose which information to export as well as the order in which it should be displayed.
An option allows filtering by type of element: all, terminal block, button / switch.
Another option allows to display or not the column headers in the csv file.
With these options, it is possible to create a nomenclature, an order list, but also for printing labels: list of terminals and list of buttons / switches.
It is possible to save / load a configuration easily.
Finally, the work being done by an SQLite database, a text field allows the user to create his own SQL query.
* Add Conductors numbering to csv file.
* Add new summary table.
* add BOM creation dialog :
nomenclature is now integrated into the project (accompanied by several parameters in order to be customizable).
Tables can have a name.
Tables an be added to any folio.
Font margin and alignment (right center left) separately adjustable for headers and table cells.
Position size and number of lines is adjustable.
Possibility of linking several tables together, especially when the entire nomenclature cannot be contained in a folio.
Automatic adjustment of the size of the table in relation to the folio.
Option to apply the geometry of an array to all the array linked to it, so that everything is homogeneous.
Save / load table configuration and content to make creation faster.
Option to automatically adjust the table to the folio.
Option to automatically add new tables in new folios if the nomenclature cannot be contained in 1 to N folios / tables.
* Table content:
Fully customizable, you display what you want or want (info to display in the desired order, filter on type of element, filter on content of the info "contains, not contains, not empty etc ..." ).
The content being generated from a sqlite database, you can write your own request.
* Loading of element collections is now faster (thanks to the pugixml parser)
* The loading of collections of elements no longer freezes QElectroTech.
* The appearance and disappearance of the search / replace menu is animated.
* Fix wrong position of slave xref after open a saved project
* Add font color of the conductors (Simon).
* Add section and color properties for wires.
* config dialog :
* Add QScrollArea to configdialog and resize to max_screen (Simon).
* Add gui resize depending on screen size (Simon).
* Add Screen info user (Simon).
* Mod ScrollArea on demand (Simon).
* Element editor:
* Polygon editing widget, when you click on a point in the list, the corresponding point changes color in order to better visualize what you are doing.
On this same list, a right click opens a contextual menu allowing to delete the selected point or inserted a point after the selected one.
When holding the ctrl + directional arrow key, the selected parts move by 0.1 instead of 1 point.
* with Ctrl key you can moving by keyboard primitives selected by 0.1 point instead by 1 points, added the same feature for moving the selected aera.
* Added 140 web standard colors In Element editor (Arnaud).
* Add multiedit feature (martin).
* Add terminals uuid for next features (martin).
* Windows :
* Fix bad fonts rendering if Qt version >= 5.13.1.
See : https://bugreports.qt.io/browse/QTBUG-83161
* Fix backup file on windows
For unknown reason KautoSaveFile don't write the file on Windows if file
is open in another part of the code.
No error is returned and use the method :
qint64 QIODevice::write(const QByteArray &byteArray) return the good
number of bytes written but the real file stay empty.
Probably the problem don't come from KautoSaveFile but QFileDevice or
QIODevice on windows.
The fix consist to open the file just before write on it and close it
just after.
* writeToFile on a other Thread to improve this for windows performance (Simon).
* macOS :
@ -22,46 +99,31 @@ Because index folio is 0 and not 1 we apply -1 in formula to not complicate your
(removed by Qt upstream) https://codereview.qt-project.org/gitweb?p=qt/qtbase.git;a=commitdiff;h=ea47d152b35158ba07a55d009f57df0e4c2a048f;hp=08cc9b9991ae9ab51bed5b857b6257401401ff6f
* Add Snap packages :
* thanks Max for help.
https://snapcraft.io/qelectrotech
See: https://qelectrotech.org/forum/viewtopic.php?id=1426
* Use kde-neon extension
The kde-neon extension reduces our boilerplate in snapcraft.yaml
and reduces the snap size considerably, as we do not need to ship
any library that is already included in the kde-frameworks-5-core18
snap itself.
* For the Flatpak package : remove the file name extension added
This limits qelectrotech builds to the architectures supported
by kde-frameworks-5-core18, i.e. only amd64.
https://git.tuxfamily.org/qet/qet.git/log/?qt=grep&q=snap
* Add Flatpak packages :
* thanks Mathieu for help.
See: https://github.com/qelectrotech/qelectrotech-source-mirror/pull/18
* remove the file name extension added
automatically to the saved files even if the user sets an unknown file
extension for the program.
https://git.tuxfamily.org/qet/qet.git/log/?qt=grep&q=flatpak

2860
Doxyfile

File diff suppressed because it is too large Load Diff

View File

@ -175,3 +175,15 @@ Dette værk er licenseret under Creative Commons Attribution 3.0 License.
For at se en kopi af denne licens, besøg
http://creativecommons.org/licenses/by/3.0/ or send a letter to Creative
Commons, 171 Second Street, Suite 300, San Francisco, California, 94105, USA.
[ja]
QElectroTech と一緒に提供される要素コレクションは現状のまま提供され、
あなたの目的や作業に適合することを保証するものではありません。
回路図での要素の利用、変更、統合は、回路図の最終的なライセンスに関わらず
無条件で許可されます。
回路図とは別に QElectroTech コレクションの全部または一部を
変更の有無に関わらず再配布する場合は CC-BY ライセンスを尊重しなければなりません:
この作品は Creative Commons Attribution 3.0 の下でライセンスされます。
ライセンスのコピーを見るには http://creativecommons.org/licenses/by/3.0/ にアクセスするか、
「Creative Commons, 171 Second Street, Suite 300, San Francisco, California, 94105, USA.」に
手紙を送ってください。

11
INSTALL
View File

@ -140,3 +140,14 @@ $ qmake (qmake-qt5 for Debian baserede systemer)
$ make
# umask 0022
# make install
[ja]
必要条件 :
libQt5 (パッケージ libqt5* を参照)
cupsys-bsd 印刷用
コンパイルの方法 :
$ qmake (Debian ベースのシステムでは qmake-qt5)
$ make
# umask 0022
# make install

4
README
View File

@ -50,3 +50,7 @@ QET gebruikt XML voor de elementen en schema's en omvat een schematische editor,
[da]
QElectroTech er et Qt5 program til at redigere elektriske diagrammer.
Det bruger XML filer for symboler og diagrammer og inkluderer diagram, symbol og titelblok redigering.
[ja]
QElectroTech は電気回路図を作成する Qt5 アプリケーションです。
QET は要素と回路図に XML 形式を利用し、回路図エディタ、要素エディタ、表題欄エディタを含みます。

View File

@ -25,157 +25,171 @@
#include <QtCore/QDateTime>
#include <QtCore/QByteArray>
#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_p.h"
/**
* @brief Constructor. Checks and fires up LocalServer or closes the program
* if another instance already exists
* @param argc
* @param argv
* @param {bool} allowSecondaryInstances
*/
@brief Constructor. Checks and fires up LocalServer or closes the program
if another instance already exists
@param argc
@param argv
@param {bool} allowSecondaryInstances
*/
SingleApplication::SingleApplication( int &argc, char *argv[], bool allowSecondary, Options options, int timeout )
: app_t( argc, argv ), d_ptr( new SingleApplicationPrivate( this ) )
: app_t( argc, argv ), d_ptr( new SingleApplicationPrivate( this ) )
{
Q_D(SingleApplication);
Q_D(SingleApplication);
#if defined(Q_OS_ANDROID) || defined(Q_OS_IOS)
// On Android and iOS since the library is not supported fallback to
// standard QApplication behaviour by simply returning at this point.
qWarning() << "SingleApplication is not supported on Android and iOS systems.";
return;
// On Android and iOS since the library is not supported fallback to
// standard QApplication behaviour by simply returning at this point.
qWarning() << "SingleApplication is not supported on Android and iOS systems.";
return;
#endif
// Store the current mode of the program
d->options = options;
// Store the current mode of the program
d->options = options;
// Generating an application ID used for identifying the shared memory
// block and QLocalServer
d->genBlockServerName();
// Generating an application ID used for identifying the shared memory
// block and QLocalServer
d->genBlockServerName();
#ifdef Q_OS_UNIX
// By explicitly attaching it and then deleting it we make sure that the
// memory is deleted even after the process has crashed on Unix.
d->memory = new QSharedMemory( d->blockServerName );
d->memory->attach();
delete d->memory;
// By explicitly attaching it and then deleting it we make sure that the
// memory is deleted even after the process has crashed on Unix.
d->memory = new QSharedMemory( d->blockServerName );
d->memory->attach();
delete d->memory;
#endif
// Guarantee thread safe behaviour with a shared memory block.
d->memory = new QSharedMemory( d->blockServerName );
// Guarantee thread safe behaviour with a shared memory block.
d->memory = new QSharedMemory( d->blockServerName );
// Create a shared memory block
if( d->memory->create( sizeof( InstancesInfo ) ) ) {
// Initialize the shared memory block
d->memory->lock();
d->initializeMemoryBlock();
d->memory->unlock();
} else {
// Attempt to attach to the memory segment
if( ! d->memory->attach() ) {
qCritical() << "SingleApplication: Unable to attach to shared memory block.";
qCritical() << d->memory->errorString();
delete d;
::exit( EXIT_FAILURE );
}
}
// Create a shared memory block
if( d->memory->create( sizeof( InstancesInfo ) ) ) {
// Initialize the shared memory block
d->memory->lock();
d->initializeMemoryBlock();
d->memory->unlock();
} else {
// Attempt to attach to the memory segment
if( ! d->memory->attach() ) {
qCritical() << "SingleApplication: Unable to attach to shared memory block.";
qCritical() << d->memory->errorString();
delete d;
::exit( EXIT_FAILURE );
}
}
InstancesInfo* inst = static_cast<InstancesInfo*>( d->memory->data() );
QElapsedTimer time;
time.start();
InstancesInfo* inst = static_cast<InstancesInfo*>( d->memory->data() );
QElapsedTimer time;
time.start();
// Make sure the shared memory block is initialised and in consistent state
while( true ) {
d->memory->lock();
// Make sure the shared memory block is initialised and in consistent state
while( true ) {
d->memory->lock();
if( d->blockChecksum() == inst->checksum ) break;
if( d->blockChecksum() == inst->checksum ) break;
if( time.elapsed() > 5000 ) {
qWarning() << "SingleApplication: Shared memory block has been in an inconsistent state from more than 5s. Assuming primary instance failure.";
d->initializeMemoryBlock();
}
if( time.elapsed() > 5000 ) {
qWarning() << "SingleApplication: Shared memory block has been in an inconsistent state from more than 5s. Assuming primary instance failure.";
d->initializeMemoryBlock();
}
d->memory->unlock();
d->memory->unlock();
// Random sleep here limits the probability of a collision between two racing apps
qsrand( QDateTime::currentMSecsSinceEpoch() % std::numeric_limits<uint>::max() );
QThread::sleep( 8 + static_cast <unsigned long>( static_cast <float>( qrand() ) / RAND_MAX * 10 ) );
}
// Random sleep here limits the probability of a collision between two racing apps
#if QT_VERSION < QT_VERSION_CHECK(5, 10, 0) // ### Qt 6: remove
qsrand( QDateTime::currentMSecsSinceEpoch() % std::numeric_limits<uint>::max() );
QThread::sleep( 8 + static_cast <unsigned long>( static_cast <float>( qrand() ) / RAND_MAX * 10 ) );
#else
#if TODO_LIST
#pragma message("@TODO remove code for QT 5.10 or later")
#endif
quint32 value = QRandomGenerator::global()->generate();
QThread::sleep( 8 + static_cast <unsigned long>( static_cast <float>( value ) / RAND_MAX * 10 ) );
#endif
}
if( inst->primary == false) {
d->startPrimary();
d->memory->unlock();
return;
}
if( inst->primary == false) {
d->startPrimary();
d->memory->unlock();
return;
}
// 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;
}
// Check if another instance can be started
if( allowSecondary ) {
inst->secondary += 1;
inst->checksum = d->blockChecksum();
d->instanceNumber = inst->secondary;
d->startSecondary();
if( d->options & Mode::SecondaryNotification ) {
d->connectToPrimary( timeout, SingleApplicationPrivate::SecondaryInstance );
}
d->memory->unlock();
return;
}
d->memory->unlock();
d->memory->unlock();
d->connectToPrimary( timeout, SingleApplicationPrivate::NewInstance );
d->connectToPrimary( timeout, SingleApplicationPrivate::NewInstance );
delete d;
delete d;
::exit( EXIT_SUCCESS );
::exit( EXIT_SUCCESS );
}
/**
* @brief Destructor
*/
@brief Destructor
*/
SingleApplication::~SingleApplication()
{
Q_D(SingleApplication);
delete d;
Q_D(SingleApplication);
delete d;
}
bool SingleApplication::isPrimary()
{
Q_D(SingleApplication);
return d->server != nullptr;
Q_D(SingleApplication);
return d->server != nullptr;
}
bool SingleApplication::isSecondary()
{
Q_D(SingleApplication);
return d->server == nullptr;
Q_D(SingleApplication);
return d->server == nullptr;
}
quint32 SingleApplication::instanceId()
{
Q_D(SingleApplication);
return d->instanceNumber;
Q_D(SingleApplication);
return d->instanceNumber;
}
qint64 SingleApplication::primaryPid()
{
Q_D(SingleApplication);
return d->primaryPid();
Q_D(SingleApplication);
return d->primaryPid();
}
bool SingleApplication::sendMessage( QByteArray message, int timeout )
{
Q_D(SingleApplication);
Q_D(SingleApplication);
// Nobody to connect to
if( isPrimary() ) return false;
// Nobody to connect to
if( isPrimary() ) return false;
// Make sure the socket is connected
d->connectToPrimary( timeout, SingleApplicationPrivate::Reconnect );
// Make sure the socket is connected
d->connectToPrimary( timeout, SingleApplicationPrivate::Reconnect );
d->socket->write( message );
bool dataWritten = d->socket->waitForBytesWritten( timeout );
d->socket->flush();
return dataWritten;
d->socket->write( message );
bool dataWritten = d->socket->waitForBytesWritten( timeout );
d->socket->flush();
return dataWritten;
}

View File

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

View File

@ -1,5 +1,5 @@
QT += core network
CONFIG += c++11
CONFIG += c++17
HEADERS += $$PWD/singleapplication.h \
$$PWD/singleapplication_p.h

View File

@ -43,139 +43,139 @@
#include "singleapplication_p.h"
#ifdef Q_OS_UNIX
#include <unistd.h>
#include <sys/types.h>
#include <pwd.h>
#include <unistd.h>
#include <sys/types.h>
#include <pwd.h>
#endif
#ifdef Q_OS_WIN
#include <windows.h>
#include <lmcons.h>
#include <windows.h>
#include <lmcons.h>
#endif
SingleApplicationPrivate::SingleApplicationPrivate( SingleApplication *q_ptr )
: q_ptr( q_ptr )
: q_ptr( q_ptr )
{
server = nullptr;
socket = nullptr;
memory = nullptr;
instanceNumber = -1;
server = nullptr;
socket = nullptr;
memory = nullptr;
instanceNumber = -1;
}
SingleApplicationPrivate::~SingleApplicationPrivate()
{
if( socket != nullptr ) {
socket->close();
delete socket;
}
if( socket != nullptr ) {
socket->close();
delete socket;
}
memory->lock();
InstancesInfo* inst = static_cast<InstancesInfo*>(memory->data());
if( server != nullptr ) {
server->close();
delete server;
inst->primary = false;
inst->primaryPid = -1;
inst->checksum = blockChecksum();
}
memory->unlock();
memory->lock();
InstancesInfo* inst = static_cast<InstancesInfo*>(memory->data());
if( server != nullptr ) {
server->close();
delete server;
inst->primary = false;
inst->primaryPid = -1;
inst->checksum = blockChecksum();
}
memory->unlock();
delete memory;
delete memory;
}
void SingleApplicationPrivate::genBlockServerName()
{
QCryptographicHash appData( QCryptographicHash::Sha256 );
appData.addData( "SingleApplication", 17 );
appData.addData( SingleApplication::app_t::applicationName().toUtf8() );
appData.addData( SingleApplication::app_t::organizationName().toUtf8() );
appData.addData( SingleApplication::app_t::organizationDomain().toUtf8() );
QCryptographicHash appData( QCryptographicHash::Sha256 );
appData.addData( "SingleApplication", 17 );
appData.addData( SingleApplication::app_t::applicationName().toUtf8() );
appData.addData( SingleApplication::app_t::organizationName().toUtf8() );
appData.addData( SingleApplication::app_t::organizationDomain().toUtf8() );
if( ! (options & SingleApplication::Mode::ExcludeAppVersion) ) {
appData.addData( SingleApplication::app_t::applicationVersion().toUtf8() );
}
if( ! (options & SingleApplication::Mode::ExcludeAppVersion) ) {
appData.addData( SingleApplication::app_t::applicationVersion().toUtf8() );
}
if( ! (options & SingleApplication::Mode::ExcludeAppPath) ) {
if( ! (options & SingleApplication::Mode::ExcludeAppPath) ) {
#ifdef Q_OS_WIN
appData.addData( SingleApplication::app_t::applicationFilePath().toLower().toUtf8() );
appData.addData( SingleApplication::app_t::applicationFilePath().toLower().toUtf8() );
#else
appData.addData( SingleApplication::app_t::applicationFilePath().toUtf8() );
appData.addData( SingleApplication::app_t::applicationFilePath().toUtf8() );
#endif
}
}
// User level block requires a user specific data in the hash
if( options & SingleApplication::Mode::User ) {
// User level block requires a user specific data in the hash
if( options & SingleApplication::Mode::User ) {
#ifdef Q_OS_WIN
wchar_t username [ UNLEN + 1 ];
// Specifies size of the buffer on input
DWORD usernameLength = UNLEN + 1;
if( GetUserNameW( username, &usernameLength ) ) {
appData.addData( QString::fromWCharArray(username).toUtf8() );
} else {
appData.addData( qgetenv("USERNAME") );
}
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);
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
// server naming requirements.
blockServerName = appData.result().toBase64().replace("/", "_");
// Replace the backslash in RFC 2045 Base64 [a-zA-Z0-9+/=] to comply with
// server naming requirements.
blockServerName = appData.result().toBase64().replace("/", "_");
}
void SingleApplicationPrivate::initializeMemoryBlock()
{
InstancesInfo* inst = static_cast<InstancesInfo*>( memory->data() );
inst->primary = false;
inst->secondary = 0;
inst->primaryPid = -1;
inst->checksum = blockChecksum();
InstancesInfo* inst = static_cast<InstancesInfo*>( memory->data() );
inst->primary = false;
inst->secondary = 0;
inst->primaryPid = -1;
inst->checksum = blockChecksum();
}
void SingleApplicationPrivate::startPrimary()
{
Q_Q(SingleApplication);
Q_Q(SingleApplication);
// Successful creation means that no main process exists
// So we start a QLocalServer to listen for connections
QLocalServer::removeServer( blockServerName );
server = new QLocalServer();
// Successful creation means that no main process exists
// So we start a QLocalServer to listen for connections
QLocalServer::removeServer( blockServerName );
server = new QLocalServer();
// Restrict access to the socket according to the
// SingleApplication::Mode::User flag on User level or no restrictions
if( options & SingleApplication::Mode::User ) {
server->setSocketOptions( QLocalServer::UserAccessOption );
} else {
server->setSocketOptions( QLocalServer::WorldAccessOption );
}
// Restrict access to the socket according to the
// SingleApplication::Mode::User flag on User level or no restrictions
if( options & SingleApplication::Mode::User ) {
server->setSocketOptions( QLocalServer::UserAccessOption );
} else {
server->setSocketOptions( QLocalServer::WorldAccessOption );
}
server->listen( blockServerName );
QObject::connect(
server,
&QLocalServer::newConnection,
this,
&SingleApplicationPrivate::slotConnectionEstablished
);
server->listen( blockServerName );
QObject::connect(
server,
&QLocalServer::newConnection,
this,
&SingleApplicationPrivate::slotConnectionEstablished
);
// Reset the number of connections
InstancesInfo* inst = static_cast <InstancesInfo*>( memory->data() );
// Reset the number of connections
InstancesInfo* inst = static_cast <InstancesInfo*>( memory->data() );
inst->primary = true;
inst->primaryPid = q->applicationPid();
inst->checksum = blockChecksum();
inst->primary = true;
inst->primaryPid = q->applicationPid();
inst->checksum = blockChecksum();
instanceNumber = 0;
instanceNumber = 0;
}
void SingleApplicationPrivate::startSecondary()
@ -184,222 +184,261 @@ void SingleApplicationPrivate::startSecondary()
void SingleApplicationPrivate::connectToPrimary( int msecs, ConnectionType connectionType )
{
// Connect to the Local Server of the Primary Instance if not already
// connected.
if( socket == nullptr ) {
socket = new QLocalSocket();
}
// Connect to the Local Server of the Primary Instance if not already
// connected.
if( socket == nullptr ) {
socket = new QLocalSocket();
}
// If already connected - we are done;
if( socket->state() == QLocalSocket::ConnectedState )
return;
// If already connected - we are done;
if( socket->state() == QLocalSocket::ConnectedState )
return;
// If not connect
if( socket->state() == QLocalSocket::UnconnectedState ||
socket->state() == QLocalSocket::ClosingState ) {
socket->connectToServer( blockServerName );
}
// If not connect
if( socket->state() == QLocalSocket::UnconnectedState ||
socket->state() == QLocalSocket::ClosingState ) {
socket->connectToServer( blockServerName );
}
// Wait for being connected
if( socket->state() == QLocalSocket::ConnectingState ) {
socket->waitForConnected( msecs );
}
// Wait for being connected
if( socket->state() == QLocalSocket::ConnectingState ) {
socket->waitForConnected( msecs );
}
// Initialisation message according to the SingleApplication protocol
if( socket->state() == QLocalSocket::ConnectedState ) {
// Notify the parent that a new instance had been started;
QByteArray initMsg;
QDataStream writeStream(&initMsg, QIODevice::WriteOnly);
// Initialisation message according to the SingleApplication protocol
if( socket->state() == QLocalSocket::ConnectedState ) {
// Notify the parent that a new instance had been started;
QByteArray initMsg;
QDataStream writeStream(&initMsg, QIODevice::WriteOnly);
#if (QT_VERSION >= QT_VERSION_CHECK(5, 6, 0))
writeStream.setVersion(QDataStream::Qt_5_6);
writeStream.setVersion(QDataStream::Qt_5_6);
#endif
writeStream << blockServerName.toLatin1();
writeStream << static_cast<quint8>(connectionType);
writeStream << instanceNumber;
quint16 checksum = qChecksum(initMsg.constData(), static_cast<quint32>(initMsg.length()));
writeStream << checksum;
writeStream << blockServerName.toLatin1();
writeStream << static_cast<quint8>(connectionType);
writeStream << instanceNumber;
// The header indicates the message length that follows
QByteArray header;
QDataStream headerStream(&header, QIODevice::WriteOnly);
#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) // ### Qt 6: remove
quint16 checksum =
qChecksum(
initMsg.constData(),
static_cast<quint32>(initMsg.length()));
#else
#if TODO_LIST
#pragma message("@TODO remove code for QT 6 or later")
#endif
quint16 checksum =
qChecksum(
QByteArrayView(
initMsg.constData(),
static_cast<quint32>(initMsg.length())));
#endif
writeStream << checksum;
// The header indicates the message length that follows
QByteArray header;
QDataStream headerStream(&header, QIODevice::WriteOnly);
#if (QT_VERSION >= QT_VERSION_CHECK(5, 6, 0))
headerStream.setVersion(QDataStream::Qt_5_6);
headerStream.setVersion(QDataStream::Qt_5_6);
#endif
headerStream << static_cast <quint64>( initMsg.length() );
headerStream << static_cast <quint64>( initMsg.length() );
socket->write( header );
socket->write( initMsg );
socket->flush();
socket->waitForBytesWritten( msecs );
}
socket->write( header );
socket->write( initMsg );
socket->flush();
socket->waitForBytesWritten( msecs );
}
}
quint16 SingleApplicationPrivate::blockChecksum()
{
return qChecksum(
static_cast <const char *>( memory->data() ),
offsetof( InstancesInfo, checksum )
);
#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) // ### Qt 6: remove
return qChecksum(
static_cast <const char *>( memory->data() ),
offsetof( InstancesInfo, checksum )
);
#else
#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
}
qint64 SingleApplicationPrivate::primaryPid()
{
qint64 pid;
qint64 pid;
memory->lock();
InstancesInfo* inst = static_cast<InstancesInfo*>( memory->data() );
pid = inst->primaryPid;
memory->unlock();
memory->lock();
InstancesInfo* inst = static_cast<InstancesInfo*>( memory->data() );
pid = inst->primaryPid;
memory->unlock();
return pid;
return pid;
}
/**
* @brief Executed when a connection has been made to the LocalServer
*/
@brief Executed when a connection has been made to the LocalServer
*/
void SingleApplicationPrivate::slotConnectionEstablished()
{
QLocalSocket *nextConnSocket = server->nextPendingConnection();
connectionMap.insert(nextConnSocket, ConnectionInfo());
QLocalSocket *nextConnSocket = server->nextPendingConnection();
connectionMap.insert(nextConnSocket, ConnectionInfo());
QObject::connect(nextConnSocket, &QLocalSocket::aboutToClose,
[nextConnSocket, this]() {
auto &info = connectionMap[nextConnSocket];
Q_EMIT this->slotClientConnectionClosed( nextConnSocket, info.instanceId );
}
);
QObject::connect(nextConnSocket, &QLocalSocket::aboutToClose,
[nextConnSocket, this]() {
auto &info = connectionMap[nextConnSocket];
Q_EMIT this->slotClientConnectionClosed( nextConnSocket, info.instanceId );
}
);
QObject::connect(nextConnSocket, &QLocalSocket::disconnected,
[nextConnSocket, this](){
connectionMap.remove(nextConnSocket);
nextConnSocket->deleteLater();
}
);
QObject::connect(nextConnSocket, &QLocalSocket::disconnected,
[nextConnSocket, this](){
connectionMap.remove(nextConnSocket);
nextConnSocket->deleteLater();
}
);
QObject::connect(nextConnSocket, &QLocalSocket::readyRead,
[nextConnSocket, this]() {
auto &info = connectionMap[nextConnSocket];
switch(info.stage) {
case StageHeader:
readInitMessageHeader(nextConnSocket);
break;
case StageBody:
readInitMessageBody(nextConnSocket);
break;
case StageConnected:
Q_EMIT this->slotDataAvailable( nextConnSocket, info.instanceId );
break;
default:
break;
};
}
);
QObject::connect(nextConnSocket, &QLocalSocket::readyRead,
[nextConnSocket, this]() {
auto &info = connectionMap[nextConnSocket];
switch(info.stage) {
case StageHeader:
readInitMessageHeader(nextConnSocket);
break;
case StageBody:
readInitMessageBody(nextConnSocket);
break;
case StageConnected:
Q_EMIT this->slotDataAvailable( nextConnSocket, info.instanceId );
break;
default:
break;
};
}
);
}
void SingleApplicationPrivate::readInitMessageHeader( QLocalSocket *sock )
{
if (!connectionMap.contains( sock )) {
return;
}
if (!connectionMap.contains( sock )) {
return;
}
if( sock->bytesAvailable() < ( qint64 )sizeof( quint64 ) ) {
return;
}
if( sock->bytesAvailable() < ( qint64 )sizeof( quint64 ) ) {
return;
}
QDataStream headerStream( sock );
QDataStream headerStream( sock );
#if (QT_VERSION >= QT_VERSION_CHECK(5, 6, 0))
headerStream.setVersion( QDataStream::Qt_5_6 );
headerStream.setVersion( QDataStream::Qt_5_6 );
#endif
// Read the header to know the message length
quint64 msgLen = 0;
headerStream >> msgLen;
ConnectionInfo &info = connectionMap[sock];
info.stage = StageBody;
info.msgLen = msgLen;
// Read the header to know the message length
quint64 msgLen = 0;
headerStream >> msgLen;
ConnectionInfo &info = connectionMap[sock];
info.stage = StageBody;
info.msgLen = msgLen;
if ( sock->bytesAvailable() >= (qint64) msgLen ) {
readInitMessageBody( sock );
}
if ( sock->bytesAvailable() >= (qint64) msgLen ) {
readInitMessageBody( sock );
}
}
void SingleApplicationPrivate::readInitMessageBody( QLocalSocket *sock )
{
Q_Q(SingleApplication);
Q_Q(SingleApplication);
if (!connectionMap.contains( sock )) {
return;
}
if (!connectionMap.contains( sock )) {
return;
}
ConnectionInfo &info = connectionMap[sock];
if( sock->bytesAvailable() < ( qint64 )info.msgLen ) {
return;
}
ConnectionInfo &info = connectionMap[sock];
if( sock->bytesAvailable() < ( qint64 )info.msgLen ) {
return;
}
// Read the message body
QByteArray msgBytes = sock->read(info.msgLen);
QDataStream readStream(msgBytes);
// Read the message body
QByteArray msgBytes = sock->read(info.msgLen);
QDataStream readStream(msgBytes);
#if (QT_VERSION >= QT_VERSION_CHECK(5, 6, 0))
readStream.setVersion( QDataStream::Qt_5_6 );
readStream.setVersion( QDataStream::Qt_5_6 );
#endif
// server name
QByteArray latin1Name;
readStream >> latin1Name;
// server name
QByteArray latin1Name;
readStream >> latin1Name;
// connection type
ConnectionType connectionType = InvalidConnection;
quint8 connTypeVal = InvalidConnection;
readStream >> connTypeVal;
connectionType = static_cast <ConnectionType>( connTypeVal );
// connection type
ConnectionType connectionType = InvalidConnection;
quint8 connTypeVal = InvalidConnection;
readStream >> connTypeVal;
connectionType = static_cast <ConnectionType>( connTypeVal );
// instance id
quint32 instanceId = 0;
readStream >> instanceId;
// instance id
quint32 instanceId = 0;
readStream >> instanceId;
// checksum
quint16 msgChecksum = 0;
readStream >> msgChecksum;
// checksum
quint16 msgChecksum = 0;
readStream >> msgChecksum;
const quint16 actualChecksum = qChecksum( msgBytes.constData(), static_cast<quint32>( msgBytes.length() - sizeof( quint16 ) ) );
#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) // ### Qt 6: remove
const quint16 actualChecksum =
qChecksum(
msgBytes.constData(),
static_cast<quint32>( msgBytes.length() - sizeof( quint16 ) ) );
#else
#if TODO_LIST
#pragma message("@TODO remove code for QT 6 or later")
#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 &&
QLatin1String(latin1Name) == blockServerName &&
msgChecksum == actualChecksum;
if( !isValid ) {
sock->close();
return;
}
if( !isValid ) {
sock->close();
return;
}
info.instanceId = instanceId;
info.stage = StageConnected;
info.instanceId = instanceId;
info.stage = StageConnected;
if( connectionType == NewInstance ||
( connectionType == SecondaryInstance &&
options & SingleApplication::Mode::SecondaryNotification ) )
{
Q_EMIT q->instanceStarted();
}
if( connectionType == NewInstance ||
( connectionType == SecondaryInstance &&
options & SingleApplication::Mode::SecondaryNotification ) )
{
Q_EMIT q->instanceStarted();
}
if (sock->bytesAvailable() > 0) {
Q_EMIT this->slotDataAvailable( sock, instanceId );
}
if (sock->bytesAvailable() > 0) {
Q_EMIT this->slotDataAvailable( sock, instanceId );
}
}
void SingleApplicationPrivate::slotDataAvailable( QLocalSocket *dataSocket, quint32 instanceId )
{
Q_Q(SingleApplication);
Q_EMIT q->receivedMessage( instanceId, dataSocket->readAll() );
Q_Q(SingleApplication);
Q_EMIT q->receivedMessage( instanceId, dataSocket->readAll() );
}
void SingleApplicationPrivate::slotClientConnectionClosed( QLocalSocket *closedSocket, quint32 instanceId )
{
if( closedSocket->bytesAvailable() > 0 )
Q_EMIT slotDataAvailable( closedSocket, instanceId );
if( closedSocket->bytesAvailable() > 0 )
Q_EMIT slotDataAvailable( closedSocket, instanceId );
}

View File

@ -38,62 +38,62 @@
#include "singleapplication.h"
struct InstancesInfo {
bool primary;
quint32 secondary;
qint64 primaryPid;
quint16 checksum;
bool primary;
quint32 secondary;
qint64 primaryPid;
quint16 checksum;
};
struct ConnectionInfo {
explicit ConnectionInfo() :
msgLen(0), instanceId(0), stage(0) {}
qint64 msgLen;
quint32 instanceId;
quint8 stage;
explicit ConnectionInfo() :
msgLen(0), instanceId(0), stage(0) {}
qint64 msgLen;
quint32 instanceId;
quint8 stage;
};
class SingleApplicationPrivate : public QObject {
Q_OBJECT
public:
enum ConnectionType : quint8 {
InvalidConnection = 0,
NewInstance = 1,
SecondaryInstance = 2,
Reconnect = 3
};
enum ConnectionStage : quint8 {
StageHeader = 0,
StageBody = 1,
StageConnected = 2,
};
Q_DECLARE_PUBLIC(SingleApplication)
SingleApplicationPrivate( SingleApplication *q_ptr );
~SingleApplicationPrivate();
void genBlockServerName();
void initializeMemoryBlock();
void startPrimary();
void startSecondary();
void connectToPrimary(int msecs, ConnectionType connectionType );
quint16 blockChecksum();
qint64 primaryPid();
void readInitMessageHeader(QLocalSocket *socket);
void readInitMessageBody(QLocalSocket *socket);
SingleApplication *q_ptr;
QSharedMemory *memory;
QLocalSocket *socket;
QLocalServer *server;
quint32 instanceNumber;
QString blockServerName;
SingleApplication::Options options;
QMap<QLocalSocket*, ConnectionInfo> connectionMap;
public Q_SLOTS:
void slotConnectionEstablished();
void slotDataAvailable( QLocalSocket*, quint32 );
void slotClientConnectionClosed( QLocalSocket*, quint32 );
Q_OBJECT
public:
enum ConnectionType : quint8 {
InvalidConnection = 0,
NewInstance = 1,
SecondaryInstance = 2,
Reconnect = 3
};
enum ConnectionStage : quint8 {
StageHeader = 0,
StageBody = 1,
StageConnected = 2,
};
Q_DECLARE_PUBLIC(SingleApplication)
SingleApplicationPrivate( SingleApplication *q_ptr );
~SingleApplicationPrivate();
void genBlockServerName();
void initializeMemoryBlock();
void startPrimary();
void startSecondary();
void connectToPrimary(int msecs, ConnectionType connectionType );
quint16 blockChecksum();
qint64 primaryPid();
void readInitMessageHeader(QLocalSocket *socket);
void readInitMessageBody(QLocalSocket *socket);
SingleApplication *q_ptr;
QSharedMemory *memory;
QLocalSocket *socket;
QLocalServer *server;
quint32 instanceNumber;
QString blockServerName;
SingleApplication::Options options;
QMap<QLocalSocket*, ConnectionInfo> connectionMap;
public Q_SLOTS:
void slotConnectionEstablished();
void slotDataAvailable( QLocalSocket*, quint32 );
void slotClientConnectionClosed( QLocalSocket*, quint32 );
};
#endif // SINGLEAPPLICATION_P_H

View File

@ -1,6 +1,6 @@
From 579ee22f1d2bef560ec90d324a0e476b81faf495 Mon Sep 17 00:00:00 2001
From: Mathieu Bridon <mathieu@hashbang.fr>
Date: Tue, 7 Jan 2020 14:39:08 +0100
From 2a390b5188fe070295090b1bd37273d12963b371 Mon Sep 17 00:00:00 2001
From: Laurent Trinques <scorpio@qelectrotech.org>
Date: Sat, 26 Sep 2020 22:52:52 +0200
Subject: [PATCH] build: Fix the installation paths
---
@ -8,37 +8,37 @@ Subject: [PATCH] build: Fix the installation paths
1 file changed, 7 insertions(+), 7 deletions(-)
diff --git a/qelectrotech.pro b/qelectrotech.pro
index 07e51fb..2a86b91 100644
index 2901a30d5..1019a9870 100644
--- a/qelectrotech.pro
+++ b/qelectrotech.pro
@@ -5,20 +5,20 @@
# Chemins utilises pour la compilation et l'installation de QET
unix {
# Chemins UNIX
- COMPIL_PREFIX = '/usr/local/'
- INSTALL_PREFIX = '/usr/local/'
+ COMPIL_PREFIX = '/app/'
+ INSTALL_PREFIX = '/app/'
QET_BINARY_PATH = 'bin/'
QET_COMMON_COLLECTION_PATH = 'share/qelectrotech/elements/'
QET_COMMON_TBT_PATH = 'share/qelectrotech/titleblocks/'
QET_LANG_PATH = 'share/qelectrotech/lang/'
QET_EXAMPLES_PATH = 'share/qelectrotech/examples/'
- QET_LICENSE_PATH = 'doc/qelectrotech/'
- QET_MIME_XML_PATH = '../share/mime/application/'
- QET_MIME_DESKTOP_PATH = '../share/mimelnk/application/'
- QET_MIME_PACKAGE_PATH = '../share/mime/packages/'
+ QET_LICENSE_PATH = 'share/doc/qelectrotech/'
+ QET_MIME_XML_PATH = 'share/mime/application/'
+ QET_MIME_DESKTOP_PATH = 'share/mimelnk/application/'
+ QET_MIME_PACKAGE_PATH = 'share/mime/packages/'
QET_DESKTOP_PATH = 'share/applications/'
QET_ICONS_PATH = 'share/icons/hicolor/'
- QET_MAN_PATH = 'man/'
+ QET_MAN_PATH = 'share/man/'
QET_APPDATA_PATH = 'share/appdata'
# Chemins UNIX
- COMPIL_PREFIX = '/usr/local/'
- INSTALL_PREFIX = '/usr/local/'
+ COMPIL_PREFIX = '/app/'
+ INSTALL_PREFIX = '/app/'
QET_BINARY_PATH = 'bin/'
QET_COMMON_COLLECTION_PATH = 'share/qelectrotech/elements/'
QET_COMMON_TBT_PATH = 'share/qelectrotech/titleblocks/'
QET_LANG_PATH = 'share/qelectrotech/lang/'
QET_EXAMPLES_PATH = 'share/qelectrotech/examples/'
- QET_LICENSE_PATH = 'doc/qelectrotech/'
- QET_MIME_XML_PATH = '../share/mime/application/'
- QET_MIME_DESKTOP_PATH = '../share/mimelnk/application/'
- QET_MIME_PACKAGE_PATH = '../share/mime/packages/'
+ QET_LICENSE_PATH = 'share/doc/qelectrotech/'
+ QET_MIME_XML_PATH = 'share/mime/application/'
+ QET_MIME_DESKTOP_PATH = 'share/mimelnk/application/'
+ QET_MIME_PACKAGE_PATH = 'share/mime/packages/'
QET_DESKTOP_PATH = 'share/applications/'
QET_ICONS_PATH = 'share/icons/hicolor/'
- QET_MAN_PATH = 'man/'
+ QET_MAN_PATH = 'share/man/'
QET_APPDATA_PATH = 'share/appdata'
}
win32 {
--
2.24.1
2.28.0

View File

@ -36,3 +36,6 @@ Elementen collectie voor QElectroTech.
[da]
Symbol samling for QElectroTech.
[ja]
QElectroTech の要素コレクション。

View File

@ -91,8 +91,10 @@ parts:
after: [kde-sdk-setup]
plugin: nil
source: .
stage-packages: [ git, sqlite3 ]
build-packages:
- git
- libsqlite3-dev
override-pull: |
snapcraftctl pull
snap_version=$(git describe --dirty)

View File

@ -1,4 +1,4 @@
<definition width="40" version="0.3" hotspot_x="18" hotspot_y="15" height="30" type="element" ic="true" orientation="dyyy"
<definition width="40" version="0.3" hotspot_x="18" hotspot_y="15" height="30" type="element" ic="true"
link_type="next_report">
<uuid uuid="{717352A1-F3C7-49C7-9A06-51620AB5CA00}"/><names>
<name lang="ru">Следующая страница</name>

View File

@ -12,5 +12,6 @@
<name lang="es">Referencias</name>
<name lang="nl">Referenties</name>
<name lang="da">Ark henvisninger</name>
<name lang="ja">フォリオ参照</name>
</names>
</qet-directory>

View File

@ -1,4 +1,4 @@
<definition type="element" orientation="dyyy" height="80" hotspot_y="40" version="0.70" width="50" hotspot_x="23" link_type="simple">
<definition type="element" height="80" hotspot_y="40" version="0.70" width="50" hotspot_x="23" link_type="simple">
<uuid uuid="{65b9e889-c2eb-4d85-aa9e-c1dff55678f5}"/>
<names>
<name lang="en">Three-pole source + PEN</name>

View File

@ -1,4 +1,4 @@
<definition type="element" orientation="dyyy" height="100" hotspot_y="40" version="0.70" width="40" hotspot_x="20" link_type="simple">
<definition type="element" height="100" hotspot_y="40" version="0.70" width="40" hotspot_x="20" link_type="simple">
<uuid uuid="{b4b70d3d-8784-4323-b17b-d8ff3677cdc1}"/>
<names>
<name lang="en">Three-pole source + PEN</name>

View File

@ -1,4 +1,4 @@
<definition height="50" width="30" link_type="terminal" hotspot_x="16" version="0.80" orientation="dyyy" type="element" hotspot_y="29">
<definition height="50" width="30" link_type="terminal" hotspot_x="16" version="0.80" type="element" hotspot_y="29">
<uuid uuid="{a98ac40d-9055-4b9b-88ab-cffe6b08ed37}"/>
<names>
<name lang="ro">Masă</name>

View File

@ -1,4 +1,4 @@
<definition width="20" link_type="simple" version="0.5" hotspot_x="9" orientation="dyyy" height="30" hotspot_y="20" type="element">
<definition width="20" link_type="simple" version="0.5" hotspot_x="9" height="30" hotspot_y="20" type="element">
<uuid uuid="{5983fe6f-de69-4368-a387-a6ce3b9c2951}"/>
<names>
<name lang="pt">Massa</name>

View File

@ -11,5 +11,6 @@
<name lang="cs">Síťové zdroje</name>
<name lang="es">Fuentes de red</name>
<name lang="da">Netværkskilder</name>
<name lang="ja">電源網</name>
</names>
</qet-directory>

View File

@ -1,4 +1,4 @@
<definition width="30" link_type="simple" version="0.5" hotspot_x="15" orientation="dyyy" height="60" hotspot_y="30" type="element">
<definition width="30" link_type="simple" version="0.5" hotspot_x="15" height="60" hotspot_y="30" type="element">
<uuid uuid="{35f2834a-308b-4e79-bc2a-1c00486b24e7}"/>
<names>
<name lang="es">Fuente unipolo + PE +N</name>

View File

@ -1,4 +1,4 @@
<definition width="40" link_type="simple" version="0.5" hotspot_x="22" orientation="dyyy" height="40" hotspot_y="20" type="element">
<definition width="40" link_type="simple" version="0.5" hotspot_x="22" height="40" hotspot_y="20" type="element">
<uuid uuid="{fd042050-e73b-4f95-b4c1-834aa403b07a}"/>
<names>
<name lang="es">Fuente unipolo + PEN</name>

View File

@ -1,4 +1,4 @@
<definition width="30" link_type="simple" version="0.5" hotspot_x="15" orientation="dyyy" height="40" hotspot_y="20" type="element">
<definition width="30" link_type="simple" version="0.5" hotspot_x="15" height="40" hotspot_y="20" type="element">
<uuid uuid="{457a0c01-871c-40fd-83d7-14033333fb95}"/>
<names>
<name lang="pt">Fonte unipolar + neutro</name>

View File

@ -1,4 +1,4 @@
<definition width="30" link_type="simple" version="0.5" hotspot_x="15" orientation="dyyy" height="60" hotspot_y="30" type="element">
<definition width="30" link_type="simple" version="0.5" hotspot_x="15" height="60" hotspot_y="30" type="element">
<uuid uuid="{03b9e482-cb45-4bee-8030-96b93624fc60}"/>
<names>
<name lang="pt">Fonte tripolar</name>

View File

@ -1,4 +1,4 @@
<definition width="30" link_type="simple" version="0.5" hotspot_x="15" orientation="dyyy" height="100" hotspot_y="50" type="element">
<definition width="30" link_type="simple" version="0.5" hotspot_x="15" height="100" hotspot_y="50" type="element">
<uuid uuid="{0e017749-6c0f-44c0-8726-6804be8bbee7}"/>
<names>
<name lang="es">Fuente tripolar + PE +N</name>

View File

@ -1,4 +1,4 @@
<definition width="40" link_type="simple" version="0.5" hotspot_x="23" orientation="dyyy" height="80" hotspot_y="41" type="element">
<definition width="40" link_type="simple" version="0.5" hotspot_x="23" height="80" hotspot_y="41" type="element">
<uuid uuid="{c0913e95-3b3c-4dc2-a74d-bc73ded78c32}"/>
<names>
<name lang="es">Fuente tripolar + PEN</name>

View File

@ -1,4 +1,4 @@
<definition width="30" link_type="simple" version="0.5" hotspot_x="15" orientation="dyyy" height="80" hotspot_y="40" type="element">
<definition width="30" link_type="simple" version="0.5" hotspot_x="15" height="80" hotspot_y="40" type="element">
<uuid uuid="{8bfb1790-0735-47d5-88a2-8b4d91aba2f1}"/>
<names>
<name lang="pt">Fonte tripolar + neutro</name>

View File

@ -1,4 +1,4 @@
<definition width="30" link_type="simple" version="0.5" hotspot_x="15" orientation="dyyy" height="20" hotspot_y="10" type="element">
<definition width="30" link_type="simple" version="0.5" hotspot_x="15" height="20" hotspot_y="10" type="element">
<uuid uuid="{b5ad2e41-804d-4745-99be-e8951cffdf98}"/>
<names>
<name lang="pt">Fonte de neutro</name>

View File

@ -1,4 +1,4 @@
<definition width="30" link_type="simple" version="0.5" hotspot_x="15" orientation="dyyy" height="20" hotspot_y="10" type="element">
<definition width="30" link_type="simple" version="0.5" hotspot_x="15" height="20" hotspot_y="10" type="element">
<uuid uuid="{7693c5e0-762b-4309-8d97-cb74619f9efd}"/>
<names>
<name lang="pt">Fonte de fase</name>

View File

@ -1,4 +1,4 @@
<definition width="70" link_type="simple" version="0.5" hotspot_x="34" orientation="dyyy" height="100" hotspot_y="40" type="element">
<definition width="70" link_type="simple" version="0.5" hotspot_x="34" height="100" hotspot_y="40" type="element">
<uuid uuid="{4b9794cf-e7c0-4f59-aa0a-bb1fce4dfe48}"/>
<names>
<name lang="es">Punto de distribución TN-C > TN-S</name>

View File

@ -1,4 +1,4 @@
<definition height="30" width="20" link_type="terminal" hotspot_x="10" version="0.80" orientation="dyyy" type="element" hotspot_y="19">
<definition height="30" width="20" link_type="terminal" hotspot_x="10" version="0.80" type="element" hotspot_y="19">
<uuid uuid="{e4e753a8-9fde-4e8e-9256-0cf99d67e3de}"/>
<names>
<name lang="pt">Terra</name>

View File

@ -0,0 +1,15 @@
<definition width="20" height="20" hotspot_y="9" type="element" link_type="simple" hotspot_x="9" version="0.60">
<uuid uuid="{079913f8-18b5-4524-84bd-aadf75dfefbf}"/>
<names>
<name lang="cs">Bod</name>
</names>
<informations></informations>
<description>
<circle diameter="4" style="line-style:normal;line-weight:normal;filling:black;color:black" antialias="false" y="-2" x="-2"/>
<input rotate="true" text=" " tagg="label" size="9" y="-3" x="-11"/>
<terminal orientation="e" y="0" x="2"/>
<terminal orientation="w" y="0" x="-2"/>
<terminal orientation="s" y="2" x="0"/>
<terminal orientation="n" y="-2" x="0"/>
</description>
</definition>

View File

@ -1,4 +1,4 @@
<definition hotspot_x="11" hotspot_y="4" version="0.70" type="element" height="20" orientation="dyyy" link_type="terminal" width="30">
<definition hotspot_x="11" hotspot_y="4" version="0.70" type="element" height="20" link_type="terminal" width="30">
<uuid uuid="{141e7e1e-4f7f-456d-9f04-52c32109b969}"/>
<names>
<name lang="en">Combine</name>

View File

@ -1,4 +1,4 @@
<definition hotspot_y="7" width="20" orientation="dyyy" type="element" height="20" version="0.70" hotspot_x="11" link_type="terminal">
<definition hotspot_y="7" width="20" type="element" height="20" version="0.70" hotspot_x="11" link_type="terminal">
<uuid uuid="{2d505b61-db0f-4784-9b9c-189366058272}"/>
<names>
<name lang="es">Esquina</name>

View File

@ -1,4 +1,4 @@
<definition height="20" link_type="terminal" hotspot_x="9" width="20" orientation="dyyy" hotspot_y="9" version="0.70" type="element">
<definition height="20" link_type="terminal" hotspot_x="9" width="20" hotspot_y="9" version="0.70" type="element">
<uuid uuid="{8c0d3e9c-dc37-41d7-bfd5-fe4dbf8dc4fb}"/>
<names>
<name lang="ru">Пересечение</name>

View File

@ -1,4 +1,4 @@
<definition width="10" hotspot_y="14" hotspot_x="5" height="30" link_type="terminal" orientation="dyyy" version="0.70" type="element">
<definition width="10" hotspot_y="14" hotspot_x="5" height="30" link_type="terminal" version="0.70" type="element">
<uuid uuid="{b5abb4c2-455d-45ff-95f2-328521f4e2e1}"/>
<names>
<name lang="en">Jump</name>

View File

@ -0,0 +1,19 @@
<definition version="0.70" height="30" type="element" width="30" hotspot_x="14" link_type="simple" hotspot_y="12">
<uuid uuid="{3015326e-2599-495e-8ef0-c12ff5313dd0}"/>
<names>
<name lang="cs">Všestranný spoj</name>
</names>
<elementInformations/>
<informations></informations>
<description>
<polygon x6="6" x2="-5" x8="6" y5="5" y2="0" closed="false" x10="0" x3="0" x7="10" y7="0" y4="10" y11="-5" antialias="false" x9="0" x11="0" style="line-style:normal;line-weight:normal;filling:none;color:black" x5="0" y9="5" y10="-5" y1="0" y6="0" x4="0" x1="-10" y8="0" y3="5"/>
<dynamic_text font="Sans Serif,9,-1,5,50,0,0,0,0,0" frame="false" x="-13" text_from="ElementInfo" y="-12" z="2" rotation="0" Valignment="AlignTop" text_width="-1" uuid="{14c0b70c-c028-49ef-bf72-3c3c9cd64669}" Halignment="AlignLeft">
<text></text>
<info_name>label</info_name>
</dynamic_text>
<terminal x="0" y="-5" orientation="n"/>
<terminal x="0" y="10" orientation="s"/>
<terminal x="-10" y="0" orientation="w"/>
<terminal x="10" y="0" orientation="e"/>
</description>
</definition>

View File

@ -0,0 +1,17 @@
<definition type="element" hotspot_x="35" version="0.80" width="70" height="80" hotspot_y="46" link_type="simple">
<uuid uuid="{e5a46987-e259-4ca4-9e40-eedc3652f738}"/>
<names>
<name lang="cs">Pokus</name>
</names>
<elementInformations/>
<informations></informations>
<description>
<rect width="60" x="-30" style="line-style:normal;line-weight:normal;filling:none;color:black" height="65" rx="0" y="-35" antialias="false" ry="0"/>
<dynamic_text z="3" font="Sans Serif,9,-1,5,0,0,0,0,0,0,normal" Valignment="AlignTop" uuid="{cec75afa-b854-41b8-aed8-6edba82c76ff}" text_from="ElementInfo" x="-45" text_width="-1" y="-20" frame="false" rotation="0" Halignment="AlignLeft">
<text></text>
<info_name>label</info_name>
</dynamic_text>
<terminal orientation="n" x="20" y="-40"/>
<terminal orientation="n" x="-20" y="-40"/>
</description>
</definition>

View File

@ -11,5 +11,6 @@
<name lang="nl">Verbindingen</name>
<name lang="es">Conexiones</name>
<name lang="da">Forbindelser</name>
<name lang="ja">接続</name>
</names>
</qet-directory>

View File

@ -1,4 +1,4 @@
<definition type="element" height="20" width="30" orientation="dyyy" version="0.70" hotspot_y="4" link_type="terminal" hotspot_x="17">
<definition type="element" height="20" width="30" version="0.70" hotspot_y="4" link_type="terminal" hotspot_x="17">
<uuid uuid="{709e6400-adc2-4faf-ba46-aa513d1dcaf1}"/>
<names>
<name lang="fr">Epissure</name>

View File

@ -1,4 +1,4 @@
<definition hotspot_y="4" height="20" hotspot_x="17" type="element" width="30" link_type="terminal" orientation="dyyy" version="0.70">
<definition hotspot_y="4" height="20" hotspot_x="17" type="element" width="30" link_type="terminal" version="0.70">
<uuid uuid="{9e88368e-1b20-4a56-8941-5d17a4cce2d4}"/>
<names>
<name lang="cs">Levé spojení</name>

View File

@ -1,4 +1,4 @@
<definition link_type="terminal" width="30" hotspot_x="14" orientation="dyyy" height="20" version="0.70" hotspot_y="4" type="element">
<definition link_type="terminal" width="30" hotspot_x="14" height="20" version="0.70" hotspot_y="4" type="element">
<uuid uuid="{6e40fff3-691c-4622-b9aa-4ff930a5b981}"/>
<names>
<name lang="en">Thru right</name>

View File

@ -1,4 +1,4 @@
<definition width="120" version="0.3" hotspot_x="71" hotspot_y="10" height="40" type="element" orientation="dyyy">
<definition width="120" version="0.3" hotspot_x="71" hotspot_y="10" height="40" type="element">
<names>
<name lang="ar">كايبل طورين + تأريض</name>
<name lang="de">Kabel 3G</name>

View File

@ -1,4 +1,4 @@
<definition width="120" version="0.3" hotspot_x="70" hotspot_y="10" height="40" type="element" orientation="dyyy">
<definition width="120" version="0.3" hotspot_x="70" hotspot_y="10" height="40" type="element">
<names>
<name lang="ar">كايبل ثلاثي الطور + تأريض</name>
<name lang="de">Kabel 4G</name>

View File

@ -1,4 +1,4 @@
<definition width="100" version="0.3" hotspot_x="60" hotspot_y="10" height="40" type="element" orientation="dyyy">
<definition width="100" version="0.3" hotspot_x="60" hotspot_y="10" height="40" type="element">
<names>
<name lang="ar">كايبل بطورين و تأريض</name>
<name lang="de">Kabel 3G</name>

View File

@ -1,4 +1,4 @@
<definition width="130" version="0.3" hotspot_x="88" hotspot_y="18" height="40" type="element" orientation="dyyy">
<definition width="130" version="0.3" hotspot_x="88" hotspot_y="18" height="40" type="element">
<names>
<name lang="ar">كايبل رباعي النواة</name>
<name lang="It">Cavo ? 4G</name>

View File

@ -1,4 +1,4 @@
<definition hotspot_y="3" orientation="dyyy" version="0.51" hotspot_x="47" link_type="simple" width="100" type="element" height="20">
<definition hotspot_y="3" version="0.51" hotspot_x="47" link_type="simple" width="100" type="element" height="20">
<uuid uuid="{9923c1a5-b49a-4243-923e-cde9d916ea2b}"/>
<names>
<name lang="fr">Cable 5G</name>

View File

@ -1,4 +1,4 @@
<definition hotspot_y="3" orientation="dyyy" version="0.51" hotspot_x="29" link_type="simple" width="60" type="element" height="20">
<definition hotspot_y="3" version="0.51" hotspot_x="29" link_type="simple" width="60" type="element" height="20">
<uuid uuid="{5f981421-4c54-4cd5-929e-7f77dab94fef}"/>
<names>
<name lang="It">Cavo ? 3G</name>

View File

@ -1,4 +1,4 @@
<definition width="70" link_type="simple" version="0.5" hotspot_x="15" orientation="dyyy" height="20" hotspot_y="9" type="element">
<definition width="70" link_type="simple" version="0.5" hotspot_x="15" height="20" hotspot_y="9" type="element">
<uuid uuid="{4b9a04b1-0d35-4d54-b5cb-b573ed3a9b0d}"/>
<names>
<name lang="de">Kabel 3x</name>

View File

@ -1,4 +1,4 @@
<definition width="60" link_type="simple" version="0.5" hotspot_x="21" orientation="dyyy" height="10" hotspot_y="-6" type="element">
<definition width="60" link_type="simple" version="0.5" hotspot_x="21" height="10" hotspot_y="-6" type="element">
<uuid uuid="{822e6fc1-0104-4d3a-ba3c-995c24c79cf2}"/>
<names>
<name lang="nl">Scherm</name>

View File

@ -1,4 +1,4 @@
<definition width="30" link_type="simple" version="0.5" hotspot_x="15" orientation="dyyy" height="20" hotspot_y="9" type="element">
<definition width="30" link_type="simple" version="0.5" hotspot_x="15" height="20" hotspot_y="9" type="element">
<uuid uuid="{6ac285f9-6492-40cb-be58-9ba565ea1921}"/>
<names>
<name lang="de">Kabelader</name>

View File

@ -1,4 +1,4 @@
<definition width="20" link_type="simple" version="0.5" hotspot_x="10" orientation="dyyy" height="20" hotspot_y="9" type="element">
<definition width="20" link_type="simple" version="0.5" hotspot_x="10" height="20" hotspot_y="9" type="element">
<uuid uuid="{374ed6b3-7329-4cad-ac8c-200b17508460}"/>
<names>
<name lang="de">Verdrahtung</name>

View File

@ -1,4 +1,4 @@
<definition width="70" hotspot_x="35" hotspot_y="5" orientation="dyyy" version="0.80" type="element" height="10" link_type="simple">
<definition width="70" hotspot_x="35" hotspot_y="5" version="0.80" type="element" height="10" link_type="simple">
<uuid uuid="{3cfdc90d-f114-4ecd-9ab2-37786c279287}"/>
<names>
<name lang="de">Kabel 3G</name>

View File

@ -1,4 +1,4 @@
<definition type="element" height="10" link_type="simple" version="0.60" hotspot_x="36" hotspot_y="5" orientation="dyyy" width="90">
<definition type="element" height="10" link_type="simple" version="0.60" hotspot_x="36" hotspot_y="5" width="90">
<uuid uuid="{e02f4582-b5dd-4f81-ba71-e3d5521b4152}"/>
<names>
<name lang="ru">Кабель 3 жилы + PE</name>

View File

@ -1,4 +1,4 @@
<definition type="element" height="10" link_type="simple" version="0.60" hotspot_x="73" hotspot_y="5" orientation="dyyy" width="150">
<definition type="element" height="10" link_type="simple" version="0.60" hotspot_x="73" hotspot_y="5" width="150">
<uuid uuid="{d1007c67-032b-4925-8560-aac9e547d6ae}"/>
<names>
<name lang="ru">Кабель 6 жилы + PE</name>

View File

@ -1,4 +1,4 @@
<definition width="30" link_type="simple" version="0.5" hotspot_x="14" orientation="dyyy" height="20" hotspot_y="4" type="element">
<definition width="30" link_type="simple" version="0.5" hotspot_x="14" height="20" hotspot_y="4" type="element">
<uuid uuid="{a0e9e33a-ee38-4c08-8f40-c307da8d822b}"/>
<names>
<name lang="el">Διατομή αγωγού</name>

View File

@ -11,5 +11,6 @@
<name lang="nl">Kabels en draden</name>
<name lang="cs">Kabely a drátové propojení</name>
<name lang="da">Kabler og ledninger</name>
<name lang="ja">ケーブルと配線</name>
</names>
</qet-directory>

View File

@ -1,4 +1,4 @@
<definition width="30" link_type="simple" version="0.5" hotspot_x="15" orientation="dyyy" height="10" hotspot_y="5" type="element">
<definition width="30" link_type="simple" version="0.5" hotspot_x="15" height="10" hotspot_y="5" type="element">
<uuid uuid="{b96a76a6-a798-497b-a044-dd933756d175}"/>
<names>
<name lang="de">Verdrahtungsdefinition 1 Leiter</name>

View File

@ -1,4 +1,4 @@
<definition width="70" link_type="simple" version="0.5" hotspot_x="16" orientation="dyyy" height="10" hotspot_y="5" type="element">
<definition width="70" link_type="simple" version="0.5" hotspot_x="16" height="10" hotspot_y="5" type="element">
<uuid uuid="{448ac784-f459-4f8f-bd3f-d911802b3369}"/>
<names>
<name lang="de">Verdrahtungsdefinition 2 Leiter</name>

View File

@ -1,4 +1,4 @@
<definition width="40" link_type="simple" version="0.5" hotspot_x="14" orientation="dyyy" height="10" hotspot_y="5" type="element">
<definition width="40" link_type="simple" version="0.5" hotspot_x="14" height="10" hotspot_y="5" type="element">
<uuid uuid="{c94d9e16-e3bb-4117-b037-466a15edcb14}"/>
<names>
<name lang="de">Verdrahtungsdefinition 2 Leiter</name>

View File

@ -1,4 +1,4 @@
<definition width="70" link_type="simple" version="0.5" hotspot_x="16" orientation="dyyy" height="10" hotspot_y="5" type="element">
<definition width="70" link_type="simple" version="0.5" hotspot_x="16" height="10" hotspot_y="5" type="element">
<uuid uuid="{9d939952-9c2b-4b12-898f-262abc91e845}"/>
<names>
<name lang="de">Verdrahtungsdefinition 3 Leiter</name>

View File

@ -1,4 +1,4 @@
<definition height="80" hotspot_y="39" hotspot_x="17" version="0.5" orientation="dyyy" width="40" link_type="simple" type="element">
<definition height="80" hotspot_y="39" hotspot_x="17" version="0.5" width="40" link_type="simple" type="element">
<uuid uuid="{9d2d8902-b36a-4974-b46d-4de6741f6b9b}"/>
<names>
<name lang="en">Terminal strip label</name>

View File

@ -1,4 +1,4 @@
<definition height="90" hotspot_y="44" hotspot_x="15" version="0.5" orientation="dyyy" width="30" link_type="simple" type="element">
<definition height="90" hotspot_y="44" hotspot_x="15" version="0.5" width="30" link_type="simple" type="element">
<uuid uuid="{2d155649-d0f5-419b-b94a-a13d3fcf38c7}"/>
<names>
<name lang="fr">Borne (continuité)</name>

View File

@ -1,4 +1,4 @@
<definition height="90" hotspot_y="44" hotspot_x="15" version="0.5" orientation="dyyy" width="30" link_type="simple" type="element">
<definition height="90" hotspot_y="44" hotspot_x="15" version="0.5" width="30" link_type="simple" type="element">
<uuid uuid="{da19301b-f6e7-478f-a6dd-eb72e497883b}"/>
<names>
<name lang="fr">Borne (terre)</name>

View File

@ -1,4 +1,4 @@
<definition orientation="dyyy" version="0.51" width="110" height="20" type="element" hotspot_x="55" link_type="simple" hotspot_y="13">
<definition version="0.51" width="110" height="20" type="element" hotspot_x="55" link_type="simple" hotspot_y="13">
<uuid uuid="{17db296d-b50e-47ea-9125-aa9c1837b523}"/>
<names>
<name lang="fr">Interruption bornier</name>

View File

@ -1,4 +1,4 @@
<definition orientation="dyyy" version="0.51" width="50" height="110" type="element" hotspot_x="15" link_type="simple" hotspot_y="54">
<definition version="0.51" width="50" height="110" type="element" hotspot_x="15" link_type="simple" hotspot_y="54">
<uuid uuid="{387b403b-d81d-45ca-957d-e9014fe009a7}"/>
<names>
<name lang="fr">Borne double-étage (continuité)</name>

View File

@ -1,4 +1,4 @@
<definition height="10" hotspot_y="5" hotspot_x="5" version="0.5" orientation="dyyy" width="30" link_type="simple" type="element">
<definition height="10" hotspot_y="5" hotspot_x="5" version="0.5" width="30" link_type="simple" type="element">
<uuid uuid="{9a3ee0a0-5a0e-4f0c-93dd-396ddc3d7f11}"/>
<names>
<name lang="de">Einlegebrücke</name>

View File

@ -1,4 +1,4 @@
<definition orientation="dyyy" version="0.51" width="50" height="10" type="element" hotspot_x="5" link_type="simple" hotspot_y="5">
<definition version="0.51" width="50" height="10" type="element" hotspot_x="5" link_type="simple" hotspot_y="5">
<uuid uuid="{5075e5fb-c219-4643-89b8-8096d090ff3d}"/>
<names>
<name lang="en">Insertion bridge (double width)</name>

View File

@ -1,4 +1,4 @@
<definition height="90" hotspot_y="44" hotspot_x="15" version="0.5" orientation="dyyy" width="510" link_type="simple" type="element">
<definition height="90" hotspot_y="44" hotspot_x="15" version="0.5" width="510" link_type="simple" type="element">
<uuid uuid="{c17e98a3-738f-4c7a-ac89-91bb4c08fb45}"/>
<names>
<name lang="fr">Connecteur 25 fiches</name>

View File

@ -1,4 +1,4 @@
<definition height="80" hotspot_y="67" hotspot_x="15" version="0.5" orientation="dyyy" width="30" link_type="simple" type="element">
<definition height="80" hotspot_y="67" hotspot_x="15" version="0.5" width="30" link_type="simple" type="element">
<uuid uuid="{116e1210-b7f9-4737-a94f-1034ecb45cc4}"/>
<names>
<name lang="fr">Appareil (connexion en bas)</name>

View File

@ -1,4 +1,4 @@
<definition height="80" hotspot_y="13" hotspot_x="15" version="0.5" orientation="dyyy" width="30" link_type="simple" type="element">
<definition height="80" hotspot_y="13" hotspot_x="15" version="0.5" width="30" link_type="simple" type="element">
<uuid uuid="{e396fc1b-28d7-4978-879a-9b666a2648d3}"/>
<names>
<name lang="fr">Appareil (connexion en bas)</name>

View File

@ -1,4 +1,4 @@
<definition orientation="dyyy" version="0.51" width="30" height="80" type="element" hotspot_x="15" link_type="simple" hotspot_y="67">
<definition version="0.51" width="30" height="80" type="element" hotspot_x="15" link_type="simple" hotspot_y="67">
<uuid uuid="{bf7c6c86-5f96-4644-9f0f-004abccc79ad}"/>
<names>
<name lang="fr">Appareil (connexion en bas) - début</name>

View File

@ -1,4 +1,4 @@
<definition orientation="dyyy" version="0.51" width="30" height="80" type="element" hotspot_x="15" link_type="simple" hotspot_y="67">
<definition version="0.51" width="30" height="80" type="element" hotspot_x="15" link_type="simple" hotspot_y="67">
<uuid uuid="{57a6e367-5c77-4d2b-bb60-0ca0651bdd31}"/>
<names>
<name lang="fr">Appareil (connexion en bas) - milieu</name>

View File

@ -1,4 +1,4 @@
<definition orientation="dyyy" version="0.51" width="30" height="80" type="element" hotspot_x="15" link_type="simple" hotspot_y="67">
<definition version="0.51" width="30" height="80" type="element" hotspot_x="15" link_type="simple" hotspot_y="67">
<uuid uuid="{d5016921-dc3b-4078-b45d-1cfe04796e14}"/>
<names>
<name lang="fr">Appareil (connexion en bas) - fin</name>

View File

@ -1,4 +1,4 @@
<definition orientation="dyyy" version="0.51" width="30" height="80" type="element" hotspot_x="15" link_type="simple" hotspot_y="13">
<definition version="0.51" width="30" height="80" type="element" hotspot_x="15" link_type="simple" hotspot_y="13">
<uuid uuid="{dfdbecfd-e99b-4f8f-ae0d-038e657bae8d}"/>
<names>
<name lang="fr">Appareil (connexion en haut)</name>

View File

@ -1,4 +1,4 @@
<definition orientation="dyyy" version="0.51" width="30" height="80" type="element" hotspot_x="15" link_type="simple" hotspot_y="13">
<definition version="0.51" width="30" height="80" type="element" hotspot_x="15" link_type="simple" hotspot_y="13">
<uuid uuid="{6a07de91-ed73-49b3-b01b-0b49a450697a}"/>
<names>
<name lang="fr">Appareil (connexion en haut) - début</name>

View File

@ -1,4 +1,4 @@
<definition orientation="dyyy" version="0.51" width="30" height="80" type="element" hotspot_x="15" link_type="simple" hotspot_y="13">
<definition version="0.51" width="30" height="80" type="element" hotspot_x="15" link_type="simple" hotspot_y="13">
<uuid uuid="{b153ee35-af29-4798-9252-577a6ed2737a}"/>
<names>
<name lang="fr">Appareil (connexion en haut) - milieu</name>

View File

@ -1,4 +1,4 @@
<definition orientation="dyyy" version="0.51" width="30" height="80" type="element" hotspot_x="15" link_type="simple" hotspot_y="13">
<definition version="0.51" width="30" height="80" type="element" hotspot_x="15" link_type="simple" hotspot_y="13">
<uuid uuid="{4aea9d8c-0dc6-4be7-b988-7ee87ae439fc}"/>
<names>
<name lang="fr">Appareil (connexion en haut) - fin</name>

View File

@ -1,4 +1,4 @@
<definition height="70" hotspot_y="34" hotspot_x="4" version="0.5" orientation="dyyy" width="10" link_type="simple" type="element">
<definition height="70" hotspot_y="34" hotspot_x="4" version="0.5" width="10" link_type="simple" type="element">
<uuid uuid="{2ac227dc-33a0-49f5-b8a0-b834d9386b60}"/>
<names>
<name lang="de">Kabel Bezeichnungsschild</name>

View File

@ -1,4 +1,4 @@
<definition height="20" hotspot_y="12" hotspot_x="4" version="0.5" orientation="dyyy" width="30" link_type="simple" type="element">
<definition height="20" hotspot_y="12" hotspot_x="4" version="0.5" width="30" link_type="simple" type="element">
<uuid uuid="{ce9e32d1-edd6-4bf2-a6f4-a519b878d80d}"/>
<names>
<name lang="de">Kabel Ader nach oben</name>

View File

@ -1,4 +1,4 @@
<definition height="20" hotspot_y="6" hotspot_x="4" version="0.5" orientation="dyyy" width="30" link_type="simple" type="element">
<definition height="20" hotspot_y="6" hotspot_x="4" version="0.5" width="30" link_type="simple" type="element">
<uuid uuid="{2935f975-67f8-4e41-ad18-7fbb24e67465}"/>
<names>
<name lang="de">Kabel Ader nach unten</name>

View File

@ -1,4 +1,4 @@
<definition orientation="dyyy" version="0.51" width="130" height="20" type="element" hotspot_x="15" link_type="simple" hotspot_y="12">
<definition version="0.51" width="130" height="20" type="element" hotspot_x="15" link_type="simple" hotspot_y="12">
<uuid uuid="{079ef7df-a292-4e16-a6a2-dd813f7f1e41}"/>
<names>
<name lang="de">Verdrahtungsdefinition</name>

View File

@ -1,4 +1,4 @@
<definition version="0.80" link_type="simple" hotspot_y="13" type="element" height="250" hotspot_x="15" width="30" orientation="dyyy">
<definition version="0.80" link_type="simple" hotspot_y="13" type="element" height="250" hotspot_x="15" width="30">
<uuid uuid="{bb4c314c-2020-4c8a-b465-632eb562e1f7}"/>
<names>
<name lang="fr">Cable</name>

View File

@ -1,4 +1,4 @@
<definition width="50" link_type="simple" version="0.5" hotspot_x="20" orientation="dyyy" height="30" hotspot_y="4" type="element">
<definition width="50" link_type="simple" version="0.5" hotspot_x="20" height="30" hotspot_y="4" type="element">
<uuid uuid="{5953974b-d91b-4358-b6e6-7ab44e9c46ca}"/>
<names>
<name lang="es">Distribuidor</name>

View File

@ -1,4 +1,4 @@
<definition width="290" version="0.4" hotspot_x="21" hotspot_y="32" height="520" link_type="simple" type="element" orientation="dyyy">
<definition width="290" version="0.4" hotspot_x="21" hotspot_y="32" height="520" link_type="simple" type="element">
<uuid uuid="{4703BDD4-D90B-4E3F-AF60-679EB66DD5E4}"/><names>
<name lang="en">Terminal 12G1</name>
<name lang="es">Clema 12G1</name>

View File

@ -1,4 +1,4 @@
<definition width="430" version="0.4" hotspot_x="19" hotspot_y="32" height="520" link_type="simple" type="element" orientation="dyyy">
<definition width="430" version="0.4" hotspot_x="19" hotspot_y="32" height="520" link_type="simple" type="element">
<uuid uuid="{A8C79B55-90AC-4F98-81C2-3A20BDBC7B5E}"/><names>
<name lang="en">Terminal_19G1</name>
<name lang="es">Clema 19G1</name>

View File

@ -1,4 +1,4 @@
<definition width="100" version="0.4" hotspot_x="24" hotspot_y="29" height="520" link_type="simple" type="element" orientation="dyyy">
<definition width="100" version="0.4" hotspot_x="24" hotspot_y="29" height="520" link_type="simple" type="element">
<uuid uuid="{DF43B4E0-C908-420E-B61B-B0C0E12EF629}"/><names>
<name lang="en">Terminal_3G1</name>
<name lang="es">Clema 3G1</name>

View File

@ -1,4 +1,4 @@
<definition width="120" version="0.4" hotspot_x="24" hotspot_y="32" height="520" link_type="simple" type="element" orientation="dyyy">
<definition width="120" version="0.4" hotspot_x="24" hotspot_y="32" height="520" link_type="simple" type="element">
<uuid uuid="{DE548E2C-13F5-4269-BA5A-B16C2909B3C5}"/><names>
<name lang="en">Terminal_4G1</name>
<name lang="es">Clema 4G1</name>

View File

@ -1,4 +1,4 @@
<definition width="140" version="0.4" hotspot_x="20" hotspot_y="32" height="520" link_type="simple" type="element" orientation="dyyy">
<definition width="140" version="0.4" hotspot_x="20" hotspot_y="32" height="520" link_type="simple" type="element">
<uuid uuid="{BF950FAB-A8D9-40E4-B239-0C3413B2BFD4}"/><names>
<name lang="en">Terminal_5G1</name>
<name lang="es">Clema 5G1</name>

View File

@ -1,4 +1,4 @@
<definition width="180" version="0.4" hotspot_x="18" hotspot_y="32" height="520" link_type="simple" type="element" orientation="dyyy">
<definition width="180" version="0.4" hotspot_x="18" hotspot_y="32" height="520" link_type="simple" type="element">
<uuid uuid="{DC3C9BE3-B4C2-431A-85CA-40244D09AA67}"/><names>
<name lang="en">Terminal_7G1</name>
<name lang="es">Clema 7G1</name>

View File

@ -1,4 +1,4 @@
<definition width="20" link_type="simple" version="0.5" hotspot_x="10" orientation="dyyy" height="60" hotspot_y="29" type="element">
<definition width="20" link_type="simple" version="0.5" hotspot_x="10" height="60" hotspot_y="29" type="element">
<uuid uuid="{e1463f74-cad0-4ef6-a1f4-beedd55b7d41}"/>
<names>
<name lang="el">Μπάρα γείωσης</name>

View File

@ -1,4 +1,4 @@
<definition width="20" link_type="simple" version="0.5" hotspot_x="10" orientation="dyyy" height="80" hotspot_y="39" type="element">
<definition width="20" link_type="simple" version="0.5" hotspot_x="10" height="80" hotspot_y="39" type="element">
<uuid uuid="{7ae24759-36ff-414f-bf1f-3a9861e75f73}"/>
<names>
<name lang="es">Barra de interconexión TN</name>

View File

@ -1,4 +1,4 @@
<definition width="10" version="0.3" hotspot_x="5" hotspot_y="0" height="40" type="element" orientation="dyyy">
<definition width="10" version="0.3" hotspot_x="5" hotspot_y="0" height="40" type="element">
<uuid uuid="{7499D25C-957E-43F1-8AFE-7E5D0EAE1C89}"/><names>
<name lang="ar">شريط ربط, مُغلق</name>
<name lang="de">Trennklemme, Lasche geschlossen</name>

View File

@ -1,4 +1,4 @@
<definition width="20" version="0.4" hotspot_x="5" hotspot_y="15" height="30" link_type="terminal" type="element" ic="true" orientation="dyyy">
<definition width="20" version="0.4" hotspot_x="5" hotspot_y="15" height="30" link_type="terminal" type="element" ic="true">
<uuid uuid="{E45A9DD3-1458-47FC-A4DB-287174EB65FD}"/><names>
<name lang="ar">طرف توصيل</name>
<name lang="de">Klemme</name>

View File

@ -1,4 +1,4 @@
<definition width="30" hotspot_y="14" height="30" hotspot_x="11" version="0.51" orientation="dyyy" link_type="terminal" type="element">
<definition width="30" hotspot_y="14" height="30" hotspot_x="11" version="0.51" link_type="terminal" type="element">
<uuid uuid="{679c3cc2-61ad-4769-a835-2afc94bc536d}"/>
<names>
<name lang="ar">طرف توصيل</name>

View File

@ -1,4 +1,4 @@
<definition width="20" version="0.4" hotspot_x="15" hotspot_y="15" height="20" link_type="terminal" type="element" ic="true" orientation="dyyy">
<definition width="20" version="0.4" hotspot_x="15" hotspot_y="15" height="20" link_type="terminal" type="element" ic="true">
<uuid uuid="{70DF1247-B36D-4B2B-B44E-64EDFF85C45B}"/><names>
<name lang="ar">طرف توصيل</name>
<name lang="de">Klemme</name>

View File

@ -1,4 +1,4 @@
<definition width="20" hotspot_y="14" height="20" hotspot_x="14" version="0.51" orientation="dyyy" link_type="terminal" type="element">
<definition width="20" hotspot_y="14" height="20" hotspot_x="14" version="0.51" link_type="terminal" type="element">
<uuid uuid="{2ed786aa-0583-4058-aad6-af7eb76fad47}"/>
<names>
<name lang="ar">طرف توصيل</name>

View File

@ -1,4 +1,4 @@
<definition width="30" version="0.4" hotspot_x="15" hotspot_y="15" height="30" link_type="terminal" type="element" ic="true" orientation="dyyy">
<definition width="30" version="0.4" hotspot_x="15" hotspot_y="15" height="30" link_type="terminal" type="element" ic="true">
<uuid uuid="{8047131B-B73F-4FFD-95B5-21A2974006C1}"/><names>
<name lang="ar">طرف توصيل</name>
<name lang="de">Klemme</name>

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