diff --git a/external/libdxfrw/CMakeLists.txt b/external/libdxfrw/CMakeLists.txt index 76de46e8371..1778265b06f 100644 --- a/external/libdxfrw/CMakeLists.txt +++ b/external/libdxfrw/CMakeLists.txt @@ -1,8 +1,3 @@ - -include_directories(SYSTEM - ${Qt5Core_INCLUDE_DIRS} -) - add_library(libdxfrw STATIC drw_base.cpp drw_classes.cpp @@ -32,10 +27,6 @@ target_include_directories(libdxfrw PUBLIC set_property(TARGET libdxfrw PROPERTY POSITION_INDEPENDENT_CODE ON) -target_link_libraries(libdxfrw - qgis_core # QgsDebugMsg -) - if(FALSE) if(DOXYGEN_FOUND) add_custom_target(doxygen-dxfrw ALL diff --git a/external/libdxfrw/drw_entities.cpp b/external/libdxfrw/drw_entities.cpp index a8778980519..01efd56b61a 100644 --- a/external/libdxfrw/drw_entities.cpp +++ b/external/libdxfrw/drw_entities.cpp @@ -10,33 +10,16 @@ ** along with this program. If not, see . ** ******************************************************************************/ -// uncomment to get detailed debug output on DWG read. Caution: this option makes DWG import super-slow! -// #define DWGDEBUG 1 - #include - #include "drw_entities.h" #include "intern/dxfreader.h" #include "intern/dwgbuffer.h" #include "intern/drw_dbg.h" -#include - -#include "qgslogger.h" - -#ifndef DWGDEBUG -#undef QgsDebugCall -#undef QgsDebugMsg -#undef QgsDebugMsgLevel -#define QgsDebugCall -#define QgsDebugMsg(str) -#define QgsDebugMsgLevel(str, level) -#endif - #define RESERVE( vector, size ) try { \ vector.reserve(size); \ } catch(const std::exception &e) { \ - QgsDebugMsgLevel( QStringLiteral( "allocation exception (size=%1; error=%2)" ).arg( size ).arg( e.what() ), 4 ); \ + /* QgsDebugMsg( QString( "allocation exception (size=%1; error=%2)" ).arg( size ).arg( e.what() ) );*/ \ throw e; \ } @@ -45,36 +28,32 @@ * Calculate arbitrary axis for apply extrusions * @author Rallaz */ -void DRW_Entity::calculateAxis( const DRW_Coord &extPoint ) -{ - //Follow the arbitrary DXF definitions for extrusion axes. - if ( std::fabs( extPoint.x ) < 0.015625 && std::fabs( extPoint.y ) < 0.015625 ) - { - //If we get here, implement Ax = Wy x N where Wy is [0,1,0] per the DXF spec. - //The cross product works out to Wy.y*N.z-Wy.z*N.y, Wy.z*N.x-Wy.x*N.z, Wy.x*N.y-Wy.y*N.x - //Factoring in the fixed values for Wy gives N.z,0,-N.x - extAxisX.x = extPoint.z; - extAxisX.y = 0; - extAxisX.z = -extPoint.x; - } - else - { - //Otherwise, implement Ax = Wz x N where Wz is [0,0,1] per the DXF spec. - //The cross product works out to Wz.y*N.z-Wz.z*N.y, Wz.z*N.x-Wz.x*N.z, Wz.x*N.y-Wz.y*N.x - //Factoring in the fixed values for Wz gives -N.y,N.x,0. - extAxisX.x = -extPoint.y; - extAxisX.y = extPoint.x; - extAxisX.z = 0; - } +void DRW_Entity::calculateAxis(const DRW_Coord &extPoint){ + //Follow the arbitrary DXF definitions for extrusion axes. + if ( std::fabs( extPoint.x ) < 0.015625 && std::fabs( extPoint.y ) < 0.015625 ) { + //If we get here, implement Ax = Wy x N where Wy is [0,1,0] per the DXF spec. + //The cross product works out to Wy.y*N.z-Wy.z*N.y, Wy.z*N.x-Wy.x*N.z, Wy.x*N.y-Wy.y*N.x + //Factoring in the fixed values for Wy gives N.z,0,-N.x + extAxisX.x = extPoint.z; + extAxisX.y = 0; + extAxisX.z = -extPoint.x; + } else { + //Otherwise, implement Ax = Wz x N where Wz is [0,0,1] per the DXF spec. + //The cross product works out to Wz.y*N.z-Wz.z*N.y, Wz.z*N.x-Wz.x*N.z, Wz.x*N.y-Wz.y*N.x + //Factoring in the fixed values for Wz gives -N.y,N.x,0. + extAxisX.x = -extPoint.y; + extAxisX.y = extPoint.x; + extAxisX.z = 0; + } - extAxisX.unitize(); + extAxisX.unitize(); - //Ay = N x Ax - extAxisY.x = ( extPoint.y * extAxisX.z ) - ( extAxisX.y * extPoint.z ); - extAxisY.y = ( extPoint.z * extAxisX.x ) - ( extAxisX.z * extPoint.x ); - extAxisY.z = ( extPoint.x * extAxisX.y ) - ( extAxisX.x * extPoint.y ); + //Ay = N x Ax + extAxisY.x = (extPoint.y * extAxisX.z) - (extAxisX.y * extPoint.z); + extAxisY.y = (extPoint.z * extAxisX.x) - (extAxisX.z * extPoint.x); + extAxisY.z = (extPoint.x * extAxisX.y) - (extAxisX.x * extPoint.y); - extAxisY.unitize(); + extAxisY.unitize(); } //! Extrude a point using arbitrary axis @@ -82,887 +61,732 @@ void DRW_Entity::calculateAxis( const DRW_Coord &extPoint ) * apply extrusion in a point using arbitrary axis (previously calculated) * @author Rallaz */ -void DRW_Entity::extrudePoint( const DRW_Coord &extPoint, DRW_Coord *point ) -{ - double px, py, pz; - px = ( extAxisX.x * point->x ) + ( extAxisY.x * point->y ) + ( extPoint.x * point->z ); - py = ( extAxisX.y * point->x ) + ( extAxisY.y * point->y ) + ( extPoint.y * point->z ); - pz = ( extAxisX.z * point->x ) + ( extAxisY.z * point->y ) + ( extPoint.z * point->z ); +void DRW_Entity::extrudePoint(const DRW_Coord &extPoint, DRW_Coord *point){ + double px, py, pz; + px = (extAxisX.x*point->x)+(extAxisY.x*point->y)+(extPoint.x*point->z); + py = (extAxisX.y*point->x)+(extAxisY.y*point->y)+(extPoint.y*point->z); + pz = (extAxisX.z*point->x)+(extAxisY.z*point->y)+(extPoint.z*point->z); - point->x = px; - point->y = py; - point->z = pz; + point->x = px; + point->y = py; + point->z = pz; } -bool DRW_Entity::parseCode( int code, dxfReader *reader ) -{ - switch ( code ) - { +bool DRW_Entity::parseCode(int code, dxfReader *reader){ + switch (code) { case 5: - handle = reader->getHandleString(); - break; + handle = reader->getHandleString(); + break; case 330: - parentHandle = reader->getHandleString(); - break; + parentHandle = reader->getHandleString(); + break; case 8: - layer = reader->getUtf8String(); - break; + layer = reader->getUtf8String(); + break; case 6: - lineType = reader->getUtf8String(); - break; + lineType = reader->getUtf8String(); + break; case 62: - color = reader->getInt32(); - break; + color = reader->getInt32(); + break; case 370: - lWeight = DRW_LW_Conv::dxfInt2lineWidth( reader->getInt32() ); - break; + lWeight = DRW_LW_Conv::dxfInt2lineWidth(reader->getInt32()); + break; case 48: - ltypeScale = reader->getDouble(); - break; + ltypeScale = reader->getDouble(); + break; case 60: - visible = reader->getBool(); - break; + visible = reader->getBool(); + break; case 420: - color24 = reader->getInt32(); - break; + color24 = reader->getInt32(); + break; case 430: - colorName = reader->getString(); - break; + colorName = reader->getString(); + break; case 440: transparency = reader->getInt32(); break; case 67: - space = static_cast( reader->getInt32() ); - break; + space = static_cast(reader->getInt32()); + break; case 102: - parseDxfGroups( code, reader ); - break; + parseDxfGroups(code, reader); + break; case 1000: case 1001: case 1002: case 1003: case 1004: case 1005: - extData.push_back( new DRW_Variant( code, reader->getString() ) ); - break; + extData.push_back(std::make_shared(code, reader->getString())); + break; case 1010: case 1011: case 1012: case 1013: - curr = new DRW_Variant( code, DRW_Coord( reader->getDouble(), 0.0, 0.0 ) ); - extData.push_back( curr ); - break; + curr =std::make_shared(code, DRW_Coord(reader->getDouble(), 0.0, 0.0)); + extData.push_back(curr); + break; case 1020: case 1021: case 1022: case 1023: - if ( curr ) - curr->setCoordY( reader->getDouble() ); - break; + if (curr) + curr->setCoordY(reader->getDouble()); + break; case 1030: case 1031: case 1032: case 1033: - if ( curr ) - curr->setCoordZ( reader->getDouble() ); - curr = nullptr; - break; + if (curr) + curr->setCoordZ(reader->getDouble()); + //FIXME, why do we discard curr right after setting the its Z +// curr=NULL; + break; case 1040: case 1041: case 1042: - extData.push_back( new DRW_Variant( code, reader->getDouble() ) ); - break; + extData.push_back(std::make_shared(code, reader->getDouble() )); + break; case 1070: case 1071: - extData.push_back( new DRW_Variant( code, reader->getInt32() ) ); - break; + extData.push_back(std::make_shared(code, reader->getInt32() )); + break; default: - break; - } - return true; + break; + } + return true; } //parses dxf 102 groups to read entity -bool DRW_Entity::parseDxfGroups( int code, dxfReader *reader ) -{ - std::list ls; - DRW_Variant curr; - int nc; - std::string appName = reader->getString(); - if ( !appName.empty() && appName.at( 0 ) == '{' ) - { - curr.addString( code, appName.substr( 1, static_cast< int >( appName.size() ) - 1 ) ); - ls.push_back( curr ); - while ( code != 102 && appName.at( 0 ) == '}' ) - { - reader->readRec( &nc );//RLZ curr.code = code or nc? +bool DRW_Entity::parseDxfGroups(int code, dxfReader *reader){ + std::list ls; + DRW_Variant curr; + int nc; + std::string appName= reader->getString(); + if (!appName.empty() && appName.at(0)== '{'){ + curr.addString( code, appName.substr( 1, static_cast< int >( appName.size() ) - 1 ) ); + ls.push_back(curr); + while (code !=102 && appName.at(0)== '}'){ + reader->readRec(&nc);//RLZ curr.code = code or nc? // curr.code = code; - //RLZ code == 330 || code == 360 OR nc == 330 || nc == 360 ? - if ( code == 330 || code == 360 ) - curr.addInt( code, reader->getHandleString() );//RLZ code or nc - else - { - switch ( reader->type ) - { - case dxfReader::STRING: - curr.addString( code, reader->getString() );//RLZ code or nc - break; - case dxfReader::INT32: - case dxfReader::INT64: - curr.addInt( code, reader->getInt32() );//RLZ code or nc - break; - case dxfReader::DOUBLE: - curr.addDouble( code, reader->getDouble() );//RLZ code or nc - break; - case dxfReader::BOOL: - curr.addInt( code, reader->getInt32() );//RLZ code or nc - break; - default: - break; + //RLZ code == 330 || code == 360 OR nc == 330 || nc == 360 ? + if (code == 330 || code == 360) + curr.addInt(code, reader->getHandleString());//RLZ code or nc + else { + switch (reader->type) { + case dxfReader::STRING: + curr.addString(code, reader->getString());//RLZ code or nc + break; + case dxfReader::INT32: + case dxfReader::INT64: + curr.addInt(code, reader->getInt32());//RLZ code or nc + break; + case dxfReader::DOUBLE: + curr.addDouble(code, reader->getDouble());//RLZ code or nc + break; + case dxfReader::BOOL: + curr.addInt(code, reader->getInt32());//RLZ code or nc + break; + default: + break; + } + } + ls.push_back(curr); } - } - ls.push_back( curr ); } - } - appData.push_back( ls ); - return true; + appData.push_back(ls); + return true; } -bool DRW_Entity::parseDwg( DRW::Version version, dwgBuffer *buf, dwgBuffer *strBuf, duint32 bs ) -{ - objSize = 0; - QgsDebugMsgLevel( QStringLiteral( "***************************** parsing entity *********************************************" ), 4 ); - oType = buf->getObjType( version ); - QgsDebugMsgLevel( QStringLiteral( "Object type: %1, 0x%2" ).arg( oType ).arg( oType, 0, 16 ), 4 ); - if ( version > DRW::AC1014 && version < DRW::AC1024 ) //2000 & 2004 - { - objSize = buf->getRawLong32(); //RL 32bits object size in bits - QgsDebugMsgLevel( QStringLiteral( " Object size: %1" ).arg( objSize ), 4 ); - } - if ( version > DRW::AC1021 ) //2010+ - { - duint32 ms = buf->size(); - objSize = ms * 8 - bs; - QgsDebugMsgLevel( QStringLiteral( " Object size: %1" ).arg( objSize ), 4 ); - } +bool DRW_Entity::parseDwg(DRW::Version version, dwgBuffer *buf, dwgBuffer* strBuf, duint32 bs){ + objSize=0; + DRW_DBG("\n***************************** parsing entity *********************************************\n"); + oType = buf->getObjType(version); + DRW_DBG("Object type: "); DRW_DBG(oType); DRW_DBG(", "); DRW_DBGH(oType); - if ( strBuf && version > DRW::AC1018 ) //2007+ - { - strBuf->moveBitPos( objSize - 1 ); - QgsDebugMsgLevel( QStringLiteral( "strBuf strbit pos 2007:%1 strBuf bpos 2007:%2" ) - .arg( strBuf->getPosition() ).arg( strBuf->getBitPos() ), 4 - ); - if ( strBuf->getBit() == 1 ) - { - QgsDebugMsgLevel( QStringLiteral( "string bit is 1" ), 4 ); - strBuf->moveBitPos( -17 ); - duint16 strDataSize = strBuf->getRawShort16(); - QgsDebugMsgLevel( QStringLiteral( "strDataSize: %1" ).arg( strDataSize ), 4 ); - if ( ( strDataSize & 0x8000 ) == 0x8000 ) - { - QgsDebugMsgLevel( QStringLiteral( "string 0x8000 bit is set" ), 4 ); - strBuf->moveBitPos( -33 );//RLZ pending to verify - duint16 hiSize = strBuf->getRawShort16(); - strDataSize = ( ( strDataSize & 0x7fff ) | ( hiSize << 15 ) ); - } - strBuf->moveBitPos( -strDataSize - 16 ); //-14 - - QgsDebugMsgLevel( QStringLiteral( "strBuf start strDataSize pos 2007:%1 strBuf bpos 2007:%2" ) - .arg( strBuf->getPosition() ).arg( strBuf->getBitPos() ), 4 - ); + if (version > DRW::AC1014 && version < DRW::AC1024) {//2000 & 2004 + objSize = buf->getRawLong32(); //RL 32bits object size in bits + DRW_DBG(" Object size: "); DRW_DBG(objSize); DRW_DBG("\n"); } - else - { - QgsDebugMsgLevel( QStringLiteral( "string bit is 0" ), 4 ); + if (version > DRW::AC1021) {//2010+ + duint32 ms = buf->size(); + objSize = ms*8 - bs; + DRW_DBG(" Object size: "); DRW_DBG(objSize); DRW_DBG("\n"); } - QgsDebugMsgLevel( QStringLiteral( "strBuf start pos 2007:%1 strBuf bpos 2007:%2" ) - .arg( strBuf->getPosition() ).arg( strBuf->getBitPos() ), 4 - ); - } + if (strBuf && version > DRW::AC1018) {//2007+ + strBuf->moveBitPos(objSize-1); + DRW_DBG(" strBuf strbit pos 2007: "); DRW_DBG(strBuf->getPosition()); DRW_DBG(" strBuf bpos 2007: "); DRW_DBG(strBuf->getBitPos()); DRW_DBG("\n"); + if (strBuf->getBit() == 1){ + DRW_DBG("DRW_TableEntry::parseDwg string bit is 1\n"); + strBuf->moveBitPos(-17); + duint16 strDataSize = strBuf->getRawShort16(); + DRW_DBG("\nDRW_TableEntry::parseDwg string strDataSize: "); DRW_DBGH(strDataSize); DRW_DBG("\n"); + if ( (strDataSize& 0x8000) == 0x8000){ + DRW_DBG("\nDRW_TableEntry::parseDwg string 0x8000 bit is set"); + strBuf->moveBitPos(-33);//RLZ pending to verify + duint16 hiSize = strBuf->getRawShort16(); + strDataSize = ((strDataSize&0x7fff) | (hiSize<<15)); + } + strBuf->moveBitPos( -strDataSize -16); //-14 + DRW_DBG("strBuf start strDataSize pos 2007: "); DRW_DBG(strBuf->getPosition()); DRW_DBG(" strBuf bpos 2007: "); DRW_DBG(strBuf->getBitPos()); DRW_DBG("\n"); + } else + DRW_DBG("\nDRW_TableEntry::parseDwg string bit is 0"); + DRW_DBG("strBuf start pos 2007: "); DRW_DBG(strBuf->getPosition()); DRW_DBG(" strBuf bpos 2007: "); DRW_DBG(strBuf->getBitPos()); DRW_DBG("\n"); + } - dwgHandle ho = buf->getHandle(); - handle = ho.ref; - dint16 extDataSize = buf->getBitShort(); //BS - QgsDebugMsgLevel( QStringLiteral( "Entity Handle: %1.%2 0x%3; ext data size:%4" ).arg( ho.code ).arg( ho.size ).arg( ho.ref, 0, 16 ).arg( extDataSize ), 4 ); - while ( extDataSize > 0 && buf->isGood() ) - { - /* RLZ: TODO */ - dwgHandle ah = buf->getHandle(); - QgsDebugMsgLevel( QStringLiteral( " App Handle: %1.%2 0x%3" ).arg( ah.code ).arg( ah.size ).arg( ah.ref, 0, 16 ), 4 ); - duint8 *tmpExtData = new duint8[extDataSize]; - buf->getBytes( tmpExtData, extDataSize ); - dwgBuffer tmpExtDataBuf( tmpExtData, extDataSize, buf->decoder ); - - duint8 dxfCode = tmpExtDataBuf.getRawChar8(); - QgsDebugMsgLevel( QStringLiteral( " dxfCode: %1" ).arg( dxfCode ), 4 ); - - switch ( dxfCode ) - { - case 0: - { - duint8 strLength = tmpExtDataBuf.getRawChar8(); - duint16 cp = tmpExtDataBuf.getBERawShort16(); - Q_UNUSED( cp ); - - QStringList l; - for ( int i = 0; i < strLength + 1; i++ ) //string length + null terminating char - { - duint8 dxfChar = tmpExtDataBuf.getRawChar8(); - l << QStringLiteral( "0x%1" ).arg( dxfChar, 0, 16 ); - } - - QgsDebugMsgLevel( QStringLiteral( "strLength:%1; str codepage:%2; %3" ).arg( strLength ).arg( cp ).arg( l.join( ' ' ) ), 4 ); - Q_UNUSED( l ); - break; - } - default: + dwgHandle ho = buf->getHandle(); + handle = ho.ref; + DRW_DBG("Entity Handle: "); DRW_DBGHL(ho.code, ho.size, ho.ref); + dint16 extDataSize = buf->getBitShort(); //BS + DRW_DBG(" ext data size: "); DRW_DBG(extDataSize); + while (extDataSize>0 && buf->isGood()) { /* RLZ: TODO */ - break; - } - delete[]tmpExtData; - extDataSize = buf->getBitShort(); //BS - QgsDebugMsgLevel( QStringLiteral( " ext data size: %1" ).arg( extDataSize ), 4 ); - } //end parsing extData (EED) - duint8 graphFlag = buf->getBit(); //B - QgsDebugMsgLevel( QStringLiteral( "graphFlag:%1" ).arg( graphFlag ), 4 ); - if ( graphFlag ) - { - duint32 graphDataSize = buf->getRawLong32(); //RL 32bits - QgsDebugMsgLevel( QStringLiteral( "graphData in bytes: %1" ).arg( graphDataSize ), 4 ); + dwgHandle ah = buf->getHandle(); + DRW_DBG("App Handle: "); DRW_DBGHL(ah.code, ah.size, ah.ref); + duint8 *tmpExtData = new duint8[extDataSize]; + buf->getBytes(tmpExtData, extDataSize); + dwgBuffer tmpExtDataBuf(tmpExtData, extDataSize, buf->decoder); + + duint8 dxfCode = tmpExtDataBuf.getRawChar8(); + DRW_DBG(" dxfCode: "); DRW_DBG(dxfCode); + switch (dxfCode){ + case 0:{ + duint8 strLength = tmpExtDataBuf.getRawChar8(); + DRW_DBG(" strLength: "); DRW_DBG(strLength); + duint16 cp = tmpExtDataBuf.getBERawShort16(); + DRW_DBG(" str codepage: "); DRW_DBG(cp); + for (int i=0;i< strLength+1;i++) {//string length + null terminating char + duint8 dxfChar = tmpExtDataBuf.getRawChar8(); + DRW_DBG(" dxfChar: "); DRW_DBG(dxfChar); + } + break; + } + default: + /* RLZ: TODO */ + break; + } + delete[]tmpExtData; + extDataSize = buf->getBitShort(); //BS + DRW_DBG(" ext data size: "); DRW_DBG(extDataSize); + } //end parsing extData (EED) + duint8 graphFlag = buf->getBit(); //B + DRW_DBG(" graphFlag: "); DRW_DBG(graphFlag); DRW_DBG("\n"); + if (graphFlag) { + duint32 graphDataSize = buf->getRawLong32(); //RL 32bits + DRW_DBG("graphData in bytes: "); DRW_DBG(graphDataSize); DRW_DBG("\n"); // RLZ: TODO - //skip graphData bytes - duint8 *tmpGraphData = new duint8[graphDataSize]; - buf->getBytes( tmpGraphData, graphDataSize ); - dwgBuffer tmpGraphDataBuf( tmpGraphData, graphDataSize, buf->decoder ); - QgsDebugMsgLevel( QStringLiteral( "graph data remaining bytes:%1" ).arg( tmpGraphDataBuf.numRemainingBytes() ), 4 ); - delete[]tmpGraphData; - } - if ( version < DRW::AC1015 ) //14- - { - objSize = buf->getRawLong32(); //RL 32bits object size in bits - QgsDebugMsgLevel( QStringLiteral( " Object size in bits: %1" ).arg( objSize ), 4 ); - } + //skip graphData bytes + duint8 *tmpGraphData = new duint8[graphDataSize]; + buf->getBytes(tmpGraphData, graphDataSize); + dwgBuffer tmpGraphDataBuf(tmpGraphData, graphDataSize, buf->decoder); + DRW_DBG("graph data remaining bytes: "); DRW_DBG(tmpGraphDataBuf.numRemainingBytes()); DRW_DBG("\n"); + delete[]tmpGraphData; + } + if (version < DRW::AC1015) {//14- + objSize = buf->getRawLong32(); //RL 32bits object size in bits + DRW_DBG(" Object size in bits: "); DRW_DBG(objSize); DRW_DBG("\n"); + } - duint8 entmode = buf->get2Bits(); //BB - if ( entmode == 0 ) - ownerHandle = true; + duint8 entmode = buf->get2Bits(); //BB + if (entmode == 0) + ownerHandle= true; // entmode = 2; - else if ( entmode == 2 ) - entmode = 0; + else if(entmode ==2) + entmode = 0; + space = static_cast< DRW::Space >( entmode ); //RLZ verify cast values + DRW_DBG("entmode: "); DRW_DBG(entmode); + numReactors = buf->getBitShort(); //BS + DRW_DBG(", numReactors: "); DRW_DBG(numReactors); - space = static_cast< DRW::Space >( entmode ); //RLZ verify cast values - numReactors = buf->getBitShort(); //BS - QgsDebugMsgLevel( QStringLiteral( "entmode:%1, numReactors: %2" ).arg( entmode ).arg( numReactors ), 4 ); - - if ( version < DRW::AC1015 ) //14- - { - if ( buf->getBit() ) //is bylayer line type - { - lineType = "BYLAYER"; - ltFlags = 0; + if (version < DRW::AC1015) {//14- + if(buf->getBit()) {//is bylayer line type + lineType = "BYLAYER"; + ltFlags = 0; + } else { + lineType = ""; + ltFlags = 3; + } + DRW_DBG(" lineType: "); DRW_DBG(lineType.c_str()); + DRW_DBG(" ltFlags: "); DRW_DBG(ltFlags); } - else - { - lineType = ""; - ltFlags = 3; + if (version > DRW::AC1015) {//2004+ + xDictFlag = buf->getBit(); + DRW_DBG(" xDictFlag: "); DRW_DBG(xDictFlag); DRW_DBG("\n"); } - QgsDebugMsgLevel( QStringLiteral( " lineType:%1 ltFlags:%2" ).arg( lineType.c_str() ).arg( ltFlags ), 4 ); - } - if ( version > DRW::AC1015 ) //2004+ - { - xDictFlag = buf->getBit(); - QgsDebugMsgLevel( QStringLiteral( " xDictFlag: %1" ).arg( xDictFlag ), 4 ); - } - if ( version > DRW::AC1024 || version < DRW::AC1018 ) - { - haveNextLinks = buf->getBit(); //aka nolinks //B - QgsDebugMsgLevel( QStringLiteral( "haveNextLinks (0 yes, 1 prev next): %1" ).arg( haveNextLinks ), 4 ); - } - else - { - haveNextLinks = 1; //aka nolinks //B - QgsDebugMsgLevel( QStringLiteral( "haveNextLinks (forced): %1" ).arg( haveNextLinks ), 4 ); - } + if (version > DRW::AC1024 || version < DRW::AC1018) { + haveNextLinks = buf->getBit(); //aka nolinks //B + DRW_DBG(", haveNextLinks (0 yes, 1 prev next): "); DRW_DBG(haveNextLinks); DRW_DBG("\n"); + } else { + haveNextLinks = 1; //aka nolinks //B + DRW_DBG(", haveNextLinks (forced): "); DRW_DBG(haveNextLinks); DRW_DBG("\n"); + } //ENC color color = buf->getEnColor( version, color24, transparency ); //BS or CMC //OK for R14 or negate ltypeScale = buf->getBitDouble(); //BD - QgsDebugMsgLevel( QStringLiteral( " entity color:%1 ltScale:%2" ).arg( color ).arg( ltypeScale ), 4 ); - - if ( version > DRW::AC1014 ) //2000+ - { - UTF8STRING plotStyleName; - for ( duint8 i = 0; i < 2; ++i ) //two flags in one - { - plotFlags = buf->get2Bits(); //BB - if ( plotFlags == 1 ) - plotStyleName = "byblock"; - else if ( plotFlags == 2 ) - plotStyleName = "continuous"; - else if ( plotFlags == 0 ) - plotStyleName = "bylayer"; - else //handle at end - plotStyleName = ""; - if ( i == 0 ) - { - ltFlags = plotFlags; - lineType = plotStyleName; //RLZ: howto solve? if needed plotStyleName; - QgsDebugMsgLevel( QStringLiteral( "ltFlags:%1 lineType:%2" ).arg( lineType.c_str() ).arg( ltFlags ), 4 ); + DRW_DBG(" entity color: "); DRW_DBG(color); + DRW_DBG(" ltScale: "); DRW_DBG(ltypeScale); DRW_DBG("\n"); + if (version > DRW::AC1014) {//2000+ + UTF8STRING plotStyleName; + for (duint8 i = 0; i<2;++i) { //two flags in one + plotFlags = buf->get2Bits(); //BB + if (plotFlags == 1) + plotStyleName = "byblock"; + else if (plotFlags == 2) + plotStyleName = "continuous"; + else if (plotFlags == 0) + plotStyleName = "bylayer"; + else //handle at end + plotStyleName = ""; + if (i == 0) { + ltFlags = plotFlags; + lineType = plotStyleName; //RLZ: howto solve? if needed plotStyleName; + DRW_DBG("ltFlags: "); DRW_DBG(ltFlags); + DRW_DBG(" lineType: "); DRW_DBG(lineType.c_str()); + } else { + DRW_DBG(", plotFlags: "); DRW_DBG(plotFlags); + } } - else - { - QgsDebugMsgLevel( QStringLiteral( "plotFlags:%1" ).arg( plotFlags ), 4 ); - } - } } - if ( version > DRW::AC1018 ) //2007+ - { - materialFlag = buf->get2Bits(); //BB - shadowFlag = buf->getRawChar8(); //RC - QgsDebugMsgLevel( QStringLiteral( " materialFlag:%1 shadowFlag:%2" ).arg( materialFlag ).arg( shadowFlag ), 4 ); + if (version > DRW::AC1018) {//2007+ + materialFlag = buf->get2Bits(); //BB + DRW_DBG("materialFlag: "); DRW_DBG(materialFlag); + shadowFlag = buf->getRawChar8(); //RC + DRW_DBG("shadowFlag: "); DRW_DBG(shadowFlag); DRW_DBG("\n"); } - if ( version > DRW::AC1021 ) //2010+ - { - duint8 visualFlags = buf->get2Bits(); //full & face visual style - duint8 unk = buf->getBit(); //edge visual style - QgsDebugMsgLevel( QStringLiteral( " shadowFlag 2:%1 unknown bit:%2" ).arg( visualFlags ).arg( unk ), 4 ); - Q_UNUSED( visualFlags ); - Q_UNUSED( unk ); + if (version > DRW::AC1021) {//2010+ + duint8 visualFlags = buf->get2Bits(); //full & face visual style + DRW_DBG("shadowFlag 2: "); DRW_DBG(visualFlags); DRW_DBG("\n"); + duint8 unk = buf->getBit(); //edge visual style + DRW_DBG("unknown bit: "); DRW_DBG(unk); DRW_DBG("\n"); } dint16 invisibleFlag = buf->getBitShort(); //BS - QgsDebugMsgLevel( QStringLiteral( " invisibleFlag:%1" ).arg( invisibleFlag ), 4 ); - Q_UNUSED( invisibleFlag ); - if ( version > DRW::AC1014 ) //2000+ - { - lWeight = DRW_LW_Conv::dwgInt2lineWidth( buf->getRawChar8() ); //RC - QgsDebugMsgLevel( QStringLiteral( " lwFlag (lWeight):%1" ).arg( lWeight ), 4 ); - Q_UNUSED( lWeight ); + DRW_DBG(" invisibleFlag: "); DRW_DBG(invisibleFlag); + if (version > DRW::AC1014) {//2000+ + lWeight = DRW_LW_Conv::dwgInt2lineWidth( buf->getRawChar8() ); //RC + DRW_DBG(" lwFlag (lWeight): "); DRW_DBG(lWeight); DRW_DBG("\n"); } -#if 0 //Only in blocks ???????? - if ( version > DRW::AC1018 ) //2007+ - { - duint8 unk = buf->getBit(); - QgsDebugMsgLevel( QStringLiteral( "unknown bit: %1" ).arg( unk ), 4 ); - } -#endif // 0 +// if (version > DRW::AC1018) {//2007+ +// duint8 unk = buf->getBit(); +// DRW_DBG("unknown bit: "); DRW_DBG(unk); DRW_DBG("\n"); +// } return buf->isGood(); } -bool DRW_Entity::parseDwgEntHandle( DRW::Version version, dwgBuffer *buf ) -{ - if ( version > DRW::AC1018 ) //2007+ skip string area - { - buf->setPosition( objSize >> 3 ); - buf->setBitPos( objSize & 7 ); +bool DRW_Entity::parseDwgEntHandle(DRW::Version version, dwgBuffer *buf){ + if (version > DRW::AC1018) {//2007+ skip string area + buf->setPosition(objSize >> 3); + buf->setBitPos(objSize & 7); } - if ( ownerHandle ) //entity are in block or in a polyline - { - dwgHandle ownerH = buf->getOffsetHandle( handle ); - QgsDebugMsgLevel( QStringLiteral( "owner (parent) Handle:%1.%2 0x%3 Remaining bytes:%4" ) - .arg( ownerH.code ).arg( ownerH.size ).arg( ownerH.ref, 0, 16 ) - .arg( buf->numRemainingBytes() ), 4 - ); - parentHandle = ownerH.ref; - } - else - { - QgsDebugMsgLevel( QStringLiteral( "NO Block (parent) Handle" ), 4 ); - } + if(ownerHandle){//entity are in block or in a polyline + dwgHandle ownerH = buf->getOffsetHandle(handle); + DRW_DBG("owner (parent) Handle: "); DRW_DBGHL(ownerH.code, ownerH.size, ownerH.ref); DRW_DBG("\n"); + DRW_DBG(" Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n"); + parentHandle = ownerH.ref; + DRW_DBG("Block (parent) Handle: "); DRW_DBGHL(ownerH.code, ownerH.size, parentHandle); DRW_DBG("\n"); + } else + DRW_DBG("NO Block (parent) Handle\n"); - QgsDebugMsgLevel( QStringLiteral( "Remaining bytes: %1" ).arg( buf->numRemainingBytes() ), 4 ); + DRW_DBG("\n Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n"); + for (int i=0; i< numReactors;++i) { + dwgHandle reactorsH = buf->getHandle(); + DRW_DBG(" reactorsH control Handle: "); DRW_DBGHL(reactorsH.code, reactorsH.size, reactorsH.ref); DRW_DBG("\n"); + } + if (xDictFlag !=1){//linetype in 2004 seems not have XDicObjH or NULL handle + dwgHandle XDicObjH = buf->getHandle(); + DRW_DBG(" XDicObj control Handle: "); DRW_DBGHL(XDicObjH.code, XDicObjH.size, XDicObjH.ref); DRW_DBG("\n"); + } + DRW_DBG("Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n"); - for ( int i = 0; i < numReactors; ++i ) - { - dwgHandle reactorsH = buf->getHandle(); - QgsDebugMsgLevel( QStringLiteral( "reactorsH control Handle:%1.%2 0x%3" ) - .arg( reactorsH.code ).arg( reactorsH.size ).arg( reactorsH.ref, 0, 16 ), 4 - ); - } - if ( xDictFlag != 1 ) //linetype in 2004 seems not have XDicObjH or NULL handle - { - dwgHandle XDicObjH = buf->getHandle(); - QgsDebugMsgLevel( QStringLiteral( "XDicObj control Handle:%1.%2 0x%3" ) - .arg( XDicObjH.code ).arg( XDicObjH.size ).arg( XDicObjH.ref, 0, 16 ), 4 - ); - } - QgsDebugMsgLevel( QStringLiteral( "Remaining bytes: %1" ).arg( buf->numRemainingBytes() ), 4 ); - - if ( version < DRW::AC1015 ) //R14- - { - //layer handle - layerH = buf->getOffsetHandle( handle ); - QgsDebugMsgLevel( QStringLiteral( " layer Handle:%1.%2 0x%3, remaining bytes %4" ) - .arg( layerH.code ).arg( layerH.size ).arg( layerH.ref, 0, 16 ) - .arg( buf->numRemainingBytes() ), 4 - ); - - //lineType handle - if ( ltFlags == 3 ) - { - lTypeH = buf->getOffsetHandle( handle ); - QgsDebugMsgLevel( QStringLiteral( " linetype Handle:%1.%2 0x%3, remaining bytes %4" ) - .arg( lTypeH.code ).arg( lTypeH.size ).arg( lTypeH.ref, 0, 16 ) - .arg( buf->numRemainingBytes() ), 4 ); - } - } - if ( version < DRW::AC1018 ) //2000+ - { - if ( haveNextLinks == 0 ) - { - dwgHandle nextLinkH = buf->getOffsetHandle( handle ); - QgsDebugMsgLevel( QStringLiteral( " prev nextLinkers Handle:%1.%2 0x%3, remaining bytes %4" ) - .arg( nextLinkH.code ).arg( nextLinkH.size ).arg( nextLinkH.ref, 0, 16 ) - .arg( buf->numRemainingBytes() ), 4 ); - prevEntLink = nextLinkH.ref; - nextLinkH = buf->getOffsetHandle( handle ); - QgsDebugMsgLevel( QStringLiteral( " next nextLinkers Handle:%1.%2 0x%3, remaining bytes %4" ) - .arg( nextLinkH.code ).arg( nextLinkH.size ).arg( nextLinkH.ref, 0, 16 ) - .arg( buf->numRemainingBytes() ), 4 ); - nextEntLink = nextLinkH.ref; - } - else - { - nextEntLink = handle + 1; - prevEntLink = handle - 1; - } - } - if ( version > DRW::AC1015 ) //2004+ - { - //Parses Bookcolor handle - } - if ( version > DRW::AC1014 ) //2000+ - { - //layer handle - layerH = buf->getOffsetHandle( handle ); - QgsDebugMsgLevel( QStringLiteral( " layer Handle:%1.%2 0x%3, remaining bytes %4" ) - .arg( layerH.code ).arg( layerH.size ).arg( layerH.ref, 0, 16 ) - .arg( buf->numRemainingBytes() ), 4 ); - //lineType handle - if ( ltFlags == 3 ) - { - lTypeH = buf->getOffsetHandle( handle ); - QgsDebugMsgLevel( QStringLiteral( " linetype Handle:%1.%2 0x%3, remaining bytes %4" ) - .arg( lTypeH.code ).arg( lTypeH.size ).arg( lTypeH.ref, 0, 16 ) - .arg( buf->numRemainingBytes() ), 4 ); - } - } - if ( version > DRW::AC1014 ) //2000+ - { - if ( version > DRW::AC1018 ) //2007+ - { - if ( materialFlag == 3 ) - { - dwgHandle materialH = buf->getOffsetHandle( handle ); - QgsDebugMsgLevel( QStringLiteral( " material handle:%1.%2 0x%3, remaining bytes %4" ) - .arg( materialH.code ).arg( materialH.size ).arg( materialH.ref, 0, 16 ) - .arg( buf->numRemainingBytes() ), 4 ); + if (version < DRW::AC1015) {//R14- + //layer handle + layerH = buf->getOffsetHandle(handle); + DRW_DBG(" layer Handle: "); DRW_DBGHL(layerH.code, layerH.size, layerH.ref); DRW_DBG("\n"); + DRW_DBG(" Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n"); + //lineType handle + if(ltFlags == 3){ + lTypeH = buf->getOffsetHandle(handle); + DRW_DBG("linetype Handle: "); DRW_DBGHL(lTypeH.code, lTypeH.size, lTypeH.ref); DRW_DBG("\n"); + DRW_DBG(" Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n"); } - if ( shadowFlag == 3 ) - { - dwgHandle shadowH = buf->getOffsetHandle( handle ); - QgsDebugMsgLevel( QStringLiteral( " shadow handle:%1.%2 0x%3, remaining bytes %4" ) - .arg( shadowH.code ).arg( shadowH.size ).arg( shadowH.ref, 0, 16 ) - .arg( buf->numRemainingBytes() ), 4 ); - } - } - if ( plotFlags == 3 ) - { - dwgHandle plotStyleH = buf->getOffsetHandle( handle ); - QgsDebugMsgLevel( QStringLiteral( " plot style handle:%1.%2 0x%3, remaining bytes %4" ) - .arg( plotStyleH.code ).arg( plotStyleH.size ).arg( plotStyleH.ref, 0, 16 ) - .arg( buf->numRemainingBytes() ), 4 ); - } } - QgsDebugMsgLevel( QStringLiteral( "remaining bytes:%1" ).arg( buf->numRemainingBytes() ), 4 ); - + if (version < DRW::AC1018) {//2000+ + if (haveNextLinks == 0) { + dwgHandle nextLinkH = buf->getOffsetHandle(handle); + DRW_DBG(" prev nextLinkers Handle: "); DRW_DBGHL(nextLinkH.code, nextLinkH.size, nextLinkH.ref); DRW_DBG("\n"); + DRW_DBG("\n Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n"); + prevEntLink = nextLinkH.ref; + nextLinkH = buf->getOffsetHandle(handle); + DRW_DBG(" next nextLinkers Handle: "); DRW_DBGHL(nextLinkH.code, nextLinkH.size, nextLinkH.ref); DRW_DBG("\n"); + DRW_DBG("\n Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n"); + nextEntLink = nextLinkH.ref; + } else { + nextEntLink = handle+1; + prevEntLink = handle-1; + } + } + if (version > DRW::AC1015) {//2004+ + //Parses Bookcolor handle + } + if (version > DRW::AC1014) {//2000+ + //layer handle + layerH = buf->getOffsetHandle(handle); + DRW_DBG(" layer Handle: "); DRW_DBGHL(layerH.code, layerH.size, layerH.ref); DRW_DBG("\n"); + DRW_DBG(" Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n"); + //lineType handle + if(ltFlags == 3){ + lTypeH = buf->getOffsetHandle(handle); + DRW_DBG("linetype Handle: "); DRW_DBGHL(lTypeH.code, lTypeH.size, lTypeH.ref); DRW_DBG("\n"); + DRW_DBG(" Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n"); + } + } + if (version > DRW::AC1014) {//2000+ + if (version > DRW::AC1018) {//2007+ + if (materialFlag == 3) { + dwgHandle materialH = buf->getOffsetHandle(handle); + DRW_DBG(" material Handle: "); DRW_DBGHL(materialH.code, materialH.size, materialH.ref); DRW_DBG("\n"); + DRW_DBG("\n Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n"); + } + if (shadowFlag == 3) { + dwgHandle shadowH = buf->getOffsetHandle(handle); + DRW_DBG(" shadow Handle: "); DRW_DBGHL(shadowH.code, shadowH.size, shadowH.ref); DRW_DBG("\n"); + DRW_DBG("\n Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n"); + } + } + if (plotFlags == 3) { + dwgHandle plotStyleH = buf->getOffsetHandle(handle); + DRW_DBG(" plot style Handle: "); DRW_DBGHL(plotStyleH.code, plotStyleH.size, plotStyleH.ref); DRW_DBG("\n"); + DRW_DBG("\n Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n"); + } + } + DRW_DBG("\n DRW_Entity::parseDwgEntHandle Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n"); return buf->isGood(); } -void DRW_Point::parseCode( int code, dxfReader *reader ) -{ - switch ( code ) - { - case 10: +void DRW_Point::parseCode(int code, dxfReader *reader){ + switch (code) { + case 10: basePoint.x = reader->getDouble(); break; - case 20: + case 20: basePoint.y = reader->getDouble(); break; - case 30: + case 30: basePoint.z = reader->getDouble(); break; - case 39: + case 39: thickness = reader->getDouble(); break; - case 210: + case 210: haveExtrusion = true; extPoint.x = reader->getDouble(); break; - case 220: + case 220: extPoint.y = reader->getDouble(); break; - case 230: + case 230: extPoint.z = reader->getDouble(); break; - default: - DRW_Entity::parseCode( code, reader ); + default: + DRW_Entity::parseCode(code, reader); break; } } -bool DRW_Point::parseDwg( DRW::Version version, dwgBuffer *buf, duint32 bs ) -{ - bool ret = DRW_Entity::parseDwg( version, buf, nullptr, bs ); - if ( !ret ) - return ret; - - QgsDebugMsgLevel( QStringLiteral( "***************************** parsing point *********************************************" ), 4 ); +bool DRW_Point::parseDwg(DRW::Version version, dwgBuffer *buf, duint32 bs){ + bool ret = DRW_Entity::parseDwg(version, buf, NULL, bs); + if (!ret) + return ret; + DRW_DBG("\n***************************** parsing point *********************************************\n"); basePoint.x = buf->getBitDouble(); basePoint.y = buf->getBitDouble(); basePoint.z = buf->getBitDouble(); - thickness = buf->getThickness( version > DRW::AC1014 );//BD + DRW_DBG("point: "); DRW_DBGPT(basePoint.x, basePoint.y, basePoint.z); + thickness = buf->getThickness(version > DRW::AC1014);//BD + DRW_DBG("\nthickness: "); DRW_DBG(thickness); extPoint = buf->getExtrusion( version > DRW::AC1014, haveExtrusion ); + DRW_DBG(", Extrusion: "); DRW_DBGPT(extPoint.x, extPoint.y, extPoint.z); + double x_axis = buf->getBitDouble();//BD - - QgsDebugMsgLevel( QStringLiteral( "point:%1 thickness:%2, extrusion:%3, x_axis:%4" ) - .arg( QStringLiteral( "%1,%2,%3" ).arg( basePoint.x ).arg( basePoint.y ).arg( basePoint.z ) ) - .arg( thickness ) - .arg( QStringLiteral( "%1,%2,%3" ).arg( extPoint.x ).arg( extPoint.y ).arg( extPoint.z ) ) - .arg( x_axis ), 4 - ); - Q_UNUSED( x_axis ); - - ret = DRW_Entity::parseDwgEntHandle( version, buf ); - if ( !ret ) - return ret; - + DRW_DBG("\n x_axis: ");DRW_DBG(x_axis);DRW_DBG("\n"); + ret = DRW_Entity::parseDwgEntHandle(version, buf); + if (!ret) + return ret; // RS crc; //RS */ return buf->isGood(); } -void DRW_Line::parseCode( int code, dxfReader *reader ) -{ - switch ( code ) - { - case 11: +void DRW_Line::parseCode(int code, dxfReader *reader){ + switch (code) { + case 11: secPoint.x = reader->getDouble(); break; - case 21: + case 21: secPoint.y = reader->getDouble(); break; - case 31: + case 31: secPoint.z = reader->getDouble(); break; - default: - DRW_Point::parseCode( code, reader ); + default: + DRW_Point::parseCode(code, reader); break; } } -bool DRW_Line::parseDwg( DRW::Version version, dwgBuffer *buf, duint32 bs ) -{ - bool ret = DRW_Entity::parseDwg( version, buf, nullptr, bs ); - if ( !ret ) - return ret; +bool DRW_Line::parseDwg(DRW::Version version, dwgBuffer *buf, duint32 bs){ + bool ret = DRW_Entity::parseDwg(version, buf, NULL, bs); + if (!ret) + return ret; + DRW_DBG("\n***************************** parsing line *********************************************\n"); - QgsDebugMsgLevel( QStringLiteral( "***************************** parsing line *********************************************" ), 4 ); - - if ( version < DRW::AC1015 ) //14- - { - basePoint.x = buf->getBitDouble(); - basePoint.y = buf->getBitDouble(); - basePoint.z = buf->getBitDouble(); - secPoint.x = buf->getBitDouble(); - secPoint.y = buf->getBitDouble(); - secPoint.z = buf->getBitDouble(); + if (version < DRW::AC1015) {//14- + basePoint.x = buf->getBitDouble(); + basePoint.y = buf->getBitDouble(); + basePoint.z = buf->getBitDouble(); + secPoint.x = buf->getBitDouble(); + secPoint.y = buf->getBitDouble(); + secPoint.z = buf->getBitDouble(); } - if ( version > DRW::AC1014 ) //2000+ - { - bool zIsZero = buf->getBit(); //B - basePoint.x = buf->getRawDouble();//RD - secPoint.x = buf->getDefaultDouble( basePoint.x );//DD - basePoint.y = buf->getRawDouble();//RD - secPoint.y = buf->getDefaultDouble( basePoint.y );//DD - if ( !zIsZero ) - { - basePoint.z = buf->getRawDouble();//RD - secPoint.z = buf->getDefaultDouble( basePoint.z );//DD - } + if (version > DRW::AC1014) {//2000+ + bool zIsZero = buf->getBit(); //B + basePoint.x = buf->getRawDouble();//RD + secPoint.x = buf->getDefaultDouble(basePoint.x);//DD + basePoint.y = buf->getRawDouble();//RD + secPoint.y = buf->getDefaultDouble(basePoint.y);//DD + if (!zIsZero) { + basePoint.z = buf->getRawDouble();//RD + secPoint.z = buf->getDefaultDouble(basePoint.z);//DD + } } - - thickness = buf->getThickness( version > DRW::AC1014 );//BD + DRW_DBG("start point: "); DRW_DBGPT(basePoint.x, basePoint.y, basePoint.z); + DRW_DBG("\nend point: "); DRW_DBGPT(secPoint.x, secPoint.y, secPoint.z); + thickness = buf->getThickness(version > DRW::AC1014);//BD + DRW_DBG("\nthickness: "); DRW_DBG(thickness); extPoint = buf->getExtrusion( version > DRW::AC1014, haveExtrusion ); - - QgsDebugMsgLevel( QStringLiteral( "startpoint:%1 endpoint:%2 thickness:%3 extrusion:%4" ) - .arg( QStringLiteral( "%1,%2,%3" ).arg( basePoint.x ).arg( basePoint.y ).arg( basePoint.z ), - QStringLiteral( "%1,%2,%3" ).arg( secPoint.x ).arg( secPoint.y ).arg( secPoint.z ) ) - .arg( thickness ) - .arg( QStringLiteral( "%1,%2,%3" ).arg( extPoint.x ).arg( extPoint.y ).arg( extPoint.z ) ), 4 - ); - - ret = DRW_Entity::parseDwgEntHandle( version, buf ); - if ( !ret ) - return ret; - - // RS crc; //RS */ - + DRW_DBG(", Extrusion: "); DRW_DBGPT(extPoint.x, extPoint.y, extPoint.z);DRW_DBG("\n"); + ret = DRW_Entity::parseDwgEntHandle(version, buf); + if (!ret) + return ret; +// RS crc; //RS */ return buf->isGood(); } -bool DRW_Ray::parseDwg( DRW::Version version, dwgBuffer *buf, duint32 bs ) -{ - bool ret = DRW_Entity::parseDwg( version, buf, nullptr, bs ); - if ( !ret ) - return ret; - - QgsDebugMsgLevel( QStringLiteral( "***************************** parsing ray/xline *********************************************" ), 4 ); - +bool DRW_Ray::parseDwg(DRW::Version version, dwgBuffer *buf, duint32 bs){ + bool ret = DRW_Entity::parseDwg(version, buf, NULL, bs); + if (!ret) + return ret; + DRW_DBG("\n***************************** parsing ray/xline *********************************************\n"); basePoint.x = buf->getBitDouble(); basePoint.y = buf->getBitDouble(); basePoint.z = buf->getBitDouble(); secPoint.x = buf->getBitDouble(); secPoint.y = buf->getBitDouble(); secPoint.z = buf->getBitDouble(); - - QgsDebugMsgLevel( QStringLiteral( "startpoint:%1 vector:%2" ) - .arg( QStringLiteral( "%1,%2,%3" ).arg( basePoint.x ).arg( basePoint.y ).arg( basePoint.z ), - QStringLiteral( "%1,%2,%3" ).arg( secPoint.x ).arg( secPoint.y ).arg( secPoint.z ) ), 4 - ); - - ret = DRW_Entity::parseDwgEntHandle( version, buf ); - if ( !ret ) - return ret; - - // RS crc; //RS */ - + DRW_DBG("start point: "); DRW_DBGPT(basePoint.x, basePoint.y, basePoint.z); + DRW_DBG("\nvector: "); DRW_DBGPT(secPoint.x, secPoint.y, secPoint.z); + ret = DRW_Entity::parseDwgEntHandle(version, buf); + if (!ret) + return ret; +// RS crc; //RS */ return buf->isGood(); } -void DRW_Circle::applyExtrusion() -{ - if ( haveExtrusion ) - { - //NOTE: Commenting these out causes the the arcs being tested to be located - //on the other side of the y axis (all x dimensions are negated). - calculateAxis( extPoint ); - extrudePoint( extPoint, &basePoint ); +void DRW_Circle::applyExtrusion(){ + if (haveExtrusion) { + //NOTE: Commenting these out causes the the arcs being tested to be located + //on the other side of the y axis (all x dimensions are negated). + calculateAxis(extPoint); + extrudePoint(extPoint, &basePoint); } } -void DRW_Circle::parseCode( int code, dxfReader *reader ) -{ - switch ( code ) - { - case 40: - mRadius = reader->getDouble(); +void DRW_Circle::parseCode(int code, dxfReader *reader){ + switch (code) { + case 40: + radius = reader->getDouble(); break; - default: - DRW_Point::parseCode( code, reader ); + default: + DRW_Point::parseCode(code, reader); break; } } -bool DRW_Circle::parseDwg( DRW::Version version, dwgBuffer *buf, duint32 bs ) -{ - bool ret = DRW_Entity::parseDwg( version, buf, nullptr, bs ); - if ( !ret ) - return ret; - - QgsDebugMsgLevel( QStringLiteral( "***************************** parsing circle *********************************************" ), 4 ); +bool DRW_Circle::parseDwg(DRW::Version version, dwgBuffer *buf, duint32 bs){ + bool ret = DRW_Entity::parseDwg(version, buf, NULL, bs); + if (!ret) + return ret; + DRW_DBG("\n***************************** parsing circle *********************************************\n"); basePoint.x = buf->getBitDouble(); basePoint.y = buf->getBitDouble(); basePoint.z = buf->getBitDouble(); - mRadius = buf->getBitDouble(); - thickness = buf->getThickness( version > DRW::AC1014 ); + DRW_DBG("center: "); DRW_DBGPT(basePoint.x, basePoint.y, basePoint.z); + radius = buf->getBitDouble(); + DRW_DBG("\nradius: "); DRW_DBG(radius); + + thickness = buf->getThickness(version > DRW::AC1014); + DRW_DBG(" thickness: "); DRW_DBG(thickness); extPoint = buf->getExtrusion( version > DRW::AC1014, haveExtrusion ); + DRW_DBG("\nextrusion: "); DRW_DBGPT(extPoint.x, extPoint.y, extPoint.z); DRW_DBG("\n"); - QgsDebugMsgLevel( QStringLiteral( "center:%1 radius:%2 thickness:%3 extrusion:%4" ) - .arg( QStringLiteral( "%1,%2,%3" ).arg( basePoint.x ).arg( basePoint.y ).arg( basePoint.z ) ) - .arg( mRadius ).arg( thickness ) - .arg( QStringLiteral( "%1,%2,%3" ).arg( extPoint.x ).arg( extPoint.y ).arg( extPoint.z ) ), 4 - ); - - ret = DRW_Entity::parseDwgEntHandle( version, buf ); - if ( !ret ) - return ret; - - // RS crc; //RS */ - + ret = DRW_Entity::parseDwgEntHandle(version, buf); + if (!ret) + return ret; +// RS crc; //RS */ return buf->isGood(); } -void DRW_Arc::applyExtrusion() -{ +void DRW_Arc::applyExtrusion(){ DRW_Circle::applyExtrusion(); - if ( haveExtrusion ) - { - // If the extrusion vector has a z value less than 0, the angles for the arc - // have to be mirrored since DXF files use the right hand rule. - // Note that the following code only handles the special case where there is a 2D - // drawing with the z axis heading into the paper (or rather screen). An arbitrary - // extrusion axis (with x and y values greater than 1/64) may still have issues. - if ( std::fabs( extPoint.x ) < 0.015625 && std::fabs( extPoint.y ) < 0.015625 && extPoint.z < 0.0 ) - { - staangle = M_PI - staangle; - endangle = M_PI - endangle; + if(haveExtrusion){ + // If the extrusion vector has a z value less than 0, the angles for the arc + // have to be mirrored since DXF files use the right hand rule. + // Note that the following code only handles the special case where there is a 2D + // drawing with the z axis heading into the paper (or rather screen). An arbitrary + // extrusion axis (with x and y values greater than 1/64) may still have issues. + if ( std::fabs( extPoint.x ) < 0.015625 && std::fabs( extPoint.y ) < 0.015625 && extPoint.z < 0.0 ) { + staangle=M_PI-staangle; + endangle=M_PI-endangle; - double temp = staangle; - staangle = endangle; - endangle = temp; - } + double temp = staangle; + staangle=endangle; + endangle=temp; + } } } -void DRW_Arc::parseCode( int code, dxfReader *reader ) -{ - switch ( code ) - { - case 50: - staangle = reader->getDouble() / ARAD; +void DRW_Arc::parseCode(int code, dxfReader *reader){ + switch (code) { + case 50: + staangle = reader->getDouble()/ ARAD; break; - case 51: - endangle = reader->getDouble() / ARAD; + case 51: + endangle = reader->getDouble()/ ARAD; break; - default: - DRW_Circle::parseCode( code, reader ); + default: + DRW_Circle::parseCode(code, reader); break; } } -bool DRW_Arc::parseDwg( DRW::Version version, dwgBuffer *buf, duint32 bs ) -{ - bool ret = DRW_Entity::parseDwg( version, buf, nullptr, bs ); - if ( !ret ) - return ret; - - QgsDebugMsgLevel( QStringLiteral( "***************************** parsing circle arc *********************************************" ), 4 ); +bool DRW_Arc::parseDwg(DRW::Version version, dwgBuffer *buf, duint32 bs){ + bool ret = DRW_Entity::parseDwg(version, buf, NULL, bs); + if (!ret) + return ret; + DRW_DBG("\n***************************** parsing circle arc *********************************************\n"); basePoint.x = buf->getBitDouble(); basePoint.y = buf->getBitDouble(); basePoint.z = buf->getBitDouble(); - mRadius = buf->getBitDouble(); - thickness = buf->getThickness( version > DRW::AC1014 ); + DRW_DBG("center point: "); DRW_DBGPT(basePoint.x, basePoint.y, basePoint.z); + + radius = buf->getBitDouble(); + DRW_DBG("\nradius: "); DRW_DBG(radius); + thickness = buf->getThickness(version > DRW::AC1014); + DRW_DBG(" thickness: "); DRW_DBG(thickness); extPoint = buf->getExtrusion( version > DRW::AC1014, haveExtrusion ); + DRW_DBG("\nextrusion: "); DRW_DBGPT(extPoint.x, extPoint.y, extPoint.z); staangle = buf->getBitDouble(); + DRW_DBG("\nstart angle: "); DRW_DBG(staangle); endangle = buf->getBitDouble(); - - QgsDebugMsgLevel( QStringLiteral( "center:%1,%2,%3 radius:%4 thickness:%5 extrusion:%6,%7,%8 staangle:%9 endangle:%10" ) - .arg( basePoint.x ).arg( basePoint.y ).arg( basePoint.z ) - .arg( mRadius ).arg( thickness ) - .arg( extPoint.x ).arg( extPoint.y ).arg( extPoint.z ) - .arg( staangle ).arg( endangle ), 4 - ); - - ret = DRW_Entity::parseDwgEntHandle( version, buf ); - if ( !ret ) - return ret; - + DRW_DBG(" end angle: "); DRW_DBG(endangle); DRW_DBG("\n"); + ret = DRW_Entity::parseDwgEntHandle(version, buf); + if (!ret) + return ret; return buf->isGood(); } -void DRW_Ellipse::parseCode( int code, dxfReader *reader ) -{ - switch ( code ) - { - case 40: +void DRW_Ellipse::parseCode(int code, dxfReader *reader){ + switch (code) { + case 40: ratio = reader->getDouble(); break; - case 41: + case 41: staparam = reader->getDouble(); break; - case 42: + case 42: endparam = reader->getDouble(); break; - default: - DRW_Line::parseCode( code, reader ); + default: + DRW_Line::parseCode(code, reader); break; } } -void DRW_Ellipse::applyExtrusion() -{ - if ( haveExtrusion ) - { - calculateAxis( extPoint ); - extrudePoint( extPoint, &secPoint ); - double initialparam = staparam; - if ( extPoint.z < 0. ) - { - staparam = M_PIx2 - endparam; - endparam = M_PIx2 - initialparam; - } +void DRW_Ellipse::applyExtrusion(){ + if (haveExtrusion) { + calculateAxis(extPoint); + extrudePoint(extPoint, &secPoint); + double initialparam = staparam; + if (extPoint.z < 0.){ + staparam = M_PIx2 - endparam; + endparam = M_PIx2 - initialparam; + } } } //if ratio > 1 minor axis are greather than major axis, correct it -void DRW_Ellipse::correctAxis() -{ +void DRW_Ellipse::correctAxis(){ bool complete = false; - if ( staparam == endparam ) - { - staparam = 0.0; - endparam = M_PIx2; //2*M_PI; - complete = true; - } - if ( ratio > 1 ) - { - if ( std::fabs( endparam - staparam - M_PIx2 ) < 1.0e-10 ) + if (staparam == endparam) { + staparam = 0.0; + endparam = M_PIx2; //2*M_PI; complete = true; - double incX = secPoint.x; - secPoint.x = -( secPoint.y * ratio ); - secPoint.y = incX * ratio; - ratio = 1 / ratio; - if ( !complete ) - { - if ( staparam < M_PI_2 ) - staparam += M_PI * 2; - if ( endparam < M_PI_2 ) - endparam += M_PI * 2; - endparam -= M_PI_2; - staparam -= M_PI_2; - } + } + if (ratio > 1){ + if ( std::fabs(endparam - staparam - M_PIx2) < 1.0e-10) + complete = true; + double incX = secPoint.x; + secPoint.x = -(secPoint.y * ratio); + secPoint.y = incX*ratio; + ratio = 1/ratio; + if (!complete){ + if (staparam < M_PI_2) + staparam += M_PI *2; + if (endparam < M_PI_2) + endparam += M_PI *2; + endparam -= M_PI_2; + staparam -= M_PI_2; + } } } -bool DRW_Ellipse::parseDwg( DRW::Version version, dwgBuffer *buf, duint32 bs ) -{ - bool ret = DRW_Entity::parseDwg( version, buf, nullptr, bs ); - if ( !ret ) - return ret; +bool DRW_Ellipse::parseDwg(DRW::Version version, dwgBuffer *buf, duint32 bs){ + bool ret = DRW_Entity::parseDwg(version, buf, NULL, bs); + if (!ret) + return ret; + DRW_DBG("\n***************************** parsing ellipse *********************************************\n"); - QgsDebugMsgLevel( QStringLiteral( "***************************** parsing ellipse *********************************************" ), 4 ); - - basePoint = buf->get3BitDouble(); - secPoint = buf->get3BitDouble(); - extPoint = buf->get3BitDouble(); + basePoint =buf->get3BitDouble(); + DRW_DBG("center: "); DRW_DBGPT(basePoint.x, basePoint.y, basePoint.z); + secPoint =buf->get3BitDouble(); + DRW_DBG(", axis: "); DRW_DBGPT(secPoint.x, secPoint.y, secPoint.z); DRW_DBG("\n"); + extPoint =buf->get3BitDouble(); + DRW_DBG("Extrusion: "); DRW_DBGPT(extPoint.x, extPoint.y, extPoint.z); ratio = buf->getBitDouble();//BD + DRW_DBG("\nratio: "); DRW_DBG(ratio); staparam = buf->getBitDouble();//BD + DRW_DBG(" start param: "); DRW_DBG(staparam); endparam = buf->getBitDouble();//BD + DRW_DBG(" end param: "); DRW_DBG(endparam); DRW_DBG("\n"); - QgsDebugMsgLevel( QStringLiteral( "center:%1 axis:%2 extrusion:%3 ratio:%4 staparam:%5 endparam:%6" ) - .arg( QStringLiteral( "%1,%2,%3" ).arg( basePoint.x ).arg( basePoint.y ).arg( basePoint.z ), - QStringLiteral( "%1,%2,%3" ).arg( secPoint.x ).arg( secPoint.y ).arg( secPoint.z ), - QStringLiteral( "%1,%2,%3" ).arg( extPoint.x ).arg( extPoint.y ).arg( extPoint.z ) ) - .arg( ratio ).arg( staparam ).arg( endparam ), 4 - ); - - ret = DRW_Entity::parseDwgEntHandle( version, buf ); - if ( !ret ) - return ret; - - // RS crc; //RS */ - + ret = DRW_Entity::parseDwgEntHandle(version, buf); + if (!ret) + return ret; +// RS crc; //RS */ return buf->isGood(); } + //parts are the number of vertices to split the polyline, default 128 void DRW_Ellipse::toPolyline( DRW_Polyline *pol, int parts ) const { @@ -1001,830 +825,662 @@ void DRW_Ellipse::toPolyline( DRW_Polyline *pol, int parts ) const pol->extPoint = extPoint; } -void DRW_Trace::applyExtrusion() -{ - if ( haveExtrusion ) - { - calculateAxis( extPoint ); - extrudePoint( extPoint, &basePoint ); - extrudePoint( extPoint, &secPoint ); - extrudePoint( extPoint, &thirdPoint ); - extrudePoint( extPoint, &fourthPoint ); - } +void DRW_Trace::applyExtrusion(){ + if (haveExtrusion) { + calculateAxis(extPoint); + extrudePoint(extPoint, &basePoint); + extrudePoint(extPoint, &secPoint); + extrudePoint(extPoint, &thirdPoint); + extrudePoint(extPoint, &forthPoint); + } } -void DRW_Trace::parseCode( int code, dxfReader *reader ) -{ - switch ( code ) - { +void DRW_Trace::parseCode(int code, dxfReader *reader){ + switch (code) { case 12: - thirdPoint.x = reader->getDouble(); - break; + thirdPoint.x = reader->getDouble(); + break; case 22: - thirdPoint.y = reader->getDouble(); - break; + thirdPoint.y = reader->getDouble(); + break; case 32: - thirdPoint.z = reader->getDouble(); - break; + thirdPoint.z = reader->getDouble(); + break; case 13: - fourthPoint.x = reader->getDouble(); - break; + forthPoint.x = reader->getDouble(); + break; case 23: - fourthPoint.y = reader->getDouble(); - break; + forthPoint.y = reader->getDouble(); + break; case 33: - fourthPoint.z = reader->getDouble(); - break; + forthPoint.z = reader->getDouble(); + break; default: - DRW_Line::parseCode( code, reader ); - break; - } + DRW_Line::parseCode(code, reader); + break; + } } -bool DRW_Trace::parseDwg( DRW::Version version, dwgBuffer *buf, duint32 bs ) -{ - bool ret = DRW_Entity::parseDwg( version, buf, nullptr, bs ); - if ( !ret ) - return ret; +bool DRW_Trace::parseDwg(DRW::Version version, dwgBuffer *buf, duint32 bs){ + bool ret = DRW_Entity::parseDwg(version, buf, NULL, bs); + if (!ret) + return ret; + DRW_DBG("\n***************************** parsing Trace *********************************************\n"); - QgsDebugMsgLevel( QStringLiteral( "***************************** parsing Trace *********************************************" ), 4 ); - - thickness = buf->getThickness( version > DRW::AC1014 ); - basePoint.z = buf->getBitDouble(); - basePoint.x = buf->getRawDouble(); - basePoint.y = buf->getRawDouble(); - secPoint.x = buf->getRawDouble(); - secPoint.y = buf->getRawDouble(); - secPoint.z = basePoint.z; - thirdPoint.x = buf->getRawDouble(); - thirdPoint.y = buf->getRawDouble(); - thirdPoint.z = basePoint.z; - fourthPoint.x = buf->getRawDouble(); - fourthPoint.y = buf->getRawDouble(); - fourthPoint.z = basePoint.z; + thickness = buf->getThickness(version>DRW::AC1014); + basePoint.z = buf->getBitDouble(); + basePoint.x = buf->getRawDouble(); + basePoint.y = buf->getRawDouble(); + secPoint.x = buf->getRawDouble(); + secPoint.y = buf->getRawDouble(); + secPoint.z = basePoint.z; + thirdPoint.x = buf->getRawDouble(); + thirdPoint.y = buf->getRawDouble(); + thirdPoint.z = basePoint.z; + forthPoint.x = buf->getRawDouble(); + forthPoint.y = buf->getRawDouble(); + forthPoint.z = basePoint.z; extPoint = buf->getExtrusion( version > DRW::AC1014, haveExtrusion ); - QgsDebugMsgLevel( QStringLiteral( "base:%1 sec:%2 third:%3 fourth:%4 extrusion:%5 thickness:%6" ) - .arg( QStringLiteral( "%1,%2,%3" ).arg( basePoint.x ).arg( basePoint.y ).arg( basePoint.z ), - QStringLiteral( "%1,%2,%3" ).arg( secPoint.x ).arg( secPoint.y ).arg( secPoint.z ), - QStringLiteral( "%1,%2,%3" ).arg( thirdPoint.x ).arg( thirdPoint.y ).arg( thirdPoint.z ), - QStringLiteral( "%1,%2,%3" ).arg( fourthPoint.x ).arg( fourthPoint.y ).arg( fourthPoint.z ), - QStringLiteral( "%1,%2,%3" ).arg( extPoint.x ).arg( extPoint.y ).arg( extPoint.z ) ) - .arg( thickness ), 4 - ); + DRW_DBG(" - base "); DRW_DBGPT(basePoint.x, basePoint.y, basePoint.z); + DRW_DBG("\n - sec "); DRW_DBGPT(secPoint.x, secPoint.y, secPoint.z); + DRW_DBG("\n - third "); DRW_DBGPT(thirdPoint.x, thirdPoint.y, thirdPoint.z); + DRW_DBG("\n - fourth "); DRW_DBGPT(forthPoint.x, forthPoint.y, forthPoint.z); + DRW_DBG("\n - extrusion: "); DRW_DBGPT(extPoint.x, extPoint.y, extPoint.z); + DRW_DBG("\n - thickness: "); DRW_DBG(thickness); DRW_DBG("\n"); /* Common Entity Handle Data */ - ret = DRW_Entity::parseDwgEntHandle( version, buf ); - if ( !ret ) - return ret; + ret = DRW_Entity::parseDwgEntHandle(version, buf); + if (!ret) + return ret; /* CRC X --- */ return buf->isGood(); } -void DRW_Solid::parseCode( int code, dxfReader *reader ) -{ - DRW_Trace::parseCode( code, reader ); +void DRW_Solid::parseCode(int code, dxfReader *reader){ + DRW_Trace::parseCode(code, reader); } -bool DRW_Solid::parseDwg( DRW::Version v, dwgBuffer *buf, duint32 bs ) -{ - QgsDebugMsgLevel( QStringLiteral( "***************************** parsing Solid *********************************************" ), 4 ); - return DRW_Trace::parseDwg( v, buf, bs ); +bool DRW_Solid::parseDwg(DRW::Version v, dwgBuffer *buf, duint32 bs){ + DRW_DBG("\n***************************** parsing Solid *********************************************\n"); + return DRW_Trace::parseDwg(v, buf, bs); } -void DRW_3Dface::parseCode( int code, dxfReader *reader ) -{ - switch ( code ) - { - case 70: +void DRW_3Dface::parseCode(int code, dxfReader *reader){ + switch (code) { + case 70: invisibleflag = reader->getInt32(); - Q_UNUSED( invisibleflag ); break; - default: - DRW_Trace::parseCode( code, reader ); + default: + DRW_Trace::parseCode(code, reader); break; } } -bool DRW_3Dface::parseDwg( DRW::Version v, dwgBuffer *buf, duint32 bs ) -{ - bool ret = DRW_Entity::parseDwg( v, buf, nullptr, bs ); - if ( !ret ) - return ret; +bool DRW_3Dface::parseDwg(DRW::Version v, dwgBuffer *buf, duint32 bs){ + bool ret = DRW_Entity::parseDwg(v, buf, NULL, bs); + if (!ret) + return ret; + DRW_DBG("\n***************************** parsing 3Dface *********************************************\n"); - QgsDebugMsgLevel( QStringLiteral( "***************************** parsing 3Dface *********************************************" ), 4 ); - - if ( v < DRW::AC1015 ) // R13 & R14 - { - basePoint.x = buf->getBitDouble(); - basePoint.y = buf->getBitDouble(); - basePoint.z = buf->getBitDouble(); - secPoint.x = buf->getBitDouble(); - secPoint.y = buf->getBitDouble(); - secPoint.z = buf->getBitDouble(); - thirdPoint.x = buf->getBitDouble(); - thirdPoint.y = buf->getBitDouble(); - thirdPoint.z = buf->getBitDouble(); - fourthPoint.x = buf->getBitDouble(); - fourthPoint.y = buf->getBitDouble(); - fourthPoint.z = buf->getBitDouble(); - invisibleflag = buf->getBitShort(); + if ( v < DRW::AC1015 ) {// R13 & R14 + basePoint.x = buf->getBitDouble(); + basePoint.y = buf->getBitDouble(); + basePoint.z = buf->getBitDouble(); + secPoint.x = buf->getBitDouble(); + secPoint.y = buf->getBitDouble(); + secPoint.z = buf->getBitDouble(); + thirdPoint.x = buf->getBitDouble(); + thirdPoint.y = buf->getBitDouble(); + thirdPoint.z = buf->getBitDouble(); + forthPoint.x = buf->getBitDouble(); + forthPoint.y = buf->getBitDouble(); + forthPoint.z = buf->getBitDouble(); + invisibleflag = buf->getBitShort(); + } else { // 2000+ + bool has_no_flag = buf->getBit(); + bool z_is_zero = buf->getBit(); + basePoint.x = buf->getRawDouble(); + basePoint.y = buf->getRawDouble(); + basePoint.z = z_is_zero ? 0.0 : buf->getRawDouble(); + secPoint.x = buf->getDefaultDouble(basePoint.x); + secPoint.y = buf->getDefaultDouble(basePoint.y); + secPoint.z = buf->getDefaultDouble(basePoint.z); + thirdPoint.x = buf->getDefaultDouble(secPoint.x); + thirdPoint.y = buf->getDefaultDouble(secPoint.y); + thirdPoint.z = buf->getDefaultDouble(secPoint.z); + forthPoint.x = buf->getDefaultDouble(thirdPoint.x); + forthPoint.y = buf->getDefaultDouble(thirdPoint.y); + forthPoint.z = buf->getDefaultDouble(thirdPoint.z); + invisibleflag = has_no_flag ? static_cast< int >( NoEdge ) : buf->getBitShort(); } - else // 2000+ - { - bool has_no_flag = buf->getBit(); - bool z_is_zero = buf->getBit(); - basePoint.x = buf->getRawDouble(); - basePoint.y = buf->getRawDouble(); - basePoint.z = z_is_zero ? 0.0 : buf->getRawDouble(); - secPoint.x = buf->getDefaultDouble( basePoint.x ); - secPoint.y = buf->getDefaultDouble( basePoint.y ); - secPoint.z = buf->getDefaultDouble( basePoint.z ); - thirdPoint.x = buf->getDefaultDouble( secPoint.x ); - thirdPoint.y = buf->getDefaultDouble( secPoint.y ); - thirdPoint.z = buf->getDefaultDouble( secPoint.z ); - fourthPoint.x = buf->getDefaultDouble( thirdPoint.x ); - fourthPoint.y = buf->getDefaultDouble( thirdPoint.y ); - fourthPoint.z = buf->getDefaultDouble( thirdPoint.z ); - invisibleflag = has_no_flag ? static_cast< int >( NoEdge ) : buf->getBitShort(); - } - drw_assert( invisibleflag >= NoEdge ); - drw_assert( invisibleflag <= AllEdges ); //#spellok + drw_assert(invisibleflag>=NoEdge); + drw_assert(invisibleflag<=AllEdges); - QgsDebugMsgLevel( QStringLiteral( "base:%1 sec:%2 third:%3 fourth:%4 invisibleFlag:%5" ) - .arg( QStringLiteral( "%1,%2,%3" ).arg( basePoint.x ).arg( basePoint.y ).arg( basePoint.z ), - QStringLiteral( "%1,%2,%3" ).arg( secPoint.x ).arg( secPoint.y ).arg( secPoint.z ), - QStringLiteral( "%1,%2,%3" ).arg( thirdPoint.x ).arg( thirdPoint.y ).arg( thirdPoint.z ), - QStringLiteral( "%1,%2,%3" ).arg( fourthPoint.x ).arg( fourthPoint.y ).arg( fourthPoint.z ) ) - .arg( invisibleflag ), 4 - ); + DRW_DBG(" - base "); DRW_DBGPT(basePoint.x, basePoint.y, basePoint.z); DRW_DBG("\n"); + DRW_DBG(" - sec "); DRW_DBGPT(secPoint.x, secPoint.y, secPoint.z); DRW_DBG("\n"); + DRW_DBG(" - third "); DRW_DBGPT(thirdPoint.x, thirdPoint.y, thirdPoint.z); DRW_DBG("\n"); + DRW_DBG(" - fourth "); DRW_DBGPT(forthPoint.x, forthPoint.y, forthPoint.z); DRW_DBG("\n"); + DRW_DBG(" - Invisibility mask: "); DRW_DBG(invisibleflag); DRW_DBG("\n"); - // Common Entity Handle Data - ret = DRW_Entity::parseDwgEntHandle( v, buf ); - if ( !ret ) - return ret; + /* Common Entity Handle Data */ + ret = DRW_Entity::parseDwgEntHandle(v, buf); + if (!ret) + return ret; return buf->isGood(); } -void DRW_Block::parseCode( int code, dxfReader *reader ) -{ - switch ( code ) - { - case 2: +void DRW_Block::parseCode(int code, dxfReader *reader){ + switch (code) { + case 2: name = reader->getUtf8String(); break; - case 70: + case 70: flags = reader->getInt32(); break; - default: - DRW_Point::parseCode( code, reader ); + default: + DRW_Point::parseCode(code, reader); break; } } -bool DRW_Block::parseDwg( DRW::Version version, dwgBuffer *buf, duint32 bs ) -{ +bool DRW_Block::parseDwg(DRW::Version version, dwgBuffer *buf, duint32 bs){ dwgBuffer sBuff = *buf; dwgBuffer *sBuf = buf; - if ( version > DRW::AC1018 ) //2007+ - { - sBuf = &sBuff; //separate buffer for strings + if (version > DRW::AC1018) {//2007+ + sBuf = &sBuff; //separate buffer for strings } - bool ret = DRW_Entity::parseDwg( version, buf, sBuf, bs ); - if ( !ret ) - return ret; - if ( !isEnd ) - { - QgsDebugMsgLevel( QStringLiteral( "***************************** parsing block *********************************************" ), 4 ); - name = sBuf->getVariableText( version, false ); - QgsDebugMsgLevel( QStringLiteral( "Block name: %1" ).arg( name.c_str() ), 4 ); + bool ret = DRW_Entity::parseDwg(version, buf, sBuf, bs); + if (!ret) + return ret; + if (!isEnd){ + DRW_DBG("\n***************************** parsing block *********************************************\n"); + name = sBuf->getVariableText(version, false); + DRW_DBG("Block name: "); DRW_DBG(name.c_str()); DRW_DBG("\n"); + } else { + DRW_DBG("\n***************************** parsing end block *********************************************\n"); } - else - { - QgsDebugMsgLevel( QStringLiteral( "***************************** parsing end block *********************************************" ), 4 ); - } - if ( version > DRW::AC1018 ) //2007+ - { - duint8 unk = buf->getBit(); - QgsDebugMsgLevel( QStringLiteral( "unknown bit: %1" ).arg( unk ), 4 ); - Q_UNUSED( unk ); + if (version > DRW::AC1018) {//2007+ + duint8 unk = buf->getBit(); + DRW_DBG("unknown bit: "); DRW_DBG(unk); DRW_DBG("\n"); } // X handleAssoc; //X - ret = DRW_Entity::parseDwgEntHandle( version, buf ); - if ( !ret ) - return ret; + ret = DRW_Entity::parseDwgEntHandle(version, buf); + if (!ret) + return ret; // RS crc; //RS */ return buf->isGood(); } -void DRW_Insert::parseCode( int code, dxfReader *reader ) -{ - switch ( code ) - { - case 2: +void DRW_Insert::parseCode(int code, dxfReader *reader){ + switch (code) { + case 2: name = reader->getUtf8String(); break; - case 41: + case 41: xscale = reader->getDouble(); break; - case 42: + case 42: yscale = reader->getDouble(); break; - case 43: + case 43: zscale = reader->getDouble(); break; - case 50: - angle = reader->getDouble() / ARAD; + case 50: + angle = reader->getDouble(); + angle = angle/ARAD; //convert to radian break; - case 70: + case 70: colcount = reader->getInt32(); break; - case 71: + case 71: rowcount = reader->getInt32(); break; - case 44: + case 44: colspace = reader->getDouble(); break; - case 45: + case 45: rowspace = reader->getDouble(); break; - default: - DRW_Point::parseCode( code, reader ); + default: + DRW_Point::parseCode(code, reader); break; } } -bool DRW_Insert::parseDwg( DRW::Version version, dwgBuffer *buf, duint32 bs ) -{ +bool DRW_Insert::parseDwg(DRW::Version version, dwgBuffer *buf, duint32 bs){ dint32 objCount = 0; - bool ret = DRW_Entity::parseDwg( version, buf, nullptr, bs ); - if ( !ret ) - return ret; - - QgsDebugMsgLevel( QStringLiteral( "************************** parsing insert/minsert *****************************************" ), 4 ); - + bool ret = DRW_Entity::parseDwg(version, buf, NULL, bs); + if (!ret) + return ret; + DRW_DBG("\n************************** parsing insert/minsert *****************************************\n"); basePoint.x = buf->getBitDouble(); basePoint.y = buf->getBitDouble(); basePoint.z = buf->getBitDouble(); - - QgsDebugMsgLevel( QStringLiteral( "insertion point:%1" ) - .arg( QStringLiteral( "%1,%2,%3" ).arg( basePoint.x ).arg( basePoint.y ).arg( basePoint.z ) ), 4 - ); - - if ( version < DRW::AC1015 ) //14- - { - xscale = buf->getBitDouble(); - yscale = buf->getBitDouble(); - zscale = buf->getBitDouble(); + DRW_DBG("insertion point: "); DRW_DBGPT(basePoint.x, basePoint.y, basePoint.z); DRW_DBG("\n"); + if (version < DRW::AC1015) {//14- + xscale = buf->getBitDouble(); + yscale = buf->getBitDouble(); + zscale = buf->getBitDouble(); + } else { + duint8 dataFlags = buf->get2Bits(); + if (dataFlags == 3){ + //none default value 1,1,1 + } else if (dataFlags == 1){ //x default value 1, y & z can be x value + yscale = buf->getDefaultDouble(xscale); + zscale = buf->getDefaultDouble(xscale); + } else if (dataFlags == 2){ + xscale = buf->getRawDouble(); + yscale = zscale = xscale; + } else { //dataFlags == 0 + xscale = buf->getRawDouble(); + yscale = buf->getDefaultDouble(xscale); + zscale = buf->getDefaultDouble(xscale); + } } - else - { - duint8 dataFlags = buf->get2Bits(); - if ( dataFlags == 3 ) - { - //none default value 1,1,1 - } - else if ( dataFlags == 1 ) //x default value 1, y & z can be x value - { - yscale = buf->getDefaultDouble( xscale ); - zscale = buf->getDefaultDouble( xscale ); - } - else if ( dataFlags == 2 ) - { - xscale = buf->getRawDouble(); - yscale = zscale = xscale; - } - else //dataFlags == 0 - { - xscale = buf->getRawDouble(); - yscale = buf->getDefaultDouble( xscale ); - zscale = buf->getDefaultDouble( xscale ); - } - } - angle = buf->getBitDouble(); + DRW_DBG("scale : "); DRW_DBGPT(xscale, yscale, zscale); DRW_DBG(", angle: "); DRW_DBG(angle); extPoint = buf->getExtrusion( false, haveExtrusion ); //3BD R14 style - - QgsDebugMsgLevel( QStringLiteral( "scale:%1 angle:%2 extrusion:%3" ) - .arg( QStringLiteral( "%1,%2,%3" ).arg( xscale ).arg( yscale ).arg( zscale ) ) - .arg( angle ) - .arg( QStringLiteral( "%1,%2,%3" ).arg( extPoint.x ).arg( extPoint.y ).arg( extPoint.z ) ), 4 - ); + DRW_DBG("\nextrusion: "); DRW_DBGPT(extPoint.x, extPoint.y, extPoint.z); bool hasAttrib = buf->getBit(); + DRW_DBG(" has Attrib: "); DRW_DBG(hasAttrib); - QgsDebugMsgLevel( QStringLiteral( " has Attrib:%1" ).arg( hasAttrib ), 4 ); - - if ( hasAttrib && version > DRW::AC1015 ) //2004+ - { - objCount = buf->getBitLong(); - Q_UNUSED( objCount ); - QgsDebugMsgLevel( QStringLiteral( "objCount:%1" ).arg( objCount ), 4 ); + if (hasAttrib && version > DRW::AC1015) {//2004+ + objCount = buf->getBitLong(); + DRW_UNUSED(objCount); + DRW_DBG(" objCount: "); DRW_DBG(objCount); DRW_DBG("\n"); } - if ( oType == 8 ) //entity are minsert - { - colcount = buf->getBitShort(); - rowcount = buf->getBitShort(); - colspace = buf->getBitDouble(); - rowspace = buf->getBitDouble(); + if (oType == 8) {//entity are minsert + colcount = buf->getBitShort(); + rowcount = buf->getBitShort(); + colspace = buf->getBitDouble(); + rowspace = buf->getBitDouble(); } - - QgsDebugMsgLevel( QStringLiteral( " Remaining bytes: %1" ).arg( buf->numRemainingBytes() ), 4 ); - - ret = DRW_Entity::parseDwgEntHandle( version, buf ); + DRW_DBG(" Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n"); + ret = DRW_Entity::parseDwgEntHandle(version, buf); blockRecH = buf->getHandle(); /* H 2 BLOCK HEADER (hard pointer) */ + DRW_DBG("BLOCK HEADER Handle: "); DRW_DBGHL(blockRecH.code, blockRecH.size, blockRecH.ref); DRW_DBG("\n"); + DRW_DBG(" Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n"); - QgsDebugMsgLevel( QStringLiteral( " BLOCK HEADER Handle: %1.%2 0x%3, remaining bytes %4" ) - .arg( blockRecH.code ).arg( blockRecH.size ).arg( blockRecH.ref, 0, 16 ) - .arg( buf->numRemainingBytes() ), 4 - ); - - // attribs follows - if ( hasAttrib ) - { - if ( version < DRW::AC1018 ) //2000- - { - dwgHandle attH = buf->getHandle(); /* H 2 BLOCK HEADER (hard pointer) */ - - QgsDebugMsgLevel( QStringLiteral( " first attrib handle: %1.%2 0x%3" ) - .arg( attH.code ).arg( attH.size ).arg( attH.ref, 0, 16 ), 4 - ); - - attH = buf->getHandle(); /* H 2 BLOCK HEADER (hard pointer) */ - - QgsDebugMsgLevel( QStringLiteral( " second attrib handle: %1.%2 0x%3" ) - .arg( attH.code ).arg( attH.size ).arg( attH.ref, 0, 16 ), 4 - ); - - } - else - { - for ( duint8 i = 0; i < objCount; ++i ) - { - dwgHandle attH = buf->getHandle(); /* H 2 BLOCK HEADER (hard pointer) */ - QgsDebugMsgLevel( QStringLiteral( " attrib handle #%1: %2.%3 0x%4" ) - .arg( i ).arg( attH.code ).arg( attH.size ).arg( attH.ref, 0, 16 ), 4 - ); + /*attribs follows*/ + if (hasAttrib) { + if (version < DRW::AC1018) {//2000- + dwgHandle attH = buf->getHandle(); /* H 2 BLOCK HEADER (hard pointer) */ + DRW_DBG("first attrib Handle: "); DRW_DBGHL(attH.code, attH.size, attH.ref); DRW_DBG("\n"); + attH = buf->getHandle(); /* H 2 BLOCK HEADER (hard pointer) */ + DRW_DBG("second attrib Handle: "); DRW_DBGHL(attH.code, attH.size, attH.ref); DRW_DBG("\n"); + } else { + for (duint8 i=0; i< objCount; ++i){ + dwgHandle attH = buf->getHandle(); /* H 2 BLOCK HEADER (hard pointer) */ + DRW_DBG("attrib Handle #"); DRW_DBG(i); DRW_DBG(": "); DRW_DBGHL(attH.code, attH.size, attH.ref); DRW_DBG("\n"); + } } - } - seqendH = buf->getHandle(); /* H 2 BLOCK HEADER (hard pointer) */ - - QgsDebugMsgLevel( QStringLiteral( " seqend handle: %1.%2 0x%3" ) - .arg( seqendH.code ).arg( seqendH.size ).arg( seqendH.ref, 0, 16 ), 4 - ); + seqendH = buf->getHandle(); /* H 2 BLOCK HEADER (hard pointer) */ + DRW_DBG("seqendH Handle: "); DRW_DBGHL(seqendH.code, seqendH.size, seqendH.ref); DRW_DBG("\n"); } + DRW_DBG(" Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n"); - QgsDebugMsgLevel( QStringLiteral( " Remaining bytes:%1" ).arg( buf->numRemainingBytes() ), 4 ); - - if ( !ret ) - return ret; - - // RS crc; //RS */ - + if (!ret) + return ret; +// RS crc; //RS */ return buf->isGood(); } -void DRW_LWPolyline::applyExtrusion() -{ - if ( haveExtrusion ) - { - calculateAxis( extPoint ); - for ( unsigned int i = 0; i < vertlist.size(); i++ ) - { - DRW_Vertex2D *vert = vertlist.at( i ); - DRW_Coord v( vert->x, vert->y, elevation ); - extrudePoint( extPoint, &v ); - vert->x = v.x; - vert->y = v.y; - } +void DRW_LWPolyline::applyExtrusion(){ + if (haveExtrusion) { + calculateAxis(extPoint); + for (unsigned int i=0; ix, vert->y, elevation); + extrudePoint(extPoint, &v); + vert->x = v.x; + vert->y = v.y; + } } } -void DRW_LWPolyline::parseCode( int code, dxfReader *reader ) -{ - switch ( code ) - { - case 10: - { - vertex = new DRW_Vertex2D(); - vertlist.push_back( vertex ); +void DRW_LWPolyline::parseCode(int code, dxfReader *reader){ + switch (code) { + case 10: { + vertex = std::make_shared(); + vertlist.push_back(vertex); vertex->x = reader->getDouble(); + break; } + case 20: + if(vertex) + vertex->y = reader->getDouble(); break; - } - case 20: - if ( vertex ) - vertex->y = reader->getDouble(); + case 40: + if(vertex) + vertex->stawidth = reader->getDouble(); break; - case 40: - if ( vertex ) - vertex->stawidth = reader->getDouble(); + case 41: + if(vertex) + vertex->endwidth = reader->getDouble(); break; - case 41: - if ( vertex ) - vertex->endwidth = reader->getDouble(); + case 42: + if(vertex) + vertex->bulge = reader->getDouble(); break; - case 42: - if ( vertex ) - vertex->bulge = reader->getDouble(); - break; - case 38: + case 38: elevation = reader->getDouble(); break; - case 39: + case 39: thickness = reader->getDouble(); break; - case 43: + case 43: width = reader->getDouble(); break; - case 70: + case 70: flags = reader->getInt32(); break; - case 90: + case 90: vertexnum = reader->getInt32(); RESERVE( vertlist, vertexnum ); break; - case 210: + case 210: haveExtrusion = true; extPoint.x = reader->getDouble(); break; - case 220: + case 220: extPoint.y = reader->getDouble(); break; - case 230: + case 230: extPoint.z = reader->getDouble(); break; - default: - DRW_Entity::parseCode( code, reader ); + default: + DRW_Entity::parseCode(code, reader); break; } } -bool DRW_LWPolyline::parseDwg( DRW::Version version, dwgBuffer *buf, duint32 bs ) -{ - bool ret = DRW_Entity::parseDwg( version, buf, nullptr, bs ); - if ( !ret ) - return ret; - - QgsDebugMsgLevel( QStringLiteral( "***************************** parsing LWPolyline *******************************************" ), 4 ); +bool DRW_LWPolyline::parseDwg(DRW::Version version, dwgBuffer *buf, duint32 bs){ + bool ret = DRW_Entity::parseDwg(version, buf, NULL, bs); + if (!ret) + return ret; + DRW_DBG("\n***************************** parsing LWPolyline *******************************************\n"); flags = buf->getBitShort(); - QgsDebugMsgLevel( QStringLiteral( "flags value:0x%1" ).arg( flags, 0, 16 ), 4 ); - - if ( flags & 4 ) - width = buf->getBitDouble(); - if ( flags & 8 ) - elevation = buf->getBitDouble(); - if ( flags & 2 ) - thickness = buf->getBitDouble(); - if ( flags & 1 ) + DRW_DBG("flags value: "); DRW_DBG(flags); + if (flags & 4) + width = buf->getBitDouble(); + if (flags & 8) + elevation = buf->getBitDouble(); + if (flags & 2) + thickness = buf->getBitDouble(); + if (flags & 1) extPoint = buf->getExtrusion( false, haveExtrusion ); - vertexnum = buf->getBitLong(); RESERVE( vertlist, vertexnum ); unsigned int bulgesnum = 0; - if ( flags & 16 ) - bulgesnum = buf->getBitLong(); + if (flags & 16) + bulgesnum = buf->getBitLong(); int vertexIdCount = 0; - if ( version > DRW::AC1021 ) //2010+ - { - if ( flags & 1024 ) - vertexIdCount = buf->getBitLong(); + if (version > DRW::AC1021) {//2010+ + if (flags & 1024) + vertexIdCount = buf->getBitLong(); } unsigned int widthsnum = 0; - if ( flags & 32 ) - widthsnum = buf->getBitLong(); - - QgsDebugMsgLevel( QStringLiteral( "vertex num:%1, bulges num:%2, vertexIdCount:%3, widths num:%4" ) - .arg( vertexnum ).arg( bulgesnum ).arg( vertexIdCount ).arg( widthsnum ), 4 - ); - + if (flags & 32) + widthsnum = buf->getBitLong(); + DRW_DBG("\nvertex num: "); DRW_DBG(vertexnum); DRW_DBG(" bulges num: "); DRW_DBG(bulgesnum); + DRW_DBG(" vertexIdCount: "); DRW_DBG(vertexIdCount); DRW_DBG(" widths num: "); DRW_DBG(widthsnum); //clear all bit except 128 = plinegen and set 1 to open/close //RLZ:verify plinegen & open //dxf: plinegen 128 & open 1 - flags = ( flags & 512 ) ? ( flags | 1 ) : ( flags | 0 ); + flags = (flags & 512)? (flags | 1):(flags | 0); flags &= 129; + DRW_DBG("end flags value: "); DRW_DBG(flags); - QgsDebugMsgLevel( QStringLiteral( "end flags value:0x%1" ).arg( flags, 0, 16 ), 4 ); - - if ( vertexnum > 0 ) //verify if is lwpol without vertex (empty) - { - // add vertexs - vertex = new DRW_Vertex2D(); - vertex->x = buf->getRawDouble(); - vertex->y = buf->getRawDouble(); - vertlist.push_back( vertex ); - DRW_Vertex2D *pv = vertex; - for ( std::vector::size_type i = 1; i < vertexnum; i++ ) - { - vertex = new DRW_Vertex2D(); - if ( version < DRW::AC1015 ) //14- - { - vertex->x = buf->getRawDouble(); - vertex->y = buf->getRawDouble(); + if (vertexnum > 0) { //verify if is lwpol without vertex (empty) + // add vertexs + vertex = std::make_shared(); + vertex->x = buf->getRawDouble(); + vertex->y = buf->getRawDouble(); + vertlist.push_back(vertex); + auto pv = vertex; + for (int i = 1; i< vertexnum; i++){ + vertex = std::make_shared(); + if (version < DRW::AC1015) {//14- + vertex->x = buf->getRawDouble(); + vertex->y = buf->getRawDouble(); + } else { +// DRW_Vertex2D *pv = vertlist.back(); + vertex->x = buf->getDefaultDouble(pv->x); + vertex->y = buf->getDefaultDouble(pv->y); + } + pv = vertex; + vertlist.push_back(vertex); } - else - { - vertex->x = buf->getDefaultDouble( pv->x ); - vertex->y = buf->getDefaultDouble( pv->y ); + //add bulges + for (unsigned int i = 0; i < bulgesnum; i++){ + double bulge = buf->getBitDouble(); + if (vertlist.size()> i) + vertlist.at(i)->bulge = bulge; } - pv = vertex; - vertlist.push_back( vertex ); - } - //add bulges - for ( unsigned int i = 0; i < bulgesnum; i++ ) - { - double bulge = buf->getBitDouble(); - if ( vertlist.size() > i ) - vertlist.at( i )->bulge = bulge; - } - //add vertexId - if ( version > DRW::AC1021 ) //2010+ - { - for ( int i = 0; i < vertexIdCount; i++ ) - { - dint32 vertexId = buf->getBitLong(); - //TODO implement vertexId, do not exist in dxf - DRW_UNUSED( vertexId ); -#if 0 - if ( vertlist.size() < i ) - vertlist.at( i )->vertexId = vertexId; -#endif // 0 + //add vertexId + if (version > DRW::AC1021) {//2010+ + for (int i = 0; i < vertexIdCount; i++){ + dint32 vertexId = buf->getBitLong(); + //TODO implement vertexId, do not exist in dxf + DRW_UNUSED(vertexId); +// if (vertlist.size()< i) +// vertlist.at(i)->vertexId = vertexId; + } } - } - //add widths - for ( unsigned int i = 0; i < widthsnum; i++ ) - { - double staW = buf->getBitDouble(); - double endW = buf->getBitDouble(); - if ( i < vertlist.size() ) - { - vertlist.at( i )->stawidth = staW; - vertlist.at( i )->endwidth = endW; + //add widths + for (unsigned int i = 0; i < widthsnum; i++){ + double staW = buf->getBitDouble(); + double endW = buf->getBitDouble(); + if (vertlist.size()< i) { + vertlist.at(i)->stawidth = staW; + vertlist.at(i)->endwidth = endW; + } + } + } + if (DRW_DBGGL == DRW_dbg::Level::Debug){ + DRW_DBG("\nVertex list: "); + for (auto& pv: vertlist) { + DRW_DBG("\n x: "); DRW_DBG(pv->x); DRW_DBG(" y: "); DRW_DBG(pv->y); DRW_DBG(" bulge: "); DRW_DBG(pv->bulge); + DRW_DBG(" stawidth: "); DRW_DBG(pv->stawidth); DRW_DBG(" endwidth: "); DRW_DBG(pv->endwidth); } - } } - QgsDebugMsgLevel( QStringLiteral( "Vertex list: " ), 5 ); - - for ( std::vector::iterator it = vertlist.begin() ; it != vertlist.end(); ++it ) - { - DRW_Vertex2D *pv = *it; - - QgsDebugMsgLevel( QStringLiteral( "x:%1 y:%2 bulge:%3 stawidth:%4 endwidth:%5" ) - .arg( pv->x ).arg( pv->y ) - .arg( pv->bulge ) - .arg( pv->stawidth ) - .arg( pv->endwidth ), 5 - ); - Q_UNUSED( pv ); - } - - // Common Entity Handle Data - ret = DRW_Entity::parseDwgEntHandle( version, buf ); - if ( !ret ) - return ret; - - // CRC X - + DRW_DBG("\n"); + /* Common Entity Handle Data */ + ret = DRW_Entity::parseDwgEntHandle(version, buf); + if (!ret) + return ret; + /* CRC X --- */ return buf->isGood(); } -void DRW_Text::parseCode( int code, dxfReader *reader ) -{ - switch ( code ) - { - case 40: +void DRW_Text::parseCode(int code, dxfReader *reader){ + switch (code) { + case 40: height = reader->getDouble(); break; - case 41: + case 41: widthscale = reader->getDouble(); break; - case 50: + case 50: angle = reader->getDouble() / ARAD; break; - case 51: + case 51: oblique = reader->getDouble() / ARAD; break; - case 71: + case 71: textgen = reader->getInt32(); break; - case 72: + case 72: alignH = static_cast< HAlign >( reader->getInt32() ); break; - case 73: + case 73: alignV = static_cast< VAlign >( reader->getInt32() ); break; - case 1: + case 1: text = reader->getUtf8String(); break; - case 7: + case 7: style = reader->getUtf8String(); break; - default: - DRW_Line::parseCode( code, reader ); + default: + DRW_Line::parseCode(code, reader); break; } } -bool DRW_Text::parseDwg( DRW::Version version, dwgBuffer *buf, duint32 bs ) -{ +bool DRW_Text::parseDwg(DRW::Version version, dwgBuffer *buf, duint32 bs){ dwgBuffer sBuff = *buf; dwgBuffer *sBuf = buf; - if ( version > DRW::AC1018 ) //2007+ - { - sBuf = &sBuff; //separate buffer for strings + if (version > DRW::AC1018) {//2007+ + sBuf = &sBuff; //separate buffer for strings } - bool ret = DRW_Entity::parseDwg( version, buf, sBuf, bs ); - if ( !ret ) - return ret; + bool ret = DRW_Entity::parseDwg(version, buf, sBuf, bs); + if (!ret) + return ret; + DRW_DBG("\n***************************** parsing text *********************************************\n"); - QgsDebugMsgLevel( QStringLiteral( "***************************** parsing text *********************************************" ), 4 ); - - // DataFlags RC Used to determine presence of subsequent data, set to 0xFF for R14- +// DataFlags RC Used to determine presence of subsequent data, set to 0xFF for R14- duint8 data_flags = 0x00; - if ( version > DRW::AC1014 ) //2000+ - { - data_flags = buf->getRawChar8(); /* DataFlags RC Used to determine presence of subsequent data */ - - QgsDebugMsgLevel( QStringLiteral( "data_flags:%1" ).arg( data_flags, 0, 16 ), 4 ); - - if ( !( data_flags & 0x01 ) ) /* Elevation RD --- present if !(DataFlags & 0x01) */ - { - basePoint.z = buf->getRawDouble(); - } - } - else //14- - { - basePoint.z = buf->getBitDouble(); /* Elevation BD --- */ + if (version > DRW::AC1014) {//2000+ + data_flags = buf->getRawChar8(); /* DataFlags RC Used to determine presence of subsequent data */ + DRW_DBG("data_flags: "); DRW_DBG(data_flags); DRW_DBG("\n"); + if ( !(data_flags & 0x01) ) { /* Elevation RD --- present if !(DataFlags & 0x01) */ + basePoint.z = buf->getRawDouble(); + } + } else {//14- + basePoint.z = buf->getBitDouble(); /* Elevation BD --- */ } basePoint.x = buf->getRawDouble(); /* Insertion pt 2RD 10 */ basePoint.y = buf->getRawDouble(); - - QgsDebugMsgLevel( QStringLiteral( "Insert point:%1" ) - .arg( QStringLiteral( "%1,%2,%3" ).arg( basePoint.x ).arg( basePoint.y ).arg( basePoint.z ) ), 4 - ); - - if ( version > DRW::AC1014 ) //2000+ - { - if ( !( data_flags & 0x02 ) ) /* Alignment pt 2DD 11 present if !(DataFlags & 0x02), use 10 & 20 values for 2 default values.*/ - { - secPoint.x = buf->getDefaultDouble( basePoint.x ); - secPoint.y = buf->getDefaultDouble( basePoint.y ); - } - else - { - secPoint = basePoint; - } - } - else //14- - { - secPoint.x = buf->getRawDouble(); /* Alignment pt 2RD 11 */ - secPoint.y = buf->getRawDouble(); + DRW_DBG("Insert point: "); DRW_DBGPT(basePoint.x, basePoint.y, basePoint.z); DRW_DBG("\n"); + if (version > DRW::AC1014) {//2000+ + if ( !(data_flags & 0x02) ) { /* Alignment pt 2DD 11 present if !(DataFlags & 0x02), use 10 & 20 values for 2 default values.*/ + secPoint.x = buf->getDefaultDouble(basePoint.x); + secPoint.y = buf->getDefaultDouble(basePoint.y); + } else { + secPoint = basePoint; + } + } else {//14- + secPoint.x = buf->getRawDouble(); /* Alignment pt 2RD 11 */ + secPoint.y = buf->getRawDouble(); } secPoint.z = basePoint.z; + DRW_DBG("Alignment: "); DRW_DBGPT(secPoint.x, secPoint.y, basePoint.z); DRW_DBG("\n"); extPoint = buf->getExtrusion( version > DRW::AC1014, haveExtrusion ); - thickness = buf->getThickness( version > DRW::AC1014 ); /* Thickness BD 39 */ + DRW_DBG("Extrusion: "); DRW_DBGPT(extPoint.x, extPoint.y, extPoint.z); DRW_DBG("\n"); + thickness = buf->getThickness(version > DRW::AC1014); /* Thickness BD 39 */ - QgsDebugMsgLevel( QStringLiteral( "alignment:%1 extrusion:%2" ) - .arg( QStringLiteral( "%1,%2,%3" ).arg( secPoint.x ).arg( secPoint.y ).arg( secPoint.z ), - QStringLiteral( "%1,%2,%3" ).arg( extPoint.x ).arg( extPoint.y ).arg( extPoint.z ) ), 4 - ); - - if ( version > DRW::AC1014 ) //2000+ - { - if ( !( data_flags & 0x04 ) ) /* Oblique angle RD 51 present if !(DataFlags & 0x04) */ - { - oblique = buf->getRawDouble(); - } - if ( !( data_flags & 0x08 ) ) /* Rotation angle RD 50 present if !(DataFlags & 0x08) */ - { - angle = buf->getRawDouble(); - } - height = buf->getRawDouble(); /* Height RD 40 */ - if ( !( data_flags & 0x10 ) ) /* Width factor RD 41 present if !(DataFlags & 0x10) */ - { - widthscale = buf->getRawDouble(); - } + if (version > DRW::AC1014) {//2000+ + if ( !(data_flags & 0x04) ) { /* Oblique ang RD 51 present if !(DataFlags & 0x04) */ + oblique = buf->getRawDouble(); + } + if ( !(data_flags & 0x08) ) { /* Rotation ang RD 50 present if !(DataFlags & 0x08) */ + angle = buf->getRawDouble(); + } + height = buf->getRawDouble(); /* Height RD 40 */ + if ( !(data_flags & 0x10) ) { /* Width factor RD 41 present if !(DataFlags & 0x10) */ + widthscale = buf->getRawDouble(); + } + } else {//14- + oblique = buf->getBitDouble(); /* Oblique ang BD 51 */ + angle = buf->getBitDouble(); /* Rotation ang BD 50 */ + height = buf->getBitDouble(); /* Height BD 40 */ + widthscale = buf->getBitDouble(); /* Width factor BD 41 */ } - else //14- - { - oblique = buf->getBitDouble(); /* Oblique angle BD 51 */ - angle = buf->getBitDouble(); /* Rotation angle BD 50 */ - height = buf->getBitDouble(); /* Height BD 40 */ - widthscale = buf->getBitDouble(); /* Width factor BD 41 */ + DRW_DBG("thickness: "); DRW_DBG(thickness); DRW_DBG(", Oblique ang: "); DRW_DBG(oblique); DRW_DBG(", Width: "); + DRW_DBG(widthscale); DRW_DBG(", Rotation: "); DRW_DBG(angle); DRW_DBG(", height: "); DRW_DBG(height); DRW_DBG("\n"); + text = sBuf->getVariableText(version, false); /* Text value TV 1 */ + DRW_DBG("text string: "); DRW_DBG(text.c_str());DRW_DBG("\n"); + //textgen, alignH, alignV always present in R14-, data_flags set in initialisation + if ( !(data_flags & 0x20) ) { /* Generation BS 71 present if !(DataFlags & 0x20) */ + textgen = buf->getBitShort(); + DRW_DBG("textgen: "); DRW_DBG(textgen); } - - QgsDebugMsgLevel( QStringLiteral( "thickness:%1, Oblique angle:%2, Width:%3, rotation:%4, height:%5" ) - .arg( thickness ).arg( oblique ).arg( widthscale ).arg( angle ).arg( height ), 4 - ); - - text = sBuf->getVariableText( version, false ); /* Text value TV 1 */ - - QgsDebugMsgLevel( QStringLiteral( "text string:%1" ).arg( text.c_str() ), 4 ); - - //textgen, alignH, alignV always present in R14-, data_flags set in initialization - if ( !( data_flags & 0x20 ) ) /* Generation BS 71 present if !(DataFlags & 0x20) */ - { - textgen = buf->getBitShort(); - QgsDebugMsgLevel( QStringLiteral( "textgen:%1" ).arg( textgen ), 4 ); + if ( !(data_flags & 0x40) ) { /* Horiz align. BS 72 present if !(DataFlags & 0x40) */ + alignH = static_cast< HAlign >( buf->getBitShort() ); + DRW_DBG(", alignH: "); DRW_DBG(alignH); } - if ( !( data_flags & 0x40 ) ) /* Horiz align. BS 72 present if !(DataFlags & 0x40) */ - { - alignH = static_cast< HAlign >( buf->getBitShort() ); - QgsDebugMsgLevel( QStringLiteral( "alignH:%1" ).arg( alignH ), 4 ); - } - if ( !( data_flags & 0x80 ) ) /* Vert align. BS 73 present if !(DataFlags & 0x80) */ - { - alignV = static_cast< VAlign >( buf->getBitShort() ); - QgsDebugMsgLevel( QStringLiteral( "alignV:%1" ).arg( alignV ), 4 ); + if ( !(data_flags & 0x80) ) { /* Vert align. BS 73 present if !(DataFlags & 0x80) */ + alignV = static_cast< VAlign >( buf->getBitShort() ); + DRW_DBG(", alignV: "); DRW_DBG(alignV); } + DRW_DBG("\n"); /* Common Entity Handle Data */ - ret = DRW_Entity::parseDwgEntHandle( version, buf ); - if ( !ret ) - return ret; + ret = DRW_Entity::parseDwgEntHandle(version, buf); + if (!ret) + return ret; styleH = buf->getHandle(); /* H 7 STYLE (hard pointer) */ - - QgsDebugMsgLevel( QStringLiteral( "text style Handle:%1.%2 0x%3" ) - .arg( styleH.code ).arg( styleH.size ).arg( styleH.ref, 0, 16 ), 4 - ); + DRW_DBG("text style Handle: "); DRW_DBGHL(styleH.code, styleH.size, styleH.ref); DRW_DBG("\n"); /* CRC X --- */ return buf->isGood(); } -void DRW_MText::parseCode( int code, dxfReader *reader ) -{ - switch ( code ) - { - case 1: +void DRW_MText::parseCode(int code, dxfReader *reader){ + switch (code) { + case 1: text += reader->getString(); - text = reader->toUtf8String( text ); + text = reader->toUtf8String(text); break; - case 11: + case 11: haveXAxis = true; - DRW_Text::parseCode( code, reader ); + DRW_Text::parseCode(code, reader); break; - case 3: + case 3: text += reader->getString(); break; - case 44: + case 44: interlin = reader->getDouble(); break; - default: - DRW_Text::parseCode( code, reader ); + default: + DRW_Text::parseCode(code, reader); break; } } -bool DRW_MText::parseDwg( DRW::Version version, dwgBuffer *buf, duint32 bs ) -{ - dwgBuffer sBuff = *buf; - dwgBuffer *sBuf = buf; - if ( version > DRW::AC1018 ) //2007+ - { - sBuf = &sBuff; //separate buffer for strings - } - bool ret = DRW_Entity::parseDwg( version, buf, sBuf, bs ); - if ( !ret ) - return ret; +bool DRW_MText::parseDwg(DRW::Version version, dwgBuffer *buf, duint32 bs){ + dwgBuffer sBuff = *buf; + dwgBuffer *sBuf = buf; + if (version > DRW::AC1018) {//2007+ + sBuf = &sBuff; //separate buffer for strings + } + bool ret = DRW_Entity::parseDwg(version, buf, sBuf, bs); + if (!ret) + return ret; + DRW_DBG("\n***************************** parsing mtext *********************************************\n"); - QgsDebugMsgLevel( QStringLiteral( "***************************** parsing mtext *********************************************" ), 4 ); - - basePoint = buf->get3BitDouble(); /* Insertion pt 3BD 10 - First picked point. */ - - QgsDebugMsgLevel( QStringLiteral( "insertion:%1" ) - .arg( QStringLiteral( "%1,%2,%3" ).arg( basePoint.x ).arg( basePoint.y ).arg( basePoint.z ) ), 4 - ); - - extPoint = buf->get3BitDouble(); /* Extrusion 3BD 210 Undocumented; */ - secPoint = buf->get3BitDouble(); /* X-axis dir 3BD 11 */ + basePoint = buf->get3BitDouble(); /* Insertion pt 3BD 10 - First picked point. */ + DRW_DBG("Insertion: "); DRW_DBGPT(basePoint.x, basePoint.y, basePoint.z); DRW_DBG("\n"); + extPoint = buf->get3BitDouble(); /* Extrusion 3BD 210 Undocumented; */ + secPoint = buf->get3BitDouble(); /* X-axis dir 3BD 11 */ haveXAxis = true; updateAngle(); widthscale = buf->getBitDouble(); /* Rect width BD 41 */ - if ( version > DRW::AC1018 ) //2007+ - { - /* Rect height BD 46 Reference rectangle height. */ - //! @todo - buf->getBitDouble(); + if (version > DRW::AC1018) {//2007+ + /* Rect height BD 46 Reference rectangle height. */ + /** @todo */buf->getBitDouble(); } height = buf->getBitDouble();/* Text height BD 40 Undocumented */ textgen = buf->getBitShort(); /* Attachment BS 71 Similar to justification; */ /* Drawing dir BS 72 Left to right, etc.; see DXF doc */ dint16 draw_dir = buf->getBitShort(); - DRW_UNUSED( draw_dir ); + DRW_UNUSED(draw_dir); /* Extents ht BD Undocumented and not present in DXF or entget */ double ext_ht = buf->getBitDouble(); - DRW_UNUSED( ext_ht ); + DRW_UNUSED(ext_ht); /* Extents wid BD Undocumented and not present in DXF or entget The extents rectangle, when rotated the same as the text, fits the actual text image on the screen (although we've seen it include an extra row of text in height). */ double ext_wid = buf->getBitDouble(); - DRW_UNUSED( ext_wid ); + DRW_UNUSED(ext_wid); /* Text TV 1 All text in one long string (without '\n's 3 for line wrapping). ACAD seems to add braces ({ }) and backslash-P's to indicate paragraphs based on the "\r\n"'s found in the imported file. But, all the text is in @@ -1832,226 +1488,190 @@ bool DRW_MText::parseDwg( DRW::Version version, dwgBuffer *buf, duint32 bs ) entget. ACAD's entget breaks this string into 250-char pieces (not 255 as doc'd) – even if it's mid-word. The 1-group always gets the tag end; therefore, the 3's are always 250 chars long. */ - text = sBuf->getVariableText( version, false ); /* Text value TV 1 */ - if ( version > DRW::AC1014 ) //2000+ - { - buf->getBitShort();/* Linespacing Style BS 73 */ - interlin = buf->getBitDouble();/* Linespacing Factor BD 44 */ - buf->getBit();/* Unknown bit B */ + text = sBuf->getVariableText(version, false); /* Text value TV 1 */ + if (version > DRW::AC1014) {//2000+ + buf->getBitShort();/* Linespacing Style BS 73 */ + interlin = buf->getBitDouble();/* Linespacing Factor BD 44 */ + buf->getBit();/* Unknown bit B */ } - if ( version > DRW::AC1015 ) //2004+ - { - /* Background flags BL 0 = no background, 1 = background fill, 2 =background - fill with drawing fill color. */ - dint32 bk_flags = buf->getBitLong(); //! @todo add to DRW_MText - if ( bk_flags == 1 ) - { - /* Background scale factor BL Present if background flags = 1, default = 1.5*/ - buf->getBitLong(); - /* Background color CMC Present if background flags = 1 */ - buf->getCmColor( version ); //RLZ: warning CMC or ENC - //! @todo buf->getCMC - /* Background transparency BL Present if background flags = 1 */ - buf->getBitLong(); - } + if (version > DRW::AC1015) {//2004+ + /* Background flags BL 0 = no background, 1 = background fill, 2 =background + fill with drawing fill color. */ + dint32 bk_flags = buf->getBitLong(); /** @todo add to DRW_MText */ + if ( bk_flags == 1 ) { + /* Background scale factor BL Present if background flags = 1, default = 1.5*/ + buf->getBitLong(); + /* Background color CMC Present if background flags = 1 */ + buf->getCmColor(version); //RLZ: warning CMC or ENC + /** @todo buf->getCMC */ + /* Background transparency BL Present if background flags = 1 */ + buf->getBitLong(); + } } /* Common Entity Handle Data */ - ret = DRW_Entity::parseDwgEntHandle( version, buf ); - if ( !ret ) - return ret; + ret = DRW_Entity::parseDwgEntHandle(version, buf); + if (!ret) + return ret; styleH = buf->getHandle(); /* H 7 STYLE (hard pointer) */ - - QgsDebugMsgLevel( QStringLiteral( "text style Handle:%1.%2 0x%3" ) - .arg( styleH.code ).arg( styleH.size ).arg( styleH.ref, 0, 16 ), 4 - ); + DRW_DBG("text style Handle: "); DRW_DBG(styleH.code); DRW_DBG("."); + DRW_DBG(styleH.size); DRW_DBG("."); DRW_DBG(styleH.ref); DRW_DBG("\n"); /* CRC X --- */ return buf->isGood(); } -void DRW_MText::updateAngle() -{ +void DRW_MText::updateAngle() { if ( haveXAxis ) { angle = std::atan2( secPoint.y, secPoint.x ) * 180 / M_PI; } } -void DRW_Polyline::parseCode( int code, dxfReader *reader ) -{ - switch ( code ) - { +void DRW_Polyline::parseCode(int code, dxfReader *reader){ + switch (code) { case 70: - flags = reader->getInt32(); - break; + flags = reader->getInt32(); + break; case 40: - defstawidth = reader->getDouble(); - break; + defstawidth = reader->getDouble(); + break; case 41: - defendwidth = reader->getDouble(); - break; + defendwidth = reader->getDouble(); + break; case 71: - vertexcount = reader->getInt32(); - break; + vertexcount = reader->getInt32(); + break; case 72: - facecount = reader->getInt32(); - break; + facecount = reader->getInt32(); + break; case 73: - smoothM = reader->getInt32(); - break; + smoothM = reader->getInt32(); + break; case 74: - smoothN = reader->getInt32(); - break; + smoothN = reader->getInt32(); + break; case 75: - curvetype = reader->getInt32(); - break; + curvetype = reader->getInt32(); + break; default: - DRW_Point::parseCode( code, reader ); - break; - } + DRW_Point::parseCode(code, reader); + break; + } } //0x0F polyline 2D bit 4(8) & 5(16) NOT set //0x10 polyline 3D bit 4(8) set //0x1D PFACE bit 5(16) set -bool DRW_Polyline::parseDwg( DRW::Version version, dwgBuffer *buf, duint32 bs ) -{ - bool ret = DRW_Entity::parseDwg( version, buf, nullptr, bs ); - if ( !ret ) - return ret; +bool DRW_Polyline::parseDwg(DRW::Version version, dwgBuffer *buf, duint32 bs){ + bool ret = DRW_Entity::parseDwg(version, buf, NULL, bs); + if (!ret) + return ret; + DRW_DBG("\n***************************** parsing polyline *********************************************\n"); - QgsDebugMsgLevel( QStringLiteral( "***************************** parsing polyline *********************************************" ), 4 ); - - dint32 ooCount = 0; - if ( oType == 0x0F ) //pline 2D - { - flags = buf->getBitShort(); - QgsDebugMsgLevel( QStringLiteral( "flags value:0x%1" ).arg( flags, 0, 16 ), 4 ); - curvetype = buf->getBitShort(); - defstawidth = buf->getBitDouble(); - defendwidth = buf->getBitDouble(); - thickness = buf->getThickness( version > DRW::AC1014 ); - basePoint = DRW_Coord( 0, 0, buf->getBitDouble() ); + dint32 ooCount = 0; + if (oType == 0x0F) { //pline 2D + flags = buf->getBitShort(); + DRW_DBG("flags value: "); DRW_DBG(flags); + curvetype = buf->getBitShort(); + defstawidth = buf->getBitDouble(); + defendwidth = buf->getBitDouble(); + thickness = buf->getThickness(version > DRW::AC1014); + basePoint = DRW_Coord(0,0,buf->getBitDouble()); extPoint = buf->getExtrusion( version > DRW::AC1014, haveExtrusion ); - } - else if ( oType == 0x10 ) //pline 3D - { - duint8 tmpFlag = buf->getRawChar8(); - QgsDebugMsgLevel( QStringLiteral( "flags 1 value:0x%1" ).arg( tmpFlag, 0, 16 ), 4 ); - if ( tmpFlag & 1 ) - curvetype = 5; - else if ( tmpFlag & 2 ) - curvetype = 6; - if ( tmpFlag & 3 ) - { - curvetype = 8; - flags |= 4; + } else if (oType == 0x10) { //pline 3D + duint8 tmpFlag = buf->getRawChar8(); + DRW_DBG("flags 1 value: "); DRW_DBG(tmpFlag); + if (tmpFlag & 1) + curvetype = 5; + else if (tmpFlag & 2) + curvetype = 6; + if (tmpFlag & 3) { + curvetype = 8; + flags |= 4; + } + tmpFlag = buf->getRawChar8(); + if (tmpFlag & 1) + flags |= 1; + flags |= 8; //indicate 3DPOL + DRW_DBG("flags 2 value: "); DRW_DBG(tmpFlag); + } else if (oType == 0x1D) { //PFACE + flags = 64; + vertexcount = buf->getBitShort(); + DRW_DBG("vertex count: "); DRW_DBG(vertexcount); + facecount = buf->getBitShort(); + DRW_DBG("face count: "); DRW_DBG(facecount); + DRW_DBG("flags value: "); DRW_DBG(flags); } - tmpFlag = buf->getRawChar8(); - if ( tmpFlag & 1 ) - flags |= 1; - flags |= 8; //indicate 3DPOL - QgsDebugMsgLevel( QStringLiteral( "flags 2 value:0x%1" ).arg( tmpFlag, 0, 16 ), 4 ); - } - else if ( oType == 0x1D ) //PFACE - { - flags = 64; - vertexcount = buf->getBitShort(); - facecount = buf->getBitShort(); - QgsDebugMsgLevel( QStringLiteral( "vertex count:%1 face count:%2 flags value:0x%3" ) - .arg( vertexcount ).arg( facecount ).arg( flags, 0, 16 ), 4 - ); - } - if ( version > DRW::AC1015 ) //2004+ - { - ooCount = buf->getBitLong(); - } - - ret = DRW_Entity::parseDwgEntHandle( version, buf ); - if ( !ret ) - return ret; - - if ( version < DRW::AC1018 ) //2000- - { - dwgHandle objectH = buf->getOffsetHandle( handle ); - firstEH = objectH.ref; - QgsDebugMsgLevel( QStringLiteral( "first vertex handle:%1.%2 0x%3" ) - .arg( objectH.code ).arg( objectH.size ).arg( objectH.ref, 0, 16 ), 4 - ); - - objectH = buf->getOffsetHandle( handle ); - lastEH = objectH.ref; - - QgsDebugMsgLevel( QStringLiteral( "last vertex:%1, remaining bytes %2" ) - .arg( QStringLiteral( "%1.%2 0x%3" ).arg( objectH.code ).arg( objectH.size ).arg( objectH.ref, 0, 16 ) ) - .arg( buf->numRemainingBytes() ), 4 - ); - } - else - { - for ( dint32 i = 0; i < ooCount; ++i ) - { - dwgHandle objectH = buf->getOffsetHandle( handle ); - handleList.push_back( objectH.ref ); - - QgsDebugMsgLevel( QStringLiteral( "vertex handle:%1, remaining bytes %2" ) - .arg( QStringLiteral( "%1.%2 0x%3" ).arg( objectH.code ).arg( objectH.size ).arg( objectH.ref, 0, 16 ) ) - .arg( buf->numRemainingBytes() ), 4 - ); + if (version > DRW::AC1015){ //2004+ + ooCount = buf->getBitLong(); } - } - seqEndH = buf->getOffsetHandle( handle ); - QgsDebugMsgLevel( QStringLiteral( "SEQEND handle:%1 remaining bytes %2" ) - .arg( QStringLiteral( "%1.%2 0x%3" ).arg( seqEndH.code ).arg( seqEndH.size ).arg( seqEndH.ref, 0, 16 ) ) - .arg( buf->numRemainingBytes() ), 4 - ); + ret = DRW_Entity::parseDwgEntHandle(version, buf); + if (!ret) + return ret; - // RS crc; //RS */ + if (version < DRW::AC1018){ //2000- + dwgHandle objectH = buf->getOffsetHandle(handle); + firstEH = objectH.ref; + DRW_DBG(" first Vertex Handle: "); DRW_DBGHL(objectH.code, objectH.size, objectH.ref); DRW_DBG("\n"); + objectH = buf->getOffsetHandle(handle); + lastEH = objectH.ref; + DRW_DBG(" last Vertex Handle: "); DRW_DBGHL(objectH.code, objectH.size, objectH.ref); DRW_DBG("\n"); + DRW_DBG("Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n"); + } else { + for (dint32 i = 0; i < ooCount; ++i){ + dwgHandle objectH = buf->getOffsetHandle(handle); + handlesList.push_back (objectH.ref); + DRW_DBG(" Vertex Handle: "); DRW_DBGHL(objectH.code, objectH.size, objectH.ref); DRW_DBG("\n"); + DRW_DBG("Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n"); + } + } + seqEndH = buf->getOffsetHandle(handle); + DRW_DBG(" SEQEND Handle: "); DRW_DBGHL(seqEndH.code, seqEndH.size, seqEndH.ref); DRW_DBG("\n"); + DRW_DBG("Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n"); - return buf->isGood(); +// RS crc; //RS */ + return buf->isGood(); } -void DRW_Vertex::parseCode( int code, dxfReader *reader ) -{ - switch ( code ) - { +void DRW_Vertex::parseCode(int code, dxfReader *reader){ + switch (code) { case 70: - flags = reader->getInt32(); - break; + flags = reader->getInt32(); + break; case 40: - stawidth = reader->getDouble(); - break; + stawidth = reader->getDouble(); + break; case 41: - endwidth = reader->getDouble(); - break; + endwidth = reader->getDouble(); + break; case 42: - bulge = reader->getDouble(); - break; + bulge = reader->getDouble(); + break; case 50: - tgdir = reader->getDouble(); - break; + tgdir = reader->getDouble(); + break; case 71: - vindex1 = reader->getInt32(); - break; + vindex1 = reader->getInt32(); + break; case 72: - vindex2 = reader->getInt32(); - break; + vindex2 = reader->getInt32(); + break; case 73: - vindex3 = reader->getInt32(); - break; + vindex3 = reader->getInt32(); + break; case 74: - vindex4 = reader->getInt32(); - break; + vindex4 = reader->getInt32(); + break; case 91: - identifier = reader->getInt32(); - break; + identifier = reader->getInt32(); + break; default: - DRW_Point::parseCode( code, reader ); - break; - } + DRW_Point::parseCode(code, reader); + break; + } } //0x0A vertex 2D @@ -2059,313 +1679,236 @@ void DRW_Vertex::parseCode( int code, dxfReader *reader ) //0x0C MESH //0x0D PFACE //0x0E PFACE FACE -bool DRW_Vertex::parseDwg( DRW::Version version, dwgBuffer *buf, duint32 bs, double el ) -{ - bool ret = DRW_Entity::parseDwg( version, buf, nullptr, bs ); - if ( !ret ) - return ret; +bool DRW_Vertex::parseDwg(DRW::Version version, dwgBuffer *buf, duint32 bs, double el){ + bool ret = DRW_Entity::parseDwg(version, buf, NULL, bs); + if (!ret) + return ret; + DRW_DBG("\n***************************** parsing pline Vertex *********************************************\n"); - QgsDebugMsgLevel( QStringLiteral( "***************************** parsing pline Vertex *********************************************" ), 4 ); - - if ( oType == 0x0A ) //pline 2D, needed example - { - flags = buf->getRawChar8(); //RLZ: EC unknown type - basePoint = buf->get3BitDouble(); - basePoint.z = el; - - QgsDebugMsgLevel( QStringLiteral( " flags value:0x%1 basePoint:%2" ) - .arg( flags, 0, 16 ) - .arg( QStringLiteral( "%1,%2,%3" ).arg( basePoint.x ).arg( basePoint.y ).arg( basePoint.z ) ), 4 - ); - - stawidth = buf->getBitDouble(); - if ( stawidth < 0 ) - endwidth = stawidth = std::fabs( stawidth ); - else - endwidth = buf->getBitDouble(); - bulge = buf->getBitDouble(); - if ( version > DRW::AC1021 ) //2010+ - { - dint32 id = buf->getBitLong(); - QgsDebugMsgLevel( QStringLiteral( " Vertex ID:%1" ).arg( id ), 4 ); - Q_UNUSED( id ); + if (oType == 0x0A) { //pline 2D, needed example + flags = buf->getRawChar8(); //RLZ: EC unknown type + DRW_DBG("flags value: "); DRW_DBG(flags); + basePoint = buf->get3BitDouble(); + basePoint.z = el; + DRW_DBG("basePoint: "); DRW_DBGPT(basePoint.x, basePoint.y, basePoint.z); + stawidth = buf->getBitDouble(); + if (stawidth < 0) + endwidth = stawidth = std::fabs(stawidth); + else + endwidth = buf->getBitDouble(); + bulge = buf->getBitDouble(); + if (version > DRW::AC1021) { //2010+ + DRW_DBG("Vertex ID: "); DRW_DBG(buf->getBitLong()); + } + tgdir = buf->getBitDouble(); + } else if (oType == 0x0B || oType == 0x0C || oType == 0x0D) { //PFACE + flags = buf->getRawChar8(); //RLZ: EC unknown type + DRW_DBG("flags value: "); DRW_DBG(flags); + basePoint = buf->get3BitDouble(); + DRW_DBG("basePoint: "); DRW_DBGPT(basePoint.x, basePoint.y, basePoint.z); + } else if (oType == 0x0E) { //PFACE FACE + vindex1 = buf->getBitShort(); + vindex2 = buf->getBitShort(); + vindex3 = buf->getBitShort(); + vindex4 = buf->getBitShort(); } - tgdir = buf->getBitDouble(); - } - else if ( oType == 0x0B || oType == 0x0C || oType == 0x0D ) //PFACE - { - flags = buf->getRawChar8(); //RLZ: EC unknown type - basePoint = buf->get3BitDouble(); - QgsDebugMsgLevel( QStringLiteral( " flags value:0x%1 basePoint:%2" ) - .arg( flags, 0, 16 ) - .arg( QStringLiteral( "%1,%2,%3" ).arg( basePoint.x ).arg( basePoint.y ).arg( basePoint.z ) ), 4 - ); - } - else if ( oType == 0x0E ) //PFACE FACE - { - vindex1 = buf->getBitShort(); - vindex2 = buf->getBitShort(); - vindex3 = buf->getBitShort(); - vindex4 = buf->getBitShort(); - } - - ret = DRW_Entity::parseDwgEntHandle( version, buf ); - if ( !ret ) - return ret; - - // RS crc; //RS */ - - return buf->isGood(); + ret = DRW_Entity::parseDwgEntHandle(version, buf); + if (!ret) + return ret; +// RS crc; //RS */ + return buf->isGood(); } -void DRW_Hatch::parseCode( int code, dxfReader *reader ) -{ - switch ( code ) - { +void DRW_Hatch::parseCode(int code, dxfReader *reader){ + switch (code) { case 2: - name = reader->getUtf8String(); - break; - case 70: - solid = reader->getInt32(); - break; - case 71: - associative = reader->getInt32(); - break; - case 72: /*edge type*/ - if ( ispol ) //if is polyline is a as_bulge flag - { + name = reader->getUtf8String(); + break; + case 70: + solid = reader->getInt32(); + break; + case 71: + associative = reader->getInt32(); + break; + case 72: /*edge type*/ + if (ispol){ //if is polyline is a as_bulge flag + break; + } else if (reader->getInt32() == 1){ //line + addLine(); + } else if (reader->getInt32() == 2){ //arc + addArc(); + } else if (reader->getInt32() == 3){ //elliptic arc + addEllipse(); + } else if (reader->getInt32() == 4){ //spline + addSpline(); + } break; - } - else if ( reader->getInt32() == 1 ) //line - { - addLine(); - } - else if ( reader->getInt32() == 2 ) //arc - { - addArc(); - } - else if ( reader->getInt32() == 3 ) //elliptic arc - { - addEllipse(); - } - else if ( reader->getInt32() == 4 ) //spline - { - addSpline(); - } - break; case 10: - if ( pt ) pt->basePoint.x = reader->getDouble(); - else if ( pline ) - { - plvert = pline->addVertex(); - plvert->x = reader->getDouble(); - } - break; + if (pt) pt->basePoint.x = reader->getDouble(); + else if (pline) { + plvert = pline->addVertex(); + plvert->x = reader->getDouble(); + } + break; case 20: - if ( pt ) pt->basePoint.y = reader->getDouble(); - else if ( plvert ) plvert ->y = reader->getDouble(); - break; + if (pt) pt->basePoint.y = reader->getDouble(); + else if (plvert) plvert ->y = reader->getDouble(); + break; case 11: - if ( line ) line->secPoint.x = reader->getDouble(); - else if ( ellipse ) ellipse->secPoint.x = reader->getDouble(); - break; + if (line) line->secPoint.x = reader->getDouble(); + else if (ellipse) ellipse->secPoint.x = reader->getDouble(); + break; case 21: - if ( line ) line->secPoint.y = reader->getDouble(); - else if ( ellipse ) ellipse->secPoint.y = reader->getDouble(); - break; + if (line) line->secPoint.y = reader->getDouble(); + else if (ellipse) ellipse->secPoint.y = reader->getDouble(); + break; case 40: - if ( arc ) arc->mRadius = reader->getDouble(); - else if ( ellipse ) ellipse->ratio = reader->getDouble(); - break; + if (arc) arc->radius = reader->getDouble(); + else if (ellipse) ellipse->ratio = reader->getDouble(); + break; case 41: - scale = reader->getDouble(); - break; + scale = reader->getDouble(); + break; case 42: - if ( plvert ) plvert ->bulge = reader->getDouble(); - break; + if (plvert) plvert ->bulge = reader->getDouble(); + break; case 50: - if ( arc ) arc->staangle = reader->getDouble() / ARAD; - else if ( ellipse ) ellipse->staparam = reader->getDouble() / ARAD; - break; + if (arc) arc->staangle = reader->getDouble()/ARAD; + else if (ellipse) ellipse->staparam = reader->getDouble()/ARAD; + break; case 51: - if ( arc ) arc->endangle = reader->getDouble() / ARAD; - else if ( ellipse ) ellipse->endparam = reader->getDouble() / ARAD; - break; + if (arc) arc->endangle = reader->getDouble()/ARAD; + else if (ellipse) ellipse->endparam = reader->getDouble()/ARAD; + break; case 52: angle = reader->getDouble() / ARAD; - break; + break; case 73: - if ( arc ) arc->isccw = reader->getInt32(); - else if ( pline ) pline->flags = reader->getInt32(); - break; + if (arc) arc->isccw = reader->getInt32(); + else if (pline) pline->flags = reader->getInt32(); + break; case 75: - hstyle = reader->getInt32(); - break; + hstyle = reader->getInt32(); + break; case 76: - hpattern = reader->getInt32(); - break; + hpattern = reader->getInt32(); + break; case 77: - doubleflag = reader->getInt32(); - break; + doubleflag = reader->getInt32(); + break; case 78: - deflines = reader->getInt32(); - break; + deflines = reader->getInt32(); + break; case 91: - loopsnum = reader->getInt32(); + loopsnum = reader->getInt32(); RESERVE( looplist, loopsnum ); - break; + break; case 92: - loop = new DRW_HatchLoop( reader->getInt32() ); - looplist.push_back( loop ); - if ( reader->getInt32() & 2 ) - { - ispol = true; - clearEntities(); - pline = new DRW_LWPolyline; - loop->objlist.push_back( pline ); - } - else ispol = false; - break; + loop = std::make_shared(reader->getInt32()); + looplist.push_back(loop); + if (reader->getInt32() & 2) { + ispol = true; + clearEntities(); + pline = std::make_shared(); + loop->objlist.push_back(pline); + } else ispol = false; + break; case 93: - if ( pline ) - pline->vertexnum = reader->getInt32(); - else - loop->numedges = reader->getInt32();//aqui reserve - break; + if (pline) pline->vertexnum = reader->getInt32(); + else loop->numedges = reader->getInt32();//aqui reserve + break; case 98: //seed points ?? - clearEntities(); - break; + clearEntities(); + break; default: - DRW_Point::parseCode( code, reader ); - break; - } + DRW_Point::parseCode(code, reader); + break; + } } -bool DRW_Hatch::parseDwg( DRW::Version version, dwgBuffer *buf, duint32 bs ) -{ - dwgBuffer sBuff = *buf; - dwgBuffer *sBuf = buf; - duint32 totalBoundItems = 0; - bool hasPixelSize = false; +bool DRW_Hatch::parseDwg(DRW::Version version, dwgBuffer *buf, duint32 bs){ + dwgBuffer sBuff = *buf; + dwgBuffer *sBuf = buf; + duint32 totalBoundItems = 0; + bool hasPixelSize = false; - if ( version > DRW::AC1018 ) //2007+ - { - sBuf = &sBuff; //separate buffer for strings - } - bool ret = DRW_Entity::parseDwg( version, buf, sBuf, bs ); - if ( !ret ) - return ret; - - QgsDebugMsgLevel( QStringLiteral( "***************************** parsing hatch *********************************************" ), 4 ); - - //Gradient data, RLZ: is OK or if grad > 0 continue read ? - if ( version > DRW::AC1015 ) //2004+ - { - dint32 isGradient = buf->getBitLong(); - dint32 res = buf->getBitLong(); - double gradAngle = buf->getBitDouble(); - double gradShift = buf->getBitDouble(); - dint32 singleCol = buf->getBitLong(); - double gradTint = buf->getBitDouble(); - dint32 numCol = buf->getBitLong(); - - QgsDebugMsgLevel( QStringLiteral( "is Gradient:%1 reserved:%2 Gradient angle:%3 Gradient shift:%4 single color Grad:%5 Gradient tint:%6, num colors:%7" ) - .arg( isGradient ) - .arg( res ) - .arg( gradAngle ) - .arg( gradShift ) - .arg( singleCol ) - .arg( gradTint ) - .arg( numCol ), 4 - ); - Q_UNUSED( isGradient ); - Q_UNUSED( res ); - Q_UNUSED( gradAngle ); - Q_UNUSED( gradShift ); - Q_UNUSED( singleCol ); - Q_UNUSED( gradTint ); - - for ( dint32 i = 0 ; i < numCol; ++i ) - { - double unkDouble = buf->getBitDouble(); - duint16 unkShort = buf->getBitShort(); - dint32 rgbCol = buf->getBitLong(); - duint8 ignCol = buf->getRawChar8(); - - QgsDebugMsgLevel( QStringLiteral( "unkDouble:%1 unkShort:%2 rgbcolor:%3 ignoredcolor:%4" ) - .arg( unkDouble ).arg( unkShort ) - .arg( rgbCol ) - .arg( ignCol ), 4 - ); - Q_UNUSED( unkDouble ); - Q_UNUSED( unkShort ); - Q_UNUSED( rgbCol ); - Q_UNUSED( ignCol ); + if (version > DRW::AC1018) {//2007+ + sBuf = &sBuff; //separate buffer for strings } - UTF8STRING gradName = sBuf->getVariableText( version, false ); - QgsDebugMsgLevel( QStringLiteral( "gradient name:%1" ).arg( gradName.c_str() ), 4 ); - Q_UNUSED( gradName ); - } - basePoint.z = buf->getBitDouble(); - extPoint = buf->get3BitDouble(); - name = sBuf->getVariableText( version, false ); - solid = buf->getBit(); - associative = buf->getBit(); - loopsnum = buf->getBitLong(); + bool ret = DRW_Entity::parseDwg(version, buf, sBuf, bs); + if (!ret) + return ret; + DRW_DBG("\n***************************** parsing hatch *********************************************\n"); - QgsDebugMsgLevel( QStringLiteral( "base point:%1, extrusion:%2, pattern:%3, solid:%4 associative:%5 loops:%6" ) - .arg( QStringLiteral( "%1,%2,%3" ).arg( basePoint.x ).arg( basePoint.y ).arg( basePoint.z ), - QStringLiteral( "%1,%2,%3" ).arg( extPoint.x ).arg( extPoint.y ).arg( extPoint.z ), - name.c_str() ) - .arg( solid ) - .arg( associative ) - .arg( loopsnum ), 4 - ); - - //read loops - for ( std::vector::size_type i = 0 ; i < loopsnum && buf->isGood(); ++i ) - { - loop = new DRW_HatchLoop( buf->getBitLong() ); - QgsDebugMsgLevel( QStringLiteral( " type: %1" ).arg( loop->type ), 4 ); - hasPixelSize |= ( loop->type & 4 ) != 0; - if ( !( loop->type & 2 ) ) //Not polyline - { - dint32 numPathSeg = buf->getBitLong(); - - QgsDebugMsgLevel( QStringLiteral( " segs: %1" ).arg( numPathSeg ), 4 ); + //Gradient data, RLZ: is ok or if grad > 0 continue read ? + if (version > DRW::AC1015) { //2004+ + dint32 isGradient = buf->getBitLong(); + DRW_DBG("is Gradient: "); DRW_DBG(isGradient); + dint32 res = buf->getBitLong(); + DRW_DBG(" reserved: "); DRW_DBG(res); + double gradAngle = buf->getBitDouble(); + DRW_DBG(" Gradient angle: "); DRW_DBG(gradAngle); + double gradShift = buf->getBitDouble(); + DRW_DBG(" Gradient shift: "); DRW_DBG(gradShift); + dint32 singleCol = buf->getBitLong(); + DRW_DBG("\nsingle color Grad: "); DRW_DBG(singleCol); + double gradTint = buf->getBitDouble(); + DRW_DBG(" Gradient tint: "); DRW_DBG(gradTint); + dint32 numCol = buf->getBitLong(); + DRW_DBG(" num colors: "); DRW_DBG(numCol); + for (dint32 i = 0 ; i < numCol; ++i){ + double unkDouble = buf->getBitDouble(); + DRW_DBG("\nunkDouble: "); DRW_DBG(unkDouble); + duint16 unkShort = buf->getBitShort(); + DRW_DBG(" unkShort: "); DRW_DBG(unkShort); + dint32 rgbCol = buf->getBitLong(); + DRW_DBG(" rgb color: "); DRW_DBG(rgbCol); + duint8 ignCol = buf->getRawChar8(); + DRW_DBG(" ignored color: "); DRW_DBG(ignCol); + } + UTF8STRING gradName = sBuf->getVariableText(version, false); + DRW_DBG("\ngradient name: "); DRW_DBG(gradName.c_str()); DRW_DBG("\n"); + } + basePoint.z = buf->getBitDouble(); + extPoint = buf->get3BitDouble(); + DRW_DBG("base point: "); DRW_DBGPT(basePoint.x, basePoint.y, basePoint.z); + DRW_DBG("\nextrusion: "); DRW_DBGPT(extPoint.x, extPoint.y, extPoint.z); + name = sBuf->getVariableText(version, false); + DRW_DBG("\nhatch pattern name: "); DRW_DBG(name.c_str()); DRW_DBG("\n"); + solid = buf->getBit(); + associative = buf->getBit(); + loopsnum = buf->getBitLong(); + //read loops + for (int i = 0 ; i < loopsnum; ++i){ + loop = std::make_shared(buf->getBitLong()); + hasPixelSize |= loop->type & 4; + if (!(loop->type & 2)){ //Not polyline + dint32 numPathSeg = buf->getBitLong(); for ( dint32 j = 0; j < numPathSeg && buf->isGood(); ++j ) { - duint8 typePath = buf->getRawChar8(); - QgsDebugMsgLevel( QStringLiteral( " typepath: %1" ).arg( typePath ), 4 ); - if ( typePath == 1 ) //line - { - addLine(); - line->basePoint = buf->get2RawDouble(); - line->secPoint = buf->get2RawDouble(); - } - else if ( typePath == 2 ) //circle arc - { - addArc(); - arc->basePoint = buf->get2RawDouble(); - arc->mRadius = buf->getBitDouble(); - arc->staangle = buf->getBitDouble(); - arc->endangle = buf->getBitDouble(); - arc->isccw = buf->getBit(); - } - else if ( typePath == 3 ) //ellipse arc - { - addEllipse(); - ellipse->basePoint = buf->get2RawDouble(); - ellipse->secPoint = buf->get2RawDouble(); - ellipse->ratio = buf->getBitDouble(); - ellipse->staparam = buf->getBitDouble(); - ellipse->endparam = buf->getBitDouble(); - ellipse->isccw = buf->getBit(); - } - else if ( typePath == 4 ) //spline - { + duint8 typePath = buf->getRawChar8(); + if (typePath == 1){ //line + addLine(); + line->basePoint = buf->get2RawDouble(); + line->secPoint = buf->get2RawDouble(); + } else if (typePath == 2){ //circle arc + addArc(); + arc->basePoint = buf->get2RawDouble(); + arc->radius = buf->getBitDouble(); + arc->staangle = buf->getBitDouble(); + arc->endangle = buf->getBitDouble(); + arc->isccw = buf->getBit(); + } else if (typePath == 3){ //ellipse arc + addEllipse(); + ellipse->basePoint = buf->get2RawDouble(); + ellipse->secPoint = buf->get2RawDouble(); + ellipse->ratio = buf->getBitDouble(); + ellipse->staparam = buf->getBitDouble(); + ellipse->endparam = buf->getBitDouble(); + ellipse->isccw = buf->getBit(); + } else if (typePath == 4){ //spline addSpline(); spline->degree = buf->getBitLong(); bool isRational = buf->getBit(); @@ -2373,112 +1916,74 @@ bool DRW_Hatch::parseDwg( DRW::Version version, dwgBuffer *buf, duint32 bs ) spline->flags |= ( buf->getBit() << 1 ); //periodic spline->nknots = buf->getBitLong(); spline->ncontrol = buf->getBitLong(); - - QgsDebugMsgLevel( QStringLiteral( " degree:%1 flags:0x%2 nknots:%3 ncontrol:%4" ) - .arg( spline->degree ).arg( spline->flags, 0, 16 ) - .arg( spline->nknots ).arg( spline->ncontrol ), 4 - ); - RESERVE( spline->knotslist, spline->nknots ); dint32 j; for ( j = 0; j < spline->nknots && buf->isGood(); ++j ) { spline->knotslist.push_back( buf->getBitDouble() ); - QgsDebugMsgLevel( QStringLiteral( " knot %1: %2" ).arg( j ) - .arg( spline->knotslist.back() ), 4 - ); } if ( !buf->isGood() ) { - QgsDebugMsg( QStringLiteral( "NOT GOOD at %1! degree:%2 flags:0x%3 nknots:%4 ncontrol:%5" ) - .arg( j ) - .arg( spline->degree ).arg( spline->flags, 0, 16 ) - .arg( spline->nknots ).arg( spline->ncontrol ) - ); + DRW_DBG( "NOT GOOD at ");DRW_DBG(j);DRW_DBG( "! degree:");DRW_DBG(spline->degree); + DRW_DBG(" flags:");DRW_DBGH(spline->flags);DRW_DBG(" nknots:");DRW_DBG(spline->nknots); + DRW_DBG(" ncontrol:");DRW_DBG( spline->ncontrol ); DRW_DBG("\n" ); } RESERVE( spline->controllist, spline->ncontrol ); for ( j = 0; j < spline->ncontrol && buf->isGood(); ++j ) { - DRW_Coord *crd = new DRW_Coord( buf->get2RawDouble() ); + std::shared_ptr crd = std::make_shared(buf->get2RawDouble() ); spline->controllist.push_back( crd ); if ( isRational ) crd->z = buf->getBitDouble(); //RLZ: investigate how store weight spline->controllist.push_back( crd ); - QgsDebugMsgLevel( QStringLiteral( " control %1: %2" ) - .arg( j ) - .arg( QStringLiteral( "%1,%2,%3" ).arg( crd->x ).arg( crd->y ).arg( crd->z ) ), 4 - ); } if ( version > DRW::AC1021 ) //2010+ { spline->nfit = buf->getBitLong(); - QgsDebugMsgLevel( QStringLiteral( " nfit:%1" ).arg( spline->nfit ), 4 ); + DRW_DBG(" nfit:");DRW_DBG(spline->nfit);DRW_DBG("\n"); RESERVE( spline->fitlist, spline->nfit ); for ( dint32 j = 0; j < spline->nfit && buf->isGood(); ++j ) { - DRW_Coord *crd = new DRW_Coord( buf->get2RawDouble() ); + std::shared_ptr crd = std::make_shared( buf->get2RawDouble() ); spline->fitlist.push_back( crd ); - - QgsDebugMsgLevel( QStringLiteral( " fit %1: %2" ) - .arg( j ) - .arg( QStringLiteral( "%1,%2,%3" ).arg( crd->x ).arg( crd->y ).arg( crd->z ) ), 4 - ); } spline->tgStart = buf->get2RawDouble(); spline->tgEnd = buf->get2RawDouble(); } } } - } - else //end not pline, start polyline - { - pline = new DRW_LWPolyline; - bool hasBulges = buf->getBit(); - pline->flags = buf->getBit();//closed bit - dint32 numVert = buf->getBitLong(); - - QgsDebugMsgLevel( QStringLiteral( " hasBulge:%1 flags:%2 verts:%3" ) - .arg( hasBulges ).arg( pline->flags, 0, 16 ).arg( numVert ), 4 - ); - - for ( dint32 j = 0; j < numVert && buf->isGood(); ++j ) - { - DRW_Vertex2D v; - v.x = buf->getRawDouble(); - v.y = buf->getRawDouble(); - if ( hasBulges ) - v.bulge = buf->getBitDouble(); - pline->addVertex( v ); - } - loop->objlist.push_back( pline ); + } else { //end not pline, start polyline + pline = std::make_shared(); + bool hasBulges = buf->getBit(); + pline->flags = buf->getBit();//closed bit + dint32 numVert = buf->getBitLong(); + for (dint32 j = 0; jgetRawDouble(); + v.y = buf->getRawDouble(); + if (hasBulges) + v.bulge = buf->getBitDouble(); + pline->addVertex(v); + } + loop->objlist.push_back(pline); }//end polyline loop->update(); looplist.push_back( loop ); totalBoundItems += buf->getBitLong(); + DRW_DBG(" totalBoundItems: "); DRW_DBG(totalBoundItems); + } //end read loops - QgsDebugMsgLevel( QStringLiteral( " totalBoundItems:%1" ).arg( totalBoundItems ), 4 ); - } //end read loops - - hstyle = buf->getBitShort(); - hpattern = buf->getBitShort(); - - QgsDebugMsgLevel( QStringLiteral( "hatch style:%1 pattern type:%2" ).arg( hstyle ).arg( hpattern ), 4 ); - if ( !solid ) - { - angle = buf->getBitDouble(); - scale = buf->getBitDouble(); - doubleflag = buf->getBit(); - deflines = buf->getBitShort(); - - QgsDebugMsgLevel( QStringLiteral( "angle:%1 scale:%2 double:%3 deflines:%4" ) - .arg( angle ).arg( scale ) - .arg( doubleflag ).arg( deflines ), 4 - ); - Q_UNUSED( angle ); - Q_UNUSED( scale ); + hstyle = buf->getBitShort(); + hpattern = buf->getBitShort(); + DRW_DBG("\nhatch style: "); DRW_DBG(hstyle); DRW_DBG(" pattern type"); DRW_DBG(hpattern); + if (!solid){ + angle = buf->getBitDouble(); + scale = buf->getBitDouble(); + doubleflag = buf->getBit(); + deflines = buf->getBitShort(); for ( dint32 i = 0 ; i < deflines && buf->isGood(); ++i ) { DRW_Coord ptL, offL; @@ -2488,1415 +1993,1047 @@ bool DRW_Hatch::parseDwg( DRW::Version version, dwgBuffer *buf, duint32 bs ) offL.x = buf->getBitDouble(); offL.y = buf->getBitDouble(); duint16 numDashL = buf->getBitShort(); - - QgsDebugMsgLevel( QStringLiteral( "def line: a=%1 pt=%2 off=%3" ) - .arg( angleL ) - .arg( QStringLiteral( "%1,%2" ).arg( ptL.x ).arg( ptL.y ), - QStringLiteral( "%1,%2" ).arg( offL.x ).arg( offL.y ) ), 4 - ); - Q_UNUSED( angleL ); - Q_UNUSED( ptL ); - Q_UNUSED( offL ); - - for ( duint16 j = 0 ; j < numDashL; ++j ) - { - double lengthL = buf->getBitDouble(); - QgsDebugMsgLevel( QStringLiteral( " %1: %2" ).arg( j ).arg( lengthL ), 4 ); - Q_UNUSED( lengthL ); + DRW_DBG("\ndef line: "); DRW_DBG(angleL); DRW_DBG(","); DRW_DBG(ptL.x); DRW_DBG(","); DRW_DBG(ptL.y); + DRW_DBG(","); DRW_DBG(offL.x); DRW_DBG(","); DRW_DBG(offL.y); DRW_DBG(","); DRW_DBG(angleL); + for (duint16 i = 0 ; i < numDashL; ++i){ + double lengthL = buf->getBitDouble(); + DRW_DBG(","); DRW_DBG(lengthL); } }//end deflines } //end not solid - if ( hasPixelSize ) - { - ddouble64 pixsize = buf->getBitDouble(); - QgsDebugMsgLevel( QStringLiteral( "pixel size:%1" ).arg( pixsize ), 4 ); - Q_UNUSED( pixsize ); - } - - dint32 numSeedPoints = buf->getBitLong(); - QgsDebugMsgLevel( QStringLiteral( "num Seed Points %1" ).arg( numSeedPoints ), 4 ); - //read Seed Points - DRW_Coord seedPt; + if (hasPixelSize){ + ddouble64 pixsize = buf->getBitDouble(); + DRW_DBG("\npixel size: "); DRW_DBG(pixsize); + } + dint32 numSeedPoints = buf->getBitLong(); + DRW_DBG("\nnum Seed Points "); DRW_DBG(numSeedPoints); + //read Seed Points + DRW_Coord seedPt; for ( dint32 i = 0 ; i < numSeedPoints && buf->isGood(); ++i ) { - seedPt.x = buf->getRawDouble(); - seedPt.y = buf->getRawDouble(); - QgsDebugMsgLevel( QStringLiteral( " %1: %2,%3" ).arg( i ).arg( seedPt.x ).arg( seedPt.y ), 4 ); + seedPt.x = buf->getRawDouble(); + seedPt.y = buf->getRawDouble(); + DRW_DBG("\n "); DRW_DBG(seedPt.x); DRW_DBG(","); DRW_DBG(seedPt.y); } - ret = DRW_Entity::parseDwgEntHandle( version, buf ); - if ( !ret ) - return ret; - - QgsDebugMsgLevel( QStringLiteral( "Remaining bytes:%1" ).arg( buf->numRemainingBytes() ), 4 ); + DRW_DBG("\n"); + ret = DRW_Entity::parseDwgEntHandle(version, buf); + if (!ret) + return ret; + DRW_DBG("Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n"); for ( duint32 i = 0 ; i < totalBoundItems && buf->isGood(); ++i ) { - dwgHandle biH = buf->getHandle(); - QgsDebugMsgLevel( QStringLiteral( "Boundary Items Handle:%1.%2 0x%3" ).arg( biH.code ).arg( biH.size ).arg( biH.ref, 0, 16 ), 4 ); + dwgHandle biH = buf->getHandle(); + DRW_DBG("Boundary Items Handle: "); DRW_DBGHL(biH.code, biH.size, biH.ref); } - QgsDebugMsgLevel( QStringLiteral( "Remaining bytes:%1" ).arg( buf->numRemainingBytes() ), 4 ); - - // RS crc; //RS */ - - return buf->isGood(); -} - -void DRW_Spline::parseCode( int code, dxfReader *reader ) -{ - switch ( code ) - { - case 210: - normalVec.x = reader->getDouble(); - break; - case 220: - normalVec.y = reader->getDouble(); - break; - case 230: - normalVec.z = reader->getDouble(); - break; - case 12: - tgStart.x = reader->getDouble(); - break; - case 22: - tgStart.y = reader->getDouble(); - break; - case 32: - tgStart.z = reader->getDouble(); - break; - case 13: - tgEnd.x = reader->getDouble(); - break; - case 23: - tgEnd.y = reader->getDouble(); - break; - case 33: - tgEnd.z = reader->getDouble(); - break; - case 70: - flags = reader->getInt32(); - break; - case 71: - degree = reader->getInt32(); - break; - case 72: - nknots = reader->getInt32(); - break; - case 73: - ncontrol = reader->getInt32(); - break; - case 74: - nfit = reader->getInt32(); - break; - case 42: - tolknot = reader->getDouble(); - break; - case 43: - tolcontrol = reader->getDouble(); - break; - case 44: - tolfit = reader->getDouble(); - break; - case 10: - { - controlpoint = new DRW_Coord(); - controllist.push_back( controlpoint ); - controlpoint->x = reader->getDouble(); - break; - } - case 20: - if ( controlpoint ) - controlpoint->y = reader->getDouble(); - break; - case 30: - if ( controlpoint ) - controlpoint->z = reader->getDouble(); - break; - case 11: - { - fitpoint = new DRW_Coord(); - fitlist.push_back( fitpoint ); - fitpoint->x = reader->getDouble(); - break; - } - case 21: - if ( fitpoint ) - fitpoint->y = reader->getDouble(); - break; - case 31: - if ( fitpoint ) - fitpoint->z = reader->getDouble(); - break; - case 40: - knotslist.push_back( reader->getDouble() ); - break; -// case 41: -// break; - default: - DRW_Entity::parseCode( code, reader ); - break; - } -} - -bool DRW_Spline::parseDwg( DRW::Version version, dwgBuffer *buf, duint32 bs ) -{ - bool ret = DRW_Entity::parseDwg( version, buf, nullptr, bs ); - if ( !ret ) - return ret; - - QgsDebugMsgLevel( QStringLiteral( "***************************** parsing spline *********************************************" ), 4 ); - - duint8 weight = 0; // RLZ ??? flags, weight, code 70, bit 4 (16) - - dint32 scenario = buf->getBitLong(); - - QgsDebugMsgLevel( QStringLiteral( "scenario: %1" ).arg( scenario ), 4 ); - - if ( version > DRW::AC1024 ) - { - dint32 splFlag1 = buf->getBitLong(); - if ( splFlag1 & 1 ) - scenario = 2; - dint32 knotParam = buf->getBitLong(); - - QgsDebugMsgLevel( QStringLiteral( "2013 splFlag1:%1, 2013 knotParam:%2" ).arg( splFlag1 ).arg( knotParam ), 4 ); - Q_UNUSED( knotParam ); - QgsDebugMsgLevel( QStringLiteral( "unk bit:%1" ).arg( buf->getBit() ), 4 ); - } - - degree = buf->getBitLong(); //RLZ: code 71, verify with dxf - QgsDebugMsgLevel( QStringLiteral( " degree:%1" ).arg( degree ), 4 ); - - if ( scenario == 2 ) - { - flags = 8;//scenario 2 = not rational & planar - tolfit = buf->getBitDouble();//BD - tgStart = buf->get3BitDouble(); - tgEnd = buf->get3BitDouble(); - nfit = buf->getBitLong(); - - QgsDebugMsgLevel( QStringLiteral( "flags: 0x%1, tolfit:%2, tangent start:%3 end:%4 nfit:%5" ) - .arg( flags, 0, 16 ).arg( tolfit ) - .arg( QStringLiteral( "%1,%2,%3" ).arg( tgStart.x ).arg( tgStart.y ).arg( tgStart.z ), - QStringLiteral( "%1,%2,%3" ).arg( tgEnd.x ).arg( tgEnd.y ).arg( tgEnd.z ) ) - .arg( nfit ), 4 - ); - } - else if ( scenario == 1 ) - { - flags = 8; //scenario 1 = rational & planar - flags |= buf->getBit() << 2; //flags, rational, code 70, bit 2 (4) - flags |= buf->getBit(); //flags, closed, code 70, bit 0 (1) - flags |= buf->getBit() << 1; //flags, periodic, code 70, bit 1 (2) - tolknot = buf->getBitDouble(); - tolcontrol = buf->getBitDouble(); - nknots = buf->getBitLong(); - ncontrol = buf->getBitLong(); - weight = buf->getBit(); // RLZ ??? flags, weight, code 70, bit 4 (16) - - QgsDebugMsgLevel( QStringLiteral( "flags:0x%1, knot tolerance:%2, control point tolerance:%3, num knots:%4, num control pt:%5, weight:%6" ) - .arg( flags, 0, 16 ).arg( tolknot ).arg( tolcontrol ).arg( nknots ).arg( ncontrol ).arg( weight ), 4 - ); - } - else - { - QgsDebugMsgLevel( QStringLiteral( "spline, unknown scenario %1" ).arg( scenario ), 4 ); - return false; //RLZ: from doc only 1 or 2 are OK ? - } - - RESERVE( knotslist, nknots ); - for ( dint32 i = 0; i < nknots; ++i ) - { - double d = buf->getBitDouble(); - knotslist.push_back( d ); - QgsDebugMsgLevel( QStringLiteral( "knot %1: %2 rem=%3" ) - .arg( i ).arg( d, 0, 'g', 17 ).arg( buf->numRemainingBytes() ), 4 - ); - } - - RESERVE( controllist, ncontrol ); - for ( dint32 i = 0; i < ncontrol; ++i ) - { - DRW_Coord *crd = new DRW_Coord( buf->get3BitDouble() ); - controllist.push_back( crd ); - QgsDebugMsgLevel( QStringLiteral( "cp %1: %2,%3,%4 rem:%5" ) - .arg( i ).arg( crd->x, 0, 'g', 17 ).arg( crd->y, 0, 'g', 17 ).arg( crd->z, 0, 'g', 17 ).arg( buf->numRemainingBytes() ), 4 - ); - if ( weight ) - { - double w = buf->getBitDouble(); //RLZ Warning: D (BD or RD) - QgsDebugMsgLevel( QStringLiteral( "weight %1: %2 rem:%3" ) - .arg( i ).arg( w, 0, 'g', 17 ).arg( buf->numRemainingBytes() ), 4 - ); - Q_UNUSED( w ); - } - } - - RESERVE( fitlist, nfit ); - for ( dint32 i = 0; i < nfit; ++i ) - { - DRW_Coord *crd = new DRW_Coord( buf->get3BitDouble() ); - fitlist.push_back( crd ); - QgsDebugMsgLevel( QStringLiteral( "fp %1: %2,%3,%4 rem:%5" ) - .arg( i ).arg( crd->x, 0, 'g', 17 ).arg( crd->y, 0, 'g', 17 ).arg( crd->z, 0, 'g', 17 ).arg( buf->numRemainingBytes() ), 4 - ); - } - - /* Common Entity Handle Data */ - ret = DRW_Entity::parseDwgEntHandle( version, buf ); - if ( !ret ) - return ret; - + DRW_DBG("Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n"); // RS crc; //RS */ return buf->isGood(); } -void DRW_Image::parseCode( int code, dxfReader *reader ) -{ - switch ( code ) - { +void DRW_Spline::parseCode(int code, dxfReader *reader){ + switch (code) { + case 210: + normalVec.x = reader->getDouble(); + break; + case 220: + normalVec.y = reader->getDouble(); + break; + case 230: + normalVec.z = reader->getDouble(); + break; case 12: - vVector.x = reader->getDouble(); - break; + tgStart.x = reader->getDouble(); + break; case 22: - vVector.y = reader->getDouble(); - break; + tgStart.y = reader->getDouble(); + break; case 32: - vVector.z = reader->getDouble(); - break; + tgStart.z = reader->getDouble(); + break; case 13: - sizeu = reader->getDouble(); - break; + tgEnd.x = reader->getDouble(); + break; case 23: - sizev = reader->getDouble(); - break; - case 340: - ref = reader->getHandleString(); - break; - case 280: - clip = reader->getInt32(); - break; - case 281: - brightness = reader->getInt32(); - break; - case 282: - contrast = reader->getInt32(); - break; - case 283: - fade = reader->getInt32(); - break; + tgEnd.y = reader->getDouble(); + break; + case 33: + tgEnd.z = reader->getDouble(); + break; + case 70: + flags = reader->getInt32(); + break; + case 71: + degree = reader->getInt32(); + break; + case 72: + nknots = reader->getInt32(); + break; + case 73: + ncontrol = reader->getInt32(); + break; + case 74: + nfit = reader->getInt32(); + break; + case 42: + tolknot = reader->getDouble(); + break; + case 43: + tolcontrol = reader->getDouble(); + break; + case 44: + tolfit = reader->getDouble(); + break; + case 10: { + controlpoint = std::make_shared(); + controllist.push_back(controlpoint); + controlpoint->x = reader->getDouble(); + break; } + case 20: + if(controlpoint) + controlpoint->y = reader->getDouble(); + break; + case 30: + if(controlpoint) + controlpoint->z = reader->getDouble(); + break; + case 11: { + fitpoint = std::make_shared(); + fitlist.push_back(fitpoint); + fitpoint->x = reader->getDouble(); + break; } + case 21: + if(fitpoint) + fitpoint->y = reader->getDouble(); + break; + case 31: + if(fitpoint) + fitpoint->z = reader->getDouble(); + break; + case 40: + knotslist.push_back(reader->getDouble()); + break; + case 41: + weightlist.push_back(reader->getDouble()); + break; default: - DRW_Line::parseCode( code, reader ); - break; - } + DRW_Entity::parseCode(code, reader); + break; + } } -bool DRW_Image::parseDwg( DRW::Version version, dwgBuffer *buf, duint32 bs ) -{ - dwgBuffer sBuff = *buf; - dwgBuffer *sBuf = buf; - if ( version > DRW::AC1018 ) //2007+ - { - sBuf = &sBuff; //separate buffer for strings +bool DRW_Spline::parseDwg(DRW::Version version, dwgBuffer *buf, duint32 bs){ + bool ret = DRW_Entity::parseDwg(version, buf, NULL, bs); + if (!ret) + return ret; + DRW_DBG("\n***************************** parsing spline *********************************************\n"); + duint8 weight = 0; // RLZ ??? flags, weight, code 70, bit 4 (16) + + dint32 scenario = buf->getBitLong(); + DRW_DBG("scenario: "); DRW_DBG(scenario); + if (version > DRW::AC1024) { + dint32 splFlag1 = buf->getBitLong(); + if (splFlag1 & 1) + scenario = 2; + dint32 knotParam = buf->getBitLong(); + DRW_DBG("2013 splFlag1: "); DRW_DBG(splFlag1); DRW_DBG(" 2013 knotParam: "); + DRW_DBG(knotParam); +// DRW_DBG("unk bit: "); DRW_DBG(buf->getBit()); + } + degree = buf->getBitLong(); //RLZ: code 71, verify with dxf + DRW_DBG(" degree: "); DRW_DBG(degree); DRW_DBG("\n"); + if (scenario == 2) { + flags = 8;//scenario 2 = not rational & planar + tolfit = buf->getBitDouble();//BD + DRW_DBG("flags: "); DRW_DBG(flags); DRW_DBG(" tolfit: "); DRW_DBG(tolfit); + tgStart =buf->get3BitDouble(); + DRW_DBG(" Start Tangent: "); DRW_DBGPT(tgStart.x, tgStart.y, tgStart.z); + tgEnd =buf->get3BitDouble(); + DRW_DBG("\nEnd Tangent: "); DRW_DBGPT(tgEnd.x, tgEnd.y, tgEnd.z); + nfit = buf->getBitLong(); + DRW_DBG("\nnumber of fit points: "); DRW_DBG(nfit); + } else if (scenario == 1) { + flags = 8;//scenario 1 = rational & planar + flags |= buf->getBit() << 2; //flags, rational, code 70, bit 2 (4) + flags |= buf->getBit(); //flags, closed, code 70, bit 0 (1) + flags |= buf->getBit() << 1; //flags, periodic, code 70, bit 1 (2) + tolknot = buf->getBitDouble(); + tolcontrol = buf->getBitDouble(); + DRW_DBG("flags: "); DRW_DBG(flags); DRW_DBG(" knot tolerance: "); DRW_DBG(tolknot); + DRW_DBG(" control point tolerance: "); DRW_DBG(tolcontrol); + nknots = buf->getBitLong(); + ncontrol = buf->getBitLong(); + weight = buf->getBit(); // RLZ ??? flags, weight, code 70, bit 4 (16) + DRW_DBG("\nnum of knots: "); DRW_DBG(nknots); DRW_DBG(" num of control pt: "); + DRW_DBG(ncontrol); DRW_DBG(" weight bit: "); DRW_DBG(weight); + } else { + DRW_DBG("\ndwg Ellipse, unknouwn scenario\n"); + return false; //RLZ: from doc only 1 or 2 are ok ? + } + + RESERVE( knotslist, nknots ); + for (dint32 i= 0; igetBitDouble()); } - bool ret = DRW_Entity::parseDwg( version, buf, sBuf, bs ); - if ( !ret ) - return ret; - - QgsDebugMsgLevel( QStringLiteral( "***************************** parsing image *********************************************" ), 4 ); - - dint32 classVersion = buf->getBitLong(); - basePoint = buf->get3BitDouble(); - secPoint = buf->get3BitDouble(); - vVector = buf->get3BitDouble(); - sizeu = buf->getRawDouble(); - sizev = buf->getRawDouble(); - - QgsDebugMsgLevel( QStringLiteral( "class version:%1, base point:%2, U:%3, V:%4, size U:%5, V:%6" ) - .arg( classVersion ) - .arg( QStringLiteral( "%1,%2,%3" ).arg( basePoint.x ).arg( basePoint.y ).arg( basePoint.z ), - QStringLiteral( "%1,%2,%3" ).arg( secPoint.x ).arg( secPoint.y ).arg( secPoint.z ), - QStringLiteral( "%1,%2,%3" ).arg( vVector.x ).arg( vVector.y ).arg( vVector.z ) ) - .arg( sizeu ).arg( sizev ), 4 - ); - Q_UNUSED( classVersion ); - - duint16 displayProps = buf->getBitShort(); - DRW_UNUSED( displayProps );//RLZ: temporary, complete API - clip = buf->getBit(); - brightness = buf->getRawChar8(); - contrast = buf->getRawChar8(); - fade = buf->getRawChar8(); - if ( version > DRW::AC1021 ) //2010+ - { - bool clipMode = buf->getBit(); - DRW_UNUSED( clipMode );//RLZ: temporary, complete API + RESERVE( controllist, ncontrol ); + for (dint32 i= 0; i(buf->get3BitDouble())); + if (weight) { + DRW_DBG("\n w: "); DRW_DBG(buf->getBitDouble()); //RLZ Warning: D (BD or RD) + } } - duint16 clipType = buf->getBitShort(); - if ( clipType == 1 ) - { - buf->get2RawDouble(); - buf->get2RawDouble(); - } - else //clipType == 2 - { - dint32 numVerts = buf->getBitLong(); - for ( int i = 0; i < numVerts; ++i ) - buf->get2RawDouble(); + RESERVE( fitlist, nfit ); + for (dint32 i= 0; i(buf->get3BitDouble())); + + if (DRW_DBGGL == DRW_dbg::Level::Debug){ + DRW_DBG("\nknots list: "); + for (auto const& v: knotslist) { + DRW_DBG("\n"); DRW_DBG(v); + } + DRW_DBG("\ncontrol point list: "); + for (auto const& v: controllist) { + DRW_DBG("\n"); DRW_DBGPT(v->x, v->y, v->z); + } + DRW_DBG("\nfit point list: "); + for (auto const& v: fitlist) { + DRW_DBG("\n"); DRW_DBGPT(v->x, v->y, v->z); + } + } - ret = DRW_Entity::parseDwgEntHandle( version, buf ); - if ( !ret ) - return ret; - - QgsDebugMsgLevel( QStringLiteral( "Remaining bytes: %1" ).arg( buf->numRemainingBytes() ), 4 ); - - dwgHandle biH = buf->getHandle(); - - QgsDebugMsgLevel( QStringLiteral( "ImageDef handle:%1.%2 0x%3" ).arg( biH.code ).arg( biH.size ).arg( biH.ref, 0, 16 ), 4 ); - - ref = biH.ref; - biH = buf->getHandle(); - - QgsDebugMsgLevel( QStringLiteral( "ImageDefReactor handle:%1.%2 0x%3" ).arg( biH.code ).arg( biH.size ).arg( biH.ref, 0, 16 ), 4 ); - - QgsDebugMsgLevel( QStringLiteral( "Remaining bytes: %1" ).arg( buf->numRemainingBytes() ), 4 ); - - // RS crc; //RS */ - + /* Common Entity Handle Data */ + ret = DRW_Entity::parseDwgEntHandle(version, buf); + if (!ret) + return ret; +// RS crc; //RS */ return buf->isGood(); } -void DRW_Dimension::parseCode( int code, dxfReader *reader ) -{ - switch ( code ) - { - case 1: - text = reader->getUtf8String(); - break; - case 2: - name = reader->getString(); - break; - case 3: - style = reader->getUtf8String(); - break; - case 70: - type = reader->getInt32(); - break; - case 71: - align = reader->getInt32(); - break; - case 72: - linesty = reader->getInt32(); - break; - case 10: - defPoint.x = reader->getDouble(); - break; - case 20: - defPoint.y = reader->getDouble(); - break; - case 30: - defPoint.z = reader->getDouble(); - break; - case 11: - textPoint.x = reader->getDouble(); - break; - case 21: - textPoint.y = reader->getDouble(); - break; - case 31: - textPoint.z = reader->getDouble(); - break; +void DRW_Image::parseCode(int code, dxfReader *reader){ + switch (code) { case 12: - clonePoint.x = reader->getDouble(); - break; + vVector.x = reader->getDouble(); + break; case 22: - clonePoint.y = reader->getDouble(); - break; + vVector.y = reader->getDouble(); + break; case 32: - clonePoint.z = reader->getDouble(); - break; + vVector.z = reader->getDouble(); + break; case 13: - def1.x = reader->getDouble(); - break; + sizeu = reader->getDouble(); + break; case 23: - def1.y = reader->getDouble(); - break; + sizev = reader->getDouble(); + break; + case 340: + ref = reader->getHandleString(); + break; + case 280: + clip = reader->getInt32(); + break; + case 281: + brightness = reader->getInt32(); + break; + case 282: + contrast = reader->getInt32(); + break; + case 283: + fade = reader->getInt32(); + break; + default: + DRW_Line::parseCode(code, reader); + break; + } +} + +bool DRW_Image::parseDwg(DRW::Version version, dwgBuffer *buf, duint32 bs){ + dwgBuffer sBuff = *buf; + dwgBuffer *sBuf = buf; + if (version > DRW::AC1018) {//2007+ + sBuf = &sBuff; //separate buffer for strings + } + bool ret = DRW_Entity::parseDwg(version, buf, sBuf, bs); + if (!ret) + return ret; + DRW_DBG("\n***************************** parsing image *********************************************\n"); + + dint32 classVersion = buf->getBitLong(); + DRW_DBG("class Version: "); DRW_DBG(classVersion); + basePoint = buf->get3BitDouble(); + DRW_DBG("\nbase point: "); DRW_DBGPT(basePoint.x, basePoint.y, basePoint.z); + secPoint = buf->get3BitDouble(); + DRW_DBG("\nU vector: "); DRW_DBGPT(secPoint.x, secPoint.y, secPoint.z); + vVector = buf->get3BitDouble(); + DRW_DBG("\nV vector: "); DRW_DBGPT(vVector.x, vVector.y, vVector.z); + sizeu = buf->getRawDouble(); + sizev = buf->getRawDouble(); + DRW_DBG("\nsize U: "); DRW_DBG(sizeu); DRW_DBG("\nsize V: "); DRW_DBG(sizev); + duint16 displayProps = buf->getBitShort(); + DRW_UNUSED(displayProps);//RLZ: temporary, complete API + clip = buf->getBit(); + brightness = buf->getRawChar8(); + contrast = buf->getRawChar8(); + fade = buf->getRawChar8(); + if (version > DRW::AC1021){ //2010+ + bool clipMode = buf->getBit(); + DRW_UNUSED(clipMode);//RLZ: temporary, complete API + } + duint16 clipType = buf->getBitShort(); + if (clipType == 1){ + buf->get2RawDouble(); + buf->get2RawDouble(); + } else { //clipType == 2 + dint32 numVerts = buf->getBitLong(); + for (int i= 0; i< numVerts;++i) + buf->get2RawDouble(); + } + + ret = DRW_Entity::parseDwgEntHandle(version, buf); + if (!ret) + return ret; + DRW_DBG("Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n"); + + dwgHandle biH = buf->getHandle(); + DRW_DBG("ImageDef Handle: "); DRW_DBGHL(biH.code, biH.size, biH.ref); + ref = biH.ref; + biH = buf->getHandle(); + DRW_DBG("ImageDefReactor Handle: "); DRW_DBGHL(biH.code, biH.size, biH.ref); + DRW_DBG("Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n"); +// RS crc; //RS */ + return buf->isGood(); +} + +void DRW_Dimension::parseCode(int code, dxfReader *reader){ + switch (code) { + case 1: + text = reader->getUtf8String(); + break; + case 2: + name = reader->getString(); + break; + case 3: + style = reader->getUtf8String(); + break; + case 70: + type = reader->getInt32(); + break; + case 71: + align = reader->getInt32(); + break; + case 72: + linesty = reader->getInt32(); + break; + case 10: + defPoint.x = reader->getDouble(); + break; + case 20: + defPoint.y = reader->getDouble(); + break; + case 30: + defPoint.z = reader->getDouble(); + break; + case 11: + textPoint.x = reader->getDouble(); + break; + case 21: + textPoint.y = reader->getDouble(); + break; + case 31: + textPoint.z = reader->getDouble(); + break; + case 12: + clonePoint.x = reader->getDouble(); + break; + case 22: + clonePoint.y = reader->getDouble(); + break; + case 32: + clonePoint.z = reader->getDouble(); + break; + case 13: + def1.x = reader->getDouble(); + break; + case 23: + def1.y = reader->getDouble(); + break; case 33: - def1.z = reader->getDouble(); - break; + def1.z = reader->getDouble(); + break; case 14: - def2.x = reader->getDouble(); - break; + def2.x = reader->getDouble(); + break; case 24: - def2.y = reader->getDouble(); - break; + def2.y = reader->getDouble(); + break; case 34: - def2.z = reader->getDouble(); - break; + def2.z = reader->getDouble(); + break; case 15: - circlePoint.x = reader->getDouble(); - break; + circlePoint.x = reader->getDouble(); + break; case 25: - circlePoint.y = reader->getDouble(); - break; + circlePoint.y = reader->getDouble(); + break; case 35: - circlePoint.z = reader->getDouble(); - break; + circlePoint.z = reader->getDouble(); + break; case 16: - arcPoint.x = reader->getDouble(); - break; + arcPoint.x = reader->getDouble(); + break; case 26: - arcPoint.y = reader->getDouble(); - break; + arcPoint.y = reader->getDouble(); + break; case 36: - arcPoint.z = reader->getDouble(); - break; + arcPoint.z = reader->getDouble(); + break; case 41: - linefactor = reader->getDouble(); - break; + linefactor = reader->getDouble(); + break; case 53: - rot = reader->getDouble(); - break; + rot = reader->getDouble(); + break; case 50: angle = reader->getDouble() / ARAD; break; case 52: oblique = reader->getDouble() / ARAD; - break; + break; case 40: - length = reader->getDouble(); - break; + length = reader->getDouble(); + break; case 51: - hdir = reader->getDouble(); - break; + hdir = reader->getDouble(); + break; default: - DRW_Entity::parseCode( code, reader ); - break; - } + DRW_Entity::parseCode(code, reader); + break; + } } -bool DRW_Dimension::parseDwg( DRW::Version version, dwgBuffer *buf, dwgBuffer *sBuf ) -{ - QgsDebugMsgLevel( QStringLiteral( "***************************** parsing dimension *********************************************" ), 4 ); - - if ( version > DRW::AC1021 ) //2010+ - { - duint8 dimVersion = buf->getRawChar8(); - QgsDebugMsgLevel( QStringLiteral( "dimVersion:%1" ).arg( dimVersion ), 4 ); - Q_UNUSED( dimVersion ); - } +bool DRW_Dimension::parseDwg(DRW::Version version, dwgBuffer *buf, dwgBuffer *sBuf){ + DRW_DBG("\n***************************** parsing dimension *********************************************"); + if (version > DRW::AC1021) { //2010+ + duint8 dimVersion = buf->getRawChar8(); + DRW_DBG("\ndimVersion: "); DRW_DBG(dimVersion); + } extPoint = buf->getExtrusion( version > DRW::AC1014, haveExtrusion ); - - QgsDebugMsgLevel( QStringLiteral( "extrusion:%1,%2,%3" ).arg( extPoint.x ).arg( extPoint.y ).arg( extPoint.z ), 4 ); - - if ( version > DRW::AC1014 ) //2000+ - { - int bit0 = buf->getBit(); - int bit1 = buf->getBit(); - int bit2 = buf->getBit(); - int bit3 = buf->getBit(); - int bit4 = buf->getBit(); - - QgsDebugMsgLevel( QStringLiteral( "Five unknown bits: %1%2%3%4%5" ).arg( bit0 ).arg( bit1 ).arg( bit2 ).arg( bit3 ).arg( bit4 ), 4 ); - Q_UNUSED( bit0 ); - Q_UNUSED( bit1 ); - Q_UNUSED( bit2 ); - Q_UNUSED( bit3 ); - Q_UNUSED( bit4 ); + DRW_DBG("\nextPoint: "); DRW_DBGPT(extPoint.x, extPoint.y, extPoint.z); + if (version > DRW::AC1014) { //2000+ + DRW_DBG("\nFive unknown bits: "); DRW_DBG(buf->getBit()); DRW_DBG(buf->getBit()); + DRW_DBG(buf->getBit()); DRW_DBG(buf->getBit()); DRW_DBG(buf->getBit()); } textPoint.x = buf->getRawDouble(); textPoint.y = buf->getRawDouble(); textPoint.z = buf->getBitDouble(); - - QgsDebugMsgLevel( QStringLiteral( "textPoint:%1,%2,%3" ).arg( textPoint.x ).arg( textPoint.y ).arg( textPoint.z ), 4 ); - + DRW_DBG("\ntextPoint: "); DRW_DBGPT(textPoint.x, textPoint.y, textPoint.z); type = buf->getRawChar8(); - - QgsDebugMsgLevel( QStringLiteral( "type (70) read: %1" ).arg( type ), 4 ); - type = ( type & 1 ) ? type & 0x7F : type | 0x80; //set bit 7 - type = ( type & 2 ) ? type | 0x20 : type & 0xDF; //set bit 5 - QgsDebugMsgLevel( QStringLiteral( "type (70) set: %1" ).arg( type ), 4 ); - + DRW_DBG("\ntype (70) read: "); DRW_DBG(type); + type = (type & 1) ? type & 0x7F : type | 0x80; //set bit 7 + type = (type & 2) ? type | 0x20 : type & 0xDF; //set bit 5 + DRW_DBG(" type (70) set: "); DRW_DBG(type); //clear last 3 bits to set integer dim type type &= 0xF8; - text = sBuf->getVariableText( version, false ); - - QgsDebugMsgLevel( QStringLiteral( "forced dim text:%1" ).arg( text.c_str() ), 4 ); + text = sBuf->getVariableText(version, false); + DRW_DBG("\nforced dim text: "); DRW_DBG(text.c_str()); rot = buf->getBitDouble(); hdir = buf->getBitDouble(); DRW_Coord inspoint = buf->get3BitDouble(); + DRW_DBG("\ninspoint: "); DRW_DBGPT(inspoint.x, inspoint.y, inspoint.z); double insRot_code54 = buf->getBitDouble(); //RLZ: unknown, investigate - - QgsDebugMsgLevel( QStringLiteral( "insPoint:%1 insRot_code54:%4" ) - .arg( QStringLiteral( "%1,%2,%3" ).arg( inspoint.x ).arg( inspoint.y ).arg( inspoint.z ) ) - .arg( insRot_code54 ), 4 - ); - Q_UNUSED( inspoint ); - Q_UNUSED( insRot_code54 ); - - if ( version > DRW::AC1014 ) //2000+ - { - align = buf->getBitShort(); - linesty = buf->getBitShort(); - linefactor = buf->getBitDouble(); - double actMeas = buf->getBitDouble(); - - QgsDebugMsgLevel( QStringLiteral( " actMeas_code42: %1" ).arg( actMeas ), 4 ); - Q_UNUSED( actMeas ); - - if ( version > DRW::AC1018 ) //2007+ - { - bool unk = buf->getBit(); - bool flip1 = buf->getBit(); - bool flip2 = buf->getBit(); - - QgsDebugMsgLevel( QStringLiteral( "2007, unk, flip1, flip2: %1, %2, %3" ) - .arg( unk ).arg( flip1 ).arg( flip2 ), 4 - ); - Q_UNUSED( unk ); - Q_UNUSED( flip1 ); - Q_UNUSED( flip2 ); - } + DRW_DBG(" insRot_code54: "); DRW_DBG(insRot_code54); + if (version > DRW::AC1014) { //2000+ + align = buf->getBitShort(); + linesty = buf->getBitShort(); + linefactor = buf->getBitDouble(); + double actMeas = buf->getBitDouble(); + DRW_DBG("\n actMeas_code42: "); DRW_DBG(actMeas); + if (version > DRW::AC1018) { //2007+ + bool unk = buf->getBit(); + bool flip1 = buf->getBit(); + bool flip2 = buf->getBit(); + DRW_DBG("\n2007, unk, flip1, flip2: "); DRW_DBG(unk); DRW_DBG(flip1); DRW_DBG(flip2); + } } clonePoint.x = buf->getRawDouble(); clonePoint.y = buf->getRawDouble(); - - QgsDebugMsgLevel( QStringLiteral( "clonePoint:%1,%2,%3" ).arg( clonePoint.x ).arg( clonePoint.y ).arg( clonePoint.z ), 4 ); + DRW_DBG("\nclonePoint: "); DRW_DBGPT(clonePoint.x, clonePoint.y, clonePoint.z); return buf->isGood(); } -bool DRW_DimAligned::parseDwg( DRW::Version version, dwgBuffer *buf, duint32 bs ) -{ +bool DRW_DimAligned::parseDwg(DRW::Version version, dwgBuffer *buf, duint32 bs){ dwgBuffer sBuff = *buf; dwgBuffer *sBuf = buf; - if ( version > DRW::AC1018 ) //2007+ - { - sBuf = &sBuff; //separate buffer for strings - } - bool ret = DRW_Entity::parseDwg( version, buf, sBuf, bs ); - if ( !ret ) - return ret; - ret = DRW_Dimension::parseDwg( version, buf, sBuf ); - if ( !ret ) - return ret; - if ( oType == 0x15 ) - { - QgsDebugMsgLevel( QStringLiteral( "***************************** parsing dim linear *********************************************" ), 4 ); + if (version > DRW::AC1018) {//2007+ + sBuf = &sBuff; //separate buffer for strings } + bool ret = DRW_Entity::parseDwg(version, buf, sBuf, bs); + if (!ret) + return ret; + ret = DRW_Dimension::parseDwg(version, buf, sBuf); + if (!ret) + return ret; + if (oType == 0x15) + DRW_DBG("\n***************************** parsing dim linear *********************************************\n"); else - { - QgsDebugMsgLevel( QStringLiteral( "***************************** parsing dim aligned *********************************************" ), 4 ); - } + DRW_DBG("\n***************************** parsing dim aligned *********************************************\n"); DRW_Coord pt = buf->get3BitDouble(); - setPt3( pt ); //def1 - - QgsDebugMsgLevel( QStringLiteral( "def1: %1,%2,%3" ).arg( pt.x ).arg( pt.y ).arg( pt.z ), 4 ); - + setPt3(pt); //def1 + DRW_DBG("def1: "); DRW_DBGPT(pt.x, pt.y, pt.z); pt = buf->get3BitDouble(); - setPt4( pt ); - - QgsDebugMsgLevel( QStringLiteral( "def2: %1,%2,%3" ).arg( pt.x ).arg( pt.y ).arg( pt.z ), 4 ); - + setPt4(pt); + DRW_DBG("\ndef2: "); DRW_DBGPT(pt.x, pt.y, pt.z); pt = buf->get3BitDouble(); - setDefPoint( pt ); - - QgsDebugMsgLevel( QStringLiteral( "defPoint: %1,%2,%3" ).arg( pt.x ).arg( pt.y ).arg( pt.z ), 4 ); - - setOb52( buf->getBitDouble() ); - if ( oType == 0x15 ) - setAn50( buf->getBitDouble() * ARAD ); + setDefPoint(pt); + DRW_DBG("\ndefPoint: "); DRW_DBGPT(pt.x, pt.y, pt.z); + setOb52(buf->getBitDouble()); + if (oType == 0x15) + setAn50(buf->getBitDouble() * ARAD); else - type |= 1; - - QgsDebugMsgLevel( QStringLiteral( "type (70) final: %1" ).arg( type ), 4 ); - - ret = DRW_Entity::parseDwgEntHandle( version, buf ); - - QgsDebugMsgLevel( QStringLiteral( "Remaining bytes: %1" ).arg( buf->numRemainingBytes() ), 4 ); - - if ( !ret ) - return ret; + type |= 1; + DRW_DBG("\n type (70) final: "); DRW_DBG(type); DRW_DBG("\n"); + ret = DRW_Entity::parseDwgEntHandle(version, buf); + DRW_DBG("Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n"); + if (!ret) + return ret; dimStyleH = buf->getHandle(); + DRW_DBG("dim style Handle: "); DRW_DBGHL(dimStyleH.code, dimStyleH.size, dimStyleH.ref); DRW_DBG("\n"); blockH = buf->getHandle(); /* H 7 STYLE (hard pointer) */ - - QgsDebugMsgLevel( QStringLiteral( "dim style Handle:%1, anon block handle:%2, remaining bytes %3" ) - .arg( QStringLiteral( "%1.%2 0x%3" ).arg( dimStyleH.code ).arg( dimStyleH.size ).arg( dimStyleH.ref, 0, 16 ), - QStringLiteral( "%1.%2 0x%3" ).arg( blockH.code ).arg( blockH.size ).arg( blockH.ref, 0, 16 ) ) - .arg( buf->numRemainingBytes() ), 4 - ); - - // RS crc; //RS */ - - return buf->isGood(); -} - -bool DRW_DimRadial::parseDwg( DRW::Version version, dwgBuffer *buf, duint32 bs ) -{ - dwgBuffer sBuff = *buf; - dwgBuffer *sBuf = buf; - if ( version > DRW::AC1018 ) //2007+ - { - sBuf = &sBuff; //separate buffer for strings - } - bool ret = DRW_Entity::parseDwg( version, buf, sBuf, bs ); - if ( !ret ) - return ret; - ret = DRW_Dimension::parseDwg( version, buf, sBuf ); - if ( !ret ) - return ret; - - QgsDebugMsgLevel( QStringLiteral( "***************************** parsing dim radial *********************************************" ), 4 ); - - DRW_Coord pt = buf->get3BitDouble(); - setDefPoint( pt ); //code 10 - - QgsDebugMsgLevel( QStringLiteral( "defPoint: %1,%2,%3" ).arg( pt.x ).arg( pt.y ).arg( pt.z ), 4 ); - - pt = buf->get3BitDouble(); - setPt5( pt ); //center pt code 15 - - QgsDebugMsgLevel( QStringLiteral( "center point: %1,%2,%3" ).arg( pt.x ).arg( pt.y ).arg( pt.z ), 4 ); - - setRa40( buf->getBitDouble() ); //leader length code 40 - QgsDebugMsgLevel( QStringLiteral( "leader length: %1" ).arg( getRa40() ), 4 ); - type |= 4; - - QgsDebugMsgLevel( QStringLiteral( "type (70) final: %1" ).arg( type ), 4 ); - - ret = DRW_Entity::parseDwgEntHandle( version, buf ); - - QgsDebugMsgLevel( QStringLiteral( "Remaining bytes: %1" ).arg( buf->numRemainingBytes() ), 4 ); - - if ( !ret ) - return ret; - - dimStyleH = buf->getHandle(); - blockH = buf->getHandle(); /* H 7 STYLE (hard pointer) */ - - QgsDebugMsgLevel( QStringLiteral( "dim style Handle:%1, anon block handle:%2, remaining bytes %3" ) - .arg( QStringLiteral( "%1.%2 0x%3" ).arg( dimStyleH.code ).arg( dimStyleH.size ).arg( dimStyleH.ref, 0, 16 ), - QStringLiteral( "%1.%2 0x%3" ).arg( blockH.code ).arg( blockH.size ).arg( blockH.ref, 0, 16 ) ) - .arg( buf->numRemainingBytes() ), 4 - ); + DRW_DBG("anon block Handle: "); DRW_DBGHL(blockH.code, blockH.size, blockH.ref); DRW_DBG("\n"); + DRW_DBG("Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n"); // RS crc; //RS */ return buf->isGood(); } -bool DRW_DimDiametric::parseDwg( DRW::Version version, dwgBuffer *buf, duint32 bs ) -{ - dwgBuffer sBuff = *buf; - dwgBuffer *sBuf = buf; - if ( version > DRW::AC1018 ) //2007+ - { - sBuf = &sBuff; //separate buffer for strings - } - bool ret = DRW_Entity::parseDwg( version, buf, sBuf, bs ); - if ( !ret ) - return ret; - ret = DRW_Dimension::parseDwg( version, buf, sBuf ); - if ( !ret ) - return ret; +bool DRW_DimRadial::parseDwg(DRW::Version version, dwgBuffer *buf, duint32 bs){ + dwgBuffer sBuff = *buf; + dwgBuffer *sBuf = buf; + if (version > DRW::AC1018) {//2007+ + sBuf = &sBuff; //separate buffer for strings + } + bool ret = DRW_Entity::parseDwg(version, buf, sBuf, bs); + if (!ret) + return ret; + ret = DRW_Dimension::parseDwg(version, buf, sBuf); + if (!ret) + return ret; + DRW_DBG("\n***************************** parsing dim radial *********************************************\n"); + DRW_Coord pt = buf->get3BitDouble(); + setDefPoint(pt); //code 10 + DRW_DBG("defPoint: "); DRW_DBGPT(pt.x, pt.y, pt.z); + pt = buf->get3BitDouble(); + setPt5(pt); //center pt code 15 + DRW_DBG("\ncenter point: "); DRW_DBGPT(pt.x, pt.y, pt.z); + setRa40(buf->getBitDouble()); //leader length code 40 + DRW_DBG("\nleader length: "); DRW_DBG(getRa40()); + type |= 4; + DRW_DBG("\n type (70) final: "); DRW_DBG(type); DRW_DBG("\n"); - QgsDebugMsgLevel( QStringLiteral( "***************************** parsing dim diametric *********************************************" ), 4 ); + ret = DRW_Entity::parseDwgEntHandle(version, buf); + DRW_DBG("Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n"); + if (!ret) + return ret; + dimStyleH = buf->getHandle(); + DRW_DBG("dim style Handle: "); DRW_DBGHL(dimStyleH.code, dimStyleH.size, dimStyleH.ref); DRW_DBG("\n"); + blockH = buf->getHandle(); /* H 7 STYLE (hard pointer) */ + DRW_DBG("anon block Handle: "); DRW_DBGHL(blockH.code, blockH.size, blockH.ref); DRW_DBG("\n"); + DRW_DBG("Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n"); - DRW_Coord pt = buf->get3BitDouble(); - setPt5( pt ); //center pt code 15 - - QgsDebugMsgLevel( QStringLiteral( "center point: %1,%2,%3" ).arg( pt.x ).arg( pt.y ).arg( pt.z ), 4 ); - - pt = buf->get3BitDouble(); - setDefPoint( pt ); //code 10 - - QgsDebugMsgLevel( QStringLiteral( "defPoint: %1,%2,%3" ).arg( pt.x ).arg( pt.y ).arg( pt.z ), 4 ); - - setRa40( buf->getBitDouble() ); //leader length code 40 - QgsDebugMsgLevel( QStringLiteral( "leader length: %1" ).arg( getRa40() ), 4 ); - - type |= 3; - QgsDebugMsgLevel( QStringLiteral( "type (70) final: %1" ).arg( type ), 4 ); - - ret = DRW_Entity::parseDwgEntHandle( version, buf ); - QgsDebugMsgLevel( QStringLiteral( "Remaining bytes: %1" ).arg( buf->numRemainingBytes() ), 4 ); - if ( !ret ) - return ret; - - dimStyleH = buf->getHandle(); - blockH = buf->getHandle(); /* H 7 STYLE (hard pointer) */ - - QgsDebugMsgLevel( QStringLiteral( "dim style Handle:%1, anon block handle:%2, remaining bytes %3" ) - .arg( QStringLiteral( "%1.%2 0x%3" ).arg( dimStyleH.code ).arg( dimStyleH.size ).arg( dimStyleH.ref, 0, 16 ), - QStringLiteral( "%1.%2 0x%3" ).arg( blockH.code ).arg( blockH.size ).arg( blockH.ref, 0, 16 ) ) - .arg( buf->numRemainingBytes() ), 4 - ); - - // RS crc; //RS */ - return buf->isGood(); + // RS crc; //RS */ + return buf->isGood(); } -bool DRW_DimAngular::parseDwg( DRW::Version version, dwgBuffer *buf, duint32 bs ) -{ +bool DRW_DimDiametric::parseDwg(DRW::Version version, dwgBuffer *buf, duint32 bs){ + dwgBuffer sBuff = *buf; + dwgBuffer *sBuf = buf; + if (version > DRW::AC1018) {//2007+ + sBuf = &sBuff; //separate buffer for strings + } + bool ret = DRW_Entity::parseDwg(version, buf, sBuf, bs); + if (!ret) + return ret; + ret = DRW_Dimension::parseDwg(version, buf, sBuf); + if (!ret) + return ret; + DRW_DBG("\n***************************** parsing dim diametric *********************************************\n"); + DRW_Coord pt = buf->get3BitDouble(); + setPt5(pt); //center pt code 15 + DRW_DBG("center point: "); DRW_DBGPT(pt.x, pt.y, pt.z); + pt = buf->get3BitDouble(); + setDefPoint(pt); //code 10 + DRW_DBG("\ndefPoint: "); DRW_DBGPT(pt.x, pt.y, pt.z); + setRa40(buf->getBitDouble()); //leader length code 40 + DRW_DBG("\nleader length: "); DRW_DBG(getRa40()); + type |= 3; + DRW_DBG("\n type (70) final: "); DRW_DBG(type); DRW_DBG("\n"); + + ret = DRW_Entity::parseDwgEntHandle(version, buf); + DRW_DBG("Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n"); + if (!ret) + return ret; + dimStyleH = buf->getHandle(); + DRW_DBG("dim style Handle: "); DRW_DBGHL(dimStyleH.code, dimStyleH.size, dimStyleH.ref); DRW_DBG("\n"); + blockH = buf->getHandle(); /* H 7 STYLE (hard pointer) */ + DRW_DBG("anon block Handle: "); DRW_DBGHL(blockH.code, blockH.size, blockH.ref); DRW_DBG("\n"); + DRW_DBG("Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n"); + + // RS crc; //RS */ + return buf->isGood(); +} + +bool DRW_DimAngular::parseDwg(DRW::Version version, dwgBuffer *buf, duint32 bs){ dwgBuffer sBuff = *buf; dwgBuffer *sBuf = buf; - if ( version > DRW::AC1018 ) //2007+ - { - sBuf = &sBuff; //separate buffer for strings + if (version > DRW::AC1018) {//2007+ + sBuf = &sBuff; //separate buffer for strings } - bool ret = DRW_Entity::parseDwg( version, buf, sBuf, bs ); - if ( !ret ) - return ret; - ret = DRW_Dimension::parseDwg( version, buf, sBuf ); - if ( !ret ) - return ret; - - QgsDebugMsgLevel( QStringLiteral( "***************************** parsing dim angular *********************************************" ), 4 ); - + bool ret = DRW_Entity::parseDwg(version, buf, sBuf, bs); + if (!ret) + return ret; + ret = DRW_Dimension::parseDwg(version, buf, sBuf); + if (!ret) + return ret; + DRW_DBG("\n***************************** parsing dim angular *********************************************\n"); DRW_Coord pt; pt.x = buf->getRawDouble(); pt.y = buf->getRawDouble(); - setPt6( pt ); //code 16 - - QgsDebugMsgLevel( QStringLiteral( "arc point: %1,%2,%3" ).arg( pt.x ).arg( pt.y ).arg( pt.z ), 4 ); - + setPt6(pt); //code 16 + DRW_DBG("arc Point: "); DRW_DBGPT(pt.x, pt.y, pt.z); pt = buf->get3BitDouble(); - setPt3( pt ); //def1 code 13 - - QgsDebugMsgLevel( QStringLiteral( "def1: %1,%2,%3" ).arg( pt.x ).arg( pt.y ).arg( pt.z ), 4 ); - + setPt3(pt); //def1 code 13 + DRW_DBG("\ndef1: "); DRW_DBGPT(pt.x, pt.y, pt.z); pt = buf->get3BitDouble(); - setPt4( pt ); //def2 code 14 - - QgsDebugMsgLevel( QStringLiteral( "def2: %1,%2,%3" ).arg( pt.x ).arg( pt.y ).arg( pt.z ), 4 ); - + setPt4(pt); //def2 code 14 + DRW_DBG("\ndef2: "); DRW_DBGPT(pt.x, pt.y, pt.z); pt = buf->get3BitDouble(); - setPt5( pt ); //center pt code 15 - - QgsDebugMsgLevel( QStringLiteral( "center point: %1,%2,%3" ).arg( pt.x ).arg( pt.y ).arg( pt.z ), 4 ); - + setPt5(pt); //center pt code 15 + DRW_DBG("\ncenter point: "); DRW_DBGPT(pt.x, pt.y, pt.z); pt = buf->get3BitDouble(); - setDefPoint( pt ); //code 10 - - QgsDebugMsgLevel( QStringLiteral( "defPoint: %1,%2,%3" ).arg( pt.x ).arg( pt.y ).arg( pt.z ), 4 ); - + setDefPoint(pt); //code 10 + DRW_DBG("\ndefPoint: "); DRW_DBGPT(pt.x, pt.y, pt.z); type |= 0x02; + DRW_DBG("\n type (70) final: "); DRW_DBG(type); DRW_DBG("\n"); - QgsDebugMsgLevel( QStringLiteral( "type (70) final: %1" ).arg( type ), 4 ); - - ret = DRW_Entity::parseDwgEntHandle( version, buf ); - - QgsDebugMsgLevel( QStringLiteral( "Remaining bytes: %1" ).arg( buf->numRemainingBytes() ), 4 ); - - if ( !ret ) - return ret; - + ret = DRW_Entity::parseDwgEntHandle(version, buf); + DRW_DBG("Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n"); + if (!ret) + return ret; dimStyleH = buf->getHandle(); + DRW_DBG("dim style Handle: "); DRW_DBGHL(dimStyleH.code, dimStyleH.size, dimStyleH.ref); DRW_DBG("\n"); blockH = buf->getHandle(); /* H 7 STYLE (hard pointer) */ - - QgsDebugMsgLevel( QStringLiteral( "dim style Handle:%1, anon block handle:%2, remaining bytes %3" ) - .arg( QStringLiteral( "%1.%2 0x%3" ).arg( dimStyleH.code ).arg( dimStyleH.size ).arg( dimStyleH.ref, 0, 16 ), - QStringLiteral( "%1.%2 0x%3" ).arg( blockH.code ).arg( blockH.size ).arg( blockH.ref, 0, 16 ) ) - .arg( buf->numRemainingBytes() ), 4 - ); + DRW_DBG("anon block Handle: "); DRW_DBGHL(blockH.code, blockH.size, blockH.ref); DRW_DBG("\n"); + DRW_DBG("Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n"); // RS crc; //RS */ return buf->isGood(); } -bool DRW_DimAngular3p::parseDwg( DRW::Version version, dwgBuffer *buf, duint32 bs ) -{ +bool DRW_DimAngular3p::parseDwg(DRW::Version version, dwgBuffer *buf, duint32 bs){ dwgBuffer sBuff = *buf; dwgBuffer *sBuf = buf; - if ( version > DRW::AC1018 ) //2007+ - { - sBuf = &sBuff; //separate buffer for strings + if (version > DRW::AC1018) {//2007+ + sBuf = &sBuff; //separate buffer for strings } - bool ret = DRW_Entity::parseDwg( version, buf, sBuf, bs ); - if ( !ret ) - return ret; - ret = DRW_Dimension::parseDwg( version, buf, sBuf ); - if ( !ret ) - return ret; - - QgsDebugMsgLevel( QStringLiteral( "***************************** parsing dim angular3p *********************************************" ), 4 ); - + bool ret = DRW_Entity::parseDwg(version, buf, sBuf, bs); + if (!ret) + return ret; + ret = DRW_Dimension::parseDwg(version, buf, sBuf); + if (!ret) + return ret; + DRW_DBG("\n***************************** parsing dim angular3p *********************************************\n"); DRW_Coord pt = buf->get3BitDouble(); - setDefPoint( pt ); //code 10 - - QgsDebugMsgLevel( QStringLiteral( "defPoint: %1,%2,%3" ).arg( pt.x ).arg( pt.y ).arg( pt.z ), 4 ); - + setDefPoint(pt); //code 10 + DRW_DBG("defPoint: "); DRW_DBGPT(pt.x, pt.y, pt.z); pt = buf->get3BitDouble(); - setPt3( pt ); //def1 code 13 - - QgsDebugMsgLevel( QStringLiteral( "def1: %1,%2,%3" ).arg( pt.x ).arg( pt.y ).arg( pt.z ), 4 ); - + setPt3(pt); //def1 code 13 + DRW_DBG("\ndef1: "); DRW_DBGPT(pt.x, pt.y, pt.z); pt = buf->get3BitDouble(); - setPt4( pt ); //def2 code 14 - - QgsDebugMsgLevel( QStringLiteral( "def2: %1,%2,%3" ).arg( pt.x ).arg( pt.y ).arg( pt.z ), 4 ); - + setPt4(pt); //def2 code 14 + DRW_DBG("\ndef2: "); DRW_DBGPT(pt.x, pt.y, pt.z); pt = buf->get3BitDouble(); - setPt5( pt ); //center pt code 15 - - QgsDebugMsgLevel( QStringLiteral( "center point: %1,%2,%3" ).arg( pt.x ).arg( pt.y ).arg( pt.z ), 4 ); - + setPt5(pt); //center pt code 15 + DRW_DBG("\ncenter point: "); DRW_DBGPT(pt.x, pt.y, pt.z); type |= 0x05; - QgsDebugMsgLevel( QStringLiteral( "type (70) final: %1" ).arg( type ), 4 ); - - ret = DRW_Entity::parseDwgEntHandle( version, buf ); - - QgsDebugMsgLevel( QStringLiteral( "Remaining bytes: %1" ).arg( buf->numRemainingBytes() ), 4 ); - - if ( !ret ) - return ret; + DRW_DBG("\n type (70) final: "); DRW_DBG(type); DRW_DBG("\n"); + ret = DRW_Entity::parseDwgEntHandle(version, buf); + DRW_DBG("Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n"); + if (!ret) + return ret; dimStyleH = buf->getHandle(); + DRW_DBG("dim style Handle: "); DRW_DBGHL(dimStyleH.code, dimStyleH.size, dimStyleH.ref); DRW_DBG("\n"); blockH = buf->getHandle(); /* H 7 STYLE (hard pointer) */ - - QgsDebugMsgLevel( QStringLiteral( "dim style Handle:%1, anon block handle:%2, remaining bytes %3" ) - .arg( QStringLiteral( "%1.%2 0x%3" ).arg( dimStyleH.code ).arg( dimStyleH.size ).arg( dimStyleH.ref, 0, 16 ), - QStringLiteral( "%1.%2 0x%3" ).arg( blockH.code ).arg( blockH.size ).arg( blockH.ref, 0, 16 ) ) - .arg( buf->numRemainingBytes() ), 4 - ); + DRW_DBG("anon block Handle: "); DRW_DBGHL(blockH.code, blockH.size, blockH.ref); DRW_DBG("\n"); + DRW_DBG("Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n"); // RS crc; //RS */ return buf->isGood(); } -bool DRW_DimOrdinate::parseDwg( DRW::Version version, dwgBuffer *buf, duint32 bs ) -{ +bool DRW_DimOrdinate::parseDwg(DRW::Version version, dwgBuffer *buf, duint32 bs){ dwgBuffer sBuff = *buf; dwgBuffer *sBuf = buf; - if ( version > DRW::AC1018 ) //2007+ - { - sBuf = &sBuff; //separate buffer for strings + if (version > DRW::AC1018) {//2007+ + sBuf = &sBuff; //separate buffer for strings } - bool ret = DRW_Entity::parseDwg( version, buf, sBuf, bs ); - if ( !ret ) - return ret; - ret = DRW_Dimension::parseDwg( version, buf, sBuf ); - if ( !ret ) - return ret; - - QgsDebugMsgLevel( QStringLiteral( "***************************** parsing dim ordinate *********************************************" ), 4 ); - + bool ret = DRW_Entity::parseDwg(version, buf, sBuf, bs); + if (!ret) + return ret; + ret = DRW_Dimension::parseDwg(version, buf, sBuf); + if (!ret) + return ret; + DRW_DBG("\n***************************** parsing dim ordinate *********************************************\n"); DRW_Coord pt = buf->get3BitDouble(); - setDefPoint( pt ); - - QgsDebugMsgLevel( QStringLiteral( "defPoint: %1,%2,%3" ).arg( pt.x ).arg( pt.y ).arg( pt.z ), 4 ); - + setDefPoint(pt); + DRW_DBG("defPoint: "); DRW_DBGPT(pt.x, pt.y, pt.z); pt = buf->get3BitDouble(); - setPt3( pt ); //def1 - - QgsDebugMsgLevel( QStringLiteral( "def1: %1,%2,%3" ).arg( pt.x ).arg( pt.y ).arg( pt.z ), 4 ); - + setPt3(pt); //def1 + DRW_DBG("\ndef1: "); DRW_DBGPT(pt.x, pt.y, pt.z); pt = buf->get3BitDouble(); - setPt4( pt ); - - QgsDebugMsgLevel( QStringLiteral( "def2: %1,%2,%3" ).arg( pt.x ).arg( pt.y ).arg( pt.z ), 4 ); - + setPt4(pt); + DRW_DBG("\ndef2: "); DRW_DBGPT(pt.x, pt.y, pt.z); duint8 type2 = buf->getRawChar8();//RLZ: correct this - - QgsDebugMsgLevel( QStringLiteral( "type2 (70) read: %1" ).arg( type2 ), 4 ); - - type = ( type2 & 1 ) ? type | 0x80 : type & 0xBF; //set bit 6 - - QgsDebugMsgLevel( QStringLiteral( "type (70) set: %1" ).arg( type ), 4 ); - + DRW_DBG("type2 (70) read: "); DRW_DBG(type2); + type = (type2 & 1) ? type | 0x80 : type & 0xBF; //set bit 6 + DRW_DBG(" type (70) set: "); DRW_DBG(type); type |= 6; + DRW_DBG("\n type (70) final: "); DRW_DBG(type); - QgsDebugMsgLevel( QStringLiteral( "type (70) final: %1" ).arg( type ), 4 ); - - ret = DRW_Entity::parseDwgEntHandle( version, buf ); - - QgsDebugMsgLevel( QStringLiteral( "Remaining bytes: %1" ).arg( buf->numRemainingBytes() ), 4 ); - - if ( !ret ) - return ret; - + ret = DRW_Entity::parseDwgEntHandle(version, buf); DRW_DBG("\n"); + DRW_DBG("Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n"); + if (!ret) + return ret; dimStyleH = buf->getHandle(); + DRW_DBG("dim style Handle: "); DRW_DBGHL(dimStyleH.code, dimStyleH.size, dimStyleH.ref); DRW_DBG("\n"); blockH = buf->getHandle(); /* H 7 STYLE (hard pointer) */ - - QgsDebugMsgLevel( QStringLiteral( "dim style Handle:%1, anon block handle:%2, remaining bytes %3" ) - .arg( QStringLiteral( "%1.%2 0x%3" ).arg( dimStyleH.code ).arg( dimStyleH.size ).arg( dimStyleH.ref, 0, 16 ), - QStringLiteral( "%1.%2 0x%3" ).arg( blockH.code ).arg( blockH.size ).arg( blockH.ref, 0, 16 ) ) - .arg( buf->numRemainingBytes() ), 4 - ); + DRW_DBG("anon block Handle: "); DRW_DBGHL(blockH.code, blockH.size, blockH.ref); DRW_DBG("\n"); + DRW_DBG("Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n"); // RS crc; //RS */ return buf->isGood(); } -void DRW_Leader::parseCode( int code, dxfReader *reader ) -{ - switch ( code ) - { - case 3: +void DRW_Leader::parseCode(int code, dxfReader *reader){ + switch (code) { + case 3: style = reader->getUtf8String(); break; - case 71: + case 71: arrow = reader->getInt32(); break; - case 72: + case 72: leadertype = reader->getInt32(); break; - case 73: + case 73: flag = reader->getInt32(); break; - case 74: + case 74: hookline = reader->getInt32(); break; - case 75: + case 75: hookflag = reader->getInt32(); break; - case 76: + case 76: vertnum = reader->getInt32(); break; - case 77: + case 77: coloruse = reader->getInt32(); break; - case 40: + case 40: textheight = reader->getDouble(); break; - case 41: + case 41: textwidth = reader->getDouble(); break; - case 10: - { - vertexpoint = new DRW_Coord(); - vertexlist.push_back( vertexpoint ); + case 10: + vertexpoint= std::make_shared(); + vertexlist.push_back(vertexpoint); vertexpoint->x = reader->getDouble(); break; - } - case 20: - if ( vertexpoint ) - vertexpoint->y = reader->getDouble(); + case 20: + if(vertexpoint) + vertexpoint->y = reader->getDouble(); break; - case 30: - if ( vertexpoint ) - vertexpoint->z = reader->getDouble(); + case 30: + if(vertexpoint) + vertexpoint->z = reader->getDouble(); break; - case 340: + case 340: annotHandle = reader->getHandleString(); break; - case 210: + case 210: extrusionPoint.x = reader->getDouble(); break; - case 220: + case 220: extrusionPoint.y = reader->getDouble(); break; - case 230: + case 230: extrusionPoint.z = reader->getDouble(); break; - case 211: + case 211: horizdir.x = reader->getDouble(); break; - case 221: + case 221: horizdir.y = reader->getDouble(); break; - case 231: + case 231: horizdir.z = reader->getDouble(); break; - case 212: + case 212: offsetblock.x = reader->getDouble(); break; - case 222: + case 222: offsetblock.y = reader->getDouble(); break; - case 232: + case 232: offsetblock.z = reader->getDouble(); break; - case 213: + case 213: offsettext.x = reader->getDouble(); break; - case 223: + case 223: offsettext.y = reader->getDouble(); break; - case 233: + case 233: offsettext.z = reader->getDouble(); break; - default: - DRW_Entity::parseCode( code, reader ); + default: + DRW_Entity::parseCode(code, reader); break; } } -bool DRW_Leader::parseDwg( DRW::Version version, dwgBuffer *buf, duint32 bs ) -{ +bool DRW_Leader::parseDwg(DRW::Version version, dwgBuffer *buf, duint32 bs){ dwgBuffer sBuff = *buf; dwgBuffer *sBuf = buf; - if ( version > DRW::AC1018 ) //2007+ - { - sBuf = &sBuff; //separate buffer for strings + if (version > DRW::AC1018) {//2007+ + sBuf = &sBuff; //separate buffer for strings } - bool ret = DRW_Entity::parseDwg( version, buf, sBuf, bs ); - if ( !ret ) - return ret; - - QgsDebugMsgLevel( QStringLiteral( "***************************** parsing leader *********************************************" ), 4 ); - - int bit0 = buf->getBit(); - int annot = buf->getBitShort(); - int pathtype = buf->getBitShort(); + bool ret = DRW_Entity::parseDwg(version, buf, sBuf, bs); + if (!ret) + return ret; + DRW_DBG("\n***************************** parsing leader *********************************************\n"); + DRW_DBG("unknown bit "); DRW_DBG(buf->getBit()); + DRW_DBG(" annot type "); DRW_DBG(buf->getBitShort()); + DRW_DBG(" Path type "); DRW_DBG(buf->getBitShort()); dint32 nPt = buf->getBitLong(); + DRW_DBG(" Num pts "); DRW_DBG(nPt); - QgsDebugMsgLevel( QStringLiteral( "unknown:%1 annottype:%2 pathtype:%3 numpts:%4" ) - .arg( bit0 ).arg( annot ).arg( pathtype ).arg( nPt ), 4 - ); - Q_UNUSED( bit0 ); - Q_UNUSED( annot ) - Q_UNUSED( pathtype ) - - // add vertices - for ( int i = 0; i < nPt; i++ ) - { - DRW_Coord *vertex = new DRW_Coord( buf->get3BitDouble() ); - vertexlist.push_back( vertex ); - QgsDebugMsgLevel( QStringLiteral( " vertex %1: %2,%3,%4" ).arg( i ).arg( vertex->x ).arg( vertex->y ).arg( vertex->z ), 4 ); + // add vertexs + for (int i = 0; i< nPt; i++){ + DRW_Coord vertex = buf->get3BitDouble(); + vertexlist.push_back(std::make_shared(vertex)); + DRW_DBG("\nvertex "); DRW_DBGPT(vertex.x, vertex.y, vertex.z); } - DRW_Coord Endptproj = buf->get3BitDouble(); - QgsDebugMsgLevel( QStringLiteral( " endptproj: %1,%2,%3" ).arg( Endptproj.x ).arg( Endptproj.y ).arg( Endptproj.z ), 4 ); - Q_UNUSED( Endptproj ); - + DRW_DBG("\nEndptproj "); DRW_DBGPT(Endptproj.x, Endptproj.y, Endptproj.z); extrusionPoint = buf->getExtrusion( version > DRW::AC1014, haveExtrusion ); - QgsDebugMsgLevel( QStringLiteral( " extrusion: %1,%2,%3" ).arg( extrusionPoint.x ).arg( extrusionPoint.y ).arg( extrusionPoint.z ), 4 ); - - if ( version > DRW::AC1014 ) //2000+ - { - int bit0 = buf->getBit(); - int bit1 = buf->getBit(); - int bit2 = buf->getBit(); - int bit3 = buf->getBit(); - int bit4 = buf->getBit(); - - QgsDebugMsgLevel( QStringLiteral( "Five unknown bits: %1%2%3%4%5" ).arg( bit0 ).arg( bit1 ).arg( bit2 ).arg( bit3 ).arg( bit4 ), 4 ); - Q_UNUSED( bit0 ); - Q_UNUSED( bit1 ); - Q_UNUSED( bit2 ); - Q_UNUSED( bit3 ); - Q_UNUSED( bit4 ); + DRW_DBG("\nextrusionPoint "); DRW_DBGPT(extrusionPoint.x, extrusionPoint.y, extrusionPoint.z); + if (version > DRW::AC1014) { //2000+ + DRW_DBG("\nFive unknown bits: "); DRW_DBG(buf->getBit()); DRW_DBG(buf->getBit()); + DRW_DBG(buf->getBit()); DRW_DBG(buf->getBit()); DRW_DBG(buf->getBit()); } horizdir = buf->get3BitDouble(); + DRW_DBG("\nhorizdir "); DRW_DBGPT(horizdir.x, horizdir.y, horizdir.z); offsetblock = buf->get3BitDouble(); - - QgsDebugMsgLevel( QStringLiteral( " horizdir: %1,%2,%3" ).arg( horizdir.x ).arg( horizdir.y ).arg( horizdir.z ), 4 ); - QgsDebugMsgLevel( QStringLiteral( " offsetblock: %1,%2,%3" ).arg( offsetblock.x ).arg( offsetblock.y ).arg( offsetblock.z ), 4 ); - - if ( version > DRW::AC1012 ) //R14+ - { - DRW_Coord unk = buf->get3BitDouble(); - QgsDebugMsgLevel( QStringLiteral( " unknown: %1,%2,%3" ).arg( unk.x ).arg( unk.y ).arg( unk.z ), 4 ); - Q_UNUSED( unk ); + DRW_DBG("\noffsetblock "); DRW_DBGPT(offsetblock.x, offsetblock.y, offsetblock.z); + if (version > DRW::AC1012) { //R14+ + DRW_Coord unk = buf->get3BitDouble(); + DRW_DBG("\nunknown "); DRW_DBGPT(unk.x, unk.y, unk.z); } - if ( version < DRW::AC1015 ) //R14 - - { - double dimgap = buf->getBitDouble(); - QgsDebugMsgLevel( QStringLiteral( "dimgap %1" ).arg( dimgap ), 4 ); - Q_UNUSED( dimgap ); + if (version < DRW::AC1015) { //R14 - + DRW_DBG("\ndimgap "); DRW_DBG(buf->getBitDouble()); } - if ( version < DRW::AC1024 ) //2010- - { - textheight = buf->getBitDouble(); - textwidth = buf->getBitDouble(); - - QgsDebugMsgLevel( QStringLiteral( "textheight:%1 textwidth:%2" ).arg( textheight ).arg( textwidth ), 4 ); + if (version < DRW::AC1024) { //2010- + textheight = buf->getBitDouble(); + textwidth = buf->getBitDouble(); + DRW_DBG("\ntextheight "); DRW_DBG(textheight); DRW_DBG(" textwidth "); DRW_DBG(textwidth); } hookline = buf->getBit(); arrow = buf->getBit(); + DRW_DBG(" hookline "); DRW_DBG(hookline); DRW_DBG(" arrow flag "); DRW_DBG(arrow); - QgsDebugMsgLevel( QStringLiteral( "hookline:%1 arrow flag:%2" ).arg( hookline ).arg( arrow ), 4 ); - - if ( version < DRW::AC1015 ) //R14 - - { - int headtype = buf->getBitShort(); - double dimasz = buf->getBitDouble(); - int unk0 = buf->getBit(); - int unk1 = buf->getBit(); - int unk2 = buf->getBitShort(); - int byblockcol = buf->getBitShort(); - int unk3 = buf->getBit(); - int unk4 = buf->getBit(); - - QgsDebugMsgLevel( QStringLiteral( "Arrow head type:%1 dimasz:%2 unk0:%3 unk1:%4 unk2:%5 byblockcol:%6 unk3:%7 unk3:%9" ) - .arg( headtype ).arg( dimasz ).arg( unk0 ).arg( unk1 ).arg( unk2 ).arg( byblockcol ).arg( unk3 ).arg( unk4 ), 4 - ); - Q_UNUSED( headtype ); - Q_UNUSED( dimasz ); - Q_UNUSED( unk0 ); - Q_UNUSED( unk1 ); - Q_UNUSED( unk2 ); - Q_UNUSED( byblockcol ); - Q_UNUSED( unk3 ); - Q_UNUSED( unk4 ); + if (version < DRW::AC1015) { //R14 - + DRW_DBG("\nArrow head type "); DRW_DBG(buf->getBitShort()); + DRW_DBG("dimasz "); DRW_DBG(buf->getBitDouble()); + DRW_DBG("\nunk bit "); DRW_DBG(buf->getBit()); + DRW_DBG(" unk bit "); DRW_DBG(buf->getBit()); + DRW_DBG(" unk short "); DRW_DBG(buf->getBitShort()); + DRW_DBG(" byBlock color "); DRW_DBG(buf->getBitShort()); + DRW_DBG(" unk bit "); DRW_DBG(buf->getBit()); + DRW_DBG(" unk bit "); DRW_DBG(buf->getBit()); + } else { //R2000+ + DRW_DBG("\nunk short "); DRW_DBG(buf->getBitShort()); + DRW_DBG(" unk bit "); DRW_DBG(buf->getBit()); + DRW_DBG(" unk bit "); DRW_DBG(buf->getBit()); } - else //R2000+ - { - int unk0 = buf->getBitShort(); - int unk1 = buf->getBit(); - int unk2 = buf->getBit(); - QgsDebugMsgLevel( QStringLiteral( "unk0:%1 unk1:%2 unk2:%3" ).arg( unk0 ).arg( unk1 ).arg( unk2 ), 4 ); - Q_UNUSED( unk0 ); - Q_UNUSED( unk1 ); - Q_UNUSED( unk2 ); - } - - ret = DRW_Entity::parseDwgEntHandle( version, buf ); - if ( !ret ) - return ret; - - QgsDebugMsgLevel( QStringLiteral( "Remaining bytes: %1" ).arg( buf->numRemainingBytes() ), 4 ); - + DRW_DBG("\n"); + ret = DRW_Entity::parseDwgEntHandle(version, buf); + if (!ret) + return ret; + DRW_DBG("Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n"); AnnotH = buf->getHandle(); annotHandle = AnnotH.ref; + DRW_DBG("annot block Handle: "); DRW_DBGHL(AnnotH.code, AnnotH.size, dimStyleH.ref); DRW_DBG("\n"); dimStyleH = buf->getHandle(); /* H 7 STYLE (hard pointer) */ - - QgsDebugMsgLevel( QStringLiteral( "annot block Handle:%1, dim style handle:%2, remaining bytes %3" ) - .arg( QStringLiteral( "%1.%2 0x%3" ).arg( AnnotH.code ).arg( AnnotH.size ).arg( AnnotH.ref, 0, 16 ), - QStringLiteral( "%1.%2 0x%3" ).arg( dimStyleH.code ).arg( dimStyleH.size ).arg( dimStyleH.ref, 0, 16 ) ) - .arg( buf->numRemainingBytes() ), 4 - ); - - // RS crc; //RS */ - + DRW_DBG("dim style Handle: "); DRW_DBGHL(dimStyleH.code, dimStyleH.size, dimStyleH.ref); DRW_DBG("\n"); + DRW_DBG("Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n"); +// RS crc; //RS */ return buf->isGood(); } -void DRW_Viewport::parseCode( int code, dxfReader *reader ) -{ - switch ( code ) - { - case 40: +void DRW_Viewport::parseCode(int code, dxfReader *reader){ + switch (code) { + case 40: pswidth = reader->getDouble(); break; - case 41: + case 41: psheight = reader->getDouble(); break; - case 68: + case 68: vpstatus = reader->getInt32(); break; - case 69: + case 69: vpID = reader->getInt32(); break; - case 12: - { + case 12: { centerPX = reader->getDouble(); - break; - } - case 22: + break; } + case 22: centerPY = reader->getDouble(); break; - default: - DRW_Point::parseCode( code, reader ); + default: + DRW_Point::parseCode(code, reader); break; } } //ex 22 dec 34 -bool DRW_Viewport::parseDwg( DRW::Version version, dwgBuffer *buf, duint32 bs ) -{ +bool DRW_Viewport::parseDwg(DRW::Version version, dwgBuffer *buf, duint32 bs){ dwgBuffer sBuff = *buf; dwgBuffer *sBuf = buf; - if ( version > DRW::AC1018 ) //2007+ - { - sBuf = &sBuff; //separate buffer for strings + if (version > DRW::AC1018) {//2007+ + sBuf = &sBuff; //separate buffer for strings } - bool ret = DRW_Entity::parseDwg( version, buf, sBuf, bs ); - if ( !ret ) - return ret; - - QgsDebugMsgLevel( QStringLiteral( "***************************** parsing viewport *****************************************" ), 4 ); - + bool ret = DRW_Entity::parseDwg(version, buf, sBuf, bs); + if (!ret) + return ret; + DRW_DBG("\n***************************** parsing viewport *****************************************\n"); basePoint.x = buf->getBitDouble(); basePoint.y = buf->getBitDouble(); basePoint.z = buf->getBitDouble(); + DRW_DBG("center "); DRW_DBGPT(basePoint.x, basePoint.y, basePoint.z); pswidth = buf->getBitDouble(); psheight = buf->getBitDouble(); - - QgsDebugMsgLevel( QStringLiteral( "center: %1,%2,%3 width:%4 height:%5" ) - .arg( basePoint.x ).arg( basePoint.y ).arg( basePoint.z ) - .arg( pswidth ).arg( psheight ), 4 - ); - + DRW_DBG("\nWidth: "); DRW_DBG(pswidth); DRW_DBG(", Height: "); DRW_DBG(psheight); DRW_DBG("\n"); //RLZ TODO: complete in dxf - if ( version > DRW::AC1014 ) //2000+ - { - viewTarget.x = buf->getBitDouble(); - viewTarget.y = buf->getBitDouble(); - viewTarget.z = buf->getBitDouble(); - - QgsDebugMsgLevel( QStringLiteral( "viewTarget: %1,%2,%3" ).arg( viewTarget.x ).arg( viewTarget.y ).arg( viewTarget.z ), 4 ); - - viewDir.x = buf->getBitDouble(); - viewDir.y = buf->getBitDouble(); - viewDir.z = buf->getBitDouble(); - - QgsDebugMsgLevel( QStringLiteral( "viewDir: %1,%2,%3" ).arg( viewDir.x ).arg( viewDir.y ).arg( viewDir.z ), 4 ); - - twistAngle = buf->getBitDouble(); - viewHeight = buf->getBitDouble(); - viewLength = buf->getBitDouble(); - frontClip = buf->getBitDouble(); - backClip = buf->getBitDouble(); - snapAngle = buf->getBitDouble(); - - QgsDebugMsgLevel( QStringLiteral( "View twist Angle:%1 Height:%2 LensLength:%3 front Clip Z:%4 back Clip Z:%5 snap Angle:%6" ) - .arg( twistAngle ).arg( viewHeight ).arg( viewLength ).arg( frontClip ).arg( backClip ).arg( snapAngle ), 4 - ); - - centerPX = buf->getRawDouble(); - centerPY = buf->getRawDouble(); - - QgsDebugMsgLevel( QStringLiteral( "viewCenter: %1,%2" ).arg( centerPX ).arg( centerPY ), 4 ); - - snapPX = buf->getRawDouble(); - snapPY = buf->getRawDouble(); - - QgsDebugMsgLevel( QStringLiteral( "snapBase: %1,%2" ).arg( snapPX ).arg( snapPY ), 4 ); - - snapSpPX = buf->getRawDouble(); - snapSpPY = buf->getRawDouble(); - - QgsDebugMsgLevel( QStringLiteral( "snapSpacing: %1,%2" ).arg( snapSpPX ).arg( snapSpPY ), 4 ); - - //RLZ: need to complete - double gridX = buf->getRawDouble(); - double gridY = buf->getRawDouble(); - int czoom = buf->getBitShort(); - - QgsDebugMsgLevel( QStringLiteral( "gridSpacing: %1,%2 Circle zoom?: %3" ).arg( gridX ).arg( gridY ).arg( czoom ), 4 ); - Q_UNUSED( gridX ); - Q_UNUSED( gridY ); - Q_UNUSED( czoom ); + if (version > DRW::AC1014) {//2000+ + viewTarget.x = buf->getBitDouble(); + viewTarget.y = buf->getBitDouble(); + viewTarget.z = buf->getBitDouble(); + DRW_DBG("view Target "); DRW_DBGPT(viewTarget.x, viewTarget.y, viewTarget.z); + viewDir.x = buf->getBitDouble(); + viewDir.y = buf->getBitDouble(); + viewDir.z = buf->getBitDouble(); + DRW_DBG("\nview direction "); DRW_DBGPT(viewDir.x, viewDir.y, viewDir.z); + twistAngle = buf->getBitDouble(); + DRW_DBG("\nView twist Angle: "); DRW_DBG(twistAngle); + viewHeight = buf->getBitDouble(); + DRW_DBG("\nview Height: "); DRW_DBG(viewHeight); + viewLength = buf->getBitDouble(); + DRW_DBG(" Lens Length: "); DRW_DBG(viewLength); + frontClip = buf->getBitDouble(); + DRW_DBG("\nfront Clip Z: "); DRW_DBG(frontClip); + backClip = buf->getBitDouble(); + DRW_DBG(" back Clip Z: "); DRW_DBG(backClip); + snapAngle = buf->getBitDouble(); + DRW_DBG("\n snap Angle: "); DRW_DBG(snapAngle); + centerPX = buf->getRawDouble(); + centerPY = buf->getRawDouble(); + DRW_DBG("\nview center X: "); DRW_DBG(centerPX); DRW_DBG(", Y: "); DRW_DBG(centerPX); + snapPX = buf->getRawDouble(); + snapPY = buf->getRawDouble(); + DRW_DBG("\nSnap base point X: "); DRW_DBG(snapPX); DRW_DBG(", Y: "); DRW_DBG(snapPY); + snapSpPX = buf->getRawDouble(); + snapSpPY = buf->getRawDouble(); + DRW_DBG("\nSnap spacing X: "); DRW_DBG(snapSpPX); DRW_DBG(", Y: "); DRW_DBG(snapSpPY); + //RLZ: need to complete + DRW_DBG("\nGrid spacing X: "); DRW_DBG(buf->getRawDouble()); DRW_DBG(", Y: "); DRW_DBG(buf->getRawDouble());DRW_DBG("\n"); + DRW_DBG("Circle zoom?: "); DRW_DBG(buf->getBitShort()); DRW_DBG("\n"); } - if ( version > DRW::AC1018 ) //2007+ - { - int gridmajor = buf->getBitShort(); - QgsDebugMsgLevel( QStringLiteral( "Grid major?: %1" ).arg( gridmajor ), 4 ); - Q_UNUSED( gridmajor ); + if (version > DRW::AC1018) {//2007+ + DRW_DBG("Grid major?: "); DRW_DBG(buf->getBitShort()); DRW_DBG("\n"); } - if ( version > DRW::AC1014 ) //2000+ - { - frozenLyCount = buf->getBitLong(); - QgsDebugMsgLevel( QStringLiteral( "Frozen Layer count?: %1" ).arg( frozenLyCount ), 4 ); - - int t = buf->getBitLong(); - QgsDebugMsgLevel( QStringLiteral( "Status Flags?: %1" ).arg( t ), 4 ); - Q_UNUSED( t ); - - //RLZ: Warning needed separate string bufer - std::string txt = sBuf->getVariableText( version, false ); - QgsDebugMsgLevel( QStringLiteral( "Style sheet?: %1" ).arg( txt.c_str() ), 4 ); - Q_UNUSED( txt ); - - t = buf->getRawChar8(); - QgsDebugMsgLevel( QStringLiteral( "Render mode?: %1" ).arg( t ), 4 ); - t = buf->getBit(); - QgsDebugMsgLevel( QStringLiteral( "UCS OMore...: %1" ).arg( t ), 4 ); - t = buf->getBit(); - QgsDebugMsgLevel( QStringLiteral( "UCS VMore...: %1" ).arg( t ), 4 ); - - double x, y, z; - x = buf->getBitDouble(); - y = buf->getBitDouble(); - z = buf->getBitDouble(); - QgsDebugMsgLevel( QStringLiteral( "UCS OMode: %1,%2,%3" ).arg( x ).arg( y ).arg( z ), 4 ); - Q_UNUSED( x ); - Q_UNUSED( y ); - Q_UNUSED( z ); - - x = buf->getBitDouble(); - y = buf->getBitDouble(); - z = buf->getBitDouble(); - QgsDebugMsgLevel( QStringLiteral( "UCS XAMode: %1,%2,%3" ).arg( x ).arg( y ).arg( z ), 4 ); - - x = buf->getBitDouble(); - y = buf->getBitDouble(); - z = buf->getBitDouble(); - QgsDebugMsgLevel( QStringLiteral( "UCS YMode: %1,%2,%3" ).arg( x ).arg( y ).arg( z ), 4 ); - - x = buf->getBitDouble(); - QgsDebugMsgLevel( QStringLiteral( "UCS EMore: %1" ).arg( x ), 4 ); - - t = buf->getBitShort(); - QgsDebugMsgLevel( QStringLiteral( "UCS OVMore: %1" ).arg( t ), 4 ); + if (version > DRW::AC1014) {//2000+ + frozenLyCount = buf->getBitLong(); + DRW_DBG("Frozen Layer count?: "); DRW_DBG(frozenLyCount); DRW_DBG("\n"); + DRW_DBG("Status Flags?: "); DRW_DBG(buf->getBitLong()); DRW_DBG("\n"); + //RLZ: Warning needed separate string buffer + DRW_DBG("Style sheet?: "); DRW_DBG(sBuf->getVariableText(version, false)); DRW_DBG("\n"); + DRW_DBG("Render mode?: "); DRW_DBG(buf->getRawChar8()); DRW_DBG("\n"); + DRW_DBG("UCS OMore...: "); DRW_DBG(buf->getBit()); DRW_DBG("\n"); + DRW_DBG("UCS VMore...: "); DRW_DBG(buf->getBit()); DRW_DBG("\n"); + DRW_DBG("UCS OMore...: "); DRW_DBGPT(buf->getBitDouble(), buf->getBitDouble(), buf->getBitDouble()); DRW_DBG("\n"); + DRW_DBG("ucs XAMore...: "); DRW_DBGPT(buf->getBitDouble(), buf->getBitDouble(), buf->getBitDouble()); DRW_DBG("\n"); + DRW_DBG("UCS YMore....: "); DRW_DBGPT(buf->getBitDouble(), buf->getBitDouble(), buf->getBitDouble()); DRW_DBG("\n"); + DRW_DBG("UCS EMore...: "); DRW_DBG(buf->getBitDouble()); DRW_DBG("\n"); + DRW_DBG("UCS OVMore...: "); DRW_DBG(buf->getBitShort()); DRW_DBG("\n"); } - if ( version > DRW::AC1015 ) //2004+ - { - int t = buf->getBitShort(); - QgsDebugMsgLevel( QStringLiteral( "ShadePlot Mode...: %1" ).arg( t ), 4 ); - Q_UNUSED( t ); + if (version > DRW::AC1015) {//2004+ + DRW_DBG("ShadePlot Mode...: "); DRW_DBG(buf->getBitShort()); DRW_DBG("\n"); } - if ( version > DRW::AC1018 ) //2007+ - { - int t; - t = buf->getBit(); - QgsDebugMsgLevel( QStringLiteral( "Use def Light...: %1" ).arg( t ), 4 ); - Q_UNUSED( t ); - - t = buf->getRawChar8(); - QgsDebugMsgLevel( QStringLiteral( "Def light tipe?: %1" ).arg( t ), 4 ); - - double d = buf->getBitDouble(); - QgsDebugMsgLevel( QStringLiteral( "Brightness: %1" ).arg( d ), 4 ); - Q_UNUSED( d ); - - d = buf->getBitDouble(); - QgsDebugMsgLevel( QStringLiteral( "Contrast: %1" ).arg( d ), 4 ); - - t = buf->getEnColor( version, color24, transparency ); - QgsDebugMsgLevel( QStringLiteral( "Ambient (Cmc or Enc?), Enc: 0x%1" ).arg( buf->getEnColor( version, color24, transparency ), 0, 16 ), 4 ); + if (version > DRW::AC1018) {//2007+ + DRW_DBG("Use def Light...: "); DRW_DBG(buf->getBit()); DRW_DBG("\n"); + DRW_DBG("Def light type?: "); DRW_DBG(buf->getRawChar8()); DRW_DBG("\n"); + DRW_DBG("Brightness: "); DRW_DBG(buf->getBitDouble()); DRW_DBG("\n"); + DRW_DBG("Contrast: "); DRW_DBG(buf->getBitDouble()); DRW_DBG("\n"); +// DRW_DBG("Ambient Cmc or Enc: "); DRW_DBG(buf->getCmColor(version)); DRW_DBG("\n"); + DRW_DBG("Ambient (Cmc or Enc?), Enc: "); DRW_DBG(buf->getEnColor(version, color24, transparency)); DRW_DBG("\n"); } - ret = DRW_Entity::parseDwgEntHandle( version, buf ); + ret = DRW_Entity::parseDwgEntHandle(version, buf); dwgHandle someHdl; - if ( version < DRW::AC1015 ) //R13 & R14 only - { - QgsDebugMsgLevel( QStringLiteral( "Remaining bytes: %1" ).arg( buf->numRemainingBytes() ), 4 ); - someHdl = buf->getHandle(); - QgsDebugMsgLevel( QStringLiteral( "viewport ent handle: %1.%2 0x%3" ).arg( someHdl.code ).arg( someHdl.size ).arg( someHdl.ref, 0, 16 ), 4 ); - } - if ( version > DRW::AC1014 ) //2000+ - { - for ( duint8 i = 0; i < frozenLyCount; ++i ) - { + if (version < DRW::AC1015) {//R13 & R14 only + DRW_DBG("\n Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n"); someHdl = buf->getHandle(); - QgsDebugMsgLevel( QStringLiteral( "frozen layer handle %1: %2.%3 0x%4" ).arg( i ).arg( someHdl.code ).arg( someHdl.size ).arg( someHdl.ref, 0, 16 ), 4 ); - } - - someHdl = buf->getHandle(); - QgsDebugMsgLevel( QStringLiteral( "clip boundary handle: %1.%2 0x%3" ).arg( someHdl.code ).arg( someHdl.size ).arg( someHdl.ref, 0, 16 ), 4 ); - - if ( version == DRW::AC1015 ) //2000 only - { + DRW_DBG("ViewPort ent header: "); DRW_DBGHL(someHdl.code, someHdl.size, someHdl.ref); DRW_DBG("\n"); + } + if (version > DRW::AC1014) {//2000+ + for (duint8 i=0; i < frozenLyCount; ++i){ + someHdl = buf->getHandle(); + DRW_DBG("Frozen layer handle "); DRW_DBG(i); DRW_DBG(": "); DRW_DBGHL(someHdl.code, someHdl.size, someHdl.ref); DRW_DBG("\n"); + } someHdl = buf->getHandle(); - QgsDebugMsgLevel( QStringLiteral( "viewport ent handle: %1.%2 0x%3" ).arg( someHdl.code ).arg( someHdl.size ).arg( someHdl.ref, 0, 16 ), 4 ); - } - someHdl = buf->getHandle(); - QgsDebugMsgLevel( QStringLiteral( "named ucs handle: %1.%2 0x%3" ).arg( someHdl.code ).arg( someHdl.size ).arg( someHdl.ref, 0, 16 ), 4 ); - QgsDebugMsgLevel( QStringLiteral( "Remaining bytes: %1" ).arg( buf->numRemainingBytes() ), 4 ); - someHdl = buf->getHandle(); - QgsDebugMsgLevel( QStringLiteral( "base ucs handle: %1.%2 0x%3" ).arg( someHdl.code ).arg( someHdl.size ).arg( someHdl.ref, 0, 16 ), 4 ); + DRW_DBG("Clip bpundary handle: "); DRW_DBGHL(someHdl.code, someHdl.size, someHdl.ref); DRW_DBG("\n"); + if (version == DRW::AC1015) {//2000 only + someHdl = buf->getHandle(); + DRW_DBG("ViewPort ent header: "); DRW_DBGHL(someHdl.code, someHdl.size, someHdl.ref); DRW_DBG("\n"); + } + someHdl = buf->getHandle(); + DRW_DBG("Named ucs handle: "); DRW_DBGHL(someHdl.code, someHdl.size, someHdl.ref); DRW_DBG("\n"); + DRW_DBG("\n Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n"); + someHdl = buf->getHandle(); + DRW_DBG("base ucs handle: "); DRW_DBGHL(someHdl.code, someHdl.size, someHdl.ref); DRW_DBG("\n"); } - if ( version > DRW::AC1018 ) //2007+ - { - someHdl = buf->getHandle(); - QgsDebugMsgLevel( QStringLiteral( "background handle: %1.%2 0x%3" ).arg( someHdl.code ).arg( someHdl.size ).arg( someHdl.ref, 0, 16 ), 4 ); - someHdl = buf->getHandle(); - QgsDebugMsgLevel( QStringLiteral( "visual style handle: %1.%2 0x%3" ).arg( someHdl.code ).arg( someHdl.size ).arg( someHdl.ref, 0, 16 ), 4 ); - someHdl = buf->getHandle(); - QgsDebugMsgLevel( QStringLiteral( "shadeplot id handle: %1.%2 0x%3" ).arg( someHdl.code ).arg( someHdl.size ).arg( someHdl.ref, 0, 16 ), 4 ); - QgsDebugMsgLevel( QStringLiteral( "Remaining bytes: %1" ).arg( buf->numRemainingBytes() ), 4 ); - someHdl = buf->getHandle(); - QgsDebugMsgLevel( QStringLiteral( "SUN handle: %1.%2 0x%3" ).arg( someHdl.code ).arg( someHdl.size ).arg( someHdl.ref, 0, 16 ), 4 ); + if (version > DRW::AC1018) {//2007+ + someHdl = buf->getHandle(); + DRW_DBG("background handle: "); DRW_DBGHL(someHdl.code, someHdl.size, someHdl.ref); DRW_DBG("\n"); + someHdl = buf->getHandle(); + DRW_DBG("visual style handle: "); DRW_DBGHL(someHdl.code, someHdl.size, someHdl.ref); DRW_DBG("\n"); + someHdl = buf->getHandle(); + DRW_DBG("shadeplot ID handle: "); DRW_DBGHL(someHdl.code, someHdl.size, someHdl.ref); DRW_DBG("\n"); + DRW_DBG("\n Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n"); + someHdl = buf->getHandle(); + DRW_DBG("SUN handle: "); DRW_DBGHL(someHdl.code, someHdl.size, someHdl.ref); DRW_DBG("\n"); } + DRW_DBG("\n Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n"); - QgsDebugMsgLevel( QStringLiteral( "Remaining bytes: %1" ).arg( buf->numRemainingBytes() ), 4 ); - - if ( !ret ) - return ret; - + if (!ret) + return ret; return buf->isGood(); } diff --git a/external/libdxfrw/drw_entities.h b/external/libdxfrw/drw_entities.h index ae6d11ecc07..3ce67d56e3e 100644 --- a/external/libdxfrw/drw_entities.h +++ b/external/libdxfrw/drw_entities.h @@ -17,6 +17,7 @@ #include #include #include +#include #include "drw_base.h" class dxfReader; @@ -170,25 +171,18 @@ class DRW_Entity , numReactors( e.numReactors ) , curr( nullptr ) { - for ( std::vector::const_iterator it = e.extData.begin(); it != e.extData.end(); ++it ) + for ( auto it = e.extData.begin(); it != e.extData.end(); ++it ) { - extData.push_back( new DRW_Variant( *( *it ) ) ); + extData.push_back( std::make_shared( *( *it ) ) ); } } - virtual ~DRW_Entity() - { - for ( std::vector::iterator it = extData.begin(); it != extData.end(); ++it ) - delete *it; - - extData.clear(); - } + virtual ~DRW_Entity() = default; void reset() { - for ( std::vector::iterator it = extData.begin(); it != extData.end(); ++it ) - delete *it; extData.clear(); + curr.reset(); } virtual void applyExtrusion() = 0; @@ -230,7 +224,7 @@ class DRW_Entity int plotStyle; //!< Hard pointer id to plot style object, code 390 DRW::ShadowMode shadow; //!< Shadow mode, code 284 bool haveExtrusion; //!< Set to true if the entity have extrusion - std::vector extData; //!< FIFO list of extended data, codes 1000 to 1071 + std::vector> extData; /*!< FIFO list of extended data, codes 1000 to 1071*/ protected: //only for read dwg duint8 haveNextLinks; // aka nolinks //B @@ -252,7 +246,7 @@ class DRW_Entity private: DRW_Coord extAxisX; DRW_Coord extAxisY; - DRW_Variant *curr = nullptr; + std::shared_ptr curr; }; @@ -349,7 +343,7 @@ class DRW_Circle : public DRW_Point public: DRW_Circle( enum DRW::ETYPE type = DRW::CIRCLE ) : DRW_Point( type ) - , mRadius( 0. ) + , radius( 0. ) { } @@ -360,7 +354,7 @@ class DRW_Circle : public DRW_Point virtual bool parseDwg( DRW::Version version, dwgBuffer *buf, duint32 bs = 0 ); public: - double mRadius; //!< Radius, code 40 + double radius; //!< Radius, code 40 }; /** @@ -384,7 +378,7 @@ class DRW_Arc : public DRW_Circle //! center point in OCS const DRW_Coord ¢er() { return basePoint; } //! the radius of the circle - double radius() { return mRadius; } + double getRadius() { return radius; } //! start angle in radians double startAngle() { return staangle; } //! end angle in radians @@ -458,7 +452,7 @@ class DRW_Trace : public DRW_Line DRW_Trace( enum DRW::ETYPE type = DRW::TRACE ) : DRW_Line( type ) , thirdPoint( 0., 0., 0. ) - , fourthPoint( 0., 0., 0. ) + , forthPoint( 0., 0., 0. ) { } @@ -470,7 +464,7 @@ class DRW_Trace : public DRW_Line public: DRW_Coord thirdPoint; //!< Third point, code 12, 22 & 32 - DRW_Coord fourthPoint; //!< Four point, code 13, 23 & 33 + DRW_Coord forthPoint; //!< Four point, code 13, 23 & 33 }; /** @@ -544,7 +538,7 @@ class DRW_3Dface : public DRW_Trace //! third corner in WCS const DRW_Coord &thirdCorner() { return thirdPoint; } //! fourth corner in WCS - const DRW_Coord &fourthCorner() { return fourthPoint; } + const DRW_Coord &fourthCorner() { return forthPoint; } //! edge visibility flags InvisibleEdgeFlags edgeFlags() { return ( InvisibleEdgeFlags )invisibleflag; } @@ -661,36 +655,25 @@ class DRW_LWPolyline : public DRW_Entity , extPoint( p.extPoint ) , vertex( nullptr ) { - for ( unsigned i = 0; i < p.vertlist.size(); i++ )// RLZ ok or new - vertlist.push_back( new DRW_Vertex2D( *( p.vertlist.at( i ) ) ) ); + for (unsigned i=0; ivertlist.push_back( + std::make_shared(*p.vertlist.at(i)) + ); } - ~DRW_LWPolyline() - { - while ( !vertlist.empty() ) - { - vertlist.pop_back(); - } - } virtual void applyExtrusion(); void addVertex( DRW_Vertex2D v ) { - DRW_Vertex2D *vert = new DRW_Vertex2D(); - vert->x = v.x; - vert->y = v.y; - vert->stawidth = v.stawidth; - vert->endwidth = v.endwidth; - vert->bulge = v.bulge; - vertlist.push_back( vert ); + std::shared_ptr vert = std::make_shared(v); + vertlist.push_back(vert); } - DRW_Vertex2D *addVertex() - { - DRW_Vertex2D *vert = new DRW_Vertex2D(); - vert->stawidth = 0; - vert->endwidth = 0; - vert->bulge = 0; - vertlist.push_back( vert ); - return vert; + std::shared_ptr addVertex () { + std::shared_ptr vert = std::make_shared(); + vert->stawidth = 0; + vert->endwidth = 0; + vert->bulge = 0; + vertlist.push_back(vert); + return vert; } protected: @@ -698,14 +681,14 @@ class DRW_LWPolyline : public DRW_Entity bool parseDwg( DRW::Version v, dwgBuffer *buf, duint32 bs = 0 ); public: - std::vector::size_type vertexnum; //!< Number of vertices, code 90 + int vertexnum; //!< Number of vertices, code 90 int flags; //!< Polyline flag, code 70, default 0 double width; //!< Constant width, code 43 double elevation; //!< Elevation, code 38 double thickness; //!< Thickness, code 39 DRW_Coord extPoint; //!< Dir extrusion normal vector, code 210, 220 & 230 - DRW_Vertex2D *vertex; //!< Current vertex to add data - std::vector vertlist; //!< Vertex list + std::shared_ptr vertex; /*!< current vertex to add data */ + std::vector> vertlist; /*!< vertex list */ }; /** @@ -934,7 +917,7 @@ class DRW_Polyline : public DRW_Point std::vector vertlist; //!< Vertex list private: - std::list handleList; // list of handles, only in 2004+ + std::list handlesList; // list of handles, only in 2004+ duint32 firstEH; // handle of first entity, only in pre-2004 duint32 lastEH; // handle of last entity, only in pre-2004 dwgHandle seqEndH; // handle of SEQEND entity @@ -963,17 +946,7 @@ class DRW_Spline : public DRW_Entity , fitpoint( nullptr ) { } - ~DRW_Spline() - { - while ( !controllist.empty() ) - { - controllist.pop_back(); - } - while ( !fitlist.empty() ) - { - fitlist.pop_back(); - } - } + virtual void applyExtrusion() {} protected: @@ -1003,12 +976,13 @@ class DRW_Spline : public DRW_Entity double tolfit; //!< Fit point tolerance, code 44, default 0.0000001 std::vector knotslist; //!< Knots list, code 40 - std::vector controllist; //!< Control points list, code 10, 20 & 30 - std::vector fitlist; //!< Fit points list, code 11, 21 & 31 + std::vector weightlist; /*!< weight list, code 41 */ + std::vector> controllist; /*!< control points list, code 10, 20 & 30 */ + std::vector> fitlist; /*!< fit points list, code 11, 21 & 31 */ private: - DRW_Coord *controlpoint; //!< Current control point to add data - DRW_Coord *fitpoint; //!< Current fit point to add data + std::shared_ptr controlpoint; /*!< current control point to add data */ + std::shared_ptr fitpoint; /*!< current fit point to add data */ }; /** @@ -1024,20 +998,6 @@ class DRW_HatchLoop { } - ~DRW_HatchLoop() - { -#if 0 - while ( !pollist.empty() ) - { - pollist.pop_back(); - } -#endif - while ( !objlist.empty() ) - { - objlist.pop_back(); - } - } - void update() { numedges = objlist.size(); @@ -1048,7 +1008,7 @@ class DRW_HatchLoop std::vector::size_type numedges; //!< Number of edges (if not a polyline), code 93 //TODO: store lwpolylines as entities // std::vector pollist; //!< Polyline list - std::vector objlist; //!< Entities list + std::vector> objlist; /*!< entities list */ }; /** @@ -1076,17 +1036,8 @@ class DRW_Hatch : public DRW_Point clearEntities(); } - ~DRW_Hatch() - { - while ( !looplist.empty() ) - { - looplist.pop_back(); - } - } - - void appendLoop( DRW_HatchLoop *v ) - { - looplist.push_back( v ); + void appendLoop (std::shared_ptr const& v) { + looplist.push_back(v); } virtual void applyExtrusion() {} @@ -1102,12 +1053,12 @@ class DRW_Hatch : public DRW_Point int hstyle; //!< Hatch style, code 75 int hpattern; //!< Hatch pattern type, code 76 int doubleflag; //!< Hatch pattern double flag, code 77, double=1, single=0 - std::vector::size_type loopsnum; //!< Number of boundary paths (loops), code 91 + int loopsnum; //!< Number of boundary paths (loops), code 91 double angle; //!< Hatch pattern angle, code 52 double scale; //!< Hatch pattern scale, code 41 int deflines; //!< Number of pattern definition lines, code 78 - std::vector looplist; //!< Polyline list + std::vector> looplist; /*!< polyline list */ private: void clearEntities() @@ -1122,53 +1073,48 @@ class DRW_Hatch : public DRW_Point void addLine() { - clearEntities(); - if ( loop ) - { - pt = line = new DRW_Line; - loop->objlist.push_back( line ); - } + clearEntities(); + if (loop) { + pt = line = std::make_shared(); + loop->objlist.push_back(line); + } } void addArc() { - clearEntities(); - if ( loop ) - { - pt = arc = new DRW_Arc; - loop->objlist.push_back( arc ); - } + clearEntities(); + if (loop) { + pt = arc = std::make_shared(); + loop->objlist.push_back(arc); + } } void addEllipse() { - clearEntities(); - if ( loop ) - { - pt = ellipse = new DRW_Ellipse; - loop->objlist.push_back( ellipse ); - } + clearEntities(); + if (loop) { + pt = ellipse = std::make_shared(); + loop->objlist.push_back(ellipse); + } } void addSpline() { - clearEntities(); - if ( loop ) - { - pt = nullptr; - spline = new DRW_Spline; - loop->objlist.push_back( spline ); - } + clearEntities(); + if (loop) { + pt.reset(); + spline = std::make_shared(); + loop->objlist.push_back(spline); + } } - - DRW_HatchLoop *loop; //!< Current loop to add data - DRW_Line *line = nullptr; - DRW_Arc *arc = nullptr; - DRW_Ellipse *ellipse = nullptr; - DRW_Spline *spline = nullptr; - DRW_LWPolyline *pline = nullptr; - DRW_Point *pt = nullptr; - DRW_Vertex2D *plvert = nullptr; + std::shared_ptr loop; /*!< current loop to add data */ + std::shared_ptr line; + std::shared_ptr arc; + std::shared_ptr ellipse; + std::shared_ptr spline; + std::shared_ptr pline; + std::shared_ptr pt; + std::shared_ptr plvert; bool ispol; }; @@ -1578,14 +1524,6 @@ class DRW_Leader : public DRW_Entity { } - ~DRW_Leader() - { - while ( !vertexlist.empty() ) - { - vertexlist.pop_back(); - } - } - virtual void applyExtrusion() {} protected: @@ -1609,10 +1547,10 @@ class DRW_Leader : public DRW_Entity DRW_Coord offsetblock; //!< Offset of last leader vertex from block, code 212, 222 & 232 DRW_Coord offsettext; //!< Offset of last leader vertex from annotation, code 213, 223 & 233 - std::vector vertexlist; //!< Vertex points list, code 10, 20 & 30 + std::vector> vertexlist; /*!< vertex points list, code 10, 20 & 30 */ private: - DRW_Coord *vertexpoint; //!< Current control point to add data + std::shared_ptr vertexpoint; /*!< current control point to add data */ dwgHandle dimStyleH; dwgHandle AnnotH; }; diff --git a/external/libdxfrw/drw_objects.cpp b/external/libdxfrw/drw_objects.cpp index c45d3b050b5..fd867cadf03 100644 --- a/external/libdxfrw/drw_objects.cpp +++ b/external/libdxfrw/drw_objects.cpp @@ -10,9 +10,6 @@ ** along with this program. If not, see . ** ******************************************************************************/ -// uncomment to get detailed debug output on DWG read. Caution: this option makes DWG import super-slow! -// #define DWGDEBUG 1 - #include #include @@ -23,23 +20,11 @@ #include "intern/drw_dbg.h" #include "intern/dwgutil.h" -#include - -#include "qgslogger.h" - -#ifndef DWGDEBUG -#undef QgsDebugCall -#undef QgsDebugMsg -#undef QgsDebugMsgLevel -#define QgsDebugCall -#define QgsDebugMsg(str) -#define QgsDebugMsgLevel(str, level) -#endif #define RESERVE( vector, size ) try { \ vector.reserve(size); \ } catch(const std::exception &e) { \ - QgsDebugMsg( QString( "allocation exception (size=%1; error=%2)" ).arg( size ).arg( e.what() ) ); \ + /* QgsDebugMsg( QString( "allocation exception (size=%1; error=%2)" ).arg( size ).arg( e.what() ) );*/ \ throw e; \ } @@ -47,183 +32,153 @@ * Base class for tables entries * @author Rallaz */ -void DRW_TableEntry::parseCode( int code, dxfReader *reader ) -{ - switch ( code ) - { +void DRW_TableEntry::parseCode(int code, dxfReader *reader){ + switch (code) { case 5: - handle = reader->getHandleString(); - break; + handle = reader->getHandleString(); + break; case 330: - parentHandle = reader->getHandleString(); - break; + parentHandle = reader->getHandleString(); + break; case 2: - name = reader->getUtf8String(); - break; + name = reader->getUtf8String(); + break; case 70: - flags = reader->getInt32(); - break; + flags = reader->getInt32(); + break; case 1000: case 1001: case 1002: case 1003: case 1004: case 1005: - extData.push_back( new DRW_Variant( code, reader->getString() ) ); - break; + extData.push_back(new DRW_Variant(code, reader->getString())); + break; case 1010: case 1011: case 1012: case 1013: - curr = new DRW_Variant( code, DRW_Coord( reader->getDouble(), 0.0, 0.0 ) ); - extData.push_back( curr ); - break; + curr = new DRW_Variant(code, DRW_Coord(reader->getDouble(), 0.0, 0.0)); + extData.push_back(curr); + break; case 1020: case 1021: case 1022: case 1023: - if ( curr ) - curr->setCoordY( reader->getDouble() ); - break; + if (curr) + curr->setCoordY(reader->getDouble()); + break; case 1030: case 1031: case 1032: case 1033: - if ( curr ) - curr->setCoordZ( reader->getDouble() ); - curr = nullptr; - break; + if (curr) + curr->setCoordZ(reader->getDouble()); + curr=NULL; + break; case 1040: case 1041: case 1042: - extData.push_back( new DRW_Variant( code, reader->getDouble() ) ); - break; + extData.push_back(new DRW_Variant(code, reader->getDouble())); + break; case 1070: case 1071: - extData.push_back( new DRW_Variant( code, reader->getInt32() ) ); - break; + extData.push_back(new DRW_Variant(code, reader->getInt32() )); + break; default: - break; - } + break; + } } -bool DRW_TableEntry::parseDwg( DRW::Version version, dwgBuffer *buf, dwgBuffer *strBuf, duint32 bs ) -{ - QgsDebugMsg( "***************************** parsing table entry *********************************************" ); - - objSize = 0; - oType = buf->getObjType( version ); - QgsDebugMsg( QString( "Object type: %1, 0x%2" ).arg( oType ).arg( oType, 0, 16 ) ); - - if ( version > DRW::AC1014 && version < DRW::AC1024 ) //2000 to 2007 - { - objSize = buf->getRawLong32(); //RL 32bits object size in bits - QgsDebugMsg( QString( "Object size: %1" ).arg( objSize ) ); - } - if ( version > DRW::AC1021 ) //2010+ - { - duint32 ms = buf->size(); - objSize = ms * 8 - bs; - QgsDebugMsg( QString( "Object size: %1" ).arg( objSize ) ); - } - if ( strBuf && version > DRW::AC1018 ) //2007+ - { - strBuf->moveBitPos( objSize - 1 ); - QgsDebugMsg( QString( "strBuf strbit pos 2007: %1; strBuf bpos 2007:%2" ).arg( strBuf->getPosition() ).arg( strBuf->getBitPos() ) ); - - if ( strBuf->getBit() == 1 ) - { - QgsDebugMsg( "string bit is 1" ); - strBuf->moveBitPos( -17 ); - duint16 strDataSize = strBuf->getRawShort16(); - QgsDebugMsg( QString( "string strDataSize: 0x%1" ).arg( strDataSize, 0, 16 ) ); - - if ( ( strDataSize & 0x8000 ) == 0x8000 ) - { - QgsDebugMsg( "string 0x8000 bit is set" ); - strBuf->moveBitPos( -33 );//RLZ pending to verify - duint16 hiSize = strBuf->getRawShort16(); - strDataSize = ( ( strDataSize & 0x7fff ) | ( hiSize << 15 ) ); - } - strBuf->moveBitPos( -strDataSize - 16 ); //-14 - - QgsDebugMsg( QString( "strBuf strbit pos 2007: %1; strBuf bpos 2007:%2" ).arg( strBuf->getPosition() ).arg( strBuf->getBitPos() ) ); +bool DRW_TableEntry::parseDwg(DRW::Version version, dwgBuffer *buf, dwgBuffer *strBuf, duint32 bs){ +DRW_DBG("\n***************************** parsing table entry *********************************************\n"); + objSize=0; + oType = buf->getObjType(version); + DRW_DBG("Object type: "); DRW_DBG(oType); DRW_DBG(", "); DRW_DBGH(oType); + if (version > DRW::AC1014 && version < DRW::AC1024) {//2000 to 2007 + objSize = buf->getRawLong32(); //RL 32bits object size in bits + DRW_DBG(" Object size: "); DRW_DBG(objSize); DRW_DBG("\n"); } - else - { - QgsDebugMsg( "string bit is 0" ); + if (version > DRW::AC1021) {//2010+ + duint32 ms = buf->size(); + objSize = ms*8 - bs; + DRW_DBG(" Object size: "); DRW_DBG(objSize); DRW_DBG("\n"); + } + if (strBuf != NULL && version > DRW::AC1018) {//2007+ + strBuf->moveBitPos(objSize-1); + DRW_DBG(" strBuf strbit pos 2007: "); DRW_DBG(strBuf->getPosition()); DRW_DBG(" strBuf bpos 2007: "); DRW_DBG(strBuf->getBitPos()); DRW_DBG("\n"); + if (strBuf->getBit() == 1){ + DRW_DBG("DRW_TableEntry::parseDwg string bit is 1\n"); + strBuf->moveBitPos(-17); + duint16 strDataSize = strBuf->getRawShort16(); + DRW_DBG("\nDRW_TableEntry::parseDwg string strDataSize: "); DRW_DBGH(strDataSize); DRW_DBG("\n"); + if ( (strDataSize& 0x8000) == 0x8000){ + DRW_DBG("\nDRW_TableEntry::parseDwg string 0x8000 bit is set"); + strBuf->moveBitPos(-33);//RLZ pending to verify + duint16 hiSize = strBuf->getRawShort16(); + strDataSize = ((strDataSize&0x7fff) | (hiSize<<15)); + } + strBuf->moveBitPos( -strDataSize -16); //-14 + DRW_DBG("strBuf start strDataSize pos 2007: "); DRW_DBG(strBuf->getPosition()); DRW_DBG(" strBuf bpos 2007: "); DRW_DBG(strBuf->getBitPos()); DRW_DBG("\n"); + } else + DRW_DBG("\nDRW_TableEntry::parseDwg string bit is 0"); + DRW_DBG("strBuf start pos 2007: "); DRW_DBG(strBuf->getPosition()); DRW_DBG(" strBuf bpos 2007: "); DRW_DBG(strBuf->getBitPos()); DRW_DBG("\n"); } - QgsDebugMsg( QString( "strBuf start pos 2007: %1; strBuf bpos 2007:%2" ).arg( strBuf->getPosition() ).arg( strBuf->getBitPos() ) ); - } - - dwgHandle ho = buf->getHandle(); - handle = ho.ref; - QgsDebugMsg( QString( "TableEntry Handle: %1.%2 0x%3" ).arg( ho.code ).arg( ho.size ).arg( ho.ref, 0, 16 ) ); - - dint16 extDataSize = buf->getBitShort(); //BS - QgsDebugMsg( QString( " ext data size: %1" ).arg( extDataSize ) ); - while ( extDataSize > 0 && buf->isGood() ) - { - /* RLZ: TODO */ - dwgHandle ah = buf->getHandle(); - QgsDebugMsg( QString( "App Handle: %1.%2 0x%3" ).arg( ah.code ).arg( ah.size ).arg( ah.ref, 0, 16 ) ); - duint8 *tmpExtData = new duint8[extDataSize]; - buf->getBytes( tmpExtData, extDataSize ); - dwgBuffer tmpExtDataBuf( tmpExtData, extDataSize, buf->decoder ); - int pos = tmpExtDataBuf.getPosition(); - int bpos = tmpExtDataBuf.getBitPos(); - QgsDebugMsg( QString( "ext data pos:%1.%2" ).arg( pos ).arg( bpos ) ); - Q_UNUSED( pos ); - Q_UNUSED( bpos ); - duint8 dxfCode = tmpExtDataBuf.getRawChar8(); - QgsDebugMsg( QString( "dxfCode:%1" ).arg( dxfCode ) ); - Q_UNUSED( dxfCode ); - switch ( dxfCode ) - { - case 0: - { - duint8 strLength = tmpExtDataBuf.getRawChar8(); - QgsDebugMsg( QString( "strLength:%1" ).arg( strLength ) ); - duint16 cp = tmpExtDataBuf.getBERawShort16(); - QgsDebugMsg( QString( "str codepage:%1" ).arg( cp ) ); - Q_UNUSED( cp ); - for ( int i = 0; i < strLength + 1; i++ ) //string length + null terminating char - { - duint8 dxfChar = tmpExtDataBuf.getRawChar8(); - QgsDebugMsg( QString( " dxfChar:%1" ).arg( dxfChar ) ); - Q_UNUSED( dxfChar ); - } - break; - } - default: + dwgHandle ho = buf->getHandle(); + handle = ho.ref; + DRW_DBG("TableEntry Handle: "); DRW_DBGHL(ho.code, ho.size, ho.ref); + dint16 extDataSize = buf->getBitShort(); //BS + DRW_DBG(" ext data size: "); DRW_DBG(extDataSize); + while (extDataSize>0 && buf->isGood()) { /* RLZ: TODO */ - break; + dwgHandle ah = buf->getHandle(); + DRW_DBG("App Handle: "); DRW_DBGHL(ah.code, ah.size, ah.ref); + duint8 *tmpExtData = new duint8[extDataSize]; + buf->getBytes(tmpExtData, extDataSize); + dwgBuffer tmpExtDataBuf(tmpExtData, extDataSize, buf->decoder); + int pos = tmpExtDataBuf.getPosition(); + int bpos = tmpExtDataBuf.getBitPos(); + DRW_DBG("ext data pos: "); DRW_DBG(pos); DRW_DBG("."); DRW_DBG(bpos); DRW_DBG("\n"); + duint8 dxfCode = tmpExtDataBuf.getRawChar8(); + DRW_DBG(" dxfCode: "); DRW_DBG(dxfCode); + switch (dxfCode){ + case 0:{ + duint8 strLength = tmpExtDataBuf.getRawChar8(); + DRW_DBG(" strLength: "); DRW_DBG(strLength); + duint16 cp = tmpExtDataBuf.getBERawShort16(); + DRW_DBG(" str codepage: "); DRW_DBG(cp); + for (int i=0;i< strLength+1;i++) {//string length + null terminating char + duint8 dxfChar = tmpExtDataBuf.getRawChar8(); + DRW_DBG(" dxfChar: "); DRW_DBG(dxfChar); + } + break; + } + default: + /* RLZ: TODO */ + break; + } + DRW_DBG("ext data pos: "); DRW_DBG(tmpExtDataBuf.getPosition()); DRW_DBG("."); DRW_DBG(tmpExtDataBuf.getBitPos()); DRW_DBG("\n"); + delete[]tmpExtData; + extDataSize = buf->getBitShort(); //BS + DRW_DBG(" ext data size: "); DRW_DBG(extDataSize); + } //end parsing extData (EED) + if (version < DRW::AC1015) {//14- + objSize = buf->getRawLong32(); //RL 32bits size in bits } - QgsDebugMsg( QString( "ext data pos:%1.%2" ).arg( tmpExtDataBuf.getPosition() ).arg( tmpExtDataBuf.getBitPos() ) ); - delete[]tmpExtData; - extDataSize = buf->getBitShort(); //BS - QgsDebugMsg( QString( " ext data size:%1" ).arg( extDataSize ) ); - } //end parsing extData (EED) - if ( version < DRW::AC1015 ) //14- - { - objSize = buf->getRawLong32(); //RL 32bits size in bits - } - numReactors = buf->getBitLong(); //BL + DRW_DBG(" objSize in bits: "); DRW_DBG(objSize); - QgsDebugMsg( QString( " objSize in bits size:%1, numReactors:%2" ).arg( objSize ).arg( numReactors ) ); - if ( version > DRW::AC1015 ) //2004+ - { - xDictFlag = buf->getBit(); - QgsDebugMsg( QString( " xDictFlag:%1" ).arg( xDictFlag ) ); - } - if ( version > DRW::AC1024 ) //2013+ - { - duint8 bd = buf->getBit(); - QgsDebugMsg( QString( " Have binary data:%1" ).arg( bd ) ); - Q_UNUSED( bd ); - } - return buf->isGood(); + numReactors = buf->getBitLong(); //BL + DRW_DBG(", numReactors: "); DRW_DBG(numReactors); DRW_DBG("\n"); + if (version > DRW::AC1015) {//2004+ + xDictFlag = buf->getBit(); + DRW_DBG("xDictFlag: "); DRW_DBG(xDictFlag); + } + if (version > DRW::AC1024) {//2013+ + duint8 bd = buf->getBit(); + DRW_DBG(" Have binary data: "); DRW_DBG(bd); DRW_DBG("\n"); + } + return buf->isGood(); } //! Class to handle dimstyle entries @@ -231,243 +186,241 @@ bool DRW_TableEntry::parseDwg( DRW::Version version, dwgBuffer *buf, dwgBuffer * * Class to handle ldim style symbol table entries * @author Rallaz */ -void DRW_Dimstyle::parseCode( int code, dxfReader *reader ) -{ - switch ( code ) - { +void DRW_Dimstyle::parseCode(int code, dxfReader *reader){ + switch (code) { case 105: - handle = reader->getHandleString(); - break; + handle = reader->getHandleString(); + break; case 3: - dimpost = reader->getUtf8String(); - break; + dimpost = reader->getUtf8String(); + break; case 4: - dimapost = reader->getUtf8String(); - break; + dimapost = reader->getUtf8String(); + break; case 5: - dimblk = reader->getUtf8String(); - break; + dimblk = reader->getUtf8String(); + break; case 6: - dimblk1 = reader->getUtf8String(); - break; + dimblk1 = reader->getUtf8String(); + break; case 7: - dimblk2 = reader->getUtf8String(); - break; + dimblk2 = reader->getUtf8String(); + break; case 40: - dimscale = reader->getDouble(); - break; + dimscale = reader->getDouble(); + break; case 41: - dimasz = reader->getDouble(); - break; + dimasz = reader->getDouble(); + break; case 42: - dimexo = reader->getDouble(); - break; + dimexo = reader->getDouble(); + break; case 43: - dimdli = reader->getDouble(); - break; + dimdli = reader->getDouble(); + break; case 44: - dimexe = reader->getDouble(); - break; + dimexe = reader->getDouble(); + break; case 45: - dimrnd = reader->getDouble(); - break; + dimrnd = reader->getDouble(); + break; case 46: - dimdle = reader->getDouble(); - break; + dimdle = reader->getDouble(); + break; case 47: - dimtp = reader->getDouble(); - break; + dimtp = reader->getDouble(); + break; case 48: - dimtm = reader->getDouble(); - break; + dimtm = reader->getDouble(); + break; case 49: - dimfxl = reader->getDouble(); - break; + dimfxl = reader->getDouble(); + break; case 140: - dimtxt = reader->getDouble(); - break; + dimtxt = reader->getDouble(); + break; case 141: - dimcen = reader->getDouble(); - break; + dimcen = reader->getDouble(); + break; case 142: - dimtsz = reader->getDouble(); - break; + dimtsz = reader->getDouble(); + break; case 143: - dimaltf = reader->getDouble(); - break; + dimaltf = reader->getDouble(); + break; case 144: - dimlfac = reader->getDouble(); - break; + dimlfac = reader->getDouble(); + break; case 145: - dimtvp = reader->getDouble(); - break; + dimtvp = reader->getDouble(); + break; case 146: - dimtfac = reader->getDouble(); - break; + dimtfac = reader->getDouble(); + break; case 147: - dimgap = reader->getDouble(); - break; + dimgap = reader->getDouble(); + break; case 148: - dimaltrnd = reader->getDouble(); - break; + dimaltrnd = reader->getDouble(); + break; case 71: - dimtol = reader->getInt32(); - break; + dimtol = reader->getInt32(); + break; case 72: - dimlim = reader->getInt32(); - break; + dimlim = reader->getInt32(); + break; case 73: - dimtih = reader->getInt32(); - break; + dimtih = reader->getInt32(); + break; case 74: - dimtoh = reader->getInt32(); - break; + dimtoh = reader->getInt32(); + break; case 75: - dimse1 = reader->getInt32(); - break; + dimse1 = reader->getInt32(); + break; case 76: - dimse2 = reader->getInt32(); - break; + dimse2 = reader->getInt32(); + break; case 77: - dimtad = reader->getInt32(); - break; + dimtad = reader->getInt32(); + break; case 78: - dimzin = reader->getInt32(); - break; + dimzin = reader->getInt32(); + break; case 79: - dimazin = reader->getInt32(); - break; + dimazin = reader->getInt32(); + break; case 170: - dimalt = reader->getInt32(); - break; + dimalt = reader->getInt32(); + break; case 171: - dimaltd = reader->getInt32(); - break; + dimaltd = reader->getInt32(); + break; case 172: - dimtofl = reader->getInt32(); - break; + dimtofl = reader->getInt32(); + break; case 173: - dimsah = reader->getInt32(); - break; + dimsah = reader->getInt32(); + break; case 174: - dimtix = reader->getInt32(); - break; + dimtix = reader->getInt32(); + break; case 175: - dimsoxd = reader->getInt32(); - break; + dimsoxd = reader->getInt32(); + break; case 176: - dimclrd = reader->getInt32(); - break; + dimclrd = reader->getInt32(); + break; case 177: - dimclre = reader->getInt32(); - break; + dimclre = reader->getInt32(); + break; case 178: - dimclrt = reader->getInt32(); - break; + dimclrt = reader->getInt32(); + break; case 179: - dimadec = reader->getInt32(); - break; + dimadec = reader->getInt32(); + break; case 270: - dimunit = reader->getInt32(); - break; + dimunit = reader->getInt32(); + break; case 271: - dimdec = reader->getInt32(); - break; + dimdec = reader->getInt32(); + break; case 272: - dimtdec = reader->getInt32(); - break; + dimtdec = reader->getInt32(); + break; case 273: - dimaltu = reader->getInt32(); - break; + dimaltu = reader->getInt32(); + break; case 274: - dimalttd = reader->getInt32(); - break; + dimalttd = reader->getInt32(); + break; case 275: - dimaunit = reader->getInt32(); - break; + dimaunit = reader->getInt32(); + break; case 276: - dimfrac = reader->getInt32(); - break; + dimfrac = reader->getInt32(); + break; case 277: - dimlunit = reader->getInt32(); - break; + dimlunit = reader->getInt32(); + break; case 278: - dimdsep = reader->getInt32(); - break; + dimdsep = reader->getInt32(); + break; case 279: - dimtmove = reader->getInt32(); - break; + dimtmove = reader->getInt32(); + break; case 280: - dimjust = reader->getInt32(); - break; + dimjust = reader->getInt32(); + break; case 281: - dimsd1 = reader->getInt32(); - break; + dimsd1 = reader->getInt32(); + break; case 282: - dimsd2 = reader->getInt32(); - break; + dimsd2 = reader->getInt32(); + break; case 283: - dimtolj = reader->getInt32(); - break; + dimtolj = reader->getInt32(); + break; case 284: - dimtzin = reader->getInt32(); - break; + dimtzin = reader->getInt32(); + break; case 285: - dimaltz = reader->getInt32(); - break; + dimaltz = reader->getInt32(); + break; case 286: - dimaltttz = reader->getInt32(); - break; + dimaltttz = reader->getInt32(); + break; case 287: - dimfit = reader->getInt32(); - break; + dimfit = reader->getInt32(); + break; case 288: - dimupt = reader->getInt32(); - break; + dimupt = reader->getInt32(); + break; case 289: - dimatfit = reader->getInt32(); - break; + dimatfit = reader->getInt32(); + break; case 290: - dimfxlon = reader->getInt32(); - break; + dimfxlon = reader->getInt32(); + break; case 340: - dimtxsty = reader->getUtf8String(); - break; + dimtxsty = reader->getUtf8String(); + break; case 341: - dimldrblk = reader->getUtf8String(); - break; + dimldrblk = reader->getUtf8String(); + break; case 342: - dimblk = reader->getUtf8String(); - break; + dimblk = reader->getUtf8String(); + break; case 343: - dimblk1 = reader->getUtf8String(); - break; + dimblk1 = reader->getUtf8String(); + break; case 344: - dimblk2 = reader->getUtf8String(); - break; + dimblk2 = reader->getUtf8String(); + break; default: - DRW_TableEntry::parseCode( code, reader ); - break; - } + DRW_TableEntry::parseCode(code, reader); + break; + } } -bool DRW_Dimstyle::parseDwg( DRW::Version version, dwgBuffer *buf, duint32 bs ) -{ - dwgBuffer sBuff = *buf; - dwgBuffer *sBuf = buf; - if ( version > DRW::AC1018 ) //2007+ - { - sBuf = &sBuff; //separate buffer for strings - } - bool ret = DRW_TableEntry::parseDwg( version, buf, sBuf, bs ); - QgsDebugMsg( "***************************** parsing dimension style **************************************" ); - if ( !ret ) - return ret; - name = sBuf->getVariableText( version, false ); - QgsDebugMsg( QString( "dimension style name: %1; remaining bytes:%2" ).arg( name.c_str() ).arg( buf->numRemainingBytes() ) ); +bool DRW_Dimstyle::parseDwg(DRW::Version version, dwgBuffer *buf, duint32 bs){ + dwgBuffer sBuff = *buf; + dwgBuffer *sBuf = buf; + if (version > DRW::AC1018) {//2007+ + sBuf = &sBuff; //separate buffer for strings + } + bool ret = DRW_TableEntry::parseDwg(version, buf, sBuf, bs); + DRW_DBG("\n***************************** parsing dimension style **************************************\n"); + if (!ret) + return ret; + name = sBuf->getVariableText(version, false); + DRW_DBG("dimension style name: "); DRW_DBG(name.c_str()); DRW_DBG("\n"); - // RS crc; //RS */ - return buf->isGood(); +// handleObj = shpControlH.ref; + DRW_DBG("\n Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n"); + // RS crc; //RS */ + return buf->isGood(); } @@ -476,33 +429,29 @@ bool DRW_Dimstyle::parseDwg( DRW::Version version, dwgBuffer *buf, duint32 bs ) * Class to handle line type symbol table entries * @author Rallaz */ -void DRW_LType::parseCode( int code, dxfReader *reader ) -{ - switch ( code ) - { +void DRW_LType::parseCode(int code, dxfReader *reader){ + switch (code) { case 3: - desc = reader->getUtf8String(); - break; + desc = reader->getUtf8String(); + break; case 73: size = reader->getInt32(); RESERVE( path, size ); break; case 40: - length = reader->getDouble(); - break; + length = reader->getDouble(); + break; case 49: - path.push_back( reader->getDouble() ); - pathIdx++; - break; -#if 0 - case 74: - haveShape = reader->getInt32(); - break; -#endif + path.push_back(reader->getDouble()); + pathIdx++; + break; +/* case 74: + haveShape = reader->getInt32(); + break;*/ default: - DRW_TableEntry::parseCode( code, reader ); - break; - } + DRW_TableEntry::parseCode(code, reader); + break; + } } //! Update line type @@ -511,8 +460,7 @@ void DRW_LType::parseCode( int code, dxfReader *reader ) * @author Rallaz */ /*TODO: control max length permitted */ -void DRW_LType::update() -{ +void DRW_LType::update(){ double d = 0; size = path.size(); for ( std::vector::size_type i = 0; i < size; i++ ) @@ -522,133 +470,105 @@ void DRW_LType::update() length = d; } -bool DRW_LType::parseDwg( DRW::Version version, dwgBuffer *buf, duint32 bs ) -{ - dwgBuffer sBuff = *buf; - dwgBuffer *sBuf = buf; - if ( version > DRW::AC1018 ) //2007+ - { - sBuf = &sBuff; //separate buffer for strings - } - bool ret = DRW_TableEntry::parseDwg( version, buf, sBuf, bs ); - QgsDebugMsg( "***************************** parsing line type *********************************************" ); - if ( !ret ) - return ret; - name = sBuf->getVariableText( version, false ); - flags = buf->getBit() << 6; - - QgsDebugMsg( QString( "linetype name: %1; flags: 0x%2" ).arg( name.c_str() ).arg( flags, 0, 16 ) ); - - if ( version > DRW::AC1018 ) //2007+ - { - } - else //2004- //RLZ: verify in 2004, 2010 &2013 - { - dint16 xrefindex = buf->getBitShort(); - QgsDebugMsg( QString( "xrefindex: %1" ).arg( xrefindex ) ); - Q_UNUSED( xrefindex ); - } - - duint8 xdep = buf->getBit(); - flags |= xdep << 4; - desc = sBuf->getVariableText( version, false ); - length = buf->getBitDouble(); - char align = buf->getRawChar8(); - size = buf->getRawChar8(); - - QgsDebugMsg( QString( "xdep: %1; flags:0x%2; desc:%3; pattern length:%4 align:%5; num dashes, size %6" ) - .arg( xdep ).arg( flags, 0, 16 ).arg( desc.c_str() ).arg( length ).arg( align ).arg( size ) - ); - Q_UNUSED( xdep ); - Q_UNUSED( align ); - - bool haveStrArea = false; +bool DRW_LType::parseDwg(DRW::Version version, dwgBuffer *buf, duint32 bs){ + dwgBuffer sBuff = *buf; + dwgBuffer *sBuf = buf; + if (version > DRW::AC1018) {//2007+ + sBuf = &sBuff; //separate buffer for strings + } + bool ret = DRW_TableEntry::parseDwg(version, buf, sBuf, bs); + DRW_DBG("\n***************************** parsing line type *********************************************\n"); + if (!ret) + return ret; + name = sBuf->getVariableText(version, false); + DRW_DBG("linetype name: "); DRW_DBG(name.c_str()); DRW_DBG("\n"); + flags = buf->getBit()<< 6; + DRW_DBG("flags: "); DRW_DBG(flags); + if (version > DRW::AC1018) {//2007+ + } else {//2004- //RLZ: verify in 2004, 2010 &2013 + dint16 xrefindex = buf->getBitShort(); + DRW_DBG(" xrefindex: "); DRW_DBG(xrefindex); + } + duint8 xdep = buf->getBit(); + DRW_DBG(" xdep: "); DRW_DBG(xdep); + flags |= xdep<< 4; + DRW_DBG(" flags: "); DRW_DBG(flags); + desc = sBuf->getVariableText(version, false); + DRW_DBG(" desc: "); DRW_DBG(desc.c_str()); + length = buf->getBitDouble(); + DRW_DBG(" pattern length: "); DRW_DBG(length); + char align = buf->getRawChar8(); + DRW_DBG(" align: "); DRW_DBG(std::string(&align, 1)); + size = buf->getRawChar8(); + DRW_DBG(" num dashes, size: "); DRW_DBG(size); + DRW_DBG("\n dashes:\n"); + bool haveStrArea = false; for ( std::vector::size_type i = 0; i < size; i++ ) { - path.push_back( buf->getBitDouble() ); - /*int bs1 =*/ - buf->getBitShort(); - /*double d1= */ - buf->getRawDouble(); - /*double d2=*/ - buf->getRawDouble(); - /*double d3= */ - buf->getBitDouble(); - /*double d4= */ - buf->getBitDouble(); - int bs2 = buf->getBitShort(); - if ( ( bs2 & 2 ) != 0 ) haveStrArea = true; + path.push_back(buf->getBitDouble()); + /*int bs1 =*/ buf->getBitShort(); + /*double d1= */buf->getRawDouble(); + /*double d2=*/ buf->getRawDouble(); + /*double d3= */buf->getBitDouble(); + /*double d4= */buf->getBitDouble(); + int bs2 = buf->getBitShort(); + if((bs2 & 2) !=0) haveStrArea = true; + } + for (unsigned i=0; inumRemainingBytes()); DRW_DBG("\n"); + if (version < DRW::AC1021) { //2004- + duint8 strarea[256]; + buf->getBytes(strarea, 256); + DRW_DBG("string area 256 bytes:\n"); DRW_DBG(reinterpret_cast(strarea)); DRW_DBG("\n"); + } else { //2007+ + //first verify flag + if (haveStrArea) { + duint8 strarea[512]; + buf->getBytes(strarea, 512); + DRW_DBG("string area 512 bytes:\n"); DRW_DBG(reinterpret_cast(strarea)); DRW_DBG("\n"); + } else + DRW_DBG("string area 512 bytes not present\n"); } - QStringList l; - for ( unsigned i = 0; i < path.size() ; i++ ) - { - l << QString::number( path[i] ); + if (version > DRW::AC1021) {//2007+ skip string area + DRW_DBG(" ltype end of object data pos 2010: "); DRW_DBG(buf->getPosition()); DRW_DBG(" strBuf bpos 2007: "); DRW_DBG(buf->getBitPos()); DRW_DBG("\n"); } - QgsDebugMsg( QString( "path=%1 rem:%2" ).arg( l.join( " " ) ).arg( buf->numRemainingBytes() ) ); - - if ( version < DRW::AC1021 ) //2004- - { - duint8 strarea[256]; - buf->getBytes( strarea, 256 ); - QgsDebugMsg( QString( "string area 256 bytes:\n%1" ).arg( reinterpret_cast( strarea ) ) ); - } - else //2007+ - { - //first verify flag - if ( haveStrArea ) - { - duint8 strarea[512]; - buf->getBytes( strarea, 512 ); - QgsDebugMsg( QString( "string area 256 bytes:\n%1" ).arg( reinterpret_cast( strarea ) ) ); - } - else - { - QgsDebugMsg( "string area 512 bytes not present" ); - } + if (version > DRW::AC1018) {//2007+ skip string area + buf->setPosition(objSize >> 3); + buf->setBitPos(objSize & 7); } - if ( version > DRW::AC1021 ) //2007+ skip string area - { - QgsDebugMsgLevel( QString( "ltype end of object data pos 2010: %1; strBuf bpos 2007:%2" ).arg( buf->getPosition() ).arg( buf->getBitPos() ), 4 ); - } - - if ( version > DRW::AC1018 ) //2007+ skip string area - { - buf->setPosition( objSize >> 3 ); - buf->setBitPos( objSize & 7 ); - } - - if ( version > DRW::AC1021 ) //2007+ skip string area - { - QgsDebugMsgLevel( QString( "ltype start of handle data pos 2010: %1; strBuf bpos 2007:%2" ).arg( buf->getPosition() ).arg( buf->getBitPos() ), 4 ); + if (version > DRW::AC1021) {//2007+ skip string area + DRW_DBG(" ltype start of handles data pos 2010: "); DRW_DBG(buf->getPosition()); DRW_DBG(" strBuf bpos 2007: "); DRW_DBG(buf->getBitPos()); DRW_DBG("\n"); } + DRW_DBG("\n Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n"); dwgHandle ltControlH = buf->getHandle(); - QgsDebugMsgLevel( QString( "line type control handle: %1.%2 0x%3; rem:%4" ) - .arg( ltControlH.code ).arg( ltControlH.size ).arg( ltControlH.ref, 0, 16 ).arg( buf->numRemainingBytes() ), 4 ); + DRW_DBG("linetype control Handle: "); DRW_DBGHL(ltControlH.code, ltControlH.size, ltControlH.ref); parentHandle = ltControlH.ref; - - for ( int i = 0; i < numReactors; ++i ) - { - dwgHandle reactorsH = buf->getHandle(); - QgsDebugMsgLevel( QString( "reactorsH control handle: %1.%2 0x%3" ).arg( reactorsH.code ).arg( reactorsH.size ).arg( reactorsH.ref, 0, 16 ), 4 ); + DRW_DBG("\n Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n"); + for (int i=0; i< numReactors;++i) { + dwgHandle reactorsH = buf->getHandle(); + DRW_DBG(" reactorsH control Handle: "); DRW_DBGHL(reactorsH.code, reactorsH.size, reactorsH.ref); DRW_DBG("\n"); } - if ( xDictFlag != 1 ) //linetype in 2004 seems not have XDicObjH or NULL handle - { - dwgHandle XDicObjH = buf->getHandle(); - QgsDebugMsg( QString( "XDicObjH control handle: %1.%2 0x%3 rem:%4" ).arg( XDicObjH.code ).arg( XDicObjH.size ).arg( XDicObjH.ref, 0, 16 ).arg( buf->numRemainingBytes() ) ); + if (xDictFlag !=1){//linetype in 2004 seems not have XDicObjH or NULL handle + dwgHandle XDicObjH = buf->getHandle(); + DRW_DBG(" XDicObj control Handle: "); DRW_DBGHL(XDicObjH.code, XDicObjH.size, XDicObjH.ref); DRW_DBG("\n"); + DRW_DBG("\n Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n"); } - if ( size > 0 ) - { - dwgHandle XRefH = buf->getHandle(); - QgsDebugMsg( QString( "XRefH control handle: %1.%2 0x%3" ).arg( XRefH.code ).arg( XRefH.size ).arg( XRefH.ref, 0, 16 ) ); - dwgHandle shpHandle = buf->getHandle(); - QgsDebugMsg( QString( "shapeFile handle: %1.%2 0x%3; rem:%4" ).arg( shpHandle.code ).arg( shpHandle.size ).arg( shpHandle.ref, 0, 16 ).arg( buf->numRemainingBytes() ) ); + if(size>0){ + dwgHandle XRefH = buf->getHandle(); + DRW_DBG(" XRefH control Handle: "); DRW_DBGHL(XRefH.code, XRefH.size, XRefH.ref); DRW_DBG("\n"); + dwgHandle shpHandle = buf->getHandle(); + DRW_DBG(" shapeFile Handle: "); DRW_DBGHL(shpHandle.code, shpHandle.size, shpHandle.ref); + DRW_DBG("\n Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n"); } dwgHandle shpHandle = buf->getHandle(); - QgsDebugMsg( QString( "shapeFile +1 handle ??: %1.%2 0x%3; rem:%4" ).arg( shpHandle.code ).arg( shpHandle.size ).arg( shpHandle.ref, 0, 16 ).arg( buf->numRemainingBytes() ) ); + DRW_DBG(" shapeFile +1 Handle ??: "); DRW_DBGHL(shpHandle.code, shpHandle.size, shpHandle.ref); DRW_DBG("\n"); + DRW_DBG("\n Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n"); // RS crc; //RS */ return buf->isGood(); } @@ -658,29 +578,27 @@ bool DRW_LType::parseDwg( DRW::Version version, dwgBuffer *buf, duint32 bs ) * Class to handle layer symbol table entries * @author Rallaz */ -void DRW_Layer::parseCode( int code, dxfReader *reader ) -{ - switch ( code ) - { - case 6: +void DRW_Layer::parseCode(int code, dxfReader *reader){ + switch (code) { + case 6: lineType = reader->getUtf8String(); break; - case 62: + case 62: color = reader->getInt32(); break; - case 290: + case 290: plotF = reader->getBool(); break; - case 370: - lWeight = DRW_LW_Conv::dxfInt2lineWidth( reader->getInt32() ); + case 370: + lWeight = DRW_LW_Conv::dxfInt2lineWidth(reader->getInt32()); break; - case 390: + case 390: handlePlotS = reader->getString(); break; - case 347: + case 347: handleMaterialS = reader->getString(); break; - case 420: + case 420: color24 = reader->getInt32(); break; case 440: @@ -692,245 +610,199 @@ void DRW_Layer::parseCode( int code, dxfReader *reader ) } } -bool DRW_Layer::parseDwg( DRW::Version version, dwgBuffer *buf, duint32 bs ) -{ - dwgBuffer sBuff = *buf; - dwgBuffer *sBuf = buf; - if ( version > DRW::AC1018 ) //2007+ - { - sBuf = &sBuff; //separate buffer for strings - } - bool ret = DRW_TableEntry::parseDwg( version, buf, sBuf, bs ); - QgsDebugMsg( "***************************** parsing layer *********************************************" ); - if ( !ret ) - return ret; - name = sBuf->getVariableText( version, false ); - QgsDebugMsg( QString( "layer name: %1" ).arg( name.c_str() ) ); +bool DRW_Layer::parseDwg(DRW::Version version, dwgBuffer *buf, duint32 bs){ + dwgBuffer sBuff = *buf; + dwgBuffer *sBuf = buf; + if (version > DRW::AC1018) {//2007+ + sBuf = &sBuff; //separate buffer for strings + } + bool ret = DRW_TableEntry::parseDwg(version, buf, sBuf, bs); + DRW_DBG("\n***************************** parsing layer *********************************************\n"); + if (!ret) + return ret; + name = sBuf->getVariableText(version, false); + DRW_DBG("layer name: "); DRW_DBG(name.c_str()); - flags |= buf->getBit() << 6;//layer have entity - if ( version < DRW::AC1021 ) //2004- - { - int t = buf->getBitShort(); - QgsDebugMsg( QString( "xrefindex = %1" ).arg( t ) ); - Q_UNUSED( t ); - //dint16 xrefindex = buf->getBitShort(); - } - flags |= buf->getBit() << 4;//is refx dependent - if ( version < DRW::AC1015 ) //14- - { - flags |= buf->getBit(); //layer frozen - /*flags |=*/ - buf->getBit(); //unused, negate the color - flags |= buf->getBit() << 1;//frozen in new - flags |= buf->getBit() << 3;//locked - } - if ( version > DRW::AC1014 ) //2000+ - { - dint16 f = buf->getSBitShort();//bit2 are layer on - QgsDebugMsg( QString( "flags 2000+: %1" ).arg( f ) ); - flags |= f & 0x0001; //layer frozen - flags |= ( f >> 1 ) & 0x0002;//frozen in new - flags |= ( f >> 1 ) & 0x0004;//locked - plotF = ( f >> 4 ) & 0x0001; - lWeight = DRW_LW_Conv::dwgInt2lineWidth( ( f & 0x03E0 ) >> 5 ); - } - color = buf->getCmColor( version ); //BS or CMC //ok for R14 or negate - QgsDebugMsg( QString( "entity color: %1" ).arg( color ) ); + flags |= buf->getBit()<< 6;//layer have entity + if (version < DRW::AC1021) {//2004- + DRW_DBG(", xrefindex = "); DRW_DBG(buf->getBitShort()); DRW_DBG("\n"); + //dint16 xrefindex = buf->getBitShort(); + } + flags |= buf->getBit() << 4;//is refx dependent + if (version < DRW::AC1015) {//14- + flags |= buf->getBit(); //layer frozen + /*flags |=*/ buf->getBit(); //unused, negate the color + flags |= buf->getBit() << 1;//frozen in new + flags |= buf->getBit()<< 3;//locked + } + if (version > DRW::AC1014) {//2000+ + dint16 f = buf->getSBitShort();//bit2 are layer on + DRW_DBG(", flags 2000+: "); DRW_DBG(f); DRW_DBG("\n"); + flags |= f & 0x0001; //layer frozen + flags |= ( f>> 1) & 0x0002;//frozen in new + flags |= ( f>> 1) & 0x0004;//locked + plotF = ( f>> 4) & 0x0001; + lWeight = DRW_LW_Conv::dwgInt2lineWidth( (f & 0x03E0) >> 5 ); + } + color = buf->getCmColor(version); //BS or CMC //ok for R14 or negate + DRW_DBG(", entity color: "); DRW_DBG(color); DRW_DBG("\n"); - if ( version > DRW::AC1018 ) //2007+ skip string area - { - buf->setPosition( objSize >> 3 ); - buf->setBitPos( objSize & 7 ); - } - dwgHandle layerControlH = buf->getHandle(); - QgsDebugMsg( QString( "layer control handle: %1.%2 0x%3" ).arg( layerControlH.code ).arg( layerControlH.size ).arg( layerControlH.ref, 0, 16 ) ); - parentHandle = layerControlH.ref; - - if ( xDictFlag != 1 ) //linetype in 2004 seems not have XDicObjH or NULL handle - { - dwgHandle XDicObjH = buf->getHandle(); - QgsDebugMsg( QString( "XDicObjH control handle: %1.%2 0x%3" ).arg( XDicObjH.code ).arg( XDicObjH.size ).arg( XDicObjH.ref, 0, 16 ) ); - } - dwgHandle XRefH = buf->getHandle(); - QgsDebugMsg( QString( "XRefH control handle: %1.%2 0x%3" ).arg( XRefH.code ).arg( XRefH.size ).arg( XRefH.ref, 0, 16 ) ); - - if ( version > DRW::AC1014 ) //2000+ - { - dwgHandle plotStyH = buf->getHandle(); - QgsDebugMsg( QString( "Plot style control handle: %1.%2 0x%3" ).arg( plotStyH.code ).arg( plotStyH.size ).arg( plotStyH.ref, 0, 16 ) ); - handlePlotS = DRW::toHexStr( plotStyH.ref );// std::string(plotStyH.ref);//RLZ: verify conversion - } - if ( version > DRW::AC1018 ) //2007+ - { - dwgHandle materialH = buf->getHandle(); - QgsDebugMsg( QString( "Material control handle: %1.%2 0x%3" ).arg( materialH.code ).arg( materialH.size ).arg( materialH.ref, 0, 16 ) ); - handleMaterialS = DRW::toHexStr( materialH.ref );//RLZ: verify conversion - } - - QgsDebugMsg( QString( "Remaining bytes: %1" ).arg( buf->numRemainingBytes() ) ); - - //lineType handle - lTypeH = buf->getHandle(); - QgsDebugMsg( QString( "line type handle: %1.%2 0x%3; rem:%4" ).arg( lTypeH.code ).arg( lTypeH.size ).arg( lTypeH.ref, 0, 16 ).arg( buf->numRemainingBytes() ) ); + if (version > DRW::AC1018) {//2007+ skip string area + buf->setPosition(objSize >> 3); + buf->setBitPos(objSize & 7); + } + dwgHandle layerControlH = buf->getHandle(); + DRW_DBG("layer control Handle: "); DRW_DBGHL(layerControlH.code, layerControlH.size, layerControlH.ref); + parentHandle = layerControlH.ref; + if (xDictFlag !=1){//linetype in 2004 seems not have XDicObjH or NULL handle + dwgHandle XDicObjH = buf->getHandle(); + DRW_DBG(" XDicObj control Handle: "); DRW_DBGHL(XDicObjH.code, XDicObjH.size, XDicObjH.ref); DRW_DBG("\n"); + } + dwgHandle XRefH = buf->getHandle(); + DRW_DBG(" XRefH control Handle: "); DRW_DBGHL(XRefH.code, XRefH.size, XRefH.ref); DRW_DBG("\n"); + if (version > DRW::AC1014) {//2000+ + dwgHandle plotStyH = buf->getHandle(); + DRW_DBG(" PLot style control Handle: "); DRW_DBGHL(plotStyH.code, plotStyH.size, plotStyH.ref); DRW_DBG("\n"); + handlePlotS = DRW::toHexStr(plotStyH.ref);// std::string(plotStyH.ref);//RLZ: verify conversion + } + if (version > DRW::AC1018) {//2007+ + dwgHandle materialH = buf->getHandle(); + DRW_DBG(" Material control Handle: "); DRW_DBGHL(materialH.code, materialH.size, materialH.ref); DRW_DBG("\n"); + handleMaterialS = DRW::toHexStr(materialH.ref);//RLZ: verify conversion + } + //lineType handle + DRW_DBG("Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n"); + lTypeH = buf->getHandle(); + DRW_DBG("line type Handle: "); DRW_DBGHL(lTypeH.code, lTypeH.size, lTypeH.ref); + DRW_DBG("\n Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n"); // RS crc; //RS */ - return buf->isGood(); + return buf->isGood(); } -bool DRW_Block_Record::parseDwg( DRW::Version version, dwgBuffer *buf, duint32 bs ) -{ - dwgBuffer sBuff = *buf; - dwgBuffer *sBuf = buf; - if ( version > DRW::AC1018 ) //2007+ - { - sBuf = &sBuff; //separate buffer for strings - } - bool ret = DRW_TableEntry::parseDwg( version, buf, sBuf, bs ); +bool DRW_Block_Record::parseDwg(DRW::Version version, dwgBuffer *buf, duint32 bs){ + dwgBuffer sBuff = *buf; + dwgBuffer *sBuf = buf; + if (version > DRW::AC1018) {//2007+ + sBuf = &sBuff; //separate buffer for strings + } + bool ret = DRW_TableEntry::parseDwg(version, buf, sBuf, bs); + DRW_DBG("\n***************************** parsing block record ******************************************\n"); + if (!ret) + return ret; + duint32 insertCount = 0;//only 2000+ + duint32 objectCount = 0; //only 2004+ - QgsDebugMsg( "***************************** parsing block record ******************************************" ); + name = sBuf->getVariableText(version, false); + DRW_DBG("block record name: "); DRW_DBG(name.c_str()); DRW_DBG("\n"); - if ( !ret ) - return ret; - duint32 insertCount = 0;//only 2000+ - duint32 objectCount = 0; //only 2004+ - - name = sBuf->getVariableText( version, false ); - QgsDebugMsg( QString( "block record name: %1" ).arg( name.c_str() ) ); - - flags |= buf->getBit() << 6;//referenced external reference, block code 70, bit 7 (64) - if ( version > DRW::AC1018 ) //2007+ - { - } - else //2004- //RLZ: verify in 2004, 2010 &2013 - { - dint16 xrefindex = buf->getBitShort(); - QgsDebugMsg( QString( "xrefindex: %1" ).arg( xrefindex ) ); - Q_UNUSED( xrefindex ); - } - flags |= buf->getBit() << 4;//is refx dependent, block code 70, bit 5 (16) - flags |= buf->getBit(); //if is anonimous block (*U) block code 70, bit 1 (1) - flags |= buf->getBit() << 1; //if block contains attdefs, block code 70, bit 2 (2) - bool blockIsXref = buf->getBit(); //if is a Xref, block code 70, bit 3 (4) - bool xrefOverlaid = buf->getBit(); //if is a overlaid Xref, block code 70, bit 4 (8) - flags |= blockIsXref << 2; //if is a Xref, block code 70, bit 3 (4) - flags |= xrefOverlaid << 3; //if is a overlaid Xref, block code 70, bit 4 (8) - if ( version > DRW::AC1014 ) //2000+ - { - flags |= buf->getBit() << 5; //if is a loaded Xref, block code 70, bit 6 (32) - } - QgsDebugMsg( QString( "flags: 0x%1" ).arg( flags, 0, 16 ) ); - - if ( version > DRW::AC1015 ) //2004+ fails in 2007 - { - objectCount = buf->getBitLong(); //Number of objects owned by this block + flags |= buf->getBit()<< 6;//referenced external reference, block code 70, bit 7 (64) + if (version > DRW::AC1018) {//2007+ + } else {//2004- //RLZ: verify in 2004, 2010 &2013 + dint16 xrefindex = buf->getBitShort(); + DRW_DBG(" xrefindex: "); DRW_DBG(xrefindex); DRW_DBG("\n"); + } + flags |= buf->getBit() << 4;//is refx dependent, block code 70, bit 5 (16) + flags |= buf->getBit(); //if is anonimous block (*U) block code 70, bit 1 (1) + flags |= buf->getBit() << 1; //if block contains attdefs, block code 70, bit 2 (2) + bool blockIsXref = buf->getBit(); //if is a Xref, block code 70, bit 3 (4) + bool xrefOverlaid = buf->getBit(); //if is a overlaid Xref, block code 70, bit 4 (8) + flags |= blockIsXref << 2; //if is a Xref, block code 70, bit 3 (4) + flags |= xrefOverlaid << 3; //if is a overlaid Xref, block code 70, bit 4 (8) + if (version > DRW::AC1014) {//2000+ + flags |= buf->getBit() << 5; //if is a loaded Xref, block code 70, bit 6 (32) + } + DRW_DBG("flags: "); DRW_DBG(flags); DRW_DBG(", "); + if (version > DRW::AC1015) {//2004+ fails in 2007 + objectCount = buf->getBitLong(); //Number of objects owned by this block RESERVE( entMap, objectCount ); } - basePoint.x = buf->getBitDouble(); - basePoint.y = buf->getBitDouble(); - basePoint.z = buf->getBitDouble(); - UTF8STRING path = sBuf->getVariableText( version, false ); + basePoint.x = buf->getBitDouble(); + basePoint.y = buf->getBitDouble(); + basePoint.z = buf->getBitDouble(); + DRW_DBG("insertion point: "); DRW_DBGPT(basePoint.x, basePoint.y, basePoint.z); DRW_DBG("\n"); + UTF8STRING path = sBuf->getVariableText(version, false); + DRW_DBG("XRef path name: "); DRW_DBG(path.c_str()); DRW_DBG("\n"); - QgsDebugMsg( QString( "insertion point: %1,%2,%3; Xref path name:%4" ) - .arg( basePoint.x ).arg( basePoint.y ).arg( basePoint.z ) - .arg( path.c_str() ) - ); + if (version > DRW::AC1014) {//2000+ + insertCount = 0; + while (duint8 i = buf->getRawChar8() != 0) + insertCount +=i; + UTF8STRING bkdesc = sBuf->getVariableText(version, false); + DRW_DBG("Block description: "); DRW_DBG(bkdesc.c_str()); DRW_DBG("\n"); - if ( version > DRW::AC1014 ) //2000+ - { - insertCount = 0; - while ( duint8 i = buf->getRawChar8() != 0 ) - insertCount += i; - UTF8STRING bkdesc = sBuf->getVariableText( version, false ); - - QgsDebugMsg( QString( "Block description: %1" ).arg( bkdesc.c_str() ) ); - - duint32 prevData = buf->getBitLong(); - for ( unsigned int j = 0; j < prevData; ++j ) - buf->getRawChar8(); - } - if ( version > DRW::AC1018 ) //2007+ - { - duint16 insUnits = buf->getBitShort(); - bool canExplode = buf->getBit(); //if block can be exploded - duint8 bkScaling = buf->getRawChar8(); - - DRW_UNUSED( insUnits ); - DRW_UNUSED( canExplode ); - DRW_UNUSED( bkScaling ); - } - - if ( version > DRW::AC1018 ) //2007+ skip string area - { - buf->setPosition( objSize >> 3 ); - buf->setBitPos( objSize & 7 ); - } - - dwgHandle blockControlH = buf->getHandle(); - QgsDebugMsg( QString( "block control handle: %1.%2 0x%3" ).arg( blockControlH.code ).arg( blockControlH.size ).arg( blockControlH.ref, 0, 16 ) ); - parentHandle = blockControlH.ref; - - for ( int i = 0; i < numReactors; i++ ) - { - dwgHandle reactorH = buf->getHandle(); - QgsDebugMsgLevel( QString( "reactor handle %1: %2.%3 0x%4" ).arg( i ).arg( reactorH.code ).arg( reactorH.size ).arg( reactorH.ref, 0, 16 ), 5 ); - } - if ( xDictFlag != 1 ) //R14+ //seems present in 2000 - { - dwgHandle XDicObjH = buf->getHandle(); - QgsDebugMsg( QString( "XDicObj block control handle: %1.%2 0x%3" ).arg( XDicObjH.code ).arg( XDicObjH.size ).arg( XDicObjH.ref, 0, 16 ) ); - } - if ( version != DRW::AC1021 ) //2007+ XDicObjH or NullH not present - { - } - dwgHandle NullH = buf->getHandle(); - QgsDebugMsg( QString( "NullH control handle: %1.%2 0x%3" ).arg( NullH.code ).arg( NullH.size ).arg( NullH.ref, 0, 16 ) ); - dwgHandle blockH = buf->getOffsetHandle( handle ); - QgsDebugMsg( QString( "blockH handle: %1.%2 0x%3" ).arg( blockH.code ).arg( blockH.size ).arg( blockH.ref, 0, 16 ) ); - block = blockH.ref; - - if ( version > DRW::AC1015 ) //2004+ - { - for ( unsigned int i = 0; i < objectCount; i++ ) - { - dwgHandle entityH = buf->getHandle(); - QgsDebugMsgLevel( QString( "entityH handle %1: %2.%3 0x%4" ).arg( i ).arg( entityH.code ).arg( entityH.size ).arg( entityH.ref, 0, 16 ), 5 ); - entMap.push_back( entityH.ref ); + duint32 prevData = buf->getBitLong(); + for (unsigned int j= 0; j < prevData; ++j) + buf->getRawChar8(); } - } - else //2000- - { - if ( !blockIsXref && !xrefOverlaid ) - { - dwgHandle firstH = buf->getHandle(); - QgsDebugMsgLevel( QString( "firstH entity handle %1.%2 0x%3" ).arg( firstH.code ).arg( firstH.size ).arg( firstH.ref, 0, 16 ), 5 ); - firstEH = firstH.ref; + if (version > DRW::AC1018) {//2007+ + duint16 insUnits = buf->getBitShort(); + bool canExplode = buf->getBit(); //if block can be exploded + duint8 bkScaling = buf->getRawChar8(); - dwgHandle lastH = buf->getHandle(); - QgsDebugMsg( QString( "lastH entity handle %1.%2 0x%3" ).arg( lastH.code ).arg( lastH.size ).arg( lastH.ref, 0, 16 ) ); - lastEH = lastH.ref; - } - } - QgsDebugMsg( QString( "Remaining bytes: %1" ).arg( buf->numRemainingBytes() ) ); - - dwgHandle endBlockH = buf->getOffsetHandle( handle ); - QgsDebugMsg( QString( "endBlockH handle %1.%2 0x%3" ).arg( endBlockH.code ).arg( endBlockH.size ).arg( endBlockH.ref, 0, 16 ) ); - endBlock = endBlockH.ref; - - if ( version > DRW::AC1014 ) //2000+ - { - for ( unsigned int i = 0; i < insertCount; i++ ) - { - dwgHandle insertsH = buf->getHandle(); - QgsDebugMsgLevel( QString( "insertsH handle %1: %2.%3 0x%4" ).arg( i ).arg( insertsH.code ).arg( insertsH.size ).arg( insertsH.ref, 0, 16 ), 5 ); + DRW_UNUSED(insUnits); + DRW_UNUSED(canExplode); + DRW_UNUSED(bkScaling); } - QgsDebugMsg( QString( "Remaining bytes: %1" ).arg( buf->numRemainingBytes() ) ); - dwgHandle layoutH = buf->getHandle(); - QgsDebugMsg( QString( "layoutH handle %1.%2 0x%3" ).arg( layoutH.code ).arg( layoutH.size ).arg( layoutH.ref, 0, 16 ) ); - } + if (version > DRW::AC1018) {//2007+ skip string area + buf->setPosition(objSize >> 3); + buf->setBitPos(objSize & 7); + } + dwgHandle blockControlH = buf->getHandle(); + DRW_DBG("block control Handle: "); DRW_DBGHL(blockControlH.code, blockControlH.size, blockControlH.ref); DRW_DBG("\n"); + parentHandle = blockControlH.ref; + + for (int i=0; igetHandle(); + DRW_DBG(" reactor Handle #"); DRW_DBG(i); DRW_DBG(": "); DRW_DBGHL(reactorH.code, reactorH.size, reactorH.ref); DRW_DBG("\n"); + } + if (xDictFlag !=1) {//R14+ //seems present in 2000 + dwgHandle XDicObjH = buf->getHandle(); + DRW_DBG(" XDicObj control Handle: "); DRW_DBGHL(XDicObjH.code, XDicObjH.size, XDicObjH.ref); DRW_DBG("\n"); + } + if (version != DRW::AC1021) {//2007+ XDicObjH or NullH not present + } + dwgHandle NullH = buf->getHandle(); + DRW_DBG(" NullH control Handle: "); DRW_DBGHL(NullH.code, NullH.size, NullH.ref); DRW_DBG("\n"); + dwgHandle blockH = buf->getOffsetHandle(handle); + DRW_DBG(" blockH Handle: "); DRW_DBGHL(blockH.code, blockH.size, blockH.ref); DRW_DBG("\n"); + block = blockH.ref; + + if (version > DRW::AC1015) {//2004+ + for (unsigned int i=0; i< objectCount; i++){ + dwgHandle entityH = buf->getHandle(); + DRW_DBG(" entityH Handle #"); DRW_DBG(i); DRW_DBG(": "); DRW_DBGHL(entityH.code, entityH.size, entityH.ref); DRW_DBG("\n"); + entMap.push_back(entityH.ref); + } + } else {//2000- + if(!blockIsXref && !xrefOverlaid){ + dwgHandle firstH = buf->getHandle(); + DRW_DBG(" firstH entity Handle: "); DRW_DBGHL(firstH.code, firstH.size, firstH.ref); DRW_DBG("\n"); + firstEH = firstH.ref; + dwgHandle lastH = buf->getHandle(); + DRW_DBG(" lastH entity Handle: "); DRW_DBGHL(lastH.code, lastH.size, lastH.ref); DRW_DBG("\n"); + lastEH = lastH.ref; + } + } + DRW_DBG("Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n"); + dwgHandle endBlockH = buf->getOffsetHandle(handle); + DRW_DBG(" endBlockH Handle: "); DRW_DBGHL(endBlockH.code, endBlockH.size, endBlockH.ref); DRW_DBG("\n"); + endBlock = endBlockH.ref; + + if (version > DRW::AC1014) {//2000+ + for (unsigned int i=0; i< insertCount; i++){ + dwgHandle insertsH = buf->getHandle(); + DRW_DBG(" insertsH Handle #"); DRW_DBG(i); DRW_DBG(": "); DRW_DBGHL(insertsH.code, insertsH.size, insertsH.ref); DRW_DBG("\n"); + } + DRW_DBG("Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n"); + dwgHandle layoutH = buf->getHandle(); + DRW_DBG(" layoutH Handle: "); DRW_DBGHL(layoutH.code, layoutH.size, layoutH.ref); DRW_DBG("\n"); + } + DRW_DBG("Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n\n"); // RS crc; //RS */ - return buf->isGood(); + return buf->isGood(); } //! Class to handle text style entries @@ -938,94 +810,81 @@ bool DRW_Block_Record::parseDwg( DRW::Version version, dwgBuffer *buf, duint32 b * Class to handle text style symbol table entries * @author Rallaz */ -void DRW_Textstyle::parseCode( int code, dxfReader *reader ) -{ - switch ( code ) - { +void DRW_Textstyle::parseCode(int code, dxfReader *reader){ + switch (code) { case 3: - font = reader->getUtf8String(); - break; + font = reader->getUtf8String(); + break; case 4: - bigFont = reader->getUtf8String(); - break; + bigFont = reader->getUtf8String(); + break; case 40: - height = reader->getDouble(); - break; + height = reader->getDouble(); + break; case 41: - width = reader->getDouble(); - break; + width = reader->getDouble(); + break; case 50: - oblique = reader->getDouble(); - break; + oblique = reader->getDouble(); + break; case 42: - lastHeight = reader->getDouble(); - break; + lastHeight = reader->getDouble(); + break; case 71: - genFlag = reader->getInt32(); - break; + genFlag = reader->getInt32(); + break; case 1071: - fontFamily = reader->getInt32(); - break; + fontFamily = reader->getInt32(); + break; default: - DRW_TableEntry::parseCode( code, reader ); - break; - } + DRW_TableEntry::parseCode(code, reader); + break; + } } -bool DRW_Textstyle::parseDwg( DRW::Version version, dwgBuffer *buf, duint32 bs ) -{ - dwgBuffer sBuff = *buf; - dwgBuffer *sBuf = buf; - if ( version > DRW::AC1018 ) //2007+ - { - sBuf = &sBuff; //separate buffer for strings - } - bool ret = DRW_TableEntry::parseDwg( version, buf, sBuf, bs ); +bool DRW_Textstyle::parseDwg(DRW::Version version, dwgBuffer *buf, duint32 bs){ + dwgBuffer sBuff = *buf; + dwgBuffer *sBuf = buf; + if (version > DRW::AC1018) {//2007+ + sBuf = &sBuff; //separate buffer for strings + } + bool ret = DRW_TableEntry::parseDwg(version, buf, sBuf, bs); + DRW_DBG("\n***************************** parsing text style *********************************************\n"); + if (!ret) + return ret; + name = sBuf->getVariableText(version, false); + DRW_DBG("text style name: "); DRW_DBG(name.c_str()); DRW_DBG("\n"); + flags |= buf->getBit()<< 6;//style are referenced for a entity, style code 70, bit 7 (64) + /*dint16 xrefindex =*/ buf->getBitShort(); + flags |= buf->getBit() << 4; //is refx dependent, style code 70, bit 5 (16) + flags |= buf->getBit() << 2; //vertical text, stile code 70, bit 3 (4) + flags |= buf->getBit(); //if is a shape file instead of text, style code 70, bit 1 (1) + height = buf->getBitDouble(); + width = buf->getBitDouble(); + oblique = buf->getBitDouble(); + genFlag = buf->getRawChar8(); + lastHeight = buf->getBitDouble(); + font = sBuf->getVariableText(version, false); + bigFont = sBuf->getVariableText(version, false); + if (version > DRW::AC1018) {//2007+ skip string area + buf->setPosition(objSize >> 3); + buf->setBitPos(objSize & 7); + } + dwgHandle shpControlH = buf->getHandle(); + DRW_DBG(" parentControlH Handle: "); DRW_DBGHL(shpControlH.code, shpControlH.size, shpControlH.ref); DRW_DBG("\n"); + parentHandle = shpControlH.ref; + DRW_DBG("Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n"); + if (xDictFlag !=1){//linetype in 2004 seems not have XDicObjH or NULL handle + dwgHandle XDicObjH = buf->getHandle(); + DRW_DBG(" XDicObj control Handle: "); DRW_DBGHL(XDicObjH.code, XDicObjH.size, XDicObjH.ref); DRW_DBG("\n"); + DRW_DBG("Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n"); + } +/*RLZ: fails verify this part*/ dwgHandle XRefH = buf->getHandle(); + DRW_DBG(" XRefH control Handle: "); DRW_DBGHL(XRefH.code, XRefH.size, XRefH.ref); DRW_DBG("\n"); - QgsDebugMsg( "***************************** parsing text style *********************************************" ); - - if ( !ret ) - return ret; - name = sBuf->getVariableText( version, false ); - - QgsDebugMsg( QString( "text style name: %1" ).arg( name.c_str() ) ); - - flags |= buf->getBit() << 6;//style are referenced for a entity, style code 70, bit 7 (64) - /*dint16 xrefindex =*/ - buf->getBitShort(); - flags |= buf->getBit() << 4; //is refx dependent, style code 70, bit 5 (16) - flags |= buf->getBit() << 2; //vertical text, stile code 70, bit 3 (4) - flags |= buf->getBit(); //if is a shape file instead of text, style code 70, bit 1 (1) - height = buf->getBitDouble(); - width = buf->getBitDouble(); - oblique = buf->getBitDouble(); - genFlag = buf->getRawChar8(); - lastHeight = buf->getBitDouble(); - font = sBuf->getVariableText( version, false ); - bigFont = sBuf->getVariableText( version, false ); - if ( version > DRW::AC1018 ) //2007+ skip string area - { - buf->setPosition( objSize >> 3 ); - buf->setBitPos( objSize & 7 ); - } - dwgHandle shpControlH = buf->getHandle(); - QgsDebugMsg( QString( "shpControlH handle %1.%2 0x%3" ).arg( shpControlH.code ).arg( shpControlH.size ).arg( shpControlH.ref, 0, 16 ) ); - parentHandle = shpControlH.ref; - QgsDebugMsg( QString( "Remaining bytes: %1" ).arg( buf->numRemainingBytes() ) ); - - if ( xDictFlag != 1 ) //linetype in 2004 seems not have XDicObjH or NULL handle - { - dwgHandle XDicObjH = buf->getHandle(); - QgsDebugMsg( QString( "XDicObjH handle %1.%2 0x%3" ).arg( XDicObjH.code ).arg( XDicObjH.size ).arg( XDicObjH.ref, 0, 16 ) ); - QgsDebugMsg( QString( "Remaining bytes: %1" ).arg( buf->numRemainingBytes() ) ); - } - /*RLZ: fails verify this part*/ - dwgHandle XRefH = buf->getHandle(); - QgsDebugMsg( QString( "XRefH handle %1.%2 0x%3" ).arg( XRefH.code ).arg( XRefH.size ).arg( XRefH.ref, 0, 16 ) ); - QgsDebugMsg( QString( "Remaining bytes: %1" ).arg( buf->numRemainingBytes() ) ); - - // RS crc; //RS */ - return buf->isGood(); + DRW_DBG("Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n\n"); + // RS crc; //RS */ + return buf->isGood(); } //! Class to handle vport entries @@ -1033,458 +892,354 @@ bool DRW_Textstyle::parseDwg( DRW::Version version, dwgBuffer *buf, duint32 bs ) * Class to handle vport symbol table entries * @author Rallaz */ -void DRW_Vport::parseCode( int code, dxfReader *reader ) -{ - switch ( code ) - { +void DRW_Vport::parseCode(int code, dxfReader *reader){ + switch (code) { case 10: - lowerLeft.x = reader->getDouble(); - break; + lowerLeft.x = reader->getDouble(); + break; case 20: - lowerLeft.y = reader->getDouble(); - break; + lowerLeft.y = reader->getDouble(); + break; case 11: - UpperRight.x = reader->getDouble(); - break; + UpperRight.x = reader->getDouble(); + break; case 21: - UpperRight.y = reader->getDouble(); - break; + UpperRight.y = reader->getDouble(); + break; case 12: - center.x = reader->getDouble(); - break; + center.x = reader->getDouble(); + break; case 22: - center.y = reader->getDouble(); - break; + center.y = reader->getDouble(); + break; case 13: - snapBase.x = reader->getDouble(); - break; + snapBase.x = reader->getDouble(); + break; case 23: - snapBase.y = reader->getDouble(); - break; + snapBase.y = reader->getDouble(); + break; case 14: - snapSpacing.x = reader->getDouble(); - break; + snapSpacing.x = reader->getDouble(); + break; case 24: - snapSpacing.y = reader->getDouble(); - break; + snapSpacing.y = reader->getDouble(); + break; case 15: - gridSpacing.x = reader->getDouble(); - break; + gridSpacing.x = reader->getDouble(); + break; case 25: - gridSpacing.y = reader->getDouble(); - break; + gridSpacing.y = reader->getDouble(); + break; case 16: - viewDir.x = reader->getDouble(); - break; + viewDir.x = reader->getDouble(); + break; case 26: - viewDir.y = reader->getDouble(); - break; + viewDir.y = reader->getDouble(); + break; case 36: - viewDir.z = reader->getDouble(); - break; + viewDir.z = reader->getDouble(); + break; case 17: - viewTarget.x = reader->getDouble(); - break; + viewTarget.x = reader->getDouble(); + break; case 27: - viewTarget.y = reader->getDouble(); - break; + viewTarget.y = reader->getDouble(); + break; case 37: - viewTarget.z = reader->getDouble(); - break; + viewTarget.z = reader->getDouble(); + break; case 40: - height = reader->getDouble(); - break; + height = reader->getDouble(); + break; case 41: - ratio = reader->getDouble(); - break; + ratio = reader->getDouble(); + break; case 42: - lensHeight = reader->getDouble(); - break; + lensHeight = reader->getDouble(); + break; case 43: - frontClip = reader->getDouble(); - break; + frontClip = reader->getDouble(); + break; case 44: - backClip = reader->getDouble(); - break; + backClip = reader->getDouble(); + break; case 50: - snapAngle = reader->getDouble(); - break; + snapAngle = reader->getDouble(); + break; case 51: - twistAngle = reader->getDouble(); - break; + twistAngle = reader->getDouble(); + break; case 71: - viewMode = reader->getInt32(); - break; + viewMode = reader->getInt32(); + break; case 72: - circleZoom = reader->getInt32(); - break; + circleZoom = reader->getInt32(); + break; case 73: - fastZoom = reader->getInt32(); - break; + fastZoom = reader->getInt32(); + break; case 74: - ucsIcon = reader->getInt32(); - break; + ucsIcon = reader->getInt32(); + break; case 75: - snap = reader->getInt32(); - break; + snap = reader->getInt32(); + break; case 76: - grid = reader->getInt32(); - break; + grid = reader->getInt32(); + break; case 77: - snapStyle = reader->getInt32(); - break; + snapStyle = reader->getInt32(); + break; case 78: - snapIsopair = reader->getInt32(); - break; + snapIsopair = reader->getInt32(); + break; default: - DRW_TableEntry::parseCode( code, reader ); - break; - } + DRW_TableEntry::parseCode(code, reader); + break; + } } -bool DRW_Vport::parseDwg( DRW::Version version, dwgBuffer *buf, duint32 bs ) -{ - dwgBuffer sBuff = *buf; - dwgBuffer *sBuf = buf; - if ( version > DRW::AC1018 ) //2007+ - { - sBuf = &sBuff; //separate buffer for strings - } - bool ret = DRW_TableEntry::parseDwg( version, buf, sBuf, bs ); - QgsDebugMsg( "***************************** parsing VPort ************************************************" ); - if ( !ret ) - return ret; - name = sBuf->getVariableText( version, false ); - QgsDebugMsg( QString( "vport name: %1" ).arg( name.c_str() ) ); - - flags |= buf->getBit() << 6;// code 70, bit 7 (64) - if ( version < DRW::AC1021 ) //2004- - { - /*dint16 xrefindex =*/ - buf->getBitShort(); - } - flags |= buf->getBit() << 4; //is refx dependent, style code 70, bit 5 (16) - height = buf->getBitDouble(); - ratio = buf->getBitDouble(); - - QgsDebugMsg( QString( "flags:%1 height:%2 ratio:%3" ).arg( flags ).arg( height ).arg( ratio ) ); - - center = buf->get2RawDouble(); - QgsDebugMsg( QString( "view center:%1,%2,%3" ).arg( center.x ).arg( center.y ).arg( center.z ) ); - - viewTarget.x = buf->getBitDouble(); - viewTarget.y = buf->getBitDouble(); - viewTarget.z = buf->getBitDouble(); - QgsDebugMsg( QString( "view target:%1,%2,%3" ).arg( viewTarget.x ).arg( viewTarget.y ).arg( viewTarget.z ) ); - - viewDir.x = buf->getBitDouble(); - viewDir.y = buf->getBitDouble(); - viewDir.z = buf->getBitDouble(); - QgsDebugMsg( QString( "view dir:%1,%2,%3" ).arg( viewDir.x ).arg( viewDir.y ).arg( viewDir.z ) ); - - twistAngle = buf->getBitDouble(); - lensHeight = buf->getBitDouble(); - frontClip = buf->getBitDouble(); - backClip = buf->getBitDouble(); - - QgsDebugMsg( QString( "twistAngle:%1 lensHeight:%2 frontClip:%3 backClip:%4" ).arg( twistAngle ).arg( lensHeight ).arg( frontClip ).arg( backClip ) ); - - viewMode = buf->getBit(); //view mode, code 71, bit 0 (1) - viewMode |= buf->getBit() << 1; //view mode, code 71, bit 1 (2) - viewMode |= buf->getBit() << 2; //view mode, code 71, bit 2 (4) - viewMode |= buf->getBit() << 4; //view mode, code 71, bit 4 (16) - if ( version > DRW::AC1014 ) //2000+ - { - duint8 renderMode = buf->getRawChar8(); - QgsDebugMsg( QString( "renderMode: %1" ).arg( renderMode ) ); - Q_UNUSED( renderMode ); - - if ( version > DRW::AC1018 ) //2007+ - { - int t; - double d; - - t = buf->getBit(); - QgsDebugMsg( QString( "use default lights:%1" ).arg( t ) ); - Q_UNUSED( t ); - t = buf->getRawChar8(); - QgsDebugMsg( QString( "default lighting type:%1" ).arg( t ) ); - d = buf->getBitDouble(); - QgsDebugMsg( QString( "brightness:%1" ).arg( d ) ); - Q_UNUSED( d ); - d = buf->getBitDouble(); - QgsDebugMsg( QString( "contrast:%1" ).arg( d ) ); - t = buf->getCmColor( version ); - QgsDebugMsg( QString( "color:%1" ).arg( t ) ); +bool DRW_Vport::parseDwg(DRW::Version version, dwgBuffer *buf, duint32 bs){ + dwgBuffer sBuff = *buf; + dwgBuffer *sBuf = buf; + if (version > DRW::AC1018) {//2007+ + sBuf = &sBuff; //separate buffer for strings } - } - lowerLeft = buf->get2RawDouble(); - QgsDebugMsg( QString( "lowerLeft:%1,%2,%3" ).arg( lowerLeft.x ).arg( lowerLeft.y ).arg( lowerLeft.z ) ); - UpperRight = buf->get2RawDouble(); - QgsDebugMsg( QString( "UpperRight:%1,%2,%3" ).arg( UpperRight.x ).arg( UpperRight.y ).arg( UpperRight.z ) ); - - viewMode |= buf->getBit() << 3; //UCSFOLLOW, view mode, code 71, bit 3 (8) - circleZoom = buf->getBitShort(); - fastZoom = buf->getBit(); - QgsDebugMsg( QString( "viewMode:%1 circleZoom:%2 fastZoom:%3" ).arg( viewMode ).arg( circleZoom ).arg( fastZoom ) ); - - ucsIcon = buf->getBit(); //ucs Icon, code 74, bit 0 (1) - ucsIcon |= buf->getBit() << 1; //ucs Icon, code 74, bit 1 (2) - grid = buf->getBit(); - - QgsDebugMsg( QString( "ucsIcon:%1 grid:%2" ).arg( ucsIcon ).arg( grid ) ); - - gridSpacing = buf->get2RawDouble(); - QgsDebugMsg( QString( "grid Spacing:%1,%2,%3" ).arg( gridSpacing.x ).arg( gridSpacing.y ).arg( gridSpacing.z ) ); - - snap = buf->getBit(); - snapStyle = buf->getBit(); - QgsDebugMsg( QString( "snap on/off:%1 snap Style:%2" ).arg( snap ).arg( snapStyle ) ); - snapIsopair = buf->getBitShort(); - snapAngle = buf->getBitDouble(); - QgsDebugMsg( QString( "snap Isopair::%1 snap Angle::%2" ).arg( snapIsopair ).arg( snapAngle ) ); - - snapBase = buf->get2RawDouble(); - QgsDebugMsg( QString( "snap Base:%1,%2,%3" ).arg( snapBase.x ).arg( snapBase.y ).arg( snapBase.z ) ); - - snapSpacing = buf->get2RawDouble(); - QgsDebugMsg( QString( "snap Base:%1,%2,%3" ).arg( snapSpacing.x ).arg( snapSpacing.y ).arg( snapSpacing.z ) ); - - if ( version > DRW::AC1014 ) //2000+ - { - int t; - double d; - double x, y, z; - - t = buf->getBit(); - QgsDebugMsg( QString( "Unknown %1" ).arg( t ) ); - Q_UNUSED( t ); - t = buf->getBit(); - QgsDebugMsg( QString( "UCS per Viewport: %1" ).arg( t ) ); - - x = buf->getBitDouble(); - y = buf->getBitDouble(); - z = buf->getBitDouble(); - QgsDebugMsg( QString( "UCS origin:%1,%2,%3" ).arg( x, y, z ) ); - Q_UNUSED( x ); - Q_UNUSED( y ); - Q_UNUSED( z ); - - x = buf->getBitDouble(); - y = buf->getBitDouble(); - z = buf->getBitDouble(); - QgsDebugMsg( QString( "UCS X Axis:%1,%2,%3" ).arg( x, y, z ) ); - - x = buf->getBitDouble(); - y = buf->getBitDouble(); - z = buf->getBitDouble(); - QgsDebugMsg( QString( "UCS Y Axis:%1,%2,%3" ).arg( x, y, z ) ); - - d = buf->getBitDouble(); - QgsDebugMsg( QString( "UCS elevation: %1" ).arg( d ) ); - Q_UNUSED( d ); - - t = buf->getBitShort(); - QgsDebugMsg( QString( " UCS Orthographic type: %1" ).arg( t ) ); - - if ( version > DRW::AC1018 ) //2007+ - { - gridBehavior = buf->getBitShort(); - QgsDebugMsg( QString( "Grid behavior: %1" ).arg( gridBehavior ) ); - t = buf->getBitShort(); - QgsDebugMsg( QString( "Grid major: %1" ).arg( t ) ); + bool ret = DRW_TableEntry::parseDwg(version, buf, sBuf, bs); + DRW_DBG("\n***************************** parsing VPort ************************************************\n"); + if (!ret) + return ret; + name = sBuf->getVariableText(version, false); + DRW_DBG("vport name: "); DRW_DBG(name.c_str()); DRW_DBG("\n"); + flags |= buf->getBit()<< 6;// code 70, bit 7 (64) + if (version < DRW::AC1021) { //2004- + /*dint16 xrefindex =*/ buf->getBitShort(); } - } - - //common handles - if ( version > DRW::AC1018 ) //2007+ skip string area - { - buf->setPosition( objSize >> 3 ); - buf->setBitPos( objSize & 7 ); - } - dwgHandle vpControlH = buf->getHandle(); - QgsDebugMsg( QString( "vpControlH Handle: %1.%2 0x%3" ).arg( vpControlH.code ).arg( vpControlH.size ).arg( vpControlH.ref, 0, 16 ) ); - parentHandle = vpControlH.ref; - QgsDebugMsg( QString( "Remaining bytes: %1" ).arg( buf->numRemainingBytes() ) ); - - if ( xDictFlag != 1 ) - { - dwgHandle XDicObjH = buf->getHandle(); - QgsDebugMsg( QString( "XDicObjH Handle: %1.%2 0x%3" ).arg( XDicObjH.code ).arg( XDicObjH.size ).arg( XDicObjH.ref, 0, 16 ) ); - QgsDebugMsg( QString( "Remaining bytes: %1" ).arg( buf->numRemainingBytes() ) ); - } - /*RLZ: fails verify this part*/ - dwgHandle XRefH = buf->getHandle(); - QgsDebugMsg( QString( "XRefH Handle: %1.%2 0x%3" ).arg( XRefH.code ).arg( XRefH.size ).arg( XRefH.ref, 0, 16 ) ); - - if ( version > DRW::AC1014 ) //2000+ - { - QgsDebugMsg( QString( "Remaining bytes: %1" ).arg( buf->numRemainingBytes() ) ); - - if ( version > DRW::AC1018 ) //2007+ - { - dwgHandle bkgrdH = buf->getHandle(); - QgsDebugMsg( QString( "background Handle: %1.%2 0x%3" ).arg( bkgrdH.code ).arg( bkgrdH.size ).arg( bkgrdH.ref, 0, 16 ) ); - QgsDebugMsg( QString( "Remaining bytes: %1" ).arg( buf->numRemainingBytes() ) ); - - dwgHandle visualStH = buf->getHandle(); - QgsDebugMsg( QString( "visual style Handle: %1.%2 0x%3" ).arg( visualStH.code ).arg( visualStH.size ).arg( visualStH.ref, 0, 16 ) ); - QgsDebugMsg( QString( "Remaining bytes: %1" ).arg( buf->numRemainingBytes() ) ); - - dwgHandle sunH = buf->getHandle(); - QgsDebugMsg( QString( "sun Handle: %1.%2 0x%3" ).arg( sunH.code ).arg( sunH.size ).arg( sunH.ref, 0, 16 ) ); - QgsDebugMsg( QString( "Remaining bytes: %1" ).arg( buf->numRemainingBytes() ) ); + flags |= buf->getBit() << 4; //is refx dependent, style code 70, bit 5 (16) + height = buf->getBitDouble(); + ratio = buf->getBitDouble(); + DRW_DBG("flags: "); DRW_DBG(flags); DRW_DBG(" height: "); DRW_DBG(height); + DRW_DBG(" ratio: "); DRW_DBG(ratio); + center = buf->get2RawDouble(); + DRW_DBG("\nview center: "); DRW_DBGPT(center.x, center.y, center.z); + viewTarget.x = buf->getBitDouble(); + viewTarget.y = buf->getBitDouble(); + viewTarget.z = buf->getBitDouble(); + DRW_DBG("\nview target: "); DRW_DBGPT(viewTarget.x, viewTarget.y, viewTarget.z); + viewDir.x = buf->getBitDouble(); + viewDir.y = buf->getBitDouble(); + viewDir.z = buf->getBitDouble(); + DRW_DBG("\nview dir: "); DRW_DBGPT(viewDir.x, viewDir.y, viewDir.z); + twistAngle = buf->getBitDouble(); + lensHeight = buf->getBitDouble(); + frontClip = buf->getBitDouble(); + backClip = buf->getBitDouble(); + DRW_DBG("\ntwistAngle: "); DRW_DBG(twistAngle); DRW_DBG(" lensHeight: "); DRW_DBG(lensHeight); + DRW_DBG(" frontClip: "); DRW_DBG(frontClip); DRW_DBG(" backClip: "); DRW_DBG(backClip); + viewMode = buf->getBit(); //view mode, code 71, bit 0 (1) + viewMode |= buf->getBit() << 1; //view mode, code 71, bit 1 (2) + viewMode |= buf->getBit() << 2; //view mode, code 71, bit 2 (4) + viewMode |= buf->getBit() << 4; //view mode, code 71, bit 4 (16) + if (version > DRW::AC1014) { //2000+ + //duint8 renderMode = buf->getRawChar8(); + DRW_DBG("\n renderMode: "); DRW_DBG(buf->getRawChar8()); + if (version > DRW::AC1018) { //2007+ + DRW_DBG("\n use default lights: "); DRW_DBG(buf->getBit()); + DRW_DBG(" default lighting type: "); DRW_DBG(buf->getRawChar8()); + DRW_DBG(" brightness: "); DRW_DBG(buf->getBitDouble()); + DRW_DBG("\n contrast: "); DRW_DBG(buf->getBitDouble()); DRW_DBG("\n"); + DRW_DBG(" ambient color CMC: "); DRW_DBG(buf->getCmColor(version)); + } + } + lowerLeft = buf->get2RawDouble(); + DRW_DBG("\nlowerLeft: "); DRW_DBGPT(lowerLeft.x, lowerLeft.y, lowerLeft.z); + UpperRight = buf->get2RawDouble(); + DRW_DBG("\nUpperRight: "); DRW_DBGPT(UpperRight.x, UpperRight.y, UpperRight.z); + viewMode |= buf->getBit() << 3; //UCSFOLLOW, view mode, code 71, bit 3 (8) + circleZoom = buf->getBitShort(); + fastZoom = buf->getBit(); + DRW_DBG("\nviewMode: "); DRW_DBG(viewMode); DRW_DBG(" circleZoom: "); + DRW_DBG(circleZoom); DRW_DBG(" fastZoom: "); DRW_DBG(fastZoom); + ucsIcon = buf->getBit(); //ucs Icon, code 74, bit 0 (1) + ucsIcon |= buf->getBit() << 1; //ucs Icon, code 74, bit 1 (2) + grid = buf->getBit(); + DRW_DBG("\nucsIcon: "); DRW_DBG(ucsIcon); DRW_DBG(" grid: "); DRW_DBG(grid); + gridSpacing = buf->get2RawDouble(); + DRW_DBG("\ngrid Spacing: "); DRW_DBGPT(gridSpacing.x, gridSpacing.y, gridSpacing.z); + snap = buf->getBit(); + snapStyle = buf->getBit(); + DRW_DBG("\nsnap on/off: "); DRW_DBG(snap); DRW_DBG(" snap Style: "); DRW_DBG(snapStyle); + snapIsopair = buf->getBitShort(); + snapAngle = buf->getBitDouble(); + DRW_DBG("\nsnap Isopair: "); DRW_DBG(snapIsopair); DRW_DBG(" snap Angle: "); DRW_DBG(snapAngle); + snapBase = buf->get2RawDouble(); + DRW_DBG("\nsnap Base: "); DRW_DBGPT(snapBase.x, snapBase.y, snapBase.z); + snapSpacing = buf->get2RawDouble(); + DRW_DBG("\nsnap Spacing: "); DRW_DBGPT(snapSpacing.x, snapSpacing.y, snapSpacing.z); + if (version > DRW::AC1014) { //2000+ + DRW_DBG("\n Unknown: "); DRW_DBG(buf->getBit()); + DRW_DBG(" UCS per Viewport: "); DRW_DBG(buf->getBit()); + DRW_DBG("\nUCS origin: "); DRW_DBGPT(buf->getBitDouble(), buf->getBitDouble(), buf->getBitDouble()); + DRW_DBG("\nUCS X Axis: "); DRW_DBGPT(buf->getBitDouble(), buf->getBitDouble(), buf->getBitDouble()); + DRW_DBG("\nUCS Y Axis: "); DRW_DBGPT(buf->getBitDouble(), buf->getBitDouble(), buf->getBitDouble()); + DRW_DBG("\nUCS elevation: "); DRW_DBG(buf->getBitDouble()); + DRW_DBG(" UCS Orthographic type: "); DRW_DBG(buf->getBitShort()); + if (version > DRW::AC1018) { //2007+ + gridBehavior = buf->getBitShort(); + DRW_DBG(" gridBehavior (flags): "); DRW_DBG(gridBehavior); + DRW_DBG(" Grid major: "); DRW_DBG(buf->getBitShort()); + } } - dwgHandle namedUCSH = buf->getHandle(); - QgsDebugMsg( QString( "name UCS handle: %1.%2 0x%3" ).arg( namedUCSH.code ).arg( namedUCSH.size ).arg( namedUCSH.ref, 0, 16 ) ); - QgsDebugMsg( QString( "Remaining bytes: %1" ).arg( buf->numRemainingBytes() ) ); + //common handles + if (version > DRW::AC1018) {//2007+ skip string area + buf->setPosition(objSize >> 3); + buf->setBitPos(objSize & 7); + } + dwgHandle vpControlH = buf->getHandle(); + DRW_DBG("\n parentControlH Handle: "); DRW_DBGHL(vpControlH.code, vpControlH.size, vpControlH.ref); DRW_DBG("\n"); + parentHandle = vpControlH.ref; + DRW_DBG("Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n"); + if (xDictFlag !=1){ + dwgHandle XDicObjH = buf->getHandle(); + DRW_DBG(" XDicObj control Handle: "); DRW_DBGHL(XDicObjH.code, XDicObjH.size, XDicObjH.ref); DRW_DBG("\n"); + DRW_DBG("Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n"); + } +/*RLZ: fails verify this part*/ dwgHandle XRefH = buf->getHandle(); + DRW_DBG(" XRefH control Handle: "); DRW_DBGHL(XRefH.code, XRefH.size, XRefH.ref); - dwgHandle baseUCSH = buf->getHandle(); - QgsDebugMsg( QString( "base UCS handle: %1.%2 0x%3" ).arg( baseUCSH.code ).arg( baseUCSH.size ).arg( baseUCSH.ref, 0, 16 ) ); - } + if (version > DRW::AC1014) { //2000+ + DRW_DBG("\nRemaining bytes: "); DRW_DBG(buf->numRemainingBytes()); + if (version > DRW::AC1018) { //2007+ + dwgHandle bkgrdH = buf->getHandle(); + DRW_DBG(" background Handle: "); DRW_DBGHL(bkgrdH.code, bkgrdH.size, bkgrdH.ref); + DRW_DBG("\nRemaining bytes: "); DRW_DBG(buf->numRemainingBytes()); + dwgHandle visualStH = buf->getHandle(); + DRW_DBG(" visual style Handle: "); DRW_DBGHL(visualStH.code, visualStH.size, visualStH.ref); + DRW_DBG("\nRemaining bytes: "); DRW_DBG(buf->numRemainingBytes()); + dwgHandle sunH = buf->getHandle(); + DRW_DBG(" sun Handle: "); DRW_DBGHL(sunH.code, sunH.size, sunH.ref); + DRW_DBG("\nRemaining bytes: "); DRW_DBG(buf->numRemainingBytes()); + } + dwgHandle namedUCSH = buf->getHandle(); + DRW_DBG(" named UCS Handle: "); DRW_DBGHL(namedUCSH.code, namedUCSH.size, namedUCSH.ref); + DRW_DBG("\nRemaining bytes: "); DRW_DBG(buf->numRemainingBytes()); + dwgHandle baseUCSH = buf->getHandle(); + DRW_DBG(" base UCS Handle: "); DRW_DBGHL(baseUCSH.code, baseUCSH.size, baseUCSH.ref); + } - QgsDebugMsg( QString( "Remaining bytes: %1" ).arg( buf->numRemainingBytes() ) ); - - // RS crc; //RS */ - return buf->isGood(); + DRW_DBG("\n Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n"); + // RS crc; //RS */ + return buf->isGood(); } -void DRW_ImageDef::parseCode( int code, dxfReader *reader ) -{ - switch ( code ) - { +void DRW_ImageDef::parseCode(int code, dxfReader *reader){ + switch (code) { case 1: - name = reader->getUtf8String(); - break; + name = reader->getUtf8String(); + break; case 5: - handle = reader->getHandleString(); - break; + handle = reader->getHandleString(); + break; case 10: - u = reader->getDouble(); - break; + u = reader->getDouble(); + break; case 20: - v = reader->getDouble(); - break; + v = reader->getDouble(); + break; case 11: - up = reader->getDouble(); - break; + up = reader->getDouble(); + break; case 12: - vp = reader->getDouble(); - break; + vp = reader->getDouble(); + break; case 21: - vp = reader->getDouble(); - break; + vp = reader->getDouble(); + break; case 280: - loaded = reader->getInt32(); - break; + loaded = reader->getInt32(); + break; case 281: - resolution = reader->getInt32(); - break; + resolution = reader->getInt32(); + break; default: - break; - } + break; + } } -bool DRW_ImageDef::parseDwg( DRW::Version version, dwgBuffer *buf, duint32 bs ) -{ - dwgBuffer sBuff = *buf; - dwgBuffer *sBuf = buf; - if ( version > DRW::AC1018 ) //2007+ - { - sBuf = &sBuff; //separate buffer for strings - } - bool ret = DRW_TableEntry::parseDwg( version, buf, sBuf, bs ); +bool DRW_ImageDef::parseDwg(DRW::Version version, dwgBuffer *buf, duint32 bs){ + dwgBuffer sBuff = *buf; + dwgBuffer *sBuf = buf; + if (version > DRW::AC1018) {//2007+ + sBuf = &sBuff; //separate buffer for strings + } + bool ret = DRW_TableEntry::parseDwg(version, buf, sBuf, bs); + DRW_DBG("\n***************************** parsing Image Def *********************************************\n"); + if (!ret) + return ret; + dint32 imgVersion = buf->getBitLong(); + DRW_DBG("class Version: "); DRW_DBG(imgVersion); + DRW_Coord size = buf->get2RawDouble(); + DRW_UNUSED(size);//RLZ: temporary, complete API + name = sBuf->getVariableText(version, false); + DRW_DBG("appId name: "); DRW_DBG(name.c_str()); DRW_DBG("\n"); + loaded = buf->getBit(); + resolution = buf->getRawChar8(); + up = buf->getRawDouble(); + vp = buf->getRawDouble(); - QgsDebugMsg( "***************************** parsing Image Def *********************************************" ); - if ( !ret ) - return ret; + dwgHandle parentH = buf->getHandle(); + DRW_DBG(" parentH Handle: "); DRW_DBGHL(parentH.code, parentH.size, parentH.ref); DRW_DBG("\n"); + parentHandle = parentH.ref; + DRW_DBG("Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n"); + //RLZ: Reactors handles + if (xDictFlag !=1){ + dwgHandle XDicObjH = buf->getHandle(); + DRW_DBG(" XDicObj control Handle: "); DRW_DBGHL(XDicObjH.code, XDicObjH.size, XDicObjH.ref); DRW_DBG("\n"); + DRW_DBG("Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n"); + } +/*RLZ: fails verify this part*/ dwgHandle XRefH = buf->getHandle(); + DRW_DBG(" XRefH control Handle: "); DRW_DBGHL(XRefH.code, XRefH.size, XRefH.ref); DRW_DBG("\n"); - dint32 imgVersion = buf->getBitLong(); - QgsDebugMsg( QString( "class Version:%1" ).arg( imgVersion ) ); - Q_UNUSED( imgVersion ); - - DRW_Coord size = buf->get2RawDouble(); - DRW_UNUSED( size );//RLZ: temporary, complete API - - name = sBuf->getVariableText( version, false ); - QgsDebugMsg( QString( "appId name:%1" ).arg( name.c_str() ) ); - - loaded = buf->getBit(); - resolution = buf->getRawChar8(); - up = buf->getRawDouble(); - vp = buf->getRawDouble(); - - dwgHandle parentH = buf->getHandle(); - QgsDebugMsg( QString( "parentH Handle: %1.%2 0x%3" ).arg( parentH.code ).arg( parentH.size ).arg( parentH.ref, 0, 16 ) ); - parentHandle = parentH.ref; - - QgsDebugMsg( QString( "Remaining bytes: %1" ).arg( buf->numRemainingBytes() ) ); - - //RLZ: Reactors handles - if ( xDictFlag != 1 ) - { - dwgHandle XDicObjH = buf->getHandle(); - QgsDebugMsg( QString( "XDicObjH Handle: %1.%2 0x%3" ).arg( XDicObjH.code ).arg( XDicObjH.size ).arg( XDicObjH.ref, 0, 16 ) ); - QgsDebugMsg( QString( "Remaining bytes: %1" ).arg( buf->numRemainingBytes() ) ); - } - /*RLZ: fails verify this part*/ - dwgHandle XRefH = buf->getHandle(); - QgsDebugMsg( QString( "XRefH Handle: %1.%2 0x%3" ).arg( XRefH.code ).arg( XRefH.size ).arg( XRefH.ref, 0, 16 ) ); - QgsDebugMsg( QString( "Remaining bytes: %1" ).arg( buf->numRemainingBytes() ) ); - - // RS crc; //RS */ - return buf->isGood(); + DRW_DBG("Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n\n"); + // RS crc; //RS */ + return buf->isGood(); } -bool DRW_AppId::parseDwg( DRW::Version version, dwgBuffer *buf, duint32 bs ) -{ - dwgBuffer sBuff = *buf; - dwgBuffer *sBuf = buf; - if ( version > DRW::AC1018 ) //2007+ - { - sBuf = &sBuff; //separate buffer for strings - } - bool ret = DRW_TableEntry::parseDwg( version, buf, sBuf, bs ); - QgsDebugMsg( "***************************** parsing app Id *********************************************" ); - if ( !ret ) - return ret; +bool DRW_AppId::parseDwg(DRW::Version version, dwgBuffer *buf, duint32 bs){ + dwgBuffer sBuff = *buf; + dwgBuffer *sBuf = buf; + if (version > DRW::AC1018) {//2007+ + sBuf = &sBuff; //separate buffer for strings + } + bool ret = DRW_TableEntry::parseDwg(version, buf, sBuf, bs); + DRW_DBG("\n***************************** parsing app Id *********************************************\n"); + if (!ret) + return ret; + name = sBuf->getVariableText(version, false); + DRW_DBG("appId name: "); DRW_DBG(name.c_str()); DRW_DBG("\n"); + flags |= buf->getBit()<< 6;// code 70, bit 7 (64) + /*dint16 xrefindex =*/ buf->getBitShort(); + flags |= buf->getBit() << 4; //is refx dependent, style code 70, bit 5 (16) + duint8 unknown = buf->getRawChar8(); // unknown code 71 + DRW_DBG("unknown code 71: "); DRW_DBG(unknown); DRW_DBG("\n"); + if (version > DRW::AC1018) {//2007+ skip string area + buf->setPosition(objSize >> 3); + buf->setBitPos(objSize & 7); + } + dwgHandle appIdControlH = buf->getHandle(); + DRW_DBG(" parentControlH Handle: "); DRW_DBGHL(appIdControlH.code, appIdControlH.size, appIdControlH.ref); DRW_DBG("\n"); + parentHandle = appIdControlH.ref; + DRW_DBG("Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n"); + if (xDictFlag !=1){//linetype in 2004 seems not have XDicObjH or NULL handle + dwgHandle XDicObjH = buf->getHandle(); + DRW_DBG(" XDicObj control Handle: "); DRW_DBGHL(XDicObjH.code, XDicObjH.size, XDicObjH.ref); DRW_DBG("\n"); + DRW_DBG("Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n"); + } +/*RLZ: fails verify this part*/ dwgHandle XRefH = buf->getHandle(); + DRW_DBG(" XRefH control Handle: "); DRW_DBGHL(XRefH.code, XRefH.size, XRefH.ref); DRW_DBG("\n"); - name = sBuf->getVariableText( version, false ); - - QgsDebugMsg( QString( "appId name:%1" ).arg( name.c_str() ) ); - - flags |= buf->getBit() << 6;// code 70, bit 7 (64) - /*dint16 xrefindex =*/ - buf->getBitShort(); - flags |= buf->getBit() << 4; //is refx dependent, style code 70, bit 5 (16) - duint8 unknown = buf->getRawChar8(); // unknown code 71 - QgsDebugMsg( QString( "unknown code 71:%1" ).arg( unknown ) ); - Q_UNUSED( unknown ); - - if ( version > DRW::AC1018 ) //2007+ skip string area - { - buf->setPosition( objSize >> 3 ); - buf->setBitPos( objSize & 7 ); - } - - dwgHandle appIdControlH = buf->getHandle(); - QgsDebugMsg( QString( "appIdControlH Handle: %1.%2 0x%3" ).arg( appIdControlH.code ).arg( appIdControlH.size ).arg( appIdControlH.ref, 0, 16 ) ); - parentHandle = appIdControlH.ref; - - QgsDebugMsg( QString( "Remaining bytes: %1" ).arg( buf->numRemainingBytes() ) ); - - if ( xDictFlag != 1 ) //linetype in 2004 seems not have XDicObjH or NULL handle - { - dwgHandle XDicObjH = buf->getHandle(); - QgsDebugMsg( QString( "XDicObjH Handle: %1.%2 0x%3" ).arg( XDicObjH.code ).arg( XDicObjH.size ).arg( XDicObjH.ref, 0, 16 ) ); - QgsDebugMsg( QString( "Remaining bytes: %1" ).arg( buf->numRemainingBytes() ) ); - } - /*RLZ: fails verify this part*/ - dwgHandle XRefH = buf->getHandle(); - QgsDebugMsg( QString( "XRefH Handle: %1.%2 0x%3" ).arg( XRefH.code ).arg( XRefH.size ).arg( XRefH.ref, 0, 16 ) ); - QgsDebugMsg( QString( "Remaining bytes: %1" ).arg( buf->numRemainingBytes() ) ); - - // RS crc; //RS */ - return buf->isGood(); + DRW_DBG("Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n\n"); + // RS crc; //RS */ + return buf->isGood(); } diff --git a/external/libdxfrw/intern/dwgreader.cpp b/external/libdxfrw/intern/dwgreader.cpp index e56e651aefd..7c2a6b0a22c 100644 --- a/external/libdxfrw/intern/dwgreader.cpp +++ b/external/libdxfrw/intern/dwgreader.cpp @@ -1070,7 +1070,7 @@ bool dwgReader::readPlineVertex( DRW_Polyline &pline, dwgBuffer *dbuf ) } else //2004+ { - for ( std::list::iterator it = pline.handleList.begin() ; it != pline.handleList.end(); ++it ) + for ( std::list::iterator it = pline.handlesList.begin() ; it != pline.handlesList.end(); ++it ) { duint32 nextH = *it; mit = ObjectMap.find( nextH ); diff --git a/external/libdxfrw/libdxfrw.cpp b/external/libdxfrw/libdxfrw.cpp index 8032844f253..0a993766852 100644 --- a/external/libdxfrw/libdxfrw.cpp +++ b/external/libdxfrw/libdxfrw.cpp @@ -732,7 +732,7 @@ bool dxfRW::writeCircle( DRW_Circle *ent ) { writer->writeDouble( 30, ent->basePoint.z ); } - writer->writeDouble( 40, ent->mRadius ); + writer->writeDouble( 40, ent->radius ); return true; } @@ -750,7 +750,7 @@ bool dxfRW::writeArc( DRW_Arc *ent ) { writer->writeDouble( 30, ent->basePoint.z ); } - writer->writeDouble( 40, ent->mRadius ); + writer->writeDouble( 40, ent->radius ); if ( version > DRW::AC1009 ) { writer->writeString( 100, "AcDbArc" ); @@ -809,9 +809,9 @@ bool dxfRW::writeTrace( DRW_Trace *ent ) writer->writeDouble( 12, ent->thirdPoint.x ); writer->writeDouble( 22, ent->thirdPoint.y ); writer->writeDouble( 32, ent->thirdPoint.z ); - writer->writeDouble( 13, ent->fourthPoint.x ); - writer->writeDouble( 23, ent->fourthPoint.y ); - writer->writeDouble( 33, ent->fourthPoint.z ); + writer->writeDouble( 13, ent->forthPoint.x ); + writer->writeDouble( 23, ent->forthPoint.y ); + writer->writeDouble( 33, ent->forthPoint.z ); return true; } @@ -832,9 +832,9 @@ bool dxfRW::writeSolid( DRW_Solid *ent ) writer->writeDouble( 12, ent->thirdPoint.x ); writer->writeDouble( 22, ent->thirdPoint.y ); writer->writeDouble( 32, ent->thirdPoint.z ); - writer->writeDouble( 13, ent->fourthPoint.x ); - writer->writeDouble( 23, ent->fourthPoint.y ); - writer->writeDouble( 33, ent->fourthPoint.z ); + writer->writeDouble( 13, ent->forthPoint.x ); + writer->writeDouble( 23, ent->forthPoint.y ); + writer->writeDouble( 33, ent->forthPoint.z ); return true; } @@ -855,9 +855,9 @@ bool dxfRW::write3dface( DRW_3Dface *ent ) writer->writeDouble( 12, ent->thirdPoint.x ); writer->writeDouble( 22, ent->thirdPoint.y ); writer->writeDouble( 32, ent->thirdPoint.z ); - writer->writeDouble( 13, ent->fourthPoint.x ); - writer->writeDouble( 23, ent->fourthPoint.y ); - writer->writeDouble( 33, ent->fourthPoint.z ); + writer->writeDouble( 13, ent->forthPoint.x ); + writer->writeDouble( 23, ent->forthPoint.y ); + writer->writeDouble( 33, ent->forthPoint.z ); writer->writeInt16( 70, ent->invisibleflag ); return true; } @@ -873,16 +873,16 @@ bool dxfRW::writeLWPolyline( DRW_LWPolyline *ent ) writer->writeString( 100, "AcDbPolyline" ); } ent->vertexnum = ent->vertlist.size(); - writer->writeInt32( 90, static_cast( ent->vertexnum ) ); + writer->writeInt32( 90, ent->vertexnum ); writer->writeInt16( 70, ent->flags ); writer->writeDouble( 43, ent->width ); if ( ent->elevation != 0 ) writer->writeDouble( 38, ent->elevation ); if ( ent->thickness != 0 ) writer->writeDouble( 39, ent->thickness ); - for ( std::vector::size_type i = 0; i < ent->vertexnum; i++ ) + for ( int i = 0; i < ent->vertexnum; i++ ) { - DRW_Vertex2D *v = ent->vertlist.at( i ); + auto v = ent->vertlist.at( i ); writer->writeDouble( 10, v->x ); writer->writeDouble( 20, v->y ); if ( v->stawidth != 0 ) @@ -1044,7 +1044,7 @@ bool dxfRW::writeSpline( DRW_Spline *ent ) } for ( int i = 0; i < ent->ncontrol; i++ ) { - DRW_Coord *crd = ent->controllist.at( i ); + auto crd = ent->controllist.at( i ); writer->writeDouble( 10, crd->x ); writer->writeDouble( 20, crd->y ); writer->writeDouble( 30, crd->z ); @@ -1073,12 +1073,12 @@ bool dxfRW::writeHatch( DRW_Hatch *ent ) writer->writeString( 2, ent->name ); writer->writeInt16( 70, ent->solid ); writer->writeInt16( 71, ent->associative ); - ent->loopsnum = ent->looplist.size(); - writer->writeInt16( 91, static_cast( ent->loopsnum ) ); + ent->loopsnum = static_cast< int >( ent->looplist.size() ); + writer->writeInt16( 91, ent->loopsnum ); //write paths data - for ( std::vector::size_type i = 0; i < ent->loopsnum; i++ ) + for ( int i = 0; i < ent->loopsnum; i++ ) { - DRW_HatchLoop *loop = ent->looplist.at( i ); + auto loop = ent->looplist.at( i ); writer->writeInt16( 92, loop->type ); if ( ( loop->type & 2 ) == 2 ) { @@ -1096,7 +1096,7 @@ bool dxfRW::writeHatch( DRW_Hatch *ent ) case DRW::LINE: { writer->writeInt16( 72, 1 ); - DRW_Line *l = ( DRW_Line * )loop->objlist.at( j ); + DRW_Line* l = (DRW_Line*)loop->objlist.at(j).get(); writer->writeDouble( 10, l->basePoint.x ); writer->writeDouble( 20, l->basePoint.y ); writer->writeDouble( 11, l->secPoint.x ); @@ -1106,10 +1106,10 @@ bool dxfRW::writeHatch( DRW_Hatch *ent ) case DRW::ARC: { writer->writeInt16( 72, 2 ); - DRW_Arc *a = ( DRW_Arc * )loop->objlist.at( j ); + DRW_Arc* a = (DRW_Arc*)loop->objlist.at(j).get(); writer->writeDouble( 10, a->basePoint.x ); writer->writeDouble( 20, a->basePoint.y ); - writer->writeDouble( 40, a->mRadius ); + writer->writeDouble( 40, a->radius ); writer->writeDouble( 50, a->staangle * ARAD ); writer->writeDouble( 51, a->endangle * ARAD ); writer->writeInt16( 73, a->isccw ); @@ -1118,7 +1118,7 @@ bool dxfRW::writeHatch( DRW_Hatch *ent ) case DRW::ELLIPSE: { writer->writeInt16( 72, 3 ); - DRW_Ellipse *a = ( DRW_Ellipse * )loop->objlist.at( j ); + DRW_Ellipse* a = (DRW_Ellipse*)loop->objlist.at(j).get(); a->correctAxis(); writer->writeDouble( 10, a->basePoint.x ); writer->writeDouble( 20, a->basePoint.y ); @@ -1184,7 +1184,7 @@ bool dxfRW::writeLeader( DRW_Leader *ent ) writer->writeDouble( 76, ent->vertexlist.size() ); for ( unsigned int i = 0; i < ent->vertexlist.size(); i++ ) { - DRW_Coord *vert = ent->vertexlist.at( i ); + auto vert = ent->vertexlist.at( i ); writer->writeDouble( 10, vert->x ); writer->writeDouble( 20, vert->y ); writer->writeDouble( 30, vert->z ); diff --git a/src/app/dwg/qgsdwgimporter.cpp b/src/app/dwg/qgsdwgimporter.cpp index b9f162bc7a4..fcdfa522db8 100644 --- a/src/app/dwg/qgsdwgimporter.cpp +++ b/src/app/dwg/qgsdwgimporter.cpp @@ -1579,9 +1579,9 @@ bool QgsDwgImporter::circularStringFromArc( const DRW_Arc &data, QgsCircularStri const double a2 = data.isccw ? data.endangle : -data.endangle; c.setPoints( QgsPointSequence() - << QgsPoint( QgsWkbTypes::PointZ, data.basePoint.x + std::cos( a0 ) * data.mRadius, data.basePoint.y + std::sin( a0 ) * data.mRadius ) - << QgsPoint( QgsWkbTypes::PointZ, data.basePoint.x + std::cos( a1 ) * data.mRadius, data.basePoint.y + std::sin( a1 ) * data.mRadius ) - << QgsPoint( QgsWkbTypes::PointZ, data.basePoint.x + std::cos( a2 ) * data.mRadius, data.basePoint.y + std::sin( a2 ) * data.mRadius ) + << QgsPoint( QgsWkbTypes::PointZ, data.basePoint.x + std::cos( a0 ) * data.radius, data.basePoint.y + std::sin( a0 ) * data.radius ) + << QgsPoint( QgsWkbTypes::PointZ, data.basePoint.x + std::cos( a1 ) * data.radius, data.basePoint.y + std::sin( a1 ) * data.radius ) + << QgsPoint( QgsWkbTypes::PointZ, data.basePoint.x + std::cos( a2 ) * data.radius, data.basePoint.y + std::sin( a2 ) * data.radius ) ); return true; @@ -1635,9 +1635,9 @@ void QgsDwgImporter::addCircle( const DRW_Circle &data ) QgsCircularString c; c.setPoints( QgsPointSequence() - << QgsPoint( QgsWkbTypes::PointZ, data.basePoint.x - data.mRadius, data.basePoint.y, data.basePoint.z ) - << QgsPoint( QgsWkbTypes::PointZ, data.basePoint.x + data.mRadius, data.basePoint.y, data.basePoint.z ) - << QgsPoint( QgsWkbTypes::PointZ, data.basePoint.x - data.mRadius, data.basePoint.y, data.basePoint.z ) + << QgsPoint( QgsWkbTypes::PointZ, data.basePoint.x - data.radius, data.basePoint.y, data.basePoint.z ) + << QgsPoint( QgsWkbTypes::PointZ, data.basePoint.x + data.radius, data.basePoint.y, data.basePoint.z ) + << QgsPoint( QgsWkbTypes::PointZ, data.basePoint.x - data.radius, data.basePoint.y, data.basePoint.z ) ); if ( !createFeature( layer, f, c ) ) @@ -2457,7 +2457,7 @@ void QgsDwgImporter::addSolid( const DRW_Solid &data ) QgsPointSequence s; s << QgsPoint( QgsWkbTypes::PointZ, data.basePoint.x, data.basePoint.y, data.basePoint.z ); s << QgsPoint( QgsWkbTypes::PointZ, data.secPoint.x, data.secPoint.y, data.basePoint.z ); - s << QgsPoint( QgsWkbTypes::PointZ, data.fourthPoint.x, data.fourthPoint.y, data.basePoint.z ); + s << QgsPoint( QgsWkbTypes::PointZ, data.forthPoint.x, data.forthPoint.y, data.basePoint.z ); s << QgsPoint( QgsWkbTypes::PointZ, data.thirdPoint.x, data.thirdPoint.y, data.basePoint.z ); s << s[0]; @@ -2650,17 +2650,12 @@ void QgsDwgImporter::addHatch( const DRW_Hatch *pdata ) for ( std::vector::size_type j = 0; j < hatchLoop.objlist.size(); j++ ) { Q_ASSERT( hatchLoop.objlist[j] ); - const DRW_Entity *entity = hatchLoop.objlist[j]; - - const DRW_LWPolyline *lwp = dynamic_cast( entity ); - const DRW_Line *l = dynamic_cast( entity ); - const DRW_Arc *a = dynamic_cast( entity ); - const DRW_Spline *sp = dynamic_cast( entity ); - if ( lwp ) + const DRW_Entity *entity = hatchLoop.objlist[j].get(); + if ( const DRW_LWPolyline *lwp = dynamic_cast( entity ) ) { curveFromLWPolyline( *lwp, *cc ); } - else if ( l ) + else if ( const DRW_Line *l = dynamic_cast( entity ) ) { QgsLineString *ls = new QgsLineString(); ls->setPoints( QgsPointSequence() @@ -2672,7 +2667,7 @@ void QgsDwgImporter::addHatch( const DRW_Hatch *pdata ) cc->addCurve( ls ); } - else if ( a ) + else if ( const DRW_Arc *a = dynamic_cast( entity ) ) { QgsCircularString *cs = new QgsCircularString(); circularStringFromArc( *a, *cs ); @@ -2682,7 +2677,7 @@ void QgsDwgImporter::addHatch( const DRW_Hatch *pdata ) cc->addCurve( cs ); } - else if ( sp ) + else if ( const DRW_Spline *sp = dynamic_cast( entity ) ) { QgsLineString *ls = new QgsLineString(); lineFromSpline( *sp, *ls );