mirror of
https://github.com/qelectrotech/qelectrotech-source-mirror.git
synced 2026-08-16 11:44:13 +02:00
Export slave cross-reference labels to DXF
Cross-references were missing from DXF exports, as reported on the forum: https://qelectrotech.org/forum/viewtopic.php?id=2481 generateDxf() walks the scene and collects items by cast. A slave element's cross-reference label ("(6-G15)", pointing back to its master) is a plain QGraphicsTextItem hung off a DynamicElementTextItem as a child, so it matches neither the IndependentTextItem nor the DynamicElementTextItem branch and was dropped on the floor. Nothing was wrong with the label itself; it was simply never collected. Collect it through the existing DynamicElementTextItem::slaveXrefItem() accessor and draw it with the same placement, rotation and multi-line handling as the other text items, using defaultTextColor() since a bare QGraphicsTextItem has no DiagramTextItem::color(). Measured on examples/industrial.qet, comparing against the PDF export (which renders the whole scene and so shows everything): before after PDF slave xrefs "(n-Xn)" 0 41 41 folio/position strings 317 358 403 The slave cross-references now match the PDF exactly. Still missing, and not addressed here: the master-side cross-reference table drawn by CrossRefItem, which accounts for the remaining 45 strings. CrossRefItem is a QGraphicsObject that renders itself with custom QPainter code in three different modes (drawAsCross, drawAsContacts, drawAsPlcTable) including contact symbols and rules, so giving it a DXF representation is a larger piece of work than this.
This commit is contained in:
@@ -472,6 +472,10 @@ void ExportDialog::generateDxf(
|
|||||||
QList<Conductor *> list_conductors;
|
QList<Conductor *> list_conductors;
|
||||||
QList<DiagramTextItem *> list_texts;
|
QList<DiagramTextItem *> list_texts;
|
||||||
QList<DiagramImageItem *> list_images;
|
QList<DiagramImageItem *> list_images;
|
||||||
|
//Slave cross-reference labels. They hang off a DynamicElementTextItem
|
||||||
|
//as plain QGraphicsTextItem children, so neither cast below picks them
|
||||||
|
//up and they were missing from the DXF entirely.
|
||||||
|
QList<QGraphicsTextItem *> list_xref_texts;
|
||||||
QList<QLineF *> list_lines;
|
QList<QLineF *> list_lines;
|
||||||
QList<QRectF *> list_rectangles;
|
QList<QRectF *> list_rectangles;
|
||||||
//QList<QRectF *> list_ellipses;
|
//QList<QRectF *> list_ellipses;
|
||||||
@@ -493,6 +497,9 @@ void ExportDialog::generateDxf(
|
|||||||
list_shapes << dii;
|
list_shapes << dii;
|
||||||
} else if (DynamicElementTextItem *deti = qgraphicsitem_cast<DynamicElementTextItem *>(qgi)) {
|
} else if (DynamicElementTextItem *deti = qgraphicsitem_cast<DynamicElementTextItem *>(qgi)) {
|
||||||
list_texts << deti;
|
list_texts << deti;
|
||||||
|
if (QGraphicsTextItem *xref = deti->slaveXrefItem()) {
|
||||||
|
list_xref_texts << xref;
|
||||||
|
}
|
||||||
} else if (QetGraphicsTableItem *gti = qgraphicsitem_cast<QetGraphicsTableItem *>(qgi)) {
|
} else if (QetGraphicsTableItem *gti = qgraphicsitem_cast<QetGraphicsTableItem *>(qgi)) {
|
||||||
list_tables << gti;
|
list_tables << gti;
|
||||||
}
|
}
|
||||||
@@ -688,6 +695,42 @@ void ExportDialog::generateDxf(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//Draw the slave cross-reference labels
|
||||||
|
for (QGraphicsTextItem *xref : std::as_const(list_xref_texts))
|
||||||
|
{
|
||||||
|
qreal fontSize = xref->font().pointSizeF();
|
||||||
|
if (fontSize < 0)
|
||||||
|
fontSize = xref->font().pixelSize();
|
||||||
|
|
||||||
|
qreal angle = xref->rotation();
|
||||||
|
QGraphicsItem *parent = xref->parentItem();
|
||||||
|
while (parent) {
|
||||||
|
angle += parent->rotation();
|
||||||
|
parent = parent->parentItem();
|
||||||
|
}
|
||||||
|
|
||||||
|
qreal angler = angle * M_PI/180;
|
||||||
|
int xdir = -sin(angler);
|
||||||
|
int ydir = -cos(angler);
|
||||||
|
qreal x = xref->scenePos().x()
|
||||||
|
+ xdir * fontSize * 1.8
|
||||||
|
- ydir * fontSize;
|
||||||
|
qreal y = xref->scenePos().y()
|
||||||
|
- ydir * fontSize * 1.8
|
||||||
|
- xdir * fontSize * 0.9;
|
||||||
|
|
||||||
|
const QStringList lines = xref->toPlainText().split('\n');
|
||||||
|
const qreal offset = fontSize * 1.6;
|
||||||
|
for (const QString &line : lines) {
|
||||||
|
if (line.size() > 0 && line != QLatin1String("_")) {
|
||||||
|
Createdxf::drawText(file_path, line, QPointF(x, y), fontSize,
|
||||||
|
360-angle, Createdxf::dxfColor(xref->defaultTextColor()), 0.72);
|
||||||
|
}
|
||||||
|
x += offset * xdir;
|
||||||
|
y -= offset * ydir;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Createdxf::dxfEnd(file_path);
|
Createdxf::dxfEnd(file_path);
|
||||||
|
|
||||||
saveReloadDiagramParameters(diagram, false);
|
saveReloadDiagramParameters(diagram, false);
|
||||||
|
|||||||
Reference in New Issue
Block a user