mirror of
https://github.com/qelectrotech/qelectrotech-source-mirror.git
synced 2026-07-30 07:44:13 +02:00
edz: group terminals by physical connector (terminalNr), drop separator lines
EPLAN 2022-style part.xml files (e.g. IFM AL1122) use a numeric functiondefgroup attribute and do not carry the text functiondefinition block name that the previous grouping logic relied on. Those parts fell back to grouping by pin designation, producing symbols with all pin "1"s stacked together, then all "2"s, etc. — the bug reported in PR #513. Fix: read terminalNr first (the physical M12/connector socket identifier, e.g. "X01", "X31") as the primary group key; fall back to functiondefinition text for older EPLAN formats that omit terminalNr. Pins within each connector group are still sorted by designation using natural sort. Also remove the dashed inter-group separator lines; the existing 5 px gap between groups provides sufficient visual separation. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -209,23 +209,6 @@ QDomDocument EdzElementBuilder::build(const EdzPart &part)
|
||||
: QStringLiteral("PART"));
|
||||
desc.appendChild(makeText(doc, body_left + 6, body_top + 7, title, TITLE_FONT));
|
||||
|
||||
// Group separator lines — thin dashed line halfway through each inter-group
|
||||
// gap so the eye can immediately see which terminals belong together.
|
||||
const QString SEP_STYLE =
|
||||
QStringLiteral("line-style:dashed;line-weight:thin;filling:none;color:black");
|
||||
for (int i = 1; i < n; ++i) {
|
||||
if (!is_group_break[i]) continue;
|
||||
const int sep_y = (pin_y[i - 1] + pitch + pin_y[i]) / 2;
|
||||
QDomElement sep = doc.createElement(QStringLiteral("line"));
|
||||
sep.setAttribute(QStringLiteral("x1"), body_left + 2);
|
||||
sep.setAttribute(QStringLiteral("y1"), sep_y);
|
||||
sep.setAttribute(QStringLiteral("x2"), body_right - 2);
|
||||
sep.setAttribute(QStringLiteral("y2"), sep_y);
|
||||
sep.setAttribute(QStringLiteral("style"), SEP_STYLE);
|
||||
sep.setAttribute(QStringLiteral("antialias"), QStringLiteral("false"));
|
||||
desc.appendChild(sep);
|
||||
}
|
||||
|
||||
// Per-pin labels.
|
||||
for (int i = 0; i < n; ++i) {
|
||||
QString label = pins.at(i).designation;
|
||||
|
||||
@@ -204,13 +204,17 @@ bool EdzPart::parse(const QString &part_xml_path)
|
||||
pin.designation = desig;
|
||||
pin.description =
|
||||
ft.attribute(QStringLiteral("connectiondescription")).trimmed();
|
||||
// functiondefinition identifies the functional block (FINP, MOUT, …).
|
||||
// It lives on <functiontemplate> directly in newer EPLAN versions, or on
|
||||
// the parent <function> wrapper element in older ones.
|
||||
pin.group = ft.attribute(QStringLiteral("functiondefinition")).trimmed();
|
||||
if (pin.group.isEmpty())
|
||||
pin.group = ft.parentNode().toElement()
|
||||
.attribute(QStringLiteral("functiondefinition")).trimmed();
|
||||
// terminalNr identifies the physical connector socket (X01, X31, …) and
|
||||
// is the preferred group key. Older EPLAN formats may omit it and carry
|
||||
// a text functiondefinition block name (FINP, MOUT, …) instead, either on
|
||||
// the <functiontemplate> itself or on its parent wrapper element.
|
||||
pin.group = ft.attribute(QStringLiteral("terminalNr")).trimmed();
|
||||
if (pin.group.isEmpty()) {
|
||||
pin.group = ft.attribute(QStringLiteral("functiondefinition")).trimmed();
|
||||
if (pin.group.isEmpty())
|
||||
pin.group = ft.parentNode().toElement()
|
||||
.attribute(QStringLiteral("functiondefinition")).trimmed();
|
||||
}
|
||||
m_pins.append(pin);
|
||||
}
|
||||
|
||||
|
||||
@@ -26,7 +26,7 @@
|
||||
struct EdzPin {
|
||||
QString designation; ///< terminal id, e.g. "1", "PE"
|
||||
QString description; ///< function label, e.g. "L+"
|
||||
QString group; ///< functiondefinition block, e.g. "FINP", "MOUT"
|
||||
QString group; ///< connector group: terminalNr if present, else functiondefinition
|
||||
};
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user