@@ -1274,20 +1274,8 @@ void QgsDwgImporter::addXline( const DRW_Xline &data )
1274
1274
NYI ( QObject::tr ( " XLINE entities" ) );
1275
1275
}
1276
1276
1277
- void QgsDwgImporter::addArc ( const DRW_Arc &data )
1277
+ bool QgsDwgImporter::circularStringFromArc ( const DRW_Arc &data, QgsCircularString &c )
1278
1278
{
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 );
1291
1279
1292
1280
double half = ( data.staangle + data.endangle ) / 2.0 ;
1293
1281
if ( data.staangle > data.endangle )
@@ -1300,13 +1288,38 @@ void QgsDwgImporter::addArc( const DRW_Arc &data )
1300
1288
QgsDebugMsgLevel ( QStringLiteral ( " arc handle=0x%1 radius=%2 staangle=%3 endangle=%4 isccw=%5 half=%6" )
1301
1289
.arg ( data.handle , 0 , 16 ).arg ( data.mRadius ).arg ( data.staangle ).arg ( data.endangle ).arg ( data.isccw ).arg ( half ), 5 );
1302
1290
1303
- QgsCircularString c;
1304
1291
c.setPoints ( QgsPointSequence ()
1305
1292
<< QgsPoint ( QgsWkbTypes::PointZ, data.basePoint .x + std::cos ( a0 ) * data.mRadius , data.basePoint .y + std::sin ( a0 ) * data.mRadius )
1306
1293
<< QgsPoint ( QgsWkbTypes::PointZ, data.basePoint .x + std::cos ( a1 ) * data.mRadius , data.basePoint .y + std::sin ( a1 ) * data.mRadius )
1307
1294
<< QgsPoint ( QgsWkbTypes::PointZ, data.basePoint .x + std::cos ( a2 ) * data.mRadius , data.basePoint .y + std::sin ( a2 ) * data.mRadius )
1308
1295
);
1309
1296
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
+
1310
1323
if ( !createFeature ( layer, f, c ) )
1311
1324
{
1312
1325
LOG ( QObject::tr ( " Could not add %2 [%1]" )
@@ -1382,12 +1395,14 @@ bool QgsDwgImporter::curveFromLWPolyline( const DRW_LWPolyline &data, QgsCompoun
1382
1395
{
1383
1396
QgsCircularString *c = new QgsCircularString ();
1384
1397
c->setPoints ( s );
1398
+ QgsDebugMsg ( QStringLiteral ( " add circular string:%1" ).arg ( c->asWkt () ) );
1385
1399
cc.addCurve ( c );
1386
1400
}
1387
1401
else
1388
1402
{
1389
1403
QgsLineString *c = new QgsLineString ();
1390
1404
c->setPoints ( s );
1405
+ QgsDebugMsg ( QStringLiteral ( " add line string:%1" ).arg ( c->asWkt () ) );
1391
1406
cc.addCurve ( c );
1392
1407
}
1393
1408
@@ -1977,64 +1992,84 @@ static void rbsplinu( const DRW_Spline &data,
1977
1992
}
1978
1993
}
1979
1994
1980
- void QgsDwgImporter::addSpline ( const DRW_Spline * data )
1995
+ bool QgsDwgImporter::lineFromSpline ( const DRW_Spline & data, QgsLineString &l )
1981
1996
{
1982
- Q_ASSERT ( data );
1983
-
1984
- if ( data->degree < 1 || data->degree > 3 )
1997
+ if ( data.degree < 1 || data.degree > 3 )
1985
1998
{
1986
1999
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 ;
1990
2003
}
1991
2004
1992
2005
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 );
1998
2011
1999
2012
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 )
2001
2014
{
2002
- const DRW_Coord &p = *data-> controllist [i];
2015
+ const DRW_Coord &p = *data. controllist [i];
2003
2016
cps.emplace_back ( QgsVector ( p.x , p.y ) );
2004
2017
}
2005
2018
2006
- if ( data-> ncontrol == 0 && data-> degree != 2 )
2019
+ if ( data. ncontrol == 0 && data. degree != 2 )
2007
2020
{
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 )
2009
2022
{
2010
- const DRW_Coord &p = *data-> fitlist [i];
2023
+ const DRW_Coord &p = *data. fitlist [i];
2011
2024
cps.emplace_back ( QgsVector ( p.x , p.y ) );
2012
2025
}
2013
2026
}
2014
2027
2015
- if ( !cps.empty () && data-> flags & 1 )
2028
+ if ( !cps.empty () && data. flags & 1 )
2016
2029
{
2017
- for ( int i = 0 ; i < data-> degree ; ++i )
2030
+ for ( int i = 0 ; i < data. degree ; ++i )
2018
2031
cps.push_back ( cps[i] );
2019
2032
}
2020
2033
2021
2034
size_t npts = cps.size ();
2022
- size_t k = data-> degree + 1 ;
2035
+ size_t k = data. degree + 1 ;
2023
2036
int p1 = mSplineSegs * ( int ) npts;
2024
2037
2025
2038
std::vector<double > h ( npts + 1 , 1 . );
2026
2039
std::vector<QgsPointXY> p ( p1, QgsPointXY ( 0 ., 0 . ) );
2027
2040
2028
- if ( data-> flags & 1 )
2041
+ if ( data. flags & 1 )
2029
2042
{
2030
- rbsplinu ( * data, npts, k, p1, cps, h, p );
2043
+ rbsplinu ( data, npts, k, p1, cps, h, p );
2031
2044
}
2032
2045
else
2033
2046
{
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 ;
2035
2070
}
2036
2071
2037
- OGRLayerH layer = OGR_DS_GetLayerByName ( mDs .get (), " polylines" );
2072
+ OGRLayerH layer = OGR_DS_GetLayerByName ( mDs .get (), " polylines" );
2038
2073
Q_ASSERT ( layer );
2039
2074
OGRFeatureDefnH dfn = OGR_L_GetLayerDefn ( layer );
2040
2075
Q_ASSERT ( dfn );
@@ -2043,12 +2078,6 @@ void QgsDwgImporter::addSpline( const DRW_Spline *data )
2043
2078
2044
2079
addEntity ( dfn, f, *data );
2045
2080
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
-
2052
2081
if ( !createFeature ( layer, f, l ) )
2053
2082
{
2054
2083
LOG ( QObject::tr ( " Could not add %2 [%1]" )
@@ -2161,7 +2190,7 @@ void QgsDwgImporter::addMText( const DRW_MText &data )
2161
2190
addEntity ( dfn, f, data );
2162
2191
2163
2192
SETDOUBLE ( height );
2164
- SETSTRING ( text );
2193
+ SETSTRING ( text ); // TODO: parse MTEXT
2165
2194
SETDOUBLE ( angle );
2166
2195
SETDOUBLE ( widthscale );
2167
2196
SETDOUBLE ( oblique );
@@ -2196,7 +2225,7 @@ void QgsDwgImporter::addText( const DRW_Text &data )
2196
2225
addEntity ( dfn, f, data );
2197
2226
2198
2227
SETDOUBLE ( height );
2199
- SETSTRING ( text ); // TODO: parse MTEXT
2228
+ SETSTRING ( text );
2200
2229
SETDOUBLE ( angle );
2201
2230
SETDOUBLE ( widthscale );
2202
2231
SETDOUBLE ( oblique );
@@ -2300,9 +2329,16 @@ void QgsDwgImporter::addHatch( const DRW_Hatch *pdata )
2300
2329
2301
2330
QgsCurvePolygon p;
2302
2331
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
+ }
2304
2340
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++ )
2306
2342
{
2307
2343
const DRW_HatchLoop &hatchLoop = *data.looplist [i];
2308
2344
@@ -2315,6 +2351,8 @@ void QgsDwgImporter::addHatch( const DRW_Hatch *pdata )
2315
2351
2316
2352
const DRW_LWPolyline *lwp = dynamic_cast <const DRW_LWPolyline *>( entity );
2317
2353
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 );
2318
2356
if ( lwp )
2319
2357
{
2320
2358
curveFromLWPolyline ( *lwp, *cc );
@@ -2325,7 +2363,21 @@ void QgsDwgImporter::addHatch( const DRW_Hatch *pdata )
2325
2363
ls->setPoints ( QgsPointSequence ()
2326
2364
<< QgsPoint ( QgsWkbTypes::PointZ, l->basePoint .x , l->basePoint .y , l->basePoint .z )
2327
2365
<< 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 () ) );
2329
2381
cc->addCurve ( ls );
2330
2382
}
2331
2383
else
0 commit comments