From 4ca0bbf6822a7dd8b5399b8edac3af1f571bbc58 Mon Sep 17 00:00:00 2001 From: joshua Date: Thu, 7 Nov 2024 18:48:53 +0100 Subject: [PATCH 01/65] Minor Add more help line for the preview of terminal strip configurator --- .../GraphicsItem/terminalstripdrawer.cpp | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/sources/TerminalStrip/GraphicsItem/terminalstripdrawer.cpp b/sources/TerminalStrip/GraphicsItem/terminalstripdrawer.cpp index fcb2e78a4..57db4b70f 100644 --- a/sources/TerminalStrip/GraphicsItem/terminalstripdrawer.cpp +++ b/sources/TerminalStrip/GraphicsItem/terminalstripdrawer.cpp @@ -64,6 +64,8 @@ void TerminalStripDrawer::paint(QPainter *painter) painter->save(); painter->setPen(Qt::blue); painter->drawRect(boundingRect()); + painter->drawLine(QPointF{boundingRect().left(), boundingRect().center().y()}, + QPointF{boundingRect().right(), boundingRect().center().y()}); painter->restore(); } @@ -145,6 +147,15 @@ void TerminalStripDrawer::paint(QPainter *painter) painter->restore(); } + if(m_preview_draw) + { + painter->save(); + painter->setPen(Qt::yellow); + painter->drawLine(QPoint{terminal_rect.x(), terminal_rect.y() + terminal_rect.height()/2}, + QPoint{terminal_rect.width(), terminal_rect.y() + terminal_rect.height()/2}); + painter->restore(); + } + //Draw text painter->save(); if (terminals_text_orientation[index_] == Qt::Horizontal) From ae5e1888660f42a9a3e5f5141b3f8cdf3068db06 Mon Sep 17 00:00:00 2001 From: joshua Date: Wed, 12 Mar 2025 19:14:45 +0100 Subject: [PATCH 02/65] Add converter for dpi to pixel font size Add a little function used to convert if needed the size of a font set in dpi to pixel. Because the conversion from pdi to pixel can't be exactly identical, the text size in the diagram can be a little different, in the other side the switch between screens with different dpi is no more a problem. --- sources/utils/qetutils.cpp | 18 ++++++++++++++++++ sources/utils/qetutils.h | 1 + 2 files changed, 19 insertions(+) diff --git a/sources/utils/qetutils.cpp b/sources/utils/qetutils.cpp index 6d8ce1d68..5fbe9a730 100644 --- a/sources/utils/qetutils.cpp +++ b/sources/utils/qetutils.cpp @@ -132,3 +132,21 @@ bool QETUtils::sortBeginIntString(const QString &str_a, const QString &str_b) return str_a -1) { + return; + } + + auto px = font.pointSizeF()/72 * QFontMetrics{font}.fontDpi(); + font.setPixelSize(qRound(px)); +} diff --git a/sources/utils/qetutils.h b/sources/utils/qetutils.h index 61864c56f..60cbe0f45 100644 --- a/sources/utils/qetutils.h +++ b/sources/utils/qetutils.h @@ -31,6 +31,7 @@ namespace QETUtils QString marginsToString(const QMargins &margins); QMargins marginsFromString(const QString &string); qreal graphicsHandlerSize(QGraphicsItem *item); + void pixelSizedFont (QFont &font); bool sortBeginIntString(const QString &str_a, const QString &str_b); From 7747223dfae7c54c956bacdd0fa4337101925fb8 Mon Sep 17 00:00:00 2001 From: joshua Date: Wed, 12 Mar 2025 19:22:30 +0100 Subject: [PATCH 03/65] Terminal strip item font is editable The font used in the terminal strip item can be edited trough the terminal strip layout editor widget --- .../properties/terminalstriplayoutpattern.cpp | 11 + .../properties/terminalstriplayoutpattern.h | 8 +- .../GraphicsItem/terminalstripdrawer.cpp | 2 + .../ui/terminalstriplayouteditor.cpp | 14 +- .../ui/terminalstriplayouteditor.h | 1 - .../ui/terminalstriplayouteditor.ui | 541 ++++++++++-------- 6 files changed, 345 insertions(+), 232 deletions(-) diff --git a/sources/TerminalStrip/GraphicsItem/properties/terminalstriplayoutpattern.cpp b/sources/TerminalStrip/GraphicsItem/properties/terminalstriplayoutpattern.cpp index f0b8801c9..19f0bfc4c 100644 --- a/sources/TerminalStrip/GraphicsItem/properties/terminalstriplayoutpattern.cpp +++ b/sources/TerminalStrip/GraphicsItem/properties/terminalstriplayoutpattern.cpp @@ -16,10 +16,12 @@ along with QElectroTech. If not, see . */ #include "terminalstriplayoutpattern.h" +#include "../../../utils/qetutils.h" #include TerminalStripLayoutPattern::TerminalStripLayoutPattern() { + m_font.setPixelSize(15); updateHeaderTextOption(); updateTerminalsTextOption(); } @@ -39,6 +41,15 @@ QTextOption TerminalStripLayoutPattern::headerTextOption() const { return m_header_text_option; } +QFont TerminalStripLayoutPattern::font() const { + return m_font; +} + +void TerminalStripLayoutPattern::setFont(const QFont &font) { + m_font = font; + QETUtils::pixelSizedFont(m_font); +} + void TerminalStripLayoutPattern::setTerminalsTextAlignment(const QVector &alignment) { m_terminals_text_alignment = alignment; diff --git a/sources/TerminalStrip/GraphicsItem/properties/terminalstriplayoutpattern.h b/sources/TerminalStrip/GraphicsItem/properties/terminalstriplayoutpattern.h index ac8aac7e1..96ebaeb14 100644 --- a/sources/TerminalStrip/GraphicsItem/properties/terminalstriplayoutpattern.h +++ b/sources/TerminalStrip/GraphicsItem/properties/terminalstriplayoutpattern.h @@ -18,6 +18,7 @@ #ifndef TERMINALSTRIPLAYOUTPATTERN_H #define TERMINALSTRIPLAYOUTPATTERN_H +#include #include #include #include @@ -52,6 +53,10 @@ class TerminalStripLayoutPattern //Spacer between the header and the terminals QRect m_spacer_rect{0, 50, 10, 90}; + //Font + QFont font() const; + void setFont (const QFont &font); + //Terminals QVector m_terminal_rect { @@ -90,7 +95,8 @@ class TerminalStripLayoutPattern void updateHeaderTextOption(); void updateTerminalsTextOption(); - private: + private: + QFont m_font; Qt::Alignment m_header_text_alignment{Qt::AlignCenter}; QTextOption m_header_text_option; diff --git a/sources/TerminalStrip/GraphicsItem/terminalstripdrawer.cpp b/sources/TerminalStrip/GraphicsItem/terminalstripdrawer.cpp index 57db4b70f..b0f16493f 100644 --- a/sources/TerminalStrip/GraphicsItem/terminalstripdrawer.cpp +++ b/sources/TerminalStrip/GraphicsItem/terminalstripdrawer.cpp @@ -56,6 +56,8 @@ void TerminalStripDrawer::paint(QPainter *painter) auto brush_ = painter->brush(); brush_.setColor(Qt::white); + painter->setFont(m_pattern->font()); + painter->setPen(pen_); painter->setBrush(brush_); diff --git a/sources/TerminalStrip/ui/terminalstriplayouteditor.cpp b/sources/TerminalStrip/ui/terminalstriplayouteditor.cpp index 11e0b239f..630d672fc 100644 --- a/sources/TerminalStrip/ui/terminalstriplayouteditor.cpp +++ b/sources/TerminalStrip/ui/terminalstriplayouteditor.cpp @@ -15,9 +15,12 @@ You should have received a copy of the GNU General Public License along with QElectroTech. If not, see . */ +#include + #include "terminalstriplayouteditor.h" #include "ui_terminalstriplayouteditor.h" #include "../GraphicsItem/properties/terminalstriplayoutpattern.h" +#include "../../utils/qetutils.h" TerminalStripLayoutEditor::TerminalStripLayoutEditor(QSharedPointer layout, QWidget *parent) : @@ -54,8 +57,6 @@ void TerminalStripLayoutEditor::valueEdited() return; } - //auto *data_ = m_layout.data(); - m_layout.data()->m_header_rect.setRect(0, ui->m_y_header_sb->value(), ui->m_width_header_sb->value(), @@ -91,6 +92,10 @@ void TerminalStripLayoutEditor::valueEdited() m_layout.data()->m_bridge_point_y_offset[2] = ui->m_bridge_point_2_sb->value(); m_layout.data()->m_bridge_point_y_offset[3] = ui->m_bridge_point_3_sb->value(); + auto font_ = ui->m_font_cb->currentFont(); + font_.setPixelSize(ui->m_font_size_sb->value()); + m_layout->setFont(font_); + m_layout.data()->m_header_text_orientation = ui->m_header_text_orientation_cb->currentIndex() == 0 ? Qt::Horizontal : Qt::Vertical; @@ -180,6 +185,10 @@ void TerminalStripLayoutEditor::updateUi() ui->m_bridge_point_2_sb->setValue(bridge_point[2]); ui->m_bridge_point_3_sb->setValue(bridge_point[3]); + const auto font = m_layout->font(); + ui->m_font_size_sb->setValue(font.pixelSize()); + ui->m_font_cb->setCurrentFont(font); + if (data->m_header_text_orientation == Qt::Horizontal) { ui->m_header_text_orientation_cb->setCurrentIndex(0); } else { @@ -225,4 +234,3 @@ void TerminalStripLayoutEditor::on_m_display_preview_help_clicked(bool checked) m_preview_strip_item.m_drawer.setPreviewDraw(checked); m_preview_strip_item.update(); } - diff --git a/sources/TerminalStrip/ui/terminalstriplayouteditor.h b/sources/TerminalStrip/ui/terminalstriplayouteditor.h index d4daea579..ec048ca23 100644 --- a/sources/TerminalStrip/ui/terminalstriplayouteditor.h +++ b/sources/TerminalStrip/ui/terminalstriplayouteditor.h @@ -76,7 +76,6 @@ class TerminalStripLayoutEditor : public QWidget private slots: void valueEdited(); - void on_m_display_preview_help_clicked(bool checked); private: diff --git a/sources/TerminalStrip/ui/terminalstriplayouteditor.ui b/sources/TerminalStrip/ui/terminalstriplayouteditor.ui index eca92386e..1d5b73ba6 100644 --- a/sources/TerminalStrip/ui/terminalstriplayouteditor.ui +++ b/sources/TerminalStrip/ui/terminalstriplayouteditor.ui @@ -6,8 +6,8 @@ 0 0 - 767 - 544 + 892 + 555 @@ -15,57 +15,26 @@ - QLayout::SetMaximumSize + QLayout::SizeConstraint::SetMaximumSize - - - - Borne niveau 0 : + + + + 1000 - - - - En tête : + + + + 1000 - Qt::Horizontal - - - - - - - - - - Point de pont - - - - - - - 1000 - - - - - - - Qt::Horizontal - - - - - - - 1000 + Qt::Orientation::Horizontal @@ -76,15 +45,43 @@ - - - - Afficher l'aide + + + + 1000 - - + + + + 1000 + + + + + + + Borne niveau 0 : + + + + + + + 1000 + + + + + + + 1000 + + + + + 1000 @@ -97,22 +94,39 @@ - - + + + + + 1000 - - + + - Largeur + Borne niveau 3 : - - + + + + Borne niveau 2 : + + + + + + + 1000 + + + + + 1000 @@ -125,17 +139,45 @@ - - + + - Hauteur + Afficher l'aide - - + + - Prévisualisation : + Largeur + + + + + + + 1000 + + + + + + + Espace : + + + + + + + Qt::Orientation::Horizontal + + + + + + + 1000 @@ -146,35 +188,14 @@ - - - - 1000 + + + + Borne niveau 1 : - - - - 1000 - - - - - - - 1000 - - - - - - - 1000 - - - - + @@ -189,26 +210,56 @@ 0 - - + + - Gauche + Horizontal - Centre - - - - - Droite + Vertical - + + + + Orientation du texte d'en tête : + + + + + + + + Horizontal + + + + + Vertical + + + + + + + + Alignement du texte d'en tête : + + + + + + + Orientation du texte de borne : + + + + @@ -227,65 +278,111 @@ - - - - Alignement du texte d'en tête : - + + + + + Gauche + + + + + Centre + + + + + Droite + + - + Alignement du texte de borne : - - - - - Horizontal + + + + + 0 - - - - Vertical + + 0 - - - - - - - - Horizontal + + 0 - - - - Vertical + + 0 - - - - - - - Orientation du texte de borne : - - - - - - - Orientation du texte d'en tête : - + + + + Police : + + + + + + + + + + Taille : + + + + + + + 1 + + + + + + + Qt::Orientation::Horizontal + + + + 40 + 20 + + + + + + + + + 1000 + + + + + + + 1000 + + + + + + + En tête : + + + @@ -293,34 +390,6 @@ - - - - Borne niveau 2 : - - - - - - - 1000 - - - - - - - Espace : - - - - - - - 1000 - - - @@ -328,66 +397,52 @@ - - - - 1000 - - - - - - - 1000 - - - - - - - 1000 - - - - - - - 1000 - - - - - - - 1000 - - - - - - - Borne niveau 3 : - - - - - - - 1000 - - - - - - - Borne niveau 1 : - - - - - + + - Qt::Horizontal + Qt::Orientation::Horizontal + + + + + + + 1000 + + + + + + + 1000 + + + + + + + Hauteur + + + + + + + Point de pont + + + + + + + 1000 + + + + + + + Prévisualisation : @@ -811,6 +866,38 @@ + + m_font_cb + currentFontChanged(QFont) + TerminalStripLayoutEditor + valueEdited() + + + 245 + 276 + + + 445 + 277 + + + + + m_font_size_sb + valueChanged(int) + TerminalStripLayoutEditor + valueEdited() + + + 507 + 277 + + + 445 + 277 + + + valueEdited() From 2d89d70682cb82b99513579f4663700d560d32d5 Mon Sep 17 00:00:00 2001 From: joshua Date: Wed, 12 Mar 2025 21:10:16 +0100 Subject: [PATCH 04/65] Add possibility to adjust terminal text position The bounding rectangle used to define the position of the terminal text can be edited. The y position and height can now be edited. The width is not editable because is always the width of the rectangle of the of the terminal. --- .../properties/terminalstriplayoutpattern.h | 11 +- .../GraphicsItem/terminalstripdrawer.cpp | 15 +- .../ui/terminalstriplayouteditor.cpp | 7 +- .../ui/terminalstriplayouteditor.ui | 164 ++++++++++++------ 4 files changed, 128 insertions(+), 69 deletions(-) diff --git a/sources/TerminalStrip/GraphicsItem/properties/terminalstriplayoutpattern.h b/sources/TerminalStrip/GraphicsItem/properties/terminalstriplayoutpattern.h index 96ebaeb14..bba900d09 100644 --- a/sources/TerminalStrip/GraphicsItem/properties/terminalstriplayoutpattern.h +++ b/sources/TerminalStrip/GraphicsItem/properties/terminalstriplayoutpattern.h @@ -68,15 +68,10 @@ class TerminalStripLayoutPattern void setTerminalsTextAlignment(const QVector &alignment); QVector terminalsTextAlignment() const; - QVector terminalsTextOption() const; + QVector terminalsTextOption() const; + int m_terminals_text_height{50}; + int m_terminals_text_y{35}; - QVector m_terminals_text_rect - { - QRect{0,35,20,50}, - QRect{0,35,20,50}, - QRect{0,35,20,50}, - QRect{0,35,20,50} - }; QVector m_terminals_text_orientation { Qt::Vertical, diff --git a/sources/TerminalStrip/GraphicsItem/terminalstripdrawer.cpp b/sources/TerminalStrip/GraphicsItem/terminalstripdrawer.cpp index b0f16493f..522073437 100644 --- a/sources/TerminalStrip/GraphicsItem/terminalstripdrawer.cpp +++ b/sources/TerminalStrip/GraphicsItem/terminalstripdrawer.cpp @@ -105,9 +105,10 @@ void TerminalStripDrawer::paint(QPainter *painter) //Draw terminals - const auto terminals_text_rect{m_pattern->m_terminals_text_rect}; const auto terminals_text_orientation{m_pattern->m_terminals_text_orientation}; const auto terminals_text_option{m_pattern->terminalsTextOption()}; + const auto terminals_text_height{m_pattern->m_terminals_text_height}; + const auto terminals_text_y{m_pattern->m_terminals_text_y}; QRect terminal_rect; QHash> bridges_anchor_points; @@ -160,16 +161,12 @@ void TerminalStripDrawer::paint(QPainter *painter) //Draw text painter->save(); - if (terminals_text_orientation[index_] == Qt::Horizontal) + text_rect.setRect(0, terminals_text_y, terminal_rect.width(), terminals_text_height); + if (terminals_text_orientation[index_] == Qt::Vertical) { - text_rect = terminals_text_rect[index_]; - } - else - { - const auto rect_{terminals_text_rect[index_]}; - painter->translate(rect_.bottomLeft()); + painter->translate(text_rect.bottomLeft()); painter->rotate(270); - text_rect.setRect(0, 0, rect_.height(), terminal_rect.width()); + text_rect.setRect(0, 0, text_rect.height(), text_rect.width()); } const auto shared_real_terminal{real_terminal_vector[i]}; diff --git a/sources/TerminalStrip/ui/terminalstriplayouteditor.cpp b/sources/TerminalStrip/ui/terminalstriplayouteditor.cpp index 630d672fc..c630ed500 100644 --- a/sources/TerminalStrip/ui/terminalstriplayouteditor.cpp +++ b/sources/TerminalStrip/ui/terminalstriplayouteditor.cpp @@ -20,7 +20,6 @@ #include "terminalstriplayouteditor.h" #include "ui_terminalstriplayouteditor.h" #include "../GraphicsItem/properties/terminalstriplayoutpattern.h" -#include "../../utils/qetutils.h" TerminalStripLayoutEditor::TerminalStripLayoutEditor(QSharedPointer layout, QWidget *parent) : @@ -137,6 +136,9 @@ void TerminalStripLayoutEditor::valueEdited() break; } + m_layout.data()->m_terminals_text_y = ui->m_terminal_text_y_sb->value(); + m_layout.data()->m_terminals_text_height = ui->m_terminal_text_height_sb->value(); + updateUi(); m_preview_strip_item.update(); } @@ -219,6 +221,9 @@ void TerminalStripLayoutEditor::updateUi() ui->m_terminal_text_alignment_cb->setCurrentIndex(2); } + ui->m_terminal_text_y_sb->setValue(data->m_terminals_text_y); + ui->m_terminal_text_height_sb->setValue(data->m_terminals_text_height); + m_ui_updating = false; updatePreview(); } diff --git a/sources/TerminalStrip/ui/terminalstriplayouteditor.ui b/sources/TerminalStrip/ui/terminalstriplayouteditor.ui index 1d5b73ba6..f8f74789a 100644 --- a/sources/TerminalStrip/ui/terminalstriplayouteditor.ui +++ b/sources/TerminalStrip/ui/terminalstriplayouteditor.ui @@ -6,8 +6,8 @@ 0 0 - 892 - 555 + 683 + 589 @@ -144,6 +144,9 @@ Afficher l'aide + + false + @@ -210,7 +213,14 @@ 0 - + + + + Longueur maximal du texte de borne + + + + @@ -224,42 +234,7 @@ - - - - Orientation du texte d'en tête : - - - - - - - - Horizontal - - - - - Vertical - - - - - - - - Alignement du texte d'en tête : - - - - - - - Orientation du texte de borne : - - - - + @@ -278,29 +253,38 @@ - - + + - Gauche + Horizontal - Centre - - - - - Droite + Vertical - - + + - Alignement du texte de borne : + Orientation du texte d'en tête : + + + + + + + Alignement du texte d'en tête : + + + + + + + Origine vertical du texte de borne : @@ -359,6 +343,52 @@ + + + + + Gauche + + + + + Centre + + + + + Droite + + + + + + + + 30 + + + 1000 + + + + + + + Orientation du texte de borne : + + + + + + + + + + Alignement du texte de borne : + + + @@ -898,6 +928,38 @@ + + m_terminal_text_y_sb + valueChanged(int) + TerminalStripLayoutEditor + valueEdited() + + + 207 + 383 + + + 445 + 277 + + + + + m_terminal_text_height_sb + valueChanged(int) + TerminalStripLayoutEditor + valueEdited() + + + 430 + 383 + + + 445 + 277 + + + valueEdited() From 2c1b840f9c54eadf2cdb3f478e31c8cfe5bd998f Mon Sep 17 00:00:00 2001 From: joshua Date: Wed, 12 Mar 2025 21:48:18 +0100 Subject: [PATCH 05/65] Use same properties for every terminal level Initially it was planned to have separate text configuration for every terminal level. It's not useful, use same properties for every level is sufficient and visually more consistent. By consequent every QVector related to these properties was replaced by a single value. --- .../properties/terminalstriplayoutpattern.cpp | 20 +++--------- .../properties/terminalstriplayoutpattern.h | 32 ++++--------------- .../GraphicsItem/terminalstripdrawer.cpp | 4 +-- .../ui/terminalstriplayouteditor.cpp | 28 +++++----------- 4 files changed, 22 insertions(+), 62 deletions(-) diff --git a/sources/TerminalStrip/GraphicsItem/properties/terminalstriplayoutpattern.cpp b/sources/TerminalStrip/GraphicsItem/properties/terminalstriplayoutpattern.cpp index 19f0bfc4c..b6fba13e8 100644 --- a/sources/TerminalStrip/GraphicsItem/properties/terminalstriplayoutpattern.cpp +++ b/sources/TerminalStrip/GraphicsItem/properties/terminalstriplayoutpattern.cpp @@ -50,18 +50,18 @@ void TerminalStripLayoutPattern::setFont(const QFont &font) { QETUtils::pixelSizedFont(m_font); } -void TerminalStripLayoutPattern::setTerminalsTextAlignment(const QVector &alignment) +void TerminalStripLayoutPattern::setTerminalsTextAlignment(const Qt::Alignment &alignment) { m_terminals_text_alignment = alignment; updateTerminalsTextOption(); } -QVector TerminalStripLayoutPattern::terminalsTextAlignment() const +Qt::Alignment TerminalStripLayoutPattern::terminalsTextAlignment() const { return m_terminals_text_alignment; } -QVector TerminalStripLayoutPattern::terminalsTextOption() const +QTextOption TerminalStripLayoutPattern::terminalsTextOption() const { return m_terminals_text_option; } @@ -74,16 +74,6 @@ void TerminalStripLayoutPattern::updateHeaderTextOption() void TerminalStripLayoutPattern::updateTerminalsTextOption() { - if (m_terminals_text_option.size() == - m_terminals_text_alignment.size()) - { - for (auto i = 0 ; i &alignment); - QVector terminalsTextAlignment() const; - QVector terminalsTextOption() const; + //Terminal text + void setTerminalsTextAlignment(const Qt::Alignment &alignment); + Qt::Alignment terminalsTextAlignment() const; + QTextOption terminalsTextOption() const; int m_terminals_text_height{50}; int m_terminals_text_y{35}; - - QVector m_terminals_text_orientation - { - Qt::Vertical, - Qt::Vertical, - Qt::Vertical, - Qt::Vertical - }; + Qt::Orientation m_terminals_text_orientation {Qt::Vertical}; int m_bridge_point_d{5}; QVector m_bridge_point_y_offset{50,70,90,110}; @@ -95,20 +89,8 @@ class TerminalStripLayoutPattern Qt::Alignment m_header_text_alignment{Qt::AlignCenter}; QTextOption m_header_text_option; - QVector m_terminals_text_alignment - { - Qt::AlignRight | Qt::AlignVCenter, - Qt::AlignRight | Qt::AlignVCenter, - Qt::AlignRight | Qt::AlignVCenter, - Qt::AlignRight | Qt::AlignVCenter - }; - QVector m_terminals_text_option - { - QTextOption(), - QTextOption(), - QTextOption(), - QTextOption() - }; + Qt::Alignment m_terminals_text_alignment {Qt::AlignRight | Qt::AlignVCenter}; + QTextOption m_terminals_text_option{QTextOption()}; }; #endif // TERMINALSTRIPLAYOUTPATTERN_H diff --git a/sources/TerminalStrip/GraphicsItem/terminalstripdrawer.cpp b/sources/TerminalStrip/GraphicsItem/terminalstripdrawer.cpp index 522073437..256665305 100644 --- a/sources/TerminalStrip/GraphicsItem/terminalstripdrawer.cpp +++ b/sources/TerminalStrip/GraphicsItem/terminalstripdrawer.cpp @@ -162,7 +162,7 @@ void TerminalStripDrawer::paint(QPainter *painter) //Draw text painter->save(); text_rect.setRect(0, terminals_text_y, terminal_rect.width(), terminals_text_height); - if (terminals_text_orientation[index_] == Qt::Vertical) + if (terminals_text_orientation == Qt::Vertical) { painter->translate(text_rect.bottomLeft()); painter->rotate(270); @@ -172,7 +172,7 @@ void TerminalStripDrawer::paint(QPainter *painter) const auto shared_real_terminal{real_terminal_vector[i]}; painter->drawText(text_rect, shared_real_terminal ? shared_real_terminal->label() : QLatin1String(), - terminals_text_option[index_]); + terminals_text_option); if (m_preview_draw) { diff --git a/sources/TerminalStrip/ui/terminalstriplayouteditor.cpp b/sources/TerminalStrip/ui/terminalstriplayouteditor.cpp index c630ed500..b54164f94 100644 --- a/sources/TerminalStrip/ui/terminalstriplayouteditor.cpp +++ b/sources/TerminalStrip/ui/terminalstriplayouteditor.cpp @@ -108,31 +108,19 @@ void TerminalStripLayoutEditor::valueEdited() m_layout.data()->setHeaderTextAlignment(Qt::AlignRight | Qt::AlignVCenter); break; } - m_layout.data()->m_terminals_text_orientation[0] = ui->m_terminal_text_orientation_cb->currentIndex() == 0 ? - Qt::Horizontal : - Qt::Vertical; + m_layout.data()->m_terminals_text_orientation = ui->m_terminal_text_orientation_cb->currentIndex() == 0 ? + Qt::Horizontal : + Qt::Vertical; switch (ui->m_terminal_text_alignment_cb->currentIndex()) { case 0: - m_layout.data()->setTerminalsTextAlignment( - QVector { Qt::AlignLeft | Qt::AlignVCenter, - Qt::AlignLeft | Qt::AlignVCenter, - Qt::AlignLeft | Qt::AlignVCenter, - Qt::AlignLeft | Qt::AlignVCenter }); + m_layout.data()->setTerminalsTextAlignment(Qt::Alignment {Qt::AlignLeft | Qt::AlignVCenter}); break; case 1: - m_layout.data()->setTerminalsTextAlignment( - QVector { Qt::AlignHCenter | Qt::AlignVCenter, - Qt::AlignHCenter | Qt::AlignVCenter, - Qt::AlignHCenter | Qt::AlignVCenter, - Qt::AlignHCenter | Qt::AlignVCenter }); + m_layout.data()->setTerminalsTextAlignment(Qt::Alignment { Qt::AlignHCenter | Qt::AlignVCenter}); break; default: - m_layout.data()->setTerminalsTextAlignment( - QVector { Qt::AlignRight | Qt::AlignVCenter, - Qt::AlignRight | Qt::AlignVCenter, - Qt::AlignRight | Qt::AlignVCenter, - Qt::AlignRight | Qt::AlignVCenter }); + m_layout.data()->setTerminalsTextAlignment(Qt::Alignment { Qt::AlignRight | Qt::AlignVCenter}); break; } @@ -197,7 +185,7 @@ void TerminalStripLayoutEditor::updateUi() ui->m_header_text_orientation_cb->setCurrentIndex(1); } - if (data->m_terminals_text_orientation[0] == Qt::Horizontal) { + if (data->m_terminals_text_orientation == Qt::Horizontal) { ui->m_terminal_text_orientation_cb->setCurrentIndex(0); } else { ui->m_terminal_text_orientation_cb->setCurrentIndex(1); @@ -212,7 +200,7 @@ void TerminalStripLayoutEditor::updateUi() ui->m_header_text_alignment_cb->setCurrentIndex(2); } - const auto terminal_alignment = data->terminalsTextAlignment().at(0); + const auto terminal_alignment = data->terminalsTextAlignment(); if (terminal_alignment &Qt::AlignLeft) { ui->m_terminal_text_alignment_cb->setCurrentIndex(0); } else if (terminal_alignment &Qt::AlignHCenter) { From 95e401a2661da14581f76027a2cf78d7f2096c52 Mon Sep 17 00:00:00 2001 From: joshua Date: Thu, 5 Jun 2025 23:04:56 +0200 Subject: [PATCH 06/65] Class TerminalStripLayoutPattern can be save/load from xml Add a new class TerminalStripLayoutPatternXml used to save / load a TerminalStripLayoutPattern class into a xml. Also create the namespace QETSVG used to read/write some svg element / attribute to xml. This class is used by the class TerminalStripLayoutPatternXml. --- qelectrotech.pro | 6 +- .../properties/terminalstriplayoutpattern.cpp | 14 ++ sources/qetxml.cpp | 89 ++++++++ sources/qetxml.h | 6 + sources/svg/qetsvg.cpp | 151 ++++++++++++++ sources/svg/qetsvg.h | 51 +++++ sources/xml/terminalstriplayoutpatternxml.cpp | 191 ++++++++++++++++++ sources/xml/terminalstriplayoutpatternxml.h | 41 ++++ 8 files changed, 547 insertions(+), 2 deletions(-) create mode 100644 sources/svg/qetsvg.cpp create mode 100644 sources/svg/qetsvg.h create mode 100644 sources/xml/terminalstriplayoutpatternxml.cpp create mode 100644 sources/xml/terminalstriplayoutpatternxml.h diff --git a/qelectrotech.pro b/qelectrotech.pro index 5729674e9..badb86bdb 100644 --- a/qelectrotech.pro +++ b/qelectrotech.pro @@ -166,7 +166,8 @@ HEADERS += $$files(sources/*.h) \ $$files(sources/TerminalStrip/GraphicsItem/*.h) \ $$files(sources/TerminalStrip/GraphicsItem/properties/*.h) \ $$files(sources/xml/*.h) \ - $$files(sources/dxf/*.h) + $$files(sources/dxf/*.h) \ + $$files(sources/svg/*.h) SOURCES += $$files(sources/*.cpp) \ $$files(sources/editor/*.cpp) \ @@ -208,7 +209,8 @@ SOURCES += $$files(sources/*.cpp) \ $$files(sources/TerminalStrip/GraphicsItem/*.cpp) \ $$files(sources/TerminalStrip/GraphicsItem/properties/*.cpp) \ $$files(sources/xml/*.cpp) \ - $$files(sources/dxf/*.cpp) + $$files(sources/dxf/*.cpp) \ + $$files(sources/svg/*.cpp) # Needed for use promote QTreeWidget in terminalstripeditor.ui INCLUDEPATH += sources/TerminalStrip/ui diff --git a/sources/TerminalStrip/GraphicsItem/properties/terminalstriplayoutpattern.cpp b/sources/TerminalStrip/GraphicsItem/properties/terminalstriplayoutpattern.cpp index b6fba13e8..84baeb591 100644 --- a/sources/TerminalStrip/GraphicsItem/properties/terminalstriplayoutpattern.cpp +++ b/sources/TerminalStrip/GraphicsItem/properties/terminalstriplayoutpattern.cpp @@ -26,8 +26,15 @@ TerminalStripLayoutPattern::TerminalStripLayoutPattern() updateTerminalsTextOption(); } +/** + * @brief TerminalStripLayoutPattern::setHeaderTextAlignment + * Set text alignment to @param alignment. If alignment have no + * flag this function do nothing + * @param alignment + */ void TerminalStripLayoutPattern::setHeaderTextAlignment(const Qt::Alignment &alignment) { + if (!alignment) return; m_header_text_alignment = alignment; updateHeaderTextOption(); } @@ -50,8 +57,15 @@ void TerminalStripLayoutPattern::setFont(const QFont &font) { QETUtils::pixelSizedFont(m_font); } +/** + * @brief TerminalStripLayoutPattern::setTerminalsTextAlignment + * Set text alignment to @param alignment. If alignment have no + * flag this function do nothing + * @param alignment + */ void TerminalStripLayoutPattern::setTerminalsTextAlignment(const Qt::Alignment &alignment) { + if (!alignment) return; m_terminals_text_alignment = alignment; updateTerminalsTextOption(); } diff --git a/sources/qetxml.cpp b/sources/qetxml.cpp index b22a5581c..dc35ce30a 100644 --- a/sources/qetxml.cpp +++ b/sources/qetxml.cpp @@ -953,4 +953,93 @@ bool qGraphicsItemPosFromXml(QGraphicsItem *item, const QDomElement &xml_elmt) return false; } +/** + * @brief orientationToAttribute + * Write the Qt::orientation has an attribute of @param element. + * Attribute name is 'orientation' value is 'horizontal' or 'vertical' + * @param orientation + * @param element + */ +void orientationToAttribute(const Qt::Orientation &orientation, QDomElement &element) +{ + element.setAttribute(QStringLiteral("orientation"), + orientation == Qt::Horizontal ? QStringLiteral("Horizontal") : + QStringLiteral("Vertical")); +} + +/** + * @brief orientationFromAttribute + * @param element + * @param def_value + * @return the Qt::Orientation read in @param element. If an error occur + * the returned orientation is @param def_value. + */ +Qt::Orientation orientationFromAttribute(const QDomElement &element, Qt::Orientation def_value) +{ + if (element.hasAttribute(QStringLiteral("orientation"))) { + const auto str {element.attribute(QStringLiteral("orientation"))}; + if (str == QLatin1String("Horizontal")) + return Qt::Horizontal; + else if (str == QLatin1String("Vertical")) + return Qt::Vertical; + } + //Error occur during reading, we return the default value + return def_value; +} + +void alignmentToAttribute(const Qt::Alignment &alignment, QDomElement &element) +{ + QStringList al; + if (alignment &Qt::AlignLeft) + al.append(QStringLiteral("Left")); + if (alignment &Qt::AlignRight) + al.append(QStringLiteral("Right")); + if (alignment &Qt::AlignHCenter) + al.append(QStringLiteral("HCenter")); + if (alignment &Qt::AlignJustify) + al.append(QStringLiteral("Justify")); + if (alignment &Qt::AlignTop) + al.append(QStringLiteral("Top")); + if (alignment &Qt::AlignBottom) + al.append(QStringLiteral("Bottom")); + if (alignment &Qt::AlignBottom) + al.append(QStringLiteral("VCenter")); + if (alignment &Qt::AlignBaseline) + al.append(QStringLiteral("Baseline")); + + element.setAttribute(QStringLiteral("alignment"),al.join(QStringLiteral(" "))); +} + +/** + * @brief alignmentFromAttribute + * @param element + * @return The alignment read in @param element. If an error + * occured the return Qt::alignment contain no set flag. + */ +Qt::Alignment alignmentFromAttribute(const QDomElement &element) +{ + Qt::Alignment al; + if (element.hasAttribute(QStringLiteral("alignment"))) { + const auto alignment {element.attribute(QStringLiteral("alignment"))}; + if(alignment.contains(QStringLiteral("Left"))) + al = al | Qt::AlignLeft; + if(alignment.contains(QStringLiteral("Right"))) + al = al | Qt::AlignRight; + if(alignment.contains(QStringLiteral("HCenter"))) + al = al | Qt::AlignHCenter; + if(alignment.contains(QStringLiteral("Justify"))) + al = al | Qt::AlignJustify; + if(alignment.contains(QStringLiteral("Top"))) + al = al | Qt::AlignTop; + if(alignment.contains(QStringLiteral("Bottom"))) + al = al | Qt::AlignBottom; + if(alignment.contains(QStringLiteral("VCenter"))) + al = al | Qt::AlignVCenter; + if(alignment.contains(QStringLiteral("Baseline"))) + al = al | Qt::AlignBaseline; + } + + return al; +} + } diff --git a/sources/qetxml.h b/sources/qetxml.h index 9d57d2240..c5670d857 100644 --- a/sources/qetxml.h +++ b/sources/qetxml.h @@ -94,6 +94,12 @@ namespace QETXML QDomElement qGraphicsItemPosToXml(QGraphicsItem *item, QDomDocument &document); bool qGraphicsItemPosFromXml(QGraphicsItem *item, const QDomElement &xml_elmt); + void orientationToAttribute(const Qt::Orientation &orientation, QDomElement &element); + Qt::Orientation orientationFromAttribute(const QDomElement &element, Qt::Orientation def_value = Qt::Vertical); + + void alignmentToAttribute(const Qt::Alignment &alignment, QDomElement &element); + Qt::Alignment alignmentFromAttribute (const QDomElement &element); + QString boolToString(bool value); bool boolFromString(const QString &value, bool default_value = true, diff --git a/sources/svg/qetsvg.cpp b/sources/svg/qetsvg.cpp new file mode 100644 index 000000000..ba5ac7d99 --- /dev/null +++ b/sources/svg/qetsvg.cpp @@ -0,0 +1,151 @@ +/* + Copyright 2006-2025 The QElectroTech Team + This file is part of QElectroTech. + + QElectroTech is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 2 of the License, or + (at your option) any later version. + + QElectroTech is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with QElectroTech. If not, see . +*/ + +#include "qetsvg.h" + +#include +#include +#include <../qet.h> + +/** + * @brief QETSVG::rectToElmt + * Write a QRect as a svg rect element. + * @param rect + * @param parent_document + * @return + */ +QDomElement QETSVG::rectToElmt(const QRect &rect, QDomDocument &parent_document) +{ + auto dom_element = parent_document.createElement(QStringLiteral("rect")); + if (!rect.isNull()) { + dom_element.setAttribute(QStringLiteral("x"), rect.x()); + yToAttribute(rect.y(), dom_element); + dom_element.setAttribute(QStringLiteral("width"), rect.width()); + heightToAttribute(rect.height(), dom_element); + } + return dom_element; +} + +/** + * @brief QETSVG::rectFromElmt + * @param xml_element : xml_element of an svg rect. + * The tag name must be 'rect' if not, the returned QRect is null. + * @return a svg rect to QRect + */ +QRect QETSVG::rectFromElmt(const QDomElement &xml_element) +{ + QRect rect; + if (xml_element.tagName() == QLatin1String("rect")) { + rect.setRect(xml_element.attribute(QStringLiteral("x"), QStringLiteral("0")).toInt(), + static_cast (yFromAttribute(xml_element, 0)), + xml_element.attribute(QStringLiteral("width"), QStringLiteral("10")).toInt(), + static_cast (heightFromAttribute(xml_element, 10))); + } + return rect; +} + +/** + * @brief QETSVG::yToAttribute + * @param y + * @param xml_element + */ +void QETSVG::yToAttribute(const qreal &y, QDomElement &xml_element) { + xml_element.setAttribute(QStringLiteral("y"), QString::number(y)); +} + +/** + * @brief QETSVG::yFromAttribute + * @param xml_element + * @param def_value + * @return + */ +qreal QETSVG::yFromAttribute(const QDomElement &xml_element, const qreal &def_value) { + qreal value; + if (QET::attributeIsAReal(xml_element, QStringLiteral("y"), &value)) { + return value; + } + return def_value; +} + +/** + * @brief QETSVG::heightToAttribute + * @param height + * @param xml_element + */ +void QETSVG::heightToAttribute(const qreal &height, QDomElement &xml_element) { + xml_element.setAttribute(QStringLiteral("height"), QString::number(height)); +} + +qreal QETSVG::heightFromAttribute(const QDomElement &xml_element, const qreal &def_value) { + qreal value; + if (QET::attributeIsAReal(xml_element, QStringLiteral("height"), &value)) { + return value; + } + return def_value; +} + +void QETSVG::rToAttribute(const qreal &r, QDomElement &xml_element) { + xml_element.setAttribute(QStringLiteral("r"), QString::number(r)); +} + +qreal QETSVG::rFromAttribute(const QDomElement &xml_element, const qreal &def_value) { + qreal value; + if (QET::attributeIsAReal(xml_element, QStringLiteral("r"), &value)) { + return value; + } + return def_value; + +} + +void QETSVG::pointsToAttribute(const QVector &points, QDomElement &xml_element) +{ + QStringList strl; + for (const auto &point : points) { + strl.append(QString::number(point.x()) + + QString(",") + + QString::number(point.y())); + } + + xml_element.setAttribute(QStringLiteral("points"), strl.join(" ")); +} + +/** + * @brief QETSVG::pointsFromAttribute + * @param xml_element + * @return a vector of points stored in attribute 'points' of @xml_element. + * The returned vector can be empty. + */ +QVector QETSVG::pointsFromAttribute(const QDomElement &xml_element) +{ + QVector vector; + if (const auto string_points = xml_element.attribute(QStringLiteral("points")).split(QStringLiteral(" ")) ; + !string_points.isEmpty()) { + bool x_ok, y_ok; for (const auto &point : string_points) { + const auto string_x_y = point.split(QStringLiteral(",")); + if (string_x_y.size() == 2) { + const auto x = string_x_y[0].toDouble(&x_ok); + const auto y = string_x_y[1].toDouble(&y_ok); + if (x_ok && y_ok) { + vector.append(QPointF{x,y}); + } + } + } + } + + return vector; +} diff --git a/sources/svg/qetsvg.h b/sources/svg/qetsvg.h new file mode 100644 index 000000000..037d33c7c --- /dev/null +++ b/sources/svg/qetsvg.h @@ -0,0 +1,51 @@ +/* + Copyright 2006-2025 The QElectroTech Team + This file is part of QElectroTech. + + QElectroTech is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 2 of the License, or + (at your option) any later version. + + QElectroTech is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with QElectroTech. If not, see . +*/ +#ifndef QETSVG_H +#define QETSVG_H + +#include + +class QDomDocument; +class QPointF; +class QRect; + +/** + * @namespace QETSVG + * @brief the QETSVG namespace provide function read and write svg. + * Some function work on xml element (ex rect) and some other + * work on attribute of an element (ex x) + */ +namespace QETSVG +{ + QDomElement rectToElmt(const QRect &rect, QDomDocument &parent_document); + QRect rectFromElmt(const QDomElement &xml_element); + + void yToAttribute(const qreal &y, QDomElement &xml_element); + qreal yFromAttribute(const QDomElement &xml_element, const qreal &def_value=0); + + void heightToAttribute(const qreal &height, QDomElement &xml_element); + qreal heightFromAttribute(const QDomElement &xml_element, const qreal &def_value=10); + + void rToAttribute(const qreal &r, QDomElement &xml_element); + qreal rFromAttribute(const QDomElement &xml_element, const qreal &def_value=1); + + void pointsToAttribute(const QVector &points, QDomElement &xml_element); + QVector pointsFromAttribute (const QDomElement &xml_element); +} + +#endif // QETSVG_H diff --git a/sources/xml/terminalstriplayoutpatternxml.cpp b/sources/xml/terminalstriplayoutpatternxml.cpp new file mode 100644 index 000000000..9ae8a0dbb --- /dev/null +++ b/sources/xml/terminalstriplayoutpatternxml.cpp @@ -0,0 +1,191 @@ +/* + Copyright 2006-2025 The QElectroTech Team + This file is part of QElectroTech. + + QElectroTech is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 2 of the License, or + (at your option) any later version. + + QElectroTech is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with QElectroTech. If not, see . +*/ +#include "terminalstriplayoutpatternxml.h" + +#include "../TerminalStrip/GraphicsItem/properties/terminalstriplayoutpattern.h" +#include "../qetxml.h" +#include "../svg/qetsvg.h" + +const QString LAYOUT_PATTERN_TAG_NAME { QStringLiteral("terminal_strip_layout_pattern") }; +const QString LAYOUTS_PATTERN_TAG_NAME { QStringLiteral("terminal_strip_layouts_pattern") }; + +/** + * @brief TerminalStripLayoutPatternXml::toXml + * Save a vector of @class TerminalStripLayoutPattern into main xml element + * with tagg name 'terminal_strip_layouts_pattern' who itself embedded each single @class TerminalStripLayoutPattern + * into a xml element with tag name 'terminal_strip_layout_pattern' (layout without 'S' at the end) + * @param patterns + * @param document + * @return + */ +QDomElement TerminalStripLayoutPatternXml::toXml(const QVector > &patterns, + QDomDocument &document) +{ + auto dom_element = document.createElement(LAYOUTS_PATTERN_TAG_NAME); + for (const auto &pattern : patterns) + { + const auto child_ = toXml(pattern, document); + if (!child_.isNull()) { + dom_element.appendChild(child_); + } + } + + return dom_element; +} + +/** + * @brief TerminalStripLayoutPatternXml::fromXml + * Load a vector of @class TerminalStripLayoutPattern from a main xml element + * with tagg name 'terminal_strip_layouts_pattern' who itself have several child + * with tag name 'terminal_strip_layout_pattern' (layout without 'S' at the end) for every + * @class TerminalStripLayoutPattern to load + * @param element + * @return + */ +QVector > TerminalStripLayoutPatternXml::fromXml(const QDomElement &element) +{ + QVector > returned_vector; + + for (const auto &dom_elmt : QETXML::subChild(element, + LAYOUTS_PATTERN_TAG_NAME, + LAYOUT_PATTERN_TAG_NAME)) + { + auto layout_pattern = QSharedPointer::create(); + fromXml(layout_pattern, dom_elmt); + + returned_vector << layout_pattern; + } + + return returned_vector; +} + +/** + * @brief TerminalStripLayoutPatternXml::toXml + * Save a @class TerminalStripLayoutPattern to a xml element with tag name terminal_strip_layout_pattern + * @param pattern + * @param document + * @return + */ +QDomElement TerminalStripLayoutPatternXml::toXml(const QSharedPointer &pattern, QDomDocument &document) +{ + auto pattern_xml = document.createElement(LAYOUT_PATTERN_TAG_NAME); + if (!pattern.isNull()) { + //Write strip pattern attributes + pattern_xml.setAttribute(QStringLiteral("name"), pattern->m_name); + pattern_xml.setAttribute(QStringLiteral("uuid"), pattern->m_uuid.toString()); + + //Write header properties + auto header_xml = document.createElement(QStringLiteral("header")); + header_xml.appendChild(QETSVG::rectToElmt(pattern->m_header_rect, document)); + + auto header_text_xml = document.createElement(QStringLiteral("text")); + QETXML::orientationToAttribute(pattern->m_header_text_orientation, header_text_xml); + QETXML::alignmentToAttribute(pattern->headerTextAlignment(),header_text_xml); + + //Write spacer properties + auto spacer_xml = document.createElement(QStringLiteral("spacer")); + spacer_xml.appendChild(QETSVG::rectToElmt(pattern->m_spacer_rect, document)); + + pattern_xml.appendChild(header_xml).appendChild(header_text_xml); + pattern_xml.appendChild(spacer_xml); + + //Write terminals properties + auto terminals_xml = document.createElement(QStringLiteral("terminals")); + for (const auto &rect : pattern->m_terminal_rect) { + terminals_xml.appendChild(QETSVG::rectToElmt(rect, document)); + } + + auto terminals_text_xml = document.createElement(QStringLiteral("text")); + QETXML::orientationToAttribute(pattern->m_terminals_text_orientation, terminals_text_xml); + QETXML::alignmentToAttribute(pattern->terminalsTextAlignment(),terminals_text_xml); + QETSVG::yToAttribute(pattern->m_terminals_text_y, terminals_text_xml); + QETSVG::heightToAttribute(pattern->m_terminals_text_height, terminals_text_xml); + terminals_xml.appendChild(terminals_text_xml); + + auto bridge_xml = document.createElement(QStringLiteral("bridges")); + QETSVG::rToAttribute(static_cast(pattern->m_bridge_point_d)/2, bridge_xml); + QETSVG::pointsToAttribute(QVector{QPointF{0, static_cast (pattern->m_bridge_point_y_offset.at(0))}, + QPointF{0, static_cast (pattern->m_bridge_point_y_offset.at(1))}, + QPointF{0, static_cast (pattern->m_bridge_point_y_offset.at(2))}, + QPointF{0, static_cast (pattern->m_bridge_point_y_offset.at(3))}}, + bridge_xml); + terminals_xml.appendChild(bridge_xml); + + pattern_xml.appendChild(terminals_xml); + } + + return pattern_xml; +} + +/** + * @brief TerminalStripLayoutPatternXml::fromXml + * LOad a @class TerminalStripLayoutPattern from a xml element with tag name terminal_strip_layout_pattern + * @param layout + * @param element + */ +void TerminalStripLayoutPatternXml::fromXml(QSharedPointer &layout, const QDomElement &element) +{ + if (element.tagName() != LAYOUT_PATTERN_TAG_NAME) return; + layout->m_name = element.attribute(QStringLiteral("name"), layout->m_name); + layout->m_uuid.fromString(element.attribute(QStringLiteral("uuid"), layout->m_uuid.toString())); + + const auto header_xml = element.firstChildElement(QStringLiteral("header")); + if (!header_xml.isNull() && header_xml.hasAttribute(QStringLiteral("rect"))) { + layout->m_header_rect = QETSVG::rectFromElmt(header_xml); + } + + if (const auto header_text_xml = header_xml.firstChildElement(QStringLiteral("text")); + !header_text_xml.isNull()) { + layout->m_header_text_orientation = QETXML::orientationFromAttribute(header_text_xml, layout->m_header_text_orientation); + layout->setHeaderTextAlignment(QETXML::alignmentFromAttribute(header_text_xml)); + } + + const auto spacer_xml = element.firstChildElement(QStringLiteral("spacer")); + if (const auto rect = QETSVG::rectFromElmt(spacer_xml); + !rect.isNull()) { + layout->m_spacer_rect = rect; + } + + if (const auto terminals_xml = element.firstChildElement(QStringLiteral("terminals")); + !terminals_xml.isNull()) { + layout->m_terminal_rect.clear(); + for (const auto &terminal_rect_xml : QETXML::directChild(terminals_xml, QStringLiteral("rect"))) { + layout->m_terminal_rect.append(QETSVG::rectFromElmt(terminal_rect_xml)) ; + } + + if (const auto terminals_text_xml = terminals_xml.firstChildElement(QStringLiteral("text")); + !terminals_text_xml.isNull()) { + layout->m_terminals_text_orientation = QETXML::orientationFromAttribute(terminals_text_xml, layout->m_terminals_text_orientation); + layout->setTerminalsTextAlignment(QETXML::alignmentFromAttribute(terminals_text_xml)); + layout->m_terminals_text_y = QETSVG::yFromAttribute(terminals_text_xml); + layout->m_terminals_text_height = QETSVG::heightFromAttribute(terminals_text_xml); + } + + if (const auto bridge_xml = terminals_xml.firstChildElement(QStringLiteral("bridges")); + !bridge_xml.isNull()) { + layout->m_bridge_point_d = QETSVG::rFromAttribute(bridge_xml, 2.5)*2; + if (const auto points = QETSVG::pointsFromAttribute(bridge_xml); + points.size() == 4) { + layout->m_bridge_point_y_offset[0]= static_cast(points[0].y()); + layout->m_bridge_point_y_offset[1]= static_cast(points[1].y()); + layout->m_bridge_point_y_offset[2]= static_cast(points[2].y()); + layout->m_bridge_point_y_offset[3]= static_cast(points[3].y()); + } + } + } +} diff --git a/sources/xml/terminalstriplayoutpatternxml.h b/sources/xml/terminalstriplayoutpatternxml.h new file mode 100644 index 000000000..644d7ff12 --- /dev/null +++ b/sources/xml/terminalstriplayoutpatternxml.h @@ -0,0 +1,41 @@ +/* + Copyright 2006-2025 The QElectroTech Team + This file is part of QElectroTech. + + QElectroTech is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 2 of the License, or + (at your option) any later version. + + QElectroTech is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with QElectroTech. If not, see . +*/ +#ifndef TERMINALSTRIPLAYOUTPATTERNXML_H +#define TERMINALSTRIPLAYOUTPATTERNXML_H + +#include +#include + +class TerminalStripLayoutPattern; + +/** + * @brief The TerminalStripLayoutPatternXml class + * A class used to save/restor a @class TerminalStripLayoutPattern to + * xml + */ +class TerminalStripLayoutPatternXml +{ + public: + static QDomElement toXml(const QVector> &patterns, QDomDocument &document); + static QVector> fromXml(const QDomElement &element); + + static QDomElement toXml (const QSharedPointer &pattern, QDomDocument &document); + static void fromXml(QSharedPointer &layout, const QDomElement &element); +}; + +#endif // TERMINALSTRIPLAYOUTPATTERNXML_H From d699faf5017b721ec9beeea4a20bc137af8aa47f Mon Sep 17 00:00:00 2001 From: joshua Date: Sun, 8 Jun 2025 21:40:32 +0200 Subject: [PATCH 07/65] Change some int to qreal Made this change to be more compliant with svg --- .../properties/terminalstriplayoutpattern.h | 22 ++++----- .../GraphicsItem/terminalstripdrawer.cpp | 18 ++++---- .../GraphicsItem/terminalstripdrawer.h | 4 +- sources/svg/qetsvg.cpp | 46 +++++++++---------- sources/svg/qetsvg.h | 6 +-- sources/xml/terminalstriplayoutpatternxml.cpp | 20 ++++---- sources/xml/terminalstriplayoutpatternxml.h | 4 +- 7 files changed, 60 insertions(+), 60 deletions(-) diff --git a/sources/TerminalStrip/GraphicsItem/properties/terminalstriplayoutpattern.h b/sources/TerminalStrip/GraphicsItem/properties/terminalstriplayoutpattern.h index 03bbf21ec..1b5f0c40a 100644 --- a/sources/TerminalStrip/GraphicsItem/properties/terminalstriplayoutpattern.h +++ b/sources/TerminalStrip/GraphicsItem/properties/terminalstriplayoutpattern.h @@ -44,38 +44,38 @@ class TerminalStripLayoutPattern TerminalStripLayoutPattern(); //Header of terminal strip - QRect m_header_rect{0,30,50,130}; + QRectF m_header_rect{0,30,50,130}; Qt::Orientation m_header_text_orientation{Qt::Horizontal}; void setHeaderTextAlignment(const Qt::Alignment &alignment); Qt::Alignment headerTextAlignment() const; QTextOption headerTextOption() const; //Spacer between the header and the terminals - QRect m_spacer_rect{0, 50, 10, 90}; + QRectF m_spacer_rect{0, 50, 10, 90}; //Font QFont font() const; void setFont (const QFont &font); //Terminals - QVector m_terminal_rect + QVector m_terminal_rect { - QRect{0, 0, 20, 190}, - QRect{0, 10, 20, 170}, - QRect{0, 20, 20, 150}, - QRect{0, 30, 20, 130} + QRectF{0, 0, 20, 190}, + QRectF{0, 10, 20, 170}, + QRectF{0, 20, 20, 150}, + QRectF{0, 30, 20, 130} }; //Terminal text void setTerminalsTextAlignment(const Qt::Alignment &alignment); Qt::Alignment terminalsTextAlignment() const; QTextOption terminalsTextOption() const; - int m_terminals_text_height{50}; - int m_terminals_text_y{35}; + qreal m_terminals_text_height{50}; + qreal m_terminals_text_y{35}; Qt::Orientation m_terminals_text_orientation {Qt::Vertical}; - int m_bridge_point_d{5}; - QVector m_bridge_point_y_offset{50,70,90,110}; + qreal m_bridge_point_d{5}; + QVector m_bridge_point_y_offset{50,70,90,110}; QUuid m_uuid{QUuid::createUuid()}; QString m_name; diff --git a/sources/TerminalStrip/GraphicsItem/terminalstripdrawer.cpp b/sources/TerminalStrip/GraphicsItem/terminalstripdrawer.cpp index 256665305..4b94b9284 100644 --- a/sources/TerminalStrip/GraphicsItem/terminalstripdrawer.cpp +++ b/sources/TerminalStrip/GraphicsItem/terminalstripdrawer.cpp @@ -95,7 +95,7 @@ void TerminalStripDrawer::paint(QPainter *painter) //Move painter pos to next drawing painter->translate(m_pattern->m_header_rect.width(),0); - int x_offset{m_pattern->m_header_rect.width()}; + qreal x_offset{m_pattern->m_header_rect.width()}; //Draw spacer painter->drawRect(m_pattern->m_spacer_rect); @@ -109,7 +109,7 @@ void TerminalStripDrawer::paint(QPainter *painter) const auto terminals_text_option{m_pattern->terminalsTextOption()}; const auto terminals_text_height{m_pattern->m_terminals_text_height}; const auto terminals_text_y{m_pattern->m_terminals_text_y}; - QRect terminal_rect; + QRectF terminal_rect; QHash> bridges_anchor_points; @@ -145,7 +145,7 @@ void TerminalStripDrawer::paint(QPainter *painter) //We can't use terminal_rect.bottomLeft for p2 because //the returned value deviate from the true value //(see Qt documentation about QRect) - const QPoint p2 { p1.x(), p1.y() + terminal_rect.height() }; + const QPointF p2 { p1.x(), p1.y() + terminal_rect.height() }; painter->drawLine(p1, p2); painter->restore(); } @@ -154,8 +154,8 @@ void TerminalStripDrawer::paint(QPainter *painter) { painter->save(); painter->setPen(Qt::yellow); - painter->drawLine(QPoint{terminal_rect.x(), terminal_rect.y() + terminal_rect.height()/2}, - QPoint{terminal_rect.width(), terminal_rect.y() + terminal_rect.height()/2}); + painter->drawLine(QPointF{terminal_rect.x(), terminal_rect.y() + terminal_rect.height()/2}, + QPointF{terminal_rect.width(), terminal_rect.y() + terminal_rect.height()/2}); painter->restore(); } @@ -226,7 +226,7 @@ void TerminalStripDrawer::paint(QPainter *painter) QRectF TerminalStripDrawer::boundingRect() const { - return QRect{0, 0, width(), height()};; + return QRectF{0, 0, width(), height()};; } void TerminalStripDrawer::setLayout(QSharedPointer layout) @@ -243,7 +243,7 @@ void TerminalStripDrawer::setPreviewDraw(bool draw) { m_preview_draw = draw; } -int TerminalStripDrawer::height() const +qreal TerminalStripDrawer::height() const { if (m_pattern) { @@ -261,11 +261,11 @@ int TerminalStripDrawer::height() const return 0; } -int TerminalStripDrawer::width() const +qreal TerminalStripDrawer::width() const { if (m_pattern) { - int width_{m_pattern->m_header_rect.width() + m_pattern->m_spacer_rect.width()}; + qreal width_{m_pattern->m_header_rect.width() + m_pattern->m_spacer_rect.width()}; if (m_strip) { diff --git a/sources/TerminalStrip/GraphicsItem/terminalstripdrawer.h b/sources/TerminalStrip/GraphicsItem/terminalstripdrawer.h index 20f41478c..72286c41d 100644 --- a/sources/TerminalStrip/GraphicsItem/terminalstripdrawer.h +++ b/sources/TerminalStrip/GraphicsItem/terminalstripdrawer.h @@ -80,8 +80,8 @@ namespace TerminalStripDrawer void setPreviewDraw(bool draw = true); private: - int height() const; - int width() const; + qreal height() const; + qreal width() const; private: QSharedPointer m_strip; diff --git a/sources/svg/qetsvg.cpp b/sources/svg/qetsvg.cpp index ba5ac7d99..c1fa1bdca 100644 --- a/sources/svg/qetsvg.cpp +++ b/sources/svg/qetsvg.cpp @@ -29,7 +29,7 @@ * @param parent_document * @return */ -QDomElement QETSVG::rectToElmt(const QRect &rect, QDomDocument &parent_document) +QDomElement QETSVG::rectToElmt(const QRectF &rect, QDomDocument &parent_document) { auto dom_element = parent_document.createElement(QStringLiteral("rect")); if (!rect.isNull()) { @@ -47,16 +47,16 @@ QDomElement QETSVG::rectToElmt(const QRect &rect, QDomDocument &parent_document) * The tag name must be 'rect' if not, the returned QRect is null. * @return a svg rect to QRect */ -QRect QETSVG::rectFromElmt(const QDomElement &xml_element) +QRectF QETSVG::rectFromElmt(const QDomElement &xml_element) { - QRect rect; + QRectF rect_; if (xml_element.tagName() == QLatin1String("rect")) { - rect.setRect(xml_element.attribute(QStringLiteral("x"), QStringLiteral("0")).toInt(), - static_cast (yFromAttribute(xml_element, 0)), - xml_element.attribute(QStringLiteral("width"), QStringLiteral("10")).toInt(), - static_cast (heightFromAttribute(xml_element, 10))); + rect_.setRect(xml_element.attribute(QStringLiteral("x"), QStringLiteral("0")).toDouble(), + yFromAttribute(xml_element, 0), + xml_element.attribute(QStringLiteral("width"), QStringLiteral("10")).toDouble(), + heightFromAttribute(xml_element, 10)); } - return rect; + return rect_; } /** @@ -75,9 +75,9 @@ void QETSVG::yToAttribute(const qreal &y, QDomElement &xml_element) { * @return */ qreal QETSVG::yFromAttribute(const QDomElement &xml_element, const qreal &def_value) { - qreal value; - if (QET::attributeIsAReal(xml_element, QStringLiteral("y"), &value)) { - return value; + qreal value_; + if (QET::attributeIsAReal(xml_element, QStringLiteral("y"), &value_)) { + return value_; } return def_value; } @@ -92,9 +92,9 @@ void QETSVG::heightToAttribute(const qreal &height, QDomElement &xml_element) { } qreal QETSVG::heightFromAttribute(const QDomElement &xml_element, const qreal &def_value) { - qreal value; - if (QET::attributeIsAReal(xml_element, QStringLiteral("height"), &value)) { - return value; + qreal value_; + if (QET::attributeIsAReal(xml_element, QStringLiteral("height"), &value_)) { + return value_; } return def_value; } @@ -104,9 +104,9 @@ void QETSVG::rToAttribute(const qreal &r, QDomElement &xml_element) { } qreal QETSVG::rFromAttribute(const QDomElement &xml_element, const qreal &def_value) { - qreal value; - if (QET::attributeIsAReal(xml_element, QStringLiteral("r"), &value)) { - return value; + qreal value_; + if (QET::attributeIsAReal(xml_element, QStringLiteral("r"), &value_)) { + return value_; } return def_value; @@ -114,14 +114,14 @@ qreal QETSVG::rFromAttribute(const QDomElement &xml_element, const qreal &def_va void QETSVG::pointsToAttribute(const QVector &points, QDomElement &xml_element) { - QStringList strl; + QStringList strl_; for (const auto &point : points) { - strl.append(QString::number(point.x()) + + strl_.append(QString::number(point.x()) + QString(",") + QString::number(point.y())); } - xml_element.setAttribute(QStringLiteral("points"), strl.join(" ")); + xml_element.setAttribute(QStringLiteral("points"), strl_.join(" ")); } /** @@ -132,7 +132,7 @@ void QETSVG::pointsToAttribute(const QVector &points, QDomElement &xml_ */ QVector QETSVG::pointsFromAttribute(const QDomElement &xml_element) { - QVector vector; + QVector vector_; if (const auto string_points = xml_element.attribute(QStringLiteral("points")).split(QStringLiteral(" ")) ; !string_points.isEmpty()) { bool x_ok, y_ok; for (const auto &point : string_points) { @@ -141,11 +141,11 @@ QVector QETSVG::pointsFromAttribute(const QDomElement &xml_element) const auto x = string_x_y[0].toDouble(&x_ok); const auto y = string_x_y[1].toDouble(&y_ok); if (x_ok && y_ok) { - vector.append(QPointF{x,y}); + vector_.append(QPointF{x,y}); } } } } - return vector; + return vector_; } diff --git a/sources/svg/qetsvg.h b/sources/svg/qetsvg.h index 037d33c7c..0577236ea 100644 --- a/sources/svg/qetsvg.h +++ b/sources/svg/qetsvg.h @@ -22,7 +22,7 @@ class QDomDocument; class QPointF; -class QRect; +class QRectF; /** * @namespace QETSVG @@ -32,8 +32,8 @@ class QRect; */ namespace QETSVG { - QDomElement rectToElmt(const QRect &rect, QDomDocument &parent_document); - QRect rectFromElmt(const QDomElement &xml_element); + QDomElement rectToElmt(const QRectF &rect, QDomDocument &parent_document); + QRectF rectFromElmt(const QDomElement &xml_element); void yToAttribute(const qreal &y, QDomElement &xml_element); qreal yFromAttribute(const QDomElement &xml_element, const qreal &def_value=0); diff --git a/sources/xml/terminalstriplayoutpatternxml.cpp b/sources/xml/terminalstriplayoutpatternxml.cpp index 9ae8a0dbb..5ea20a1cb 100644 --- a/sources/xml/terminalstriplayoutpatternxml.cpp +++ b/sources/xml/terminalstriplayoutpatternxml.cpp @@ -118,12 +118,12 @@ QDomElement TerminalStripLayoutPatternXml::toXml(const QSharedPointer(pattern->m_bridge_point_d)/2, bridge_xml); - QETSVG::pointsToAttribute(QVector{QPointF{0, static_cast (pattern->m_bridge_point_y_offset.at(0))}, - QPointF{0, static_cast (pattern->m_bridge_point_y_offset.at(1))}, - QPointF{0, static_cast (pattern->m_bridge_point_y_offset.at(2))}, - QPointF{0, static_cast (pattern->m_bridge_point_y_offset.at(3))}}, - bridge_xml); + QETSVG::rToAttribute(pattern->m_bridge_point_d/2, bridge_xml); + QVector points_vector; + for (const auto &y : pattern->m_bridge_point_y_offset) { + points_vector.append(QPointF{0,y}); + } + QETSVG::pointsToAttribute(points_vector, bridge_xml); terminals_xml.appendChild(bridge_xml); pattern_xml.appendChild(terminals_xml); @@ -181,10 +181,10 @@ void TerminalStripLayoutPatternXml::fromXml(QSharedPointerm_bridge_point_d = QETSVG::rFromAttribute(bridge_xml, 2.5)*2; if (const auto points = QETSVG::pointsFromAttribute(bridge_xml); points.size() == 4) { - layout->m_bridge_point_y_offset[0]= static_cast(points[0].y()); - layout->m_bridge_point_y_offset[1]= static_cast(points[1].y()); - layout->m_bridge_point_y_offset[2]= static_cast(points[2].y()); - layout->m_bridge_point_y_offset[3]= static_cast(points[3].y()); + layout->m_bridge_point_y_offset[0]= points[0].y(); + layout->m_bridge_point_y_offset[1]= points[1].y(); + layout->m_bridge_point_y_offset[2]= points[2].y(); + layout->m_bridge_point_y_offset[3]= points[3].y(); } } } diff --git a/sources/xml/terminalstriplayoutpatternxml.h b/sources/xml/terminalstriplayoutpatternxml.h index 644d7ff12..df6dba87b 100644 --- a/sources/xml/terminalstriplayoutpatternxml.h +++ b/sources/xml/terminalstriplayoutpatternxml.h @@ -25,8 +25,8 @@ class TerminalStripLayoutPattern; /** * @brief The TerminalStripLayoutPatternXml class - * A class used to save/restor a @class TerminalStripLayoutPattern to - * xml + * A class with static function used to save/restor a + * @class TerminalStripLayoutPattern to xml */ class TerminalStripLayoutPatternXml { From 3a6b4807dbe1a0fb6bb28f918d25c1d01bbfac05 Mon Sep 17 00:00:00 2001 From: joshua Date: Mon, 9 Jun 2025 21:35:00 +0200 Subject: [PATCH 08/65] Fix crash. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fix crash when : 1°-Open a project with terminal strip and open the terminal strip editor 2°-Close the terminal strip editor and the project (keep qelectrotech open). 3°-redo step 1 and click on an item in the tree at left of the window, qet crash. Qet don't crash anymore but the terminal strip editor continue to work with the terminal strip of the first opening (exactly the pointer of the terminal strip) who don't exist anymore. Need more work. --- sources/TerminalStrip/ui/terminalstriptreedockwidget.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sources/TerminalStrip/ui/terminalstriptreedockwidget.h b/sources/TerminalStrip/ui/terminalstriptreedockwidget.h index 31ed57b32..6fdbb1ee1 100644 --- a/sources/TerminalStrip/ui/terminalstriptreedockwidget.h +++ b/sources/TerminalStrip/ui/terminalstriptreedockwidget.h @@ -74,7 +74,7 @@ class TerminalStripTreeDockWidget : public QDockWidget QPointer m_project; QPointer m_current_strip; - QHash m_item_strip_H; + QHash> m_item_strip_H; QHash> m_uuid_terminal_H; QHash> m_uuid_strip_H; QVector m_strip_changed_connection; From d711d8fb4abc4586c1b33343b2540cac30483e43 Mon Sep 17 00:00:00 2001 From: joshua Date: Wed, 11 Jun 2025 22:43:41 +0200 Subject: [PATCH 09/65] Terminal strip editor can now edit multiple project. Before this this commit the terminal strip editor couldn't only work on the first project opened into this editor, all other project opened after couldn't be edited. This is now past, terminal strip editor can now edit every project open in QElectroTech. --- .../TerminalStrip/ui/freeterminaleditor.cpp | 35 +++++++++++-- sources/TerminalStrip/ui/freeterminaleditor.h | 8 +-- .../TerminalStrip/ui/freeterminalmodel.cpp | 52 +++++++++++++------ sources/TerminalStrip/ui/freeterminalmodel.h | 1 + .../TerminalStrip/ui/terminalstripeditor.cpp | 43 +++++++++------ .../TerminalStrip/ui/terminalstripeditor.h | 8 +-- .../ui/terminalstripeditorwindow.cpp | 17 ++++-- .../ui/terminalstripeditorwindow.h | 5 +- .../ui/terminalstriptreedockwidget.cpp | 34 ++++++++++-- .../ui/terminalstriptreedockwidget.h | 4 +- 10 files changed, 159 insertions(+), 48 deletions(-) diff --git a/sources/TerminalStrip/ui/freeterminaleditor.cpp b/sources/TerminalStrip/ui/freeterminaleditor.cpp index 2f41c6a24..7f5393fb7 100644 --- a/sources/TerminalStrip/ui/freeterminaleditor.cpp +++ b/sources/TerminalStrip/ui/freeterminaleditor.cpp @@ -32,16 +32,20 @@ */ FreeTerminalEditor::FreeTerminalEditor(QETProject *project, QWidget *parent) : QWidget(parent), - ui(new Ui::FreeTerminalEditor), - m_project(project) + ui(new Ui::FreeTerminalEditor), + m_project(project) { ui->setupUi(this); ui->m_table_view->setItemDelegate(new FreeTerminalModelDelegate(ui->m_table_view)); - m_model = new FreeTerminalModel(m_project, this); + m_model = new FreeTerminalModel(m_project, this); ui->m_table_view->setModel(m_model); ui->m_table_view->setCurrentIndex(m_model->index(0,0)); + if (m_project) { + connect(m_project, &QObject::destroyed, this, &FreeTerminalEditor::reload); + } + //Disabled the move if the table is currently edited (yellow cell) connect(m_model, &FreeTerminalModel::dataChanged, this, [=] { this->setDisabledMove(); @@ -135,6 +139,31 @@ void FreeTerminalEditor::apply() reload(); } +/** + * @brief FreeTerminalEditor::setProject + * Set @project as project handled by this editor. + * If a previous project was setted, everything is clear. + * This function track the destruction of the project, + * that mean if the project pointer is deleted + * no need to call this function with a nullptr, + * everything is made inside this class. + * @param project + */ +void FreeTerminalEditor::setProject(QETProject *project) +{ + if(m_project) { + disconnect(m_project, &QObject::destroyed, this, &FreeTerminalEditor::reload); + } + m_project = project; + if (m_model) { + m_model->setProject(project); + } + if (m_project) { + connect(m_project, &QObject::destroyed, this, &FreeTerminalEditor::reload); + } + reload(); +} + void FreeTerminalEditor::on_m_type_cb_activated(int index) { if (m_model) diff --git a/sources/TerminalStrip/ui/freeterminaleditor.h b/sources/TerminalStrip/ui/freeterminaleditor.h index a185a109e..6c1455d03 100644 --- a/sources/TerminalStrip/ui/freeterminaleditor.h +++ b/sources/TerminalStrip/ui/freeterminaleditor.h @@ -19,8 +19,8 @@ #define FREETERMINALEDITOR_H #include +#include "../../qetproject.h" -class QETProject; class RealTerminal; class FreeTerminalModel; class QTableView; @@ -40,6 +40,8 @@ class FreeTerminalEditor : public QWidget void reload(); void apply(); + void setProject(QETProject *project); + private slots: void on_m_type_cb_activated(int index); void on_m_function_cb_activated(int index); @@ -52,7 +54,7 @@ class FreeTerminalEditor : public QWidget private: Ui::FreeTerminalEditor *ui; - QETProject *m_project = nullptr; - FreeTerminalModel *m_model = nullptr; + QPointer m_project; + FreeTerminalModel *m_model {nullptr}; }; #endif // FREETERMINALEDITOR_H diff --git a/sources/TerminalStrip/ui/freeterminalmodel.cpp b/sources/TerminalStrip/ui/freeterminalmodel.cpp index 426b60e07..d3b59ef05 100644 --- a/sources/TerminalStrip/ui/freeterminalmodel.cpp +++ b/sources/TerminalStrip/ui/freeterminalmodel.cpp @@ -56,10 +56,30 @@ FreeTerminalModel::Column FreeTerminalModel::columnTypeForIndex(const QModelInde * @param parent */ FreeTerminalModel::FreeTerminalModel(QETProject *project, QObject *parent) : - QAbstractTableModel(parent), - m_project(project) + QAbstractTableModel(parent) { + setProject(project); +} + +/** + * @brief FreeTerminalModel::setProject + * Set @project as project handled by this model. + * If a previous project was setted, everything is clear. + * This function track the destruction of the project, + * that mean if the project pointer is deleted + * no need to call this function with a nullptr, + * everything is made inside this class. + * @param project + */ +void FreeTerminalModel::setProject(QETProject *project) { - fillTerminalVector(); + if(m_project) { + disconnect(m_project, &QObject::destroyed, this, &FreeTerminalModel::clear); + } + m_project = project; + if (m_project) { + connect(m_project, &QObject::destroyed, this, &FreeTerminalModel::clear); + } + clear(); } /** @@ -305,20 +325,22 @@ QVector > FreeTerminalModel::realTerminalForIndex(c */ void FreeTerminalModel::fillTerminalVector() { - ElementProvider provider_(m_project); - auto free_terminal_vector = provider_.freeTerminal(); + if (m_project) { + ElementProvider provider_(m_project); + auto free_terminal_vector = provider_.freeTerminal(); - std::sort(free_terminal_vector.begin(), free_terminal_vector.end(), - [](TerminalElement *a, TerminalElement *b) - { - return QETUtils::sortBeginIntString(a->elementData().m_informations.value(QETInformation::ELMT_LABEL).toString(), - b->elementData().m_informations.value(QETInformation::ELMT_LABEL).toString()); - }); + std::sort(free_terminal_vector.begin(), free_terminal_vector.end(), + [](TerminalElement *a, TerminalElement *b) + { + return QETUtils::sortBeginIntString(a->elementData().m_informations.value(QETInformation::ELMT_LABEL).toString(), + b->elementData().m_informations.value(QETInformation::ELMT_LABEL).toString()); + }); - for (const auto &terminal_ : free_terminal_vector) { - m_terminal_vector.append(terminal_->realTerminal()); - m_real_t_data.append(modelRealTerminalData::data(terminal_->realTerminal())); - } + for (const auto &terminal_ : free_terminal_vector) { + m_terminal_vector.append(terminal_->realTerminal()); + m_real_t_data.append(modelRealTerminalData::data(terminal_->realTerminal())); + } + } } /**************************************************************** diff --git a/sources/TerminalStrip/ui/freeterminalmodel.h b/sources/TerminalStrip/ui/freeterminalmodel.h index 5d13cafc4..bc64dd0dd 100644 --- a/sources/TerminalStrip/ui/freeterminalmodel.h +++ b/sources/TerminalStrip/ui/freeterminalmodel.h @@ -47,6 +47,7 @@ class FreeTerminalModel : public QAbstractTableModel public: explicit FreeTerminalModel(QETProject *project, QObject *parent = nullptr); + void setProject(QETProject *project); int rowCount(const QModelIndex &parent) const override; int columnCount(const QModelIndex &parent) const override; diff --git a/sources/TerminalStrip/ui/terminalstripeditor.cpp b/sources/TerminalStrip/ui/terminalstripeditor.cpp index a2ff47b99..d65d1c128 100644 --- a/sources/TerminalStrip/ui/terminalstripeditor.cpp +++ b/sources/TerminalStrip/ui/terminalstripeditor.cpp @@ -84,6 +84,12 @@ TerminalStripEditor::~TerminalStripEditor() { delete ui; } +void TerminalStripEditor::setProject(QETProject *project) +{ + m_project = project; + setCurrentStrip(nullptr); +} + /** * @brief TerminalStripEditor::setCurrentStrip * Set the current terminal strip edited to \p strip_ @@ -98,27 +104,15 @@ void TerminalStripEditor::setCurrentStrip(TerminalStrip *strip_) if (m_current_strip) { disconnect(m_current_strip, &TerminalStrip::orderChanged, this, &TerminalStripEditor::reload); disconnect(m_current_strip, &TerminalStrip::bridgeChanged, this, &TerminalStripEditor::reload); + disconnect(m_current_strip, &QObject::destroyed, this, &TerminalStripEditor::clear); } ui->m_move_to_cb->clear(); - if (!strip_) - { - ui->m_installation_le ->clear(); - ui->m_location_le ->clear(); - ui->m_name_le ->clear(); - ui->m_comment_le ->clear(); - ui->m_description_te ->clear(); - m_current_strip = nullptr; - - ui->m_table_widget->setModel(nullptr); - if (m_model) { - m_model->deleteLater(); - m_model = nullptr; - } + if (!strip_) { + clear(); } - else - { + else { ui->m_installation_le ->setText(strip_->installation()); ui->m_location_le ->setText(strip_->location()); ui->m_name_le ->setText(strip_->name()); @@ -159,6 +153,7 @@ void TerminalStripEditor::setCurrentStrip(TerminalStrip *strip_) connect(m_current_strip, &TerminalStrip::orderChanged, this, &TerminalStripEditor::reload); connect(m_current_strip, &TerminalStrip::bridgeChanged, this, &TerminalStripEditor::reload); + connect(m_current_strip, &QObject::destroyed, this, &TerminalStripEditor::clear); } } @@ -230,6 +225,22 @@ void TerminalStripEditor::apply() reload(); } +void TerminalStripEditor::clear() +{ + ui->m_installation_le ->clear(); + ui->m_location_le ->clear(); + ui->m_name_le ->clear(); + ui->m_comment_le ->clear(); + ui->m_description_te ->clear(); + m_current_strip.clear(); + + ui->m_table_widget->setModel(nullptr); + if (m_model) { + m_model->deleteLater(); + m_model = nullptr; + } +} + /** * @brief TerminalStripEditor::spanMultiLevelTerminals * Span row of m_table_widget for multi-level terminal diff --git a/sources/TerminalStrip/ui/terminalstripeditor.h b/sources/TerminalStrip/ui/terminalstripeditor.h index 5ca482892..f7f839957 100644 --- a/sources/TerminalStrip/ui/terminalstripeditor.h +++ b/sources/TerminalStrip/ui/terminalstripeditor.h @@ -41,11 +41,13 @@ class TerminalStripEditor : public QWidget public: explicit TerminalStripEditor(QETProject *project, QWidget *parent = nullptr); ~TerminalStripEditor() override; + void setProject(QETProject *project); void setCurrentStrip(TerminalStrip *strip_); void reload(); void apply(); private: + void clear(); void spanMultiLevelTerminals(); void selectionChanged(); QSize setUpBridgeCellWidth(); @@ -67,9 +69,9 @@ class TerminalStripEditor : public QWidget private: Ui::TerminalStripEditor *ui; - QETProject *m_project {nullptr}; - TerminalStrip *m_current_strip {nullptr}; - TerminalStripModel *m_model {nullptr}; + QPointer m_project; + QPointer m_current_strip; + TerminalStripModel *m_model {nullptr}; }; #endif // TERMINALSTRIPEDITOR_H diff --git a/sources/TerminalStrip/ui/terminalstripeditorwindow.cpp b/sources/TerminalStrip/ui/terminalstripeditorwindow.cpp index 24a826ea7..7ec4d3c41 100644 --- a/sources/TerminalStrip/ui/terminalstripeditorwindow.cpp +++ b/sources/TerminalStrip/ui/terminalstripeditorwindow.cpp @@ -51,8 +51,8 @@ void TerminalStripEditorWindow::edit(TerminalStrip *strip) TerminalStripEditorWindow::TerminalStripEditorWindow(QETProject *project, QWidget *parent) : QMainWindow(parent), - ui(new Ui::TerminalStripEditorWindow), - m_project(project) + ui(new Ui::TerminalStripEditorWindow), + m_project(project) { ui->setupUi(this); ui->m_remove_terminal->setDisabled(true); @@ -76,6 +76,18 @@ TerminalStripEditorWindow::~TerminalStripEditorWindow() delete ui; } +/** + * @brief TerminalStripEditorWindow::setProject + * @param project + */ +void TerminalStripEditorWindow::setProject(QETProject *project) +{ + m_project = project; + m_tree_dock->setProject(project); + m_free_terminal_editor->setProject(project); + m_terminal_strip_editor->setProject(project); +} + void TerminalStripEditorWindow::setCurrentStrip(TerminalStrip *strip) { m_tree_dock->setSelectedStrip(strip); } @@ -200,4 +212,3 @@ void TerminalStripEditorWindow::on_m_button_box_clicked(QAbstractButton *button) void TerminalStripEditorWindow::on_m_stacked_widget_currentChanged(int arg1) { ui->m_button_box->setHidden(arg1 == EMPTY_PAGE); } - diff --git a/sources/TerminalStrip/ui/terminalstripeditorwindow.h b/sources/TerminalStrip/ui/terminalstripeditorwindow.h index b303d5c35..5ae4a8288 100644 --- a/sources/TerminalStrip/ui/terminalstripeditorwindow.h +++ b/sources/TerminalStrip/ui/terminalstripeditorwindow.h @@ -51,6 +51,8 @@ class TerminalStripEditorWindow : public QMainWindow if (!window_) window_ = new TerminalStripEditorWindow{project, parent}; mutex_.unlock(); + } else { + window_->setProject(project); } return window_; } @@ -71,6 +73,7 @@ class TerminalStripEditorWindow : public QMainWindow explicit TerminalStripEditorWindow(QETProject *project, QWidget *parent = nullptr); ~TerminalStripEditorWindow(); + void setProject(QETProject *project); void setCurrentStrip(TerminalStrip *strip); private slots: @@ -87,7 +90,7 @@ class TerminalStripEditorWindow : public QMainWindow private: Ui::TerminalStripEditorWindow *ui{nullptr}; - QETProject *m_project {nullptr}; + QPointer m_project; TerminalStripTreeDockWidget *m_tree_dock{nullptr}; FreeTerminalEditor *m_free_terminal_editor {nullptr}; TerminalStripEditor *m_terminal_strip_editor {nullptr}; diff --git a/sources/TerminalStrip/ui/terminalstriptreedockwidget.cpp b/sources/TerminalStrip/ui/terminalstriptreedockwidget.cpp index 360d4190d..2e5a5922f 100644 --- a/sources/TerminalStrip/ui/terminalstriptreedockwidget.cpp +++ b/sources/TerminalStrip/ui/terminalstriptreedockwidget.cpp @@ -30,11 +30,10 @@ TerminalStripTreeDockWidget::TerminalStripTreeDockWidget(QETProject *project, QWidget *parent) : QDockWidget(parent), - ui(new Ui::TerminalStripTreeDockWidget), - m_project(project) + ui(new Ui::TerminalStripTreeDockWidget) { ui->setupUi(this); - buildTree(); + setProject(project); #if QT_VERSION >= QT_VERSION_CHECK(5, 13, 0) ui->m_tree_view->expandRecursively(ui->m_tree_view->rootIndex()); @@ -48,6 +47,32 @@ TerminalStripTreeDockWidget::~TerminalStripTreeDockWidget() delete ui; } +/** + * @brief TerminalStripTreeDockWidget::setProject + * Set @project as project handled by this tree dock. + * If a previous project was setted, everything is clear. + * This function track the destruction of the project, + * that mean if the project pointer is deleted + * no need to call this function with a nullptr, + * everything is made inside this class. + * @param project + */ +void TerminalStripTreeDockWidget::setProject(QETProject *project) +{ + if(m_project && m_project_destroy_connection) { + disconnect(m_project_destroy_connection); + } + m_project = project; + if (m_project) { + m_project_destroy_connection = connect(m_project, &QObject::destroyed, [this](){ + this->m_current_strip.clear(); + this->reload(); + }); + } + m_current_strip.clear(); + reload(); +} + /** * @brief TerminalStripTreeDockWidget::reload */ @@ -205,6 +230,9 @@ void TerminalStripTreeDockWidget::on_m_tree_view_currentItemChanged(QTreeWidgetI */ void TerminalStripTreeDockWidget::buildTree() { + if(!m_project) { + return; + } auto title_ = m_project->title(); if (title_.isEmpty()) { diff --git a/sources/TerminalStrip/ui/terminalstriptreedockwidget.h b/sources/TerminalStrip/ui/terminalstriptreedockwidget.h index 6fdbb1ee1..327bca079 100644 --- a/sources/TerminalStrip/ui/terminalstriptreedockwidget.h +++ b/sources/TerminalStrip/ui/terminalstriptreedockwidget.h @@ -49,6 +49,7 @@ class TerminalStripTreeDockWidget : public QDockWidget explicit TerminalStripTreeDockWidget(QETProject *project, QWidget *parent = nullptr); ~TerminalStripTreeDockWidget(); + void setProject(QETProject *project = nullptr); void reload(); bool currentIsStrip() const; TerminalStrip* currentStrip() const; @@ -78,7 +79,8 @@ class TerminalStripTreeDockWidget : public QDockWidget QHash> m_uuid_terminal_H; QHash> m_uuid_strip_H; QVector m_strip_changed_connection; - bool m_current_is_free_terminal{false}; + bool m_current_is_free_terminal{false}; + QMetaObject::Connection m_project_destroy_connection; }; #endif // TERMINALSTRIPTREEDOCKWIDGET_H From a2ae8255aca9759df407e2db637522b0e5d230ba Mon Sep 17 00:00:00 2001 From: joshua Date: Tue, 1 Jul 2025 22:46:18 +0200 Subject: [PATCH 10/65] Minor fix During the development, we saved some terminal strip with "phantom" terminal (terminal added to the strip and after the terminal was removed from the project but keep in the terminal strip data) and this mistake was saved in the xml. When we open this project the phantom terminal don't appear in the layout but the empty physical terminal is still here in the terminal strip data because the position of the terminals in the strip is wrong (sometime bigger than the size of the strip, sometime with a gap, sometime don't start at 0). This commit fix this mistake when we open a project. --- sources/TerminalStrip/terminalstrip.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/sources/TerminalStrip/terminalstrip.cpp b/sources/TerminalStrip/terminalstrip.cpp index 839a5493e..8d469cc3b 100644 --- a/sources/TerminalStrip/terminalstrip.cpp +++ b/sources/TerminalStrip/terminalstrip.cpp @@ -1037,8 +1037,10 @@ bool TerminalStrip::fromXml(QDomElement &xml_element) } } - auto raw_ptr = new PhysicalTerminal(this, real_t_vector); - m_physical_terminals.append(raw_ptr->sharedRef()); + if (!real_t_vector.isEmpty()) { + auto raw_ptr = new PhysicalTerminal(this, real_t_vector); + m_physical_terminals.append(raw_ptr->sharedRef()); + } } } From a121fbe53073583f78ccd072215855fe1018b997 Mon Sep 17 00:00:00 2001 From: joshua Date: Tue, 1 Jul 2025 23:37:16 +0200 Subject: [PATCH 11/65] Add undo / redo command The undo/redo command of diagram editor is shared to the terminal strip editor. --- sources/TerminalStrip/ui/terminalstripeditorwindow.cpp | 5 +++++ sources/TerminalStrip/ui/terminalstripeditorwindow.ui | 4 ++-- sources/qetdiagrameditor.h | 2 ++ 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/sources/TerminalStrip/ui/terminalstripeditorwindow.cpp b/sources/TerminalStrip/ui/terminalstripeditorwindow.cpp index 7ec4d3c41..923f1372f 100644 --- a/sources/TerminalStrip/ui/terminalstripeditorwindow.cpp +++ b/sources/TerminalStrip/ui/terminalstripeditorwindow.cpp @@ -55,6 +55,11 @@ TerminalStripEditorWindow::TerminalStripEditorWindow(QETProject *project, QWidge m_project(project) { ui->setupUi(this); + if (auto diagram_editor = QETApp::diagramEditor(project)) { + ui->m_tool_bar->addSeparator(); + ui->m_tool_bar->addAction(diagram_editor->undo); + ui->m_tool_bar->addAction(diagram_editor->redo); + } ui->m_remove_terminal->setDisabled(true); addTreeDockWidget(); diff --git a/sources/TerminalStrip/ui/terminalstripeditorwindow.ui b/sources/TerminalStrip/ui/terminalstripeditorwindow.ui index 43cb3eaa7..f390f33cf 100644 --- a/sources/TerminalStrip/ui/terminalstripeditorwindow.ui +++ b/sources/TerminalStrip/ui/terminalstripeditorwindow.ui @@ -33,12 +33,12 @@ 0 0 1364 - 21 + 23 - + toolBar diff --git a/sources/qetdiagrameditor.h b/sources/qetdiagrameditor.h index 2257d6688..72ac24d8a 100644 --- a/sources/qetdiagrameditor.h +++ b/sources/qetdiagrameditor.h @@ -54,6 +54,8 @@ class KAutoSaveFile; class QETDiagramEditor : public QETMainWindow { Q_OBJECT + + friend class TerminalStripEditorWindow; public: QETDiagramEditor( From 74b55f3bf50571f69992eff5e490e9eb46080710 Mon Sep 17 00:00:00 2001 From: joshua Date: Thu, 24 Jul 2025 22:24:15 +0200 Subject: [PATCH 12/65] Disable deletion if a terminal can't be deleted. In case of user try to delete a terminal element who is bridged or belong to a physical terminal with more than one level, the deletion is aborted to avoid mistake in the terminal strip parent of the terminal element. A dialog is opened when the deletion can't be to explain to user what to do for enable the deletion. --- sources/diagramcontent.cpp | 10 +++++- sources/diagramcontent.h | 3 ++ sources/qetdiagrameditor.cpp | 21 ++++++++---- .../deleteqgraphicsitemcommand.cpp | 32 +++++++++++++++++++ .../undocommand/deleteqgraphicsitemcommand.h | 2 +- 5 files changed, 60 insertions(+), 8 deletions(-) diff --git a/sources/diagramcontent.cpp b/sources/diagramcontent.cpp index 398013c83..3ea10715a 100644 --- a/sources/diagramcontent.cpp +++ b/sources/diagramcontent.cpp @@ -59,7 +59,15 @@ DiagramContent::DiagramContent(Diagram *diagram, bool selected) : { switch (item->type()) { - case Element::Type: { m_elements << qgraphicsitem_cast(item); break;} + case Element::Type: + { + auto element = qgraphicsitem_cast(item); + m_elements << element; + if (element->elementData().m_type == ElementData::Terminale) { + m_terminal_elements << static_cast(element); + } + break; + } case IndependentTextItem::Type: { m_text_fields << qgraphicsitem_cast(item); break;} case Conductor::Type: { diff --git a/sources/diagramcontent.h b/sources/diagramcontent.h index 1525fbedc..1eff2ed55 100644 --- a/sources/diagramcontent.h +++ b/sources/diagramcontent.h @@ -21,6 +21,8 @@ #include #include +#include "../qetgraphicsitem/terminalelement.h" + class QGraphicsItem; class Conductor; class Element; @@ -81,6 +83,7 @@ class DiagramContent QList m_selected_items; QVector m_tables; QVector m_terminal_strip; + QVector> m_terminal_elements; QList selectedTexts() const; diff --git a/sources/qetdiagrameditor.cpp b/sources/qetdiagrameditor.cpp index 5e7c3982a..c94e92c91 100644 --- a/sources/qetdiagrameditor.cpp +++ b/sources/qetdiagrameditor.cpp @@ -1468,12 +1468,21 @@ void QETDiagramEditor::selectionGroupTriggered(QAction *action) if (!dv || value.isEmpty()) return; - if (value == "delete_selection") - { - diagram->clearSelection(); - diagram->undoStack().push(new DeleteQGraphicsItemCommand(diagram, dc)); - dv->adjustSceneRect(); - } + if (value == "delete_selection") + { + if (DeleteQGraphicsItemCommand::hasNonDeletableTerminal(dc)) { + QET::QetMessageBox::information(this, + tr("Suppression de borne impossible"), + tr("La suppression ne peut être effectué car la selection " + "possède une ou plusieurs bornes ponté et/ou appartenant à une borne à niveau multiple.\n" + "Déponter et/ou supprimer les niveaux des bornes concerné " + "afin de pouvoir les supprimer")); + } else { + diagram->clearSelection(); + diagram->undoStack().push(new DeleteQGraphicsItemCommand(diagram, dc)); + dv->adjustSceneRect(); + } + } else if (value == "rotate_selection") { RotateSelectionCommand *c = new RotateSelectionCommand(diagram); diff --git a/sources/undocommand/deleteqgraphicsitemcommand.cpp b/sources/undocommand/deleteqgraphicsitemcommand.cpp index 24e407b17..074a04607 100644 --- a/sources/undocommand/deleteqgraphicsitemcommand.cpp +++ b/sources/undocommand/deleteqgraphicsitemcommand.cpp @@ -28,6 +28,8 @@ #include "../qetgraphicsitem/elementtextitemgroup.h" #include "../qetgraphicsitem/terminal.h" #include "addelementtextcommand.h" +#include "../TerminalStrip/realterminal.h" +#include "../TerminalStrip/physicalterminal.h" /** @brief DeleteQGraphicsItemCommand::DeleteQGraphicsItemCommand @@ -115,6 +117,36 @@ DeleteQGraphicsItemCommand::~DeleteQGraphicsItemCommand() m_diagram->qgiManager().release(m_removed_contents.items(DiagramContent::All)); } +/** + * @brief DeleteQGraphicsItemCommand::hasNonDeletableTerminal + * Return true if @content have terminal element which can't be deleted. + * The reason why a terminal can't be deleted is because they have bridge + * or belong to a physical terminal with more than one level. + * @param diagram + * @param content + * @param dialog + * @return + */ +bool DeleteQGraphicsItemCommand::hasNonDeletableTerminal(const DiagramContent &content) +{ + if (!content.m_terminal_elements.isEmpty()) + { + for (const auto &terminal : content.m_terminal_elements) + { + if (!terminal.isNull()) + { + if (terminal->parentTerminalStrip() + && (terminal->realTerminal()->isBridged() + || terminal->realTerminal()->physicalTerminal()->levelCount() != 1)) { + return true; + } + } + } + } + + return false; +} + /** @brief DeleteQGraphicsItemCommand::setPotentialsOfRemovedElements This function creates new conductors (if needed) for conserve the electrical potentials diff --git a/sources/undocommand/deleteqgraphicsitemcommand.h b/sources/undocommand/deleteqgraphicsitemcommand.h index 370d1565c..53bb4d091 100644 --- a/sources/undocommand/deleteqgraphicsitemcommand.h +++ b/sources/undocommand/deleteqgraphicsitemcommand.h @@ -34,10 +34,10 @@ class DeleteQGraphicsItemCommand : public QUndoCommand public: DeleteQGraphicsItemCommand(Diagram *diagram, const DiagramContent &content, QUndoCommand * parent = nullptr); ~DeleteQGraphicsItemCommand() override; + static bool hasNonDeletableTerminal(const DiagramContent &content); private: DeleteQGraphicsItemCommand(const DeleteQGraphicsItemCommand &); - void setPotentialsOfRemovedElements(); Terminal *terminalInSamePotential(Terminal *terminal, Conductor *conductor_to_exclude); From f20ea041b6c0651b9d761debea759a094ca52e7c Mon Sep 17 00:00:00 2001 From: achim Date: Sat, 2 Aug 2025 22:16:12 +0200 Subject: [PATCH 13/65] correcting the visibility of Variables in CompositeText When using composite text in report elements, the name of the variable was displayed when inserting the reportElement into the drawing (e.g. %{function}). This is corrected here. Add missing variables to assignvariables.cpp --- sources/autoNum/assignvariables.cpp | 13 +++++++++---- .../qetgraphicsitem/dynamicelementtextitem.cpp | 18 ++++++++++++++++++ 2 files changed, 27 insertions(+), 4 deletions(-) diff --git a/sources/autoNum/assignvariables.cpp b/sources/autoNum/assignvariables.cpp index 8c97625eb..e69ead7f7 100644 --- a/sources/autoNum/assignvariables.cpp +++ b/sources/autoNum/assignvariables.cpp @@ -221,11 +221,12 @@ namespace autonum str.replace("%{designation}", dc.value("designation").toString()); str.replace("%{manufacturer}", dc.value("manufacturer").toString()); str.replace("%{manufacturer_reference}", - dc.value("manufacturer_reference").toString()); + dc.value("manufacturer_reference").toString()); str.replace("%{supplier}", dc.value("supplier").toString()); str.replace("%{quantity}", dc.value("quantity").toString()); str.replace("%{unity}", dc.value("unity").toString()); - str.replace("%{auxiliary1}", dc.value("auxiliary1").toString()); + + str.replace("%{auxiliary1}", dc.value("auxiliary1").toString()); str.replace("%{description_auxiliary1}", dc.value("description_auxiliary1").toString()); str.replace("%{designation_auxiliary1}", dc.value("designation_auxiliary1").toString()); str.replace("%{manufacturer_auxiliary1}", dc.value("manufacturer_auxiliary1").toString()); @@ -264,10 +265,14 @@ namespace autonum str.replace("%{unity_auxiliary4}", dc.value("unity_auxiliary4").toString()); - str.replace("%{machine_manufacturer_reference}", - dc.value("machine_manufacturer_reference").toString()); + str.replace("%{machine_manufacturer_reference}", dc.value("machine_manufacturer_reference").toString()); + str.replace("%{location}", dc.value("location").toString()); str.replace("%{function}", dc.value("function").toString()); + str.replace("%{tension_protocol}", dc.value("tension_protocol").toString()); + str.replace("%{conductor_section}", dc.value("conductor_section").toString()); + str.replace("%{conductor_color}", dc.value("conductor_color").toString()); + str.replace("%{void}", QString()); return str; diff --git a/sources/qetgraphicsitem/dynamicelementtextitem.cpp b/sources/qetgraphicsitem/dynamicelementtextitem.cpp index 41a2474bd..63dee4fea 100644 --- a/sources/qetgraphicsitem/dynamicelementtextitem.cpp +++ b/sources/qetgraphicsitem/dynamicelementtextitem.cpp @@ -1212,6 +1212,12 @@ QString DynamicElementTextItem::reportReplacedCompositeText() const label = autonum::AssignVariables::formulaToLabel(label, elmt->rSequenceStruct(), elmt->diagram(), elmt); string.replace("%{label}", label); } + // if element is not linked, replace an empty string + else + { + string.replace("%{label}", ""); + } + if (m_watched_conductor) { if(string.contains("%{function}")) @@ -1223,6 +1229,18 @@ QString DynamicElementTextItem::reportReplacedCompositeText() const if(string.contains("%{conductor_section}")) string.replace("%{conductor_section}", m_watched_conductor.data()->properties().m_wire_section); } + // if no conductor is connected, replace an empty String + else + { + if(string.contains("%{function}")) + string.replace("%{function}", ""); + if(string.contains("%{tension_protocol}")) + string.replace("%{tension_protocol}", ""); + if(string.contains("%{conductor_color}")) + string.replace("%{conductor_color}", ""); + if(string.contains("%{conductor_section}")) + string.replace("%{conductor_section}", ""); + } } return string; From 0a6efa466ee6df17c7e70782ae414f13b85110a8 Mon Sep 17 00:00:00 2001 From: achim Date: Sat, 2 Aug 2025 23:27:09 +0200 Subject: [PATCH 14/65] Correcting dynamicElementTextItem alignment on copying When copying and pasting selected areas, right-aligned dynamic text in report and slave elements was not displayed correctly. The text insertion point was always shifted to the left by the text width. To correct this, the insertion point of dynamicElementTextItems is reset to its origin insertion point before writing to clipboard. --- sources/diagram.cpp | 91 ++++++++++++++++++++++++++++++++++++++++- sources/diagram.h | 4 +- sources/diagramview.cpp | 2 +- 3 files changed, 93 insertions(+), 4 deletions(-) diff --git a/sources/diagram.cpp b/sources/diagram.cpp index 79a945a8e..6ee509aa5 100644 --- a/sources/diagram.cpp +++ b/sources/diagram.cpp @@ -762,10 +762,12 @@ QList < QSet > Diagram::potentials() represent the entire schema or only the selected content \~French Booleen (a vrai par defaut) indiquant si le XML genere doit representer l'integralite du schema ou seulement le contenu selectionne + \~ @param is_copy_command: + Boolean (false by default) indicating if function is called by an copy command \~ @return An XML Document (QDomDocument) \~French Un Document XML (QDomDocument) */ -QDomDocument Diagram::toXml(bool whole_content) { +QDomDocument Diagram::toXml(bool whole_content, bool is_copy_command) { // document QDomDocument document; @@ -912,8 +914,13 @@ QDomDocument Diagram::toXml(bool whole_content) { { case Element::Type: { auto elmt = static_cast(qgi); - if (whole_content || elmt->isSelected()) + if (whole_content || elmt->isSelected()){ + // For a copy/paste command, the text positions must be recalculated for + // correct text alignment, before it is saved to the clipboard + if(is_copy_command && (elmt->linkType() == Element::Slave || elmt->linkType()&Element::AllReport)) + correctTextPos(elmt); list_elements << elmt; + } break; } case Conductor::Type: { @@ -973,6 +980,9 @@ QDomDocument Diagram::toXml(bool whole_content) { for (auto elmt : list_elements) { dom_elements.appendChild(elmt->toXml(document, table_adr_id)); + // If copy is active we have to undo the changes we have made during creating(filling) 'list_elements' + if(is_copy_command && (elmt->linkType() == Element::Slave || elmt->linkType()&Element::AllReport)) + restoreText(elmt); } dom_root.appendChild(dom_elements); } @@ -2472,3 +2482,80 @@ bool Diagram::canRotateSelection() const return false; } +/* + * To copy elements with right-aligned or centered elementtext, the text position + of dynamicElementTextItems in report- and slave elements must be reset + to the original insert position bevor writing to clipboard. + It is only necessary for right-aligned and centered texts, + but we do it for all, because it has no influence on other texts. +*/ +/** + @brief Diagram::correctTextPos + set insertion position to the original insertion position of the element texts before copying + @param Element +*/ +void Diagram::correctTextPos(Element* elmt) +{ + for (auto deti : elmt->dynamicTextItems()){ + if( deti->textFrom() == DynamicElementTextItem::ElementInfo || + deti->textFrom() == DynamicElementTextItem::CompositeText) { + + if (deti->text().isEmpty()){ + deti->setText(deti->toPlainText()); + } + // block alignment calculation + deti->m_block_alignment = true; + deti->setPlainText(deti->text()); + // release the alignment calculation + deti->m_block_alignment = false; + // writing an empty string sets the insertion point + // to the original insertion point + deti->setPlainText(""); + } + } + // same for textgroups + for (auto group : elmt->textGroups()){ + for(DynamicElementTextItem *deti : group->texts()){ + if( deti->textFrom() == DynamicElementTextItem::ElementInfo || + deti->textFrom() == DynamicElementTextItem::CompositeText) { + if (deti->text().isEmpty()){ + deti->setText(deti->toPlainText()); + } + deti->m_block_alignment = true; + deti->setPlainText(deti->text()); + deti->m_block_alignment = false; + deti->setPlainText(""); + } + } + } +} + +/* + * After changing the element texts for copying, the element texts has to be restored. + */ +/** + @brief Diagram::restoreText + After correcting the elementtext position during copying + the Text has to be restored + @param Element +*/ +void Diagram::restoreText(Element* elmt) +{ + for (auto deti : elmt->dynamicTextItems()){ + if( deti->textFrom() == DynamicElementTextItem::ElementInfo || + deti->textFrom() == DynamicElementTextItem::CompositeText) + { + deti->setPlainText(deti->text()); + } + } + + for (auto group : elmt->textGroups()){ + for(DynamicElementTextItem *deti : group->texts()){ + if( deti->textFrom() == DynamicElementTextItem::ElementInfo || + deti->textFrom() == DynamicElementTextItem::CompositeText) + { + deti->setPlainText(deti->text()); + } + } + } +} diff --git a/sources/diagram.h b/sources/diagram.h index 452c52a24..3c421e36f 100644 --- a/sources/diagram.h +++ b/sources/diagram.h @@ -142,6 +142,8 @@ class Diagram : public QGraphicsScene void wheelEvent (QGraphicsSceneWheelEvent *event) override; void keyPressEvent (QKeyEvent *event) override; void keyReleaseEvent (QKeyEvent *) override; + void correctTextPos(Element* elmt); + void restoreText(Element* elmt); public: QUuid uuid(); @@ -167,7 +169,7 @@ class Diagram : public QGraphicsScene QList < QSet > potentials(); // methods related to XML import/export - QDomDocument toXml(bool = true); + QDomDocument toXml(bool wholeContent = true, bool is_copy_command = false); bool initFromXml(QDomElement &, QPointF = QPointF(), bool = true, diff --git a/sources/diagramview.cpp b/sources/diagramview.cpp index 73dcb018a..cacefcd1d 100644 --- a/sources/diagramview.cpp +++ b/sources/diagramview.cpp @@ -391,7 +391,7 @@ void DiagramView::cut() void DiagramView::copy() { QClipboard *presse_papier = QApplication::clipboard(); - QString contenu_presse_papier = m_diagram -> toXml(false).toString(4); + QString contenu_presse_papier = m_diagram -> toXml(false, true).toString(4); if (presse_papier -> supportsSelection()) presse_papier -> setText(contenu_presse_papier, QClipboard::Selection); presse_papier -> setText(contenu_presse_papier); } From 96d84bf85293bec5c170fae1b720fab3927a3e22 Mon Sep 17 00:00:00 2001 From: achim Date: Sun, 3 Aug 2025 00:21:20 +0200 Subject: [PATCH 15/65] Better handling of conductors when creating from XML The position of a conductor is determined by the two terminals the conductor connects. Therefore, it makes no sense to set the position with 'setPos()'. It is better to first load all elements (but not the conductors), position them if necessary, and only then load the conductors and assign them to the elements (terminals). --- sources/diagram.cpp | 55 ++++++++++++++++++++++----------------------- 1 file changed, 27 insertions(+), 28 deletions(-) diff --git a/sources/diagram.cpp b/sources/diagram.cpp index 6ee509aa5..41996cf06 100644 --- a/sources/diagram.cpp +++ b/sources/diagram.cpp @@ -1438,33 +1438,6 @@ bool Diagram::fromXml(QDomElement &document, added_shapes << dii; } - // Load conductor - QList added_conductors; - for (auto f : QET::findInDomElement(root, - QStringLiteral("conductors"), - QStringLiteral("conductor"))) - { - if (!Conductor::valideXml(f)) continue; - - //Check if terminal that conductor must be linked is know - - Terminal* p1 = findTerminal(1, f, table_adr_id, added_elements); - Terminal* p2 = findTerminal(2, f, table_adr_id, added_elements); - - if (p1 && p2 && p1 != p2) - { - Conductor *c = new Conductor(p1, p2); - if (c->isValid()) - { - addItem(c); - c -> fromXml(f); - added_conductors << c; - } - else - delete c; - } - } - //Load tables QVector added_tables; for (const auto &dom_table : QETXML::subChild(root, @@ -1485,7 +1458,6 @@ bool Diagram::fromXml(QDomElement &document, { QVector added_items; for (auto element : qAsConst(added_elements )) added_items << element; - for (auto cond : qAsConst(added_conductors )) added_items << cond; for (auto shape : qAsConst(added_shapes )) added_items << shape; for (auto text : qAsConst(added_texts )) added_items << text; for (auto image : qAsConst(added_images )) added_items << image; @@ -1510,6 +1482,33 @@ bool Diagram::fromXml(QDomElement &document, qgi->setPos(qgi->pos() += pos_); } + // Load conductor + QList added_conductors; + for (auto f : QET::findInDomElement(root, + QStringLiteral("conductors"), + QStringLiteral("conductor"))) + { + if (!Conductor::valideXml(f)) continue; + + //Check if terminal that conductor must be linked is know + + Terminal* p1 = findTerminal(1, f, table_adr_id, added_elements); + Terminal* p2 = findTerminal(2, f, table_adr_id, added_elements); + + if (p1 && p2 && p1 != p2) + { + Conductor *c = new Conductor(p1, p2); + if (c->isValid()) + { + addItem(c); + c -> fromXml(f); + added_conductors << c; + } + else + delete c; + } + } + //Filling of falculatory lists if (content_ptr) { content_ptr -> m_elements = added_elements; From 3a0546e638f21e9cd6bf72fd820d71d273f76ceb Mon Sep 17 00:00:00 2001 From: plc-user <74435298+plc-user@users.noreply.github.com> Date: Fri, 8 Aug 2025 12:46:11 +0200 Subject: [PATCH 16/65] add English comments / translate variable-names to English --- sources/diagramview.cpp | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/sources/diagramview.cpp b/sources/diagramview.cpp index cacefcd1d..9d1992fd3 100644 --- a/sources/diagramview.cpp +++ b/sources/diagramview.cpp @@ -376,6 +376,7 @@ void DiagramView::zoomReset() /** Copie les elements selectionnes du schema dans le presse-papier puis les supprime + Copies the selected elements from the diagram to the clipboard and then deletes them */ void DiagramView::cut() { @@ -387,13 +388,14 @@ void DiagramView::cut() /** Copie les elements selectionnes du schema dans le presse-papier + Copies the selected elements from the diagram to the clipboard */ void DiagramView::copy() { - QClipboard *presse_papier = QApplication::clipboard(); - QString contenu_presse_papier = m_diagram -> toXml(false, true).toString(4); - if (presse_papier -> supportsSelection()) presse_papier -> setText(contenu_presse_papier, QClipboard::Selection); - presse_papier -> setText(contenu_presse_papier); + QClipboard *clipboard = QApplication::clipboard(); + QString content_clipboard = m_diagram -> toXml(false, true).toString(4); + if (clipboard -> supportsSelection()) clipboard -> setText(content_clipboard, QClipboard::Selection); + clipboard -> setText(content_clipboard); } /** @@ -405,11 +407,11 @@ void DiagramView::copy() void DiagramView::paste(const QPointF &pos, QClipboard::Mode clipboard_mode) { if (!isInteractive() || m_diagram -> isReadOnly()) return; - QString texte_presse_papier = QApplication::clipboard() -> text(clipboard_mode); - if ((texte_presse_papier).isEmpty()) return; + QString text_clipboard = QApplication::clipboard() -> text(clipboard_mode); + if ((text_clipboard).isEmpty()) return; QDomDocument document_xml; - if (!document_xml.setContent(texte_presse_papier)) return; + if (!document_xml.setContent(text_clipboard)) return; DiagramContent content_pasted; m_diagram->fromXml(document_xml, pos, false, &content_pasted); @@ -425,6 +427,7 @@ void DiagramView::paste(const QPointF &pos, QClipboard::Mode clipboard_mode) { /** Colle le contenu du presse-papier sur le schema a la position de la souris + Pastes the contents of the clipboard into the diagram at the mouse position. */ void DiagramView::pasteHere() { From 0f179a5d49f1ac7d4ca02d234a3844a6c179215f Mon Sep 17 00:00:00 2001 From: plc-user <74435298+plc-user@users.noreply.github.com> Date: Sat, 9 Aug 2025 09:05:34 +0200 Subject: [PATCH 17/65] add and correct English comments --- sources/qetgraphicsitem/conductor.cpp | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/sources/qetgraphicsitem/conductor.cpp b/sources/qetgraphicsitem/conductor.cpp index ecca2c370..691775fde 100644 --- a/sources/qetgraphicsitem/conductor.cpp +++ b/sources/qetgraphicsitem/conductor.cpp @@ -1336,8 +1336,8 @@ void Conductor::calculateTextItemPosition() Conductor *longest_conductor = longestConductorInPotential(this); - //The longest conductor isn't this conductor - //we call calculateTextItemPosition of the longest conductor + //This conductor isn't the longest conductor? + //We call calculateTextItemPosition for the longest conductor if(longest_conductor != this) { longest_conductor -> calculateTextItemPosition(); @@ -1355,7 +1355,7 @@ void Conductor::calculateTextItemPosition() //position if (m_text_item -> wasMovedByUser()) { - //Text field was moved by user : + //Text field was moved by user: //we check if text field is yet near the conductor QPointF text_item_pos = m_text_item -> pos(); QPainterPath near_shape = nearShape(); @@ -1392,7 +1392,7 @@ void Conductor::calculateTextItemPosition() m_text_item -> setPos(text_pos); - //Ensure text item don't collide with this conductor + //Ensure text item does not collide with this conductor while (m_text_item->collidesWithItem(this)) { if(rotation == Qt::Vertical) @@ -1420,6 +1420,7 @@ void Conductor::calculateTextItemPosition() /** Sauvegarde le profil courant du conducteur pour l'utiliser ulterieurement dans priv_modifieConductor. + Save the current conductors profile for later use in priv_modifiedConductor. */ void Conductor::saveProfile(bool undo) { Qt::Corner current_path_type = currentPathType(); From dad637689d919a44284473dda71121c23495dd3d Mon Sep 17 00:00:00 2001 From: Pascal Sander Date: Wed, 13 Aug 2025 20:01:22 +0200 Subject: [PATCH 18/65] QScopedPointer removes QDrag to early and will still be accessed in another thread. #1 --- sources/ElementsCollection/elementstreeview.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/sources/ElementsCollection/elementstreeview.cpp b/sources/ElementsCollection/elementstreeview.cpp index e84b6a3ce..00f39b529 100644 --- a/sources/ElementsCollection/elementstreeview.cpp +++ b/sources/ElementsCollection/elementstreeview.cpp @@ -82,7 +82,11 @@ void ElementsTreeView::startElementDrag(const ElementsLocation &location) { if (! location.exist()) return; +#if QT_VERSION < QT_VERSION_CHECK(6, 2, 0) + QDrag* drag = new QDrag(this); +#else QScopedPointer drag(new QDrag(this)); +#endif QString location_str = location.toString(); QMimeData *mime_data = new QMimeData(); From 29c362fe4c10db4eed10c71e7142036917dbe8c3 Mon Sep 17 00:00:00 2001 From: achim Date: Mon, 11 Aug 2025 23:13:46 +0200 Subject: [PATCH 19/65] Better handling of conductors when moving For conductors, the setPos() function can result in negative coordinates. For unknown reasons, this can lead to an offset in the scene coordinate system, resulting in a free space above and to the left of the drawing frame. This free space could not be removed. It is better to set the conductors using the conductor::updatePath() function. If the conductor text has been moved by the user, the new position of the text must be calculated. It is important to position the elements first and then 'connect' the conductors. Setting the conductor position via setPos() was done in elemntsmover.cpp (corrected here) and in Diagram::fromXML (corrected in the commit 'Better handling of conductors when creating from XML'). --- sources/elementsmover.cpp | 30 ++++++------- .../undocommand/movegraphicsitemcommand.cpp | 43 +++++++++++++------ sources/undocommand/movegraphicsitemcommand.h | 1 + 3 files changed, 44 insertions(+), 30 deletions(-) diff --git a/sources/elementsmover.cpp b/sources/elementsmover.cpp index 222010631..c4ea2c0f1 100644 --- a/sources/elementsmover.cpp +++ b/sources/elementsmover.cpp @@ -126,30 +126,28 @@ void ElementsMover::continueMovement(const QPointF &movement) | dc::Images | dc::Shapes | dc::ElementTextFields - | dc::TextGroup - | dc::ConductorsToMove)) + | dc::TextGroup)) { if (qgi == m_movement_driver) continue; qgi->setPos(qgi->pos() + movement); } - // Move some conductors + QVectorlist_conductors; + for(auto *con : m_moved_content.m_conductors_to_move){ + list_conductors << con; + } + + // update conductors 'conductors_to_move' + for(auto *cond : list_conductors){ + cond->updatePath(); + if(cond->textItem()->wasMovedByUser() == true) + cond->textItem()->setPos(cond->textItem()->pos()+movement); + } + + // update conductors 'conductors_to_update' for (auto &conductor : m_moved_content.m_conductors_to_update) { -#if TODO_LIST -#pragma message("@TODO fix this problem correctly, probably we must see conductor class.") -#endif - //Due to a weird behavior, we must ensure that the position of the conductor is (0,0). - //If not, in some unknown case the function QGraphicsScene::itemsBoundingRect() return a rectangle - //that take into account the pos() of the conductor, even if the bounding rect returned by the conductor is not in the pos(). - //For the user this situation appears when the top right of the folio is not at the top right of the graphicsview, - //but displaced to the right and/or bottom. - - //@TODO fix this problem correctly, probably we must see conductor class. -// if (c->pos() != QPointF(0,0)) { //<- they work, but the conductor text return to its original pos when the pos is set by user and not auto -// c->setPos(0,0); // because set the pos to 0,0 so text move to, and after call updatePath but because text pos is user defined -// } // we don't move it. conductor->updatePath(); } diff --git a/sources/undocommand/movegraphicsitemcommand.cpp b/sources/undocommand/movegraphicsitemcommand.cpp index 1140c968e..7831ff285 100644 --- a/sources/undocommand/movegraphicsitemcommand.cpp +++ b/sources/undocommand/movegraphicsitemcommand.cpp @@ -22,6 +22,7 @@ #include "../qetgraphicsitem/conductor.h" #include "../qetgraphicsitem/elementtextitemgroup.h" +#include "../qetgraphicsitem/conductortextitem.h" #include "../diagram.h" @@ -65,6 +66,7 @@ void MoveGraphicsItemCommand::undo() m_diagram->showMe(); m_anim_group.setDirection(QAnimationGroup::Forward); m_anim_group.start(); + updateConductors(false); } QUndoCommand::undo(); } @@ -87,6 +89,7 @@ void MoveGraphicsItemCommand::redo() { m_anim_group.setDirection(QAnimationGroup::Backward); m_anim_group.start(); + updateConductors(true); } } QUndoCommand::redo(); @@ -137,19 +140,6 @@ void MoveGraphicsItemCommand::move(const QPointF &movement) qgi->setPos(qgi->pos() + movement); } } - - //Move some conductors - for (const auto &conductor : qAsConst(m_content.m_conductors_to_move)) { - setupAnimation(conductor, - "pos", - conductor->pos(), - conductor->pos() + movement); - } - - //Recalculate the path of other conductors - for (const auto &conductor : qAsConst(m_content.m_conductors_to_update)) { - setupAnimation(conductor, "animPath", 1, 1); - } } /** @@ -167,9 +157,34 @@ void MoveGraphicsItemCommand::setupAnimation(QObject *target, const QVariant &end) { QPropertyAnimation *animation{new QPropertyAnimation(target, property_name)}; - animation->setDuration(300); + // duration must be set to 0, otherwise the conductors will not be updated + animation->setDuration(0); animation->setStartValue(start); animation->setEndValue(end); animation->setEasingCurve(QEasingCurve::OutQuad); m_anim_group.addAnimation(animation); } + +/** + * @brief MoveGraphicsItemCommand::connectConductors + * @param is_redo + */ +void MoveGraphicsItemCommand::updateConductors(bool is_redo) +{ + //Recalculate the path of 'conductors_to_move' + for (const auto &conductor : qAsConst(m_content.m_conductors_to_move)) { + conductor->updatePath(); + if(conductor->textItem()->wasMovedByUser() == true){ + if(is_redo) + conductor->textItem()->setPos(conductor->textItem()->pos() + m_movement); + else + conductor->textItem()->setPos(conductor->textItem()->pos() - m_movement); + } + + } + + // Recalculate the path of 'conductors_to_update' + for (const auto &conductor : qAsConst(m_content.m_conductors_to_update)) { + conductor->updatePath(); + } +} diff --git a/sources/undocommand/movegraphicsitemcommand.h b/sources/undocommand/movegraphicsitemcommand.h index 6b5722f59..7957ef69b 100644 --- a/sources/undocommand/movegraphicsitemcommand.h +++ b/sources/undocommand/movegraphicsitemcommand.h @@ -49,6 +49,7 @@ class MoveGraphicsItemCommand : public QUndoCommand private: void move(const QPointF &movement); + void updateConductors(bool is_redo = false); void setupAnimation(QObject *target, const QByteArray &property_name, const QVariant &start, From f43ce820524a957df451aa5325b2caee2ca509fd Mon Sep 17 00:00:00 2001 From: Laurent Trinques Date: Sun, 17 Aug 2025 08:47:19 +0200 Subject: [PATCH 20/65] Minor: m_autosave_sb QSpinbox set max 99 to 200 minutes Change singlestep 1 to 10 enable accelerated function See: https://qelectrotech.org/bugtracker/view.php?id=329 --- sources/ui/configpage/generalconfigurationpage.ui | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/sources/ui/configpage/generalconfigurationpage.ui b/sources/ui/configpage/generalconfigurationpage.ui index c7af39ccd..8cced1e2a 100644 --- a/sources/ui/configpage/generalconfigurationpage.ui +++ b/sources/ui/configpage/generalconfigurationpage.ui @@ -7,7 +7,7 @@ 0 0 872 - 471 + 556 @@ -17,7 +17,7 @@ - 5 + 1 @@ -170,9 +170,18 @@ Désactivé + + true + min + + 200 + + + 10 + From c31cab34e426441c0e50959187434860be7a9cba Mon Sep 17 00:00:00 2001 From: Pascal Sander Date: Sun, 17 Aug 2025 10:33:04 +0200 Subject: [PATCH 21/65] Check QAbstractItemModel for nullptr before access. #2 --- sources/ElementsCollection/elementscollectionmodel.cpp | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/sources/ElementsCollection/elementscollectionmodel.cpp b/sources/ElementsCollection/elementscollectionmodel.cpp index 7e28f678e..b7305ffaa 100644 --- a/sources/ElementsCollection/elementscollectionmodel.cpp +++ b/sources/ElementsCollection/elementscollectionmodel.cpp @@ -172,10 +172,12 @@ bool ElementsCollectionModel::dropMimeData(const QMimeData *data, const QModelIndex &parent) { Q_UNUSED(action) - QStandardItem *qsi = itemFromIndex( - parent.QModelIndex::model()->index(row, column)); - if (!qsi) - qsi = itemFromIndex(parent); + + const QAbstractItemModel* qaim = parent.QModelIndex::model(); + if (! qaim) return false; + + QStandardItem* qsi = itemFromIndex(qaim->index(row, column)); + if (! qsi) qsi = itemFromIndex(parent); if (qsi->type() == FileElementCollectionItem::Type) { From ee49086d0343b3b79d8be66748aa6a959f8ae00c Mon Sep 17 00:00:00 2001 From: Pascal Sander Date: Sun, 17 Aug 2025 17:48:29 +0200 Subject: [PATCH 22/65] QMenu must set a parent for correct position. #3 --- sources/qetdiagrameditor.cpp | 12 ++++++------ sources/qetmainwindow.cpp | 5 ++--- sources/titleblock/qettemplateeditor.cpp | 4 ++-- sources/ui/titleblockpropertieswidget.cpp | 2 +- 4 files changed, 11 insertions(+), 12 deletions(-) diff --git a/sources/qetdiagrameditor.cpp b/sources/qetdiagrameditor.cpp index 8e8b8c263..ca1868d97 100644 --- a/sources/qetdiagrameditor.cpp +++ b/sources/qetdiagrameditor.cpp @@ -775,12 +775,12 @@ void QETDiagramEditor::setUpToolBar() void QETDiagramEditor::setUpMenu() { - QMenu *menu_fichier = new QMenu(tr("&Fichier")); - QMenu *menu_edition = new QMenu(tr("&Édition")); - QMenu *menu_project = new QMenu(tr("&Projet")); - QMenu *menu_affichage = new QMenu(tr("Afficha&ge")); - //QMenu *menu_outils = new QMenu(tr("O&utils")); - windows_menu = new QMenu(tr("Fe&nêtres")); + QMenu* menu_fichier = new QMenu(tr("&Fichier"), this); + QMenu* menu_edition = new QMenu(tr("&Édition"), this); + QMenu* menu_project = new QMenu(tr("&Projet"), this); + QMenu* menu_affichage = new QMenu(tr("Afficha&ge"), this); + // QMenu *menu_outils = new QMenu(tr("O&utils"), this); + windows_menu = new QMenu(tr("Fe&nêtres"), this); insertMenu(settings_menu_, menu_fichier); insertMenu(settings_menu_, menu_edition); diff --git a/sources/qetmainwindow.cpp b/sources/qetmainwindow.cpp index db20a1a93..c9f4c9570 100644 --- a/sources/qetmainwindow.cpp +++ b/sources/qetmainwindow.cpp @@ -142,13 +142,12 @@ void QETMainWindow::initCommonActions() */ void QETMainWindow::initCommonMenus() { - settings_menu_ = new QMenu(tr("&Configuration", "window menu")); + settings_menu_ = new QMenu(tr("&Configuration", "window menu"), this); settings_menu_ -> addAction(fullscreen_action_); settings_menu_ -> addAction(configure_action_); connect(settings_menu_, SIGNAL(aboutToShow()), this, SLOT(checkToolbarsmenu())); - - help_menu_ = new QMenu(tr("&Aide", "window menu")); + help_menu_ = new QMenu(tr("&Aide", "window menu"), this); help_menu_ -> addAction(whatsthis_action_); help_menu_ -> addSeparator(); help_menu_ -> addAction(manual_online_); diff --git a/sources/titleblock/qettemplateeditor.cpp b/sources/titleblock/qettemplateeditor.cpp index d270567cd..07dfb2d48 100644 --- a/sources/titleblock/qettemplateeditor.cpp +++ b/sources/titleblock/qettemplateeditor.cpp @@ -437,8 +437,8 @@ void QETTitleBlockTemplateEditor::initActions() */ void QETTitleBlockTemplateEditor::initMenus() { - file_menu_ = new QMenu(tr("&Fichier", "menu title"), this); - edit_menu_ = new QMenu(tr("&Édition", "menu title"), this); + file_menu_ = new QMenu(tr("&Fichier", "menu title"), this); + edit_menu_ = new QMenu(tr("&Édition", "menu title"), this); display_menu_ = new QMenu(tr("Afficha&ge", "menu title"), this); file_menu_ -> addAction(new_); diff --git a/sources/ui/titleblockpropertieswidget.cpp b/sources/ui/titleblockpropertieswidget.cpp index e1fb9e250..109362380 100644 --- a/sources/ui/titleblockpropertieswidget.cpp +++ b/sources/ui/titleblockpropertieswidget.cpp @@ -338,7 +338,7 @@ void TitleBlockPropertiesWidget::initDialog( this, SLOT(duplicateCurrentTitleBlockTemplate())); - m_tbt_menu = new QMenu(tr("Title block templates actions")); + m_tbt_menu = new QMenu(tr("Title block templates actions"), ui->m_tbt_pb); m_tbt_menu -> addAction(m_tbt_edit); m_tbt_menu -> addAction(m_tbt_duplicate); ui -> m_tbt_pb -> setMenu(m_tbt_menu); From 6375136a5097705259a2ef4289a33ddcc1df6ba4 Mon Sep 17 00:00:00 2001 From: Laurent Trinques Date: Mon, 18 Aug 2025 14:04:27 +0200 Subject: [PATCH 23/65] Fix bughttps://qelectrotech.org/bugtracker/view.php?id=329 Modification of the int BACKUP_INTERVAL from 2 min to 20 min used by KautoSaveFile. On a large project with a 256 MB folio printed in A0 format, the graphical interface freezes for 30 seconds when KautoSaveFile writes this large amount of data to the disk every two minutes. Even if the programme crashes, you only lose 20 minutes of your work, which is not a big deal. Thanks to Enzo for reporting it and finding the problem. --- sources/qetproject.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sources/qetproject.cpp b/sources/qetproject.cpp index 3ecb8bdf6..e81b365b9 100644 --- a/sources/qetproject.cpp +++ b/sources/qetproject.cpp @@ -41,7 +41,7 @@ #include #include -static int BACKUP_INTERVAL = 120000; //interval in ms of backup = 2min +static int BACKUP_INTERVAL = 1200000; //interval in ms of backup = 20min /** @brief QETProject::QETProject From 73ce3ae9fe877645f12ce0e9fd4ac9f4a8642d31 Mon Sep 17 00:00:00 2001 From: achim Date: Tue, 19 Aug 2025 20:16:31 +0200 Subject: [PATCH 24/65] Correct compositeText alignment on copying After the commit 'Correcting dynamicElementTextItem alignment on copying', not all composite text was displayed correctly. As soon as the composite text contained multiple variables in a line or user text, the alignment was no longer correct. Furthermore, the text value was not correctly written to the clipboard, so it was no longer present when pasting. I have corrected these errors here. --- sources/diagram.cpp | 121 ++++++++++++++++++++++++++++++++++++-------- 1 file changed, 99 insertions(+), 22 deletions(-) diff --git a/sources/diagram.cpp b/sources/diagram.cpp index 41996cf06..3e9ef7c12 100644 --- a/sources/diagram.cpp +++ b/sources/diagram.cpp @@ -38,6 +38,7 @@ #include "qetgraphicsitem/terminal.h" #include "qetxml.h" #include "undocommand/addelementtextcommand.h" +#include "qetinformation.h" #include #include @@ -2496,35 +2497,88 @@ bool Diagram::canRotateSelection() const void Diagram::correctTextPos(Element* elmt) { for (auto deti : elmt->dynamicTextItems()){ - if( deti->textFrom() == DynamicElementTextItem::ElementInfo || - deti->textFrom() == DynamicElementTextItem::CompositeText) { - if (deti->text().isEmpty()){ - deti->setText(deti->toPlainText()); + // correct dynamicElementTextItem of type ElementInfo + if( deti->textFrom() == DynamicElementTextItem::ElementInfo){ + // save current PlainText + deti->setText(deti->toPlainText()); + // writing an empty string to PlainText set + // the insertion point to the original insertion point + deti->setPlainText(""); + // block the alignment calculation for the next write action + deti->m_block_alignment = true; + // we need to set the plain text with its value, + // otherewise the text value will not be copy + deti->setPlainText(deti->text()); + deti->m_block_alignment = false; + } + // correct dynamicElementTextItem of type CompositeText + else if(deti->textFrom() == DynamicElementTextItem::CompositeText){ + QString composite_text = deti->compositeText(); + + // create compositeText() without variables for slave item + // This string corresponds to the original text with original insertion point + if(elmt->linkType()==Element::Slave){ + const QStringList variables_list = QETInformation::elementInfoKeys(); + for (auto &variable : variables_list){ + if(composite_text.contains(QETInformation::infoToVar(variable))) + composite_text.replace(QETInformation::infoToVar(variable),""); + } } - // block alignment calculation + // create compositeText() without variables for report item + else if(elmt->linkType()&Element::AllReport){ + const QStringList variables_list = QETInformation::folioReportInfoKeys(); + for (auto &variable : variables_list){ + if(composite_text.contains(QETInformation::infoToVar(variable))) + composite_text.replace(QETInformation::infoToVar(variable),""); + } + } + + deti->setText(deti->toPlainText()); + deti->setPlainText(composite_text); deti->m_block_alignment = true; deti->setPlainText(deti->text()); - // release the alignment calculation deti->m_block_alignment = false; - // writing an empty string sets the insertion point - // to the original insertion point - deti->setPlainText(""); + // We need the string for the restoration, so we save it + deti->setText(composite_text); } } - // same for textgroups + + // same for textgroups for (auto group : elmt->textGroups()){ for(DynamicElementTextItem *deti : group->texts()){ - if( deti->textFrom() == DynamicElementTextItem::ElementInfo || - deti->textFrom() == DynamicElementTextItem::CompositeText) { - if (deti->text().isEmpty()){ - deti->setText(deti->toPlainText()); - } + if( deti->textFrom() == DynamicElementTextItem::ElementInfo){ + deti->setText(deti->toPlainText()); deti->m_block_alignment = true; deti->setPlainText(deti->text()); deti->m_block_alignment = false; deti->setPlainText(""); } + + else if(deti->textFrom() == DynamicElementTextItem::CompositeText){ + QString composite_text = deti->compositeText(); + if(elmt->linkType()==Element::Slave){ + QStringList variables_list = QETInformation::elementInfoKeys(); + for (auto variable : variables_list){ + if(composite_text.contains(QETInformation::infoToVar(variable))) + composite_text.replace(QETInformation::infoToVar(variable),""); + } + } + else if(elmt->linkType()&Element::AllReport){ + QStringList variables_list = QETInformation::folioReportInfoKeys(); + for (auto variable : variables_list){ + if(composite_text.contains(QETInformation::infoToVar(variable))) + composite_text.replace(QETInformation::infoToVar(variable),""); + } + } + + deti->setText(deti->toPlainText()); + deti->setPlainText(composite_text); + deti->m_block_alignment = true; + deti->setPlainText(deti->text()); + deti->m_block_alignment = false; + deti->setText(composite_text); + } } } } @@ -2541,18 +2595,41 @@ void Diagram::correctTextPos(Element* elmt) void Diagram::restoreText(Element* elmt) { for (auto deti : elmt->dynamicTextItems()){ - if( deti->textFrom() == DynamicElementTextItem::ElementInfo || - deti->textFrom() == DynamicElementTextItem::CompositeText) - { + // restore info text + if( deti->textFrom() == DynamicElementTextItem::ElementInfo){ + // delete the actual plainText without alignmant calculation + deti->m_block_alignment = true; + deti->setPlainText(""); + deti->m_block_alignment = false; + // restore the plainText + deti->setPlainText(deti->text()); + } + // restore composite text + else if (deti->textFrom() == DynamicElementTextItem::CompositeText){ + QString composite_text = deti->text(); + deti->setText(deti->toPlainText()); + // set the PlainText to the origin text without alignment calculation + deti->m_block_alignment = true; + deti->setPlainText(composite_text); + deti->m_block_alignment = false; deti->setPlainText(deti->text()); } } - + // same for text groups for (auto group : elmt->textGroups()){ for(DynamicElementTextItem *deti : group->texts()){ - if( deti->textFrom() == DynamicElementTextItem::ElementInfo || - deti->textFrom() == DynamicElementTextItem::CompositeText) - { + if( deti->textFrom() == DynamicElementTextItem::ElementInfo){ + deti->m_block_alignment = true; + deti->setPlainText(""); + deti->m_block_alignment = false; + deti->setPlainText(deti->text()); + } + else if (deti->textFrom() == DynamicElementTextItem::CompositeText){ + QString composite_text = deti->text(); + deti->setText(deti->toPlainText()); + deti->m_block_alignment = true; + deti->setPlainText(composite_text); + deti->m_block_alignment = false; deti->setPlainText(deti->text()); } } From 27b21b38aa040a8b9e30cfa63280d95a8fdf16e6 Mon Sep 17 00:00:00 2001 From: Pascal Sander Date: Fri, 22 Aug 2025 20:12:27 +0200 Subject: [PATCH 25/65] Fixed incorrect cast from ElementCollectionItem to FileElementCollectionItem #4 --- .../elementscollectionwidget.cpp | 47 +++++++++---------- 1 file changed, 21 insertions(+), 26 deletions(-) diff --git a/sources/ElementsCollection/elementscollectionwidget.cpp b/sources/ElementsCollection/elementscollectionwidget.cpp index d86a35266..584bfa6ae 100644 --- a/sources/ElementsCollection/elementscollectionwidget.cpp +++ b/sources/ElementsCollection/elementscollectionwidget.cpp @@ -591,37 +591,32 @@ void ElementsCollectionWidget::resetShowThisDir() */ void ElementsCollectionWidget::dirProperties() { - ElementCollectionItem *eci = elementCollectionItemForIndex( - m_index_at_context_menu); - //When the user right-clicks on the collection tree and - //selects the collection property, the collection name, - //file path and number of elements will be added - //to the qInfo log file. - qInfo() <localName()) - <elementsChild().size() - <(eci)->fileSystemPath()); - if (eci && eci->isDir()) { - QString txt1 = tr("Le dossier %1 contient").arg( - eci->localName()); - QString txt2 = tr("%n élément(s), répartie(s)", - "", - eci->elementsChild().size()); - QString txt3 = tr("dans %n dossier(s).", - "" , - eci->directoriesChild().size()); - QString txt4 = tr("Chemin de la collection : %1").arg( - eci->collectionPath()); - QString txt5; + ElementCollectionItem* eci = + elementCollectionItemForIndex(m_index_at_context_menu); + + if (eci && eci->isDir()) + { + QString filePath; if (eci->type() == FileElementCollectionItem::Type) { - txt5 = tr("Chemin dans le système de fichiers : %1") - .arg(static_cast(eci)->fileSystemPath()); + filePath = tr("Chemin dans le système de fichiers : %1") + .arg( + static_cast(eci) + ->fileSystemPath()); } + QString out = + tr("Le dossier %1 contient").arg(eci->localName()) % " " + % tr("%n élément(s), répartie(s)", "", eci->elementsChild().size()) + % " " + % tr("dans %n dossier(s).", "", eci->directoriesChild().size()) + % "\n\n" + % tr("Chemin de la collection : %1").arg(eci->collectionPath()) + % "\n" % filePath; + qInfo() << out; QMessageBox::information( this, tr("Propriété du dossier %1").arg(eci->localName()), - txt1 % " " % txt2 % " " % txt3 % "\n\n" % txt4 % "\n" % txt5); - } + out); + } } /** From 84ac394d3b2860a59b1e21663e7124a9d2e16186 Mon Sep 17 00:00:00 2001 From: Pascal Sander Date: Sat, 30 Aug 2025 12:08:54 +0200 Subject: [PATCH 26/65] Refactor to more QRectF to be more compatible with QPrinter. #5 --- sources/print/projectprintwindow.cpp | 55 ++++++++++++++-------------- 1 file changed, 28 insertions(+), 27 deletions(-) diff --git a/sources/print/projectprintwindow.cpp b/sources/print/projectprintwindow.cpp index 6522020d3..4b234e418 100644 --- a/sources/print/projectprintwindow.cpp +++ b/sources/print/projectprintwindow.cpp @@ -234,9 +234,9 @@ void ProjectPrintWindow::printDiagram(Diagram *diagram, bool fit_page, QPainter { ////Prepare the print//// - //Deselect all + // Deselect all diagram->deselectAll(); - //Disable focus flags + // Disable focus flags QList focusable_items; for (auto qgi : diagram->items()) { if (qgi->flags() & QGraphicsItem::ItemIsFocusable) { @@ -244,7 +244,7 @@ void ProjectPrintWindow::printDiagram(Diagram *diagram, bool fit_page, QPainter qgi->setFlag(QGraphicsItem::ItemIsFocusable, false); } } - //Disable interaction + // Disable interaction for (auto view : diagram->views()) { view->setInteractive(false); } @@ -254,7 +254,7 @@ void ProjectPrintWindow::printDiagram(Diagram *diagram, bool fit_page, QPainter auto full_page = printer->fullPage(); - auto diagram_rect = diagramRect(diagram, option); + auto diagram_rect = QRectF(diagramRect(diagram, option)); if (fit_page) { diagram->render(painter, QRectF(), diagram_rect, Qt::KeepAspectRatio); } else { @@ -266,57 +266,58 @@ void ProjectPrintWindow::printDiagram(Diagram *diagram, bool fit_page, QPainter #pragma message("@TODO remove code for QT 6 or later") #endif qDebug()<<"Help code for QT 6 or later"; - auto printed_rect = full_page ? printer->paperRect(QPrinter::Millimeter) : printer->pageRect(QPrinter::Millimeter); + auto printed_rect = full_page ? printer->paperRect(QPrinter::Millimeter) : + printer->pageRect(QPrinter::Millimeter); #endif auto used_width = printed_rect.width(); auto used_height = printed_rect.height(); auto h_pages_count = horizontalPagesCount(diagram, option, full_page); auto v_pages_count = verticalPagesCount(diagram, option, full_page); - QVector> page_grid; - //The diagram is printed on a matrix of sheet - //scrolls through the rows of the matrix + QVector> page_grid; + // The diagram is printed on a matrix of sheet + // scrolls through the rows of the matrix auto y_offset = 0; - for (auto i=0 ; i(); - //scrolls through the lines of sheet + page_grid << QVector(); + // scrolls through the lines of sheet auto x_offset = 0; for (auto j=0 ; j page_to_print; + // Retains only the pages to be printed + QVector page_to_print; for (auto i=0 ; i < v_pages_count ; ++i) { for (int j=0 ; j < h_pages_count ; ++j) { page_to_print << page_grid.at(i).at(j); } } - //Scrolls through the page for print + // Scrolls through the page for print bool first_ = true; - for (auto page : page_to_print) + for (auto& page : page_to_print) { first_ ? first_ = false : m_printer->newPage(); - diagram->render(painter, QRect(QPoint(0,0), page.size()), page.translated(diagram_rect.topLeft()), Qt::KeepAspectRatio); + diagram->render( + painter, + QRectF(QPoint(0, 0), page.size()), + page.translated(diagram_rect.topLeft()), + Qt::KeepAspectRatio); } } - ////Print is finished, restore diagram and graphics item properties + ////Print is finished, restore diagram and graphics item properties for (auto view : diagram->views()) { view->setInteractive(true); } From acf0eb8f6acbb78cfd66266d62f1ba9c0eb28c87 Mon Sep 17 00:00:00 2001 From: Laurent Trinques Date: Mon, 1 Sep 2025 05:06:50 +0200 Subject: [PATCH 27/65] git submodule update --remote elements --- elements | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/elements b/elements index 09eb672e0..9f20b039b 160000 --- a/elements +++ b/elements @@ -1 +1 @@ -Subproject commit 09eb672e0f08684f38b0896bf22cef98ca777fad +Subproject commit 9f20b039b7c384fe29d7e7190fa62b67c8aae471 From 6119d49d15ea6a2aa4aee65708a3c1cb6db885e9 Mon Sep 17 00:00:00 2001 From: Laurent Trinques Date: Sat, 6 Sep 2025 10:10:00 +0200 Subject: [PATCH 28/65] =?UTF-8?q?Add=20new=20Photovolta=C3=AFque=20example?= =?UTF-8?q?s=20found=20on=20www..?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- examples/schema_unifilaire_voltaique2.qet | 3500 +++++++++++++++++++++ 1 file changed, 3500 insertions(+) create mode 100644 examples/schema_unifilaire_voltaique2.qet diff --git a/examples/schema_unifilaire_voltaique2.qet b/examples/schema_unifilaire_voltaique2.qet new file mode 100644 index 000000000..f5cf51e69 --- /dev/null +++ b/examples/schema_unifilaire_voltaique2.qet @@ -0,0 +1,3500 @@ + + + 17/08/2025 + 17-08-2025 + 2025-08-17 + schema_unifilaire_voltaique2 + /home/laurent/schema_unifilaire_voltaique2.qet + 11:51 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + label + + + + + + + + + + + + Q7 32A + + + + Q7 32A + label + + + + + + + + + + + + + + ID5 30mA 25A + label + + + + + + + + + + + + + + + label + + + + + + + + + + + + + + + label + + + + + + + + + + + + Q3 32A + + + + Q3 32A + label + + + + + + + + + + + + + + + + label + + + + + + + + + + + + Q6 32A + + + + Q6 32A + label + + + + + + + + + + + + + + + + + label + + + + + + + + + + + + Q5 32A + + + + Q5 32A + label + + + + + + + + + + + + + + + + + label + + + + + + + + + + + + + + + + + + + + + + + + + + + + + label + + + + + + + + + + + + + + + + + label + + + + + + + + + + + + + + + + label + + + + + + + + + + + + + + + + + label + + + + + + + + + + + + + + + + label + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + label + + + + + + + + + + + + + + + + label + + + + + + + + + + + + + + + + label + + + + + + + + + + + + + + + + + label + + + + + + + + + + + + + + ID4 30mA 63A + label + + + + + + + + + + + + + + + + + label + + + + + + + + + + + + + + + + label + + + + + + + + + + + + + + + + label + + + + + + + + + + + + + + + + + + + + + + + + + + + + ID1 30mA 63A + label + + + + + + + + + + + + + + + label + + + + + + + + + + + + + + label + + + Qrelay + + + + + + + + + + + + Q100 16A + + + + Q100 16A + label + + + + + + + + + + + + + + + label + + + + + + + + + + + + + + + label + + + + + + + + + + + + + + + label + + + + + + + + + + + + + + + + + + + + + + Q2 32A + + + + Q2 32A + label + + + + + + + + + + + + + + + + + label + + + + + + + + + + + + Q51 2A + + + + Q51 2A + label + + + + + + + + + + + + + + + label + + + + + + + + + + + + + + ID3 30mA 63A + label + + + + + + + + + + + + + + + label + + + + + + + + + + + + + + ID2 30mA 63A + label + + + + + + + + + + + + Q1 32A + + + + Q1 32A + label + + + + + + + + + + + + Q4 32A + + + + Q4 32A + label + + + + + + + + + + + + Q8 10A + + + + Q8 10A + label + + + + + + + + + + + + Q50 20A + + + + Q50 20A + label + + + + + + + + + + + + + + + + + label + + + + + + + + + + + + + + + + + label + + + + + + + + + + + + + + + + + label + + + + + + + + + + + + + + + + + label + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + US3000C + + + + + + + + + + + + + + + + + label + + + + + + + + + + + + + + + + label + + + + + + + + + + + + + + + + + label + + + + + + + + + + + + + + + + label + + + + + + + + + + + + + + + + + label + + + + + + + + + + + + + + + + + label + + + + + + + + + + + + + + + + + label + + + + + + + + + + + + + + + + + + + + label + + + + + + + + + + + + + + + + label + + + + + + + + + + + + + + label + + + + + + + + + + + + + + + label + + + 45A 500mA + + + + + + + + + + + + + + + + + label + + + + + + + + + + + + Linky + Linky + + + + Linky + label + + + + + + + + + + + + + + + + label + + + + + + + + + + + + + + + + + label + + + + + + + + + + + + + + + + label + + + + + + + + + + + + + + + + + label + + + + + + + + + + + + + + + + + + US3000C + + + + + + + + + + + + + + + + + label + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + elementos importados + Elementos importados + Elementi importati + Elementen geïmporteerd + Imported elements + Éléments importés + Elements importats + Importerede elementer + Uvoženi elementi + Импортированные элементы + Zavedené prvky + Elemente importate + Uvezeni elementi + インバートされた要素 + Εισηγμένα στοιχεία + Importierte elemente + İthal öğeler + Elementy importowane + Імпортовані елементи + + + + Elettrica + Elektrisk + Электротехника + Ηλεκτρικά + 電気 + Elektrotechniek + Elektrotechnika + Elektrotechnika + Electric + Elektrik + Electrique + Eléctrica + + + + Multifilare + Flere ledere + Többvonalas szimbólumok + Многополюсные + Πολυγραμμικό + 複線 + Vícežilový + Veel polig + Schematy wieloliniowe + All-pole + Multifilaire + Allpolig + Multifilar + + + + Generatori e sorgenti + Генераторы и источники + Γεννήτριες και πηγές + 発電機と電源 + Generatoren en Voedingen + Generátory a zdroje + Źródła zasilania + Generators and sources + Generatoren und Quellen + Générateurs et sources + Generadores y fuentes + + + + Generatori + Генераторы + Γενήτριες + Generátory + Generatoren + Generators + Generatory + Generatoren + Générateurs + Generators + Generadores + + + + + + Caisson solaire photovoltaïque + Photovoltaikmodul + Fotovoltaico + Zonnepaneel DC + Φωτοβολταϊκή κυψέλη + Fotovoltaický panel DC + PVCell + Celda fotovoltaica + Bateria ogniw fotowoltanicznych + Zonnepaneel DC + + Author: Arun Kishore Eswara + +License: Creative Commons Attribution 3.0 base License + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Sensori e misuratori + Датчики и инструменты + Αισθητήρες και όργανα + センサと計器 + Sensoren en instrumenten + Čidla a měřiče + Sensors and instruments + Czujniki i przyrządy + Capteurs et instruments + Sensoren und Messgeräte + Sensores e instrumentos + + + + Misuratori + عدّادات + Измерители и инзмерительные индикаторы + Μετρητές + Měřiče a indikátory + Meters + Meters and measuring indicators + Liczniki + Zähler und Messanzeigegeräte + Compteurs et afficheurs de mesure + Contadores + + + + + + Contatore monofase 230V + Stromzähler einphasig + عدّاد أحادي الوجه 220V + Licznik jednofazowy + 220V single phase meter + Compteur 220V monophase + Μονοφασικός μετρητής + Čítač impulzů 230V + KWh meter 230V + + + Author: The QElectroTech team +License: see http://qelectrotech.org/wiki/doc/elements_license + + + + + + + + label + + + + + + + + + + + + + + Misuratore di Kwh + Energy meter + Licznik energii + Energiezähler + Μετρητής ενέργειας, Κιλοβατώρες (KWh) + عدّاد طاقة + Compteur d’énergie + Elektroměr + Energiemeter + + + + + + + + + + label + + + + + + + + + + + + + + + Čítač impulzů 230V + KWh meter 230V + Contatore monofase 230V + Μονοφασικός μετρητής + Stromzähler einphasig + 220V single phase meter + Compteur 220V monophase + Licznik jednofazowy + عدّاد أحادي الوجه 220V + + Author: The QElectroTech team +License: see http://qelectrotech.org/wiki/doc/elements_license + + + + + + + + + + + + + + + Relæer, kontaktorer og kontakter + Relè, contattori e contatti + Relays, contactors and contacts + 継電器、接触器、接点 + Relais, contacteurs et contacts + Relais, Schütze und Kontakte + Relais, contactoren en contacten + Relé, stykače a kontakty + Реле, пускатели и контакты + Ηλεκτρονόμοι και επαφές + Przekaźniki i styczniki + Relevadores, contactores y contactos + Relék, kontaktorok és érintkezők + + + + Kontaker med krydsreference + Contatti con riferimenti incrociati + Contacts with cross referencing + Kontakte mit Querverweis + Contacts avec référence croisée + Contacten met kruisreferentie + Kontakty s křížovými odkazy + Контакты с перекрестными ссылками + Επαφές με παραπομπές + Zestyki (automatyczne oznaczenia) + Contactos con referencia cruzada + + + + Hoved kontaktor + Potência + Potenza + قدرة + Power + Leistung + Puissance + Last contacten + Silové kontakty + Силовые + Ισχύος + Styczniki + Potencia + + + + + + مُلامس قدرة - كونتكتور (NO) + Leistungsschliesser 1-polig + Контакт контактора (НР) + Interruptor de potência contactor + Επαφή ρελέ ισχύος, ανοικτή + Contact power contactor + Contatto NA di potenza + Contact puissance contacteur + Stycznik + Interruptor de potencia contactor + Silový kontakt 1p + Last contact + + Author: The QElectroTech team +License: see http://qelectrotech.org/wiki/doc/elements_license + + NO + 1 + power + + + + + + + + + + + + + + + + + + Convertitori e inverter + Converters and inverters + 変換器とインバータ + Convertisseurs et variateurs + Umformer und Umrichter + Omzetters en Omkeerders + Měniče a střídače + Преобразователи + Μετατροπείς και αντιστροφείς + Przetworniki i przekształtniki + Convertidores e invertidores + + + + Trasformatori di corrente + Current transformers + Stromwandler + Transformateurs de courant + Transformator stroom + Transformátory proudu + Μετασχηματιστές Έντασης + Трансформаторы тока + Przekładniki + Transformadores de corriente + + + + + + ملف حلقي قطب 1 + Núcleo toroide 1 polo + Núcleo toroidal de 1 polo + Przekładnik prądowy jednotorowy + Τοροειδές πηνίο 1 πόλου + Tore 1 pôle + Stromwandler 1-polig + Jednopólový proudový transformátor + 1-pole toroidal core + Toroide a 1 polo + Stroomtransformator ringkern 1AC + + Author: The QElectroTech team +License: see http://qelectrotech.org/wiki/doc/elements_license + + + + + + + + + + + + + + + + + + + Соединения + Ενώσεις + Verbindungen + Csatlakozások + Połączenia + Collegamenti + Forbindelser + 接続 + Spojení + Conexiones + Connections + Verbindingen + Connections + + + + + + connexion + Bod + connection + Keresztezés pont alakzatban + Verbindung + + + + + + + + label + + + + + + + + + + + + Σύνδεσμοι και πρίζες + Stik + Csatlakozók és dugók + Conectores y enchufes + コネクタとプラグ + Connectoren en stekkers + Connecteurs et prises + Steckverbinder und Steckdosen + Konektory a zásuvky + Соединители и разъемы + Connettori e prese + Złącza wtykowe + Connectors and plugs + + + + Ακίδες συνδέσμων + Stik ben + Csatlakozók + Pines de conector + Steckkontakte + Contacts de fiche + Konektorové piny + Контакты разъемов + Złącza wtykowe + Contatti + Connector pins + + + + + + Connector + Connecteur + Соединение (нов.) + Conector + Stopcontact + Conector + Spojený pin + Steckverbindung Buchse + Stecker + Connettori M/F + Σύνδεσμος + موصل + Złącze wtykowe + Anya + apa csatlakozó + + Author: The QElectroTech team +License: see http://qelectrotech.org/wiki/doc/elements_license + + + + + + + + + + + + + + + + + + + Unifilare + Enkel leder + Однополюсные + Μονογραμμικό + 単線 + Jednopólové + Enkel pool + Schematy jednoliniowe + Single pole + Unifilaire + Einpolig + Polo simple + + + + Fusibili e protezioni + Предохранители и элементы защиты + Ασφάλειες και διατάξεις προστασίας + ヒューズと保護装置 + Zekeringen en beveiligingen + Pojistky a ochrany + Łączniki i zabezpieczenia + Fuses and protective gears + Sicherungen und Schutzeinrichtungen + Fusibles et protections + + + + Relè termici + قواطع + Выключатели + Αυτόματοι διακόπτες + Jističe + Lastscheiders + Circuit-breakers + Disjuntores + Wyłączniki + Leitungsschutzschalter und Lastschalter + Disjoncteurs + Disyuntores + + + + + + قاطع + Lastschalter 1P + Выключатель + Disjuntor + Circuit-breaker + Sezionatore 1P + Disjoncteur + Wyłącznik + Disyuntor + Lastscheider 1 + Vypínač + + + protection + + Author: The QElectroTech team +License: see http://qelectrotech.org/wiki/doc/elements_license + + + + + + + + + + + + + + + + + + قاطع أحدي القطب + Leitungsschutzschalter 1P + Circuit-breaker + Disyuntor termico magnetico + Int. Aut. Magneto-termico 1P + Disjoncteur unipolaire + Wyłącznik + Lastscheider 1 + Jednopólový jistič + + + protection + + Author: The QElectroTech team +License: see http://qelectrotech.org/wiki/doc/elements_license + + + + + + + + + + + + + + + + + + + + + + Jednopólový jistič + قاطع أحدي القطب + Circuit-breaker + Lastscheider 1 + Wyłącznik + Int. Aut. Magneto-termico 1P + Leitungsschutzschalter 1P + Disjoncteur unipolaire + + + protection + + + Author: The QElectroTech team +License: see http://qelectrotech.org/wiki/doc/elements_license + + + + + + label + + + + + + + + + + + 1 + + + 2 + + + + comment + + + + + + + + + + Interruttori differenziali + قواطع تفاضلية + Дифавтоматы + Διαφορικοί αποζεύκτες + Proudové chrániče + Aardlekschakelaar + automaat + Residual Circuit Breakers + Disjunctores diferenciais + Wyłączniki różnicowoprądowe + Fehlerstromschutzschalter + Disjoncteurs différentiels + Dispositivos diferenciales residuales + + + + + + قاطع تفاضلي مغناطيسي - حراري + Θερμομαγνητικός διαφορικός διακόπτης + Magneto-thermal differential switch + Kombischalter 1-polig + Interr. magneto-termico differenziale + Disjoncteur différentiel magnéto-thermique + Wyłącznik różnicowoprądowy z członem nadprądowym + Aardlekschakelaar + automaat + Jističochránič + + + protection + + Author: The QElectroTech team +License: see http://qelectrotech.org/wiki/doc/elements_license + + + + + + + + + + + + + + + + + + + + + مفتاح تفاضلي + Rozłącznik różnicowoprądowy + Differential switch + Interrupteur différentiel + УЗО + Interruptor diferencial + Aardlekschakelaar + Interruptor diferencial + Fehlerstromschutzschalter + Interruttore differenziale + Proudový chránič + + + protection + + Author: The QElectroTech team +License: see http://qelectrotech.org/wiki/doc/elements_license + + + + + + + + + + + + + + + + + + + + + Portafusibles + Zekeringscheiders + Porta fusíveis + Schmelzsicherungen + Pojistky + Portafusibili + Ασφάλειες + حوامل-مصهرات + Odłączniki bezpiecznikowe + Fuses + Fusibles + Выключатели-предохранители + + + + + + مصهر + Sicherung + Предохранитель + Fusível + Ασφάλεια + Fuse + Fusibile + Fusible + Bezpiecznik topikowy + Fusible + Zekering + Pojistka + + + protection + + Author: The QElectroTech team +License: see http://qelectrotech.org/wiki/doc/elements_license + + + + + + + + + + + + + + + + Разъеденители + Αποζεύκτες + Seccionadores + Sectionneurs + Odłączniki + Sezionatori + Odpojovače + Disconnecting switches + Seccionadores + Lasttrenner + عازلات + Lastschakelaars + + + + + + مفتاح عزل + Trennschalter 1P + Выключатель-разъеденитель + Seccionador + Διακόπτης φορτίου + Disconnecting switch + Sezionatore 1P + Sectionneur + Rozłącznik + Seccionador + Scheidingsschakelaar + Odpínač + + + protection + + Author: The QElectroTech team +License: see http://qelectrotech.org/wiki/doc/elements_license + + + + + + + + + + + + + + + + Connettori e prese + Соединители и разъемы + Σύνδεσμοι και πρίζες + コネクタとプラグ + Connectoren en pluggen + Konektory a zástrčky + Złącza wtykowe + Connectors and plugs + Stecker und Buchsen + Connecteurs et prises + Conectores y Enchufes + + + + + + قابس و مقبس متعدد الأقطاب, تمثيل أحادي الخط + Steckverbindung komplett mit 6 Kontakten + Plug and multipolar representation +unifilar + Spina e presa multipolari, rappresentazione unifilare + Prise et fiche multipolaires, représentation +unifilaire + + Złącze wielostykowe + Conector multipolar, representación unifilar + Zásuvka a zástrčka vícepólová + Steker en Contact veelpolig enkellijns + + EN 60617: 03-03-08 + + + + + + + + + + + + + + + + + + Οικιακά + Electrodoméstico + 住宅機器 + Electrodomésticos + منزليات + Huisinstallatie + Installation domestique + Haustechnik Installation + Domácí elektrotechnika + Бытовая техника + Instalacje w obiektach budowlanych + Impianti civili + Home installation + + + + Μετρητές + Contadores + عدّادات + Meters + Zähler + Compteurs + Měřidla + Измерители + Liczniki + Misuratori + Meters + + + + + + Elektroměr + Energiezähler + Misuratore di Kwh + Μετρητής ενέργειας, Κιλοβατώρες (KWh) + عدّاد طاقة + Licznik energii + Energy meter + Compteur d’énergie + Energiemeter + + + Author: The QElectroTech team +License: see http://qelectrotech.org/wiki/doc/elements_license + + + + label + + + + + + + + + + + + + + + + Articulos de fabricantes + Κατασκευαστές υλικού + Tovární díly + Marchi produttori + База изделий производителей + Producent produkter + 製品 + Urządzenia producentów + Herstellerartikel + Manufacturers articles + Articles constructeurs + + + + Qubino + Qubino + Qubino + Qubino + Qubino + Qubino + Qubino + Qubino + Qubino + Qubino + Qubino + Qubino + + + + + + Smart Meter ZMNHTD1 + Smart Meter ZMNHTD1 + + + + + + + Schneider Electric + + + + + + + + + Autor: KevinarCZ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ET_ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + DS/IEC 60617 + IEC 60617 + 電気用図記号 (JIS C 0617 / IEC 60617) + EN 60617 + DIN EN 60617 + EN 60617 + IEC 60617 + + + + 06- Produktion og omformning af elektrisk energi + 06- Production and conversion of electrical energy + 06- 電気エネルギーの発生及び変換 + 06- Production, transformation et conversion de l'électricité + 06- Erzeugung und Umwandlung elektrischer Energie + 06- Výroba a přeměna elektrické energie + 06- Producción, transformación y conversión de electricidad + + + + 14- 電力変換装置に用いるブロック図記号 + 14- Power converters + 14- Symboles fonctionnels pour convertiseurs de puissance + 14- Blocksymbole für Leistungsumrichter + 14- Blokové značky pro výkonové převodníky-měniče + + + + + + Wechselrichter + Invertor, střídač, převodník(měnič) +stejnosměrného proudu na střídavý + Onduleur + Inverter + + + Author: The QElectroTech team +License: see http://qelectrotech.org/wiki/doc/elements_license + + + + + + label + + + + + + + + + + + + + + + + + + + + + + 08- Måleinstrumenter, lamper og signaludstyr + 08- Measuring instruments, lamps and signalling devices + 08- 計器,ランプ及び信号装置 + 08- Appareils de mesure, lampes et dispositifs de siglalisation + 08- Meß-, Melde- und Signaleinrichtungen + 08- Měřicí přístroje, zdroje světla a signalizační zařízení + 08- Dispositivos de medición, lámparas y dispositivos de señalización + + + + 04- 積算計の例 + 04- Examples of meter or counter instruments + 04- Exemples de compteurs + 04- Beispiele für integrierende Messgeräte + 04- Příklady integračních přístrojů + + + + + + Wattstundenzähler, +Elektrizitätszähler + Compteur d'énergie active +Wattheuremètre + Watthodinový měřič + Watt-hour meter + + Author: The QElectroTech team +License: see http://qelectrotech.org/wiki/doc/elements_license + + + + + + + + + + + + + 02- Symbolelementer, tillægssymboler og andre symboler, som har almindelig anvendelse + 02- Symbol elements, qualifying symbols and other symbols having general application + 02- Éléments de symboles, symboles distinctifs et autres symboles d'application générale + 02- Elementos e identificadores de símbolos + 02- Prvky značek, doplňkové značky a ostatní značky pro všeobecné použití + 02- 図記号要素,限定図記号及びその他の一般用途図記号 + 02- Symbolelemente, Kennzeichen und andere Schaltzeichen für allgemeine Anwendungen + + + + 15- Mise à la terre et à la masse, équipotentialité + 15- Earth, frame or ground connections + 15- Conexiones a Tierra y chasis + 15- Uzemnění a spojení s kostrou, ekvipotencialita + 15- 接地及びフレーム接続又は等電位 + 15- Erde, Masse, Äquipotential + + + + + + Terre, symbole général + Tierra ó neutro, simbolo general + Erde + Earth or ground, general symbol + Uzemnění, všeobecná značka + + Author: The QElectroTech team +License: see http://qelectrotech.org/wiki/doc/elements_license + + + + + + + + + + + + + + + + + Графика + Grafik + Graphics + Grafica + グラフィック + Označení + Grafik + Γραφικά + Gráficos + Grafisch + Oznaczenia + Graphisme + + + + Thumbnails for assembly plan + Miniature per schemi di montaggio + 組立図用サムネイル + Náhledy montážního plánu + Aufbauplanzeichnungen + Budowa rozdzielnic i sterownic + Opbouwtekeningen + Vignettes pour mise en armoire + + + + Thumbnails for mounting plate + Miniature apparecchi guida DIN + Montážní schémata + Miniaturansichten für Montageplatte + Schemat montażowy + Montageplaat miniaturen + Vignettes pour plaque de montage + + + + Legrand + Legrand + + + + Board + Skříně + Tableau + + + + Distribution terminal block + Svorkovnice + Bornier + + + + + + 004830 - Bornier phase 4 x 1,5-16mm² + 004830 - Svorkovnice PE 4 x 1,5-16mm² + + + + Bornier de répartition isolé IP2X terre - 4 connexions 1,5mm² à 16mm²- vert - longueur 47mm + + + + Legrand + + 0048 30 + + + + + Arnaud Valmary + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0048 30 + designation + + + Legrand + manufacturer + + + + + + + + + + + + + 004832 - Bornier phase 8 x 1,5-16mm² + 004832 - Svorkovnice PE 8 x 1,5-16mm² + + + + Bornier de répartition isolé IP2X terre - 8 connexions 1,5mm² à 16mm²- vert - longueur 75mm + + + + Legrand + + 0048 32 + + + + + Arnaud Valmary + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0048 32 + designation + + + Legrand + manufacturer + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Verbindungsklemme 8-polig + Terminale Spring Box 8 + Pružinová svorka 8 vodičů + Borne automatique à ressorts 8 entrées (Wago) + Terminale Spring Box 8 + + + + Author convertor: Ronny Desmedt + ELMT created by dxfTOelmt converter V1.0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + pv+mo + + + + + + + + label + + + + + + + + + + + + + + + + + + + + + + + + Importerede elementer + Uvezeni elementi + elementos importados + Elementi importati + İthal öğeler + Imported elements + Elements importats + Elementen geïmporteerd + Éléments importés + Importierte elemente + Zavedené prvky + Εισηγμένα στοιχεία + Импортированные элементы + Elemente importate + Elementy importowane + Elementos importados + Uvoženi elementi + + + + + + Watt-hour meter + Wattstundenzähler, +Elektrizitätszähler + Compteur d'énergie active +Wattheuremètre + Watthodinový měřič + + + Author: The QElectroTech team +License: see http://qelectrotech.org/wiki/doc/elements_license + + + + label + + + + + + + + + + + + + Электротехника + Elektrisk + Electric + Elettrica + 電気 + Elektrotechnika + Ηλεκτρικά + Eléctrica + Elektrik + Elektrotechniek + Elektrotechnika + Electrique + + + + Многополюсные + Flere ledere + All-pole + Multifilare + 複線 + Többvonalas szimbólumok + Vícežilový + Πολυγραμμικό + Multifilar + Allpolig + Veel polig + Schematy wieloliniowe + Multifilaire + + + + Соединения + Forbindelser + Connections + Collegamenti + 接続 + Csatlakozások + Spojení + Ενώσεις + Verbindungen + Conexiones + Połączenia + Verbindingen + Connections + + + + + + connexion + connection + Bod + Verbindung + Keresztezés pont alakzatban + + + + + + + + label + + + + + + + + + + + + + + + + Primärzelle, -element, +Sekundärzelle, -element, +Batterie von Primär- oder Sekundärzellen, +Akkumulator + Primární článek, +Sekundární článek, +Baterie primárních nebo sekundárních článků + Élément de pile, +Élément d'accumulateur, +Batterie pile ou accumulateurs + Battery cell + + + Author: The QElectroTech team +License: see http://qelectrotech.org/wiki/doc/elements_license + + + + label + + + + + + + + USD2000C + + + + + + + + + + + + + + + + Terminale Spring Box 8 + Verbindungsklemme 8-polig + Pružinová svorka 8 vodičů + Terminale Spring Box 8 + Borne automatique à ressorts 8 entrées (Wago) + + + + Author convertor: Ronny Desmedt + ELMT created by dxfTOelmt converter V1.0 + + + + + + + + + + + + + + + Verbindung + connexion + Keresztezés pont alakzatban + connection + Bod + + + + + + + + label + + + + + + + + + + + + + Verbindung + connexion + Keresztezés pont alakzatban + connection + Bod + + + + + + + + label + + + + + + + + + + + + + Verbindung + connexion + Keresztezés pont alakzatban + connection + Bod + + + + + + + + label + + + + + + + + + + + + + Nom du nouvel élément + + + + + + + + + + + + + + + + + + + + + + + From bad60834cc4e398dc3dd559ec03dee09830f186c Mon Sep 17 00:00:00 2001 From: Andre Rummler Date: Mon, 8 Sep 2025 13:26:54 +0200 Subject: [PATCH 29/65] Update Catch2 library to v2.13.10 --- tests/catch/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/catch/CMakeLists.txt b/tests/catch/CMakeLists.txt index b6ab66bf0..5d39537fe 100644 --- a/tests/catch/CMakeLists.txt +++ b/tests/catch/CMakeLists.txt @@ -64,7 +64,7 @@ Include(FetchContent) FetchContent_Declare( Catch2 GIT_REPOSITORY https://github.com/catchorg/Catch2.git - GIT_TAG v2.13.1) + GIT_TAG v2.13.10) FetchContent_MakeAvailable(Catch2) From ea9d57cddebfd16f3354c07e86e4251b1a31cd16 Mon Sep 17 00:00:00 2001 From: Andre Rummler Date: Mon, 8 Sep 2025 13:27:28 +0200 Subject: [PATCH 30/65] Update googltest library to v1.17.0 --- tests/googletest/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/googletest/CMakeLists.txt b/tests/googletest/CMakeLists.txt index d9a4ae750..bcc85b4de 100644 --- a/tests/googletest/CMakeLists.txt +++ b/tests/googletest/CMakeLists.txt @@ -64,7 +64,7 @@ Include(FetchContent) FetchContent_Declare( GTest GIT_REPOSITORY https://github.com/google/googletest.git - GIT_TAG release-1.10.0) + GIT_TAG v1.17.0) FetchContent_MakeAvailable(GTest) From 67b80364e14a3d5cbca6aa8114e2fd3910b1bacf Mon Sep 17 00:00:00 2001 From: Andre Rummler Date: Mon, 8 Sep 2025 10:55:06 +0200 Subject: [PATCH 31/65] CMAKE/FIX: BE was missing as it had been renamed to nl_BE. RS and UK were not included. --- cmake/qet_compilation_vars.cmake | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/cmake/qet_compilation_vars.cmake b/cmake/qet_compilation_vars.cmake index 85aa6ead8..d0d33af19 100644 --- a/cmake/qet_compilation_vars.cmake +++ b/cmake/qet_compilation_vars.cmake @@ -710,7 +710,6 @@ set(QET_SRC_FILES set(TS_FILES ${QET_DIR}/lang/qet_ar.ts - ${QET_DIR}/lang/qet_be.ts ${QET_DIR}/lang/qet_ca.ts ${QET_DIR}/lang/qet_cs.ts ${QET_DIR}/lang/qet_da.ts @@ -727,16 +726,19 @@ set(TS_FILES ${QET_DIR}/lang/qet_mn.ts ${QET_DIR}/lang/qet_nb.ts ${QET_DIR}/lang/qet_nl.ts + ${QET_DIR}/lang/qet_nl_BE.ts ${QET_DIR}/lang/qet_no.ts ${QET_DIR}/lang/qet_pl.ts ${QET_DIR}/lang/qet_pt.ts ${QET_DIR}/lang/qet_pt_BR.ts ${QET_DIR}/lang/qet_ro.ts + ${QET_DIR}/lang/qet_rs.ts ${QET_DIR}/lang/qet_ru.ts ${QET_DIR}/lang/qet_sk.ts ${QET_DIR}/lang/qet_sl.ts ${QET_DIR}/lang/qet_sr.ts ${QET_DIR}/lang/qet_sv.ts ${QET_DIR}/lang/qet_tr.ts + ${QET_DIR}/lang/qet_uk.ts ${QET_DIR}/lang/qet_zh.ts ) From 8a96097d41203d93415a22c3ca04eb259b871321 Mon Sep 17 00:00:00 2001 From: Laurent Trinques Date: Thu, 11 Sep 2025 13:32:29 +0200 Subject: [PATCH 32/65] Fix Summary headline issue in German https://qelectrotech.org/forum/viewtopic.php?pid=22082#p22082 --- lang/qet_de.qm | Bin 313880 -> 313862 bytes lang/qet_de.ts | 6 +++--- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/lang/qet_de.qm b/lang/qet_de.qm index 897480c54ed69d1ab9c65ff473c32508c219b35e..f4f90dac09cad05664fe5088186d4a1de824fa96 100644 GIT binary patch delta 20232 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 delta 20222 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 Position - Position + Seite @@ -5260,7 +5260,7 @@ Folgende Variablen sind inkompatibel: Position - Position + Seite @@ -8839,7 +8839,7 @@ Möchten Sie sie ersetzen? Position - Position + Seite From 4ebaf073d67b0ca36ac56c511d6dd9183c129838 Mon Sep 17 00:00:00 2001 From: Laurent Trinques Date: Fri, 12 Sep 2025 10:44:39 +0200 Subject: [PATCH 33/65] Fix bug https://qelectrotech.org/bugtracker/view.php?id=330 --- lang/qet_it.qm | Bin 281092 -> 281092 bytes lang/qet_it.ts | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/lang/qet_it.qm b/lang/qet_it.qm index e9afc0fd9c32bb559a7fa436dfb771373f297a07..e04bc0fb9cfe88c21042c1f307af52fd1541ab86 100644 GIT binary patch delta 34 pcmZpfBG@uTaD(N_$ueJMCm&eM*&M&JJ$@x45HoF$U&*|50RRg|4_E*I delta 41 wcmZpfBG@uTaD(N_=?cG?*rreLXJVOtpq5FdIeuk({7Ob3X4)RVl6mO@09l<7zW@LL diff --git a/lang/qet_it.ts b/lang/qet_it.ts index 23e84b8a7..307ac5962 100644 --- a/lang/qet_it.ts +++ b/lang/qet_it.ts @@ -1393,7 +1393,7 @@ Nota: queste opzioni non consentono attivare o disattivare la numerazione automa Information de l'élément - Informazioni dell'elemento + Informazione dell'elemento From 1a1e8a2299594152a514e34486c9b7f24ea80ab3 Mon Sep 17 00:00:00 2001 From: Laurent Trinques Date: Sat, 13 Sep 2025 09:43:04 +0200 Subject: [PATCH 34/65] Fix Summary headline issue on german --- lang/qet_de.qm | Bin 313862 -> 313868 bytes lang/qet_de.ts | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/lang/qet_de.qm b/lang/qet_de.qm index f4f90dac09cad05664fe5088186d4a1de824fa96..3f28f2dadfe5b280191d2367e96abe5ecb328468 100644 GIT binary patch delta 15950 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�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 Position - Seite + Position From 093ec563e106b0b4a7ada6fe327c082debd882ec Mon Sep 17 00:00:00 2001 From: Laurent Trinques Date: Sun, 21 Sep 2025 10:44:16 +0200 Subject: [PATCH 35/65] Generate Chengelog.MD file --- ChangeLog.MD | 338 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 338 insertions(+) create mode 100644 ChangeLog.MD diff --git a/ChangeLog.MD b/ChangeLog.MD new file mode 100644 index 000000000..a72f88fef --- /dev/null +++ b/ChangeLog.MD @@ -0,0 +1,338 @@ +# Changelog + +## [Unreleased](https://github.com/qelectrotech/qelectrotech-source-mirror/tree/HEAD) + +[Full Changelog](https://github.com/qelectrotech/qelectrotech-source-mirror/compare/0.9...HEAD) + +**Closed issues:** + +- Apple silicon download is not working [\#400](https://github.com/qelectrotech/qelectrotech-source-mirror/issues/400) +- Apple silicon download is not working [\#394](https://github.com/qelectrotech/qelectrotech-source-mirror/issues/394) +- Differenciating connector for proper labeling [\#390](https://github.com/qelectrotech/qelectrotech-source-mirror/issues/390) +- Non-perpendicular connections [\#368](https://github.com/qelectrotech/qelectrotech-source-mirror/issues/368) +- using the wrong Application Data folder on Windows [\#325](https://github.com/qelectrotech/qelectrotech-source-mirror/issues/325) +- Unclear which PPA to use [\#321](https://github.com/qelectrotech/qelectrotech-source-mirror/issues/321) +- missing group functionality [\#318](https://github.com/qelectrotech/qelectrotech-source-mirror/issues/318) +- segfault due to calling method of uninitialized object [\#311](https://github.com/qelectrotech/qelectrotech-source-mirror/issues/311) +- Cannot open qelectrotech.app on macOS Sequoia 15.0 [\#307](https://github.com/qelectrotech/qelectrotech-source-mirror/issues/307) +- Dark Mode [\#301](https://github.com/qelectrotech/qelectrotech-source-mirror/issues/301) +- README 404 Not Found URL: qelectrotech.org/download.html needs to be qelectrotech.org/download.php [\#298](https://github.com/qelectrotech/qelectrotech-source-mirror/issues/298) +- Malware warning when trying to install dev version 0.100 [\#290](https://github.com/qelectrotech/qelectrotech-source-mirror/issues/290) +- The page sorting of folio [\#279](https://github.com/qelectrotech/qelectrotech-source-mirror/issues/279) +- Bad file name for translations [\#278](https://github.com/qelectrotech/qelectrotech-source-mirror/issues/278) +- Error using Portuguese Language [\#274](https://github.com/qelectrotech/qelectrotech-source-mirror/issues/274) +- Uninstaller [\#265](https://github.com/qelectrotech/qelectrotech-source-mirror/issues/265) +- New Maintainer [\#263](https://github.com/qelectrotech/qelectrotech-source-mirror/issues/263) +- crash on export project db \(sqlite\) [\#262](https://github.com/qelectrotech/qelectrotech-source-mirror/issues/262) +- https://qelectrotech.org/ is down for several days now ! [\#261](https://github.com/qelectrotech/qelectrotech-source-mirror/issues/261) +- right click on text crashes app [\#260](https://github.com/qelectrotech/qelectrotech-source-mirror/issues/260) +- broken link on github [\#259](https://github.com/qelectrotech/qelectrotech-source-mirror/issues/259) +- Build on Bullseye 11.5 fails [\#254](https://github.com/qelectrotech/qelectrotech-source-mirror/issues/254) +- Question about ARM target in future release [\#238](https://github.com/qelectrotech/qelectrotech-source-mirror/issues/238) +- Component library disappears completely after reset of program [\#87](https://github.com/qelectrotech/qelectrotech-source-mirror/issues/87) +- Can't change language in portable version [\#75](https://github.com/qelectrotech/qelectrotech-source-mirror/issues/75) +- Transformation Matrix for Element Editor [\#56](https://github.com/qelectrotech/qelectrotech-source-mirror/issues/56) + +**Merged pull requests:** + +- Fixing translation file list in CMake [\#404](https://github.com/qelectrotech/qelectrotech-source-mirror/pull/404) ([arummler](https://github.com/arummler)) +- Update dependencies to fix compilation errors [\#403](https://github.com/qelectrotech/qelectrotech-source-mirror/pull/403) ([arummler](https://github.com/arummler)) +- Minor corrections to prevent crashes [\#401](https://github.com/qelectrotech/qelectrotech-source-mirror/pull/401) ([Evilscrack](https://github.com/Evilscrack)) +- Correct compositeText alignment on copying [\#399](https://github.com/qelectrotech/qelectrotech-source-mirror/pull/399) ([ChuckNr11](https://github.com/ChuckNr11)) +- Better handling of conductors when moving [\#398](https://github.com/qelectrotech/qelectrotech-source-mirror/pull/398) ([ChuckNr11](https://github.com/ChuckNr11)) +- A few small improvements [\#395](https://github.com/qelectrotech/qelectrotech-source-mirror/pull/395) ([ChuckNr11](https://github.com/ChuckNr11)) +- qet\_de updated [\#388](https://github.com/qelectrotech/qelectrotech-source-mirror/pull/388) ([Bisku](https://github.com/Bisku)) +- only calculate grid-point-size, when min != max [\#387](https://github.com/qelectrotech/qelectrotech-source-mirror/pull/387) ([plc-user](https://github.com/plc-user)) +- Mouse hover text for dynamic text items [\#386](https://github.com/qelectrotech/qelectrotech-source-mirror/pull/386) ([elevatormind](https://github.com/elevatormind)) +- improvement: adjust size of grid-dots with zoom-factor [\#384](https://github.com/qelectrotech/qelectrotech-source-mirror/pull/384) ([plc-user](https://github.com/plc-user)) +- adjust zoom-factor to use cosmetic-line and fixed comments [\#383](https://github.com/qelectrotech/qelectrotech-source-mirror/pull/383) ([plc-user](https://github.com/plc-user)) +- element-editor: fix jumping positions when rotate, mirror or flip [\#382](https://github.com/qelectrotech/qelectrotech-source-mirror/pull/382) ([plc-user](https://github.com/plc-user)) +- unify some more code for Qt5 & Qt6 \(and more\) [\#379](https://github.com/qelectrotech/qelectrotech-source-mirror/pull/379) ([plc-user](https://github.com/plc-user)) +- same simplifications as in \#376 "use the same code for Qt5 & Qt6" [\#377](https://github.com/qelectrotech/qelectrotech-source-mirror/pull/377) ([plc-user](https://github.com/plc-user)) +- simplify and use the same code for Qt5 & Qt6 [\#376](https://github.com/qelectrotech/qelectrotech-source-mirror/pull/376) ([plc-user](https://github.com/plc-user)) +- bordertitleblock: use same code for Qt5 & Qt6 for "numbering" rows [\#375](https://github.com/qelectrotech/qelectrotech-source-mirror/pull/375) ([plc-user](https://github.com/plc-user)) +- some minor changes [\#374](https://github.com/qelectrotech/qelectrotech-source-mirror/pull/374) ([plc-user](https://github.com/plc-user)) +- implement setting of point-size of grids [\#372](https://github.com/qelectrotech/qelectrotech-source-mirror/pull/372) ([plc-user](https://github.com/plc-user)) +- some small changes for selective move [\#370](https://github.com/qelectrotech/qelectrotech-source-mirror/pull/370) ([plc-user](https://github.com/plc-user)) +- Added slovak translation to org.qelectrotech.qelectrotech.desktop [\#369](https://github.com/qelectrotech/qelectrotech-source-mirror/pull/369) ([prescott66](https://github.com/prescott66)) +- unify calls to "setRotation" for element-primitives again [\#367](https://github.com/qelectrotech/qelectrotech-source-mirror/pull/367) ([plc-user](https://github.com/plc-user)) +- Added option to only move dynamic texts [\#365](https://github.com/qelectrotech/qelectrotech-source-mirror/pull/365) ([scorpio810](https://github.com/scorpio810)) +- New variables for conductor text formulas [\#364](https://github.com/qelectrotech/qelectrotech-source-mirror/pull/364) ([scorpio810](https://github.com/scorpio810)) +- Fix typo widht to width [\#362](https://github.com/qelectrotech/qelectrotech-source-mirror/pull/362) ([pkess](https://github.com/pkess)) +- element-editor: add mirror and flip for "text" [\#361](https://github.com/qelectrotech/qelectrotech-source-mirror/pull/361) ([plc-user](https://github.com/plc-user)) +- Add Swedish translation [\#360](https://github.com/qelectrotech/qelectrotech-source-mirror/pull/360) ([scorpio810](https://github.com/scorpio810)) +- German text for launcher and debian package code style [\#359](https://github.com/qelectrotech/qelectrotech-source-mirror/pull/359) ([pkess](https://github.com/pkess)) +- some more rotation, mirror and flip [\#358](https://github.com/qelectrotech/qelectrotech-source-mirror/pull/358) ([plc-user](https://github.com/plc-user)) +- BugFix: Flip and Mirror of terminals [\#357](https://github.com/qelectrotech/qelectrotech-source-mirror/pull/357) ([plc-user](https://github.com/plc-user)) +- element-editor: fix rotation and more [\#356](https://github.com/qelectrotech/qelectrotech-source-mirror/pull/356) ([plc-user](https://github.com/plc-user)) +- minor: mostly typos [\#355](https://github.com/qelectrotech/qelectrotech-source-mirror/pull/355) ([plc-user](https://github.com/plc-user)) +- a few translated shortcuts were still there ... fixed! [\#354](https://github.com/qelectrotech/qelectrotech-source-mirror/pull/354) ([plc-user](https://github.com/plc-user)) +- FIX: some shortcuts do not work with language set to local [\#353](https://github.com/qelectrotech/qelectrotech-source-mirror/pull/353) ([plc-user](https://github.com/plc-user)) +- fix movement of element, when origin is outside of graphics [\#352](https://github.com/qelectrotech/qelectrotech-source-mirror/pull/352) ([plc-user](https://github.com/plc-user)) +- FIX copy-and-paste in element-editor: set paste-position to meaningful values [\#351](https://github.com/qelectrotech/qelectrotech-source-mirror/pull/351) ([plc-user](https://github.com/plc-user)) +- some cleaning for element-file [\#350](https://github.com/qelectrotech/qelectrotech-source-mirror/pull/350) ([plc-user](https://github.com/plc-user)) +- fix: properties in project-file [\#348](https://github.com/qelectrotech/qelectrotech-source-mirror/pull/348) ([plc-user](https://github.com/plc-user)) +- translation: update German and English [\#347](https://github.com/qelectrotech/qelectrotech-source-mirror/pull/347) ([plc-user](https://github.com/plc-user)) +- export: set maximum width / height according limitations in QPainter [\#346](https://github.com/qelectrotech/qelectrotech-source-mirror/pull/346) ([plc-user](https://github.com/plc-user)) +- export: set maximum width / height according specifications of export-type [\#345](https://github.com/qelectrotech/qelectrotech-source-mirror/pull/345) ([plc-user](https://github.com/plc-user)) +- some clean-up for element-file and in code [\#344](https://github.com/qelectrotech/qelectrotech-source-mirror/pull/344) ([plc-user](https://github.com/plc-user)) +- minor: typos, comments, whitespace, translation [\#343](https://github.com/qelectrotech/qelectrotech-source-mirror/pull/343) ([plc-user](https://github.com/plc-user)) +- Sort names in element-file by language-code [\#342](https://github.com/qelectrotech/qelectrotech-source-mirror/pull/342) ([plc-user](https://github.com/plc-user)) +- more precise Log-Text for search of "qet\_tb\_generator" [\#341](https://github.com/qelectrotech/qelectrotech-source-mirror/pull/341) ([plc-user](https://github.com/plc-user)) +- machine\_info: add entry for QETApp::configDir\(\) also for win [\#340](https://github.com/qelectrotech/qelectrotech-source-mirror/pull/340) ([plc-user](https://github.com/plc-user)) +- remove dead code \(local variables that were never used\) [\#339](https://github.com/qelectrotech/qelectrotech-source-mirror/pull/339) ([plc-user](https://github.com/plc-user)) +- minor changes [\#338](https://github.com/qelectrotech/qelectrotech-source-mirror/pull/338) ([plc-user](https://github.com/plc-user)) +- Update of qet\_de [\#337](https://github.com/qelectrotech/qelectrotech-source-mirror/pull/337) ([Bisku](https://github.com/Bisku)) +- rewrite code for executing “qet\_tb\_generator” plugin [\#335](https://github.com/qelectrotech/qelectrotech-source-mirror/pull/335) ([plc-user](https://github.com/plc-user)) +- build-aux/snap/snapcraft.yaml: python3.8 -\> 3.10 [\#334](https://github.com/qelectrotech/qelectrotech-source-mirror/pull/334) ([zultron](https://github.com/zultron)) +- corrected a few places where QETApp::documentDir\(\) should also be used [\#333](https://github.com/qelectrotech/qelectrotech-source-mirror/pull/333) ([plc-user](https://github.com/plc-user)) +- add commandline-parameter "--data-dir" [\#332](https://github.com/qelectrotech/qelectrotech-source-mirror/pull/332) ([plc-user](https://github.com/plc-user)) +- machine\_info: fix element-count and make static text a bit shorter [\#331](https://github.com/qelectrotech/qelectrotech-source-mirror/pull/331) ([plc-user](https://github.com/plc-user)) +- formatting / whitespace - unify declarations [\#330](https://github.com/qelectrotech/qelectrotech-source-mirror/pull/330) ([plc-user](https://github.com/plc-user)) +- Set default-location for projects to documents-dir. [\#329](https://github.com/qelectrotech/qelectrotech-source-mirror/pull/329) ([plc-user](https://github.com/plc-user)) +- machine\_info.cpp: add explaining text for directory-list [\#328](https://github.com/qelectrotech/qelectrotech-source-mirror/pull/328) ([plc-user](https://github.com/plc-user)) +- set config- and data-dir to system-specific paths [\#327](https://github.com/qelectrotech/qelectrotech-source-mirror/pull/327) ([plc-user](https://github.com/plc-user)) +- Update qet\_cs.ts [\#326](https://github.com/qelectrotech/qelectrotech-source-mirror/pull/326) ([pafri](https://github.com/pafri)) +- update German translation [\#324](https://github.com/qelectrotech/qelectrotech-source-mirror/pull/324) ([plc-user](https://github.com/plc-user)) +- fix copyright-year [\#323](https://github.com/qelectrotech/qelectrotech-source-mirror/pull/323) ([plc-user](https://github.com/plc-user)) +- PT-BR language update [\#322](https://github.com/qelectrotech/qelectrotech-source-mirror/pull/322) ([gleissonjoaquim3](https://github.com/gleissonjoaquim3)) +- Fix: Only scroll diagram-view, when moved text leaves visible area [\#320](https://github.com/qelectrotech/qelectrotech-source-mirror/pull/320) ([plc-user](https://github.com/plc-user)) +- Change Sorting of ElementInfo ComboBox [\#319](https://github.com/qelectrotech/qelectrotech-source-mirror/pull/319) ([ChuckNr11](https://github.com/ChuckNr11)) +- Revert "ElementEditor elmt\_info\_cb sorting changed" [\#317](https://github.com/qelectrotech/qelectrotech-source-mirror/pull/317) ([scorpio810](https://github.com/scorpio810)) +- Fix typo and some whitespace [\#316](https://github.com/qelectrotech/qelectrotech-source-mirror/pull/316) ([plc-user](https://github.com/plc-user)) +- Fix missing company-titleblocks in properties-dialog [\#315](https://github.com/qelectrotech/qelectrotech-source-mirror/pull/315) ([plc-user](https://github.com/plc-user)) +- ElementEditor elmt\_info\_cb sorting changed [\#314](https://github.com/qelectrotech/qelectrotech-source-mirror/pull/314) ([ChuckNr11](https://github.com/ChuckNr11)) +- fix typos and whitespace [\#313](https://github.com/qelectrotech/qelectrotech-source-mirror/pull/313) ([plc-user](https://github.com/plc-user)) +- Force light mode in collections like projects [\#312](https://github.com/qelectrotech/qelectrotech-source-mirror/pull/312) ([Arusekk](https://github.com/Arusekk)) +- About QET: improvements in usability [\#310](https://github.com/qelectrotech/qelectrotech-source-mirror/pull/310) ([plc-user](https://github.com/plc-user)) +- use MessageBox to inform user about additional info when importing scaled element [\#308](https://github.com/qelectrotech/qelectrotech-source-mirror/pull/308) ([plc-user](https://github.com/plc-user)) +- make text for missing software "dxf2elmt" translatable [\#304](https://github.com/qelectrotech/qelectrotech-source-mirror/pull/304) ([plc-user](https://github.com/plc-user)) +- QET\_ElementScaler: fix error for Qt 5.9 and added mirroring [\#303](https://github.com/qelectrotech/qelectrotech-source-mirror/pull/303) ([plc-user](https://github.com/plc-user)) +- integrate "QET\_ElementScaler" as external software [\#302](https://github.com/qelectrotech/qelectrotech-source-mirror/pull/302) ([plc-user](https://github.com/plc-user)) +- move code into else-clause to avoid possible crashes [\#300](https://github.com/qelectrotech/qelectrotech-source-mirror/pull/300) ([plc-user](https://github.com/plc-user)) +- add terminal-names to connection in qet-file [\#297](https://github.com/qelectrotech/qelectrotech-source-mirror/pull/297) ([plc-user](https://github.com/plc-user)) +- fix: editing SpinBoxes with keyboard lose focus [\#296](https://github.com/qelectrotech/qelectrotech-source-mirror/pull/296) ([plc-user](https://github.com/plc-user)) +- Spanish lang update [\#295](https://github.com/qelectrotech/qelectrotech-source-mirror/pull/295) ([joseyspain](https://github.com/joseyspain)) +- More spanish translations.Josey [\#294](https://github.com/qelectrotech/qelectrotech-source-mirror/pull/294) ([joseyspain](https://github.com/joseyspain)) +- update German and English translations [\#293](https://github.com/qelectrotech/qelectrotech-source-mirror/pull/293) ([plc-user](https://github.com/plc-user)) +- hide SVG background checkbox in print preferences [\#292](https://github.com/qelectrotech/qelectrotech-source-mirror/pull/292) ([plc-user](https://github.com/plc-user)) +- fixed indentations of the remaining \*.cpp/\*.h files [\#291](https://github.com/qelectrotech/qelectrotech-source-mirror/pull/291) ([plc-user](https://github.com/plc-user)) +- correct more indentations / whitespace [\#289](https://github.com/qelectrotech/qelectrotech-source-mirror/pull/289) ([plc-user](https://github.com/plc-user)) +- update German and English translations [\#288](https://github.com/qelectrotech/qelectrotech-source-mirror/pull/288) ([plc-user](https://github.com/plc-user)) +- some minor changes [\#286](https://github.com/qelectrotech/qelectrotech-source-mirror/pull/286) ([plc-user](https://github.com/plc-user)) +- correct comments [\#285](https://github.com/qelectrotech/qelectrotech-source-mirror/pull/285) ([plc-user](https://github.com/plc-user)) +- FIX SegFault: Disable menu-entry for DB-export when no project loaded [\#284](https://github.com/qelectrotech/qelectrotech-source-mirror/pull/284) ([plc-user](https://github.com/plc-user)) +- changed some remaining "pt\_br" to "pt\_BR" [\#282](https://github.com/qelectrotech/qelectrotech-source-mirror/pull/282) ([plc-user](https://github.com/plc-user)) +- add option "transparent background" in SVG-export [\#281](https://github.com/qelectrotech/qelectrotech-source-mirror/pull/281) ([plc-user](https://github.com/plc-user)) +- Fix sizes [\#280](https://github.com/qelectrotech/qelectrotech-source-mirror/pull/280) ([plc-user](https://github.com/plc-user)) +- added folder "company-titleblocks" \(incl. language-files\) [\#277](https://github.com/qelectrotech/qelectrotech-source-mirror/pull/277) ([plc-user](https://github.com/plc-user)) +- update translations: de, en, nl [\#276](https://github.com/qelectrotech/qelectrotech-source-mirror/pull/276) ([plc-user](https://github.com/plc-user)) +- fix: set default "company-element-dir" [\#275](https://github.com/qelectrotech/qelectrotech-source-mirror/pull/275) ([plc-user](https://github.com/plc-user)) +- Fix Cmake build [\#273](https://github.com/qelectrotech/qelectrotech-source-mirror/pull/273) ([De-Backer](https://github.com/De-Backer)) +- added "company-collection" as second user-collection [\#272](https://github.com/qelectrotech/qelectrotech-source-mirror/pull/272) ([plc-user](https://github.com/plc-user)) +- corrected german texts for "line-style" [\#269](https://github.com/qelectrotech/qelectrotech-source-mirror/pull/269) ([plc-user](https://github.com/plc-user)) +- Too many parts [\#268](https://github.com/qelectrotech/qelectrotech-source-mirror/pull/268) ([scorpio810](https://github.com/scorpio810)) +- Merge Terminal strip to master [\#267](https://github.com/qelectrotech/qelectrotech-source-mirror/pull/267) ([scorpio810](https://github.com/scorpio810)) +- Terminal strip [\#266](https://github.com/qelectrotech/qelectrotech-source-mirror/pull/266) ([scorpio810](https://github.com/scorpio810)) +- Added new symbols [\#264](https://github.com/qelectrotech/qelectrotech-source-mirror/pull/264) ([kamikazzyyyy](https://github.com/kamikazzyyyy)) + +## [0.9](https://github.com/qelectrotech/qelectrotech-source-mirror/tree/0.9) (2023-01-03) + +[Full Changelog](https://github.com/qelectrotech/qelectrotech-source-mirror/compare/0.9-dev-2022/12/30...0.9) + +## [0.9-dev-2022/12/30](https://github.com/qelectrotech/qelectrotech-source-mirror/tree/0.9-dev-2022/12/30) (2022-12-30) + +[Full Changelog](https://github.com/qelectrotech/qelectrotech-source-mirror/compare/0.9-dev-2022/08/15...0.9-dev-2022/12/30) + +## [0.9-dev-2022/08/15](https://github.com/qelectrotech/qelectrotech-source-mirror/tree/0.9-dev-2022/08/15) (2022-08-13) + +[Full Changelog](https://github.com/qelectrotech/qelectrotech-source-mirror/compare/9-dev-2022/04/22...0.9-dev-2022/08/15) + +**Closed issues:** + +- Polylines always closed on dxf export [\#228](https://github.com/qelectrotech/qelectrotech-source-mirror/issues/228) +- Refreshing after making changes to elements [\#168](https://github.com/qelectrotech/qelectrotech-source-mirror/issues/168) + +## [9-dev-2022/04/22](https://github.com/qelectrotech/qelectrotech-source-mirror/tree/9-dev-2022/04/22) (2022-04-09) + +[Full Changelog](https://github.com/qelectrotech/qelectrotech-source-mirror/compare/9-dev-2021/09/09...9-dev-2022/04/22) + +**Closed issues:** + +- File dialog should enforce suffix [\#206](https://github.com/qelectrotech/qelectrotech-source-mirror/issues/206) +- snap: Update stable release to core20 & introduce branch for stable releases [\#201](https://github.com/qelectrotech/qelectrotech-source-mirror/issues/201) +- Can we submit Flatpak to Flathub? [\#143](https://github.com/qelectrotech/qelectrotech-source-mirror/issues/143) + +## [9-dev-2021/09/09](https://github.com/qelectrotech/qelectrotech-source-mirror/tree/9-dev-2021/09/09) (2021-09-08) + +[Full Changelog](https://github.com/qelectrotech/qelectrotech-source-mirror/compare/9-dev-2021/06/28...9-dev-2021/09/09) + +## [9-dev-2021/06/28](https://github.com/qelectrotech/qelectrotech-source-mirror/tree/9-dev-2021/06/28) (2021-07-06) + +[Full Changelog](https://github.com/qelectrotech/qelectrotech-source-mirror/compare/9-dev-2021/05/09...9-dev-2021/06/28) + +## [9-dev-2021/05/09](https://github.com/qelectrotech/qelectrotech-source-mirror/tree/9-dev-2021/05/09) (2021-05-09) + +[Full Changelog](https://github.com/qelectrotech/qelectrotech-source-mirror/compare/0.9-dev-2021/05...9-dev-2021/05/09) + +## [0.9-dev-2021/05](https://github.com/qelectrotech/qelectrotech-source-mirror/tree/0.9-dev-2021/05) (2021-04-30) + +[Full Changelog](https://github.com/qelectrotech/qelectrotech-source-mirror/compare/0.8.0...0.9-dev-2021/05) + +**Merged pull requests:** + +- Rewrite how Properties are stored in the Project file [\#144](https://github.com/qelectrotech/qelectrotech-source-mirror/pull/144) ([Murmele](https://github.com/Murmele)) +- Xml properties rebase2 [\#80](https://github.com/qelectrotech/qelectrotech-source-mirror/pull/80) ([Murmele](https://github.com/Murmele)) + +## [0.8.0](https://github.com/qelectrotech/qelectrotech-source-mirror/tree/0.8.0) (2021-02-21) + +[Full Changelog](https://github.com/qelectrotech/qelectrotech-source-mirror/compare/0.9-dev...0.8.0) + +## [0.9-dev](https://github.com/qelectrotech/qelectrotech-source-mirror/tree/0.9-dev) (2021-02-21) + +[Full Changelog](https://github.com/qelectrotech/qelectrotech-source-mirror/compare/0.8.rc...0.9-dev) + +**Closed issues:** + +- QET font [\#110](https://github.com/qelectrotech/qelectrotech-source-mirror/issues/110) + +## [0.8.rc](https://github.com/qelectrotech/qelectrotech-source-mirror/tree/0.8.rc) (2020-12-01) + +[Full Changelog](https://github.com/qelectrotech/qelectrotech-source-mirror/compare/0.8-dev...0.8.rc) + +**Closed issues:** + +- overlapping comparisons always evaluate to true [\#78](https://github.com/qelectrotech/qelectrotech-source-mirror/issues/78) +- New snap break HiDPI [\#41](https://github.com/qelectrotech/qelectrotech-source-mirror/issues/41) + +## [0.8-dev](https://github.com/qelectrotech/qelectrotech-source-mirror/tree/0.8-dev) (2019-08-06) + +[Full Changelog](https://github.com/qelectrotech/qelectrotech-source-mirror/compare/0.7.0...0.8-dev) + +## [0.7.0](https://github.com/qelectrotech/qelectrotech-source-mirror/tree/0.7.0) (2019-07-17) + +[Full Changelog](https://github.com/qelectrotech/qelectrotech-source-mirror/compare/0.2a...0.7.0) + +## [0.2a](https://github.com/qelectrotech/qelectrotech-source-mirror/tree/0.2a) (2019-06-26) + +[Full Changelog](https://github.com/qelectrotech/qelectrotech-source-mirror/compare/0.2b...0.2a) + +## [0.2b](https://github.com/qelectrotech/qelectrotech-source-mirror/tree/0.2b) (2019-06-26) + +[Full Changelog](https://github.com/qelectrotech/qelectrotech-source-mirror/compare/0.2rc1...0.2b) + +## [0.2rc1](https://github.com/qelectrotech/qelectrotech-source-mirror/tree/0.2rc1) (2019-06-26) + +[Full Changelog](https://github.com/qelectrotech/qelectrotech-source-mirror/compare/0.2rc2...0.2rc1) + +## [0.2rc2](https://github.com/qelectrotech/qelectrotech-source-mirror/tree/0.2rc2) (2019-06-26) + +[Full Changelog](https://github.com/qelectrotech/qelectrotech-source-mirror/compare/0.2...0.2rc2) + +## [0.2](https://github.com/qelectrotech/qelectrotech-source-mirror/tree/0.2) (2019-06-26) + +[Full Changelog](https://github.com/qelectrotech/qelectrotech-source-mirror/compare/0.3a...0.2) + +## [0.3a](https://github.com/qelectrotech/qelectrotech-source-mirror/tree/0.3a) (2019-06-26) + +[Full Changelog](https://github.com/qelectrotech/qelectrotech-source-mirror/compare/0.11...0.3a) + +## [0.11](https://github.com/qelectrotech/qelectrotech-source-mirror/tree/0.11) (2019-06-26) + +[Full Changelog](https://github.com/qelectrotech/qelectrotech-source-mirror/compare/0.21...0.11) + +## [0.21](https://github.com/qelectrotech/qelectrotech-source-mirror/tree/0.21) (2019-06-26) + +[Full Changelog](https://github.com/qelectrotech/qelectrotech-source-mirror/compare/0.22...0.21) + +## [0.22](https://github.com/qelectrotech/qelectrotech-source-mirror/tree/0.22) (2019-06-26) + +[Full Changelog](https://github.com/qelectrotech/qelectrotech-source-mirror/compare/0.70rc2...0.22) + +## [0.70rc2](https://github.com/qelectrotech/qelectrotech-source-mirror/tree/0.70rc2) (2019-06-25) + +[Full Changelog](https://github.com/qelectrotech/qelectrotech-source-mirror/compare/0.70rc1...0.70rc2) + +## [0.70rc1](https://github.com/qelectrotech/qelectrotech-source-mirror/tree/0.70rc1) (2019-04-12) + +[Full Changelog](https://github.com/qelectrotech/qelectrotech-source-mirror/compare/0.61...0.70rc1) + +## [0.61](https://github.com/qelectrotech/qelectrotech-source-mirror/tree/0.61) (2018-08-23) + +[Full Changelog](https://github.com/qelectrotech/qelectrotech-source-mirror/compare/0.6...0.61) + +## [0.6](https://github.com/qelectrotech/qelectrotech-source-mirror/tree/0.6) (2018-03-06) + +[Full Changelog](https://github.com/qelectrotech/qelectrotech-source-mirror/compare/0.6rc4...0.6) + +## [0.6rc4](https://github.com/qelectrotech/qelectrotech-source-mirror/tree/0.6rc4) (2018-01-12) + +[Full Changelog](https://github.com/qelectrotech/qelectrotech-source-mirror/compare/0.6rc3...0.6rc4) + +## [0.6rc3](https://github.com/qelectrotech/qelectrotech-source-mirror/tree/0.6rc3) (2017-09-20) + +[Full Changelog](https://github.com/qelectrotech/qelectrotech-source-mirror/compare/0.6rc2...0.6rc3) + +## [0.6rc2](https://github.com/qelectrotech/qelectrotech-source-mirror/tree/0.6rc2) (2017-06-13) + +[Full Changelog](https://github.com/qelectrotech/qelectrotech-source-mirror/compare/0.6rc1...0.6rc2) + +## [0.6rc1](https://github.com/qelectrotech/qelectrotech-source-mirror/tree/0.6rc1) (2017-04-23) + +[Full Changelog](https://github.com/qelectrotech/qelectrotech-source-mirror/compare/0.5...0.6rc1) + +## [0.5](https://github.com/qelectrotech/qelectrotech-source-mirror/tree/0.5) (2015-11-27) + +[Full Changelog](https://github.com/qelectrotech/qelectrotech-source-mirror/compare/0.5rc1...0.5) + +## [0.5rc1](https://github.com/qelectrotech/qelectrotech-source-mirror/tree/0.5rc1) (2015-10-30) + +[Full Changelog](https://github.com/qelectrotech/qelectrotech-source-mirror/compare/0.5b...0.5rc1) + +## [0.5b](https://github.com/qelectrotech/qelectrotech-source-mirror/tree/0.5b) (2015-10-04) + +[Full Changelog](https://github.com/qelectrotech/qelectrotech-source-mirror/compare/0.4...0.5b) + +## [0.4](https://github.com/qelectrotech/qelectrotech-source-mirror/tree/0.4) (2015-02-20) + +[Full Changelog](https://github.com/qelectrotech/qelectrotech-source-mirror/compare/0.4rc2...0.4) + +## [0.4rc2](https://github.com/qelectrotech/qelectrotech-source-mirror/tree/0.4rc2) (2014-12-27) + +[Full Changelog](https://github.com/qelectrotech/qelectrotech-source-mirror/compare/0.4rc1...0.4rc2) + +## [0.4rc1](https://github.com/qelectrotech/qelectrotech-source-mirror/tree/0.4rc1) (2014-11-10) + +[Full Changelog](https://github.com/qelectrotech/qelectrotech-source-mirror/compare/0.4b...0.4rc1) + +## [0.4b](https://github.com/qelectrotech/qelectrotech-source-mirror/tree/0.4b) (2014-11-02) + +[Full Changelog](https://github.com/qelectrotech/qelectrotech-source-mirror/compare/0.3...0.4b) + +## [0.3](https://github.com/qelectrotech/qelectrotech-source-mirror/tree/0.3) (2013-09-28) + +[Full Changelog](https://github.com/qelectrotech/qelectrotech-source-mirror/compare/0.3rc...0.3) + +## [0.3rc](https://github.com/qelectrotech/qelectrotech-source-mirror/tree/0.3rc) (2013-09-10) + +[Full Changelog](https://github.com/qelectrotech/qelectrotech-source-mirror/compare/0.3b...0.3rc) + +## [0.3b](https://github.com/qelectrotech/qelectrotech-source-mirror/tree/0.3b) (2013-06-18) + +[Full Changelog](https://github.com/qelectrotech/qelectrotech-source-mirror/compare/0.1...0.3b) + +## [0.1](https://github.com/qelectrotech/qelectrotech-source-mirror/tree/0.1) (2008-03-08) + +[Full Changelog](https://github.com/qelectrotech/qelectrotech-source-mirror/compare/0.1rc1...0.1) + +## [0.1rc1](https://github.com/qelectrotech/qelectrotech-source-mirror/tree/0.1rc1) (2008-03-02) + +[Full Changelog](https://github.com/qelectrotech/qelectrotech-source-mirror/compare/0.1b...0.1rc1) + +## [0.1b](https://github.com/qelectrotech/qelectrotech-source-mirror/tree/0.1b) (2007-12-23) + +[Full Changelog](https://github.com/qelectrotech/qelectrotech-source-mirror/compare/5cadf173c7b73460b62409c81568fc8999177d52...0.1b) + + + +\* *This Changelog was automatically generated by [github_changelog_generator](https://github.com/github-changelog-generator/github-changelog-generator)* From f6ba47277dd5f5e42c5aaa11276e06cf671ff504 Mon Sep 17 00:00:00 2001 From: joshua Date: Thu, 2 Oct 2025 21:52:40 +0200 Subject: [PATCH 36/65] Minor : revamp Use QGIUtility::drawBoundingRectSelection for draw the selection rect of element instead of a method of the element itself. Less code. --- sources/qetgraphicsitem/element.cpp | 31 ++--------------------------- sources/qetgraphicsitem/element.h | 3 --- 2 files changed, 2 insertions(+), 32 deletions(-) diff --git a/sources/qetgraphicsitem/element.cpp b/sources/qetgraphicsitem/element.cpp index 5f5315444..0817155ec 100644 --- a/sources/qetgraphicsitem/element.cpp +++ b/sources/qetgraphicsitem/element.cpp @@ -34,6 +34,7 @@ #include "elementtextitemgroup.h" #include "iostream" #include "../qetxml.h" +#include "qgraphicsitemutility.h" #include #include @@ -242,7 +243,7 @@ void Element::paint( //Draw the selection rectangle if ( isSelected() || m_mouse_over ) { - drawSelection(painter, options); + QGIUtility::drawBoundingRectSelection(this, painter); } } @@ -340,34 +341,6 @@ void Element::drawAxes( /*** Methodes privees ***/ -/** - Dessine le cadre de selection de l'element de maniere systematiquement non antialiasee. - @param painter Le QPainter a utiliser pour dessiner les bornes. - @param options Les options de style a prendre en compte -*/ -void Element::drawSelection( - QPainter *painter, - const QStyleOptionGraphicsItem *options) -{ - Q_UNUSED(options) - painter -> save(); - // Annulation des renderhints - painter -> setRenderHint(QPainter::Antialiasing, false); - painter -> setRenderHint(QPainter::TextAntialiasing, false); - painter -> setRenderHint(QPainter::SmoothPixmapTransform, false); - // Dessin du cadre de selection en gris - QPen t; - t.setColor(Qt::gray); - t.setStyle(Qt::DashDotLine); - t.setCosmetic(true); - painter -> setPen(t); - // Le dessin se fait a partir du rectangle delimitant - painter -> drawRoundedRect(boundingRect().adjusted(1, 1, -1, -1), - 10, - 10); - painter -> restore(); -} - /** Dessine le cadre de selection de l'element de maniere systematiquement non antialiasee. @param painter Le QPainter a utiliser pour dessiner les bornes. diff --git a/sources/qetgraphicsitem/element.h b/sources/qetgraphicsitem/element.h index 96ba46205..0565ffc01 100644 --- a/sources/qetgraphicsitem/element.h +++ b/sources/qetgraphicsitem/element.h @@ -197,9 +197,6 @@ class Element : public QetGraphicsItem void setSize(int, int); private: - void drawSelection( - QPainter *, - const QStyleOptionGraphicsItem *); void drawHighlight( QPainter *, const QStyleOptionGraphicsItem *); From f0ec416a91233193f3e2f6582c5c0ad869f855de Mon Sep 17 00:00:00 2001 From: joshua Date: Fri, 3 Oct 2025 21:49:21 +0200 Subject: [PATCH 37/65] Terminal strip graphic item can display Xref of terminal --- .../GraphicsItem/demoterminalstrip.cpp | 110 ++++---- .../properties/terminalstriplayoutpattern.cpp | 27 +- .../properties/terminalstriplayoutpattern.h | 16 +- .../GraphicsItem/terminalstripdrawer.cpp | 32 ++- .../GraphicsItem/terminalstripdrawer.h | 1 + .../GraphicsItem/trueterminalstrip.cpp | 10 + .../GraphicsItem/trueterminalstrip.h | 1 + .../ui/terminalstriplayouteditor.cpp | 41 +++ .../ui/terminalstriplayouteditor.ui | 244 ++++++++++++++---- sources/xml/terminalstriplayoutpatternxml.cpp | 15 ++ 10 files changed, 390 insertions(+), 107 deletions(-) diff --git a/sources/TerminalStrip/GraphicsItem/demoterminalstrip.cpp b/sources/TerminalStrip/GraphicsItem/demoterminalstrip.cpp index bea467656..91edb3092 100644 --- a/sources/TerminalStrip/GraphicsItem/demoterminalstrip.cpp +++ b/sources/TerminalStrip/GraphicsItem/demoterminalstrip.cpp @@ -38,9 +38,10 @@ namespace TerminalStripDrawer class DemoRealTerminal : public AbstractRealTerminalInterface { public: - DemoRealTerminal(const QString &label, const QUuid &bridge) : - m_label { label }, - m_bridge { bridge } + DemoRealTerminal(const QString &label, const QString &xref, const QUuid &bridge) : + m_label { label }, + m_xref{ xref }, + m_bridge { bridge } {} QString label() const override { @@ -55,8 +56,12 @@ namespace TerminalStripDrawer return new DemoBridge { m_bridge }; } + QString xref() const override { + return m_xref; + } + private: - QString m_label; + QString m_label, m_xref; QUuid m_bridge; }; @@ -101,52 +106,65 @@ namespace TerminalStripDrawer QVector > real_terminals_vector; - real_terminals_vector << QSharedPointer { - new DemoRealTerminal( QStringLiteral("24vdc"), - lvl_1)}; - real_terminals_vector << QSharedPointer { - new DemoRealTerminal( QStringLiteral("0vdc"), - lvl_2)}; - real_terminals_vector << QSharedPointer { - new DemoRealTerminal( QStringLiteral("signal"), - lvl_3)}; - real_terminals_vector << QSharedPointer { - new DemoRealTerminal( QStringLiteral("teach"), - lvl_4)}; - m_physical_terminal << QSharedPointer { - new DemoPhysicalTerminal {real_terminals_vector}}; + real_terminals_vector << QSharedPointer { + new DemoRealTerminal( QStringLiteral("24vdc"), + QStringLiteral("1_A1"), + lvl_1)}; + real_terminals_vector << QSharedPointer { + new DemoRealTerminal( QStringLiteral("0vdc"), + QStringLiteral("1_A2"), + lvl_2)}; + real_terminals_vector << QSharedPointer { + new DemoRealTerminal( QStringLiteral("signal"), + QStringLiteral("1_A3"), + lvl_3)}; + real_terminals_vector << QSharedPointer { + new DemoRealTerminal( QStringLiteral("teach"), + QStringLiteral("1_A4"), + lvl_4)}; + m_physical_terminal << QSharedPointer { + new DemoPhysicalTerminal {real_terminals_vector}}; real_terminals_vector.clear(); - real_terminals_vector << QSharedPointer { - new DemoRealTerminal( QStringLiteral("24vdc"), - lvl_1)}; - real_terminals_vector << QSharedPointer { - new DemoRealTerminal( QStringLiteral("0vdc"), - lvl_2)}; - real_terminals_vector << QSharedPointer { - new DemoRealTerminal( QStringLiteral("signal"), - lvl_3)}; - real_terminals_vector << QSharedPointer { - new DemoRealTerminal( QStringLiteral("teach"), - lvl_4)}; - m_physical_terminal << QSharedPointer { - new DemoPhysicalTerminal {real_terminals_vector}}; + real_terminals_vector << QSharedPointer { + new DemoRealTerminal( QStringLiteral("24vdc"), + QStringLiteral("2_A1"), + lvl_1)}; + real_terminals_vector << QSharedPointer { + new DemoRealTerminal( QStringLiteral("0vdc"), + QStringLiteral("2_A2"), + lvl_2)}; + real_terminals_vector << QSharedPointer { + new DemoRealTerminal( QStringLiteral("signal"), + QStringLiteral("2_A3"), + lvl_3)}; + real_terminals_vector << QSharedPointer { + new DemoRealTerminal( QStringLiteral("teach"), + QStringLiteral("2_A4"), + lvl_4)}; + m_physical_terminal << QSharedPointer { + new DemoPhysicalTerminal {real_terminals_vector}}; + real_terminals_vector.clear(); - real_terminals_vector << QSharedPointer { - new DemoRealTerminal( QStringLiteral("24vdc"), - lvl_1)}; - real_terminals_vector << QSharedPointer { - new DemoRealTerminal( QStringLiteral("0vdc"), - lvl_2)}; - real_terminals_vector << QSharedPointer { - new DemoRealTerminal( QStringLiteral("signal"), - lvl_3)}; - real_terminals_vector << QSharedPointer { - new DemoRealTerminal( QStringLiteral("teach"), - lvl_4)}; - m_physical_terminal << QSharedPointer { - new DemoPhysicalTerminal {real_terminals_vector}}; + real_terminals_vector << QSharedPointer { + new DemoRealTerminal( QStringLiteral("24vdc"), + QStringLiteral("3_A1"), + lvl_1)}; + real_terminals_vector << QSharedPointer { + new DemoRealTerminal( QStringLiteral("0vdc"), + QStringLiteral("3_A2"), + lvl_2)}; + real_terminals_vector << QSharedPointer { + new DemoRealTerminal( QStringLiteral("signal"), + QStringLiteral("3_A3"), + lvl_3)}; + real_terminals_vector << QSharedPointer { + new DemoRealTerminal( QStringLiteral("teach"), + QStringLiteral("3_A4"), + lvl_4)}; + m_physical_terminal << QSharedPointer { + new DemoPhysicalTerminal {real_terminals_vector}}; } } diff --git a/sources/TerminalStrip/GraphicsItem/properties/terminalstriplayoutpattern.cpp b/sources/TerminalStrip/GraphicsItem/properties/terminalstriplayoutpattern.cpp index 84baeb591..82fba3498 100644 --- a/sources/TerminalStrip/GraphicsItem/properties/terminalstriplayoutpattern.cpp +++ b/sources/TerminalStrip/GraphicsItem/properties/terminalstriplayoutpattern.cpp @@ -17,7 +17,6 @@ */ #include "terminalstriplayoutpattern.h" #include "../../../utils/qetutils.h" -#include TerminalStripLayoutPattern::TerminalStripLayoutPattern() { @@ -80,6 +79,29 @@ QTextOption TerminalStripLayoutPattern::terminalsTextOption() const return m_terminals_text_option; } +/** + * @brief TerminalStripLayoutPattern::setXrefTextAlignment + * Set text alignment to @param alignment. If alignment have no + * flag this function do nothing + * @param alignment + */ +void TerminalStripLayoutPattern::setXrefTextAlignment(const Qt::Alignment &alignment) +{ + if (!alignment) return; + m_xref_text_alignment = alignment; + updateTerminalsTextOption(); +} + +Qt::Alignment TerminalStripLayoutPattern::xrefTextAlignment() const +{ + return m_xref_text_alignment; +} + +QTextOption TerminalStripLayoutPattern::xrefTextOption() const +{ + return m_xref_text_option; +} + void TerminalStripLayoutPattern::updateHeaderTextOption() { m_header_text_option.setAlignment(m_header_text_alignment); @@ -90,4 +112,7 @@ void TerminalStripLayoutPattern::updateTerminalsTextOption() { m_terminals_text_option.setAlignment(m_terminals_text_alignment); m_terminals_text_option.setWrapMode(QTextOption::WordWrap); + + m_xref_text_option.setAlignment(m_xref_text_alignment); + m_xref_text_option.setWrapMode(QTextOption::WordWrap); } diff --git a/sources/TerminalStrip/GraphicsItem/properties/terminalstriplayoutpattern.h b/sources/TerminalStrip/GraphicsItem/properties/terminalstriplayoutpattern.h index 1b5f0c40a..6dbc0da82 100644 --- a/sources/TerminalStrip/GraphicsItem/properties/terminalstriplayoutpattern.h +++ b/sources/TerminalStrip/GraphicsItem/properties/terminalstriplayoutpattern.h @@ -74,6 +74,14 @@ class TerminalStripLayoutPattern qreal m_terminals_text_y{35}; Qt::Orientation m_terminals_text_orientation {Qt::Vertical}; + //Xref text + void setXrefTextAlignment(const Qt::Alignment &alignment); + Qt::Alignment xrefTextAlignment() const; + QTextOption xrefTextOption() const; + qreal m_xref_text_height{60}; + qreal m_xref_text_y{95}; + Qt::Orientation m_xref_text_orientation {Qt::Vertical}; + qreal m_bridge_point_d{5}; QVector m_bridge_point_y_offset{50,70,90,110}; @@ -89,8 +97,12 @@ class TerminalStripLayoutPattern Qt::Alignment m_header_text_alignment{Qt::AlignCenter}; QTextOption m_header_text_option; - Qt::Alignment m_terminals_text_alignment {Qt::AlignRight | Qt::AlignVCenter}; - QTextOption m_terminals_text_option{QTextOption()}; + Qt::Alignment + m_terminals_text_alignment {Qt::AlignRight | Qt::AlignVCenter}, + m_xref_text_alignment {Qt::AlignLeft | Qt::AlignVCenter}; + QTextOption + m_terminals_text_option{QTextOption()}, + m_xref_text_option{QTextOption()}; }; #endif // TERMINALSTRIPLAYOUTPATTERN_H diff --git a/sources/TerminalStrip/GraphicsItem/terminalstripdrawer.cpp b/sources/TerminalStrip/GraphicsItem/terminalstripdrawer.cpp index 4b94b9284..f71542c3d 100644 --- a/sources/TerminalStrip/GraphicsItem/terminalstripdrawer.cpp +++ b/sources/TerminalStrip/GraphicsItem/terminalstripdrawer.cpp @@ -16,6 +16,7 @@ along with QElectroTech. If not, see . */ #include "terminalstripdrawer.h" + #include namespace TerminalStripDrawer { @@ -111,6 +112,12 @@ void TerminalStripDrawer::paint(QPainter *painter) const auto terminals_text_y{m_pattern->m_terminals_text_y}; QRectF terminal_rect; + const auto xref_text_orientation{m_pattern->m_xref_text_orientation}; + const auto xref_text_option{m_pattern->xrefTextOption()}; + const auto xref_text_height{m_pattern->m_xref_text_height}; + const auto xref_text_y{m_pattern->m_xref_text_y}; + QRectF xref_rect; + QHash> bridges_anchor_points; //Loop over physical terminals @@ -170,9 +177,9 @@ void TerminalStripDrawer::paint(QPainter *painter) } const auto shared_real_terminal{real_terminal_vector[i]}; - painter->drawText(text_rect, - shared_real_terminal ? shared_real_terminal->label() : QLatin1String(), - terminals_text_option); + painter->drawText(text_rect, + shared_real_terminal ? shared_real_terminal->label() : QLatin1String(), + terminals_text_option); if (m_preview_draw) { @@ -182,6 +189,25 @@ void TerminalStripDrawer::paint(QPainter *painter) painter->restore(); + //Draw xref + auto xref_string = shared_real_terminal->xref(); + painter->save(); + xref_rect.setRect(0, xref_text_y, terminal_rect.width(), xref_text_height); + if (xref_text_orientation == Qt::Vertical) + { + painter->translate(xref_rect.bottomLeft()); + painter->rotate(270); + xref_rect.setRect(0, 0, xref_rect.height(), xref_rect.width()); + } + painter->drawText(xref_rect, xref_string, xref_text_option); + + if (m_preview_draw) + { + painter->setPen(Qt::blue); + painter->drawRect(xref_rect); + } + painter->restore(); + //Add bridge anchor if (shared_real_terminal->isBridged()) { diff --git a/sources/TerminalStrip/GraphicsItem/terminalstripdrawer.h b/sources/TerminalStrip/GraphicsItem/terminalstripdrawer.h index 72286c41d..8fa5fd8e1 100644 --- a/sources/TerminalStrip/GraphicsItem/terminalstripdrawer.h +++ b/sources/TerminalStrip/GraphicsItem/terminalstripdrawer.h @@ -43,6 +43,7 @@ namespace TerminalStripDrawer virtual QString label() const = 0; virtual bool isBridged() const = 0; virtual AbstractBridgeInterface* bridge() const = 0; + virtual QString xref() const = 0; }; class AbstractPhysicalTerminalInterface diff --git a/sources/TerminalStrip/GraphicsItem/trueterminalstrip.cpp b/sources/TerminalStrip/GraphicsItem/trueterminalstrip.cpp index 15273e4c1..29e1ad0ef 100644 --- a/sources/TerminalStrip/GraphicsItem/trueterminalstrip.cpp +++ b/sources/TerminalStrip/GraphicsItem/trueterminalstrip.cpp @@ -20,6 +20,7 @@ #include "../realterminal.h" #include "../terminalstrip.h" #include "../terminalstripbridge.h" +#include "../../autoNum/assignvariables.h" #include "terminalstripdrawer.h" @@ -118,6 +119,15 @@ namespace TerminalStripDrawer return new TrueBridge(m_real->bridge()); } + QString TrueRealTerminal::xref() const + { + if (m_real && m_real->isElement()) { + return autonum::AssignVariables::genericXref(m_real->element()); + } else { + return QString{}; + } + } + TrueBridge::TrueBridge(QSharedPointer bridge) : m_bridge { bridge } {} diff --git a/sources/TerminalStrip/GraphicsItem/trueterminalstrip.h b/sources/TerminalStrip/GraphicsItem/trueterminalstrip.h index 10b3775fa..d94827553 100644 --- a/sources/TerminalStrip/GraphicsItem/trueterminalstrip.h +++ b/sources/TerminalStrip/GraphicsItem/trueterminalstrip.h @@ -58,6 +58,7 @@ namespace TerminalStripDrawer QString label() const override; bool isBridged() const override; AbstractBridgeInterface* bridge() const override; + QString xref() const override; private: QSharedPointer m_real; diff --git a/sources/TerminalStrip/ui/terminalstriplayouteditor.cpp b/sources/TerminalStrip/ui/terminalstriplayouteditor.cpp index b54164f94..85744e00e 100644 --- a/sources/TerminalStrip/ui/terminalstriplayouteditor.cpp +++ b/sources/TerminalStrip/ui/terminalstriplayouteditor.cpp @@ -108,6 +108,7 @@ void TerminalStripLayoutEditor::valueEdited() m_layout.data()->setHeaderTextAlignment(Qt::AlignRight | Qt::AlignVCenter); break; } + //Terminal text m_layout.data()->m_terminals_text_orientation = ui->m_terminal_text_orientation_cb->currentIndex() == 0 ? Qt::Horizontal : Qt::Vertical; @@ -127,6 +128,26 @@ void TerminalStripLayoutEditor::valueEdited() m_layout.data()->m_terminals_text_y = ui->m_terminal_text_y_sb->value(); m_layout.data()->m_terminals_text_height = ui->m_terminal_text_height_sb->value(); + //Xref text + m_layout.data()->m_xref_text_orientation = ui->m_xref_orientation_cb->currentIndex() == 0 ? + Qt::Horizontal : + Qt::Vertical; + + switch (ui->m_xref_alignment_cb->currentIndex()) { + case 0: + m_layout.data()->setXrefTextAlignment(Qt::Alignment {Qt::AlignLeft | Qt::AlignVCenter}); + break; + case 1: + m_layout.data()->setXrefTextAlignment(Qt::Alignment { Qt::AlignHCenter | Qt::AlignVCenter}); + break; + default: + m_layout.data()->setXrefTextAlignment(Qt::Alignment { Qt::AlignRight | Qt::AlignVCenter}); + break; + } + + m_layout.data()->m_xref_text_y = ui->m_xref_y_sb->value(); + m_layout.data()->m_xref_text_height = ui->m_xref_height_sb->value(); + updateUi(); m_preview_strip_item.update(); } @@ -200,6 +221,7 @@ void TerminalStripLayoutEditor::updateUi() ui->m_header_text_alignment_cb->setCurrentIndex(2); } + //Terminal text const auto terminal_alignment = data->terminalsTextAlignment(); if (terminal_alignment &Qt::AlignLeft) { ui->m_terminal_text_alignment_cb->setCurrentIndex(0); @@ -212,6 +234,25 @@ void TerminalStripLayoutEditor::updateUi() ui->m_terminal_text_y_sb->setValue(data->m_terminals_text_y); ui->m_terminal_text_height_sb->setValue(data->m_terminals_text_height); + //Xref text + if (data->m_xref_text_orientation == Qt::Horizontal) { + ui->m_xref_orientation_cb->setCurrentIndex(0); + } else { + ui->m_xref_orientation_cb->setCurrentIndex(1); + } + + const auto xref_alignment = data->xrefTextAlignment(); + if (xref_alignment &Qt::AlignLeft) { + ui->m_xref_alignment_cb->setCurrentIndex(0); + } else if (xref_alignment &Qt::AlignHCenter) { + ui->m_xref_alignment_cb->setCurrentIndex(1); + } else if (xref_alignment &Qt::AlignRight) { + ui->m_xref_alignment_cb->setCurrentIndex(2); + } + + ui->m_xref_y_sb->setValue(data->m_xref_text_y); + ui->m_xref_height_sb->setValue(data->m_xref_text_height); + m_ui_updating = false; updatePreview(); } diff --git a/sources/TerminalStrip/ui/terminalstriplayouteditor.ui b/sources/TerminalStrip/ui/terminalstriplayouteditor.ui index f8f74789a..c9a762252 100644 --- a/sources/TerminalStrip/ui/terminalstriplayouteditor.ui +++ b/sources/TerminalStrip/ui/terminalstriplayouteditor.ui @@ -6,8 +6,8 @@ 0 0 - 683 - 589 + 961 + 624 @@ -15,7 +15,7 @@ - QLayout::SizeConstraint::SetMaximumSize + QLayout::SetMaximumSize @@ -34,7 +34,7 @@ - Qt::Orientation::Horizontal + Qt::Horizontal @@ -173,7 +173,7 @@ - Qt::Orientation::Horizontal + Qt::Horizontal @@ -213,13 +213,6 @@ 0 - - - - Longueur maximal du texte de borne - - - @@ -253,38 +246,17 @@ - - - - - Horizontal - - - - - Vertical - - - - - Orientation du texte d'en tête : + Orientation - Alignement du texte d'en tête : - - - - - - - Origine vertical du texte de borne : + Alignement @@ -330,7 +302,7 @@ - Qt::Orientation::Horizontal + Qt::Horizontal @@ -343,7 +315,48 @@ - + + + + Texte d'en tête + + + Qt::AlignCenter + + + + + + + Origine vertical + + + + + + + Longueur maximal + + + + + + + 1000 + + + + + + + 30 + + + 1000 + + + + @@ -362,30 +375,87 @@ - - - - 30 + + + + + Horizontal + + + + + Vertical + + + + + + + + Texte borne + + Qt::AlignCenter + + + + + + + Référence croisée + + + Qt::AlignCenter + + + + + + + + Horizontal + + + + + Vertical + + + + + + + + + Gauche + + + + + Centre + + + + + Droite + + + + + + 1000 - - - - Orientation du texte de borne : + + + + 30 - - - - - - - - - Alignement du texte de borne : + + 1000 @@ -430,7 +500,7 @@ - Qt::Orientation::Horizontal + Qt::Horizontal @@ -960,6 +1030,70 @@ + + m_xref_alignment_cb + currentIndexChanged(int) + TerminalStripLayoutEditor + valueEdited() + + + 836 + 365 + + + 480 + 311 + + + + + m_xref_height_sb + valueChanged(int) + TerminalStripLayoutEditor + valueEdited() + + + 836 + 431 + + + 480 + 311 + + + + + m_xref_orientation_cb + currentIndexChanged(int) + TerminalStripLayoutEditor + valueEdited() + + + 836 + 333 + + + 480 + 311 + + + + + m_xref_y_sb + valueChanged(int) + TerminalStripLayoutEditor + valueEdited() + + + 836 + 398 + + + 480 + 311 + + + valueEdited() diff --git a/sources/xml/terminalstriplayoutpatternxml.cpp b/sources/xml/terminalstriplayoutpatternxml.cpp index 5ea20a1cb..687dd5b53 100644 --- a/sources/xml/terminalstriplayoutpatternxml.cpp +++ b/sources/xml/terminalstriplayoutpatternxml.cpp @@ -117,6 +117,13 @@ QDomElement TerminalStripLayoutPatternXml::toXml(const QSharedPointerm_terminals_text_height, terminals_text_xml); terminals_xml.appendChild(terminals_text_xml); + auto xref_text_xml = document.createElement(QStringLiteral("xref")); + QETXML::orientationToAttribute(pattern->m_xref_text_orientation, xref_text_xml); + QETXML::alignmentToAttribute(pattern->xrefTextAlignment(),xref_text_xml); + QETSVG::yToAttribute(pattern->m_xref_text_y, xref_text_xml); + QETSVG::heightToAttribute(pattern->m_xref_text_height, xref_text_xml); + terminals_xml.appendChild(xref_text_xml); + auto bridge_xml = document.createElement(QStringLiteral("bridges")); QETSVG::rToAttribute(pattern->m_bridge_point_d/2, bridge_xml); QVector points_vector; @@ -176,6 +183,14 @@ void TerminalStripLayoutPatternXml::fromXml(QSharedPointerm_terminals_text_height = QETSVG::heightFromAttribute(terminals_text_xml); } + if (const auto xref_text_xml = terminals_xml.firstChildElement(QStringLiteral("xref")); + !xref_text_xml.isNull()) { + layout->m_xref_text_orientation = QETXML::orientationFromAttribute(xref_text_xml, layout->m_xref_text_orientation); + layout->setXrefTextAlignment(QETXML::alignmentFromAttribute(xref_text_xml)); + layout->m_xref_text_y = QETSVG::yFromAttribute(xref_text_xml); + layout->m_xref_text_height = QETSVG::heightFromAttribute(xref_text_xml); + } + if (const auto bridge_xml = terminals_xml.firstChildElement(QStringLiteral("bridges")); !bridge_xml.isNull()) { layout->m_bridge_point_d = QETSVG::rFromAttribute(bridge_xml, 2.5)*2; From 7e5d41b4743f24d20a13287f2da892fe0b475f4e Mon Sep 17 00:00:00 2001 From: joshua Date: Tue, 14 Oct 2025 22:12:38 +0200 Subject: [PATCH 38/65] Terminal strip Xref is clickable When user hover the Xref string of a terminal, the string color change to blue to advise user the xref is clickable. Double click on the blue Xref go the folio of the terminal and zoom the view to the terminal. --- .../GraphicsItem/terminalstripdrawer.cpp | 71 +++++++++++++++++-- .../GraphicsItem/terminalstripdrawer.h | 20 ++++++ .../GraphicsItem/terminalstripitem.cpp | 48 ++++++++++++- .../GraphicsItem/terminalstripitem.h | 3 +- sources/TerminalStrip/physicalterminal.cpp | 14 ++++ sources/TerminalStrip/physicalterminal.h | 1 + sources/qetgraphicsitem/qetgraphicsitem.cpp | 32 ++++++++- sources/qetgraphicsitem/qetgraphicsitem.h | 6 ++ 8 files changed, 186 insertions(+), 9 deletions(-) diff --git a/sources/TerminalStrip/GraphicsItem/terminalstripdrawer.cpp b/sources/TerminalStrip/GraphicsItem/terminalstripdrawer.cpp index f71542c3d..f805ef7c1 100644 --- a/sources/TerminalStrip/GraphicsItem/terminalstripdrawer.cpp +++ b/sources/TerminalStrip/GraphicsItem/terminalstripdrawer.cpp @@ -45,6 +45,7 @@ void TerminalStripDrawer::paint(QPainter *painter) { if (m_strip && m_pattern) { + m_united_xref_text_rect = QRectF(); //To draw text, QPainter need a Qrect. Instead of create an instance //for each text, we re-use the same instance of QRect. QRect text_rect; @@ -91,11 +92,10 @@ void TerminalStripDrawer::paint(QPainter *painter) const auto text_{m_strip->installation() + " " + m_strip->location() + " " + m_strip->name()}; painter->drawText(text_rect, text_, m_pattern->headerTextOption()); - painter->restore(); + painter->restore(); //Move painter pos to next drawing painter->translate(m_pattern->m_header_rect.width(),0); - qreal x_offset{m_pattern->m_header_rect.width()}; //Draw spacer @@ -120,6 +120,8 @@ void TerminalStripDrawer::paint(QPainter *painter) QHash> bridges_anchor_points; + m_hovered_xref = hoverTerminal{}; + int physical_index = 0; //Loop over physical terminals for (const auto &physical_t : m_strip->physicalTerminal()) { @@ -190,15 +192,40 @@ void TerminalStripDrawer::paint(QPainter *painter) painter->restore(); //Draw xref - auto xref_string = shared_real_terminal->xref(); - painter->save(); xref_rect.setRect(0, xref_text_y, terminal_rect.width(), xref_text_height); + painter->save(); if (xref_text_orientation == Qt::Vertical) { painter->translate(xref_rect.bottomLeft()); painter->rotate(270); xref_rect.setRect(0, 0, xref_rect.height(), xref_rect.width()); } + + QTransform transform; + transform.translate(x_offset, 0); + + if (xref_text_orientation == Qt::Vertical) + { + transform.translate(0, xref_text_y + xref_text_height); + transform.rotate(270); + } + + auto xref_string = shared_real_terminal->xref(); + + const auto mapped_xref_text_rect = transform.mapRect(painter->boundingRect(xref_rect, xref_string, xref_text_option)); + if (m_united_xref_text_rect.isNull()) { + m_united_xref_text_rect = mapped_xref_text_rect; + } else { + m_united_xref_text_rect = m_united_xref_text_rect.united(mapped_xref_text_rect); + } + + //if mouse hover the xref text, draw it in blue to advise user the xref is clickable. + if (!m_mouse_hover_pos.isNull() && mapped_xref_text_rect.contains(m_mouse_hover_pos)) { + painter->setPen(Qt::blue); + m_hovered_xref.physical = physical_index; + m_hovered_xref.real = i; + } + painter->drawText(xref_rect, xref_string, xref_text_option); if (m_preview_draw) @@ -234,6 +261,7 @@ void TerminalStripDrawer::paint(QPainter *painter) painter->translate(terminal_rect.width(),0); x_offset += terminal_rect.width(); } + physical_index++; } painter->restore(); @@ -269,6 +297,41 @@ void TerminalStripDrawer::setPreviewDraw(bool draw) { m_preview_draw = draw; } +void TerminalStripDrawer::setMouseHoverPos(const QPointF &pos) +{ + m_last_mouse_pos_in_xrefs_rect = m_united_xref_text_rect.contains(m_mouse_hover_pos); + m_mouse_hover_pos = pos; +} + +/** + * @brief TerminalStripDrawer::mouseHoverXref + * @return True if the mouse position (given through the function setMouseHoverPos) + * hover the rect of a xref. + */ +bool TerminalStripDrawer::mouseHoverXref() const { + return m_united_xref_text_rect.contains(m_mouse_hover_pos); +} + +bool TerminalStripDrawer::needUpdate() +{ + if (mouseHoverXref()) { + return true; + } else if (m_last_mouse_pos_in_xrefs_rect) { + return true; + } + return false; +} + +/** + * @brief TerminalStripDrawer::hoveredXref + * @return the current terminal hovered by the mouse + * in the xref bounding rectangle + */ +hoverTerminal TerminalStripDrawer::hoveredXref() const +{ + return m_hovered_xref; +} + qreal TerminalStripDrawer::height() const { if (m_pattern) diff --git a/sources/TerminalStrip/GraphicsItem/terminalstripdrawer.h b/sources/TerminalStrip/GraphicsItem/terminalstripdrawer.h index 8fa5fd8e1..363bc2cdf 100644 --- a/sources/TerminalStrip/GraphicsItem/terminalstripdrawer.h +++ b/sources/TerminalStrip/GraphicsItem/terminalstripdrawer.h @@ -27,6 +27,17 @@ class TerminalStrip; namespace TerminalStripDrawer { + /** + * @brief The hoverTerminal struct + * Just a little struct use to know what is the physical and real terminal + * when the mouse hover the Xref string of a terminal. + * If mouse don't hover a Xref the value is set to -1; + */ + struct hoverTerminal{ + int physical{-1}; + int real{-1}; + }; + class AbstractBridgeInterface { public: @@ -80,6 +91,11 @@ namespace TerminalStripDrawer void setPreviewDraw(bool draw = true); + void setMouseHoverPos(const QPointF &pos); + bool mouseHoverXref() const; + bool needUpdate(); + hoverTerminal hoveredXref() const; + private: qreal height() const; qreal width() const; @@ -88,6 +104,10 @@ namespace TerminalStripDrawer QSharedPointer m_strip; QSharedPointer m_pattern; bool m_preview_draw { false }; + QPointF m_mouse_hover_pos; + QRectF m_united_xref_text_rect; + bool m_last_mouse_pos_in_xrefs_rect{false}; + hoverTerminal m_hovered_xref; }; } diff --git a/sources/TerminalStrip/GraphicsItem/terminalstripitem.cpp b/sources/TerminalStrip/GraphicsItem/terminalstripitem.cpp index 77f28adee..ad9634b4d 100644 --- a/sources/TerminalStrip/GraphicsItem/terminalstripitem.cpp +++ b/sources/TerminalStrip/GraphicsItem/terminalstripitem.cpp @@ -22,6 +22,8 @@ #include "../../project/projectpropertieshandler.h" #include "../../qetgraphicsitem/qgraphicsitemutility.h" #include "../terminalstrip.h" +#include "../physicalterminal.h" +#include "../realterminal.h" #include "../ui/terminalstripeditorwindow.h" #include "trueterminalstrip.h" @@ -94,13 +96,53 @@ QString TerminalStripItem::name() const { return tr("plan de bornes"); } +void TerminalStripItem::hoverMoveEvent(QGraphicsSceneHoverEvent *event) +{ + QetGraphicsItem::hoverMoveEvent(event); + m_drawer.setMouseHoverPos(hoverMousePos()); + if (m_drawer.needUpdate()) { + update(); + } +} + +void TerminalStripItem::hoverLeaveEvent(QGraphicsSceneHoverEvent *event) +{ + QetGraphicsItem::hoverLeaveEvent(event); + m_drawer.setMouseHoverPos(QPointF{}); +} + void TerminalStripItem::mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event) { Q_UNUSED (event); - if (m_strip) { - TerminalStripEditorWindow::edit(m_strip); - } + const auto hovered = m_drawer.hoveredXref(); + + if (m_strip) { + if (hovered.physical >= 0 && + hovered.real >= 0) + { + if (const auto physical_terminal = m_strip->physicalTerminal(hovered.physical); + !physical_terminal.isNull()) + { + if (const auto real_terminal = physical_terminal->realTerminal(hovered.real); + !real_terminal.isNull() && + real_terminal->isElement()) + { + if (QPointer element = real_terminal->element(); + !element.isNull()) + { + //Unselect and ungrab mouse to prevent unwanted + //move when element is in the same scene of this. + setSelected(false); + ungrabMouse(); + QetGraphicsItem::showItem(element); + } + } + } + } else { + TerminalStripEditorWindow::edit(m_strip); + } + } } void TerminalStripItem::refreshPending() diff --git a/sources/TerminalStrip/GraphicsItem/terminalstripitem.h b/sources/TerminalStrip/GraphicsItem/terminalstripitem.h index b26a6dd8b..f69e8595b 100644 --- a/sources/TerminalStrip/GraphicsItem/terminalstripitem.h +++ b/sources/TerminalStrip/GraphicsItem/terminalstripitem.h @@ -46,6 +46,8 @@ class TerminalStripItem : public QetGraphicsItem QRectF boundingRect() const override; QString name() const override; + void hoverMoveEvent(QGraphicsSceneHoverEvent *event) override; + void hoverLeaveEvent(QGraphicsSceneHoverEvent *event) override; void mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event) override; void refreshPending(); void setLayout(QSharedPointer layout); @@ -57,7 +59,6 @@ class TerminalStripItem : public QetGraphicsItem QPointer m_strip; TerminalStripDrawer::TerminalStripDrawer m_drawer; QUuid m_pending_strip_uuid; - }; #endif // TERMINALSTRIPITEM_H diff --git a/sources/TerminalStrip/physicalterminal.cpp b/sources/TerminalStrip/physicalterminal.cpp index 99165a20f..86eefb945 100644 --- a/sources/TerminalStrip/physicalterminal.cpp +++ b/sources/TerminalStrip/physicalterminal.cpp @@ -189,6 +189,20 @@ QVector> PhysicalTerminal::realTerminals() const { return m_real_terminal; } +/** + * @brief PhysicalTerminal::realTerminal + * @param pos + * @return the real terminal at position pos. + * Note that the returned QSharedPointer can be null + */ +QSharedPointer PhysicalTerminal::realTerminal(int pos) const +{ + if (pos < m_real_terminal.size()) { + return m_real_terminal.at(pos); + } + else return QSharedPointer{}; +} + /** * @brief uuid * @return the uuid of this physical terminal diff --git a/sources/TerminalStrip/physicalterminal.h b/sources/TerminalStrip/physicalterminal.h index 7d90ff681..4cb78e059 100644 --- a/sources/TerminalStrip/physicalterminal.h +++ b/sources/TerminalStrip/physicalterminal.h @@ -86,6 +86,7 @@ class PhysicalTerminal int levelCount() const; int levelOf(const QSharedPointer &terminal) const; QVector> realTerminals() const; + QSharedPointer realTerminal(int pos) const; QUuid uuid() const; int pos() const; int realTerminalCount() const; diff --git a/sources/qetgraphicsitem/qetgraphicsitem.cpp b/sources/qetgraphicsitem/qetgraphicsitem.cpp index fc1acc385..873a79fba 100644 --- a/sources/qetgraphicsitem/qetgraphicsitem.cpp +++ b/sources/qetgraphicsitem/qetgraphicsitem.cpp @@ -24,12 +24,31 @@ Default constructor @param parent : Parent Item */ +void QetGraphicsItem::showItem(QetGraphicsItem *item) +{ + if (item && item->diagram()) + { + item->diagram()->showMe(); + item->setSelected(true); + + //Zoom to the item + for(QGraphicsView *view : item->scene()->views()) + { + QRectF fit = item->sceneBoundingRect(); + fit.adjust(-200, -200, 200, 200); + view->fitInView(fit, Qt::KeepAspectRatioByExpanding); + } + } +} + QetGraphicsItem::QetGraphicsItem(QGraphicsItem *parent): QGraphicsObject(parent), is_movable_(true), m_first_move(true), snap_to_grid_(true) -{} +{ + setAcceptHoverEvents(true); +} QetGraphicsItem::~QetGraphicsItem() {} @@ -68,6 +87,11 @@ bool QetGraphicsItem::isHovered() const { return m_hovered; } +QPointF QetGraphicsItem::hoverMousePos() const +{ + return m_mouse_hover_pos; +} + /** @brief QetGraphicsItem::state @return the current state of this item @@ -166,6 +190,12 @@ void QetGraphicsItem::hoverEnterEvent(QGraphicsSceneHoverEvent *event) QGraphicsObject::hoverEnterEvent(event); } +void QetGraphicsItem::hoverMoveEvent(QGraphicsSceneHoverEvent *event) +{ + QGraphicsObject::hoverMoveEvent(event); + m_mouse_hover_pos = event->pos(); +} + void QetGraphicsItem::hoverLeaveEvent(QGraphicsSceneHoverEvent *event) { m_hovered = false; diff --git a/sources/qetgraphicsitem/qetgraphicsitem.h b/sources/qetgraphicsitem/qetgraphicsitem.h index e6459403b..11a967a35 100644 --- a/sources/qetgraphicsitem/qetgraphicsitem.h +++ b/sources/qetgraphicsitem/qetgraphicsitem.h @@ -28,6 +28,9 @@ class QetGraphicsItem : public QGraphicsObject { Q_OBJECT + public : + static void showItem (QetGraphicsItem *item); + public: //constructor destructor QetGraphicsItem(QGraphicsItem *parent = nullptr); @@ -43,6 +46,7 @@ class QetGraphicsItem : public QGraphicsObject virtual void setMovable (bool movable) { is_movable_ = movable;} bool isHovered() const; + QPointF hoverMousePos() const; virtual void editProperty () {} virtual QString name ()const @@ -57,6 +61,7 @@ class QetGraphicsItem : public QGraphicsObject void mouseMoveEvent(QGraphicsSceneMouseEvent *event) override; void mouseReleaseEvent(QGraphicsSceneMouseEvent *event) override; void hoverEnterEvent(QGraphicsSceneHoverEvent *event) override; + void hoverMoveEvent(QGraphicsSceneHoverEvent *event) override; void hoverLeaveEvent(QGraphicsSceneHoverEvent *event) override; protected: @@ -68,6 +73,7 @@ class QetGraphicsItem : public QGraphicsObject private: bool m_hovered{false}; + QPointF m_mouse_hover_pos; }; From 58339f9016966f918bc025ec21ddb83527e99a09 Mon Sep 17 00:00:00 2001 From: Laurent Trinques Date: Fri, 17 Oct 2025 09:58:39 +0200 Subject: [PATCH 39/65] Fix copyright years --- .../GraphicsItem/properties/terminalstriplayoutpattern.cpp | 2 +- .../GraphicsItem/properties/terminalstriplayoutpattern.h | 2 +- sources/TerminalStrip/GraphicsItem/terminalstripitem.cpp | 2 +- sources/TerminalStrip/GraphicsItem/terminalstripitem.h | 2 +- sources/TerminalStrip/ui/addterminalstripitemdialog.cpp | 2 +- sources/TerminalStrip/ui/addterminalstripitemdialog.h | 2 +- sources/dataBase/projectdatabase.cpp | 2 +- sources/dataBase/projectdatabase.h | 2 +- sources/factory/propertieseditorfactory.cpp | 2 +- sources/qetgraphicsitem/ViewItem/projectdbmodel.cpp | 2 +- sources/qetgraphicsitem/diagramtextitem.cpp | 2 +- sources/undocommand/movegraphicsitemcommand.cpp | 2 +- sources/undocommand/movegraphicsitemcommand.h | 2 +- sources/xml/terminalstripitemxml.cpp | 2 +- sources/xml/terminalstripitemxml.h | 2 +- 15 files changed, 15 insertions(+), 15 deletions(-) diff --git a/sources/TerminalStrip/GraphicsItem/properties/terminalstriplayoutpattern.cpp b/sources/TerminalStrip/GraphicsItem/properties/terminalstriplayoutpattern.cpp index 82fba3498..89dec80be 100644 --- a/sources/TerminalStrip/GraphicsItem/properties/terminalstriplayoutpattern.cpp +++ b/sources/TerminalStrip/GraphicsItem/properties/terminalstriplayoutpattern.cpp @@ -1,5 +1,5 @@ /* - Copyright 2006-2022 The QElectroTech Team + Copyright 2006-2025 The QElectroTech Team This file is part of QElectroTech. QElectroTech is free software: you can redistribute it and/or modify diff --git a/sources/TerminalStrip/GraphicsItem/properties/terminalstriplayoutpattern.h b/sources/TerminalStrip/GraphicsItem/properties/terminalstriplayoutpattern.h index 4249eac8b..c67db328f 100644 --- a/sources/TerminalStrip/GraphicsItem/properties/terminalstriplayoutpattern.h +++ b/sources/TerminalStrip/GraphicsItem/properties/terminalstriplayoutpattern.h @@ -1,5 +1,5 @@ /* - Copyright 2006-2022 The QElectroTech Team + Copyright 2006-2025 The QElectroTech Team This file is part of QElectroTech. QElectroTech is free software: you can redistribute it and/or modify diff --git a/sources/TerminalStrip/GraphicsItem/terminalstripitem.cpp b/sources/TerminalStrip/GraphicsItem/terminalstripitem.cpp index 6c4b79529..b4415bb3d 100644 --- a/sources/TerminalStrip/GraphicsItem/terminalstripitem.cpp +++ b/sources/TerminalStrip/GraphicsItem/terminalstripitem.cpp @@ -1,5 +1,5 @@ /* - Copyright 2006-2022 The QElectroTech Team + Copyright 2006-2025 The QElectroTech Team This file is part of QElectroTech. QElectroTech is free software: you can redistribute it and/or modify diff --git a/sources/TerminalStrip/GraphicsItem/terminalstripitem.h b/sources/TerminalStrip/GraphicsItem/terminalstripitem.h index e54759f94..7c9dc1f5a 100644 --- a/sources/TerminalStrip/GraphicsItem/terminalstripitem.h +++ b/sources/TerminalStrip/GraphicsItem/terminalstripitem.h @@ -1,5 +1,5 @@ /* - Copyright 2006-2022 The QElectroTech Team + Copyright 2006-2025 The QElectroTech Team This file is part of QElectroTech. QElectroTech is free software: you can redistribute it and/or modify diff --git a/sources/TerminalStrip/ui/addterminalstripitemdialog.cpp b/sources/TerminalStrip/ui/addterminalstripitemdialog.cpp index c6c843b3d..2560c5754 100644 --- a/sources/TerminalStrip/ui/addterminalstripitemdialog.cpp +++ b/sources/TerminalStrip/ui/addterminalstripitemdialog.cpp @@ -1,5 +1,5 @@ /* - Copyright 2006-2022 The QElectroTech Team + Copyright 2006-2025 The QElectroTech Team This file is part of QElectroTech. QElectroTech is free software: you can redistribute it and/or modify diff --git a/sources/TerminalStrip/ui/addterminalstripitemdialog.h b/sources/TerminalStrip/ui/addterminalstripitemdialog.h index e7eae36f9..5aa0d1278 100644 --- a/sources/TerminalStrip/ui/addterminalstripitemdialog.h +++ b/sources/TerminalStrip/ui/addterminalstripitemdialog.h @@ -1,5 +1,5 @@ /* - Copyright 2006-2022 The QElectroTech Team + Copyright 2006-2025 The QElectroTech Team This file is part of QElectroTech. QElectroTech is free software: you can redistribute it and/or modify diff --git a/sources/dataBase/projectdatabase.cpp b/sources/dataBase/projectdatabase.cpp index 98b3fddd2..de28b7c00 100644 --- a/sources/dataBase/projectdatabase.cpp +++ b/sources/dataBase/projectdatabase.cpp @@ -1,5 +1,5 @@ /* - Copyright 2006-2021 QElectroTech Team + Copyright 2006-2025 QElectroTech Team This file is part of QElectroTech. QElectroTech is free software: you can redistribute it and/or modify diff --git a/sources/dataBase/projectdatabase.h b/sources/dataBase/projectdatabase.h index fa119afda..d0b69ad43 100644 --- a/sources/dataBase/projectdatabase.h +++ b/sources/dataBase/projectdatabase.h @@ -1,5 +1,5 @@ /* - Copyright 2006-2021 QElectroTech Team + Copyright 2006-2025 QElectroTech Team This file is part of QElectroTech. QElectroTech is free software: you can redistribute it and/or modify diff --git a/sources/factory/propertieseditorfactory.cpp b/sources/factory/propertieseditorfactory.cpp index 614391c99..35fd82090 100644 --- a/sources/factory/propertieseditorfactory.cpp +++ b/sources/factory/propertieseditorfactory.cpp @@ -1,5 +1,5 @@ /* - Copyright 2006-2021 QElectroTech Team + Copyright 2006-2025 QElectroTech Team This file is part of QElectroTech. QElectroTech is free software: you can redistribute it and/or modify diff --git a/sources/qetgraphicsitem/ViewItem/projectdbmodel.cpp b/sources/qetgraphicsitem/ViewItem/projectdbmodel.cpp index 89a7a4135..9ceeda548 100644 --- a/sources/qetgraphicsitem/ViewItem/projectdbmodel.cpp +++ b/sources/qetgraphicsitem/ViewItem/projectdbmodel.cpp @@ -1,5 +1,5 @@ /* - Copyright 2006-2021 QElectroTech Team + Copyright 2006-2025 QElectroTech Team This file is part of QElectroTech. QElectroTech is free software: you can redistribute it and/or modify diff --git a/sources/qetgraphicsitem/diagramtextitem.cpp b/sources/qetgraphicsitem/diagramtextitem.cpp index 6b97994c3..cba7b5321 100644 --- a/sources/qetgraphicsitem/diagramtextitem.cpp +++ b/sources/qetgraphicsitem/diagramtextitem.cpp @@ -1,5 +1,5 @@ /* - Copyright 2006-2021 QElectroTech Team + Copyright 2006-2025 QElectroTech Team This file is part of QElectroTech. QElectroTech is free software: you can redistribute it and/or modify diff --git a/sources/undocommand/movegraphicsitemcommand.cpp b/sources/undocommand/movegraphicsitemcommand.cpp index 7831ff285..57a8027a3 100644 --- a/sources/undocommand/movegraphicsitemcommand.cpp +++ b/sources/undocommand/movegraphicsitemcommand.cpp @@ -1,5 +1,5 @@ /* - Copyright 2006-2022 The QElectroTech Team + Copyright 2006-2025 The QElectroTech Team This file is part of QElectroTech. QElectroTech is free software: you can redistribute it and/or modify diff --git a/sources/undocommand/movegraphicsitemcommand.h b/sources/undocommand/movegraphicsitemcommand.h index 7957ef69b..0f3f7e3af 100644 --- a/sources/undocommand/movegraphicsitemcommand.h +++ b/sources/undocommand/movegraphicsitemcommand.h @@ -1,5 +1,5 @@ /* - Copyright 2006-2022 The QElectroTech Team + Copyright 2006-2025 The QElectroTech Team This file is part of QElectroTech. QElectroTech is free software: you can redistribute it and/or modify diff --git a/sources/xml/terminalstripitemxml.cpp b/sources/xml/terminalstripitemxml.cpp index d10e946da..9a18e32c4 100644 --- a/sources/xml/terminalstripitemxml.cpp +++ b/sources/xml/terminalstripitemxml.cpp @@ -1,5 +1,5 @@ /* - Copyright 2006-2022 The QElectroTech Team + Copyright 2006-2025 The QElectroTech Team This file is part of QElectroTech. QElectroTech is free software: you can redistribute it and/or modify diff --git a/sources/xml/terminalstripitemxml.h b/sources/xml/terminalstripitemxml.h index a59d855d6..0a40ba403 100644 --- a/sources/xml/terminalstripitemxml.h +++ b/sources/xml/terminalstripitemxml.h @@ -1,5 +1,5 @@ /* - Copyright 2006-2022 The QElectroTech Team + Copyright 2006-2025 The QElectroTech Team This file is part of QElectroTech. QElectroTech is free software: you can redistribute it and/or modify From 6d7d1ea23bc232020c4d4dc12690513c020000cc Mon Sep 17 00:00:00 2001 From: plc-user <74435298+plc-user@users.noreply.github.com> Date: Sun, 19 Oct 2025 15:09:24 +0200 Subject: [PATCH 40/65] NamesList: Set empty string for name, when no name is set This should fix an issue with empty fields in titleblocks. --- sources/NameList/nameslist.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/sources/NameList/nameslist.cpp b/sources/NameList/nameslist.cpp index da814de8d..9e450cd31 100644 --- a/sources/NameList/nameslist.cpp +++ b/sources/NameList/nameslist.cpp @@ -174,11 +174,9 @@ void NamesList::fromXml(const pugi::xml_node &xml_element, const QHash names_iterator(map_names); From 07c34d73589f5eed4490d0b56ff60dba4a7c38d8 Mon Sep 17 00:00:00 2001 From: plc-user <74435298+plc-user@users.noreply.github.com> Date: Sun, 19 Oct 2025 15:37:07 +0200 Subject: [PATCH 41/65] add and correct English comments --- sources/qetgraphicsitem/conductor.cpp | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/sources/qetgraphicsitem/conductor.cpp b/sources/qetgraphicsitem/conductor.cpp index 691775fde..48e040410 100644 --- a/sources/qetgraphicsitem/conductor.cpp +++ b/sources/qetgraphicsitem/conductor.cpp @@ -229,43 +229,53 @@ void Conductor::updateConductorPath(const QPointF &p1, Qet::Orientation o1, cons Q_ASSERT_X(!conductor_profile.isNull(), "Conductor::priv_modifieConductor", "pas de profil utilisable"); // recupere les coordonnees fournies des bornes + // retrieve the coordinates provided for the terminals QPointF new_p1 = mapFromScene(p1); QPointF new_p2 = mapFromScene(p2); QRectF new_rect = QRectF(new_p1, new_p2); // recupere la largeur et la hauteur du profil + // retrieve the width and height of the profile qreal profile_width = conductor_profile.width(); qreal profile_height = conductor_profile.height(); // calcule les differences verticales et horizontales a appliquer + // calculates the vertical and horizontal differences to be applied qreal h_diff = (qAbs(new_rect.width()) - qAbs(profile_width) ) * getSign(profile_width); qreal v_diff = (qAbs(new_rect.height()) - qAbs(profile_height)) * getSign(profile_height); // applique les differences aux segments + // apply the differences to the segments QMultiHash segments_lengths; segments_lengths.unite(shareOffsetBetweenSegments(h_diff, conductor_profile.horizontalSegments())); segments_lengths.unite(shareOffsetBetweenSegments(v_diff, conductor_profile.verticalSegments())); // en deduit egalement les coefficients d'inversion (-1 pour une inversion, +1 pour conserver le meme sens) + // also deduce the inversion coefficients (-1 for inversion, +1 to keep the same direction) int horiz_coeff = getCoeff(new_rect.width(), profile_width); int verti_coeff = getCoeff(new_rect.height(), profile_height); // genere les nouveaux points + // generate the new points QList points; points << new_p1; int limit = conductor_profile.segments.count() - 1; for (int i = 0 ; i < limit ; ++ i) { // dernier point + // last point QPointF previous_point = points.last(); // profil de segment de conducteur en cours + // current conductor segment profile ConductorSegmentProfile *csp = conductor_profile.segments.at(i); // coefficient et offset a utiliser pour ce point + // coefficient and offset to be used for this point qreal coeff = csp -> isHorizontal ? horiz_coeff : verti_coeff; qreal offset_applied = segments_lengths.value(csp); // applique l'offset et le coeff au point + // apply coefficient and offset to point if (csp -> isHorizontal) { points << QPointF ( previous_point.x() + (coeff * offset_applied), @@ -989,9 +999,9 @@ void Conductor::pointsToSegments(const QList& points_list) { /** @brief Conductor::fromXml - Load the conductor and her information from xml element + Load the conductor and its information from xml element @param dom_element - @return true is loading success else return false + @return true if loading succeeded else return false */ bool Conductor::fromXml(QDomElement &dom_element) { @@ -1134,13 +1144,14 @@ bool Conductor::pathFromXml(const QDomElement &e) { } } - //If there isn't segment we generate automatic path and return true + // If there is no segment, we generate an automatic path and return true if (!segments_x.size()) { generateConductorPath(terminal1 -> dockConductor(), terminal1 -> orientation(), terminal2 -> dockConductor(), terminal2 -> orientation()); return(true); } // les longueurs recueillies doivent etre coherentes avec les positions des bornes + // The collected lengths must be consistent with the positions of the terminals qreal width = 0.0, height = 0.0; foreach (qreal t, segments_x) width += t; foreach (qreal t, segments_y) height += t; @@ -1420,7 +1431,7 @@ void Conductor::calculateTextItemPosition() /** Sauvegarde le profil courant du conducteur pour l'utiliser ulterieurement dans priv_modifieConductor. - Save the current conductors profile for later use in priv_modifiedConductor. + Save the current conductors profile for later use in priv_modifieConductor. */ void Conductor::saveProfile(bool undo) { Qt::Corner current_path_type = currentPathType(); @@ -1487,7 +1498,7 @@ ConductorProfile Conductor::profile(Qt::Corner path_type) const /** @brief Conductor::refreshText Refresh the text of this conductor. - recalcule and set the text according to the formula. + recalculate and set the text according to the formula. */ void Conductor::refreshText() { From 410c9293d1fef4dc410edc996372dadf0d4929c0 Mon Sep 17 00:00:00 2001 From: plc-user <74435298+plc-user@users.noreply.github.com> Date: Sun, 19 Oct 2025 15:48:03 +0200 Subject: [PATCH 42/65] adjust variable-names and comments; minor change in length-compare of conductor-segments --- sources/qetgraphicsitem/conductor.cpp | 50 +++++++++++---------------- 1 file changed, 21 insertions(+), 29 deletions(-) diff --git a/sources/qetgraphicsitem/conductor.cpp b/sources/qetgraphicsitem/conductor.cpp index 48e040410..d150ff22b 100644 --- a/sources/qetgraphicsitem/conductor.cpp +++ b/sources/qetgraphicsitem/conductor.cpp @@ -1008,7 +1008,7 @@ bool Conductor::fromXml(QDomElement &dom_element) setPos(dom_element.attribute("x", nullptr).toDouble(), dom_element.attribute("y", nullptr).toDouble()); - bool return_ = pathFromXml(dom_element); + bool retval = pathFromXml(dom_element); m_text_item -> fromXml(dom_element); ConductorProperties pr; @@ -1020,11 +1020,11 @@ bool Conductor::fromXml(QDomElement &dom_element) else m_autoNum_seq.fromXml(dom_element.firstChildElement("sequentialNumbers")); - m_freeze_label = dom_element.attribute("freezeLabel") == "true"? true : false; + m_freeze_label = dom_element.attribute("freezeLabel") == "true" ? true : false; setProperties(pr); - return return_; + return retval; } /** @@ -1267,65 +1267,57 @@ ConductorSegment *Conductor::middleSegment() */ QPointF Conductor::posForText(Qt::Orientations &flag) { - - ConductorSegment *segment = segments; - bool all_segment_is_vertical = true; - bool all_segment_is_horizontal = true; + ConductorSegment *segment = segments; + bool all_segments_are_vertical = true; + bool all_segments_are_horizontal = true; //Go to first segment while (!segment->isFirstSegment()) { segment = segment->previousSegment(); } - QPointF p1 = segment -> firstPoint(); // firstPoint().x() != segment -> secondPoint().x()) - all_segment_is_vertical = false; + all_segments_are_vertical = false; if (segment -> firstPoint().y() != segment -> secondPoint().y()) - all_segment_is_horizontal = false; - + all_segments_are_horizontal = false; + // find longest segment while (segment -> hasNextSegment()) { segment = segment -> nextSegment(); - if (segment -> firstPoint().x() != segment -> secondPoint().x()) - all_segment_is_vertical = false; + all_segments_are_vertical = false; if (segment -> firstPoint().y() != segment -> secondPoint().y()) - all_segment_is_horizontal = false; + all_segments_are_horizontal = false; - //We must compare length segment, but they can be negative - //so we multiply by -1 to make it positive. - int saved = biggest_segment -> length(); - if (saved < 0) saved *= -1; - int curent = segment->length(); - if (curent < 0) curent *= -1; - - if (curent > saved) biggest_segment = segment; + if (qAbs(segment->length()) > qAbs(longest_segment -> length())) + longest_segment = segment; } - QPointF p2 = segment -> secondPoint();// secondPoint(); // p2.y()) { p1.setY(p1.y() - (length()/2)); } else { p1.setY(p1.y() + (length()/2)); } - } else if (all_segment_is_horizontal) { // p2.x()) { p1.setX(p1.x() - (length()/2)); } else { p1.setX(p1.x() + (length()/2)); } - } else { //Return the point at the middle of biggest segment. - p1 = biggest_segment->middle(); - flag = (biggest_segment->isHorizontal())? Qt::Horizontal : Qt::Vertical; + } else { //Return the point at the middle of longest segment. + p1 = longest_segment->middle(); + flag = (longest_segment->isHorizontal())? Qt::Horizontal : Qt::Vertical; } return p1; } From f74fed9f3f1fbe4cbcc39521f993449be4402c43 Mon Sep 17 00:00:00 2001 From: joshua Date: Mon, 20 Oct 2025 22:10:39 +0200 Subject: [PATCH 43/65] refactor(diagram editor): remove unused checkbox Remove the checkbox "export terminal in nomenclature" in the general configuration page because it's a dead code. --- .../configpage/generalconfigurationpage.cpp | 4 -- .../ui/configpage/generalconfigurationpage.ui | 62 ++++++++----------- 2 files changed, 27 insertions(+), 39 deletions(-) diff --git a/sources/ui/configpage/generalconfigurationpage.cpp b/sources/ui/configpage/generalconfigurationpage.cpp index 540cd1569..748c1fda8 100644 --- a/sources/ui/configpage/generalconfigurationpage.cpp +++ b/sources/ui/configpage/generalconfigurationpage.cpp @@ -83,7 +83,6 @@ GeneralConfigurationPage::GeneralConfigurationPage(QWidget *parent) : ui->m_use_gesture_trackpad->setChecked(settings.value("diagramview/gestures", false).toBool()); ui->m_save_label_paste->setChecked(settings.value("diagramcommands/erase-label-on-copy", true).toBool()); ui->m_use_folio_label->setChecked(settings.value("genericpanel/folio", true).toBool()); - ui->m_export_terminal->setChecked(settings.value("nomenclature-exportlist", true).toBool()); ui->m_border_0->setChecked(settings.value("border-columns_0", false).toBool()); ui->m_autosave_sb->setValue(settings.value("diagrameditor/autosave-interval", 0).toInt()); @@ -224,9 +223,6 @@ void GeneralConfigurationPage::applyConf() //GENERIC PANEL settings.setValue("genericpanel/folio",ui->m_use_folio_label->isChecked()); - //NOMENCLATURE - settings.setValue("nomenclature/terminal-exportlist",ui->m_export_terminal->isChecked()); - //DIAGRAM EDITOR QString view_mode = ui->m_use_tab_mode_rb->isChecked() ? "tabbed" : "windowed"; diff --git a/sources/ui/configpage/generalconfigurationpage.ui b/sources/ui/configpage/generalconfigurationpage.ui index 8cced1e2a..2cec18fb0 100644 --- a/sources/ui/configpage/generalconfigurationpage.ui +++ b/sources/ui/configpage/generalconfigurationpage.ui @@ -6,7 +6,7 @@ 0 0 - 872 + 935 556 @@ -128,41 +128,21 @@ Projets - - - - Qt::Horizontal + + + + Utiliser les numéros de folio à la place de leur position dans le projet - - - 40 - 20 - - - + - + Sauvegarde automatique des projets (appliqué au prochain lancement de QElectroTech) - - - - Ne pas conserver les labels des éléments lors des copier coller - - - - - - - Numéroter les colonnes de cartouche à partir de 0 (1 sinon) - - - - + true @@ -184,14 +164,14 @@ - - + + - Utiliser les numéros de folio à la place de leur position dans le projet + Ne pas conserver les labels des éléments lors des copier coller - + Qt::Vertical @@ -204,10 +184,23 @@ + + + + Qt::Horizontal + + + + 40 + 20 + + + + - + - Exporter les bornes dans la nomenclature + Numéroter les colonnes de cartouche à partir de 0 (1 sinon) @@ -1090,7 +1083,6 @@ Vous pouvez spécifier ici la valeur par défaut de ce champ pour les éléments m_use_tab_mode_rb m_save_label_paste m_use_folio_label - m_export_terminal m_border_0 m_autosave_sb m_common_elmt_path_cb From e26f7fdaaa582d399e6b72a9ed9f3296e55aab98 Mon Sep 17 00:00:00 2001 From: joshua Date: Mon, 20 Oct 2025 22:58:12 +0200 Subject: [PATCH 44/65] refactor[deiagram editor]: mutualize code. The features used to jump to linked element and xref now use the same function. --- .../TerminalStrip/ui/terminalstripeditor.cpp | 18 +++--------------- sources/qetgraphicsitem/crossrefitem.cpp | 19 +------------------ .../dynamicelementtextitem.cpp | 14 ++------------ 3 files changed, 6 insertions(+), 45 deletions(-) diff --git a/sources/TerminalStrip/ui/terminalstripeditor.cpp b/sources/TerminalStrip/ui/terminalstripeditor.cpp index 5fef14c44..c87cdc7e5 100644 --- a/sources/TerminalStrip/ui/terminalstripeditor.cpp +++ b/sources/TerminalStrip/ui/terminalstripeditor.cpp @@ -57,21 +57,9 @@ TerminalStripEditor::TerminalStripEditor(QETProject *project, QWidget *parent) : { if (m_model->columnTypeForIndex(index) == TerminalStripModel::XRef) { - auto mrtd = m_model->modelRealTerminalDataForIndex(index); - if (mrtd.element_) - { - auto elmt = mrtd.element_; - auto diagram = elmt->diagram(); - if (diagram) - { - diagram->showMe(); - if (diagram->views().size()) - { - auto fit_view = elmt->sceneBoundingRect(); - fit_view.adjust(-200,-200,200,200); - diagram->views().at(0)->fitInView(fit_view, Qt::KeepAspectRatioByExpanding); - } - } + const auto mrtd = m_model->modelRealTerminalDataForIndex(index); + if (mrtd.element_) { + QetGraphicsItem::showItem(mrtd.element_); } } }); diff --git a/sources/qetgraphicsitem/crossrefitem.cpp b/sources/qetgraphicsitem/crossrefitem.cpp index 98d941c6a..58a964d1f 100644 --- a/sources/qetgraphicsitem/crossrefitem.cpp +++ b/sources/qetgraphicsitem/crossrefitem.cpp @@ -320,24 +320,7 @@ void CrossRefItem::paint( void CrossRefItem::mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event) { event->accept(); - if (m_hovered_contact && m_hovered_contact->scene()) - { - //Show and select the linked slave element - if (scene() != m_hovered_contact->scene()) - { - m_hovered_contact->diagram()->showMe(); - } - m_hovered_contact->setSelected(true); - - //Zoom to the linked slave element - foreach(QGraphicsView *view, - m_hovered_contact->diagram()->views()) - { - QRectF fit = m_hovered_contact->sceneBoundingRect(); - fit.adjust(-200, -200, 200, 200); - view->fitInView(fit, Qt::KeepAspectRatioByExpanding); - } - } + QetGraphicsItem::showItem(m_hovered_contact); } /** diff --git a/sources/qetgraphicsitem/dynamicelementtextitem.cpp b/sources/qetgraphicsitem/dynamicelementtextitem.cpp index 63dee4fea..c4c9e4400 100644 --- a/sources/qetgraphicsitem/dynamicelementtextitem.cpp +++ b/sources/qetgraphicsitem/dynamicelementtextitem.cpp @@ -1277,18 +1277,8 @@ void DynamicElementTextItem::zoomToLinkedElement() //move when linked element is in the same scene of this. setSelected(false); ungrabMouse(); - - if(scene() != zoomed_element->scene()) - zoomed_element->diagram()->showMe(); - zoomed_element->setSelected(true); - - //Zoom to the element - for(QGraphicsView *view : zoomed_element->scene()->views()) - { - QRectF fit = zoomed_element->sceneBoundingRect(); - fit.adjust(-200, -200, 200, 200); - view->fitInView(fit, Qt::KeepAspectRatioByExpanding); - } + + QetGraphicsItem::showItem(zoomed_element); } } From 67a7d277f46a61ed6d2cb9080f36301de0913f84 Mon Sep 17 00:00:00 2001 From: joshua Date: Mon, 20 Oct 2025 23:02:52 +0200 Subject: [PATCH 45/65] refactor(diagram editor) : remove unused code --- sources/qetgraphicsitem/slaveelement.cpp | 4 +--- sources/qetgraphicsitem/slaveelement.h | 3 --- 2 files changed, 1 insertion(+), 6 deletions(-) diff --git a/sources/qetgraphicsitem/slaveelement.cpp b/sources/qetgraphicsitem/slaveelement.cpp index 0f7f1d7e4..e0d05e6f4 100644 --- a/sources/qetgraphicsitem/slaveelement.cpp +++ b/sources/qetgraphicsitem/slaveelement.cpp @@ -33,9 +33,7 @@ SlaveElement::SlaveElement(const ElementsLocation &location, QGraphicsItem *qgi, int *state) : Element(location, qgi, state, Element::Slave) -{ - m_xref_item = nullptr; -} +{} /** @brief SlaveElement::~SlaveElement diff --git a/sources/qetgraphicsitem/slaveelement.h b/sources/qetgraphicsitem/slaveelement.h index 04f34908b..57276e5e6 100644 --- a/sources/qetgraphicsitem/slaveelement.h +++ b/sources/qetgraphicsitem/slaveelement.h @@ -33,9 +33,6 @@ class SlaveElement : public Element void linkToElement(Element *elmt) override; void unlinkAllElements() override; void unlinkElement(Element *elmt) override; - - private: - QGraphicsTextItem *m_xref_item; }; #endif // SLAVEELEMENT_H From 3a1398d752b1a716f7ea148293e28fee65fbee1e Mon Sep 17 00:00:00 2001 From: joshua Date: Mon, 20 Oct 2025 23:09:03 +0200 Subject: [PATCH 46/65] refactor[diagram editor]: remove unused include --- sources/qetgraphicsitem/slaveelement.cpp | 2 -- sources/qetgraphicsitem/slaveelement.h | 1 - 2 files changed, 3 deletions(-) diff --git a/sources/qetgraphicsitem/slaveelement.cpp b/sources/qetgraphicsitem/slaveelement.cpp index e0d05e6f4..0f88aa8df 100644 --- a/sources/qetgraphicsitem/slaveelement.cpp +++ b/sources/qetgraphicsitem/slaveelement.cpp @@ -18,8 +18,6 @@ #include "slaveelement.h" #include "../diagram.h" -#include "../diagramposition.h" -#include "../qetapp.h" #include "dynamicelementtextitem.h" /** diff --git a/sources/qetgraphicsitem/slaveelement.h b/sources/qetgraphicsitem/slaveelement.h index 57276e5e6..dc781ffed 100644 --- a/sources/qetgraphicsitem/slaveelement.h +++ b/sources/qetgraphicsitem/slaveelement.h @@ -18,7 +18,6 @@ #ifndef SLAVEELEMENT_H #define SLAVEELEMENT_H -#include "../properties/xrefproperties.h" #include "element.h" class SlaveElement : public Element From 3cf90958997daccf7882cb5f921a1de915e932ee Mon Sep 17 00:00:00 2001 From: joshua Date: Mon, 20 Oct 2025 23:31:48 +0200 Subject: [PATCH 47/65] refactor[diagram editor] close bug. Close bug report #324 https://qelectrotech.org/bugtracker/view.php?id=324 See commit #1b671990ee8435616725afdffba438fdfcd18069 --- sources/ui/dynamicelementtextitemeditor.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/sources/ui/dynamicelementtextitemeditor.cpp b/sources/ui/dynamicelementtextitemeditor.cpp index 709da077b..9aee0f3c1 100644 --- a/sources/ui/dynamicelementtextitemeditor.cpp +++ b/sources/ui/dynamicelementtextitemeditor.cpp @@ -146,7 +146,6 @@ void DynamicElementTextItemEditor::setCurrentText(DynamicElementTextItem *text) return; ui->m_tree_view->expand(index); -// ui->m_tree_view->expand(index.QModelIndex::model()->index(0,0)); // commented by plc-user: leads to crash, when other textitem was selected before ui->m_tree_view->setCurrentIndex(index); ui->m_remove_selection->setEnabled(true); } From 9e78dc56a87f3dda73e4980165ab60927495ebcd Mon Sep 17 00:00:00 2001 From: Laurent Trinques Date: Tue, 28 Oct 2025 13:25:44 +0100 Subject: [PATCH 48/65] git submodule update --remote elements --- elements | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/elements b/elements index 9f20b039b..6e1e2471f 160000 --- a/elements +++ b/elements @@ -1 +1 @@ -Subproject commit 9f20b039b7c384fe29d7e7190fa62b67c8aae471 +Subproject commit 6e1e2471fe602cf865f830417adc888ac20fdcce From 3b7a8a17e4629ae4daca1bf470aaa6ed49a9cf46 Mon Sep 17 00:00:00 2001 From: plc-user <74435298+plc-user@users.noreply.github.com> Date: Thu, 30 Oct 2025 18:26:03 +0100 Subject: [PATCH 49/65] update "osifont.ttf" from upstream --- fonts/osifont.ttf | Bin 117484 -> 118932 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/fonts/osifont.ttf b/fonts/osifont.ttf index 126a7f104fc7d572787cbbf7597797d714826809..2b157e6407b235d3264e481247d089ccea844985 100644 GIT binary patch delta 3575 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 PbNIm>{MYHje=q+A%Dh4z delta 2152 zcmZ8i2~dHq3?RZVAULQa$|*1d z!!^pK93t0096>-NfZPEjgv|lNEM{Gc5VdwUZk5OOKbXYYuKM45-}hd>{$KyE`xn=! zZIq}900Dq55h?)A&R(DA?L8+3G&x6DBbP&;I`0_MQ2-j16U=sDyL+zL$ZrA~8z&Rg zT|B*=Vm|brA=rla%iKK=*hU{XMFF781P6t3gA<;peO3aXQwX405Xwtp!GP-L08AF~ zt49W(79@Z+XpjZy1$851QzJC8XCDH*O>$(2IpM)!+Oc~Z2+$&adk!J=G&L*FQW+1RWZPJ zql9?D>7?@5>g|A<+DXAI9@!k`Zt)WlX(CmQFErWUO)Q4_rKmMYX`B2kN8GTI|z>09ok zgY?aP@=jRmYW|Ru)%?^#l2w-;6Je(k#G&=Yq?EqtY^7*tMWf7&QOO{67F> zcVz)GN0|!sGu2N?s3Iz!j_Qc(c(+5RUGTVlwtcw$Si57}f7)u>{?umOrr!GB*4|d9 z7QGg=n`fHuH>)%~Z~9jQx52r=;QIdSTJ`7Zah+amea%FTYV}feS@j>Ja_RTd`_dAr zP#P@#MEW5>6|+jUQc<~7$*NSV_^IMvg--dM^4@Y)$xN|M;Xex}3i}GrUO7;C3Ps3o%%k1 zl;6eAPT{1S-VA)x{&gbie;xj-?xXSVX^2e@ACfCs1$u-wX^Sw= zFu4=xfwvC9Z+eT}l8EsVZzJ#FEy~=fijj<%?_gA{WY~t9BFkNIf^3o^2UjUmNpTH9 zwfF{ZP~t}1gj?_}rQM3#h_4-Y5ZQ?-EW=&69}g&fgGzY^58=D`OQk)6U+)8+z+|uR z6rNV{Gk6w%rL^YoBH_P2LIYwf;ctjs#(%@#;_vXPl9S_gr4#T2{PSz;F@EyeddeV; zOAm$_!-2^6sgT{?$T$~HK^a5?2Uh~=P<#UfP(0eUq)lc4jBC#q37*^wD>Y zrXOAQF!TuWsPI_uH1XW$$@i@F-1OS*<>3|RmE+at^~md)_i^t+?`fZXK6yTizBazD zz9GIm-)i4R-x1$sKNUZo-};R)6Wp5VmuK&Qak zz=tQpf>=SNL7Ty8AqF9hAx}fCLPJ9P!VJU8!W7{F;bRfH5q=RjA|cW#QXJXJG34+$ zn^C3FTG5%&&to_-E3t803vOqeTijs0eSB%ck%Wy?5s8r4a@s0sTaqx@FL{xd$XiHp zNNMJq@WrX`rEa7(o=Hd-=%=@5*k){;{Z^1E=*+aq96opWJoEgtP**r~@nDupmh2My z(#y*~W;^BV%Qefb&Rxpm#f2r8OVdlcC8cHWm2H*} zRrpk@S58;GTP3Vok(OQ!y88V!=C#Rc*P7$CK6Ms#i`R{AeAM93_`#vZp(ekkN6is8 z)myA?8Qz+0b!&rmw+@F+o6Z%gUgp}x>KgB^@5$;t*jxQY#1~_Imv7tl8}?@ogbgeW zJRZ~^j2N7x0^dGcMQsdBYf_xad`#KR=BZHU?o*o7p_TGsk+r2=53?3oX{p(Q4OoMn zMfYg7A$`>&(1ZKn5{%*7^eMoDc&qz|@t1f6 zkK!?WkDP!!y8G$g$1_ljXQ2Uqh3DW3o(D0M;01giFXFFzB4mhPL~d=PzSOO;zGPh4xF%Od$tj4j@JpBZ~Z_w8_1+jXWxVR2qmTyku?) jm7u7eh-oB3s-J+xtMHzeGw3`v`1{FeW4gEB{9XPJk8RGX From a990daaf9e4c6eafb5029e7e4094dc0ef8703dfa Mon Sep 17 00:00:00 2001 From: Laurent Trinques Date: Fri, 31 Oct 2025 10:04:18 +0100 Subject: [PATCH 50/65] Update Catalan translation, thanks Antoni --- lang/qet_ca.qm | Bin 162759 -> 313465 bytes lang/qet_ca.ts | 4674 ++++++++++++++++++++++++------------------------ 2 files changed, 2378 insertions(+), 2296 deletions(-) diff --git a/lang/qet_ca.qm b/lang/qet_ca.qm index 5b3f187e6fb49020f6fff7b2ce7851cee184c9a8..83b33fa337749d55de10ab9370a8987e028dfef3 100644 GIT binary patch literal 313465 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

JFCs-oyeyfW_OSI3c+QM!a=;B1NUwsZq!IfV- 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 Ve)8~_fft`M^Iw2opE-8y{{ULZjuQX? delta 31610 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 À propos de QElectrotech - Sobre QElectrotech + Quant a QElectrotech À propos - + Quant a Auteurs - + Autors Traducteurs - + Traductors Contributeurs - + Contribuïdors Version - + Versió Projet annexe - + Projecte annex Bibliothèques - + Biblioteques - Licenses - + Accord de licence + Acord de llicència - + + Ce programme est sous licence GNU/GPL. + Aquest programa està subjecte a la llicència GNU/GPL. + + + log - + Registre QElectroTech, une application de réalisation de schémas électriques. about tab, description line - QElectroTech, un programa per fer esquemes d'instal·lacions elèctriques. + QElectroTech, un programa per fer esquemes elèctrics. Les développeurs de QElectroTech about tab, developers line - + Els desenvolupadors de QElectroTech Contact : <a href="mailto:qet@lists.tuxfamily.org">qet@lists.tuxfamily.org</a> about tab, contact line - Contacte : <a href=\"mailto:qet@lists.tuxfamily.org\">qet@lists.tuxfamily.org</a> + Contacte : <a href=\"mailto:qet@lists.tuxfamily.org\">qet@lists.tuxfamily.org</a> Idée originale - Idea original + Idea original @@ -88,236 +93,236 @@ Développement - Desenvolupament + Desenvolupament Convertisseur DXF - Convertidor a DXF + Convertidor DXF Plugin Bornier - + Connector de borns Collection - Col·lecció + Col·lecció Traduction en espagnol - Traducció al castellà + Traducció al castellà Traduction en russe - Traducció al rus + Traducció al rus Traduction en portugais - Traducció al portuguès + Traducció al portuguès Traduction en tchèque - Traducció al txec + Traducció al txec Traduction en polonais - Traducció al polonès + Traducció al polonès Traduction en allemand - Traducció a l'alemany + Traducció a l'alemany Traduction en roumain - Traducció al romanès + Traducció al romanès Traduction en italien - Traducció a l'italià + Traducció a l'italià Traduction en arabe - Traducció a l'àrab + Traducció a l'àrab Traduction en croate - Traucció al croat + Traucció al croat Traduction en catalan - Traducció al català + Traducció al català Traduction en grec - Traducció al grec + Traducció al grec Traduction en néerlandais - Traducció a l'holandès + Traducció a l'holandès Traduction en flamand - Traducció al flamenc + Traducció al flamenc Traduction en danois - Traducció al danès + Traducció al danès Traduction en brézilien - Traducció al brasiler + Traducció al brasiler Traduction en Turc - + Traducció al turc Traduction en hongrois - + Traducció a l'hongarès Traduction en serbe - + Traducció al serbi Traduction en ukrainien - + Traducció a l'ucraïnès Traduction en norvégien - + Traducció al noruec Traduction en japonais - + Traducció al japonès Traduction en mongol - + Traducció al mongol Traduction en slovène - + Traducció a l'eslovè Paquets Fedora et Red Hat - Paquets Fedora i Red Hat + Paquets per Fedora i Red Hat Paquets Mageia - Paquets Mageia + Paquets per Mageia Paquets Debian - Paquets Debian + Paquets per Debian Paquets Gentoo - Paquets Gentoo + Paquets per Gentoo Paquets OS/2 - Paquets OS/2 + Paquets per OS/2 Paquets FreeBSD - Paquets FreeBSD + Paquets per FreeBSD Paquets MAC OS X - Paquets MAC OS X + Paquets per MAC OS X Paquets Archlinux AUR - Paquets Archlinux AUR + Paquets per Archlinux AUR Icônes - Icones + Icones Documentation - Documentació + Documentació Collection d'éléments - Col·lecció de símbols + Col·lecció d'elements Paquets Snap - + Paquets Snap Redimensionneur d'éléments Element scaler - + Redimensionador d'elements Générateur d'élément lambda Lambda element generator - + Generador d'elements lambda Convertisseur d'élément DXF Dxf2elmt - + Convertidor d'elements a DXF Outil de traduction d'éléments Qet_translate - + Útil de traducció d'elements @@ -346,99 +351,99 @@ Ajouter un tableau - + Afegeix una taula Affichage - Visualització + Visualització Ajuster la taille du tableau au folio - + Ajusta la mida de la taula al full Ajouter de nouveau folio et tableau si nécessaire. - + Afegeix un full nou i una taula si és necessari. Nom du tableau - + Nom de la taula Texte des en-têtes - + Text de la capçalera Gauche - Esquerra + Esquerra Centre - + Centre Droite - Dreta + Dreta Police : - Tipus de lletra: + Tipus de lletra : Éditer - + Edita Marges : - + Marges : Alignement : - Aliniació: + Alineació : Texte du tableau - + Text de la taula Configuration - + Configuració Contenu - + Contingut Sélectionner la police des en tête du tableau - + Seleccioneu la font a la capçalera de la taula Sélectionner la police des cellules du tableau - + Seleccioneu la font a les cel·les de la taula @@ -446,12 +451,12 @@ Dialog - Diàleg + Diàleg Ajouter le plan de bornes suivant : - + Afegiu el següent pla de borns : @@ -459,7 +464,7 @@ Alignement du texte - + Alineació de text @@ -467,32 +472,32 @@ Centre : - Centre: + Centre : Diamètres : - Diàmetres: + Diàmetres : horizontal : - horitzontal: + horitzontal : vertical : - vertical: + vertical : Angle de départ : - Angle d'inici: + Angle d'inici : Angle : - Angle: + Angle : @@ -500,7 +505,7 @@ Sélection numérotation auto - + Selecció de numeració automàtica @@ -510,17 +515,17 @@ Conducteur - Conductor + Conductor Configurer les règles d'auto numérotation - + Configura les regles de numeració automàtica Configurer - + Configura @@ -538,7 +543,7 @@ Project Status: - Estat del Projecte: + Estat del projecte : @@ -548,17 +553,17 @@ Apply to Selected Locations - Aplicar a ubicacions seleccionades + Aplica a les ubicacions seleccionades Apply to Selected Folios - Aplicar als fulls seleccionats + Aplica als fulls seleccionats Apply to Entire Project - Aplicar a tot el projecte + Aplica a tot el projecte @@ -573,7 +578,7 @@ Update Policy - Política d'Actualització + Política d'actualització @@ -585,7 +590,7 @@ Only New - Solament Nou + Només nou @@ -599,7 +604,7 @@ Disable - Desactivar + Desactiva @@ -610,7 +615,7 @@ Only Existent - Solament Existent + Només existent @@ -625,7 +630,7 @@ Under Development - Sota Desenvolupament + En desenvolupament @@ -641,7 +646,7 @@ Auto Numbering Management title window - Gestió de numeració automàtica + Gestió de la numeració automàtica @@ -651,12 +656,12 @@ -Update Only Existent: only existent Elements will be updated. New Elements will be assigned their formula but will not update once created. -Disable: both New and Existent Element labels will not be updated. This is valid for new folios as well. Note: These options DO NOT allow or block Auto Numberings, only their Update Policy. - En aquest menú pot configurar si voleu que la numeració automàtica s'actualitzi o no. Per a la numeració automàtica d'elements, té 4 opcions de política d'actualització: --Tots Dos: s'actualitzaran les etiquetes d'elements nous i existents. Aquesta és l'opció per defecte. --Nou: Només s'actualitzaran els elements nous creats. Les etiquetes d'elements existents es congelaran. --Existent: Només s'actualitzaran els elements existents. Als nous elements se'ls assignarà la seva fórmula però no s'actualitzarà un cop creada. --Deshabilitar: Les etiquetes d'elements nous i existents no s'actualitzaran. Això és vàlid per a fulls nous també. -Nota: Aquestes opcions NO permeten o bloquegen les Numeracions automàtiques, només la seva Política d'actualització. + En aquest menú pot configurar si vol que la numeració automàtica s'actualitzi o no. Per a la numeració automàtica d'elements, té quatre opcions de política d'actualització: +-Ambdues: s'actualitzaran les etiquetes dels elements nous i existents. Aquesta és l'opció per defecte. +-Actualitza només els nous: només s'actualitzaran els elements nous creats. Les etiquetes dels elements existents es congelaran. +-Actualitza només els existents: només s'actualitzaran els elements existents. Els elements nous tindran la seva fórmula assignada, però no s'actualitzaran un cop creats +-Desactiva: no s'actualitzaran les etiquetes dels elements nous ni existents. Això també és vàlid per als nous folis. +Nota: Aquestes opcions NO permeten ni bloquegen les numeracions automàtiques, només la seva política d'actualització. @@ -664,65 +669,67 @@ Nota: Aquestes opcions NO permeten o bloquegen les Numeracions automàtiques, no Dialog - Diàleg + Diàleg Mise en page - Paginació + Paginació inclure les en-têtes - + Incloure les capçaleres Formater en tant que liste de materiel - + Formata com a llista de material nomenclature_ - nomenclatura_ + nomenclatura_ Enregister sous... - Anomenar i Desar... + Desa com a... Fichiers csv (*.csv) - Arxius csv (*.csv) + Fitxers csv (*.csv) Erreur - Error + Error Impossible de remplacer le fichier! - Impossible reemplaçar el fitxer! + No es pot substituir el fitxer! + + Position - Posició + Posició Position du folio - + Posició del full Quantité numéro d'article Special field with name : designation quantity - + Quantitat de número d'article @@ -749,23 +756,23 @@ Nota: Aquestes opcions NO permeten o bloquegen les Numeracions automàtiques, no Colonnes : - Columnes: + Columnes : Afficher les en-têtes - Mostrar les capçaleres + Mostra les capçaleres Lignes : - Files: + Files : Dimensions du folio - Mida del full + Dimensions del full @@ -773,33 +780,33 @@ Nota: Aquestes opcions NO permeten o bloquegen les Numeracions automàtiques, no Texte composé - + Text compost Ajouter une variable : - + Afegeix una variable : Entrée votre texte composé ici, en vous aidant des variables disponible - + Introduïu aquí el text que voleu escriure, utilitzant les variables disponibles Conductor - + Modifier les propriétés d'un conducteur undo caption - Modificar les propietats d'un conductor + Modifica les propietats d'un conductor - + Modifier les propriétés de plusieurs conducteurs undo caption - Modificar les propietats de diversos conductors + Modifica les propietats de diversos conductors @@ -807,24 +814,24 @@ Nota: Aquestes opcions NO permeten o bloquegen les Numeracions automàtiques, no Éditer les propriétés d'un conducteur - Editar les propietats d'un conductor + Edita les propietats d'un conductor Appliquer les propriétés à l'ensemble des conducteurs de ce potentiel - Aplicar les propietats a tots els conductors d'aquest potencial + Aplica les propietats a tots els conductors d'aquest potencial Modifier les propriétés d'un conducteur undo caption - Modificar les propietats d'un conductor + Modifica les propietats d'un conductor Modifier les propriétés de plusieurs conducteurs undo caption - Modificar les propietats de diversos conductors + Modifica les propietats de diversos conductors @@ -832,22 +839,22 @@ Nota: Aquestes opcions NO permeten o bloquegen les Numeracions automàtiques, no Taille du texte : - Mida del text: + Mida del text : Tension / Protocole : - Tensió / Protocol: + Tensió / Protocol : Texte : - Text: + Text : Fonction : - Funció: + Funció : @@ -878,7 +885,7 @@ Nota: Aquestes opcions NO permeten o bloquegen les Numeracions automàtiques, no activer l'option un texte par potentiel - Activar l'opció d'un text per potencial + Activa l'opció d'un text per potencial @@ -895,7 +902,7 @@ Nota: Aquestes opcions NO permeten o bloquegen les Numeracions automàtiques, no Trait en pointillés conductor style: dashed line - Línia de puntets + Línia de punts @@ -922,72 +929,72 @@ Nota: Aquestes opcions NO permeten o bloquegen les Numeracions automàtiques, no &Multifilaire - + &Multifilar Couleur du texte: - + Color del text : Autonumérotation - + Numeració automàtica Section du conducteur - + Secció del conductor Afficher un texte de potentiel par folio. - Mostrar un text de potencial per full. + Mostra un text de potencial per full. Vertical à gauche - + Vertical esquerra Vertical à droite - + Vertical dreta Position et rotation du texte de conducteur : - + Posició i rotació del text del conductor : Horizontal en haut - + Horizontal a la part superior Horizontal en bas - + Horizontal a la part inferior éditer les numérotations - Editar la numeració + Edita la numeració Formule du texte : - + Fórmula de text : cable - + Cable bus - + Bus @@ -1008,7 +1015,7 @@ Nota: Aquestes opcions NO permeten o bloquegen les Numeracions automàtiques, no Protective Earth Neutral - Terra per protecció personal + Terra de protecció neutre @@ -1028,7 +1035,7 @@ Nota: Aquestes opcions NO permeten o bloquegen les Numeracions automàtiques, no Taille : - + Mida : @@ -1039,17 +1046,17 @@ Nota: Aquestes opcions NO permeten o bloquegen les Numeracions automàtiques, no Couleur secondaire : - + Color secundari : Taille de trait : - + Mida de tram: px - px + px @@ -1066,12 +1073,12 @@ Nota: Aquestes opcions NO permeten o bloquegen les Numeracions automàtiques, no Couleur : - Color: + Color : Style : - Estil: + Estil : @@ -1079,12 +1086,12 @@ Nota: Aquestes opcions NO permeten o bloquegen les Numeracions automàtiques, no GroupBox - + Caixa de grup Configuration - + Configuració @@ -1098,9 +1105,9 @@ Nota: Aquestes opcions NO permeten o bloquegen les Numeracions automàtiques, no Diagram - + Modifier la profondeur - + Canvia la profunditat @@ -1108,7 +1115,7 @@ Nota: Aquestes opcions NO permeten o bloquegen les Numeracions automàtiques, no Form - Formulari + Formulari @@ -1119,12 +1126,12 @@ Nota: Aquestes opcions NO permeten o bloquegen les Numeracions automàtiques, no Nom - Nom + Nom Valeur - Valor + Valor @@ -1132,27 +1139,27 @@ Nota: Aquestes opcions NO permeten o bloquegen les Numeracions automàtiques, no Form - Formulari + Formulari Poignées : - + Nanses : x 1 - + x 1 x 2 - + x 2 x 3 - + x 3 @@ -1160,7 +1167,7 @@ Nota: Aquestes opcions NO permeten o bloquegen les Numeracions automàtiques, no Ajouter %1 - Afegir %1 + Afegeix %1 @@ -1185,13 +1192,7 @@ Nota: Aquestes opcions NO permeten o bloquegen les Numeracions automàtiques, no Maintenir ctrl pour un déplacement libre - Mantenir ctrl per a un desplaçament lliure - - - - -<Shift> to move - + Mantingueu premuda la tecla Ctrl per a moviment lliure @@ -1201,28 +1202,28 @@ Nota: Aquestes opcions NO permeten o bloquegen les Numeracions automàtiques, no Ceci est la zone dans laquelle vous concevez vos schémas en y ajoutant des éléments et en posant des conducteurs entre leurs bornes. Il est également possible d'ajouter des textes indépendants. "What's this?" tip "Què és això?" - En aquesta zona podeu elaborar els esquemes afegint-hi els símbols i posant-hi els conductors entre els borns. També es poden afegir àrees de text independents. + Aquesta és l'àrea on dissenyeu els esquemes afegint elements i col·locant conductors entre els seus borns. També és possible afegir text independent. Coller ici context menu action - Enganxar aquí + Enganxa aquí Collage multiple - + Enganxament múltiple X: %1 Y: %2 - + X: %1 Y: %2 Connecter les bornes sélectionnées - + Connecteu els borns seleccionats @@ -1233,13 +1234,13 @@ Nota: Aquestes opcions NO permeten o bloquegen les Numeracions automàtiques, no Choisir la nouvelle couleur de ce conducteur - Triar un nou color per a aquest conductor + Tria un nou color per a aquest conductor Modifier les propriétés d'un conducteur undo caption - Modificar les propietats d'un conductor + Modifica les propietats d'un conductor @@ -1247,7 +1248,7 @@ Nota: Aquestes opcions NO permeten o bloquegen les Numeracions automàtiques, no Merci de patienter - Gràcies per l'espera + Si us plau, espereu @@ -1265,12 +1266,12 @@ Nota: Aquestes opcions NO permeten o bloquegen les Numeracions automàtiques, no Texte - Text + Text Éditer un texte d'élément - + Edita un text d'element @@ -1278,12 +1279,12 @@ Nota: Aquestes opcions NO permeten o bloquegen les Numeracions automàtiques, no Form - Formulari + Formulari Exporter l'actuelle configuration des textes - + Exporta la configuració actual del text @@ -1292,57 +1293,57 @@ Nota: Aquestes opcions NO permeten o bloquegen les Numeracions automàtiques, no ... - + ... Importer une configuration de texte - + Importa una configuració de text Ajouter un texte - + Afegeix text Ajouter un groupe de textes - + Afegeix un grup de textos Supprimer la sélection - + Suprimeix la selecció Modifier des textes d'élément - + Edita els textos dels elements Modifier un texte d'élément - + Edita el text d'un element Modifier %1 textes d'élément - + Edita els %1 textos d'element Nom du groupe - + Nom de grup Entrer le nom du nouveau groupe - + Introduïu el nom del nou grup Textes - + Textos @@ -1350,17 +1351,17 @@ Nota: Aquestes opcions NO permeten o bloquegen les Numeracions automàtiques, no Propriété - + Propietat Valeur - Valor + Valor Source du texte - + Font del text @@ -1369,7 +1370,7 @@ Nota: Aquestes opcions NO permeten o bloquegen les Numeracions automàtiques, no Texte utilisateur - + Text de l'usuari @@ -1378,7 +1379,7 @@ Nota: Aquestes opcions NO permeten o bloquegen les Numeracions automàtiques, no Information de l'élément - + Informació de l'element @@ -1387,173 +1388,173 @@ Nota: Aquestes opcions NO permeten o bloquegen les Numeracions automàtiques, no Texte composé - + Text compost Texte - Text + Text Information - + Informació Mon texte composé - + El meu text compost Taille - + Mida Police - + Font Cadre - + Marc Largeur - + Amplada Position X - + Posició X Position Y - + Posició Y Rotation - + Rotació Conserver la rotation visuel - + Mantenir la rotació visual Alignement - + Alineació Éditer - + Edita Éditer un texte d'élément - + Edita el text de l'element Modifier la taille d'un texte d'élément - + Canvia la mida del text de l'element Modifier la police d'un texte d'élément - + Canvia la font del text d'element Modifier la couleur d'un texte d'élément - + Canvia el color del text d'element Modifier le cadre d'un texte d'élément - + Canvia el marc del text d'element Modifier la largeur d'un texte d'élément - + Canvia l'amplada del text d'element Déplacer un texte d'élément - Moure un element de text + Mou un text d'element Pivoter un texte d'élément - + Gira un text d'element Modifier le maintient de la rotation d'un texte d'élément - + Canvia la rotació del text d'element Modifier l'alignement d'un texte d'élément - + Canvia l'alineació del text d'element Éditer un groupe de textes - + Edita un grup de textos Gauche - Esquerra + Esquerra Droite - Dreta + Dreta Centre - + Centre Ajustement vertical - + Ajust vertical Maintenir en bas de page - + Mantenir al final de la pàgina Déplacer un texte dans un autre groupe - + Moure un text a un altre grup Couleur - Color + Color @@ -1561,130 +1562,130 @@ Nota: Aquestes opcions NO permeten o bloquegen les Numeracions automàtiques, no Form - Formulari + Formulari Couleur - Color + Color Largeur - + Amplada Texte utilisateur - + Text de l'usuari Information de l'élément - + Informació de l'element Texte composé - + Text compost Conserver la rotation visuel - + Mantenir la rotació visual Y - + Y Source du texte - + Font del text Rotation - + Rotació Alignement - + Alineació Encadrer le texte - + Emmarca el text X - + X Police - + Font Déplacer un champ texte - Moure un camp de text + Mou un camp de text Pivoter un champ texte - + Gira un camp de text Modifier le texte d'un champ texte - + Canvia el text d'un camp de text Modifier la police d'un champ texte - + Canvia la font d'un camp de text Modifier le cadre d'un champ texte - + Canvia el marc d'un camp de text Modifier la largeur d'un texte - + Canvia l'amplada d'un text Modifier l'information d'un texte - + Canvia la informació d'un text Modifier la source de texte, d'un texte - + Canvia la font del text d'un text Modifier l'alignement d'un champ texte - + Canvia l'alineació d'un camp de text Modifier la couleur d'un champ texte - Modificar el color d'un camp de text + Canvia el color d'un camp de text Modifier la conservation de l'angle - + Canvia la conservació de l'angle @@ -1692,32 +1693,32 @@ Nota: Aquestes opcions NO permeten o bloquegen les Numeracions automàtiques, no Texte utilisateur - + Text de l'usuari Information de l'élément - + Informació de l'element Texte composé - + Text compost Gauche - Esquerra + Esquerra Centre - + Centre Droite - Dreta + Dreta @@ -1726,44 +1727,44 @@ Nota: Aquestes opcions NO permeten o bloquegen les Numeracions automàtiques, no Ouvrir un élément dialog title - Obrir un símbol + Obre un element Choisissez l'élément que vous souhaitez ouvrir. dialog content - Triï el símbol que vol obrir. + Tria l'element que vols obrir. Enregistrer un élément dialog title - Desar un símbol + Desa un element Choisissez l'élément dans lequel vous souhaitez enregistrer votre définition. dialog content - Triï el símbol al qual es desarà la seva definició. + Tria l'element en el qual es desarà la teva definició. Ouvrir une catégorie dialog title - Obrir una categoria + Obre una categoria Choisissez une catégorie. dialog content - Triï una categoria. + Tria una categoria. Enregistrer une catégorie dialog title - Desar una categoria + Desa una categoria @@ -1783,13 +1784,13 @@ Nota: Aquestes opcions NO permeten o bloquegen les Numeracions automàtiques, no Nom du nouvel élément - Nom del símbol nou + Nom de l'element nou Vous devez sélectionner un élément ou une catégorie avec un nom pour l'élément. message box content - Ha de seleccionar un símbol o una categoria amb un nom per al símbol. + Has de seleccionar un element o una categoria amb un nom per a l'element. @@ -1814,19 +1815,19 @@ Nota: Aquestes opcions NO permeten o bloquegen les Numeracions automàtiques, no La sélection n'est pas un élément. message box content - La selecció no és un símbol. + La selecció no és un element. Écraser l'élément ? message box title - Vol sobrescriure el símbol? + Vols sobreescriure l'element? L'élément existe déjà. Voulez-vous l'écraser ? message box content - Aquest símbol ja existeix. Vol sobrescriure'l? + Aquest element ja existeix. Vols sobreescriure'l? @@ -1844,7 +1845,7 @@ Nota: Aquestes opcions NO permeten o bloquegen les Numeracions automàtiques, no Supprimer ce texte - + Suprimeix aquest text @@ -1871,12 +1872,12 @@ Nota: Aquestes opcions NO permeten o bloquegen les Numeracions automàtiques, no Type - Tipus + Tipus Type de base : - Tipus de base: + Tipus de base : @@ -1886,7 +1887,7 @@ Nota: Aquestes opcions NO permeten o bloquegen les Numeracions automàtiques, no Nombre de contact représenté - Nom del contacte representat + Nombre de contactes representats @@ -1901,7 +1902,7 @@ Nota: Aquestes opcions NO permeten o bloquegen les Numeracions automàtiques, no Élément maître - Símbol mestre + Element mestre @@ -1911,27 +1912,27 @@ Nota: Aquestes opcions NO permeten o bloquegen les Numeracions automàtiques, no Élément bornier - + Element del born Fonction - Funció + Funció Informations - Dades + Dades Nom - Nom + Nom Valeurs - + Valors @@ -1962,12 +1963,12 @@ Nota: Aquestes opcions NO permeten o bloquegen les Numeracions automàtiques, no Bornier - Terminal + Bloc de Borns Vignette - + Miniatura @@ -1987,7 +1988,7 @@ Nota: Aquestes opcions NO permeten o bloquegen les Numeracions automàtiques, no Other - + Altres @@ -1997,17 +1998,17 @@ Nota: Aquestes opcions NO permeten o bloquegen les Numeracions automàtiques, no Temporisé travail - Temporitzador de treball + Temporitzador a la connexió Temporisé repos - Temporitzador de repòs + Temporitzador a la desconnexió Temporisé travail & repos - + Temporitzador a la connexió i a la desconnexió @@ -2028,37 +2029,37 @@ Nota: Aquestes opcions NO permeten o bloquegen les Numeracions automàtiques, no Générique - + Genèric Fusible - + Fusible Séctionnable - + Seleccionable Diode - + Díode Phase - Fase + Fase Neutre - Neutre + Neutre Terre - Terra + Terra @@ -2072,74 +2073,81 @@ Nota: Aquestes opcions NO permeten o bloquegen les Numeracions automàtiques, no Élement - + Element + Nom : %1 - + Nom : %1 + Folio : %1 - + Full : %1 + Type : %1 - Tipus: %1 + Tipus: %1 Sous-type : %1 - + Subtipus: %1 + Position : %1 - + Posició : %1 + Rotation : %1° - + Rotació : %1° + Dimensions : %1*%2 - Mida: %1*%2 + Mida: %1*%2 Bornes : %1 - + Borns : %1 + Emplacement : %1 - Ubicació: %1 + Ubicació: %1 Retrouver dans le panel - Cercar al panell + Cerca al panel Éditer l'élément - Modificar el símbol + Modifica l'element @@ -2147,162 +2155,162 @@ Nota: Aquestes opcions NO permeten o bloquegen les Numeracions automàtiques, no Form - Formulari + Formulari Informations disponibles - + Informació disponible Informations à exporter - + Informació per exportar Monter la sélection - + Mou la selecció cap amunt Ajouter la sélection - + Afegeix una selecció Supprimer la sélection - + Suprimeix la selecció Descendre la sélection - + Desplaça la selecció cap avall Pas de filtre - + Sense filtre N'est pas vide - + No està buit Est vide - + Està buit Contient - + Conté Ne contient pas - + No conté Est égal à - + És igual a N'est pas égale à - + No és igual a Filtre : - + Filtre : Type d'éléments - + Tipus d'elements Simples - + Simple Organes de protection - + Unitat de protecció Tous - + Tots Boutons et commutateurs - + Botons i interruptors Borniers - + Bloc de borns Vignettes - + Miniatures Contacteurs et relais - + Contactors i relés Configuration - + Configuració Ouvrir la configuration sélectionné - + Obra la configuració seleccionada Sauvegarder la configuration actuelle - + Desa la configuració actual Requête SQL personnalisée - + Consulta SQL personalitzada Requête SQL : - + Consulta SQL : Position - Posició + Posició Titre du folio - Títol del full + Títol del full Position du folio - + Posició de full Numéro du folio - + Número de full @@ -2310,29 +2318,29 @@ Nota: Aquestes opcions NO permeten o bloquegen les Numeracions automàtiques, no Déplacer une primitive - Moure una primitiva + Moure una primitiva - + Éditer les informations sur l'auteur window title - Canviar les dades de l'autor + Canvia les dades de l'autor - + Vous pouvez utiliser ce champ libre pour mentionner les auteurs de l'élément, sa licence, ou tout autre renseignement que vous jugerez utile. - Pot fer servir aquest camp lliure per indicar els autors del símbol, la llicència, o qualsevol informació que consideri útil. + Pots utilitzar aquest camp lliure per esmentar els autors de l'element, la seva llicència, o qualsevol altra informació que consideris útil. - + Éditer les noms window title - Modificar els noms + Modifica els noms - + Vous pouvez spécifier le nom de l'élément dans plusieurs langues. - Pot indicar el nom del símbol en diferentes llengües. + Pots especificar el nom de l'element en diferents llengües. @@ -2341,13 +2349,13 @@ Nota: Aquestes opcions NO permeten o bloquegen les Numeracions automàtiques, no L'item n'est pas une catégorie message box title - El símbol no és una categoria + L'element no és una categoria L'item demandé n'est pas une categrie. Abandon. message box content - El símbol sol·licitat no és una categoria. Abandonar. + L'element sol·licitat no és una categoria. No es pot continuar. @@ -2365,13 +2373,13 @@ Nota: Aquestes opcions NO permeten o bloquegen les Numeracions automàtiques, no Éditer une catégorie window title - Modificar categoria + Modifica una categoria Créer une nouvelle catégorie window title - Crear una categoria nova + Crea una categoria nova @@ -2383,41 +2391,41 @@ Nota: Aquestes opcions NO permeten o bloquegen les Numeracions automàtiques, no Édition en lecture seule message box title - Edició només en mode de lectura + Edició en mode només de lectura Vous n'avez pas les privilèges nécessaires pour modifier cette catégorie. Elle sera donc ouverte en lecture seule. message box content - No té els priveligis necessaris per canviar la categoria. Per tant, s'obre només en mode de lectura. + No tens els privilegis necessaris per editar aquesta categoria, per la qual cosa s'obrirà en mode de només lectura. Nom interne : - Nom intern: + Nom intern : Vous pouvez spécifier un nom par langue pour la catégorie. - Pot indicar un nom de categoria per cada llengüa. + Pots especificar un nom per idioma per a la categoria. Nom interne manquant message box title - Falta nom intern + Falta un nom intern Vous devez spécifier un nom interne. message box content - Ha d'indicar un nom intern. + Has d'especificar un nom intern. Nom interne déjà utilisé message box title - Aquest nom intern ja és en ús + Aquest nom intern ja és utilitzat @@ -2443,32 +2451,32 @@ Nota: Aquestes opcions NO permeten o bloquegen les Numeracions automàtiques, no Ouvrir le dossier correspondant - Obrir la carpeta corresponent + Obre la carpeta corresponent Éditer l'élément - Modificar el símbol + Modifica l'element Supprimer l'élément - Suprimir el símbol + Suprimeix l'element Supprimer le dossier - Suprimir la carpeta + Suprimeix la carpeta Recharger les collections - Recarregar les col·leccions + Recarrega les col·leccions Éditer le dossier - Editar la carpeta + Edita la carpeta @@ -2478,17 +2486,17 @@ Nota: Aquestes opcions NO permeten o bloquegen les Numeracions automàtiques, no Nouvel élément - Nou símbol + Nou element Afficher uniquement ce dossier - Mostrar solament aquesta carpeta + Mostra solament aquesta carpeta Afficher tous les dossiers - Mostrar totes les carpetes + Mostra totes les carpetes @@ -2498,73 +2506,74 @@ Nota: Aquestes opcions NO permeten o bloquegen les Numeracions automàtiques, no Rechercher - Cercar + Cerca Supprimer l'élément ? message box title - Eliminar el símbol? + Suprimeix l'element? Êtes-vous sûr de vouloir supprimer cet élément ? message box content - + Esteu segur que voleu suprimir aquest element ? + Suppression de l'élément message box title - Supressió del símbol + Suprimeix l'element La suppression de l'élément a échoué. message box content - No s'ha pogut suprimir el símbol. + No s'ha pogut suprimir l'element. Supprimer le dossier? message box title - Eliminar la carpeta? + Suprimeix la carpeta? Êtes-vous sûr de vouloir supprimer le dossier ? Tout les éléments et les dossier contenus dans ce dossier seront supprimés. message box content - Està segur que desitja eliminar la carpeta? + Estàs segur que vols suprimir la carpeta? S'eliminaran tots els elements i carpetes contingudes en aquesta carpeta. Suppression du dossier message box title - Eliminar la carpeta + Suprimeix la carpeta La suppression du dossier a échoué. message box content - L'esborrat de la carpeta va fallar. + No s'ha pogut suprimir la carpeta. Le dossier - + La carpeta contient - + conté éléments - + elements @@ -2574,28 +2583,28 @@ S'eliminaran tots els elements i carpetes contingudes en aquesta carpeta. %n élément(s), répartie(s) - - - + + %n element, distribuït + %n elements, distribuïts dans %n dossier(s). - - - + + en %n carpeta. + en %n carpetes. Chemin de la collection : %1 - Ruta de la col·lecció: 1% + Ruta de la col·lecció: %1 Chemin dans le système de fichiers : %1 - Ruta del sistema d'arxius: 1% + Ruta del sistema de fitxers: %1 @@ -2620,51 +2629,51 @@ S'eliminaran tots els elements i carpetes contingudes en aquesta carpeta. Glissez-déposez ce modèle de cartouche sur un folio pour l'y appliquer. Status tip displayed when selecting a title block template - Arrossegar i col·locar el rètol sobre el full per aplicar-ho. + Arrossega i deixa anar aquest model de caixetí sobre el full per aplicar-lo. Double-cliquez pour réduire ou développer ce projet Status tip - Faci doble clic per reduir o expandir aquest projecte + Fes doble clic per reduir o expandir aquest projecte Double-cliquez pour réduire ou développer la collection de cartouches QElectroTech Status tip - Faci doble clic per reduir o expandir aquesta col·lecció de caixetins QElectroTech + Fes doble clic per reduir o expandir aquesta col·lecció de caixetins QElectroTech Ceci est la collection de cartouches fournie avec QElectroTech. Installée en tant que composant système, vous ne pouvez normalement pas la personnaliser. "What's this" tip "Què és això?" - Aquesta és la col·lecció de caixetins bàsica inclosa a QElectroTech. S'instal·la com a part del sistema i normalment no pot ésser personalitzada. + Aquesta és la col·lecció de caixetins inclosa a QElectroTech. S'instal·la com a component del sistema i normalment no es pot personalitzar. Double-cliquez pour réduire ou développer la collection company de cartouches Status tip - + Fes doble clic per reduir o ampliar la col·lecció de caixetins de l'empresa Ceci est la collection company de cartouches -- utilisez-la pour créer, stocker et éditer vos propres cartouches. "What's this" tip - + Aquesta és la col·lecció de caixetins de l'empresa: feu-la servir per crear, emmagatzemar i editar els vostres propis caixetins. Double-cliquez pour réduire ou développer votre collection personnelle de cartouches Status tip - Faci doble clic per reduir o expandir la seva col·lecció personal de caixetins + Feu doble clic per reduir o expandir la vostra col·lecció personal de caixetins Ceci est votre collection personnelle de cartouches -- utilisez-la pour créer, stocker et éditer vos propres cartouches. "What's this" tip "Què és això?" - Aquesta és la seva col·lecció personal de caixetins -- empri-la per crear, emmagatzemar i modificar els seus propis caixetins. + Aquesta és la vostra col·lecció personal de caixetins. Utilitza-la per crear, emmagatzemar i modificar els vostres propis caixetins. @@ -2672,22 +2681,22 @@ S'eliminaran tots els elements i carpetes contingudes en aquesta carpeta. Ouvrir le dossier correspondant - Obrir la carpeta corresponent + Obre la carpeta corresponent Copier le chemin - Copiar la ruta + Copia la ruta Basculer vers ce projet - Traslladar cap a aquest projecte + Trasllada cap a aquest projecte Fermer ce projet - Tancar el projecte + Tanca aquest projecte @@ -2702,17 +2711,17 @@ S'eliminaran tots els elements i carpetes contingudes en aquesta carpeta. Ajouter un folio - Afegir un full + Afegeix un full Supprimer ce folio - Suprimir un full + Suprimeix aquest full Remonter ce folio - Avançar la posició del full + Avança la posició del full @@ -2722,17 +2731,17 @@ S'eliminaran tots els elements i carpetes contingudes en aquesta carpeta. Remonter ce folio x10 - Avançar el full 10 posicions + Avança el full 10 posicions Remonter ce folio x100 - Avançar el full 100 posicions + Avança el full 100 posicions Remonter ce folio au debut - Avançar la posició del full a l'inici del projecte + Avança la posició del full a l'inici del projecte @@ -2742,7 +2751,7 @@ S'eliminaran tots els elements i carpetes contingudes en aquesta carpeta. Abaisser ce folio x100 - Retrocedir 100 posicions el full + Retrocedir 100 posicions el full @@ -2757,12 +2766,12 @@ S'eliminaran tots els elements i carpetes contingudes en aquesta carpeta. Éditer ce modèle - Modificar aquest model + Modifica aquest model Supprimer ce modèle - Eliminar aquest model + Suprimeix aquest model @@ -2770,37 +2779,37 @@ S'eliminaran tots els elements i carpetes contingudes en aquesta carpeta. Form - Formulari + Formulari Centre : - + Centre : Y - + Y X - + X Vertical : - + Vertical : Horizontal : - + Horitzontal : Diamètres : - + Diàmetres : @@ -2809,7 +2818,7 @@ S'eliminaran tots els elements i carpetes contingudes en aquesta carpeta. Export configuration page title - Exportació + Exporta @@ -2817,7 +2826,7 @@ S'eliminaran tots els elements i carpetes contingudes en aquesta carpeta. Exporter - Exportar + Exporta @@ -2833,12 +2842,12 @@ S'eliminaran tots els elements i carpetes contingudes en aquesta carpeta. Exporter les folios du projet window title - Exportar els fulls del projecte + Exporta els fulls del projecte Choisissez les folios que vous désirez exporter ainsi que leurs dimensions : - Triar els fulls que vol exportar i les seves dimensions: + Tria els fulls que vol exportar i les seves dimensions: @@ -2865,19 +2874,19 @@ S'eliminaran tots els elements i carpetes contingudes en aquesta carpeta. Vous devez entrer un nom de fichier non vide et unique pour chaque folio à exporter. message box content - Ha d'entrar un nom d'arxiu únic per a cada full per exportar. + Has d'introduir un nom de fitxer únic i no buit per a cada full per exportar. Dossier non spécifié message box title - No ha indicat una carpeta + No has indicat una carpeta Vous devez spécifier le chemin du dossier dans lequel seront enregistrés les fichiers images. message box content - Ha d'indicar el camí de la carpeta on es desaran les imatges. + Has d'indicar el camí de la carpeta on es desaran les imatges. @@ -2889,12 +2898,12 @@ S'eliminaran tots els elements i carpetes contingudes en aquesta carpeta. Il semblerait que vous n'ayez pas les permissions nécessaires pour écrire dans le fichier %1. message box content - No sembla disposar dels permissos necessaris per escriure al fitxer %1. + No sembla disposar dels permisos necessaris per escriure al fitxer %1. Aperçu - Vista + Vista prèvia @@ -2909,22 +2918,22 @@ S'eliminaran tots els elements i carpetes contingudes en aquesta carpeta. Exporter dans le dossier dialog title - Exportar a la carpeta + Exporta a la carpeta Dossier cible : - Carpeta destinació: + Carpeta de destinació: Parcourir - Navegar + Navega Format : - Format: + Format : @@ -2955,47 +2964,47 @@ S'eliminaran tots els elements i carpetes contingudes en aquesta carpeta. Options de rendu groupbox title - Opcions d'imatge + Opcions de renderització Exporter entièrement le folio - Exportar el full complet + Exporta el full complet Exporter seulement les éléments - Exportar solament els elements + Exporta només els elements Dessiner la grille - Dibuxar la graella + Dibuixa la graella Dessiner le cadre - Dibuixar el quadre + Dibuixa el quadre Dessiner le cartouche - Dibuixar el caixetí + Dibuixa el caixetí Dessiner les bornes - Dibuixar els borns + Dibuixa els borns Conserver les couleurs des conducteurs - Recordar els colors dels conductors + Manté els colors dels conductors SVG: fond transparent - + SVG: fons transparent @@ -3008,22 +3017,22 @@ S'eliminaran tots els elements i carpetes contingudes en aquesta carpeta. C&réer de nouveaux folios - + C&rea nous fulls Numérotation automatique des folios sélectionnés - + Numeració automàtica dels fulls seleccionats Options de numérotation - Opcions de numeració + Opcions de numeració Nouveaux folios - + Nous folis @@ -3049,7 +3058,7 @@ S'eliminaran tots els elements i carpetes contingudes en aquesta carpeta. Folio Autonumbering title window - Numeració del Full automàtica + Numeració del full automàtica @@ -3066,7 +3075,21 @@ Si le chiffre défini dans le champ Valeur possède moins de digits que le type Le champ "Incrémentation" n'est pas utilisé. help dialog about the folio autonumerotation - + Aquí és on podeu definir com es numeraran les pàgines noves. + +- Un sistema de numeració consta d'almenys una variable. + +- Podeu afegir o suprimir una variable de numeració mitjançant els botons - i +. + +- Una variable de numeració inclou: un tipus, un valor i un increment. + +- Els tipus "Dígit 1", "Dígit 01" i "Dígit 001" representen un tipus numèric definit al camp "Valor", que s'incrementa amb cada nova pàgina pel valor del camp "Increment". + +- "Dígit 01" i "Dígit 001" es representen al diagrama amb almenys dos i tres dígits, respectivament. +Si el número definit al camp Valor té menys dígits que el tipus escollit, anirà precedit d'un o dos 0 per coincidir amb el seu tipus. + +- El tipus "Text" representa text fix. El camp "Increment" no s'utilitza. + @@ -3074,17 +3097,17 @@ Le champ "Incrémentation" n'est pas utilisé. Assistant de formule - + Assistent de fórmula TextLabel - Etiqueta de text + Etiqueta de text Formule - + Fórmula @@ -3097,12 +3120,12 @@ Le champ "Incrémentation" n'est pas utilisé. Dénomination automatique : - + Denominació automàtica: Formule - + Fórmula @@ -3121,15 +3144,15 @@ Le champ "Incrémentation" n'est pas utilisé. You can also assign any other titleblock variable that you create. Text and number inputs are also available. - Pot utilitzar les següents variables en la seva fórmula: - -%prefix: Prefix de l'element predeterminat - -%l: Línia Element - -%c: Columna Element - -%F: Nom Full - -%f o %id: ID Full + Pots utilitzar les següents variables en la teva fórmula: + -%prefix: Prefix de l'element per defecte + -%l: Línia de l'element + -%c: Columna de l'element + -%F: Nom del Full + -%f o %id: ID del Full -%total: Total de fulls -També pot crear qualsevol altra variable -Les entrades de text i nombres +També pots assignar qualsevol altra variable de bloc de títol que creis. +Les entrades de text i nombres també estan disponibles. @@ -3138,83 +3161,83 @@ Les entrades de text i nombres Form - Formulari + Formulari Déplacer dans : - + Mou a : Type : - Tipus: + Tipus: Fonction : - Funció: + Funció: LED : - + LED : Appliquer le déplacement - + Aplica el desplaçament Générique - + Genèric Fusible - + Fusible Sectionnable - + Seccionable Diode - + Díode Terre - Terra + Terra Phase - Fase + Fase Neutre - Neutre + Neutre Sans - + Sense Avec - + Amb Modifier des propriétés de borniers - + Modifica les propietats del bloc de borns @@ -3222,27 +3245,27 @@ Les entrades de text i nombres Label - Etiqueta + Etiqueta Référence croisé - + Referència creuada Type - Tipus + Tipus Fonction - Funció + Funció led - + led @@ -3255,7 +3278,7 @@ Les entrades de text i nombres Utiliser les couleurs du système - Emprar els colors del sistema + Utilitza els colors del sistema @@ -3265,79 +3288,79 @@ Les entrades de text i nombres Utiliser les gestes du pavé tactile - Utilitzar els gestos del touchpad + Utilitza els gestos del ratolí tàctil Mettre en valeur dans le panel les éléments fraîchement intégrés - Ressaltar al panell els elements importats recentment + Ressalta els elements recentment integrats al panell Exporter les bornes dans la nomenclature - Exportar els terminals en la nomenclatura + Exporta els borns a la nomenclatura Form - Formulari + Formulari Utiliser des fen&êtres (appliqué au prochain lancement de QElectroTech) - + Utilitza fine&stres (aplicat al proper llançament de QElectroTech) Utiliser des onglets (appliqué au prochain lance&ment de QElectroTech) - + Utilitza pestanyes (aplicat al proper llança&ment de QElectroTech) Méthode de mise à l'echelle des écrans à haute densité de pixels (hdpi) (appliqué au prochain lancement de QElectroTech) : - + Mètode d'escalat de pantalla d'alta densitat de píxels (HDPI) (aplicat al proper llançament de QElectroTech): Sauvegarde automatique des projets (appliqué au prochain lancement de QElectroTech) - + Desament automàtic del projecte (aplicat al proper llançament de QElectroTech) Numéroter les colonnes de cartouche à partir de 0 (1 sinon) Choix de l'increment de depart 1 ou 0 - + Numera les columnes dels caixetins començant per 0 (1 altrament) Désactivé - + Inhabilitat min minute - + min Utiliser les numéros de folio à la place de leur position dans le projet - + Utilitzeu els números de full en lloc de la seva posició en el projecte Collections - Col·leccions + Col·leccions Accès aux collections - + Accés a les col·leccions Répertoire de la collection commune - + Directori de col·leccions comuns @@ -3346,7 +3369,7 @@ Les entrades de text i nombres Par defaut - + Per defecte @@ -3355,194 +3378,168 @@ Les entrades de text i nombres Parcourir... - + Navega... Répertoire de la collection company - + Directori de la col·lecció d'empreses Répertoire des cartouches company - + Directori de caixetins d'empresa Répertoire de la collection utilisateur - + Directori de col·lecció d'usuaris Répertoire des cartouches utilisateur - + Directori de caixetins d'usuari (Recharger les collections d'éléments pour appliquer les changements) - + (Torna a carregar les col·leccions d'elements per aplicar els canvis) Gestion des éléments - Gestió dels símbols + Gestió dels elements Chaque élément embarque des informations sur ses auteurs, sa licence, ou tout autre renseignement que vous jugerez utile dans un champ libre. Vous pouvez spécifier ici la valeur par défaut de ce champ pour les éléments que vous créerez : - + Cada element conté informació sobre els seus autors, la llicència i qualsevol altra informació que considereu útil en un camp lliure. +Podeu especificar el valor per defecte d'aquest camp per als elements que creeu aquí: Langues - + Llengües Appliqué au prochain lancement de QElectroTech - + Aplicat al proper llançament de QElectroTech Textes - + Textos Vous pouvez définir ici l'apparence par defaut des differents textes de QElectroTech - + Aquí podeu definir l'aspecte per defecte dels diferents textos de QElectroTech Textes d'éléments - + Textos d'elements Police : - Tipus de lletra: + Tipus de lletra : ° - + ° Longueur : - + Longitud : Rotation : - + Rotació : Textes indépendants - + Textos independents Autres textes - + Altres textos Grille + Clavier - + Quadrícula + Teclat Grille : 1 - 30 - + Quadrícula: 1 - 30 DiagramEditor yGrid - + Editor de diagrames yQuadrícula La Grille doite etre active pour pouvoir voir les modifications. - + La quadrícula ha d'estar activa per veure els canvis. DiagramEditor xGrid - + Editor de diagrames xQuadrícula Déplacement au clavier : 1 - 30 - + Moviment del teclat: 1 - 30 DiagramEditor (touche : gauche / droite) xGrid - + Editor de diagrames (tecla: esquerra / dreta) xQuadrícula DiagramEditor (touche : haut / bas) yGrid - + Editor de diagrames (tecla: amunt / avall) yQuadrícula Déplacement au clavier avec la touche ALT : 1 - 9 - + Moviment del teclat amb la tecla ALT: 1 - 9 DiagramEditor (touche : gauche / droite ) xGrid - + Editor de diagrames (tecla: esquerra / dreta) xQuadrícula DiagramEditor (touche : haut / bas) yGrid - + Editor de diagrames (tecla: amunt / avall) yQuadrícula - - Affichage Grille - - - - - - max: - - - - - Taille des points de la grille de Diagram-Editor : 1 - 5 - - - - - - min: - - - - - Taille des points de la grille de l'éditeur d'éléments : 1 - 5 - - - - + Editor - + Editor - + Max. parts in Element Editor List - + Màxim de peces a la llista de l'editor d'elements @@ -3552,208 +3549,203 @@ Vous pouvez spécifier ici la valeur par défaut de ce champ pour les éléments Autoriser le dézoom au delà du folio - Permetre l'ajust de la mida del full + Permetre allunyar més enllà de la mida del full Arrondi supérieur pour 0.5 et plus - + Arrodoneix cap amunt per 0,5 i més Toujours arrondi supérieur - + Sempre arrodonit cap amunt Toujours arrondi inférieur - + Sempre arrodonit cap avall Arrondi supérieur pour 0.75 et plus - + Arrodoneix cap amunt per 0,75 i més Pas d'arrondi - + Sense arrodoniment - + Général configuration page title General - + Système Sistema - + Arabe Àrab - + Brézilien Brasiler - + Catalan Català - + Tchèque Txec - + Allemand Alemany - + Danois Danès - + Grec Grec - + Anglais Anglès - + Espagnol Castellà - + Français Francès - + Croate Croat - + Italien Italià - + Japonais - + Japonès - + Polonais Polonès - + Portugais Portuguès - + Roumains Romanès - + Russe Rus - + Slovène Eslovè - + Pays-Bas Països Baixos - + Norvege - + Noruec - + Belgique-Flemish Bèlgica-Flamenc - + Turc - + Turc - + Hongrois - + Hongarès - + Mongol - + Mongol - + Ukrainien - + Ucraïnès - + Chinois - + Xinès - - Suédois - - - - + Chemin de la collection commune - + Ruta de col·lecció comuna - + Chemin de la collection company - + Ruta de col·lecció d'empresa - + Chemin de la collection utilisateur - + Ruta de col·lecció d'usuaris - + Chemin des cartouches company - + Ruta de caixetins d'empresa - + Chemin des cartouches utilisateur - + Ruta de caixetins d'usuaris - + To high values might lead to crashes of the application. - + Valors massa alts poden provocar bloquejos de l'aplicació. @@ -3768,7 +3760,7 @@ Vous pouvez spécifier ici la valeur par défaut de ce champ pour les éléments Ceci est un projet QElectroTech, c'est-à-dire un fichier d'extension .qet regroupant plusieurs folios. Il embarque également les éléments et modèles de cartouches utilisés dans ces folios. "What's this" tip - Això és un projecte QElectroTech, és a dir, un arxiu amb extensió .qet integrat per diversos fulls. També incorpora els elements i models utilitzats en aquests fulls. + Això és un projecte QElectroTech, és a dir, un fitxer amb extensió .qet integrat per diversos fulls. També incorpora els elements i models de caixetins utilitzats en aquests fulls. @@ -3813,185 +3805,186 @@ Vous pouvez spécifier ici la valeur par défaut de ce champ pour les éléments Form - Formulari + Formulari Affichage - Visualització + Visualització Nom du tableau - + Nom de la taula Géometrie et lignes - + Geometria i línies Toutes - + Totes Tableau suivant - + Taula següent Aucun - Cap + Cap Ajuster le tableau au folio - + Ajusta la taula al full Y : - + Y : X : - + X : Tableau précédent - + Taula anterior Appliquer la géometrie à tous les tableaux liée à celui-ci - + Aplica la geometria a totes les taules enllaçades a aquesta Tableau précédent : - + Taula anterior : Lignes à afficher : - + Línies a mostrar : TextLabel - Etiqueta de text + Etiqueta de text En tête - + Al capdavant Marge - + Marge Aligement : - + Alineació : Gauche - Esquerra + Esquerra Centré - Centrat + Centrat Droite - Dreta + Dreta Police - + Font Tableau - + Taula Alignement : - Aliniació: + Alineació : Contenu - + Contingut Déplacer un tableau - + Mou una taula Modifier le nombre de ligne affiché par un tableau - + Canvia el nombre de files que mostra una taula Modifier les marges d'une en tête de tableau - + Canvia els marges de la capçalera d'una taula Modifier les marges d'un tableau - + Canvia els marges d'una taula Modifier l'alignement d'une en tête de tableau - + Canvia l'alineació de la capçalera d'una taula Modifier l'alignement des textes d'un tableau - + Canvia l'alineació dels textos de les taules Modifier la police d'une en tête de tableau - + Canvia la font de la capçalera d'una taula Changer la police d'un tableau - + Canvia la font d'una taula <center>ATTENTION :</center> il manque %1 lignes afin d'afficher l'intégralité des informations - + <center>AVÍS:</center> +Falten %1 línies per mostrar tota la informació Appliquer la géometrie d'un tableau aux tableau liée à celui-ci - + Aplica la geometria d'una taula a les taules que hi estan vinculades @@ -4004,7 +3997,7 @@ Vous pouvez spécifier ici la valeur par défaut de ce champ pour les éléments Verrouiller la position - Bloquejar la posició + Bloqueja la posició @@ -4019,7 +4012,7 @@ Vous pouvez spécifier ici la valeur par défaut de ce champ pour les éléments Modifier la taille d'une image - Modificar la mida d'una imatge + Modifica la mida d'una imatge @@ -4027,32 +4020,32 @@ Vous pouvez spécifier ici la valeur par défaut de ce champ pour les éléments Intégration d'un élément - Integració d'un símbol + Integració d'un element L'élément a déjà été intégré dans le projet. Toutefois, la version que vous tentez de poser semble différente. Que souhaitez-vous faire ? - El símbol ja havia estat integrat al projecte. No obstant, la versió que vol inserir ara sembla diferent. Què vol fer? + L'element ja ha estat integrat al projecte. No obstant, la versió que vols inserir ara sembla diferent. Què vols fer? Utiliser l'élément déjà integré - Utilitzar el símbol ja integrat + Utilitza l'element ja integrat Intégrer l'élément déposé - Importar el nou símbol + Importa el nou element deixat anar Écraser l'élément déjà intégé - Sobreescriure el símbol + Sobreescriure l'element ja integrat Faire cohabiter les deux éléments - Fer coexistir tots dos símbols + Fer coexistir tots dos elements @@ -4060,17 +4053,17 @@ Vous pouvez spécifier ici la valeur par défaut de ce champ pour les éléments Dialog - Diàleg + Diàleg TextLabel - Etiqueta de text + Etiqueta de text Écraser les textes existants - + Sobreescriu els textos existents @@ -4078,59 +4071,60 @@ Vous pouvez spécifier ici la valeur par défaut de ce champ pour les éléments Form - Formulari + Formulari X : - + X : Éditeur avancé - + Editor avançat Taille : - + Mida : Angle : - Angle: + Angle : px - px + px ° - + ° Y : - + Y : Le contenu, la taille et la police du texte ne peuvent être modifié car formaté en html. Veuillez utiliser l'éditeur avancé pour cela. - + El contingut del text, la mida i la font no es poden editar, ja que estan formatats en HTML. +Si us plau, feu servir l'editor avançat per a això. Cliquez ici pour annuler le formatage html - + Feu clic aquí per cancel·lar el format HTML Texte - Text + Text @@ -4138,53 +4132,53 @@ Veuillez utiliser l'éditeur avancé pour cela. Police - + Font Déplacer un champ texte - Moure un camp de text + Moure un camp de text Pivoter un champ texte - + Gira un camp de text Modifier un champ texte - Modificar un camp de text + Canvia un camp de text Modifier la taille d'un champ texte - Modificar la mida d'un camp de text + Canvia la mida d'un camp de text Modifier la police d'un champ texte - + Canvia la font d'un camp de text Pivoter plusieurs champs texte - + Gira diversos camps de text Modifier la taille de plusieurs champs texte - + Canvia la mida de diversos camps de text Modifier la police de plusieurs champs texte - + Canvia la.font de diversos camps de text Modifier les propriétés d'un texte - + Canvia les propietats del text @@ -4193,7 +4187,7 @@ Veuillez utiliser l'éditeur avancé pour cela. Impossible d'accéder à la catégorie parente error message - No es pot accedir a la categoria pare + No es pot accedir a la categoria principal @@ -4216,25 +4210,25 @@ Veuillez utiliser l'éditeur avancé pour cela. Le modèle a déjà été intégré dans le projet. Toutefois, la version que vous tentez d'appliquer semble différente. Que souhaitez-vous faire ? dialog content - %1 is a title block template name - El model ja havia estat integrat al projecte. No obstant, la versió que vol inserir ara sembla diferent. Què vol fer? + El model ja ha estat integrat al projecte. No obstant, la versió que vols inserir ara sembla diferent. Què vols fer? Utiliser le modèle déjà intégré dialog content - Emprar el model que ja era importat + Utilitza el model ja integrat Intégrer le modèle déposé dialog content - Integrar el nou model + Importa el nou model deixat anar Écraser le modèle déjà intégré dialog content - Sobreescriure el model preexistent + Sobreescriure el model ja integrat @@ -4284,48 +4278,48 @@ Veuillez utiliser l'éditeur avancé pour cela. Modifier une ligne - Modificar una línia + Modifica una línia Form - Formulari + Formulari X1 : - + X1 : Y1 : - + Y1 : X2 : - + X2 : Fin 1 : - + Final 1 : Y2 : - + Y2 : Fin 2 : - + Final 2 : Longueur : - + Longitud : @@ -4338,42 +4332,42 @@ Veuillez utiliser l'éditeur avancé pour cela. Cet élément est déjà lié - Aquest símbol ja està enllaçat + Aquest element ja està enllaçat Recherche - + Recerca Voir cet élément - Veure aquest símbol + Veure aquest element Voir l'élément lié - Veure el símbol enllaçat + Veure l'element enllaçat Lier l'élément - + Enllaça l'element Montrer l'élément - + Mostra l'element Montrer l'élément esclave - + Mostra l'element esclau Enregistrer la disposition - + Desa el disseny @@ -4389,19 +4383,19 @@ Veuillez utiliser l'éditeur avancé pour cela. Label - Etiqueta + Etiqueta Commentaire - Comentari + Comentari Label de folio - Etiqueta del full + Etiqueta del full @@ -4409,7 +4403,7 @@ Veuillez utiliser l'éditeur avancé pour cela. Position - Posició + Posició @@ -4417,43 +4411,43 @@ Veuillez utiliser l'éditeur avancé pour cela. Titre de folio - Títol del full + Títol del full N° de folio - Núm. de full + Núm. de full N° de fil - + N° de fil Fonction - Funció + Funció Tension / Protocole - + Tensió / Protocol Couleur du conducteur - Color del conductor + Color del conductor Section du conducteur - + Secció del conductor @@ -4466,27 +4460,27 @@ Veuillez utiliser l'éditeur avancé pour cela. Editer les marges - + Edita els marges Haut : - + Superior : Gauche : - + Esquerra : Droit : - + Dreta : Bas : - + Inferior : @@ -4499,80 +4493,80 @@ Veuillez utiliser l'éditeur avancé pour cela. Éléments disponibles - Símbols disponibles + Elements disponibles <html><head/><body><p>Délier l'élément sélectionné</p></body></html> - + <html><head/><body><p>Desvincula l'element seleccionat</p></body></html> <html><head/><body><p>Lier l'élément sélectionné</p></body></html> - + <html><head/><body><p>Enllaça l'element seleccionat</p></body></html> Éléments liés - Símbols enllaçats + Elements enllaçats Vignette - + Miniatura Label de folio - Etiqueta del full + Etiqueta del full Titre de folio - Títol del full + Títol del full Position - Posició + Posició N° de folio - Núm. de full + Núm. de full Lier l'élément - + Enllaça l'element Délier l'élément - + Desvincula l'element Montrer l'élément - + Mostra l'element Montrer l'élément maître - + Mostra l'element mestre Enregistrer la disposition - + Desa el disseny Référence croisée (maître) - + Referència creuada (Mestre) @@ -4580,53 +4574,53 @@ Veuillez utiliser l'éditeur avancé pour cela. Collage multiple - + Enganxament múltiple Décalage - + Decalatge px - px + px x: - + x: y: - + y: Nombre de copie - + Nombre de còpies Auto-connexion - + Autoconnexió Auto-numérotation des éléments - + Numeració automàtica d'elements Auto-numérotation des conducteurs - + Autonumeració de conductors Multi-collage - + Enganxament múltiple @@ -4634,12 +4628,12 @@ Veuillez utiliser l'éditeur avancé pour cela. Dialog - Diàleg + Diàleg Variables de cartouche - + Variables de caixetí @@ -4647,27 +4641,27 @@ Veuillez utiliser l'éditeur avancé pour cela. Form - Formulari + Formulari Langue - Llengua + Llengua Texte - Text + Text Ajouter une ligne - Afegir una línia + Afegeix una línia Copier dans le presse papier - + Copia al porta-retalls @@ -4711,7 +4705,7 @@ Veuillez utiliser l'éditeur avancé pour cela. Créer un nouvel élément : Assistant window title - Crear un símbol nou: Assistent + Crea un element nou: Assistent @@ -4722,30 +4716,30 @@ Veuillez utiliser l'éditeur avancé pour cela. Étape 1/3 : Catégorie parente wizard page title - Pas 1/5: Categoria pare {1/4 ?} {1/3 ?} + Pas 1/3: Categoria principal Sélectionnez une catégorie dans laquelle enregistrer le nouvel élément. wizard page subtitle - Seleccioni la categoria dins la qual es desarà el símbol nou. + Seleccioni la categoria dins la qual es desarà l'element nou. Étape 2/3 : Nom du fichier wizard page title - Pas 2/5: Nom del fitxer {2/4 ?} {2/3 ?} + Pas 2/3: Nom del fitxer Indiquez le nom du fichier dans lequel enregistrer le nouvel élément. wizard page subtitle - Indiqui el nom del fitxer pel nou símbol. + Especifiqueu el nom del fitxer on voleu desar el nou element. nouvel_element - nou_símbol + nou_element @@ -4756,20 +4750,20 @@ Veuillez utiliser l'éditeur avancé pour cela. Étape 3/3 : Noms de l'élément wizard page title - Pas 3/5: Noms del símbol {3/4 ?} {3/3 ?} + Pas 3/3: Noms de l'element Indiquez le ou les noms de l'élément. wizard page subtitle - Indiqueu el o els noms del símbol. + Indiqueu els noms de l'element. Nom du nouvel élément default name when creating a new element nom per defecte quan es crei un símbol nou - Nom del símbol nou + Nom de l'element nou @@ -4794,7 +4788,7 @@ Veuillez utiliser l'éditeur avancé pour cela. Un élément portant le même nom existe déjà - Un símbol amb el mateix nom ja existeix + Un element amb el mateix nom ja existeix @@ -4811,7 +4805,7 @@ Veuillez utiliser l'éditeur avancé pour cela. Chiffre 1 - Figura 1 + Digit 1 @@ -4820,7 +4814,7 @@ Veuillez utiliser l'éditeur avancé pour cela. Chiffre 01 - Figura 01 + Digit 01 @@ -4829,7 +4823,7 @@ Veuillez utiliser l'éditeur avancé pour cela. Chiffre 001 - Figura 001 + Digit 001 @@ -4862,7 +4856,7 @@ Veuillez utiliser l'éditeur avancé pour cela. Chiffre 1 - Folio - Figura 1 - Full + Digit 1 - Full @@ -4870,7 +4864,7 @@ Veuillez utiliser l'éditeur avancé pour cela. Chiffre 01 - Folio - Figura 01 - Full + Digit 01 - Full @@ -4878,7 +4872,7 @@ Veuillez utiliser l'éditeur avancé pour cela. Chiffre 001 - Folio - Figura 001 - Full + Digit 001 - Full @@ -4886,7 +4880,7 @@ Veuillez utiliser l'éditeur avancé pour cela. Locmach - Locmach + Localització @@ -4894,39 +4888,39 @@ Veuillez utiliser l'éditeur avancé pour cela. Installation - Instal·lació + Instal·lació Element Line - Símbol Linía + Element Linía Element Column - Símbol Columna + Element Columna Element Prefix - Símbol Prefix + Element Prefix PartArc - - - - + + + + Modifier un arc - Modificar un arc + Modifica un arc @@ -4935,28 +4929,28 @@ Veuillez utiliser l'éditeur avancé pour cela. Champ de texte dynamique element part name - + Camp de text dinàmic - + Déplacer un champ texte - Moure un camp de text + Moure un camp de text PartEllipse - + Modifier un rectangle - Modificar un rectangle + Modifica un rectangle PartLine - + Modifier une ligne - Modificar una línia + Modifica una línia @@ -4964,40 +4958,40 @@ Veuillez utiliser l'éditeur avancé pour cela. Ajouter un point - + Afegeix un punt Supprimer ce point - + Suprimeix aquest punt - + Modifier un polygone - Modificar un polígon + Modifica un polígon - + Ajouter un point à un polygone - + Afegeix un punt a un polígon - + Supprimer un point d'un polygone - + Suprimeix un punt d'un polígon PartText - + Déplacer un texte - + Mou un text - + Modifier un champ texte - Modificar un camp de text + Modifica un camp de text @@ -5005,17 +4999,17 @@ Veuillez utiliser l'éditeur avancé pour cela. Form - Formulari + Formulari X - + X Y - + Y @@ -5025,17 +5019,17 @@ Veuillez utiliser l'éditeur avancé pour cela. Ajouter un point - + Afegeix un punt Supprimer ce point - + Suprimeix aquest punt Points du polygone : - Punts del polígon: + Punts del polígon : @@ -5052,18 +5046,18 @@ Veuillez utiliser l'éditeur avancé pour cela. Ajouter un point à un polygone - + Afegeix un punt a un polígon Supprimer un point d'un polygone - + Suprimeix un punt d'un polígon Modifier un polygone - Modificar un polígon + Modifica un polígon @@ -5071,7 +5065,7 @@ Veuillez utiliser l'éditeur avancé pour cela. Sélectionner le potentiel éléctrique - Seleccionar el potencial elèctric + Selecciona el potencial elèctric @@ -5084,7 +5078,8 @@ Per favor, seleccioni les propietats que s'aplicaran al nou potencial. Veuillez choisir un potentiel électrique de la liste à utiliser pour le nouveau potentiel - + Si us plau, trieu un potencial elèctric de la llista + per utilitzar-lo per al nou potencial @@ -5092,7 +5087,8 @@ Per favor, seleccioni les propietats que s'aplicaran al nou potencial. Numéro : %1 - + +Número: %1 @@ -5100,7 +5096,8 @@ Numéro : %1 Fonction : %1 - + +Funció: %1 @@ -5108,7 +5105,8 @@ Fonction : %1 Tension/protocole : %1 - + +Voltatge/protocol: %1 @@ -5116,7 +5114,8 @@ Tension/protocole : %1 Couleur du conducteur : %1 - + +Color del controlador: %1 @@ -5124,32 +5123,33 @@ Couleur du conducteur : %1 Section du conducteur : %1 - + +Secció del conductor: %1 %n conducteurs composent le potentiel suivant : - - - + + %n conductor forma el següent potencial: + %n conductors formen el següent potencial: Ajouter au câble: %1 - + Afegeix al cable: %1 Ajouter au bus: %1 - + Afegeix al bus: %1 Modifier les propriétés de plusieurs conducteurs undo caption - Modificar les propietats de diversos conductors + Modifica les propietats de diversos conductors @@ -5157,7 +5157,10 @@ Section du conducteur : %1 Veuillez saisir une formule compatible pour ce potentiel. Les variables suivantes sont incompatibles : %sequf_ %seqtf_ %seqhf_ %id %F %M %LM - + La fórmula per al nou potencial conté variables que són incompatibles amb els informes de full. +Introduïu una fórmula compatible per a aquest potencial. +Les variables següents són incompatibles: +%sequf_ %seqtf_ %seqhf_ %id %F %M %LM @@ -5174,7 +5177,7 @@ Les variables suivantes sont incompatibles : Numérotation auto - + Numeració automàtica @@ -5184,22 +5187,22 @@ Les variables suivantes sont incompatibles : Conducteurs - + Conductors Eléments - + Elements Folios - + Fulls Numérotation auto des folios - + Numeració automàtica de fulls @@ -5231,12 +5234,12 @@ Les variables suivantes sont incompatibles : Position - Posició + Posició Position du folio - + Posició de full @@ -5244,17 +5247,17 @@ Les variables suivantes sont incompatibles : Form - Formulari + Formulari Requête - + Sol·licitud Recharger - Recarregar + Recarregar @@ -5281,7 +5284,7 @@ Les variables suivantes sont incompatibles : Vous pouvez définir ci-dessous des propriétés personnalisées qui seront disponibles pour tous les folios de ce projet (typiquement pour les cartouches). informative label - Vostè pot definir les propietats personalitzades que vol que estiguin disponibles per a tots els fulls del projecte. + Pots definir a continuació les propietats personalitzades que vols que estiguin disponibles per a tots els fulls d'aquest projecte. (normalment per als blocs de títol). @@ -5289,204 +5292,204 @@ Les variables suivantes sont incompatibles : MainWindow - + Finestra principal Folios à imprimer : - Fulls a imprimir: + Fulls a imprimir : Tout cocher - Marcar-ho tot + Marcar-ho tot Tout décocher - Desmarcar-ho tot + Desmarcar-ho tot Toutes les dates - + Totes les dates À partir de la date du : - + A partir de la data : À la date du : - + A la data : Option de rendu - + Opcions de renderització Dessiner le cadre - Dibuixar el quadre + Dibuixa el quadre Dessiner le cartouche - Dibuixar el caixetí + Dibuixa el caixetí Conserver les couleurs des conducteurs - Recordar els colors dels conductors + Mostra els colors dels conductors Dessiner les bornes - Dibuixar els borns + Dibuixa els borns Option d'impression - + Opció d'impressió Adapter le folio à la page - Adaptar el full a la pàgina + Adapta el full a la pàgina Utiliser toute la feuille - Emprar tot el full + Empra tot el full Si cette option est cochée, le folio sera agrandi ou rétréci de façon à remplir toute la surface imprimable d'une et une seule page." - + Si aquesta opció està marcada, el full s'ampliarà o es reduirà per omplir tota l'àrea imprimible d'una i només una pàgina." Si cette option est cochée, les marges de la feuille seront ignorées et toute sa surface sera utilisée pour l'impression. Cela peut ne pas être supporté par votre imprimante. - + Si aquesta opció està marcada, els marges del full s'ignoraran i s'utilitzarà tota l'àrea del full per a la impressió. Pot ser que la impressora no ho admeti. toolBar - + Barra d'eines Ajuster la largeur - Ajustar la llargada + Ajusta a l'amplada Ajuster la page - Ajustat la pàgina + Ajusta a la pàgina Zoom arrière - + Allunya Zoom avant - + Apropa Paysage - Apaïsat + Apaïsat Portrait - Vertical + Retrat Première page - Primera plana + Primera pàgina Page précédente - Plana anterior + Pàgina anterior Page suivante - Plana següent + Pàgina següent Dernière page - Darrera plana + Darrera pàgina Afficher une seule page - + Mostra només una pàgina Afficher deux pages - Mostrar dues planes + Mostra dues pàgines Afficher un aperçu de toutes les pages - Mostrar una vista prèvia de cada plana + Mostra una vista prèvia de totes les pàgines mise en page - + maquetació Options d'impression window title - Opcions d'impressió + Opcions d'impressió projet string used to generate a filename - projecte + projecte Imprimer - Imprimir + Imprimeix Exporter en pdf - + Exporta com a pdf Mise en page (non disponible sous Windows pour l'export PDF) - + Configuració de pàgina (no disponible a Windows per a l'exportació a PDF) Folio sans titre - Full sense títol + Full sense títol Exporter sous : - + Exporta com a: Fichier (*.pdf) - + Fitxer (*.pdf) @@ -5501,7 +5504,7 @@ Vol desar els canvis? sansnom - + sense nom @@ -5513,13 +5516,13 @@ Vol desar els canvis? Supprimer le folio ? message box title - Eliminar el full? + Suprimir el full? Êtes-vous sûr de vouloir supprimer ce folio du projet ? Ce changement est irréversible. message box content - Vol eliminar el full del projecte? El canvi és irreversible. + Vols eliminar el full del projecte? El canvi és irreversible. @@ -5536,38 +5539,38 @@ Vol desar els canvis? Supprimer les modèles de cartouche inutilisés dans le projet - Eliminar els models de caixetins que no es facin servir al projecte + Elimina els models de caixetins que no es facin servir al projecte Supprimer les éléments inutilisés dans le projet - Eliminar els símbols que no es facin servir al projecte + Suprimeix els elements que no es facin servir al projecte Supprimer les catégories vides - Eliminar les categories buides + Suprimeix les categories buides Nettoyer le projet window title - Netejar el projecte + Neteja el projecte Ajouter un folio - Afegir un full + Afegeix un full Revenir au debut du projet - + Torna a l'inici del projecte Aller à la fin du projet - + Vés al final del projecte @@ -5579,7 +5582,7 @@ Vol desar els canvis? Enregistrer sous dialog title - Anomena i desa + Desa com a @@ -5590,7 +5593,7 @@ Vol desar els canvis? <p align="center"><b>Ouverture du projet en cours...</b><br/>Création des onglets de folio :</p> - + <p align="center"><b>Obrint el projecte actual...</b><br/>Creant pestanyes de fulls:</p> @@ -5604,223 +5607,223 @@ Vol desar els canvis? Propriétés de la sélection - + Propietats de la selecció QETApp - + Chargement... Initialisation du cache des collections d'éléments splash screen caption - Carregant... Posada en marxa del catxé de la col·lecció de símbols + Carregant... Posada en marxa del memòria cau de la col·lecció d'elements - + Chargement... Éditeur de schéma splash screen caption Carregant... Editor d'esquemes - + Chargement... Ouverture des fichiers splash screen caption Carregant... Obrint els fitxers - + LTR Translate this string to RTL if you are translating to a Right-to-Left language, else translate to LTR - LTR + LTR - + Cartouches QET title of the title block templates collection provided by QElectroTech - Caixetins QET + Caixetins QET - + Cartouches company title of the company's title block templates collection - + Caixetins d'empresa - + Cartouches utilisateur title of the user's title block templates collection - Caixetins personals + Caixetins personals - + Q Single-letter example text - translate length, not meaning Q - + QET Small example text - translate length, not meaning QET - + Schema Normal example text - translate length, not meaning Esquema - + Electrique Normal example text - translate length, not meaning Elèctric - + QElectroTech Long example text - translate length, not meaning QElectroTech - + Configurer QElectroTech window title - Configurar QElectroTech + Configura QElectroTech - + Chargement... splash screen caption Carregant... - + Chargement... icône du systray splash screen caption Carregant... icona de la safata del sistema - + QElectroTech systray menu title QElectroTech - + &Quitter &Sortir - + &Masquer &Amagar - + &Restaurer &Restaurar - + &Masquer tous les éditeurs de schéma - Amagar tots els editors d'&esquemes + Amaga tots els editors d'&esquemes - + &Restaurer tous les éditeurs de schéma - Restaurar tots els editors d'&esquemes + Restaura tots els editors d'&esquemes - + &Masquer tous les éditeurs d'élément - &Amagar tots els editors de símbols + &Amaga tots els editors d'elements - + &Restaurer tous les éditeurs d'élément - &Restaurar tots els editors de símbols + &Restaura tots els editors d'elements - + &Masquer tous les éditeurs de cartouche systray submenu entry - Amagar tots els editors de &caixetins + Amaga tots els editors de &caixetins - + &Restaurer tous les éditeurs de cartouche systray submenu entry - Restaurar tots els editors de &caixetins + Restaura tots els editors de &caixetins - + &Nouvel éditeur de schéma &Nou editor d'esquemes - + &Nouvel éditeur d'élément - &Nou editor de símbols + &Nou editor d'elements - + Ferme l'application QElectroTech - Tancar el programa QElectroTech + Tanca el programa QElectroTech - + Réduire QElectroTech dans le systray - Minimitzar QEletectroTech a la safata del sistema + Minimitza QEletectroTech a la safata del sistema - + Restaurer QElectroTech - Restaurar QElectroTech + Restaura QElectroTech - + QElectroTech systray icon tooltip QElectroTech - + Éditeurs de schémas - Editor d'esquemes + Editors d'esquemes - + Éditeurs d'élément - Editors de símbols + Editors d'elements - + Éditeurs de cartouche systray menu entry Editors de caixetins - + <b>Le fichier de restauration suivant a été trouvé,<br>Voulez-vous l'ouvrir ?</b><br> - + <b>S'ha trobat el següent fitxer de restauració.<br>Voleu obrir-lo?</b><br> - + <b>Les fichiers de restauration suivant on été trouvé,<br>Voulez-vous les ouvrir ?</b><br> - + <b>S'han trobat els fitxers de restauració següents.<br>Voleu obrir-los?</b><br> - + Fichier de restauration - + Fitxer de recuperació - + Usage : - Ús: + Ús : - + [options] [fichier]... @@ -5829,7 +5832,7 @@ Vol desar els canvis? - + QElectroTech, une application de réalisation de schémas électriques. Options disponibles : @@ -5839,42 +5842,46 @@ Options disponibles : QElectroTech, un programa per fer esquemes elèctrics. -Opcions: - --help Mostrar ajuda sobre opcions - -v, --version Mostrar la versió - --license Mostrar la llicència +Opcions disponibles: + --help Mostra ajuda sobre opcions + -v, --version Mostra la versió + --license Mostra la llicència - + --common-elements-dir=DIR Definir le dossier de la collection d'elements - --common-elements-dir=DIR Definir la carpeta de la col·lecció de símbols + --common-elements-dir=DIR Definir la carpeta de la col·lecció d'elements + - + --common-tbt-dir=DIR Definir le dossier de la collection de modeles de cartouches - --common-tbt-dir=DIR Definir la carpeta de la col·lecció de caixetins + --common-tbt-dir=DIR Definir la carpeta de la col·lecció de caixetins + - + --config-dir=DIR Definir le dossier de configuration --config-dir=DIR Definir la carpeta de configuració - + --data-dir=DIR Definir le dossier de data - + --data-dir=DIR Defineix la carpeta de dades + - + --lang-dir=DIR Definir le dossier contenant les fichiers de langue - --lang-dir=DIR Definir la carpeta amb els fitxers de llengua + --lang-dir=DIR Definir la carpeta amb els fitxers de llengua + @@ -5895,7 +5902,7 @@ Opcions: Annulations dock title - Anulacions + Desfés @@ -5916,27 +5923,27 @@ Opcions: &Ouvrir - &Obrir + &Obre &Fermer - &Tancar + &Tanca &Enregistrer - &Desar + &Desa Enregistrer sous - Anomenar i desar + Desa com a E&xporter - E&xportar + E&xporta @@ -5947,48 +5954,48 @@ Opcions: Imprimer - Imprimir + Imprimeix Exporter en pdf - + Exporta com a pdf Exporte un ou plusieurs folios du projet courant status bar tip - + Exporta un o més fulls del projecte actual &Quitter - &Sortir + &Surt Annuler - Anular + Desfés Refaire - Tornar a fer + Refés Co&uper - Re&tallar + Re&talla Cop&ier - Cop&iar + Cop&ia C&oller - En&ganxar + En&ganxa @@ -6020,230 +6027,230 @@ Opcions: Ajouter un folio - Afegir un full + Afegeix un full Supprimer le folio - Eliminar un full + Suprimeix un full Exporter au format CSV - + Exporta en format CSV Ajouter une nomenclature - + Afegeix una nomenclatura Gestionnaire de borniers (DEV) - + Gestor de blocs de borns (DEV) Lancer le plugin de création de borniers - + Inicieu el connector de creació de blocs de borns Exporter la liste des noms de conducteurs - + Exporta la llista de noms de conductors Exporter la base de donnée interne du projet - + Exporta la base de dades interna del projecte Crée un nouveau projet status bar tip - Crear un nou projecte + Crea un nou projecte Ouvre un projet existant status bar tip - Obrir un projecte existent + Obre un projecte existent Ferme le projet courant status bar tip - Tancar el projecte + Tanca el projecte actual Enregistre le projet courant et tous ses folios status bar tip - Desar el projecte + Desa el projecte actual i tots els seus fulls Enregistre le projet courant avec un autre nom de fichier status bar tip - Desar el projecte amb un altre nom d'arxiu + Desa el projecte actual amb un altre nom de fitxer Ajouter une ligne Add row - Afegir una línia + Afegeix una línia Enlever une ligne Remove row - Suprimir una línia + Suprimeix una línia Ajoute une colonne au folio status bar tip - Afegir una columna + Afegeix una columna al full Enlève une colonne au folio status bar tip - Suprimir una columna + Suprimeix una columna al full Agrandit le folio en hauteur status bar tip - Augmentar l'altura + Augmenta l'altura del full Rétrécit le folio en hauteur status bar tip - Disminuir l'altura + Disminueix l'altura del full Grouper les textes sélectionnés - + Agrupa els textos seleccionats Enlève les éléments sélectionnés du folio status bar tip - Suprimir els elements seleccionats + Suprimeix els elements seleccionats del full Tout sélectionner - Seleccionar-ho tot + Selecciona-ho tot Désélectionner tout - Alliberar totes les seleccions + Desselecciona Inverser la sélection - Invertir la selecció + Inverteix la selecció Ajouter un plan de bornes - + Afegiu un pla de borns Ajoute un champ de texte sur le folio actuel - + Afegeix un camp de text al full actual Ajoute une image sur le folio actuel - + Afegeix una imatge al full actual Ajoute une ligne sur le folio actuel - + Afegeix una fila al full actual Ajoute un rectangle sur le folio actuel - + Afegeix un rectangle al full actual Ajoute une ellipse sur le folio actuel - + Afegeix una el·lipse al full actual Ajoute une polyligne sur le folio actuel - + Afegeix un polígon al full actual Ajoute un plan de bornier sur le folio actuel - + Afegeix un pla de borns al full actual Chercher/remplacer - + Cerca/substitueix Profondeur toolbar title - Profunditat + Profunditat Supprimer - Suprimir + Suprimeix Pivoter - Girar + Gira Orienter les textes - Orientar els textos + Orienta els textos Retrouver dans le panel - Cercar al panell + Cerca al panell Réinitialiser les conducteurs - Reiniciar els conductors + Reinicia els conductors Ajouter un champ de texte - Afegir un camp de text + Afegeix un camp de text Ajouter une colonne - Afegir una columna + Afegeix una columna Ajouter une image - Afegir una imatge + Afegeix una imatge Enlever une colonne - Suprimir una columna + Suprimeix una columna @@ -6253,27 +6260,27 @@ Opcions: Nettoyer le projet - Netejar el projecte + Neteja el projecte Ajouter un sommaire - Afegir un resum + Afegeix un resum Zoom avant - Apropar + Apropa Zoom arrière - Allunyar + Allunya Zoom sur le contenu - Ampliar el contingut + Amplia el contingut @@ -6288,12 +6295,12 @@ Opcions: en utilisant des onglets - emprant pestanyes + En pestanyes en utilisant des fenêtres - emprant finestres + En finestres @@ -6329,13 +6336,13 @@ Opcions: Sélectionne tous les éléments du folio status bar tip - Seleccionar tots els elements del full + Selecciona tots els elements del full Désélectionne tous les éléments du folio status bar tip - Deseleccionar tots els elements del full + Deselecciona tots els elements del full @@ -6352,46 +6359,46 @@ Opcions: Adapte le zoom de façon à afficher tout le contenu du folio indépendamment du cadre - Ajustar el zoom per visualitzar tots els continguts del full + Ajusta el zoom per mostrar tot el contingut del full independentment del marc Adapte le zoom exactement sur le cadre du folio status bar tip - Ajustar el zoom al full + Ajusta el zoom exactament al marc del full Ajouter un rectangle - Afegir un rectangle + Afegeix un rectangle Ajouter une ellipse - Afegir una el·lipse + Afegeix una el·lipse Ajouter une polyligne - Afegir un polígon + Afegeix un polígon Retrouve l'élément sélectionné dans le panel status bar tip - Trobar l'element seleccionat en el panell + Troba l'element seleccionat en el panell Exporte le folio courant dans un autre format status bar tip - Exportar el full en un altre format + Exporta el full actual a un altre format Imprime un ou plusieurs folios du projet courant status bar tip - Imprimir un o més fulls + Imprimeix un o més fulls del projecte actual @@ -6403,19 +6410,19 @@ Opcions: Édite les propriétés du folio (dimensions, informations du cartouche, propriétés des conducteurs...) status bar tip - Editar les propietats del full + Edita les propietats del full (dimensions, informació del caixetí, propietats dels conductors, etc.) Permet de visualiser le folio sans pouvoir le modifier status bar tip - Permetre veure el full sense modificar + Permet veure el full sense poder modificar-lo Projet %1 enregistré dans le repertoire: %2. - Projecte % 1 desar al directori: % 2. + Projecte %1 desat al directori: %2. @@ -6432,24 +6439,24 @@ Opcions: Il semblerait que le fichier %1 que vous essayez d'ouvrir n'existe pas ou plus. - Sembla que el fitxer %1 que vostè està intentant obrir no existeix. + Sembla que el fitxer %1 que estàs intentant obrir no existeix. Ouverture du projet en lecture seule message box title - Obertura en mode només lectura + Obertura del projecte en mode de només lectura Une erreur est survenue lors de l'ouverture du fichier %1. message box content - + S'ha produït un error en obrir el fitxer %1. Active le projet « %1 » - Activar el projecte « %1 » + Activa el projecte « %1 » @@ -6461,66 +6468,66 @@ Opcions: Ferme l'application QElectroTech status bar tip - Tancar el programa QElectroTech + Tanca el programa QElectroTech Annule l'action précédente status bar tip - Anula l'acció prèvia + Desfer l'acció anterior Restaure l'action annulée status bar tip - Restaurar l'acció prèvia + Restaura l'acció desfeta Transfère les éléments sélectionnés dans le presse-papier status bar tip - Transfereix els símbols seleccionats al portapapers + Transfereix els elements seleccionats al porta-retalls Copie les éléments sélectionnés dans le presse-papier status bar tip - Copia els símbols seleccionats al portapapers + Copia els elements seleccionats al porta-retalls Désélectionne les éléments sélectionnés et sélectionne les éléments non sélectionnés status bar tip - Allibera els símbols seleccionats i selecciona els símbols que no n'estiguin + Desselecciona els elements seleccionats i selecciona els elements no seleccionats Recalcule les chemins des conducteurs sans tenir compte des modifications status bar tip - Recalcula la disposició dels conductors sense tenir en compte els canvis + Recalcula les rutes dels conductors sense tenir en compte els canvis Pivote les éléments et textes sélectionnés status bar tip - Pivota els símbols i els textos seleccionats + Gira els elements i textos seleccionats Éditer l'item sélectionné - Editar el símbol seleccionat + Edita l'element seleccionat Pivote les textes sélectionnés à un angle précis status bar tip - Pivota els textos seleccionats a un angle concret + Gira els textos seleccionats a un angle específic Création automatique de conducteur(s) Tool tip of auto conductor - Creació automàtica d'un conductor(s) + Creació automàtica de conductor(s) @@ -6537,7 +6544,7 @@ Opcions: Utiliser la création automatique de conducteur(s) quand cela est possible Status tip of auto conductor - Utilitzar creació automàtica d'un conductor (s) + Utilitza la creació automàtica de conductor (s) sempre que sigui possible @@ -6549,13 +6556,13 @@ Opcions: Ajouter une ligne Draw line - Afegir una línia + Afegeix una línia Présente les différents projets ouverts dans des sous-fenêtres status bar tip - Mostra els projectes oberts en sots-finestres + Mostra els projectes oberts en subfinestres @@ -6567,7 +6574,7 @@ Opcions: Permet de sélectionner les éléments status bar tip - Permet seleccionar símbols + Permet seleccionar els elements @@ -6601,7 +6608,7 @@ Opcions: &Édition - &Edició + &Edita @@ -6611,7 +6618,7 @@ Opcions: Afficha&ge - &Visualització + &Visualitza @@ -6621,7 +6628,7 @@ Opcions: &Récemment ouverts - &recentment oberts + &Obre'n un de recent @@ -6641,7 +6648,7 @@ Opcions: Affiche ou non le panel d'appareils - Mostra o amaga el panell de símbols + Mostra o amaga el panell d'elements @@ -6661,7 +6668,7 @@ Opcions: Affichage - Visualització + Visualitza @@ -6671,22 +6678,22 @@ Opcions: Ajouter - Afegir + Afegeix Ouvrir un fichier - Obrir un fitxer + Obre un fitxer Il semblerait que le fichier que vous essayez d'ouvrir ne soit pas accessible en lecture. Il est donc impossible de l'ouvrir. Veuillez vérifier les permissions du fichier. - Sembla que el fitxer que vol obrir no és accessible en lectura. Per tant no pot ésser obert. Si us plau, comprovi els permissos sobre el fitxer. + Sembla que el fitxer que intentes obrir no és llegible. Per tant, no es pot obrir. Si us plau, comprova els permisos del fitxer. Il semblerait que le projet que vous essayez d'ouvrir ne soit pas accessible en écriture. Il sera donc ouvert en lecture seule. - Sembla que el fitxer que vol obrir no és accessible en mode d'escriptura. Per tant serà obert en mode de només lectura. + Sembla que el projecte que intentes obrir no és accessible en mode d'escriptura. Per tant serà obert en mode de només lectura. @@ -6699,404 +6706,400 @@ Opcions: Il semblerait que le fichier %1 ne soit pas un fichier projet QElectroTech. Il ne peut donc être ouvert. message box content - Sembla que el fitxer %1 no conté un projecte QElectroTech. Per tant no pot ésser obert. + Sembla que el fitxer %1 no és un fitxer de projecte QElectroTech. Per tant no es pot obrir. Double-click pour terminer la forme, Click droit pour annuler le dernier point - + Feu doble clic per completar la forma, feu clic amb el botó dret per desfer l'últim punt Groupe - + Grup Éditer l'élement edit element - Editar l'element + Edita l'element Éditer le champ de texte edit text field - Editar el camp de text + Edita el camp de text Éditer l'image edit image - Editar la imatge + Edita la imatge Éditer le conducteur edit conductor - Editar el conductor + Edita el conductor Éditer l'objet sélectionné edit selected item - Editar l'objecte seleccionat + Edita l'objecte seleccionat QETElementEditor - + &Nouveau &Nou - + &Ouvrir - &Obrir + &Obre - + &Ouvrir depuis un fichier - &Obrir des d'un fitxer + &Obre des d'un fitxer - + &Enregistrer - D&esar + D&esa - + Enregistrer sous - Anomenar i desar + Desa com a - + Enregistrer dans un fichier - Desar a un fitxer + Desa a un fitxer - + Recharger - Recarregar + Recarrega - + Tout sélectionner - Seleccionar-ho tot + Selecciona-ho tot QElectroTech - Éditeur d'élément - QElectroTech - Editor de símbol + QElectroTech - Editor d'elements - + &Aide - &Ajuda + &Ajuda - + Annulations - Anulacions + Desfés - + Parties - Parts + Parts - + Informations - Dades + Dades - + Outils - Eines + Eines - + Affichage - Visualització + Visualització - + Élément - Símbol + Element - + Annulation - + Cancel·lació - + &Fermer cet éditeur - + &Tanca aquest editor - + Fermer cet éditeur - + Tanca aquest editor - + Désélectionner tout - Desfer totes les seleccions + Desseleccioneu-ho tot - + Co&uper - Re&tallar + Re&talla - + Cop&ier - Cop&iar + Cop&ia - + C&oller - En&ganxar + En&ganxa - + C&oller dans la zone - + En&ganxa dins la zona - + Un fichier - + Un fitxer - + Un élément - + Un element - + À &propos de QElectroTech - Q&uant a QElectroTech + Q&uant a QElectroTech - + Affiche des informations sur QElectroTech - Mostra informació sobre el QElectroTech + Mostra informació sobre QElectroTech - + Manuel en ligne - Instruccions Online + Manual en línia - + Lance le navigateur par défaut vers le manuel en ligne de QElectroTech - Inicia el manual en línia de QElectroTech + Inicia el navegador predeterminat amb el manual en línia de QElectroTech - + Chaine Youtube - Canal de Youtube + Canal de Youtube - + Lance le navigateur par défaut vers la chaine Youtube de QElectroTech - Inicia per defecte al canal de Youtube de QElectroTech + Inicia el navegador predeterminat amb el canal de Youtube de QElectroTech - + Soutenir le projet par un don - Donar suport al projecte amb una donació + Dona suport al projecte amb una donació - + Soutenir le projet QElectroTech par un don - Donar suport al projecte QElectroTech amb una donació + Dona suport al projecte QElectroTech amb una donació - + À propos de &Qt - Sobre &Qt + Quant a &Qt - + Affiche des informations sur la bibliothèque Qt - Mostra informació sobre les biblioteques Qt + Mostra informació sobre les biblioteques Qt - + Rotation - + Rotació - - Fine-Rotation - - - - + Mirror - + Mirall - + Flip - + Flip - + Importer un dxf - + Importa un dxf - + importer un élément à redimensionner - + importa un element per redimensionar-lo - + Inverser la sélection - Invertir la selecció + Inverteix la selecció - + &Supprimer - E&liminar + &Suprimeix - + Zoom avant - Zoom - apropar + Zoom - apropa - + Zoom arrière - Zoom - allunyar + Zoom - allunya - + Zoom adapté Zoom adaptat - + Pas de zoom Sense zoom - + Éditer les informations sur l'auteur - Canviar les dades de l'autor + Edita les dades de l'autor + + + + Ajouter une ligne + Afegeix una línia + + + + Ajouter un rectangle + Afegeix un rectangle + + + + Ajouter une ellipse + Afegeix una el·lipse + + + + Ajouter un polygone + Afegeix un polígon - Ajouter une ligne - Afegir una línia + Ajouter du texte + Afegeix text - Ajouter un rectangle - Afegir un rectangle + Ajouter un arc de cercle + Afegeix un arc - Ajouter une ellipse - Afegir una el·lipse - - - - Ajouter un polygone - Afegir un polígon - - - - Ajouter du texte - Afegir text - - - - Ajouter un arc de cercle - Afegir un arc - - - Ajouter une borne - Afegir un born + Afegeix un born Annuler - Anular + Cancel·la Afficher menu entry - Mostrar + Mostra Trop de primitives, liste non générée: %1 - + Massa primitives, no s'ha generat la llista: %1 %n avertissement(s) warnings - - - + + %n avís + %n avísos Refaire - Refer + Refès - + Ajouter un champ texte dynamique - + Afegeix un camp de text dinàmic + + + + Double-click pour terminer la forme, Click droit pour annuler le dernier point + Feu doble clic per completar la forma, feu clic amb el botó dret per desfer l'últim punt + + + + Ajouter un texte d'élément non éditable dans les schémas + Afegeix text d'elements no editables als esquemes + + + + Ajouter un texte d'élément pouvant être édité dans les schémas + Afegeix text d'elements editables als esquemes + + + + Avertissement + Avís + + + + L'import d'un dxf volumineux peut prendre du temps +veuillez patienter durant l'import... + Importar un fitxer DXF gran pot trigar una estona. +Si us plau, tingueu paciència mentre es completa el procés d'importació... + + + + Importer un élément à redimensionner + Importa un element per canviar-ne la mida + + + + Éléments QElectroTech (*.elmt) + Elements QElectroTech (*.elmt) - Double-click pour terminer la forme, Click droit pour annuler le dernier point - - - - - Ajouter un texte d'élément non éditable dans les schémas - - - - - Ajouter un texte d'élément pouvant être édité dans les schémas - - - - - Avertissement - Avís - - - - L'import d'un dxf volumineux peut prendre du temps -veuillez patienter durant l'import... - - - - - Importer un élément à redimensionner - - - - - Éléments QElectroTech (*.elmt) - Símbols QElectroTech (*.elmt) - - - Parties toolbar title Parts @@ -7108,14 +7111,14 @@ veuillez patienter durant l'import... Profunditat - + Éditer le nom et les traductions de l'élément - Editar el nom i les traduccions del símbol + Edita el nom i les traduccions de l'element - + Éditer les propriétés de l'élément - Editar les propietats dels símbols + Edita les propietats dels elements @@ -7125,17 +7128,17 @@ veuillez patienter durant l'import... &Édition - &Edició + &Edita - + Afficha&ge - &Visualització + &Visualitza Coller depuis... - Enganxar des de... + Enganxa des de... @@ -7150,15 +7153,15 @@ veuillez patienter durant l'import... [només lectura] - + Aucune modification Cap canvi - + Éditeur d'éléments status bar message - Editor de símbols + Editor d'elements @@ -7166,7 +7169,7 @@ veuillez patienter durant l'import... %n partie(s) sélectionnée(s). %n part seleccionada. - %n part(s) seleccionada(es). + %n parts seleccionades. @@ -7184,18 +7187,18 @@ veuillez patienter durant l'import... <br>En l'absence de borne, l'élément ne pourra être relié à d'autres éléments par l'intermédiaire de conducteurs. warning description - <br>En absència de born, el símbol no pot relacionar-se amb altres components a través de conductors. + <br>En absència de born, l'element no es pot connectar amb altres elements mitjançant conductors. <br><b>Erreur</b> :<br>Les reports de folio doivent posséder une seul borne.<br><b>Solution</b> :<br>Verifier que l'élément ne possède qu'une seul borne - <br><b>Error</b> :<br>Les connexions del full han de tenir un sol born.<br><b>Solució</b> :<br>Comproveu que el símbol té un sol born + <br><b>Error</b> :<br>Les connexions del full han de tenir un sol born.<br><b>Solució</b> :<br>Comproveu que l'element té un sol born La vérification de cet élément a généré message box content - La verificació del símbol ha generat + La verificació de l'element ha generat @@ -7209,7 +7212,7 @@ veuillez patienter durant l'import... et - i + i @@ -7235,21 +7238,21 @@ veuillez patienter durant l'import... - + Impossible d'ouvrir le fichier %1. message box content No es pot obrir el fitxer %1. - + Ce fichier n'est pas un document XML valide message box content El fitxer no conté un document XML vàlid - + Erreur toolbar title Error @@ -7259,14 +7262,14 @@ veuillez patienter durant l'import... Édition en lecture seule message box title - Edició amb permís de nomès lectura + Edició en mode de només lectura Vous n'avez pas les privilèges nécessaires pour modifier cet élement. Il sera donc ouvert en lecture seule. message box content - No disposa dels privilegis necessaris per modificar aquest símbol. Per tant, serà obert en mode de només lectura. + No disposa dels privilegis necessaris per modificar aquest element. Per tant, serà obert en mode de només lectura. @@ -7285,7 +7288,7 @@ veuillez patienter durant l'import... Impossible d'enregistrer l'élément message box content - Impossible desar el símbol + Impossible desar l'element @@ -7296,94 +7299,94 @@ veuillez patienter durant l'import... Il semblerait que le fichier %1 que vous essayez d'ouvrir n'existe pas ou plus. - Sembla que el fitxer %1 que vostè està intentant obrir no existeix. + Sembla que el fitxer %1 que estàs intentant obrir no existeix. - + Recharger l'élément dialog title - Recarregar el símbol + Recarrega l'element - + Vous avez efffectué des modifications sur cet élément. Si vous le rechargez, ces modifications seront perdues. Voulez-vous vraiment recharger l'élément ? dialog content - El símbol ha estat modificat. Si fos recarregat es perdrien els canvis. Segur que vol regarregar el símbol? + l'element ha estat modificat. Si fos recarregat es perdrien els canvis. Segur que vol recarregar l'element? - - - + + + Echec de l'enregistrement Ha fallat el desament - - - + + + L'enregistrement à échoué, les conditions requises ne sont pas valides Ha fallat el desament, Les condicions requerides no són vàlides - + Enregistrer sous dialog title - Anomenar i desar + Desa com a - + Éléments QElectroTech (*.elmt) filetypes allowed when saving an element file - Símbols QElectroTech (*.elmt) + Elements QElectroTech (*.elmt) Enregistrer l'élément en cours ? dialog title - Desar el símbol actual? + Desa l'element actual? Voulez-vous enregistrer l'élément %1 ? dialog content - %1 is an element name - Vol desar el símbol %1? + Vols desar l'element %1? Ouvrir un fichier dialog title - Obrir un fitxer + Obre un fitxer Éléments QElectroTech (*.elmt);;Fichiers XML (*.xml);;Tous les fichiers (*) filetypes allowed when opening an element file - Símbols QElectroTech (*.elmt);;Fitxers XML (*.xml);;Tots els fitxers (*) + Elements QElectroTech (*.elmt);;Fitxers XML (*.xml);;Tots els fitxers (*) - - + + Élément inexistant. message box title - No existeix el símbol. + No existeix l'element. - + L'élément n'existe pas. message box content - El símbol no existeix. + L'element no existeix. - + Le chemin virtuel choisi ne correspond pas à un élément. message box content - El camí virtual escollit no correspon a cap símbol. + El camí virtual escollit no correspon a cap element. @@ -7391,7 +7394,7 @@ Les condicions requerides no són vàlides &Configurer QElectroTech - &Configurar QElectroTech + &Configura QElectroTech @@ -7413,7 +7416,7 @@ Les condicions requerides no són vàlides Manuel en ligne - Instruccions Online + Manual en línia @@ -7424,42 +7427,42 @@ Les condicions requerides no són vàlides Télécharger une nouvelle version (dev) - Descarregar una nova versió (dev) + Descarrega una nova versió (dev) Lance le navigateur par défaut vers le manuel en ligne de QElectroTech status bar tip - Inicia el manual en línia de QElectroTech + Inicia el navegador predeterminat amb el manual en línia de QElectroTech Lance le navigateur par défaut vers la chaine Youtube de QElectroTech status bar tip - Inicia per defecte al canal de Youtube de QElectroTech + Inicia el navegador predeterminat amb el canal de Youtube de QElectroTech Lance le navigateur par défaut vers le dépot Nightly en ligne de QElectroTech status bar tip - Inicia el repositori Nightly de QElectroTech + Inicia el navegador predeterminat amb el repositori Nightly en línia de QElectroTech Soutenir le projet par un don - Donar suport al projecte amb una donació + Dona suport al projecte amb una donació Soutenir le projet QElectroTech par un don status bar tip - Donar suport al projecte QElectroTech amb una donació + Dona suport al projecte QElectroTech amb una donació À propos de &Qt - Sobre &Qt + Quant a &Qt @@ -7493,7 +7496,7 @@ Les condicions requerides no són vàlides Passer en &mode plein écran - Passar a mode de &finestra completa + Mode de &pantalla completa @@ -7505,7 +7508,7 @@ Les condicions requerides no són vàlides Afficher menu entry - Mostrar + Mostra @@ -7514,7 +7517,7 @@ Les condicions requerides no són vàlides Projet « %1 : %2» displayed title for a ProjectView - %1 is the project title, -%2 is the project path - + Projecte « %1 : %2» @@ -7557,42 +7560,48 @@ Les condicions requerides no són vàlides Ce document semble avoir été enregistré avec une version %1 qui est ultérieure à votre version ! Vous utilisez actuellement QElectroTech en version %2 - + Sembla que aquest document s'ha desat amb una versió %1 + que és posterior a la vostra! +Actualment esteu utilitzant la versió %2 de QElectroTech . Il est alors possible que l'ouverture de tout ou partie de ce document échoue. Que désirez vous faire ? - + . +Aleshores és possible que l'obertura de tot o part d'aquest document falli. +Què voleu fer? Avertissement message box title - + Avís Le projet que vous tentez d'ouvrir est partiellement compatible avec votre version %1 de QElectroTech. - + El projecte que esteu intentant obrir és parcialment compatible amb la vostra versió %1 de QElectroTech. + Afin de le rendre totalement compatible veuillez ouvrir ce même projet avec la version 0.8, ou 0.80 de QElectroTech et sauvegarder le projet et l'ouvrir à nouveau avec cette version. Que désirez vous faire ? - + Perquè sigui totalment compatible, obriu aquest mateix projecte amb la versió 0.8 o 0.80 de QElectroTech, deseu el projecte i torneu-lo a obrir amb aquesta versió. +Què voleu fer? <p align="center"><b>Ouverture du projet en cours...</b><br/>Création des folios</p> - + <p align="center"><b>Obrint el projecte actual...</b><br/>Creant els folis</p> <p align="center"><b>Ouverture du projet en cours...</b><br/>Mise en place des références croisées</p> - + <p align="center"><b>Obrint el projecte actual...</b><br/>Configurant referències creuades</p> @@ -7607,7 +7616,7 @@ Que désirez vous faire ? Voulez-vous enregistrer le modèle %1 ? dialog content - %1 is a title block template name - Vol desar el model %1? + Vols desar el model %1? @@ -7619,13 +7628,13 @@ Que désirez vous faire ? Dupliquer un modèle de cartouche input dialog title - Duplicar un model de caixetí + Duplica un model de caixetí Pour dupliquer ce modèle, entrez le nom voulu pour sa copie input dialog text - Entri el nom que tindrà la còpia del model + Per duplicar aquesta plantilla, introduïu el nom que vulgueu per a la seva còpia @@ -7637,55 +7646,55 @@ Que désirez vous faire ? &Ouvrir menu entry - &Obrir + &Obre Ouvrir depuis un fichier menu entry - Obrir des d'un fitxer + Obre des d'un fitxer &Enregistrer menu entry - &Desar + &Desa Enregistrer sous menu entry - Anomenar i desar + Desa com a Enregistrer vers un fichier menu entry - Desar en un fitxer + Desa en un fitxer &Quitter menu entry - &Sortir + &Surt Gérer les logos menu entry - Gestionar logos + Gestiona logos Zoom avant menu entry - Zoom - apropar + Zoom - apropa Zoom arrière menu entry - Zoom - allunyar + Zoom - allunya @@ -7703,7 +7712,7 @@ Que désirez vous faire ? Enregistrer sous dialog title - Anomenar i desar + Desa com a @@ -7715,49 +7724,49 @@ Que désirez vous faire ? &Fusionner les cellules menu entry - &Fusionar cel·les + &Fusiona les cel·les Co&uper menu entry - Re&tallar + Re&talla Cop&ier menu entry - Cop&iar + Cop&ia C&oller menu entry - En&ganxar + En&ganxa Éditer les informations complémentaires menu entry - Editar la informació complementària + Edita la informació complementària Ajouter une &ligne menu entry - Afegir una &línia + Afegeix una &línia Ajouter une &colonne menu entry - Afegir una &columna + Afegeix una &columna &Séparer les cellules menu entry - &Separar cel·les + &Separa les cel·les @@ -7769,13 +7778,13 @@ Que désirez vous faire ? &Édition menu title - &Edició + &Edita Afficha&ge menu title - &Visualització + &Visualitza @@ -7787,13 +7796,13 @@ Que désirez vous faire ? Édition toolbar title - Edició + Edita Affichage toolbar title - Visualització + Visualitza @@ -7805,7 +7814,7 @@ Que désirez vous faire ? Annulations dock title - Anulacions + Cancel·lacions @@ -7823,7 +7832,7 @@ Que désirez vous faire ? [Lecture seule] window title tag - [Només lectura] + [Només lectura] @@ -7847,13 +7856,13 @@ Que désirez vous faire ? Ouvrir un modèle File > open dialog window title - Obrir un model + Obre un model Ouvrir un fichier dialog title - Obrir un fitxer + Obre un fitxer @@ -7865,13 +7874,13 @@ Que désirez vous faire ? Enregistrer le modèle sous dialog window title - Desar el model com a + Desa el model com a Éditer les informations complémentaires window title - Editar la informació complementària + Edita la informació complementària @@ -7892,16 +7901,17 @@ Que désirez vous faire ? Els caràcters autoritzats són: - números [0-9] - lletres minúscules [a-z] - - guió mig [-], guió baix [_] i punt [.] + - guió mig [-], guió baix [_] i punt [.] + QObject - + Avertissement : l'élément a été enregistré avec une version ultérieure de QElectroTech. - Avís: el símbol ha estat desat amb una versió posterior del QElectroTech. + Avís: l'element ha estat desat amb una versió posterior del QElectroTech. @@ -7916,74 +7926,74 @@ Que désirez vous faire ? un element graphique - + un element gràfic supprimer %1 undo caption - %1 is a sentence listing the removed content - suprimir %1 + suprimeix %1 coller %1 undo caption - %1 is a sentence listing the content to paste - enganxar %1 + enganxa %1 couper %1 undo caption - %1 is a sentence listing the content to cut - retallar %1 + retalla %1 déplacer %1 undo caption - %1 is a sentence listing the moved content - moure %1 + mou %1 modifier le texte undo caption - modifcar el text + modifica el text modifier un conducteur undo caption - modificar un conductor + modifica un conductor Réinitialiser %1 undo caption - %1 is a sentence listing the reset content - Reiniciar %1 + Reinicia %1 modifier le cartouche undo caption - modificar el caixetí + modifica el caixetí modifier les dimensions du folio undo caption - modificar la mida del full + modifica la mida del full suppression undo caption - eliminació + elimina couper des parties undo caption - tallar parts + talla les parts @@ -7995,37 +8005,37 @@ Que désirez vous faire ? modification noms undo caption - modificació noms + modifica noms amener au premier plan undo caption - dur al davant + porta al davant rapprocher undo caption - apropar + apropa éloigner undo caption - allunyar + allunya envoyer au fond undo caption - enviar al fons + envia al fons modification informations complementaires undo caption - modificació informació complementària + modifica informació complementària @@ -8037,31 +8047,30 @@ Que désirez vous faire ? redimensionnement de %1 primitives undo caption -- %1 always > 1 - Canviar la mida de les primitives %1 + Canvia la mida de les primitives %1 Modifier les propriétées de l'élément - + Edita les propietats de l'element - Pivoter la selection undo caption - + Gira la selecció - + Miroir de sélection undo caption - + Mirall de selecció - + Retourner la sélection undo caption - + Torna la selecció @@ -8123,7 +8132,7 @@ Que désirez vous faire ? Réinitialiser les dimensions - Tornar a mides anteriors + Torna a mides anteriors @@ -8133,37 +8142,37 @@ Que désirez vous faire ? Exporter vers le presse-papier - Exportar al portapapers + Exporta al portapapers - + %n élément(s) part of a sentence listing the content of a diagram - %n símbol - %n símbol(s) + %n element + %n elements - + %n conducteur(s) part of a sentence listing the content of a diagram %n conductor - %n conductor(s) + %n conductors - + %n champ(s) de texte part of a sentence listing the content of a diagram %n camp de text - %n camp(s) de text + %n camps de text - + %n image(s) part of a sentence listing the content of a diagram @@ -8172,7 +8181,7 @@ Que désirez vous faire ? - + %n forme(s) part of a sentence listing the content of a diagram @@ -8181,98 +8190,98 @@ Que désirez vous faire ? - + %n texte(s) d'élément part of a sentence listing the content of a diagram - - - + + %n text d'element + %n texts d'elements - + %n tableau(s) part of a sentence listing the content of diagram - - - + + %n tauler + %n taulers - + %n plan de bornes part of a sentence listing the content of a diagram - - - + + %n pla de borns + %n plans de borns - + Le fichier texte contenant la licence GNU/GPL est introuvable - bon bah de toute façon, vous la connaissez par coeur non ? No es troba el fitxer de text que conté la llicència GNU/GPL. Total... la coneixeu de memòria, oi? - + Le fichier texte contenant la licence GNU/GPL existe mais n'a pas pu être ouvert - bon bah de toute façon, vous la connaissez par coeur non ? El fitxer de text que conté la llicència GNU/GPL ha estat trobat però no ha estat possible obrir-lo. Total... la coneixeu de memòria, oi? - - + + Impossible d'ouvrir le fichier %1 en écriture, erreur %2 rencontrée. error message when attempting to write an XML file Impossible obrir el fitxer %1 en mode d'escriptura, error %2. - + Une erreur est survenue lors de l'écriture du fichier %1, erreur %2 rencontrée. error message when attempting to write an XML file - + S'ha produït un error en escriure el fitxer %1 i s'ha trobat l'error %2. - + Amener au premier plan - Dur al davant + Porta al primer pla - + Rapprocher - Apropar + Apropa - + Éloigner - Allunyar + Allunya - + Envoyer au fond - Enviar al fons + Envia al fons - + Ramène la ou les sélections au premier plan - + Torna a posar les seleccions al primer pla - + Rapproche la ou les sélections - + Apropa les seleccions - + Éloigne la ou les sélections - + Elimina les seleccions - + Envoie en arrière plan la ou les sélections - + Envia les seleccions al fons - + Borne tooltip Born @@ -8354,8 +8363,8 @@ Que désirez vous faire ? Couper %n cellule(s) undo caption - Tallar %n cel·la - Tallar %n cel·la(es) + Talla %n cel·la + Talla %n cel·les @@ -8363,8 +8372,8 @@ Que désirez vous faire ? Coller %n cellule(s) undo caption - Enganxar %n cel·la - Enganxar %n cel·la(es) + Enganxa %n cel·la + Enganxa %n cel·les @@ -8445,12 +8454,12 @@ Que désirez vous faire ? Selectionner une image... - Seleccionar una imatge ... + Selecciona una imatge ... Image Files (*.png *.jpg *.jpeg *.bmp *.svg) - Els arxius d'imatge (*.png *.jpg *.jpeg *.bmp *.svg) + Els fitxers d'imatge (*.png *.jpg *.jpeg *.bmp *.svg) @@ -8466,7 +8475,7 @@ Que désirez vous faire ? Ajouter - Afegir + Afegeix @@ -8508,12 +8517,12 @@ Que désirez vous faire ? Modifier les informations de l'élément : %1 - Modificar les propietats del símbol: %1 + Modifica les propietats de l'element: %1 Modifier les informations de plusieurs éléments - + Modifica les propietats de diversos elements @@ -8525,13 +8534,13 @@ Que désirez vous faire ? Modifier les propriétés d'un conducteur undo caption - Modificar les propietats d'un conductor + Modifica les propietats d'un conductor Modifier les propriétés de plusieurs conducteurs undo caption - Modificar les propietats de diversos conductors + Modifica les propietats de diversos conductors @@ -8546,40 +8555,42 @@ Que désirez vous faire ? Déplacer - + Moure et - i + i un groupe de texte - + un grup de text numero_de_fileries_ - + número_de_files_ Enregister sous... - Anomenar i Desar... + Desa com a... Fichiers csv (*.csv) - Arxius csv (*.csv) + Fitxers csv (*.csv) Impossible de remplacer le fichier! - Impossible reemplaçar el fitxer! + Impossible reemplaçar el fitxer! + + @@ -8589,7 +8600,7 @@ Que désirez vous faire ? Collection Company - + Col·lecció d'empresa @@ -8616,562 +8627,562 @@ Que désirez vous faire ? Ajouter %n conducteur(s) add a numbers of conductor one or more - Afegir %n conductor - Afegir %n conductors + Afegeix %n conductor + Afegeix %n conductors Pivoter %1 textes - + Gira %1 textos Pivoter - Girar + Gira %1 groupes de textes - + %1 grups de text Orienter les textes sélectionnés window title - Orientar els textos seleccionats + Orienta els textos seleccionats Fichier - + Fitxer Installation (=) - + Instal·lació (=) Localisation (+) - + Localització (+) Indice de révision - + Índex de revisió Position - Posició + Posició Version de QElectroTech - + Versió de QElectroTech Numéro de folio - + Número de full Position du folio - + Posició du full Nombre de folio - + Nombre de full Numéro du folio précédent - + Número de full anterior Numéro du folio suivant - + Número de full següent Titre du projet - + Títol del projecte Chemin du fichier du projet - + Ruta del fitxer del projecte Nom du fichier - + Nom del fitxer Date d'enregistrement du fichier format local - + Data de desament del fitxer en format local Date d'enregistrement du fichier format dd-MM-yyyy - + Data d'enregistrament del fitxer en format dd-MM-aaaa Date d'enregistrement du fichier format yyyy-MM-dd - + Data d'enregistrament del fitxer en format aaaa-MM-dd Heure d'enregistrement du fichier - + Temps de gravació del fitxer Nom du fichier enregistré - + Nom del fitxer desat Chemin du fichier enregistré - + Ruta del fitxer desat Formule du label - + Fórmula de l'etiqueta Label - Etiqueta + Etiqueta Commentaire - Comentari + Comentari Fonction - Funció + Funció Bloc auxiliaire 1 - Bloc auxiliar 1 + Bloc auxiliar 1 Description textuelle auxiliaire 1 - + Descripció textual auxiliar 1 Numéro d'article auxiliaire 1 - + Número d'article auxiliar 1 Fabricant auxiliaire 1 - + Fabricant auxiliar 1 Numéro de commande auxiliaire 1 - + Número de comanda auxiliar 1 Numéro interne auxiliaire 1 - + Número intern auxiliar 1 Fournisseur auxiliaire 1 - + Proveïdor auxiliar 1 Quantité auxiliaire 1 - + Quantitat auxiliar 1 Unité auxiliaire 1 - + Unitat auxiliar 1 Bloc auxiliaire 2 - Bloc auxiliar 2 + Bloc auxiliar 2 Description textuelle auxiliaire 2 - + Descripció textual auxiliar 2 Numéro d'article auxiliaire 2 - + Número d'article auxiliar 2 Fabricant auxiliaire 2 - + Fabricant auxiliar 2 Numéro de commande auxiliaire 2 - + Número de comanda auxiliar 2 Numéro interne auxiliaire 2 - + Número intern auxiliar 2 Fournisseur auxiliaire 2 - + Proveïdor auxiliar 2 Quantité auxiliaire 2 - + Quantitat auxiliar 2 Unité auxiliaire 2 - + Unitat auxiliar 2 Bloc auxiliaire 3 - + Bloc auxiliar 3 Description textuelle auxiliaire 3 - + Descripció textual auxiliar 3 Numéro d'article auxiliaire 3 - + Número d'article auxiliar 3 Fabricant auxiliaire 3 - + Fabricant auxiliar 3 Numéro de commande auxiliaire 3 - + Número de comanda auxiliar 3 Numéro interne auxiliaire 3 - + Número intern auxiliar 3 Fournisseur auxiliaire 3 - + Proveïdor auxiliar 3 Quantité auxiliaire 3 - + Quantitat auxiliar 3 Unité auxiliaire 3 - + Unitat auxiliar 3 Bloc auxiliaire 4 - + Bloc auxiliar 4 Description textuelle auxiliaire 4 - + Descripció textual auxiliar 4 Numéro d'article auxiliaire 4 - + Número d'article auxiliar 4 Fabricant auxiliaire 4 - + Fabricant auxiliar 4 Numéro de commande auxiliaire 4 - + Número de comande auxiliar 4 Numéro interne auxiliaire 4 - + Número intern auxiliar 4 Fournisseur auxiliaire 4 - + Proveïdor auxiliar 4 Quantité auxiliaire 4 - + Quantitat auxiliar 4 Unité auxiliaire 4 - + Unitat auxiliar 4 Description textuelle - + Descripció textual Numéro d'article - + Número d'article Fabricant - Fabricant + Fabricant Numéro de commande - + Número de comanda Numéro interne - + Número intern Fournisseur - + Proveïdor Quantité - + Quantitat Unité - + Unitat Tension / Protocole - + Tensió / Protocol Couleur du fil - + Color del fil Section du fil - + Secció de fil Formule du texte - + Fórmula de text Ajouter une nomenclature - + Afegeix una nomenclatura Ajouter un sommaire - Afegir un resum + Afegeix un resum Compilation : - Compilació: + Compilació : Compilation : - + Compilació: Ajouter une borne - Afegir un born + Afegeix un born Ajouter la borne %1 - + Afegeix el born %1 à un groupe de bornes - + a un grup de borns au groupe de bornes %1 - + al grup de borns %1 Ajouter %1 bornes - + Afegeix %1 borns Enlever %1 bornes - + Elimina %1 borns Enlever une borne - + Elimina un born d'un groupe de bornes - + d'un grup de borns du groupe de bornes %1 - + del grup de borns %1 Déplacer une borne - Moure un born + Moure un born Déplacer la borne %1 - + Mou el born %1 d'un groupe de bornes - + d'un grup de borns du groupe de bornes %1 - + del grup de borns %1 vers un groupe de bornes - + a un grup de borns vers le groupe de bornes %1 - + al grup de borns %1 Déplacer des bornes - + Moure els borns Générique generic terminal element type - + Genèric Fusible fuse terminal element type - + Fusible Sectionable sectional terminal element type - + Seccionable Diode diode terminal element type - + Díode Terre ground terminal element type - Terra + Terra Générique generic terminal element function - + Genèric Phase phase terminal element function - Fase + Fase Neutre neutral terminal element function - Neutre + Neutre %p% effectué (%v sur %m) - + %p% fet (%v de %m) - - + + @@ -9179,287 +9190,292 @@ Que désirez vous faire ? this is an error in the code - + Això és un error al codi Champ texte dynamique - + Camp de text dinàmic - + Importer un fichier dxf - + Importa un fitxer dxf Ouvrir un element - + Obre un element Coller - + Enganxa chargement %p% (%v sur %m) - + carregant %p% (%v de %m) Configuration de textes - + Configuració de textos Une configuration de textes nommée << %1 >> existe déjà. Voulez-vous la remplacer ? - + Ja existeix una configuració de text anomenada <<%1>>. +Voleu substituir-la? Nom de la configuration - + Nom de la configuració Entrer le nom de la configuration à créer - + Introduïu el nom de la configuració que voleu crear Aucune configuration de textes existante. - + No hi ha cap configuració de text existent. Sélectionner une configuration de textes - + Seleccioneu una configuració de text Sélectionner la configuration de textes à ajouter à l'élément - + Seleccioneu la configuració de text que voleu afegir a l'element Importer la configuration de texte : %1 - + Importa la configuració de text : %1 To install the plugin qet_tb_generator<br>Visit :<br><a href='https://pypi.python.org/pypi/qet-tb-generator'>qet-tb-generator</a><br>Requires python 3.5 or above.<br><B><U> First install on Windows</B></U><br>1. Install, if required, python 3.5 or above<br> Visit :<br><a href='https://www.python.org/downloads/'>python.org</a><br>2. pip install qet_tb_generator<br><B><U> Update on Windows</B></U><br>python -m pip install --upgrade qet_tb_generator<br>>>user could launch in a terminal this script in this directory<br> C:\users\XXXX\AppData\Local\Programs\Python\Python36-32\Scripts <br> - + Per instal·lar el connector qet_tb_generator<br>Visiteu:<br><a href='https://pypi.python.org/pypi/qet-tb-generator'>qet-tb-generator</a><br>Requereix python 3.5 o superior.<br><B><U> Primera instal·lació a Windows</B></U><br>1. Instal·leu, si cal, python 3.5 o superior<br> Visiteu:<br><a href='https://www.python.org/downloads/'>python.org</a><br>2. pip install qet_tb_generator<br><B><U> Actualització a Windows</B></U><br>python -m pip install --upgrade qet_tb_generator<br>>>L'usuari podria iniciar aquest script en un terminal en aquest directori<br> C:\users\XXXX\AppData\Local\Programs\Python\Python36-32\Scripts <br> To install the plugin qet_tb_generator<br>Visit :<br><a href='https://pypi.python.org/pypi/qet-tb-generator'>qet-tb-generator</a><br><B><U> First install on macOSX</B></U><br>1. Install, if required, python 3.11 bundle only, <a href='https://www.python.org/ftp/python/3.11.2/python-3.11.2-macos11.pkg'>python-3.11.2-macos11.pkg</a><br>2 Run Profile.command script<br>because program use hardcoded PATH for localise qet-tb-generator plugin <br> Visit :<br><a href='https://qelectrotech.org/forum/viewtopic.php?pid=5674#p5674'>howto</a><br>2. pip3 install qet_tb_generator<br><B><U> Update on macOSX</B></U><br> pip3 install --upgrade qet_tb_generator<br> - + Per instal·lar el connector qet_tb_generator<br>Visiteu:<br><a href='https://pypi.python.org/pypi/qet-tb-generator'>qet-tb-generator</a><br><B><U> Primera instal·lació a macOSX</B></U><br>1. Instal·leu, si cal, només el paquet python 3.11, <a href='https://www.python.org/ftp/python/3.11.2/python-3.11.2-macos11.pkg'>python-3.11.2-macos11.pkg</a><br>2 Executeu l'script Profile.command<br>perquè el programa utilitza el PATH codificat per localitzar el connector qet-tb-generator <br> Visiteu:<br><a href='https://qelectrotech.org/forum/viewtopic.php?pid=5674#p5674'>com fer-ho</a><br>2. instal·lació de qet_tb_generator amb pip3<br><B><U> Actualització a macOSX</B></U><br> instal·lació de pip3 --upgrade qet_tb_generator<br> To install the plugin qet_tb_generator<br>Visit :<br><a href='https://pypi.python.org/pypi/qet-tb-generator'>qet-tb-generator</a><br><br>Requires python 3.5 or above.<br><br><B><U> First install on Linux</B></U><br>1. check you have pip3 installed: pip3 --version<br>If not install with: sudo apt-get install python3-pip<br>2. Install the program: sudo pip3 install qet_tb_generator<br>3. Run the program: qet_tb_generator<br><br><B><U> Update on Linux</B></U><br>sudo pip3 install --upgrade qet_tb_generator<br> - + Per instal·lar el connector qet_tb_generator<br>Visiteu:<br><a href='https://pypi.python.org/pypi/qet-tb-generator'>qet-tb-generator</a><br><br>Requereix python 3.5 o superior.<br><br><B><U> Primera instal·lació a Linux</B></U><br>1. comproveu que teniu pip3 instal·lat: pip3 --version<br>Si no, instal·leu-lo amb: sudo apt-get install python3-pip<br>2. Instal·leu el programa: sudo pip3 install qet_tb_generator<br>3. Executeu el programa: qet_tb_generator<br><br><B><U> Actualització a Linux</B></U><br>sudo pip3 install --upgrade qet_tb_generator<br> Error launching qet_tb_generator plugin - + Error en iniciar el connector qet_tb_generator Chercher/remplacer les propriétés de folio - + Cerca/Substitueix les propietats del full Chercher/remplacer les propriétés d'éléments. - + Cerca/Substitueix les propietats dels elements. Chercher/remplacer des textes independants - + Cercar/substituir textos independents Chercher/remplacer les propriétés de conducteurs. - + Cerca/substitueix les propietats dels conductors. Rechercher / remplacer avancé - + Cerca/substitueix avançat Disposition par défaut - + Disseny per defecte Ajouter un groupe de bornes - + Afegeix un grup de borns Supprimer un groupe de bornes - + Suprimeix un grup de borns Ponter des bornes entre-elles - + Connectant borns junts Supprimer des ponts de bornes - + Elimina els ponts de borns Modifier la couleur d'un pont de bornes - + Canvia el color d'un pont de borns Modifier les proriétés d'un groupe de bornes - + Modifica les propietats d'un grup de borns Trier le bornier %1 - + Ordena el bloc de borns %1 Ajouter un texte d'élément - + Afegeix text de l'element Ajouter un groupe de textes d'élément - + Afegeix un grup de texts d'elements Grouper des textes d'élément - + Agrupa els texts d'elements Supprimer un groupe de textes d'élément - + Suprimeix un grup de textos d'elements Insérer un texte d'élément dans un groupe de textes - + Inserir text d'element en un grup de text Enlever un texte d'élément d'un groupe de textes - + Elimina el text d'un element d'un grup de text Modifier l'alignement d'un groupe de textes - + Canvia l'alineació d'un grup de textos Modifier les propriétés d'un élement - + Modifica les propietats d'un element Pivoter la selection - + Gira la selecció Création de conducteurs - + Creació de conductors Entrer le facteur d'échelle - + Introduïu el factor d'escala Facteur X: - + Factor X: Facteur Y: - + Factor Y: sans - + sense horizontal - + horitzontal vertical - + vertical horizontal + vertical - + horitzontal + vertical Retourner l'élément : - + Retorna l'element: direction - + direcció QET_ElementScaler: additional information about %1 import / scaling - + QET_ElementScaler: + informació addicional sobre la importació / escalat de %1 Le logiciel QET_ElementScaler est nécessaire pour mettre les éléments à l'échelle. Veuillez télécharger celui-ci en suivant le lien ci dessous et le dézipper dans le dossier d'installation - + Cal el programari QET_ElementScaler per escalar elements. +Si us plau, descarregueu-lo des de l'enllaç següent i descomprimiu-lo a la carpeta d'instal·lació Dxf2elmt: Error: Make sure the file %1 is a valid .dxf file - + Dxf2elmt: +Error: Assegureu-vos que el fitxer %1 sigui un fitxer .dxf vàlid See details here: - + Vegeu els detalls aquí: L'import dxf nécessite le logiciel dxf2elmt. Veuillez télécharger celui-ci en suivant le lien ci dessous et le dézipper dans le dossier d'installation - + La importació de DXF requereix el programari dxf2elmt. +Si us plau, descarregueu-lo des de l'enllaç següent i descomprimiu-lo a la carpeta d'instal·lació @@ -9474,7 +9490,7 @@ Veuillez télécharger celui-ci en suivant le lien ci dessous et le dézipper da Example Longer example string - + Exemple @@ -9483,23 +9499,25 @@ Veuillez télécharger celui-ci en suivant le lien ci dessous et le dézipper da Les information à afficher sont supérieurs à la quantité maximal pouvant être affiché par les tableaux. Veuillez ajouter un nouveau tableau ou regler les tableaux existant afin d'afficher l'integralité des informations. - + La informació que es mostrarà supera la quantitat màxima que poden mostrar les taules. +Afegiu una taula nova o ajusteu les taules existents per mostrar la quantitat completa d'informació. Les information à afficher sont supérieurs à la quantité maximal pouvant être affiché par le tableau. Veuillez ajouter un nouveau tableau ou regler le tableau existant afin d'afficher l'integralité des informations. - + La informació que es mostrarà supera la quantitat màxima que es pot mostrar a la taula. +Afegiu una taula nova o ajusteu la taula existent per mostrar la quantitat completa d'informació. Limitation de tableau - + Limitació de la taula Modifier la géometrie d'un tableau - + Modifica la geometria d'una taula @@ -9517,27 +9535,27 @@ Veuillez ajouter un nouveau tableau ou regler le tableau existant afin d'af Ajouter un point - + Afegeix un punt Supprimer ce point - + Elimina aquest punt Ajouter un point à un polygone - + Afegir un punt a un polígon Supprimer un point d'un polygone - + Elimina un punt d'un polígon Modifier %1 - Modificar %1 + Modifica %1 @@ -9560,43 +9578,43 @@ Veuillez ajouter un nouveau tableau ou regler le tableau existant afin d'af Dimensions : - + Dimensions : y - y + y Coin supérieur gauche : - + Cantó superior esquerre : Largeur : - Amplada: + Amplada : Arrondi : - + Arrodonit : x - x + x Hauteur : - Alçada: + Alçada : Modifier un rectangle - Modificar un rectangle + Modifica un rectangle @@ -9609,7 +9627,7 @@ Veuillez ajouter un nouveau tableau ou regler le tableau existant afin d'af Nouveau nom : - Nou nom: + Nom nou : @@ -9619,12 +9637,12 @@ Veuillez ajouter un nouveau tableau ou regler le tableau existant afin d'af Renommer - Canviar el nom + Canvia el nom Annuler - Anular + Cancel·la @@ -9634,7 +9652,7 @@ Veuillez ajouter un nouveau tableau ou regler le tableau existant afin d'af L'élément « %1 » existe déjà. Que souhaitez-vous faire ? - El símbol « %1 » ja existeix, que vol fer? + L'element « %1 » ja existeix, què vols fer? @@ -9642,43 +9660,43 @@ Veuillez ajouter un nouveau tableau ou regler le tableau existant afin d'af Type - Tipus + Tipus Fonction : - Funció: + Funció : Texte visible - Text visible + Text visible Angle : - Angle: + Angle : Taille du texte : - Mida del text: + Mida del text : Texte : - Text: + Text : Couleur du conducteur - Color del conductor + Color del conductor &Multifilaire - + &Multifilar @@ -9695,17 +9713,17 @@ Veuillez ajouter un nouveau tableau ou regler le tableau existant afin d'af Ne pas modifier - + No modificar À gauche - + Esquerra À droite - + Dreta @@ -9713,169 +9731,169 @@ Veuillez ajouter un nouveau tableau ou regler le tableau existant afin d'af Supprimer ce texte - + Suprimeix aquest text ° - + ° En haut - + Superior En bas - + Inferior Formule du texte : - + Fórmula de text : Texte sur conducteur vertical : - + Text en conductor vertical: Texte sur conducteur horizontal : - + Text en conductor horitzontal: Tension / protocol : - + Tensió / protocol : Section du conducteur - + Secció de Conductor Unifilaire - Unifilar + Unifilar Protective Earth Neutral - Terra per protecció personal + Terra per protecció neutre PEN - PEN + PEN Phase - Fase + Fase phase - fase + fase Nombre de phase - Nombre de fases + Nombre de fases Neutre - Neutre + Neutre neutre - neutre + neutre Terre - Terra + Terra terre - terra + terra TextLabel - Etiqueta de text + Etiqueta de text PushButton - + Polsador Apparence - Aparença + Aparença Taille : - + Mida : Couleur : - Color: + Color : Style : - Estil: + Estil : Modifier - + Modifica Couleur secondaire : - + Color secundari : Taille de trait : - + Mida de la línia: px - px + px Trait plein conductor style: solid line - Línia contínua + Línia contínua Trait en pointillés conductor style: dashed line - Línia de puntets + Línia de puntets Traits et points conductor style: dashed and dotted line - Línies i punts + Línies i punts @@ -9883,7 +9901,7 @@ Veuillez ajouter un nouveau tableau ou regler le tableau existant afin d'af Ne pas modifier - + No modificar @@ -9891,32 +9909,32 @@ Veuillez ajouter un nouveau tableau ou regler le tableau existant afin d'af Form - Formulari + Formulari Principales - Principals + Principals Indice Rev - Index Rev + Índex Rev Localisation - Localització + Localització Fichier : - Arxiu: + Fitxer : Disponible en tant que %title pour les modèles de cartouches - Disponible com a %title per als caixetins + Disponible com a %title pels models de caixetins @@ -9928,62 +9946,62 @@ Veuillez ajouter un nouveau tableau ou regler le tableau existant afin d'af Ne pas modifier - + No modificar Disponible en tant que %author pour les modèles de cartouches - Disponible com a %author per als caixetins + Disponible com a %author per a models de caixetins Auteur : - Autor: + Autor : Date : - Data: + Data : Installation : - Instal·lació: + Instal·lació : Disponible en tant que %indexrev pour les modèles de cartouches - Disponible com a %indexrev per als caixetins + Disponible com a %indexrev per a models de caixetins Disponible en tant que %filename pour les modèles de cartouches - Disponible com a %filename per als caixetins del projecte + Disponible com a %filename per a models de caixetins Folio : - Full: + Full : Pas de date - No hi cap data + No hi cap data Disponible en tant que %date pour les modèles de cartouches - Disponible com %date per als models de caixetí + Disponible com a %date per a models de caixetí Date fixe : - Data fixa: + Data fixada : Appliquer la date actuelle - Aplicar la data actual + Aplica la data actual @@ -9992,22 +10010,26 @@ Les variables suivantes sont utilisables : - %id : numéro du folio courant dans le projet - %total : nombre total de folios dans le projet - %autonum : Folio Auto Numeration - + Disponible com a %full per a models de caixetí +Es poden utilitzar les variables següents: +- %id: Número de full actual al projecte +- %total: Nombre total de fulls al projecte +- %autonum: Numeració automàtica del full Disponible en tant que %locmach pour les modèles de cartouches - Disponible com %locmach per als models de caixetí + Disponible com %locmach per a models de caixetí <html><head/><body><p>Disponible en tant que %plant pour les modèles de cartouches</p></body></html> - + <html><head/><body><p>Disponible com a %plant per a models de caixetí</p></body></html> Titre : - Títol: + Títol : @@ -10018,19 +10040,19 @@ Les variables suivantes sont utilisables : Supprimer ce texte - + Suprimeix aquest text Personnalisées - Personalitzades + Personalitzades Vous pouvez définir ici vos propres associations noms/valeurs pour que le cartouche en tienne compte. Exemple : associer le nom "volta" et la valeur "1745" remplacera %{volta} par 1745 dans le cartouche. - Aquí podeu definir les seves pròpies associacions de nom / valor perquè sigui pres en compte en el caixetí. Exemple: -associar el nom de "volta" i el valor "1745" reemplaçarà %{volta} per 1745 dins del caixetí. + Aquí podeu definir les vostres pròpies associacions de nom/valor perquè el caixetí les pugui tenir en compte. Per exemple: +associar el nom "volta" amb el valor "1745" substituirà %{volta} per 1745 al caixetí. @@ -10055,7 +10077,14 @@ Créer votre propre texte en vous aidant des variables suivantes : %LM : la localisation %l : le numéro de ligne %c : le numéro de colonne - + Podeu definir una etiqueta personalitzada per als informes de foli. +Creeu el vostre propi text utilitzant les variables següents: +%f: la posició del full al projecte +%F: el número de full +%M: la instal·lació +%LM: la ubicació +%l: el número de línia +%c: el número de columna @@ -10063,192 +10092,192 @@ Créer votre propre texte en vous aidant des variables suivantes : Form - Formulari + Formulari Folio - Full + Full Élément - Símbol + Element Chercher : - + Cerca : Mode - + Mode Texte brut - + Text pla Mots entiers - + Paraules senceres Sensible à la casse - + Sensible a majúscules i minúscules Aller à la correspondance suivante - + Ves a la correspondència següent Aller à la correspondance précédente - + Ves a la correspondència anterior Actualiser - + Actualitza <html><head/><body><p>Afficher les options avancées</p></body></html> - + <html><head/><body><p>Mostra les opcions avançades</p></body></html> <html><head/><body><p>Définir les propriétés à remplacer dans les éléments</p></body></html> - + <html><head/><body><p>Defineix les propietats per reemplaçar en els elements</p></body></html> <html><head/><body><p>Définir les propriétés à remplacer dans les conducteurs</p></body></html> - + <html><head/><body><p>Defineix les propietats que es vol substituir en els conductors</p></body></html> Conducteur - Conductor + Conductor <html><head/><body><p>Remplacer les correspondances cochées</p></body></html> - + <html><head/><body><p>Substitueix les coincidències marcades</p></body></html> Tout remplacer - + Substituïu-ho tot avancé - + Avança Remplacer : - + Substitueix : <html><head/><body><p>Définir les propriétés à remplacer dans les folios</p></body></html> - + <html><head/><body><p>Defineix les propietats que es substituiran als fulls</p></body></html> Champ texte de folio - + Camp de text de full <html><head/><body><p>Remplacer la correspondance sélectionnée</p></body></html> - + <html><head/><body><p>Substitueix la coincidència seleccionada</p></body></html> Remplacer - Substituïr + Substitueix Quitter - + Surt Correspondance : - + Correspondència : Folios - + Fulls Champs texte - + Camps de text Eléments - + Elements Eléments simple - + Elements simple Eléments maître - + Elements mestre Eléments esclave - + Elements esclau Eléments report de folio - + Elements d'informe de full Eléments bornier - + Elements de borns Conducteurs - + Conductors Inconnue - + Desconegut Sélectionner les éléments de ce folio - + Selecciona els elements d'aquest full Sélectionner les conducteurs de ce folio - + Selecciona els conductors d'aquest full Sélectionner les textes de ce folio - + Selecciona els textos d'aquest full @@ -10276,7 +10305,7 @@ Créer votre propre texte en vous aidant des variables suivantes : [édité] - + [editat] @@ -10289,12 +10318,12 @@ Créer votre propre texte en vous aidant des variables suivantes : <html><head/><body><p>Supprimer une variable de numérotation</p></body></html> - <html><head/><body><p>Eliminar una variable numèrica</p></body></html> + <html><head/><body><p>Suprimir una variable de numeració</p></body></html> <html><head/><body><p>Ajouter une variable de numérotation</p></body></html> - <html><head/><body><p>Afegir una variable numèrica</p></body></html> + <html><head/><body><p>Afegeix una variable de numeració</p></body></html> @@ -10304,17 +10333,17 @@ Créer votre propre texte en vous aidant des variables suivantes : Numérotations disponibles : - Numeració disponible: + Numeracions disponibles : Nom de la nouvelle numérotation - Nom de la nova numeració + Nom de la nova numeració Supprimer la numérotation - Esborrar la numeració + Suprimeix la numeració @@ -10345,7 +10374,7 @@ Créer votre propre texte en vous aidant des variables suivantes : Folio Autonumérotation title window - Numeració de Full automàtica + Numeració automàtica del full @@ -10362,13 +10391,27 @@ Si le chiffre défini dans le champ Valeur possède moins de digits que le type Le champ "Incrémentation" n'est pas utilisé. help dialog about the folio autonumerotation - + Aquí és on podeu definir com es numeraran els fulls nous. + +- Un sistema de numeració consta d'almenys una variable. + +- Podeu afegir o suprimir una variable de numeració mitjançant els botons - i +. + +- Una variable de numeració inclou: un tipus, un valor i un increment. + +- Els tipus "Dígit 1", "Dígit 01" i "Dígit 001" representen un tipus numèric definit al camp "Valor", que s'incrementa amb cada nou full pel valor del camp "Increment". + +- "Dígit 01" i "Dígit 001" es representen al diagrama amb almenys dos i tres dígits, respectivament. +Si el número definit al camp Valor té menys dígits que el tipus escollit, anirà precedit d'un o dos 0 per coincidir amb el seu tipus. + +- El tipus "Text" representa text fix. El camp "Increment" no s'utilitza. + Conducteur Autonumérotation title window - + Numeració automàtica del conductor @@ -10390,13 +10433,29 @@ Les autres champs ne sont pas utilisés. -Le type "Folio" représente le nom du folio en cours. Les autres champs ne sont pas utilisés. help dialog about the conductor autonumerotation - + Aquí és ou definir com es numeraran els nous conductors. + +- Un sistema de numeració consta d'almenys una variable. + +- Podeu afegir o suprimir una variable de numeració mitjançant els botons - i +. + +- Una variable de numeració inclou: un tipus, un valor i un increment. + +- Els tipus "Dígit 1", "Dígit 01" i "Dígit 001" representen un tipus numèric definit al camp "Valor", que s'incrementa amb cada nou conductor pel valor del camp "Increment". + +- "Dígit 01" i "Dígit 001" es representen al diagrama amb almenys dos i tres dígits, respectivament. Si el número definit al camp Valor té menys dígits que el tipus escollit, anirà precedit d'un o dos 0 per respectar el seu tipus. + +- El tipus "Text" representa text fix. El camp "Increment" no s'utilitza. + +- El tipus "Número de full" representa el número de full actual. Els altres camps no s'utilitzen. + +-El tipus "Full" representa el nom del full actual. Els altres camps no s'utilitzen. Element Autonumérotation title window - + Numeració automàtica de l'element @@ -10418,7 +10477,23 @@ Les autres champs ne sont pas utilisés. -Le type "Folio" représente le nom du folio en cours. Les autres champs ne sont pas utilisés. help dialog about the element autonumerotation - + Aquí és on podeu definir com es numeraran els nous elements. + +- Un sistema de numeració consta d'almenys una variable. + +- Podeu afegir o suprimir una variable de numeració mitjançant els botons - i +. + +- Una variable de numeració inclou: un tipus, un valor i un increment. + +- Els tipus "Dígit 1", "Dígit 01" i "Dígit 001" representen un tipus numèric definit al camp "Valor", que s'incrementa amb cada nou conductor pel valor del camp "Increment". + +- "Dígit 01" i "Dígit 001" es representen al diagrama amb almenys dos i tres dígits, respectivament. Si el número definit al camp Valor té menys dígits que el tipus escollit, anirà precedit d'un o dos 0 per respectar el seu tipus. + +- El tipus "Text" representa text fix. El camp "Increment" no s'utilitza. + +- El tipus "Número de full" representa el número de full actual. Els altres camps no s'utilitzen. + +-El tipus "Full" representa el nom del full actual. Els altres camps no s'utilitzen. @@ -10492,7 +10567,7 @@ Les autres champs ne sont pas utilisés. Tiret custom - + Guió personalitzat @@ -10552,12 +10627,12 @@ Les autres champs ne sont pas utilisés. Diagonal arrière - Diagonal invertida + Diagonal endarrera Diagonal avant - Diagonal + Diagonal endavant @@ -10567,7 +10642,7 @@ Les autres champs ne sont pas utilisés. Verrouiller la position - Bloquejar la posició + Bloqueja la posició @@ -10577,33 +10652,33 @@ Les autres champs ne sont pas utilisés. Éditer les propriétés d'une primitive - Editar les propietats d'un element + Edita les propietats d'una primitiva Modifier le trait d'une forme - Modificar el traç d'una forma + Modifica el traç d'una forma Modifier le remplissage d'une forme - Modificar el emplenament d'una forma + Modifica l'emplenament d'una forma Fermer le polygone - Tancar el polígon + Tanca el polígon Modifier une forme simple - + Editeu una forma senzilla Modifier les propriétés d'une forme simple - + Edita les propietats d'una forma simple @@ -10690,841 +10765,841 @@ Les autres champs ne sont pas utilisés. Pink : Pink element part color - + Rosa : Rosa Pink : LightPink element part color - + Rosa : RosaClar Pink : HotPink element part color - + Rosa : RosaCalent Pink : DeepPink element part color - + Rosa : RosaProfund Pink : PaleVioletRed element part color - + Rosa : RosaVioletaPàlid Pink : MediumVioletRed element part color - + Rosa : RosaVioletaMitjà Red : LightSalmon element part color - + Vermell : SalmóClar Red : Salmon element part color - + Vermell : Salmó Red : DarkSalmon element part color - + Vermell : SalmóFosc Red : LightCoral element part color - + Vermell : CoralClar Red : IndianRed element part color - + Vermell : VermellIndi Red : Crimson element part color - + Vermell : Carmesí Red : Firebrick element part color - + Vermell : MaóRefractari Red : DarkRed element part color - + Vermell : VermellFosc Red : Red element part color - + Vermell : Vermell Orange : OrangeRed element part color - + Taronja : TaronjaVermell Orange : Tomato element part color - + Taronja : Tomàquet Orange : Coral element part color - + Taronja : Corall Orange : DarkOrange element part color - + Taronja : TaronjaFosc Orange : Orange element part color - + Taronja : Taronja Yellow : Yellow element part color - + Groc : Groc Yellow : LightYellow element part color - + Groc : GrocClar Yellow : LemonChiffon element part color - + Groc : TelaLLimona Yellow : LightGoldenrodYellow element part color - + Groc : GrocClarDeVaraDOr Yellow : PapayaWhip element part color - + Groc : FuetDePapaia Yellow : Moccasin element part color - + Groc : Mocassí Yellow : PeachPuff element part color - + Groc : BufadaDePréssec Yellow : PaleGoldenrod element part color - + Groc :VaraDOrPàl·lida Yellow : Khaki element part color - + Groc : Caqui Yellow : DarkKhaki element part color - + Groc : CaquiFosc Yellow : Gold element part color - + Groc : Or Brown : Cornsilk element part color - + Marró : BarbaDeBlatDeMoro Brown : BlanchedAlmond element part color - + Marró : AmetllaBlanquejada Brown : Bisque element part color - + Marró : Bisqueta Brown : NavajoWhite element part color - + Marró : BlancNavajo Brown : Wheat element part color - + Marró : Blat Brown : Burlywood element part color - + Marró : FustaCorpulenta Brown : Tan element part color - + Marró : Bronzejat Brown : RosyBrown element part color - + Marró : MarróRosat Brown : SandyBrown element part color - + Marró : MarroOmbraPàl·lit Brown : Goldenrod element part color - + Marró : VaraDOr Brown : DarkGoldenrod element part color - + Marró : VaraDOrFosca Brown : Peru element part color - + Marró : Perú Brown : Chocolate element part color - + Marró : Xocolata Brown : SaddleBrown element part color - + Marró : MarróSella Brown : Sienna element part color - + Marró : Siena Brown : Brown element part color - + Marró : Marró Brown : Maroon element part color - + Marró : Granat Green : DarkOliveGreen element part color - + Verd : VerdOlivaFosc Green : Olive element part color - + Verd : Oliva Green : OliveDrab element part color - + Verd : OlivaApagat Green : YellowGreen element part color - + Verd : VerdGroc Green : LimeGreen element part color - + Verd : VerdLlima Green : Lime element part color - + Verd : Llima Green : LawnGreen element part color - + Verd : VerdGespa Green : Chartreuse element part color - + Verd : Chartreuse Green : GreenYellow element part color - + Verd : VerdGroc Green : SpringGreen element part color - + Verd : VerdPrimavera Green : MediumSpringGreen element part color - + Verd : VerdPrimaveraMitjà Green : LightGreen element part color - + Verd : Verd Clar Green : PaleGreen element part color - + Verd : VerdPàl·lid Green : DarkSeaGreen element part color - + Verd : VerdMarFosc Green : MediumAquamarine element part color - + Verd : AiguaMarinaMitjà Green : MediumSeaGreen element part color - + Verd : VerdMarMitjà Green : SeaGreen element part color - + Verd : VerdMar Green : ForestGreen element part color - + Verd : VerdBosc Green : Green element part color - + Verd : Verd Green : DarkGreen element part color - + Verd : VerdFosc Cyan : Aqua element part color - + Cian : Aigua Cyan : Cyan element part color - + Cian : Cian Cyan : LightCyan element part color - + Cian : CianClar Cyan : PaleTurquoise element part color - + Cian : TurquesaPàl·lid Cyan : Aquamarine element part color - + Cian : AiguaMarina Cyan : Turquoise element part color - + Cian : Turquesa Cyan : MediumTurquoise element part color - + Cian : TurquesaMitjà Cyan : DarkTurquoise element part color - + Cian : TurquesaFosca Cyan : LightSeaGreen element part color - + Cian : VerdMarClar Cyan : CadetBlue element part color - + Cian : BlauCadet Cyan : DarkCyan element part color - + Cian : CianFosc Cyan : Teal element part color - + Cian : VerdBlau Blue : LightSteelBlue element part color - + Blau : BlauAcerClar Blue : PowderBlue element part color - + Blau : BlauEnPols Blue : LightBlue element part color - + Blau : BlauClar Blue : SkyBlue element part color - + Blau : BlauCel Blue : LightSkyBlue element part color - + Blau : BlauCelClar Blue : DeepSkyBlue element part color - + Blau : BlauCelFosc Blue : DodgerBlue element part color - + Blau : BlauDodger Blue : CornflowerBlue element part color - + Blau : BlauBlauet Blue : SteelBlue element part color - + Blau : BlauAcer Blue : RoyalBlue element part color - + Blau : BlauReial Blue : Blue element part color - + Blau : Blau Blue : MediumBlue element part color - + Blau : BlauMitjà Blue : DarkBlue element part color - + Blau : BlauFosc Blue : Navy element part color - + Blau : Blaumarí Blue : MidnightBlue element part color - + Blau : BlauMitjaNit Purple : Lavender element part color - + Lila : Lavanda Purple : Thistle element part color - + Lila : Cardo Purple : Plum element part color - + Lila : Pruna Purple : Violet element part color - + Lila : Violeta Purple : Orchid element part color - + Lila : Orquídia Purple : Fuchsia element part color - + Lila : Fúcsia Purple : Magenta element part color - + Lila : Magenta Purple : MediumOrchid element part color - + Lila : OrquídiaMitjà Purple : MediumPurple element part color - + Lila : LilaMitjà Purple : BlueViolet element part color - + Lila : BlauVioleta Purple : DarkViolet element part color - + Lila : VioletaFosc Purple : DarkOrchid element part color - + Lila : OrquídiaFosc Purple : DarkMagenta element part color - + Lila : MagentaFosc Purple : Purple element part color - + Lila : Lila Purple : Indigo element part color - + Lila : Indi Purple : DarkSlateBlue element part color - + Lila : BlauPissarraFosc Purple : SlateBlue element part color - + Lila : BlauPissarra Purple : MediumSlateBlue element part color - + Lila : BlauPissarraMitjà White : White element part color - + Blanc : Blanc White : Snow element part color - + Blanc : Neu White : Honeydew element part color - + Blanc : Melissada White : MintCream element part color - + Blanc : CremaDeMenta White : Azure element part color - + Blanc : Safir White : AliceBlue element part color - + Blanc : BlauAlicia White : GhostWhite element part color - + Blanc : BlancFantasma White : WhiteSmoke element part color - + Blanc : FumBlanc White : Seashell element part color - + Blanc : Petxina White : Beige element part color - + Blanc : Beix White : OldLace element part color - + Blanc : EncaixVell White : FloralWhite element part color - + Blanc : BlancFloral White : Ivory element part color - + Blanc : Marfil White : AntiqueWhite element part color - + Blanc : BlancAntic White : Linen element part color - + Blanc : Lli White : LavenderBlush element part color - + Blanc : RuborDeLavanda White : MistyRose element part color - + Blanc : RosaEnboirada Gray : Gainsboro element part color - + Gris : Gainsboro Gray : LightGray element part color - + Gris : GrisClar Gray : Silver element part color - + Gris : Plata Gray : DarkGray element part color - + Gris : GrisFosc Gray : Gray element part color - + Gris : Gris Gray : DimGray element part color - + Gris : DimGray Gray : LightSlateGray element part color - + Gris : GrisPissarraClar Gray : SlateGray element part color - + Gris : GrisPissarra Gray : DarkSlateGray element part color - + Gris : GrisPissarraFosc Gray : Black element part color - + Gris : Negre @@ -11668,841 +11743,841 @@ Les autres champs ne sont pas utilisés. Pink : Pink element part filling - + Rosa : Rosa Pink : LightPink element part filling - + Rosa : RosaClar Pink : HotPink element part filling - + Rosa : RosaCalent Pink : DeepPink element part filling - + Rosa : RosaProfund Pink : PaleVioletRed element part filling - + Rosa : RosaVioletaPàlid Pink : MediumVioletRed element part filling - + Rosa : RosaVioletaMitjà Red : LightSalmon element part filling - + Vermell : SalmóClar Red : Salmon element part filling - + Vermell : Salmó Red : DarkSalmon element part filling - + Vermell : SalmóFosc Red : LightCoral element part filling - + Vermell : CoralClar Red : IndianRed element part filling - + Vermell : VermellIndi Red : Crimson element part filling - + Vermell : Carmesí Red : Firebrick element part filling - + Vermell : MaóRefractari Red : DarkRed element part filling - + Vermell : VermellFosc Red : Red element part filling - + Vermell : Vermell Orange : OrangeRed element part filling - + Taronja : TaronjaVermell Orange : Tomato element part filling - + Taronja : Tomàquet Orange : Coral element part filling - + Taronja : Corall Orange : DarkOrange element part filling - + Taronja : TaronjaFosc Orange : Orange element part filling - + Taronja : Taronja Yellow : Yellow element part filling - + Groc : Groc Yellow : LightYellow element part filling - + Groc : GrocClar Yellow : LemonChiffon element part filling - + Groc : TelaLLimona Yellow : LightGoldenrodYellow element part filling - + Groc : GrocClarDeVaraDOr Yellow : PapayaWhip element part filling - + Groc : FuetDePapaia Yellow : Moccasin element part filling - + Groc : Mocassí Yellow : PeachPuff element part filling - + Groc : BufadaDePréssec Yellow : PaleGoldenrod element part filling - + Groc :VaraDOrPàl·lida Yellow : Khaki element part filling - + Groc : Caqui Yellow : DarkKhaki element part filling - + Groc : CaquiFosc Yellow : Gold element part filling - + Groc : Or Brown : Cornsilk element part filling - + Marró : BarbaDeBlatDeMoro Brown : BlanchedAlmond element part filling - + Marró : AmetllaBlanquejada Brown : Bisque element part filling - + Marró : Bisqueta Brown : NavajoWhite element part filling - + Marró : BlancNavajo Brown : Wheat element part filling - + Marró : Blat Brown : Burlywood element part filling - + Marró : FustaCorpulenta Brown : Tan element part filling - + Marró : Bronzejat Brown : RosyBrown element part filling - + Marró : MarróRosat Brown : SandyBrown element part filling - + Marró : MarroOmbraPàl·lit Brown : Goldenrod element part filling - + Marró : VaraDOr Brown : DarkGoldenrod element part filling - + Marró : VaraDOrFosca Brown : Peru element part filling - + Marró : Perú Brown : Chocolate element part filling - + Marró : Xocolata Brown : SaddleBrown element part filling - + Marró : MarróSella Brown : Sienna element part filling - + Marró : Siena Brown : Brown element part filling - + Marró : Marró Brown : Maroon element part filling - + Marró : Granat Green : DarkOliveGreen element part filling - + Verd : VerdOlivaFosc Green : Olive element part filling - + Verd : Oliva Green : OliveDrab element part filling - + Verd : OlivaApagat Green : YellowGreen element part filling - + Verd : VerdGroc Green : LimeGreen element part filling - + Verd : VerdLlima Green : Lime element part filling - + Verd : Llima Green : LawnGreen element part filling - + Verd : VerdGespa Green : Chartreuse element part filling - + Verd : Chartreuse Green : GreenYellow element part filling - + Verd : VerdGroc Green : SpringGreen element part filling - + Verd : VerdPrimavera Green : MediumSpringGreen element part filling - + Verd : VerdPrimaveraMitjà Green : LightGreen element part filling - + Verd : Verd Clar Green : PaleGreen element part filling - + Verd : VerdPàl·lid Green : DarkSeaGreen element part filling - + Verd : VerdMarFosc Green : MediumAquamarine element part filling - + Verd : AiguaMarinaMitjà Green : MediumSeaGreen element part filling - + Verd : VerdMarMitjà Green : SeaGreen element part filling - + Verd : VerdMar Green : ForestGreen element part filling - + Verd : VerdBosc Green : Green element part filling - + Verd : Verd Green : DarkGreen element part filling - + Verd : VerdFosc Cyan : Aqua element part filling - + Cian : Aigua Cyan : Cyan element part filling - + Cian : Cian Cyan : LightCyan element part filling - + Cian : CianClar Cyan : PaleTurquoise element part filling - + Cian : TurquesaPàl·lid Cyan : Aquamarine element part filling - + Cian : AiguaMarina Cyan : Turquoise element part filling - + Cian : Turquesa Cyan : MediumTurquoise element part filling - + Cian : TurquesaMitjà Cyan : DarkTurquoise element part filling - + Cian : TurquesaFosca Cyan : LightSeaGreen element part filling - + Cian : VerdMarClar Cyan : CadetBlue element part filling - + Cian : BlauCadet Cyan : DarkCyan element part filling - + Cian : CianFosc Cyan : Teal element part filling - + Cian : VerdBlau Blue : LightSteelBlue element part filling - + Blau : BlauAcerClar Blue : PowderBlue element part filling - + Blau : BlauEnPols Blue : LightBlue element part filling - + Blau : BlauClar Blue : SkyBlue element part filling - + Blau : BlauCel Blue : LightSkyBlue element part filling - + Blau : BlauCelClar Blue : DeepSkyBlue element part filling - + Blau : BlauCelFosc Blue : DodgerBlue element part filling - + Blau : BlauDodger Blue : CornflowerBlue element part filling - + Blau : BlauBlauet Blue : SteelBlue element part filling - + Blau : BlauAcer Blue : RoyalBlue element part filling - + Blau : BlauReial Blue : Blue element part filling - + Blau : Blau Blue : MediumBlue element part filling - + Blau : BlauMitjà Blue : DarkBlue element part filling - + Blau : BlauFosc Blue : Navy element part filling - + Blau : Blaumarí Blue : MidnightBlue element part filling - + Blau : BlauMitjaNit Purple : Lavender element part filling - + Lila : Lavanda Purple : Thistle element part filling - + Lila : Cardo Purple : Plum element part filling - + Lila : Pruna Purple : Violet element part filling - + Lila : Violeta Purple : Orchid element part filling - + Lila : Orquídia Purple : Fuchsia element part filling - + Lila : Fúcsia Purple : Magenta element part filling - + Lila : Magenta Purple : MediumOrchid element part filling - + Lila : OrquídiaMitjà Purple : MediumPurple element part filling - + Lila : LilaMitjà Purple : BlueViolet element part filling - + Lila : BlauVioleta Purple : DarkViolet element part filling - + Lila : VioletaFosc Purple : DarkOrchid element part filling - + Lila : OrquídiaFosc Purple : DarkMagenta element part filling - + Lila : MagentaFosc Purple : Purple element part filling - + Lila : Lila Purple : Indigo element part filling - + Lila : Indi Purple : DarkSlateBlue element part filling - + Lila : BlauPissarraFosc Purple : SlateBlue element part filling - + Lila : BlauPissarra Purple : MediumSlateBlue element part filling - + Lila : BlauPissarraMitjà White : White element part filling - + Blanc : Blanc White : Snow element part filling - + Blanc : Neu White : Honeydew element part filling - + Blanc : Melissada White : MintCream element part filling - + Blanc : CremaDeMenta White : Azure element part filling - + Blanc : Safir White : AliceBlue element part filling - + Blanc : BlauAlicia White : GhostWhite element part filling - + Blanc : BlancFantasma White : WhiteSmoke element part filling - + Blanc : FumBlanc White : Seashell element part filling - + Blanc : Petxina White : Beige element part filling - + Blanc : Beix White : OldLace element part filling - + Blanc : EncaixVell White : FloralWhite element part filling - + Blanc : BlancFloral White : Ivory element part filling - + Blanc : Marfil White : AntiqueWhite element part filling - + Blanc : BlancAntic White : Linen element part filling - + Blanc : Lli White : LavenderBlush element part filling - + Blanc : RuborDeLavanda White : MistyRose element part filling - + Blanc : RosaEnboirada Gray : Gainsboro element part filling - + Gris : Gainsboro Gray : LightGray element part filling - + Gris : GrisClar Gray : Silver element part filling - + Gris : Plata Gray : DarkGray element part filling - + Gris : GrisFosc Gray : Gray element part filling - + Gris : Gris Gray : DimGray element part filling - + Gris : DimGray Gray : LightSlateGray element part filling - + Gris : GrisPissarraClar Gray : SlateGray element part filling - + Gris : GrisPissarra Gray : DarkSlateGray element part filling - + Gris : GrisPissarraFosc Gray : Black element part filling - + Gris : Negre @@ -12520,13 +12595,13 @@ Les autres champs ne sont pas utilisés. Hachures gauche element part filling - Línies Diagonals + Eclosió esquerra Hachures droite element part filling - Línies Diagonals + Eclosió dreta @@ -12536,7 +12611,7 @@ Les autres champs ne sont pas utilisés. Remplissage : - Emplenament: + Farciment : @@ -12547,27 +12622,27 @@ Les autres champs ne sont pas utilisés. Apparence : - Aparença: + Aparença : Contour : - Contorn: + Contorn : Style : - Estil: + Estil : Épaisseur : - + Gruix : Géométrie : - Geometria: + Geometria : @@ -12592,7 +12667,7 @@ Les autres champs ne sont pas utilisés. style remplissage - estil d'emplenament + estil de farciment @@ -12600,32 +12675,32 @@ Les autres champs ne sont pas utilisés. Form - Formulari + Formulari Informations disponibles - + Informació disponible Information à afficher - + Informació per mostrar Configuration - + Configuració Requête SQL : - + Consulta SQL: Position - Posició + Posició @@ -12653,32 +12728,32 @@ Les autres champs ne sont pas utilisés. Générique - + Genèric Bornier intérieur - + Bloc de borns interior Bornier extérieur - + Bloc de borns exterior Modifier l'orientation d'une borne - Modificar l'orientació d'un born + Modifica l'orientació d'un born Modifier le nom du terminal - + Modifica el nom del born Modifier le type d'une borne - + Modifica el tipus d'un born @@ -12688,32 +12763,32 @@ Les autres champs ne sont pas utilisés. Form - Formulari + Formulari y : - + y : Orientation : - + Orientació : x : - + x : Nom : - Nom: + Nom : Type : - Tipus: + Tipus : @@ -12721,32 +12796,32 @@ Les autres champs ne sont pas utilisés. Création groupe de bornes - + Creació del grup de borns Localisation : - + Localització : Nom : - Nom: + Nom : Installation : - Instal·lació: + Instal·lació : Description : - + Descripció : Commentaire : - + Comentari : @@ -12754,158 +12829,158 @@ Les autres champs ne sont pas utilisés. Propriétés - Propietats + Propietats Nom : - Nom: + Nom: Commentaire : - + Comentari : Installation : - Instal·lació: + Instal·lació : Type : - Tipus: + Tipus: Form - Formulari + Formulari Disposition - + Disposició Sans - + Sense Avec - + Amb Effectuer le déplacement - + Efectua el desplaçament Étage : - + Etapa : Couleur pont : - + Color del pont: Générique - + Genèric Fusible - + Fusible Sectionnable - + Seccionable Diode - + Díode Terre - Terra + Terra LED : - + LED : Déplacer dans : - + Desplaçar-se dins : Phase - Fase + Fase Neutre - Neutre + Neutre Position automatique - + Posició automàtica Grouper les bornes - + Agrupa els borns Degrouper les bornes - + Desagrupa els borns Ponter les bornes - + Puntegeu dels borns Déponter les bornes - + Traieu el pont dels borns Localisation : - + Localització : Description - + Descripció Fonction : - Funció: + Funció: Bornes indépendantes - + Borns independents Modifier des propriétés de borniers - + Modifica les propietats del bloc de borns @@ -12913,42 +12988,42 @@ Les autres champs ne sont pas utilisés. Gestionnaire de borniers - + Gestor de blocs de borns toolBar - + barra d'eines Ajouter un bornier - + Afegeix el bloc de borns Ajouter un bornier au projet - + Afegeix el bloc de borns al projecte Supprimer le bornier - + Suprimeix el bloc de borns Supprimer le bornier du projet - + Suprimeix el bloc de borns del projecte Recharger - Recarregar + Recarrega Recharger les borniers - + Recarrega els borns @@ -12956,7 +13031,7 @@ Les autres champs ne sont pas utilisés. plan de bornes - + pla de borns @@ -12964,117 +13039,117 @@ Les autres champs ne sont pas utilisés. Form - Formulari + Formulari Borne niveau 0 : - + Born de nivell 0 : En tête : - + A la part superior : Point de pont - + Punt de pont Décalage vertical - + Desplaçament vertical Afficher l'aide - + Mostra l'ajuda Largeur - + Amplada Hauteur - + Alçada Prévisualisation : - + Vista prèvia : Gauche - Esquerra + Esquerra Centre - + Centre Droite - Dreta + Dreta Alignement du texte d'en tête : - + Alineació del text de la capçalera : Alignement du texte de borne : - + Alineació del text del born : Horizontal - Horitzontal + Horitzontal Vertical - Vertical + Vertical Orientation du texte de borne : - + Orientació del text de born: Orientation du texte d'en tête : - + Orientació del text de la capçalera : Borne niveau 2 : - + Born de nivell 2 : Espace : - + Espai : Borne niveau 3 : - + Born de nivell 3 : Borne niveau 1 : - + Born de nivell 1 : @@ -13082,52 +13157,52 @@ Les autres champs ne sont pas utilisés. Position - Posició + Posició Étage - + Nivell Label - Etiqueta + Etiqueta Numéro de conducteur - + Número de conductor Référence croisé - + Referència creuada Câble - + Cable Couleur / numéro de fil câble - + Color / número de fil del cable Type - Tipus + Tipus Fonction - Funció + Funció led - + led @@ -13135,7 +13210,7 @@ Les autres champs ne sont pas utilisés. Plan de bornes - + Pla de borns @@ -13143,17 +13218,17 @@ Les autres champs ne sont pas utilisés. Projet sans titre - Projecte sense títol + Projecte sense títol Bornes indépendante - + Borns independents Explorateur de bornier - + Explorador de borns @@ -13161,69 +13236,69 @@ Les autres champs ne sont pas utilisés. Modifier le contenu d'un champ texte - Modificar el contingut d'un camp de text + Canvia el contingut d'un camp de text Déplacer un champ texte - Moure un camp de text + Mou un camp de text Pivoter un champ texte - + Gira un camp de text Modifier la police d'un texte - + Canvia la font d'un text Modifier la couleur d'un texte - + Canvia el color d'un text Form - Formulari + Formulari Y : - + Y : Police : - Tipus de lletra: + Tipus de lletra : ° - + ° Rotation : - + Rotació : X : - + X : Entrer votre texte ici - + Introdueix el teu text aquí Couleur : - Color: + Color : @@ -13231,17 +13306,17 @@ Les autres champs ne sont pas utilisés. Logiciel tiers requis - + Cal programari de tercers Télechargement - + Descarregar Dossier installation - + Carpeta d'instal·lació @@ -13250,7 +13325,7 @@ Les autres champs ne sont pas utilisés. Largeur : default dialog label - Amplada: + Amplada : @@ -13297,13 +13372,13 @@ Les autres champs ne sont pas utilisés. Éditer ce modèle menu entry - Editar aquest model + Edita aquest model Dupliquer et éditer ce modèle menu entry - + Duplica i edita aquest model @@ -13314,12 +13389,12 @@ Les autres champs ne sont pas utilisés. Créer un Folio Numérotation Auto - Crear un Full de numeració automàtica + Crea un full de numeració automàtica Modèle : - Model: + Model : @@ -13329,17 +13404,17 @@ Les autres champs ne sont pas utilisés. Folio : - Full: + Full : Auteur : - Autor: + Autor : Disponible en tant que %filename pour les modèles de cartouches - Disponible com a %filename per als caixetins del projecte + Disponible com a %filename per a models de caixetins @@ -13354,7 +13429,7 @@ Les autres champs ne sont pas utilisés. Appliquer la date actuelle - Aplicar la data actual + Aplica la data actual @@ -13369,27 +13444,27 @@ Les autres champs ne sont pas utilisés. Indice Rev: - + Índex Rev : Disponible en tant que %locmach pour les modèles de cartouches - Disponible com %locmach per als models de caixetí + Disponible com a %locmach per a models de caixetí <html><head/><body><p>Disponible en tant que %plant pour les modèles de cartouches</p></body></html> - + <html><head/><body><p>Disponible com a %plant per a models de caixetí</p></body></html> Disponible en tant que %date pour les modèles de cartouches - Disponible com %date per als models de caixetí + Disponible com a %date per a models de caixetí Date fixe : - Data fixa: + Data fixada : @@ -13398,57 +13473,61 @@ Les variables suivantes sont utilisables : - %id : numéro du folio courant dans le projet - %total : nombre total de folios dans le projet - %autonum : Folio Auto Numeration - + Disponible com a %full per a models de caixetí +Es poden utilitzar les variables següents: +- %id: Número de full actual al projecte +- %total: Nombre total de fulls al projecte +- %autonum: Numeració automàtica del full Titre : - Títol: + Títol : <html><head/><body><p>Affiche le cartouche en bas (horizontalement) ou à droite (verticalement) du folio.</p></body></html> - <html><head/><body><p>Situa el caixetí horitzontal o vertical </p></body></html> + <html><head/><body><p>Situa el caixetí a la part inferior (horitzontalment) o a la dreta (verticalment) del full. </p></body></html> Fichier : - Arxiu: + Fitxer : Date : - Data: + Data : Disponible en tant que %author pour les modèles de cartouches - Disponible com a %author per als caixetins + Disponible com a %author per als models de caixetins Disponible en tant que %title pour les modèles de cartouches - Disponible com a %title per als caixetins + Disponible com a %title per als models de caixetins Page Num: - Pàgina Núm: + Pàgina Núm : Installation : - Instal·lació: + Instal·lació : Disponible en tant que %indexrev pour les modèles de cartouches - Disponible com a %indexrev per als caixetins + Disponible com a %indexrev per als models de caixetins Localisation: - + Localització : @@ -13459,8 +13538,8 @@ Les variables suivantes sont utilisables : Vous pouvez définir ici vos propres associations noms/valeurs pour que le cartouche en tienne compte. Exemple : associer le nom "volta" et la valeur "1745" remplacera %{volta} par 1745 dans le cartouche. - Aquí podeu definir les seves pròpies associacions de nom / valor perquè sigui pres en compte en el caixetí. Exemple: -associar el nom de "volta" i el valor "1745" reemplaçarà %{volta} per 1745 dins del caixetí. + Aquí podeu definir les vostres pròpies associacions de nom/valor perquè el caixetí les pugui tenir en compte. Per exemple: +associar el nom "volta" amb el valor "1745" substituirà %{volta} per 1745 al caixetí. @@ -13482,7 +13561,7 @@ associar el nom de "volta" i el valor "1745" reemplaçarà % Type de cellule : - Tipus de cel·la: + Tipus de cel·la : @@ -13503,7 +13582,7 @@ associar el nom de "volta" i el valor "1745" reemplaçarà % Attention : les bordures des cellules vides n'apparaissent pas lors du rendu final sur le folio. - Avís: les vores de les cel·les buides no es veuen durant el renderitzat final del full. + Avís : les vores de les cel·les buides no es veuen durant el renderitzat final del full. @@ -13513,38 +13592,38 @@ associar el nom de "volta" i el valor "1745" reemplaçarà % Gérer les logos - Gestionar logos + Gestiona els logos Nom : - Nom: + Nom : Afficher un label : - Mostrar una etiqueta: + Mostra una etiqueta : Editer - Editar + Edita Texte : - Text: + Text : Alignement : - Aliniació: + Alineació : horizontal : - horitzontal: + horitzontal : @@ -13564,12 +13643,12 @@ associar el nom de "volta" i el valor "1745" reemplaçarà % vertical : - vertical: + vertical : Haut - Dalt + Superior @@ -13579,17 +13658,17 @@ associar el nom de "volta" i el valor "1745" reemplaçarà % Bas - Sota + Inferior Police : - Tipus de lletra: + Tipus de lletra : Ajuster la taille de police si besoin - Ajustar la mida del text si fos necessari + Ajusta la mida del text si fos necessari @@ -13604,12 +13683,12 @@ associar el nom de "volta" i el valor "1745" reemplaçarà % Par défaut, les variables suivantes sont disponibles :<ul><li>%{author} : auteur du folio</li><li>%{date} : date du folio</li><li>%{title} : titre du folio</li><li>%{filename} : nom de fichier du projet</li><li>%{plant} : nom de l'installation (=) dans laquelle se trouve le folio</li><li>%{locmach} : nom de la localisation (+) dans laquelle se trouve le folio</li><li>%{indexrev} : indice de révision du folio</li><li>%{version} : version du logiciel</li><li>%{folio} : numéro du folio</li><li>%{folio-id} : position du folio dans le projet</li><li>%{folio-total} : nombre total de folios dans le projet</li><li>%{previous-folio-num} : numéro du folio précédent</li><li>%{next-folio-num} : numéro du folio suivant</li><li>%{projecttitle} : titre du projet</li><li>%{projectpath} : chemin du projet</li><li>%{projectfilename} : nom du fichier</li><li>%{saveddate} : date d'enregistrement du fichier format local</li><li>%{saveddate-eu} : date d'enregistrement du fichier format dd-MM-yyyy</li><li>%{saveddate-us} : date d'enregistrement du fichier format yyyy-MM-dd</li><li>%{savedtime} : heure d'enregistrement du fichier</li><li>%{savedfilename} : nom du fichier enregistré</li><li>%{savedfilepath} : chemin du fichier enregistré</li></ul> - + Per defecte, les variables següents estan disponibles: <ul><li>%{author}: Autor del full</li><li>%{date}: Data del full</li><li>%{title}: Títol del full</li><li>%{filename}: Nom del fitxer del projecte</li><li>%{plant}: Nom de la instal·lació (=) on es troba el full</li><li>%{locmach}: Nom de la ubicació (+) on es troba el full</li><li>%{indexrev}: Índex de revisió del full</li><li>%{version}: Versió del programari</li><li>%{folio}: Número de full</li><li>%{folio-id}: Posició del full al projecte</li><li>%{folio-total}: ​​​​Nombre total de fulls al projecte</li><li>%{previous-folio-num}: Número de full anterior</li><li>%{next-folio-num}: Número del següent full</li><li>%{projecttitle}: projecte title</li><li>%{projectpath}: ruta del projecte</li><li>%{projectfilename}: nom del fitxer</li><li>%{saveddate}: Data de desament del fitxer en format local</li><li>%{saveddate-eu}: Data de desament del fitxer en format dd-MM-aaaa</li><li>%{saveddate-us}: Data de desament del fitxer en format aaaa-MM-dd</li><li>%{savedtime}: Hora de desament del fitxer</li><li>%{savedfilename}: Nom del fitxer desat</li><li>%{savedfilepath}: Ruta del fitxer desat</li></ul> Chaque cellule d'un cartouche affiche une valeur, optionnellement précédée d'un label. Tous deux peuvent être traduits en plusieurs langues.<br/>Comme ce que vous éditez actuellement est un <em>modèle</em> de cartouche, ne saisissez pas directement des données brutes : insérez plutôt des variables sous la forme %{nom-de-variable}, qui seront ensuite remplacées par les valeurs adéquates sur le folio. - Cada cel·la d'un caixetí mostra un valor, precedit opcionalment per una etiqueta. Tots dos poden ésser traduits en múltiples llengües.<br/>Com que el que está editant ara mateix és un <em>model</em> de caixetí, no insereixi informació absoluta. És millor inserir variables en format %{nom-de-variable}. Les variables quedaran substituïdes automàticament al full per llurs valors. + Cada cel·la d'un caixetí mostra un valor, precedit opcionalment per una etiqueta. Ambdues poden ésser traduits a múltiples llengües.<br/>Com que el que estàs editant ara mateix és un <em>model</em> de caixetí, no insereixis informació absoluta. És millor inserir variables en format %{nom-de-variable}. Les variables quedaran substituïdes automàticament al full per llurs valors. @@ -13621,7 +13700,7 @@ associar el nom de "volta" i el valor "1745" reemplaçarà % Édition d'une cellule : %1 label of and undo command when editing a cell - Edició d'una cel·la: %1 + Edició d'una cel·la : %1 @@ -13630,14 +13709,15 @@ associar el nom de "volta" i el valor "1745" reemplaçarà % Supprimer le modèle de cartouche ? message box title - Suprimir el caixetí? + Suprimir el model de caixetí? Êtes-vous sûr de vouloir supprimer ce modèle de cartouche (%1) ? message box content - Esteu segur que voleu suprimir aquest caixetí (%1) ? + Esteu segur que voleu suprimir aquest model de caixetí (%1) ? + @@ -13668,7 +13748,7 @@ associar el nom de "volta" i el valor "1745" reemplaçarà % Nouveau modèle (entrez son nom) combox box entry - Model nou (entri'n el nom) + Nou model (introduïu-ne el nom) @@ -13686,17 +13766,17 @@ associar el nom de "volta" i el valor "1745" reemplaçarà % Ajouter un logo - Afegir un logo + Afegeix un logo Exporter ce logo - Exportar aquest logo + Exporta aquest logo Supprimer ce logo - Suprimir aquest logo + Suprimeix aquest logo @@ -13706,13 +13786,13 @@ associar el nom de "volta" i el valor "1745" reemplaçarà % Nom : - Nom: + Nom : Renommer - Canviar el nom + Canvia el nom @@ -13723,22 +13803,22 @@ associar el nom de "volta" i el valor "1745" reemplaçarà % Logo déjà existant - Logo existent + Logo ja existent Remplacer - Substituïr + Substitueix Il existe déjà un logo portant le nom "%1" au sein de ce modèle de cartouche. Voulez-vous le remplacer ou préférez-vous spécifier un autre nom pour ce nouveau logo ? - Ja existeix un logo anomenat "%1" dins d'aquest model de caixetí. Vol substituïr-lo pel nou o prefereix donar-li un altre nom? + Ja hi ha un logo amb el nom "%1" dins d'aquest model de caixetí. Vols substituir-lo o prefereixes especificar un altre nom per a aquest nou logotip? Type : %1 - Tipus: %1 + Tipus : %1 @@ -13764,7 +13844,7 @@ associar el nom de "volta" i el valor "1745" reemplaçarà % Choisir un fichier pour exporter ce logo - Triï un fitxer per exportar aquest logo + Tria un fitxer on exportar aquest logo @@ -13779,22 +13859,22 @@ associar el nom de "volta" i el valor "1745" reemplaçarà % Renommer un logo - Reanomenar un logo + Canvia el nom a un logo Vous devez saisir un nouveau nom. - Cal donar un nom nou. + Heu d'introduir un nom nou. Le nouveau nom ne peut pas être vide. - El nom nou no pot ésser buit. + El nom nou no pot estar buit. Le nom saisi est déjà utilisé par un autre logo. - El nom triat ja correspon a un altre logo. + El nom introduït ja l'utilitza un altre logo. @@ -13803,7 +13883,7 @@ associar el nom de "volta" i el valor "1745" reemplaçarà % Changer la largeur de la colonne window title when changing a column with - Canviar l'amplada de la columna + Canvia l'amplada de la columna @@ -13815,49 +13895,49 @@ associar el nom de "volta" i el valor "1745" reemplaçarà % Changer la hauteur de la ligne window title when changing a row height - Canviar l'alçada de la línia + Canvia l'alçada de la línia Hauteur : text before the spinbox to change a row height - Alçada: + Alçada : Ajouter une colonne (avant) context menu - Afegir una columna (abans) + Afegeix una columna (abans) Ajouter une ligne (avant) context menu - Afegir una línia (abans) + Afegeix una línia (abans) Ajouter une colonne (après) context menu - Afegir una columna (després) + Afegeix una columna (després) Ajouter une ligne (après) context menu - Afegir una línia (després) + Afegeix una línia (després) Modifier les dimensions de cette colonne context menu - Variar les mides d'aquesta columna + Canvia les dimensions d'aquesta columna Modifier les dimensions de cette ligne context menu - Variar les mides d'aquesta línia + Canvia les dimensions d'aquesta línia @@ -13875,7 +13955,7 @@ associar el nom de "volta" i el valor "1745" reemplaçarà % Modifier la largeur de cet aperçu context menu - Modificar l'amplada d'aquesta vista prèvia + Modifica l'amplada d'aquesta vista prèvia @@ -13887,7 +13967,7 @@ associar el nom de "volta" i el valor "1745" reemplaçarà % [%1px] content of the extra helper cell added when the total width of cells is greater than the preview width - [%1px] + [%1px] @@ -13903,12 +13983,12 @@ associar el nom de "volta" i el valor "1745" reemplaçarà % Changer la largeur de l'aperçu - Canviar l'amplada de la vista prèvia + Canvia l'amplada de la vista prèvia Largeur de l'aperçu : - Amplada de la vista prèvia: + Amplada de la vista prèvia : @@ -13916,21 +13996,23 @@ associar el nom de "volta" i el valor "1745" reemplaçarà % Longueur maximale : %2px tooltip showing the minimum and/or maximum width of the edited template - Longitud mínima: %1px -Longitud màxima: %2px + Longitud mínima : %1px +Longitud màxima : %2px + Longueur minimale : %1px tooltip showing the minimum width of the edited template - Longitud mínima: %1px + Longitud mínima : %1 + Largeur totale pour cet aperçu : %1px displayed at the top of the preview when editing a title block template - Longitud total d'aquesta vista prèvia: %1px + Amplada total d'aquesta vista prèvia: %1px @@ -13940,13 +14022,13 @@ Longitud màxima: %2px Cartouches du projet sans titre (id %1) collection title when the parent project has an empty title -- %1 is the project internal id títol de la col·lecció quan el projecte pare no tingui títol -- %1 és l'identificador intern de projecte - Caixetins sense títol (id %1) + Caixetins de projecte sense títol (id %1) Cartouches du projet "%1" collection title when the project has a suitable title -- %1 is the project title - Caixetins "%1" + Caixetins del projecte "%1" @@ -13969,42 +14051,42 @@ Longitud màxima: %2px Positionner : - Posició: + Posició : XRef Vertical Offset: - XRef Vertical Offset: + Desplaçament vertical de la XRef : 10px corresponds to 1 tile displacement - 10px correspon a 1 desplaçament + 10 px corresponen a 1 desplaçament de tessel·la Set Vertical Offset for the Cross References. 10px corresponds to 1 tile displacement. - Ajust desviació vertical de les referències creuades. 10px correspon a 1 desplaçament. + Defineix el desplaçament vertical per a les referències creuades. 10 px corresponen a 1 desplaçament de tessel·la. Default - Fit to XRef height - Per defecte - Ajustar a l'altura XRef + Per defecte - Ajusta a l'alçada de la XRef XRef slave position - + Posició de l'esclau XRef Affiche&r en contacts - Veure contactes + &Mostra en contactes Afficher en croix - Veure en creu + Mostra len creu @@ -14040,23 +14122,23 @@ Longitud màxima: %2px %c : le numéro de colonne %M: Installation %LM: Localisation - Crear el seu propi text, ajudat de les següents variables: -%f : el nombre del full -%F: la etiqueta del full -%l : el nombre de línia -%c : el nombre de columna -%M: Instal·lació -%LM: Ubicació + Crea el teu propi text utilitzant les variables següents : +%f : Número del full +%F : Etiqueta del full +%l : Número de línia +%c : Número de columna +%M : Instal·lació +%LM : Ubicació Option d'affichage en croix - Opció de presentació en creu + Opció de visualització en creu Afficher les contacts de puissance dans la croix - Mostrar els contactes de potència en la creu + Mostra els contactes de potència a la creu @@ -14066,12 +14148,12 @@ Longitud màxima: %2px Préfixe des contacts temporisés : - Prefix de contactes temporitzats: + Prefix dels contactes temporitzats : Préfixe des contacts inverseurs : - Prefix de contactes inversors: + Prefix dels contactes inversors : @@ -14091,37 +14173,37 @@ Longitud màxima: %2px En bas de page - A baix de la pàgina + A la part inferior de la pàgina Sous le label de l'élément - Sota l'etiqueta de símbol + Sota l'etiqueta de l'element Top - + Superior Bottom - + Inferior Left - + Esquerra Right - + Dreta Text alignment - + Alineació del text @@ -14144,7 +14226,7 @@ Longitud màxima: %2px Projet : - Projecte: + Projecte : @@ -14164,7 +14246,7 @@ Longitud màxima: %2px Désélectionner tout - Deseleccionar tot + Desselecciona-ho tot @@ -14175,14 +14257,14 @@ Longitud màxima: %2px projectDataBase - + Exporter la base de données interne du projet - + Exporta la base de dades interna del projecte - + sans_nom - + sense_nom @@ -14198,7 +14280,7 @@ Longitud màxima: %2px Insert HTML entity - Inserir entitat HTML + Insereix entitat HTML @@ -14221,7 +14303,7 @@ Longitud màxima: %2px &OK - &OK + &D'acord @@ -14249,7 +14331,7 @@ Longitud màxima: %2px Left Align - Alineació Esquerra + Alinea a l'Esquerra @@ -14259,7 +14341,7 @@ Longitud màxima: %2px Right Align - Alineació Dreta + Alinea a la Dreta @@ -14279,17 +14361,17 @@ Longitud màxima: %2px Insérer un lien - Inserir un vincle + Insereix un enllaç Insert &Image - Inserir &Imatge + Insereix una &Imatge Simplify Rich Text - Simplificar text enriquit + Simplifica el text enriquit @@ -14297,52 +14379,52 @@ Longitud màxima: %2px Rechercher/Remplacer avancé - + Cerca o substitució endavant par : - + per : Remplacer : - + Substitueix : Qui : - + De què : Texte ou expression régulière - + Text o expressió regular Folio - Full + Full Élément - Símbol + Element Conducteur - Conductor + Conductor Texte indépendant - + Text independent Quoi : - + Què : From 78a26f9175b592977c8ba5710d568591830f0db1 Mon Sep 17 00:00:00 2001 From: Laurent Trinques Date: Tue, 4 Nov 2025 15:06:07 +0100 Subject: [PATCH 51/65] Update Catalan Translation, thanks Antoni --- CREDIT | 30 ++++++++++++ ELEMENTS.LICENSE | 7 ++- INSTALL | 22 ++++----- README | 4 ++ build-aux/linux/fedora/README.elements | 4 ++ man/files/ca/man1/qelectrotech.1.gz | Bin 0 -> 1501 bytes misc/org.qelectrotech.qelectrotech.desktop | 51 +++++++++++---------- misc/qelectrotech.appdata.xml | 5 ++ misc/qelectrotech.xml | 6 +-- 9 files changed, 86 insertions(+), 43 deletions(-) create mode 100644 man/files/ca/man1/qelectrotech.1.gz diff --git a/CREDIT b/CREDIT index 0c09dd918..aee8774a4 100644 --- a/CREDIT +++ b/CREDIT @@ -1,3 +1,33 @@ +[ca] +Gràcies a Qt Software per la biblioteca Qt ( http://www.qtsoftware.com/ ), amb llicència GNU/GPL. +Gràcies al projecte KDE ( http://www.kde.org/ ). +Gràcies a Loic per les seves explicacions d'ordre matemàtic. +Gràcies a Remi Collet pels paquets Fedora. +Gràcies a Laurent Trinques pels paquets Debian. +Gràcies a `trem' pels paquets Mandriva. +Gràcies a TuxFamily ( http://tuxfamily.org/ ) per a l'allotjament del projecte. +Gràcies a `Nishiki' pels seus elements i el seu suport suport. +Gràcies a qtcentre.org per la seva classe SingleApplication. +Gràcies a Alfredo Carreto per les seves traduccions i correccions al castellà ( http://electronicosmx.net ) +Gràcies a 'Dr.Slump' et Sivio pour leurs traductions a l'italià +Gràcies a Jose Carlos Martins per les seves traduccions al portuguès +Gràcies a Pavel Fric per les seves traduccions al txec +Gràcies a Pawel Smiech per les seves traduccions al polonès +Gràcies a Yuriy Litkevich per les seves traduccions al rus +Gràcies a Youssef Ouamalkran i Antoni Mirabete per les seves traduccions al català +Gràcies a Gabi Mandoc per les seves traduccions al romanès +Gràcies a Markus Budde i Jonas Stein et Noah Braden per les seves traduccions a l'alemany +Gràcies a Mohamed Souabni per les seves traduccions a l'àrab +Gràcies a Uroš Platiše per les seves traduccions a l'eslovè +Gràcies a Antun Marakovic per les seves traduccions al croat +Gràcies a Nikos Papadopoylos && Yannis Gyftomitros per les seves traduccions al grec +Gràcies a Markos Chandras pels paquets Gentoo +Gràcies a David pels paquets Slackware +Gràcies a Chipsterjulien pels paquets Archlinux AUR +Gràcies a Elbert de NL pels paquets OS/2 +Gràcies a Zloidemon pels paquets (port GCC) +Gràcies a Mrbit per ebuild els paquets Gentoo + [en] Thanks to Qt Software for their Qt library ( http://www.qtsoftware.com/ ), licensed under GNU/GPL. Thanks to the KDE project ( http://www.kde.org/ ). diff --git a/ELEMENTS.LICENSE b/ELEMENTS.LICENSE index b82799b0b..0e9288b4e 100644 --- a/ELEMENTS.LICENSE +++ b/ELEMENTS.LICENSE @@ -41,9 +41,6 @@ fähigkeit zur Verfügung gestellt. Die Verwendung, Modifikation und Integration der Elemente in elektrische Schaltpläne ist uneingeschränkt erlaubt, unabhängig von der endgültigen Lizenz der Schaltpläne. -Es ist nicht gestattet, diese Software oder eine der zugehörigen Dateien -als Beispieldaten für die Erstellung von Modellen für maschinelles Lernen -zu verwenden. Wenn Sie die gesamte QElectroTech-Sammlung oder Teile davon, mit oder ohne Modifikationen, aus einem Schaltplan weitergeben, müssen Sie die Bedingungen der CC-BY-Lizenz einhalten. @@ -163,6 +160,7 @@ http://creativecommons.org/licenses/by/3.0/ ή στείλτε μια επιστ Commons, 171 Second Street, Suite 300, San Francisco, California, 94105, USA. [nl] + De elementen collectie voorzien, samen met QElectroTech wordt geleverd als en zonder enige garantie van geschiktheid voor uw doel of werk. Het gebruik, de wijziging en de integratie van de elementen in elektrische @@ -177,7 +175,8 @@ http://creativecommons.org/licenses/by/3.0/ of stuur een brief naar Creative Commons, 171 Second Street, Suite 300, San Francisco, California, 94105, USA. [be] -De elementen collectie welke samen met QElectroTech wordt geleverd zonder enige garantie + +De elementen collectie welke samen met QElectroTech wordt geleverd zonder enige garantie of deze geschikt zijn voor uw doel of de werking. Het gebruik, wijzigen en integratie van de elementen in uw elektrische schema's wordt toegestaan zonder enige voorwaarden, ongeacht wat de uiteindelijke diff --git a/INSTALL b/INSTALL index 03508f7ad..bb2bfe21c 100644 --- a/INSTALL +++ b/INSTALL @@ -1,3 +1,14 @@ +[ca] +Dependències: +libQt5 (paquets libqt5*) +cupsys-bsd per imprimir + +Com compilar: +$ qmake (qmake-qt5 pels sistemes basats en Debian) +$ make +# umask 0022 +# make install + [en] Requirements : libQt5 (see packages libqt5*) @@ -64,17 +75,6 @@ $ make # umask 0022 # make install -[ca] -Dependències: -libQt5 (paquets libqt5*) -cupsys-bsd per imprimir - -Com compilar: -$ qmake (qmake-qt5 pels sistemes basats en Debian) -$ make -# umask 0022 -# make install - [cs] Požadavky : libQt5 (viz balíček libqt5*) diff --git a/README b/README index b38cd8f41..d35aac646 100644 --- a/README +++ b/README @@ -1,3 +1,7 @@ +[ca] +QElectroTech és una aplicació Qt5 per crear esquemes elèctrics. +QET utilitza el format XML per als seus elements i esquemes i inclou un editor d'esquemes, un editor d'elements i un editor de caixetins. + [en] QElectroTech is a Qt5 application to design electric diagrams. It uses XML files for elements and diagrams, and includes both a diagram editor, a element editor, and an titleblock editor. diff --git a/build-aux/linux/fedora/README.elements b/build-aux/linux/fedora/README.elements index 2c86f9538..9530b30cd 100644 --- a/build-aux/linux/fedora/README.elements +++ b/build-aux/linux/fedora/README.elements @@ -1,3 +1,6 @@ +[ca] +Col·lecció d'elements per a QElectroTech. + [fr] Collection d'éléments pour QElectroTech. @@ -10,6 +13,7 @@ Bauteilsammlung für QElectroTech. [es] Collección de elementos para QElectroTech. + [pt] Colecção de elementos para QElectroTech. diff --git a/man/files/ca/man1/qelectrotech.1.gz b/man/files/ca/man1/qelectrotech.1.gz new file mode 100644 index 0000000000000000000000000000000000000000..99ea687366398a5e17323c68defcd0ec8c577457 GIT binary patch literal 1501 zcmV<31tR(%iwFqY>IG>4194?+Wn*-5Z**m2Xf81Ty;i|)8#fTW?^h7MC~obQlT%?h zZe@96tFR?iS|TM5#;5GN=qzf-gI*l9PuX*})jH`7WAx|Nb$jQ*l_<>|nT>W?l!DU+4TZfbL?$c~a`6EzAhG_?u+#1Jhn*liV)e7M z{(iJO+D&wpX*Jr#y-X-)N4qJQ(PZ#)H0cbY{%CUaL(NuAVEUAWv-W_(PSQJxl< zZOk}s%tL|KgP3h8TA9- zJjd28*MKe%qGG&s%n?SR2)8@b@#^J$Pt>MP`TwCn|Diq`1#b|vg-N*Ytr9|?f-^iV zl8sQ^FXP%BB%0*(Tw8SEK^+@WkPIaT@;isvYlH^1S51Fbo=9+a*t+7@{9*+D+&MWCe#UKcgeqk_#RnxrVNH4SnOwRehKoRLSCA-6T#nPIM6%+&BM~Py1B+9({ z^dJLJiPToxH7a?88hUI1*@@a*!-2MpNW}z{fExnUbBZS1{n3D-?^J!DF|P+o0W0b@ zAO)TAZ5j=>%FkatqQ>r#Qu*jYq^dt7)YC9`9YfC=&k-YQk zM~vG)8j#_{@WMJ^2MH}VnEF&Z-B-QAdBlzzsAD}$8mog=W9%+2r$yOdIA}SciNF(~ zC3VgkV`(ZE(%~WMHbw10Gu#ODKs=flakcoztMb9jxqQFbydO{V8s0-Q)$fZipXFae z`ZCqY{)As0vWhR{lpPh*7;E<)k$%+ExR|=qrg`Y!7juDVlRlKajRJ?g{jPlAVCWd7 z3mGP^G_pfs*$U!P+1i50WQ_K2AH(OR1jt$-%ZKG4iV;TSP7kGA=ZN}r=GdoO|7i5D zzqyu0&Qo0~d!5oHDOLiw&nm@Z^A}&@YMJZx^>sK^g-^2*QQOoqy^~bioaS=0`y$*6 zXD*W^AvRW7iLQFsv_dffU4Tv2;?0SN;j@-QyIpou?-gdpWWK#&X6K;#hE zFzOB?)^7FLNo&yR#+_CL&Fko55V5#*ezf={cq7J4Pe=)6EwKkhJPiH?w&~q7{R{vA DJksd& literal 0 HcmV?d00001 diff --git a/misc/org.qelectrotech.qelectrotech.desktop b/misc/org.qelectrotech.qelectrotech.desktop index ac52a7ceb..6a968d5e5 100644 --- a/misc/org.qelectrotech.qelectrotech.desktop +++ b/misc/org.qelectrotech.qelectrotech.desktop @@ -10,37 +10,38 @@ MimeType=application/x-qet-project;application/x-qet-element;application/x-qet-t Categories=Graphics;Qt;VectorGraphics;Science;Electricity;Engineering; Keywords=Graphics;Science;Electricity;Engineering; Comment=Edit electrical diagrams. -Comment[ar]=تحرير مخططات كهربائية -Comment[be]=Bewerken elektrisch schema. -Comment[ca]=Editar esquemes elèctrics. -Comment[cs]=Editor výkresů elektrických obvodů -Comment[da]=Rediger elektriske diagrammer. +Comment[ca]=Edita esquemes elèctrics. Comment[de]=Elektroschaltpläne erstellen und bearbeiten. -Comment[el]=Επεξεργασία ηλεκτρικών διαγραμμάτων -Comment[es]=Editar esquemas eléctricos Comment[fr]=Éditer des schémas électriques. -Comment[hr]=Uredi elektro sheme -Comment[it]=Disegnare schemi elettrici -Comment[ja]=電気回路図の編集。 -Comment[nl]=Bewerken bedradingsdiagrammen. -Comment[pl]=Edycja schematów elektrycznych -Comment[pt]=Criar esquemas eléctricos. +Comment[ar]=تحرير مخططات كهربائية +Comment[es]=Editar esquemas eléctricos Comment[ru]=Создание и редактирование электрических схем. +Comment[pt]=Criar esquemas eléctricos. +Comment[cs]=Editor výkresů elektrických obvodů +Comment[pl]=Edycja schematów elektrycznych +Comment[it]=Disegnare schemi elettrici +Comment[hr]=Uredi elektro sheme +Comment[el]=Επεξεργασία ηλεκτρικών διαγραμμάτων +Comment[nl]=Bewerken bedradingsdiagrammen. +Comment[be]=Bewerken elektrisch schema. +Comment[da]=Rediger elektriske diagrammer. +Comment[ja]=電気回路図の編集。 Comment[sk]=Úprava elektrických schém. GenericName=Electrical diagram editor -GenericName[ar]=مُحرّر مخططات كهربائية -GenericName[be]=Elektrische schema editor -GenericName[cs]=Editor výkresů elektrických obvodů -GenericName[da]=Elektrisk diagram redigering +GenericName[ca]=Editor d'esquemes elèctrics GenericName[de]=Schaltplaneditor -GenericName[el]=Επεξεργαστής ηλεκτρικών διαγραμμάτων -GenericName[es]=Editor de esquemas eléctricos GenericName[fr]=Éditeur de schémas électriques -GenericName[hr]=Editor elektro sheme -GenericName[it]=Programma per disegnare schemi elettrici -GenericName[ja]=電気回路図エディタ -GenericName[nl]=Elektrische schema editor -GenericName[pl]=Edytor schematów elektrycznych -GenericName[pt]=Editor de esquemas eléctricos. +GenericName[ar]=مُحرّر مخططات كهربائية +GenericName[es]=Editor de esquemas eléctricos GenericName[ru]=Редактор электрических схем +GenericName[pt]=Editor de esquemas eléctricos. +GenericName[cs]=Editor výkresů elektrických obvodů +GenericName[pl]=Edytor schematów elektrycznych +GenericName[it]=Programma per disegnare schemi elettrici +GenericName[hr]=Editor elektro sheme +GenericName[el]=Επεξεργαστής ηλεκτρικών διαγραμμάτων +GenericName[nl]=Elektrische schema editor +GenericName[be]=Elektrische schema editor +GenericName[da]=Elektrisk diagram redigering +GenericName[ja]=電気回路図エディタ GenericName[sk]=Editor elektrických schém diff --git a/misc/qelectrotech.appdata.xml b/misc/qelectrotech.appdata.xml index 545bbc869..6d8813464 100644 --- a/misc/qelectrotech.appdata.xml +++ b/misc/qelectrotech.appdata.xml @@ -7,6 +7,7 @@ QElectroTech

Electrical diagram editor مُحرّر مخططات كهربائية + Editor d'esquemes elèctrics Editor výkresů elektrických obvodů Zeichenprogramm für Schaltpläne Επεξεργαστής ηλεκτρικών διαγραμμάτων @@ -30,6 +31,10 @@ QElectroTech is a Qt5 application to design electric diagrams. It uses XML files for elements and diagrams, and includes both a diagram editor, an element editor, and a titleblock editor.

+

+ QElectroTech és una aplicació Qt5 per crear esquemes elèctrics. + QET utilitza el format XML per als seus elements i esquemes i inclou un editor d'esquemes, un editor d'elements i un editor de caixetins. +

QElectroTech je aplikací Qt5 určenou pro návrh nákresů elektrických obvodů. Pro prvky a nákresy používá soubory XML, a zahrnuje v sobě jak editor nákresů, tak editor prvků. diff --git a/misc/qelectrotech.xml b/misc/qelectrotech.xml index f5d00a668..7821034c5 100644 --- a/misc/qelectrotech.xml +++ b/misc/qelectrotech.xml @@ -3,11 +3,11 @@ QElectroTech project file + Fitxer de projecte QElectroTech QElectroTech Projektdatei Fichier projet QElectroTech QElectrotech ملف مشروع Fichero proyecto QElectroTech - Fitxer projecte QElectroTech Файл проекта QElectroTech Ficheiro de projecto QElectroTech Soubor s projektem pro QElectroTech @@ -23,12 +23,12 @@ QElectroTech element file + Fitxer d'element QElectroTech QElectroTech Bauteildatei Fichier élément QElectroTech QElectrotech ملف مشروع Файл элемента QElectroTech Fichero elemento QElectroTech - Fitxer símbol QElectroTech Ficheiro de projecto QElectroTech Soubor s prvkem pro QElectroTech Plik elementu QElectroTech @@ -43,13 +43,13 @@ QElectroTech title block template file + Model de caixetí QElectroTech QElectroTech Schriftfeld Vorlagedatei Modèle de cartouche QElectroTech QElectrotech نموذج إطار تعريف Файл шаблона основной надписи листа QElectroTech Szablon tabliczki rysunkowej QElectroTech Modelo de cartucho QElectroTech - Model de bloc de títol QElectroTech Vzor záhlaví výkresu pro QElectroTech Modelo de moldura QElectroTech Modello di cartiglio per QElectroTech From 3803834d6d4f684b7d9f462f4d56ac1e8c9cf817 Mon Sep 17 00:00:00 2001 From: plc-user <74435298+plc-user@users.noreply.github.com> Date: Tue, 4 Nov 2025 21:17:23 +0100 Subject: [PATCH 52/65] re-add deleted paragraph and sort language entries alphabetically --- ELEMENTS.LICENSE | 3 + misc/org.qelectrotech.qelectrotech.desktop | 48 ++++---- misc/qelectrotech.appdata.xml | 46 ++++---- misc/qelectrotech.xml | 126 ++++++++++----------- 4 files changed, 113 insertions(+), 110 deletions(-) diff --git a/ELEMENTS.LICENSE b/ELEMENTS.LICENSE index 0e9288b4e..9ac38c5d3 100644 --- a/ELEMENTS.LICENSE +++ b/ELEMENTS.LICENSE @@ -41,6 +41,9 @@ fähigkeit zur Verfügung gestellt. Die Verwendung, Modifikation und Integration der Elemente in elektrische Schaltpläne ist uneingeschränkt erlaubt, unabhängig von der endgültigen Lizenz der Schaltpläne. +Es ist nicht gestattet, diese Software oder eine der zugehörigen Dateien +als Beispieldaten für die Erstellung von Modellen für maschinelles Lernen +zu verwenden. Wenn Sie die gesamte QElectroTech-Sammlung oder Teile davon, mit oder ohne Modifikationen, aus einem Schaltplan weitergeben, müssen Sie die Bedingungen der CC-BY-Lizenz einhalten. diff --git a/misc/org.qelectrotech.qelectrotech.desktop b/misc/org.qelectrotech.qelectrotech.desktop index 6a968d5e5..c1536770b 100644 --- a/misc/org.qelectrotech.qelectrotech.desktop +++ b/misc/org.qelectrotech.qelectrotech.desktop @@ -10,38 +10,38 @@ MimeType=application/x-qet-project;application/x-qet-element;application/x-qet-t Categories=Graphics;Qt;VectorGraphics;Science;Electricity;Engineering; Keywords=Graphics;Science;Electricity;Engineering; Comment=Edit electrical diagrams. -Comment[ca]=Edita esquemes elèctrics. -Comment[de]=Elektroschaltpläne erstellen und bearbeiten. -Comment[fr]=Éditer des schémas électriques. Comment[ar]=تحرير مخططات كهربائية -Comment[es]=Editar esquemas eléctricos -Comment[ru]=Создание и редактирование электрических схем. -Comment[pt]=Criar esquemas eléctricos. -Comment[cs]=Editor výkresů elektrických obvodů -Comment[pl]=Edycja schematów elektrycznych -Comment[it]=Disegnare schemi elettrici -Comment[hr]=Uredi elektro sheme -Comment[el]=Επεξεργασία ηλεκτρικών διαγραμμάτων -Comment[nl]=Bewerken bedradingsdiagrammen. Comment[be]=Bewerken elektrisch schema. +Comment[ca]=Edita esquemes elèctrics. +Comment[cs]=Editor výkresů elektrických obvodů Comment[da]=Rediger elektriske diagrammer. +Comment[de]=Elektroschaltpläne erstellen und bearbeiten. +Comment[el]=Επεξεργασία ηλεκτρικών διαγραμμάτων +Comment[es]=Editar esquemas eléctricos +Comment[fr]=Éditer des schémas électriques. +Comment[hr]=Uredi elektro sheme +Comment[it]=Disegnare schemi elettrici Comment[ja]=電気回路図の編集。 +Comment[nl]=Bewerken bedradingsdiagrammen. +Comment[pl]=Edycja schematów elektrycznych +Comment[pt]=Criar esquemas eléctricos. +Comment[ru]=Создание и редактирование электрических схем. Comment[sk]=Úprava elektrických schém. GenericName=Electrical diagram editor -GenericName[ca]=Editor d'esquemes elèctrics -GenericName[de]=Schaltplaneditor -GenericName[fr]=Éditeur de schémas électriques GenericName[ar]=مُحرّر مخططات كهربائية -GenericName[es]=Editor de esquemas eléctricos -GenericName[ru]=Редактор электрических схем -GenericName[pt]=Editor de esquemas eléctricos. -GenericName[cs]=Editor výkresů elektrických obvodů -GenericName[pl]=Edytor schematów elektrycznych -GenericName[it]=Programma per disegnare schemi elettrici -GenericName[hr]=Editor elektro sheme -GenericName[el]=Επεξεργαστής ηλεκτρικών διαγραμμάτων -GenericName[nl]=Elektrische schema editor GenericName[be]=Elektrische schema editor +GenericName[ca]=Editor d'esquemes elèctrics +GenericName[cs]=Editor výkresů elektrických obvodů GenericName[da]=Elektrisk diagram redigering +GenericName[de]=Schaltplaneditor +GenericName[el]=Επεξεργαστής ηλεκτρικών διαγραμμάτων +GenericName[es]=Editor de esquemas eléctricos +GenericName[fr]=Éditeur de schémas électriques +GenericName[hr]=Editor elektro sheme +GenericName[it]=Programma per disegnare schemi elettrici GenericName[ja]=電気回路図エディタ +GenericName[nl]=Elektrische schema editor +GenericName[pl]=Edytor schematów elektrycznych +GenericName[pt]=Editor de esquemas eléctricos. +GenericName[ru]=Редактор электрических схем GenericName[sk]=Editor elektrických schém diff --git a/misc/qelectrotech.appdata.xml b/misc/qelectrotech.appdata.xml index 6d8813464..0dbf28b10 100644 --- a/misc/qelectrotech.appdata.xml +++ b/misc/qelectrotech.appdata.xml @@ -7,21 +7,21 @@ QElectroTech

Electrical diagram editor مُحرّر مخططات كهربائية + Elektrische schema editor Editor d'esquemes elèctrics Editor výkresů elektrických obvodů + Elektrisk diagram redigering Zeichenprogramm für Schaltpläne Επεξεργαστής ηλεκτρικών διαγραμμάτων Editor de esquemas eléctricos Éditeur de schémas électriques Editor elektro sheme Programma per disegnare schemi elettrici + 電気回路図エディタ + Elektrische schema bewerker Edytor schematów elektrycznych Editor de esquemas eléctricos Редактор электрических схем - Elektrische schema bewerker - Elektrische schema editor - Elektrisk diagram redigering - 電気回路図エディタ @@ -31,6 +31,10 @@ QElectroTech is a Qt5 application to design electric diagrams. It uses XML files for elements and diagrams, and includes both a diagram editor, an element editor, and a titleblock editor.

+

+ QElectroTech is een Qt5 applicatie om elektrische schema's te ontwerpen. + Het maakt gebruik van XML-bestanden voor elementen en diagrammen, en omvat zowel een diagram bewerker, een element bewerker, en ook een tielbloksjabloon bewerker. +

QElectroTech és una aplicació Qt5 per crear esquemes elèctrics. QET utilitza el format XML per als seus elements i esquemes i inclou un editor d'esquemes, un editor d'elements i un editor de caixetins. @@ -39,6 +43,10 @@ QElectroTech je aplikací Qt5 určenou pro návrh nákresů elektrických obvodů. Pro prvky a nákresy používá soubory XML, a zahrnuje v sobě jak editor nákresů, tak editor prvků.

+

+ 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. +

QElectroTech ist eine Qt5-Anwendung zum Entwerfen von Schaltplänen. Die Anwendung verwendet XML-Dateien zum Speichern von Projekten und Elementbibliotheken. Neben dem Schaltplaneditor enthält die Anwendung auch Elementeditoren und einen Blattvorlageneditor. @@ -59,9 +67,13 @@ QElectroTech è una applicazione fatta in Qt5 per disegnare schemi elettrici. QET usa il formato XML per i suoi elementi e schemi, includendo anche un editor per gli stessi.

-

- QElectroTech - приложение написанное на Qt5 и предназначено для разработки электрических схем. - Приложение использует для хранения проектов и библиотек элементов файлы в XML формате. Приложение помимо редактора электричесих схем, содержит также редакторы элементов и редактор шаблонов листов. +

+ QElectroTech は電気回路図を作成する Qt5 アプリケーションです。 + QET は要素と回路図に XML 形式を利用し、回路図エディタ、要素エディタ、表題欄エディタを含みます。 +

+

+ QElectroTech is een Qt5 applicatie om elektrische schema's te ontwerpen. + Het maakt gebruik van XML-bestanden voor elementen en diagrammen, en omvat zowel een diagram bewerker, een element bewerker, en een bloksjabloon bewerker.

QElectroTech to aplikacja napisana w Qt5, przeznaczona do tworzenia schematów elektrycznych. @@ -71,22 +83,10 @@ QElectroTech é uma aplicação baseada em Qt5 para desenhar esquemas eléctricos. QET utiliza ficheiros XML para os elementos e para os esquemas e inclui um editor de esquemas e um editor de elementos.

-

- QElectroTech is een Qt5 applicatie om elektrische schema's te ontwerpen. - Het maakt gebruik van XML-bestanden voor elementen en diagrammen, en omvat zowel een diagram bewerker, een element bewerker, en een bloksjabloon bewerker. -

-

- QElectroTech is een Qt5 applicatie om elektrische schema's te ontwerpen. - Het maakt gebruik van XML-bestanden voor elementen en diagrammen, en omvat zowel een diagram bewerker, een element bewerker, en ook een tielbloksjabloon bewerker. -

-

- 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. -

-

- QElectroTech は電気回路図を作成する Qt5 アプリケーションです。 - QET は要素と回路図に XML 形式を利用し、回路図エディタ、要素エディタ、表題欄エディタを含みます。 -

+

+ QElectroTech - приложение написанное на Qt5 и предназначено для разработки электрических схем. + Приложение использует для хранения проектов и библиотек элементов файлы в XML формате. Приложение помимо редактора электричесих схем, содержит также редакторы элементов и редактор шаблонов листов. +

http://qelectrotech.org diff --git a/misc/qelectrotech.xml b/misc/qelectrotech.xml index 7821034c5..276c6b9af 100644 --- a/misc/qelectrotech.xml +++ b/misc/qelectrotech.xml @@ -1,63 +1,63 @@ - - - - - QElectroTech project file - Fitxer de projecte QElectroTech - QElectroTech Projektdatei - Fichier projet QElectroTech - QElectrotech ملف مشروع - Fichero proyecto QElectroTech - Файл проекта QElectroTech - Ficheiro de projecto QElectroTech - Soubor s projektem pro QElectroTech - Plik projektu QElectrotech - File del progetto QElectroTech - Αρχείο έργου του QElectroTech - QElectroTech project bestand - QElectroTech project bestand - QElectroTech projekt fil - QElectroTech プロジェクト・ファイル - - - - - QElectroTech element file - Fitxer d'element QElectroTech - QElectroTech Bauteildatei - Fichier élément QElectroTech - QElectrotech ملف مشروع - Файл элемента QElectroTech - Fichero elemento QElectroTech - Ficheiro de projecto QElectroTech - Soubor s prvkem pro QElectroTech - Plik elementu QElectroTech - File del progetto QElectroTech - Αρχείο στοιχείου του QElectroTech - QElectroTech element bestand - QElectroTech element bestand - QElectroTech symbol fil - QElectroTech 要素ファイル - - - - - QElectroTech title block template file - Model de caixetí QElectroTech - QElectroTech Schriftfeld Vorlagedatei - Modèle de cartouche QElectroTech - QElectrotech نموذج إطار تعريف - Файл шаблона основной надписи листа QElectroTech - Szablon tabliczki rysunkowej QElectroTech - Modelo de cartucho QElectroTech - Vzor záhlaví výkresu pro QElectroTech - Modelo de moldura QElectroTech - Modello di cartiglio per QElectroTech - Πρότυπο πινακίδας του QElectroTech - QElectroTech titel bloksjabloon - QElectroTech titel bloksjabloon - QElectroTech titelblok skabelon - QElectroTech 表題欄テンプレート - - - + + + + + QElectroTech project file + QElectrotech ملف مشروع + QElectroTech project bestand + Fitxer de projecte QElectroTech + Soubor s projektem pro QElectroTech + QElectroTech projekt fil + QElectroTech Projektdatei + Αρχείο έργου του QElectroTech + Fichero proyecto QElectroTech + Fichier projet QElectroTech + File del progetto QElectroTech + QElectroTech プロジェクト・ファイル + QElectroTech project bestand + Plik projektu QElectrotech + Ficheiro de projecto QElectroTech + Файл проекта QElectroTech + + + + + QElectroTech element file + QElectrotech ملف مشروع + QElectroTech element bestand + Fitxer d'element QElectroTech + Soubor s prvkem pro QElectroTech + QElectroTech symbol fil + QElectroTech Bauteildatei + Αρχείο στοιχείου του QElectroTech + Fichero elemento QElectroTech + Fichier élément QElectroTech + File del progetto QElectroTech + QElectroTech 要素ファイル + QElectroTech element bestand + Plik elementu QElectroTech + Ficheiro de projecto QElectroTech + Файл элемента QElectroTech + + + + + QElectroTech title block template file + QElectrotech نموذج إطار تعريف + QElectroTech titel bloksjabloon + Model de caixetí QElectroTech + Vzor záhlaví výkresu pro QElectroTech + QElectroTech titelblok skabelon + QElectroTech Schriftfeld Vorlagedatei + Πρότυπο πινακίδας του QElectroTech + Modelo de cartucho QElectroTech + Modèle de cartouche QElectroTech + Modello di cartiglio per QElectroTech + QElectroTech 表題欄テンプレート + QElectroTech titel bloksjabloon + Szablon tabliczki rysunkowej QElectroTech + Modelo de moldura QElectroTech + Файл шаблона основной надписи листа QElectroTech + + + From 4e695de914a77aefe2f1f1108571286e9cc0cdf7 Mon Sep 17 00:00:00 2001 From: joshua Date: Fri, 14 Nov 2025 21:23:29 +0100 Subject: [PATCH 53/65] chore : Add message box for advise use hpdi round factor is unsafe Add a message box to advise user that use a hdpi round factor can cause strange render according to : 1 - the selected value 2 - the dpi of the screen 3 - Edit the project on another computer and/or screen who don't have the same parameters as point 1 and 2. --- .../configpage/generalconfigurationpage.cpp | 27 +++++++++++++++++++ .../ui/configpage/generalconfigurationpage.h | 2 ++ .../ui/configpage/generalconfigurationpage.ui | 24 +++++++++++++---- 3 files changed, 48 insertions(+), 5 deletions(-) diff --git a/sources/ui/configpage/generalconfigurationpage.cpp b/sources/ui/configpage/generalconfigurationpage.cpp index 748c1fda8..ad73b509c 100644 --- a/sources/ui/configpage/generalconfigurationpage.cpp +++ b/sources/ui/configpage/generalconfigurationpage.cpp @@ -21,6 +21,7 @@ #include "../../qeticons.h" #include "ui_generalconfigurationpage.h" #include "../../utils/qetsettings.h" +#include "../../qetmessagebox.h" #include #include @@ -560,3 +561,29 @@ void GeneralConfigurationPage::on_ElementEditor_Grid_PointSize_min_sb_valueChang { ui->ElementEditor_Grid_PointSize_max_sb->setMinimum(std::max(1, value)); } + +void GeneralConfigurationPage::on_m_hdpi_round_cb_clicked(bool checked) +{ + if (checked) { + if (QMessageBox::Cancel == QET::QetMessageBox::warning( + this, + tr("Fonctionnalité expérimental"), + tr("AVERTISSEMENT :\n" + "Toutes valeurs autre que ‘Pas d’arrondi’ peut causer des erreurs de rendu " + "du projet en fonction de :\n\n" + "1 - la valeur sélectionnée \n" + "2 - du dpi de l'écran \n" + "3 - Modifier le projet sur un autre ordinateur et/ou écran n'ayant pas les mêmes paramètres des points 1 et 2."), + QMessageBox::StandardButton::Cancel|QMessageBox::StandardButton::Ok, + QMessageBox::StandardButton::Cancel + )) { + ui->m_hdpi_round_cb->blockSignals(true); + ui->m_hdpi_round_cb->setChecked(false); + ui->m_hdpi_round_cb->blockSignals(false); + return; + } + } + ui->m_hdpi_round_label->setEnabled(checked); + ui->m_hdpi_round_policy_cb->setEnabled(checked); +} + diff --git a/sources/ui/configpage/generalconfigurationpage.h b/sources/ui/configpage/generalconfigurationpage.h index 96b41c41d..0c23db405 100644 --- a/sources/ui/configpage/generalconfigurationpage.h +++ b/sources/ui/configpage/generalconfigurationpage.h @@ -51,6 +51,8 @@ class GeneralConfigurationPage : public ConfigPage void on_DiagramEditor_Grid_PointSize_min_sb_valueChanged(int value); void on_ElementEditor_Grid_PointSize_min_sb_valueChanged(int value); + void on_m_hdpi_round_cb_clicked(bool checked); + private: void fillLang(); diff --git a/sources/ui/configpage/generalconfigurationpage.ui b/sources/ui/configpage/generalconfigurationpage.ui index 2cec18fb0..38130c8b9 100644 --- a/sources/ui/configpage/generalconfigurationpage.ui +++ b/sources/ui/configpage/generalconfigurationpage.ui @@ -6,7 +6,7 @@ 0 0 - 935 + 955 556
@@ -17,7 +17,7 @@ - 1 + 0 @@ -82,7 +82,7 @@ - + 0 @@ -96,14 +96,28 @@ 0 - + + + + + + + + + + false + Méthode de mise à l'echelle des écrans à haute densité de pixels (hdpi) (appliqué au prochain lancement de QElectroTech) : - + + + false + + From a9632600b69b5fd659de3e6f082e1359942e2c75 Mon Sep 17 00:00:00 2001 From: joshua Date: Mon, 1 Dec 2025 12:23:22 +0100 Subject: [PATCH 54/65] fix [diagram editor] : fix crash on search and replace widget Qet crash when double click on an element/text/conductor in the tree widget of the search and replace widget and the item is deleted from diagram. (Call of Diagram::showme to a nullptr). --- sources/SearchAndReplace/ui/searchandreplacewidget.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/sources/SearchAndReplace/ui/searchandreplacewidget.cpp b/sources/SearchAndReplace/ui/searchandreplacewidget.cpp index e32f10fca..51b553a2e 100644 --- a/sources/SearchAndReplace/ui/searchandreplacewidget.cpp +++ b/sources/SearchAndReplace/ui/searchandreplacewidget.cpp @@ -961,21 +961,21 @@ void SearchAndReplaceWidget::on_m_tree_widget_itemDoubleClicked( else if (m_element_hash.keys().contains(item)) { QPointer elmt = m_element_hash.value(item); - if (elmt) { + if (elmt && elmt->diagram()) { elmt.data()->diagram()->showMe(); } } else if (m_text_hash.keys().contains(item)) { QPointer text = m_text_hash.value(item); - if (text) { + if (text && text->diagram()) { text.data()->diagram()->showMe(); } } else if (m_conductor_hash.keys().contains(item)) { QPointer cond = m_conductor_hash.value(item); - if (cond) { + if (cond && cond->diagram()) { cond.data()->diagram()->showMe(); } } From 6038db5c407d566687a1ffa0192e835691064165 Mon Sep 17 00:00:00 2001 From: Laurent Trinques Date: Fri, 12 Dec 2025 12:22:12 +0100 Subject: [PATCH 55/65] Update Catalan translations, thanks Antoni --- lang/qet_ca.qm | Bin 313465 -> 314005 bytes lang/qet_ca.ts | 134 ++++++++++++++++++++++++------------------------- 2 files changed, 67 insertions(+), 67 deletions(-) diff --git a/lang/qet_ca.qm b/lang/qet_ca.qm index 83b33fa337749d55de10ab9370a8987e028dfef3..b1438bc8cc85127358e8542e9d6bea5dc9115657 100644 GIT binary patch delta 21642 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 phase - fase + Fase @@ -913,12 +913,12 @@ Nota: Aquestes opcions NO permeten ni bloquegen les numeracions automàtiques, n terre - terra + Terra neutre - neutre + Neutre @@ -954,12 +954,12 @@ Nota: Aquestes opcions NO permeten ni bloquegen les numeracions automàtiques, n Vertical à gauche - Vertical esquerra + Vertical a l'esquerra Vertical à droite - Vertical dreta + Vertical a la dreta @@ -1447,7 +1447,7 @@ Nota: Aquestes opcions NO permeten ni bloquegen les numeracions automàtiques, n Conserver la rotation visuel - Mantenir la rotació visual + Manté la rotació visual @@ -1544,7 +1544,7 @@ Nota: Aquestes opcions NO permeten ni bloquegen les numeracions automàtiques, n Maintenir en bas de page - Mantenir al final de la pàgina + Manté al final de la pàgina @@ -1593,7 +1593,7 @@ Nota: Aquestes opcions NO permeten ni bloquegen les numeracions automàtiques, n Conserver la rotation visuel - Mantenir la rotació visual + Manté la rotació visual @@ -2726,7 +2726,7 @@ S'eliminaran tots els elements i carpetes contingudes en aquesta carpeta. Abaisser ce folio - Retrocedir la posició del full + Retrocedeix la posició del full @@ -2746,12 +2746,12 @@ S'eliminaran tots els elements i carpetes contingudes en aquesta carpeta. Abaisser ce folio x10 - Retrocedir 10 posicions el full + Retrocedeix 10 posicions el full Abaisser ce folio x100 - Retrocedir 100 posicions el full + Retrocedeix 100 posicions el full @@ -3130,7 +3130,7 @@ Si el número definit al camp Valor té menys dígits que el tipus escollit, ani Insert Formula Here e.g.: %prefix%l%c - Inserir Fórmula Aquí, per exemple: %prefix%l%c + Insereix la fórmula aquí, per exemple: %prefix%l%c @@ -3308,22 +3308,22 @@ Les entrades de text i nombres també Utiliser des fen&êtres (appliqué au prochain lancement de QElectroTech) - Utilitza fine&stres (aplicat al proper llançament de QElectroTech) + Utilitza fine&stres (s'aplicarà al proper llançament de QElectroTech) Utiliser des onglets (appliqué au prochain lance&ment de QElectroTech) - Utilitza pestanyes (aplicat al proper llança&ment de QElectroTech) + Utilitza pestanyes (s'aplicarà al proper llança&ment de QElectroTech) Méthode de mise à l'echelle des écrans à haute densité de pixels (hdpi) (appliqué au prochain lancement de QElectroTech) : - Mètode d'escalat de pantalla d'alta densitat de píxels (HDPI) (aplicat al proper llançament de QElectroTech): + Mètode d'escalat de pantalla d'alta densitat de píxels (HDPI) (s'aplicarà al proper llançament de QElectroTech): Sauvegarde automatique des projets (appliqué au prochain lancement de QElectroTech) - Desament automàtic del projecte (aplicat al proper llançament de QElectroTech) + Desament automàtic del projecte (s'aplicarà al proper llançament de QElectroTech) @@ -3345,7 +3345,7 @@ Les entrades de text i nombres també Utiliser les numéros de folio à la place de leur position dans le projet - Utilitzeu els números de full en lloc de la seva posició en el projecte + Utilitza els números de full en lloc de la seva posició en el projecte @@ -3360,7 +3360,7 @@ Les entrades de text i nombres també Répertoire de la collection commune - Directori de col·leccions comuns + Directori de la col·lecció compartida @@ -3383,22 +3383,22 @@ Les entrades de text i nombres també Répertoire de la collection company - Directori de la col·lecció d'empreses + Directori de la col·lecció d'empresa Répertoire des cartouches company - Directori de caixetins d'empresa + Directori dels caixetins d'empresa Répertoire de la collection utilisateur - Directori de col·lecció d'usuaris + Directori de la col·lecció d'usuari Répertoire des cartouches utilisateur - Directori de caixetins d'usuari + Directori dels caixetins d'usuari @@ -3425,7 +3425,7 @@ Podeu especificar el valor per defecte d'aquest camp per als elements que c Appliqué au prochain lancement de QElectroTech - Aplicat al proper llançament de QElectroTech + S'aplicarà al proper llançament de QElectroTech @@ -3479,17 +3479,17 @@ Podeu especificar el valor per defecte d'aquest camp per als elements que c Grille + Clavier - Quadrícula + Teclat + Graella i teclat Grille : 1 - 30 - Quadrícula: 1 - 30 + Graella de l'editor d'esquemes DiagramEditor yGrid - Editor de diagrames yQuadrícula + Distància entre punts en vertical : 1-30 @@ -3499,37 +3499,37 @@ Podeu especificar el valor per defecte d'aquest camp per als elements que c DiagramEditor xGrid - Editor de diagrames xQuadrícula + Distància entre punts en horitzontal : 1-30 Déplacement au clavier : 1 - 30 - Moviment del teclat: 1 - 30 + Desplaçament per la graella de l'editor d'esquemes utilitzant el teclat DiagramEditor (touche : gauche / droite) xGrid - Editor de diagrames (tecla: esquerra / dreta) xQuadrícula + Distància desplaçada amb les tecles esquerra i dreta en horitzontal : 1-30 DiagramEditor (touche : haut / bas) yGrid - Editor de diagrames (tecla: amunt / avall) yQuadrícula + Distància desplaçada amb les tecles amunt i avall en vertical : 1-30 Déplacement au clavier avec la touche ALT : 1 - 9 - Moviment del teclat amb la tecla ALT: 1 - 9 + Desplaçament per la graella de l'editor d'esquemes utilitzant el teclat amb la tecla ALT DiagramEditor (touche : gauche / droite ) xGrid - Editor de diagrames (tecla: esquerra / dreta) xQuadrícula + Distància desplaçada amb les tecles esquerra i dreta en horitzontal : 1-9 DiagramEditor (touche : haut / bas) yGrid - Editor de diagrames (tecla: amunt / avall) yQuadrícula + Distància desplaçada amb les tecles amunt i avall en vertical : 1-9 @@ -3544,17 +3544,17 @@ Podeu especificar el valor per defecte d'aquest camp per als elements que c Ne pas conserver les labels des éléments lors des copier coller - No conservar les etiquetes dels elements després de copiar i enganxar + No conservis les etiquetes dels elements després de copia i enganxa Autoriser le dézoom au delà du folio - Permetre allunyar més enllà de la mida del full + Permet allunyar més enllà de la mida del full Arrondi supérieur pour 0.5 et plus - Arrodoneix cap amunt per 0,5 i més + Arrodoneix cap amunt per 0,5 o més @@ -3569,7 +3569,7 @@ Podeu especificar el valor per defecte d'aquest camp per als elements que c Arrondi supérieur pour 0.75 et plus - Arrodoneix cap amunt per 0,75 i més + Arrodoneix cap amunt per 0,75 o més @@ -3720,27 +3720,27 @@ Podeu especificar el valor per defecte d'aquest camp per als elements que c Chemin de la collection commune - Ruta de col·lecció comuna + Ruta de la col·lecció compartida Chemin de la collection company - Ruta de col·lecció d'empresa + Ruta de la col·lecció d'empresa Chemin de la collection utilisateur - Ruta de col·lecció d'usuaris + Ruta de la col·lecció d'usuari Chemin des cartouches company - Ruta de caixetins d'empresa + Ruta dels caixetins d'empresa Chemin des cartouches utilisateur - Ruta de caixetins d'usuaris + Ruta dels caixetins d'usuaris @@ -5516,7 +5516,7 @@ Vol desar els canvis? Supprimer le folio ? message box title - Suprimir el full? + Suprimeix el full? @@ -6149,7 +6149,7 @@ Opcions disponibles: Désélectionner tout - Desselecciona + Desselecciona-ho tot @@ -6159,7 +6159,7 @@ Opcions disponibles: Ajouter un plan de bornes - Afegiu un pla de borns + Afegeix un pla de borns @@ -6199,7 +6199,7 @@ Opcions disponibles: Chercher/remplacer - Cerca/substitueix + Cerca i reemplaça @@ -6527,7 +6527,7 @@ Opcions disponibles: Création automatique de conducteur(s) Tool tip of auto conductor - Creació automàtica de conductor(s) + Creació automàtica de conductors @@ -7485,7 +7485,7 @@ Les condicions requerides no són vàlides Sortir du &mode plein écran - Sortir de &pantalla completa + Surt de &pantalla completa @@ -8127,7 +8127,7 @@ Què voleu fer? Conserver les proportions - Mantenir les proporcions + Manté les proporcions @@ -9284,27 +9284,27 @@ Voleu substituir-la? Chercher/remplacer les propriétés de folio - Cerca/Substitueix les propietats del full + Cerca i reemplaça les propietats del full Chercher/remplacer les propriétés d'éléments. - Cerca/Substitueix les propietats dels elements. + Cerca i reemplaça les propietats dels elements. Chercher/remplacer des textes independants - Cercar/substituir textos independents + Cerca i reemplaça textos independents Chercher/remplacer les propriétés de conducteurs. - Cerca/substitueix les propietats dels conductors. + Cerca i reemplaça les propietats dels conductors. Rechercher / remplacer avancé - Cerca/substitueix avançat + Cerca i reemplaça avançat @@ -9370,7 +9370,7 @@ Voleu substituir-la? Insérer un texte d'élément dans un groupe de textes - Inserir text d'element en un grup de text + Insereix text d'element en un grup de text @@ -9545,7 +9545,7 @@ Afegiu una taula nova o ajusteu la taula existent per mostrar la quantitat compl Ajouter un point à un polygone - Afegir un punt a un polígon + Afegeix un punt a un polígon @@ -9986,7 +9986,7 @@ Afegiu una taula nova o ajusteu la taula existent per mostrar la quantitat compl Pas de date - No hi cap data + Sense data @@ -10077,7 +10077,7 @@ Créer votre propre texte en vous aidant des variables suivantes : %LM : la localisation %l : le numéro de ligne %c : le numéro de colonne - Podeu definir una etiqueta personalitzada per als informes de foli. + Podeu definir una etiqueta personalitzada per als informes de full. Creeu el vostre propi text utilitzant les variables següents: %f: la posició del full al projecte %F: el número de full @@ -10318,7 +10318,7 @@ Creeu el vostre propi text utilitzant les variables següents: <html><head/><body><p>Supprimer une variable de numérotation</p></body></html> - <html><head/><body><p>Suprimir una variable de numeració</p></body></html> + <html><head/><body><p>Suprimeix una variable de numeració</p></body></html> @@ -13419,7 +13419,7 @@ Les autres champs ne sont pas utilisés. Pas de date - No hi cap data + Sense data @@ -13709,7 +13709,7 @@ associar el nom "volta" amb el valor "1745" substituirà %{v Supprimer le modèle de cartouche ? message box title - Suprimir el model de caixetí? + Suprimeix el model de caixetí? @@ -13943,13 +13943,13 @@ associar el nom "volta" amb el valor "1745" substituirà %{v Supprimer cette colonne context menu - Suprimir aquesta columna + Suprimeix aquesta columna Supprimer cette ligne context menu - Suprimir aquesta línia + Suprimeix aquesta línia @@ -14056,7 +14056,7 @@ Longitud màxima : %2px XRef Vertical Offset: - Desplaçament vertical de la XRef : + Desplaçament vertical de la referència creuada : @@ -14071,12 +14071,12 @@ Longitud màxima : %2px Default - Fit to XRef height - Per defecte - Ajusta a l'alçada de la XRef + Per defecte - Ajusta a l'alçada de la referència creuada XRef slave position - Posició de l'esclau XRef + Posició de l'esclau de la referència creuada @@ -14086,7 +14086,7 @@ Longitud màxima : %2px Afficher en croix - Mostra len creu + Mostra en creu From cdc747548d93cfc27f6b085274e26936d8eca733 Mon Sep 17 00:00:00 2001 From: Laurent Trinques Date: Fri, 12 Dec 2025 16:46:31 +0100 Subject: [PATCH 56/65] git submodule update --remote elements --- elements | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/elements b/elements index 6e1e2471f..b95562bbc 160000 --- a/elements +++ b/elements @@ -1 +1 @@ -Subproject commit 6e1e2471fe602cf865f830417adc888ac20fdcce +Subproject commit b95562bbc9f98a454af3a42ac617e9283f89443f From e7f55ee8434b436c27557cdafe01b5285f0d65b5 Mon Sep 17 00:00:00 2001 From: Laurent Trinques Date: Sun, 14 Dec 2025 14:54:38 +0100 Subject: [PATCH 57/65] Try to fix snapcraft amr64 build on https://snapcraft.io/ --- build-aux/snap/snapcraft.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build-aux/snap/snapcraft.yaml b/build-aux/snap/snapcraft.yaml index f0f93168b..9460b688c 100644 --- a/build-aux/snap/snapcraft.yaml +++ b/build-aux/snap/snapcraft.yaml @@ -33,7 +33,7 @@ apps: environment: &env TCL_LIBRARY: $SNAP/usr/share/tcltk/tcl8.6 HOME: $SNAP_USER_COMMON - PYTHONPATH: $SNAP:$SNAP/lib/python3.10/site-packages:$SNAP/usr/lib/python3.10:$SNAP/usr/lib/python3.10/lib-dynload + PYTHONPATH: $SNAP:$SNAP/lib/python3.8/site-packages:$SNAP/usr/lib/python3.8:$SNAP/usr/lib/python3.8/lib-dynload qet-tb-generator: command: bin/qet_tb_generator From ca8f4650a36d23bad06ee90217e51c2545354f69 Mon Sep 17 00:00:00 2001 From: Laurent Trinques Date: Sun, 14 Dec 2025 15:14:07 +0100 Subject: [PATCH 58/65] revert snapcraft.yaml Installing build-snaps Failed to install or refresh snap 'kde-qt5-core22-sdk'. 'kde-qt5-core22-sdk' does not exist or is not available on channel 'latest/stable'. Use `snap info kde-qt5-core22-sdk` to get a list of channels the snap is available on. Full execution log: '/root/.local/state/snapcraft/log/snapcraft-20251214-140707.644603.log' Build failed Traceback (most recent call last): File "/usr/lib/python3/dist-packages/lpbuildd/target/build_snap.py", line 322, in run self.pull() File "/usr/lib/python3/dist-packages/lpbuildd/target/build_snap.py", line 249, in pull self.run_build_command( File "/usr/lib/python3/dist-packages/lpbuildd/target/operation.py", line 70, in run_build_command return self.backend.run(args, cwd=cwd, env=full_env, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/lib/python3/dist-packages/lpbuildd/target/lxd.py", line 736, in run subprocess.check_call(cmd, **kwargs) File "/usr/lib/python3.12/subprocess.py", line 413, in check_call raise CalledProcessError(retcode, cmd) --- build-aux/snap/snapcraft.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build-aux/snap/snapcraft.yaml b/build-aux/snap/snapcraft.yaml index 9460b688c..f0f93168b 100644 --- a/build-aux/snap/snapcraft.yaml +++ b/build-aux/snap/snapcraft.yaml @@ -33,7 +33,7 @@ apps: environment: &env TCL_LIBRARY: $SNAP/usr/share/tcltk/tcl8.6 HOME: $SNAP_USER_COMMON - PYTHONPATH: $SNAP:$SNAP/lib/python3.8/site-packages:$SNAP/usr/lib/python3.8:$SNAP/usr/lib/python3.8/lib-dynload + PYTHONPATH: $SNAP:$SNAP/lib/python3.10/site-packages:$SNAP/usr/lib/python3.10:$SNAP/usr/lib/python3.10/lib-dynload qet-tb-generator: command: bin/qet_tb_generator From 5b2c861d020ee6d85b15ef149c5c0922132deee9 Mon Sep 17 00:00:00 2001 From: plc-user <74435298+plc-user@users.noreply.github.com> Date: Sun, 14 Dec 2025 19:26:02 +0100 Subject: [PATCH 59/65] reduce maximum size of config-dialog --- sources/configdialog.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/sources/configdialog.cpp b/sources/configdialog.cpp index 4fcdea6a0..60a3c73c3 100644 --- a/sources/configdialog.cpp +++ b/sources/configdialog.cpp @@ -79,9 +79,10 @@ ConfigDialog::ConfigDialog(QWidget *parent) : QDialog(parent) { connect(pages_list, SIGNAL(currentRowChanged(int)), pages_widget, SLOT(setCurrentIndex(int))); - setMaximumSize(MachineInfo::instance()->i_max_screen_width(), - MachineInfo::instance()->i_max_screen_height()); - resize(1400,1000); + setMaximumSize((int)(0.85 * MachineInfo::instance()->i_max_screen_width()), + (int)(0.85 * MachineInfo::instance()->i_max_screen_height())); + resize(std::min(1400,maximumWidth()), + std::min(1000,maximumHeight())); #ifdef Q_OS_MACOS if (parent) { From 82f3167d40e4fee82020c85988e3393676bdb8ca Mon Sep 17 00:00:00 2001 From: plc-user <74435298+plc-user@users.noreply.github.com> Date: Sun, 14 Dec 2025 19:26:29 +0100 Subject: [PATCH 60/65] unify code-style a bit --- sources/configdialog.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sources/configdialog.cpp b/sources/configdialog.cpp index 60a3c73c3..1087f1226 100644 --- a/sources/configdialog.cpp +++ b/sources/configdialog.cpp @@ -69,7 +69,7 @@ ConfigDialog::ConfigDialog(QWidget *parent) : QDialog(parent) { // Add a layout for QDialog QVBoxLayout *dialog_layout = new QVBoxLayout(this); - dialog_layout->addWidget(scroll); // add scroll to the QDialog's layout + dialog_layout -> addWidget(scroll); // add scroll to the QDialog's layout dialog_layout -> addWidget(buttons); setLayout(dialog_layout); From 3aa760e3cdbd017f1bb8b12e4bd0880d4fdabce9 Mon Sep 17 00:00:00 2001 From: plc-user <74435298+plc-user@users.noreply.github.com> Date: Sun, 14 Dec 2025 19:27:28 +0100 Subject: [PATCH 61/65] enlarge icons in config-page only for screen-sizes larger than Full-HD --- sources/configdialog.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sources/configdialog.cpp b/sources/configdialog.cpp index 1087f1226..99442496a 100644 --- a/sources/configdialog.cpp +++ b/sources/configdialog.cpp @@ -35,7 +35,7 @@ ConfigDialog::ConfigDialog(QWidget *parent) : QDialog(parent) { // liste des pages pages_list = new QListWidget(); pages_list -> setViewMode(QListView::IconMode); - if(MachineInfo::instance()->i_max_screen_height()<1000){ + if(MachineInfo::instance()->i_max_screen_height() <= 1080){ pages_list -> setIconSize(QSize(64, 64)); } else { pages_list -> setIconSize(QSize(128, 128)); From 689b101c55976db9a02c9b121cc35fcfca3f3dc0 Mon Sep 17 00:00:00 2001 From: plc-user <74435298+plc-user@users.noreply.github.com> Date: Mon, 15 Dec 2025 15:29:47 +0100 Subject: [PATCH 62/65] better solution for maximum config-dialog-size --- sources/configdialog.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/sources/configdialog.cpp b/sources/configdialog.cpp index 99442496a..04457dc2b 100644 --- a/sources/configdialog.cpp +++ b/sources/configdialog.cpp @@ -79,8 +79,16 @@ ConfigDialog::ConfigDialog(QWidget *parent) : QDialog(parent) { connect(pages_list, SIGNAL(currentRowChanged(int)), pages_widget, SLOT(setCurrentIndex(int))); +#if QT_VERSION >= QT_VERSION_CHECK(5, 14, 0) + // set maximum a bit smaller than available size = (screen-size - Task-Bar): + // "primaryScreen" <-> the screen where the main widget of application resides + setMaximumSize((int)(0.95 * QGuiApplication::primaryScreen()->availableSize().width()), + (int)(0.95 * QGuiApplication::primaryScreen()->availableSize().height())); +#else + // set maximum smaller than screen-size setMaximumSize((int)(0.85 * MachineInfo::instance()->i_max_screen_width()), (int)(0.85 * MachineInfo::instance()->i_max_screen_height())); +#endif resize(std::min(1400,maximumWidth()), std::min(1000,maximumHeight())); From 2c5e5c6b78b58ff309527dd55093d51f425ef545 Mon Sep 17 00:00:00 2001 From: plc-user <74435298+plc-user@users.noreply.github.com> Date: Mon, 15 Dec 2025 22:28:40 +0100 Subject: [PATCH 63/65] improve maximum config-dialog-size (no QT5 version-check needed) --- sources/configdialog.cpp | 11 ++--------- sources/machine_info.cpp | 16 ++++++++++++++++ sources/machine_info.h | 2 ++ 3 files changed, 20 insertions(+), 9 deletions(-) diff --git a/sources/configdialog.cpp b/sources/configdialog.cpp index 04457dc2b..8802cd3fe 100644 --- a/sources/configdialog.cpp +++ b/sources/configdialog.cpp @@ -79,16 +79,9 @@ ConfigDialog::ConfigDialog(QWidget *parent) : QDialog(parent) { connect(pages_list, SIGNAL(currentRowChanged(int)), pages_widget, SLOT(setCurrentIndex(int))); -#if QT_VERSION >= QT_VERSION_CHECK(5, 14, 0) // set maximum a bit smaller than available size = (screen-size - Task-Bar): - // "primaryScreen" <-> the screen where the main widget of application resides - setMaximumSize((int)(0.95 * QGuiApplication::primaryScreen()->availableSize().width()), - (int)(0.95 * QGuiApplication::primaryScreen()->availableSize().height())); -#else - // set maximum smaller than screen-size - setMaximumSize((int)(0.85 * MachineInfo::instance()->i_max_screen_width()), - (int)(0.85 * MachineInfo::instance()->i_max_screen_height())); -#endif + setMaximumSize((int)(0.94 * MachineInfo::instance()->i_max_available_width()), + (int)(0.94 * MachineInfo::instance()->i_max_available_height())); resize(std::min(1400,maximumWidth()), std::min(1000,maximumHeight())); diff --git a/sources/machine_info.cpp b/sources/machine_info.cpp index 56e2bfa28..c79fdef3c 100644 --- a/sources/machine_info.cpp +++ b/sources/machine_info.cpp @@ -446,6 +446,22 @@ int32_t MachineInfo::i_max_screen_height() { return pc.screen.Max_height; } +/** + @brief MachineInfo::i_max_available_width + @return max available width +*/ +int32_t MachineInfo::i_max_available_width() { + return QGuiApplication::primaryScreen()->availableSize().width(); +} + +/** + @brief MachineInfo::i_max_available_height + @return max available height +*/ +int32_t MachineInfo::i_max_available_height() { + return QGuiApplication::primaryScreen()->availableSize().height(); +} + /** @brief MachineInfo::compilation_info @return compilation_info diff --git a/sources/machine_info.h b/sources/machine_info.h index a3a7201b6..f0265be27 100644 --- a/sources/machine_info.h +++ b/sources/machine_info.h @@ -57,6 +57,8 @@ class MachineInfo int32_t i_max_screen_width(); int32_t i_max_screen_height(); + int32_t i_max_available_width(); + int32_t i_max_available_height(); QString compilation_info(); void send_info_to_debug(); From 67185f173e022b77e02630418b4a771e11247f6d Mon Sep 17 00:00:00 2001 From: plc-user <74435298+plc-user@users.noreply.github.com> Date: Wed, 17 Dec 2025 09:46:53 +0100 Subject: [PATCH 64/65] also limit size of generalconfig-dialog --- sources/qetapp.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/sources/qetapp.cpp b/sources/qetapp.cpp index 13531ff8e..2964979e2 100644 --- a/sources/qetapp.cpp +++ b/sources/qetapp.cpp @@ -1934,7 +1934,10 @@ void QETApp::configureQET() // associe le dialogue a un eventuel widget parent if (parent_widget) { cd.setParent(parent_widget, cd.windowFlags()); - cd.setMaximumSize(parent_widget->size()); + cd.setMaximumWidth(std::min(parent_widget->width(), + (int)(0.94 * MachineInfo::instance()->i_max_available_width()))); + cd.setMaximumHeight(std::min(parent_widget->height(), + (int)(0.94 * MachineInfo::instance()->i_max_available_height()))); } // display the dialog then avoid linking it to any parent widget From 0663aa55e8b71e43de63dbb26bf45ea04896c12f Mon Sep 17 00:00:00 2001 From: plc-user <74435298+plc-user@users.noreply.github.com> Date: Wed, 17 Dec 2025 09:56:53 +0100 Subject: [PATCH 65/65] find an appropriate font-family if selected font is not available --- sources/qetapp.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sources/qetapp.cpp b/sources/qetapp.cpp index 2964979e2..efcdea8a0 100644 --- a/sources/qetapp.cpp +++ b/sources/qetapp.cpp @@ -1261,6 +1261,7 @@ QFont QETApp::diagramTextsFont(qreal size) QFont diagram_texts_font = QFont(diagram_texts_family); diagram_texts_font.setPointSizeF(diagram_texts_size); diagram_texts_font.setWeight(diagram_texts_item_weight); + diagram_texts_font.setStyleHint(QFont::SansSerif); diagram_texts_font.setStyleName(diagram_texts_item_style); if (diagram_texts_size <= 4.0) { diagram_texts_font.setWeight(QFont::Light); @@ -1294,6 +1295,7 @@ QFont QETApp::diagramTextsItemFont(qreal size) QFont diagram_texts_item_font = QFont(diagram_texts_item_family); diagram_texts_item_font.setPointSizeF(diagram_texts_item_size); diagram_texts_item_font.setWeight(diagram_texts_item_weight); + diagram_texts_item_font.setStyleHint(QFont::SansSerif); diagram_texts_item_font.setStyleName(diagram_texts_item_style); if (diagram_texts_item_size <= 4.0) { diagram_texts_item_font.setWeight(QFont::Light);