diff --git a/sources/exportdialog.cpp b/sources/exportdialog.cpp index 6eeaabfc3..19a3b7f20 100644 --- a/sources/exportdialog.cpp +++ b/sources/exportdialog.cpp @@ -37,6 +37,7 @@ #include "qetmessagebox.h" #include +#include #include #include #include @@ -483,7 +484,24 @@ void ExportDialog::generateDxf( // QList list_terminals; // Determine les elements a "XMLiser" - foreach(QGraphicsItem *qgi, diagram -> items()) { + // In stacking order (z, then insertion order, which a load makes the + // file's order), not items() order: that follows memory addresses, so + // the same folio came out in a different order on every export, as + // saving did before bugtracker #343. A rect query gives stacking order + // even with NoIndex; anything it misses keeps its items() place after + // the rest. + QList stacked_items = diagram -> items( + QRectF(-1e9, -1e9, 2e9, 2e9), Qt::IntersectsItemBoundingRect, + Qt::AscendingOrder); + { + const QSet ranked(stacked_items.cbegin(), stacked_items.cend()); + for (QGraphicsItem *qgi : diagram -> items()) { + if (!ranked.contains(qgi)) { + stacked_items << qgi; + } + } + } + for (QGraphicsItem *qgi : std::as_const(stacked_items)) { if (Element *elmt = qgraphicsitem_cast(qgi)) { list_elements << elmt; } else if (Conductor *f = qgraphicsitem_cast(qgi)) {