Fix title blocks with a line break writing an unreadable DXF

A title block cell holding a line break (tableau_domestique.qet's
"DESSINE" + CR LF + "%{author}") was written into the DXF as one TEXT
value with the break inside it. A DXF value ends at the line break, so
every group code after it was off by one line: ezdxf refuses all five
folios of that example with DXFStructureError, and other readers take
values for codes.

- TitleBlockTemplate::renderTextCellDxf() writes each line of a cell as
  its own TEXT, stacked by the cell's vertical alignment as the screen
  shows them, 1.6 text heights apart as the diagram texts' DXF export
  does. A single-line cell is written exactly as before.
- Createdxf's text writers turn any line break still in a value into a
  space, so no other caller can break the file either.

Checked in the Export dialog: tableau_domestique.qet's five folios, which
ezdxf refused on master, now read with no audit errors; grafcet.qet, which
has no line break, keeps exactly the same entities. (Byte comparison waits
on the DXF entity-order fix: until then every export reorders its entities.)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01G2d2Zi8BfrYRPX88zhaoFG
This commit is contained in:
ispyisail
2026-09-27 19:20:10 +13:00
parent 44cabbcfe4
commit 4efe28ce03
2 changed files with 64 additions and 24 deletions
+16 -2
View File
@@ -27,6 +27,20 @@ const double Createdxf::sheetWidth = 4000;
const double Createdxf::sheetHeight = 2700;
double Createdxf::xScale = 1;
namespace {
/// @p text on one line. A DXF value ends at the line break, so a break
/// inside a text would shift every group code after it by one line and
/// a reader would take values for codes (FINDINGS F052). Callers that
/// mean several lines split them first; this is the safety net.
QString singleLine(QString text)
{
text.replace(QLatin1String("\r\n"), QLatin1String(" "));
text.replace(QLatin1Char('\r'), QLatin1Char(' '));
text.replace(QLatin1Char('\n'), QLatin1Char(' '));
return text;
}
}
double Createdxf::yScale = 1;
Createdxf::Createdxf()
@@ -727,7 +741,7 @@ void Createdxf::drawText(
To_Dxf << 41 << "\r\n";
To_Dxf << xScaleW << "\r\n"; // X Scale
To_Dxf << 1 << "\r\n";
To_Dxf << text << "\r\n"; // Text Value
To_Dxf << singleLine(text) << "\r\n"; // Text Value
To_Dxf << 50 << "\r\n";
To_Dxf << rotation << "\r\n"; // Text Rotation
file.close();
@@ -780,7 +794,7 @@ void Createdxf::drawTextAligned(
To_Dxf << 41 << "\r\n";
To_Dxf << xScaleW << "\r\n"; // X Scale
To_Dxf << 1 << "\r\n";
To_Dxf << text << "\r\n"; // Text Value
To_Dxf << singleLine(text) << "\r\n"; // Text Value
To_Dxf << 50 << "\r\n";
To_Dxf << rotation << "\r\n"; // Text Rotation
#if 0