Skip to content

Commit 92e7faa

Browse files
committed
dwg/dxf import: fix angle and alignment handing of (m)texts
1 parent 6090a93 commit 92e7faa

File tree

3 files changed

+69
-53
lines changed

3 files changed

+69
-53
lines changed

external/libdxfrw/drw_entities.cpp

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1606,7 +1606,7 @@ void DRW_Text::parseCode( int code, dxfReader *reader )
16061606
angle = reader->getDouble() / ARAD;
16071607
break;
16081608
case 51:
1609-
oblique = reader->getDouble();
1609+
oblique = reader->getDouble() / ARAD;
16101610
break;
16111611
case 71:
16121612
textgen = reader->getInt32();
@@ -1803,6 +1803,7 @@ bool DRW_MText::parseDwg( DRW::Version version, dwgBuffer *buf, duint32 bs )
18031803

18041804
extPoint = buf->get3BitDouble(); /* Extrusion 3BD 210 Undocumented; */
18051805
secPoint = buf->get3BitDouble(); /* X-axis dir 3BD 11 */
1806+
haveXAxis = true;
18061807
updateAngle();
18071808
widthscale = buf->getBitDouble(); /* Rect width BD 41 */
18081809
if ( version > DRW::AC1018 ) //2007+
@@ -2192,7 +2193,7 @@ void DRW_Hatch::parseCode( int code, dxfReader *reader )
21922193
else if ( ellipse ) ellipse->endparam = reader->getDouble() / ARAD;
21932194
break;
21942195
case 52:
2195-
angle = reader->getDouble();
2196+
angle = reader->getDouble() / ARAD;
21962197
break;
21972198
case 73:
21982199
if ( arc ) arc->isccw = reader->getInt32();
@@ -2959,10 +2960,10 @@ void DRW_Dimension::parseCode( int code, dxfReader *reader )
29592960
rot = reader->getDouble();
29602961
break;
29612962
case 50:
2962-
angle = reader->getDouble();
2963+
angle = reader->getDouble() / ARAD;
29632964
break;
29642965
case 52:
2965-
oblique = reader->getDouble();
2966+
oblique = reader->getDouble() / ARAD;
29662967
break;
29672968
case 40:
29682969
length = reader->getDouble();

external/libdxfrw/intern/dxfreader.cpp

Lines changed: 3 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -282,27 +282,15 @@ bool dxfReaderAscii::readInt64()
282282

283283
bool dxfReaderAscii::readDouble()
284284
{
285+
bool ok = false;
285286
type = DOUBLE;
286287
std::string text;
287288
if ( readString( &text ) )
288289
{
289-
#if defined(__APPLE__)
290-
int succeeded = sscanf( & ( text[0] ), "%lg", &doubleData );
291-
if ( succeeded != 1 )
292-
{
293-
QgsDebugMsg( QString( "reading double error:%1" ).arg( text.c_str() ) );
294-
}
295-
#else
296-
std::istringstream sd( text );
297-
sd >> doubleData;
290+
doubleData = QString::fromStdString( text ).toDouble( &ok );
298291
QgsDebugMsg( QString( "%1" ).arg( doubleData ) );
299-
#endif
300-
return true;
301-
}
302-
else
303-
{
304-
return false;
305292
}
293+
return ok;
306294
}
307295

308296
//saved as int or add a bool member??

src/app/dwg/qgsdwgimportdialog.cpp

Lines changed: 61 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -360,40 +360,67 @@ void QgsDwgImportDialog::createGroup( QgsLayerTreeGroup *group, const QString &n
360360
pls.dataDefinedProperties().setProperty( QgsPalLayerSettings::MultiLineHeight, QgsProperty::fromExpression( QStringLiteral( "CASE WHEN interlin<0 THEN 1 ELSE interlin*1.5 END" ) ) );
361361
pls.dataDefinedProperties().setProperty( QgsPalLayerSettings::PositionX, QgsProperty::fromExpression( QStringLiteral( "$x" ) ) );
362362
pls.dataDefinedProperties().setProperty( QgsPalLayerSettings::PositionY, QgsProperty::fromExpression( QStringLiteral( "$y" ) ) );
363-
pls.dataDefinedProperties().setProperty( QgsPalLayerSettings::Hali, QgsProperty::fromExpression( QStringLiteral( "CASE"
364-
" WHEN etype=%1 THEN"
365-
" CASE"
366-
" WHEN alignv IN (1,4,7) THEN 'Left'"
367-
" WHEN alignv IN (2,5,6) THEN 'Center'"
368-
" ELSE 'Right'"
369-
" END"
370-
" ELSE"
371-
" CASE"
372-
" WHEN alignh=0 THEN 'Left'"
373-
" WHEN alignh=1 THEN 'Center'"
374-
" WHEN alignh=2 THEN 'Right'"
375-
" WHEN alignh=3 THEN 'Left'"
376-
" WHEN alignh=4 THEN 'Left'"
377-
" END "
378-
" END" ).arg( DRW::MTEXT ) ) );
379-
pls.dataDefinedProperties().setProperty( QgsPalLayerSettings::Vali, QgsProperty::fromExpression( QStringLiteral( "CASE"
380-
" WHEN etype=%1 THEN"
381-
" CASE"
382-
" WHEN alignv < 4 THEN 'Top'"
383-
" WHEN alignv < 7 THEN 'Half'"
384-
" ELSE 'Bottom'"
385-
" END"
386-
" ELSE"
387-
" CASE"
388-
" WHEN alignv=0 THEN 'Base'"
389-
" WHEN alignv=1 THEN 'Bottom'"
390-
" WHEN alignv=2 THEN 'Half'"
391-
" WHEN alignv=3 THEN 'Top'"
392-
" END"
393-
" END" ).arg( DRW::MTEXT ) ) );
394-
pls.dataDefinedProperties().setProperty( QgsPalLayerSettings::LabelRotation, QgsProperty::fromExpression( QStringLiteral( "360-angle*180.0/pi()" ) ) );
395-
396-
pls.placement = QgsPalLayerSettings::OrderedPositionsAroundPoint;
363+
364+
// DXF TEXT
365+
// vertical: 0 = Base, 1 = Bottom, 2 = Middle, 3 = Top, default Base
366+
// horizontal: 0 = Left, 1 = Center, 2 = Right, 3 = Aligned (if Base), 4 = Middle (if Base), default Left
367+
368+
// DXF MTEXT
369+
// 1 = Top left; 2 = Top center; 3 = Top right
370+
// 4 = Middle left; 5 = Middle center; 6 = Middle right
371+
// 7 = Bottom left; 8 = Bottom center; 9 = Bottom right
372+
373+
// QGIS Quadrant
374+
// 0 QuadrantAboveLeft, 1 QuadrantAbove, 2 QuadrantAboveRight,
375+
// 3 QuadrantLeft, 4 QuadrantOver, 5 QuadrantRight,
376+
// 6 QuadrantBelowLeft, 7 QuadrantBelow, 8 QuadrantBelowRight,
377+
378+
pls.dataDefinedProperties().setProperty(
379+
QgsPalLayerSettings::Hali,
380+
QgsProperty::fromExpression( QStringLiteral(
381+
"CASE"
382+
" WHEN etype=%1 THEN"
383+
" CASE"
384+
" WHEN textgen % 3=2 THEN 'Center'"
385+
" WHEN textgen % 3=0 THEN 'Right'"
386+
" ELSE 'Left'"
387+
" END"
388+
" ELSE"
389+
" CASE"
390+
" WHEN alignh=1 THEN 'Center'"
391+
" WHEN alignh=2 THEN 'Right'"
392+
" ELSE 'Left'"
393+
" END"
394+
" END"
395+
).arg( DRW::MTEXT )
396+
)
397+
);
398+
399+
pls.dataDefinedProperties().setProperty(
400+
QgsPalLayerSettings::Vali,
401+
QgsProperty::fromExpression( QStringLiteral(
402+
"CASE"
403+
" WHEN etype=%1 THEN"
404+
" CASE"
405+
" WHEN textgen<4 THEN 'Top'"
406+
" WHEN textgen<7 THEN 'Half'"
407+
" ELSE 'Bottom'"
408+
" END"
409+
" ELSE"
410+
" CASE"
411+
" WHEN alignv=1 THEN 'Bottom'"
412+
" WHEN alignv=2 THEN 'Half'"
413+
" WHEN alignv=3 THEN 'Top'"
414+
" ELSE 'Base'"
415+
" END"
416+
" END"
417+
).arg( DRW::MTEXT )
418+
)
419+
);
420+
421+
pls.dataDefinedProperties().setProperty( QgsPalLayerSettings::LabelRotation, QgsProperty::fromExpression( QStringLiteral( "360-angle" ) ) );
422+
pls.dataDefinedProperties().setProperty( QgsPalLayerSettings::AlwaysShow, QgsProperty::fromExpression( QStringLiteral( "1" ) ) );
423+
397424
l->setLabeling( new QgsVectorLayerSimpleLabeling( pls ) );
398425
l->setLabelsEnabled( true );
399426
}

0 commit comments

Comments
 (0)