Skip to content

Commit 1a96982

Browse files
committedFeb 19, 2019
dwg import: fix handling of arc and splines in hatches
1 parent 3aa2d9f commit 1a96982

File tree

2 files changed

+105
-49
lines changed

2 files changed

+105
-49
lines changed
 

‎src/app/dwg/qgsdwgimporter.cpp

Lines changed: 101 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -1274,20 +1274,8 @@ void QgsDwgImporter::addXline( const DRW_Xline &data )
12741274
NYI( QObject::tr( "XLINE entities" ) );
12751275
}
12761276

1277-
void QgsDwgImporter::addArc( const DRW_Arc &data )
1277+
bool QgsDwgImporter::circularStringFromArc( const DRW_Arc &data, QgsCircularString &c )
12781278
{
1279-
OGRLayerH layer = OGR_DS_GetLayerByName( mDs.get(), "lines" );
1280-
Q_ASSERT( layer );
1281-
OGRFeatureDefnH dfn = OGR_L_GetLayerDefn( layer );
1282-
Q_ASSERT( dfn );
1283-
OGRFeatureH f = OGR_F_Create( dfn );
1284-
Q_ASSERT( f );
1285-
1286-
addEntity( dfn, f, data );
1287-
1288-
SETDOUBLE( thickness );
1289-
1290-
setPoint( dfn, f, QStringLiteral( "ext" ), data.extPoint );
12911279

12921280
double half = ( data.staangle + data.endangle ) / 2.0;
12931281
if ( data.staangle > data.endangle )
@@ -1300,13 +1288,38 @@ void QgsDwgImporter::addArc( const DRW_Arc &data )
13001288
QgsDebugMsgLevel( QStringLiteral( "arc handle=0x%1 radius=%2 staangle=%3 endangle=%4 isccw=%5 half=%6" )
13011289
.arg( data.handle, 0, 16 ).arg( data.mRadius ).arg( data.staangle ).arg( data.endangle ).arg( data.isccw ).arg( half ), 5 );
13021290

1303-
QgsCircularString c;
13041291
c.setPoints( QgsPointSequence()
13051292
<< QgsPoint( QgsWkbTypes::PointZ, data.basePoint.x + std::cos( a0 ) * data.mRadius, data.basePoint.y + std::sin( a0 ) * data.mRadius )
13061293
<< QgsPoint( QgsWkbTypes::PointZ, data.basePoint.x + std::cos( a1 ) * data.mRadius, data.basePoint.y + std::sin( a1 ) * data.mRadius )
13071294
<< QgsPoint( QgsWkbTypes::PointZ, data.basePoint.x + std::cos( a2 ) * data.mRadius, data.basePoint.y + std::sin( a2 ) * data.mRadius )
13081295
);
13091296

1297+
return true;
1298+
}
1299+
1300+
void QgsDwgImporter::addArc( const DRW_Arc &data )
1301+
{
1302+
QgsCircularString c;
1303+
if ( !circularStringFromArc( data, c ) )
1304+
{
1305+
LOG( QObject::tr( "Could not create circular string from %2 [%1]" )
1306+
.arg( QString::fromUtf8( CPLGetLastErrorMsg() ), QObject::tr( "arc" ) )
1307+
);
1308+
return;
1309+
}
1310+
1311+
OGRLayerH layer = OGR_DS_GetLayerByName( mDs.get(), "lines" );
1312+
Q_ASSERT( layer );
1313+
OGRFeatureDefnH dfn = OGR_L_GetLayerDefn( layer );
1314+
Q_ASSERT( dfn );
1315+
OGRFeatureH f = OGR_F_Create( dfn );
1316+
Q_ASSERT( f );
1317+
1318+
addEntity( dfn, f, data );
1319+
1320+
SETDOUBLE( thickness );
1321+
setPoint( dfn, f, QStringLiteral( "ext" ), data.extPoint );
1322+
13101323
if ( !createFeature( layer, f, c ) )
13111324
{
13121325
LOG( QObject::tr( "Could not add %2 [%1]" )
@@ -1382,12 +1395,14 @@ bool QgsDwgImporter::curveFromLWPolyline( const DRW_LWPolyline &data, QgsCompoun
13821395
{
13831396
QgsCircularString *c = new QgsCircularString();
13841397
c->setPoints( s );
1398+
QgsDebugMsg( QStringLiteral( "add circular string:%1" ).arg( c->asWkt() ) );
13851399
cc.addCurve( c );
13861400
}
13871401
else
13881402
{
13891403
QgsLineString *c = new QgsLineString();
13901404
c->setPoints( s );
1405+
QgsDebugMsg( QStringLiteral( "add line string:%1" ).arg( c->asWkt() ) );
13911406
cc.addCurve( c );
13921407
}
13931408

@@ -1977,64 +1992,84 @@ static void rbsplinu( const DRW_Spline &data,
19771992
}
19781993
}
19791994

1980-
void QgsDwgImporter::addSpline( const DRW_Spline *data )
1995+
bool QgsDwgImporter::lineFromSpline( const DRW_Spline &data, QgsLineString &l )
19811996
{
1982-
Q_ASSERT( data );
1983-
1984-
if ( data->degree < 1 || data->degree > 3 )
1997+
if ( data.degree < 1 || data.degree > 3 )
19851998
{
19861999
QgsDebugMsg( QStringLiteral( "%1: unknown spline degree %2" )
1987-
.arg( data->handle, 0, 16 )
1988-
.arg( data->degree ) );
1989-
return;
2000+
.arg( data.handle, 0, 16 )
2001+
.arg( data.degree ) );
2002+
return false;
19902003
}
19912004

19922005
QgsDebugMsgLevel( QStringLiteral( "degree: %1 ncontrol:%2 knotslist.size():%3 controllist.size():%4 fitlist.size():%5" )
1993-
.arg( data->degree )
1994-
.arg( data->ncontrol )
1995-
.arg( data->knotslist.size() )
1996-
.arg( data->controllist.size() )
1997-
.arg( data->fitlist.size() ), 5 );
2006+
.arg( data.degree )
2007+
.arg( data.ncontrol )
2008+
.arg( data.knotslist.size() )
2009+
.arg( data.controllist.size() )
2010+
.arg( data.fitlist.size() ), 5 );
19982011

19992012
std::vector<QgsVector> cps;
2000-
for ( size_t i = 0; i < data->controllist.size(); ++i )
2013+
for ( size_t i = 0; i < data.controllist.size(); ++i )
20012014
{
2002-
const DRW_Coord &p = *data->controllist[i];
2015+
const DRW_Coord &p = *data.controllist[i];
20032016
cps.emplace_back( QgsVector( p.x, p.y ) );
20042017
}
20052018

2006-
if ( data->ncontrol == 0 && data->degree != 2 )
2019+
if ( data.ncontrol == 0 && data.degree != 2 )
20072020
{
2008-
for ( std::vector<DRW_Coord *>::size_type i = 0; i < data->fitlist.size(); ++i )
2021+
for ( std::vector<DRW_Coord *>::size_type i = 0; i < data.fitlist.size(); ++i )
20092022
{
2010-
const DRW_Coord &p = *data->fitlist[i];
2023+
const DRW_Coord &p = *data.fitlist[i];
20112024
cps.emplace_back( QgsVector( p.x, p.y ) );
20122025
}
20132026
}
20142027

2015-
if ( !cps.empty() && data->flags & 1 )
2028+
if ( !cps.empty() && data.flags & 1 )
20162029
{
2017-
for ( int i = 0; i < data->degree; ++i )
2030+
for ( int i = 0; i < data.degree; ++i )
20182031
cps.push_back( cps[i] );
20192032
}
20202033

20212034
size_t npts = cps.size();
2022-
size_t k = data->degree + 1;
2035+
size_t k = data.degree + 1;
20232036
int p1 = mSplineSegs * ( int ) npts;
20242037

20252038
std::vector<double> h( npts + 1, 1. );
20262039
std::vector<QgsPointXY> p( p1, QgsPointXY( 0., 0. ) );
20272040

2028-
if ( data->flags & 1 )
2041+
if ( data.flags & 1 )
20292042
{
2030-
rbsplinu( *data, npts, k, p1, cps, h, p );
2043+
rbsplinu( data, npts, k, p1, cps, h, p );
20312044
}
20322045
else
20332046
{
2034-
rbspline( *data, npts, k, p1, cps, h, p );
2047+
rbspline( data, npts, k, p1, cps, h, p );
2048+
}
2049+
2050+
2051+
QgsPointSequence ps;
2052+
for ( size_t i = 0; i < p.size(); ++i )
2053+
ps << QgsPoint( p[i] );
2054+
l.setPoints( ps );
2055+
2056+
return true;
2057+
}
2058+
2059+
void QgsDwgImporter::addSpline( const DRW_Spline *data )
2060+
{
2061+
Q_ASSERT( data );
2062+
2063+
QgsLineString l;
2064+
if ( !lineFromSpline( *data, l ) )
2065+
{
2066+
LOG( QObject::tr( "Could not create line from %2 [%1]" )
2067+
.arg( QString::fromUtf8( CPLGetLastErrorMsg() ), QObject::tr( "spline" ) )
2068+
);
2069+
return;
20352070
}
20362071

2037-
OGRLayerH layer = OGR_DS_GetLayerByName( mDs.get(), "polylines" );
2072+
OGRLayerH layer = OGR_DS_GetLayerByName( mDs.get(), "polylines" );
20382073
Q_ASSERT( layer );
20392074
OGRFeatureDefnH dfn = OGR_L_GetLayerDefn( layer );
20402075
Q_ASSERT( dfn );
@@ -2043,12 +2078,6 @@ void QgsDwgImporter::addSpline( const DRW_Spline *data )
20432078

20442079
addEntity( dfn, f, *data );
20452080

2046-
QgsLineString l;
2047-
QgsPointSequence ps;
2048-
for ( size_t i = 0; i < p.size(); ++i )
2049-
ps << QgsPoint( p[i] );
2050-
l.setPoints( ps );
2051-
20522081
if ( !createFeature( layer, f, l ) )
20532082
{
20542083
LOG( QObject::tr( "Could not add %2 [%1]" )
@@ -2161,7 +2190,7 @@ void QgsDwgImporter::addMText( const DRW_MText &data )
21612190
addEntity( dfn, f, data );
21622191

21632192
SETDOUBLE( height );
2164-
SETSTRING( text );
2193+
SETSTRING( text ); // TODO: parse MTEXT
21652194
SETDOUBLE( angle );
21662195
SETDOUBLE( widthscale );
21672196
SETDOUBLE( oblique );
@@ -2196,7 +2225,7 @@ void QgsDwgImporter::addText( const DRW_Text &data )
21962225
addEntity( dfn, f, data );
21972226

21982227
SETDOUBLE( height );
2199-
SETSTRING( text ); // TODO: parse MTEXT
2228+
SETSTRING( text );
22002229
SETDOUBLE( angle );
22012230
SETDOUBLE( widthscale );
22022231
SETDOUBLE( oblique );
@@ -2300,9 +2329,16 @@ void QgsDwgImporter::addHatch( const DRW_Hatch *pdata )
23002329

23012330
QgsCurvePolygon p;
23022331

2303-
Q_ASSERT( data.looplist.size() == data.loopsnum );
2332+
if ( data.looplist.size() != data.loopsnum )
2333+
{
2334+
LOG( QObject::tr( "0x%1: %2 instead of %3 loops found" )
2335+
.arg( data.handle, 0, 16 )
2336+
.arg( data.looplist.size() )
2337+
.arg( data.loopsnum )
2338+
);
2339+
}
23042340

2305-
for ( std::vector<DRW_HatchLoop *>::size_type i = 0; i < data.loopsnum; i++ )
2341+
for ( std::vector<DRW_HatchLoop *>::size_type i = 0; i < data.looplist.size(); i++ )
23062342
{
23072343
const DRW_HatchLoop &hatchLoop = *data.looplist[i];
23082344

@@ -2315,6 +2351,8 @@ void QgsDwgImporter::addHatch( const DRW_Hatch *pdata )
23152351

23162352
const DRW_LWPolyline *lwp = dynamic_cast<const DRW_LWPolyline *>( entity );
23172353
const DRW_Line *l = dynamic_cast<const DRW_Line *>( entity );
2354+
const DRW_Arc *a = dynamic_cast<const DRW_Arc *>( entity );
2355+
const DRW_Spline *sp = dynamic_cast<const DRW_Spline *>( entity );
23182356
if ( lwp )
23192357
{
23202358
curveFromLWPolyline( *lwp, *cc );
@@ -2325,7 +2363,21 @@ void QgsDwgImporter::addHatch( const DRW_Hatch *pdata )
23252363
ls->setPoints( QgsPointSequence()
23262364
<< QgsPoint( QgsWkbTypes::PointZ, l->basePoint.x, l->basePoint.y, l->basePoint.z )
23272365
<< QgsPoint( QgsWkbTypes::PointZ, l->secPoint.x, l->secPoint.y, l->secPoint.z ) );
2328-
// QgsDebugMsg( QStringLiteral( "add line string:%1" ).arg( ls->asWkt() ) );
2366+
QgsDebugMsg( QStringLiteral( "add line string:%1" ).arg( ls->asWkt() ) );
2367+
cc->addCurve( ls );
2368+
}
2369+
else if ( a )
2370+
{
2371+
QgsCircularString *cs = new QgsCircularString();
2372+
circularStringFromArc( *a, *cs );
2373+
QgsDebugMsg( QStringLiteral( "add line string:%1" ).arg( cs->asWkt() ) );
2374+
cc->addCurve( cs );
2375+
}
2376+
else if ( sp )
2377+
{
2378+
QgsLineString *ls = new QgsLineString();
2379+
lineFromSpline( *sp, *ls );
2380+
QgsDebugMsg( QStringLiteral( "add line string:%1" ).arg( ls->asWkt() ) );
23292381
cc->addCurve( ls );
23302382
}
23312383
else

‎src/app/dwg/qgsdwgimporter.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@
2424
#include "qgsogrutils.h"
2525

2626
class QgsCompoundCurve;
27+
class QgsLineString;
28+
class QgsCircularString;
2729
class QgsQgsCoordinateReferenceSystem;
2830

2931
class QgsDwgImporter : public DRW_Interface
@@ -182,6 +184,8 @@ class QgsDwgImporter : public DRW_Interface
182184
void setPoint( OGRFeatureDefnH dfn, OGRFeatureH f, const QString &field, const DRW_Coord &value ) const;
183185

184186
bool curveFromLWPolyline( const DRW_LWPolyline &data, QgsCompoundCurve &cc );
187+
bool circularStringFromArc( const DRW_Arc &data, QgsCircularString &c );
188+
bool lineFromSpline( const DRW_Spline &data, QgsLineString &l );
185189

186190
bool expandInserts( QString &error );
187191

0 commit comments

Comments
 (0)
Please sign in to comment.