@@ -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
0 commit comments