void OGRDXFDataSource::ReadLayerDefinition() { char szLineBuf[257]; int nCode; std::map<CPLString,CPLString> oLayerProperties; CPLString osLayerName = ""; oLayerProperties["Hidden"] = "0"; while( (nCode = ReadValue( szLineBuf, sizeof(szLineBuf) )) > 0 ) { switch( nCode ) { case 2: osLayerName = ACTextUnescape(szLineBuf,GetEncoding()); oLayerProperties["Exists"] = "1"; break; case 6: oLayerProperties["Linetype"] = ACTextUnescape(szLineBuf, GetEncoding()); break; case 62: oLayerProperties["Color"] = szLineBuf; if( atoi(szLineBuf) < 0 ) // Is layer off? oLayerProperties["Hidden"] = "1"; break; case 70: oLayerProperties["Flags"] = szLineBuf; if( atoi(szLineBuf) & 0x01 ) // Is layer frozen? oLayerProperties["Hidden"] = "1"; break; case 370: case 39: oLayerProperties["LineWeight"] = szLineBuf; break; default: break; } } if( oLayerProperties.size() > 0 ) oLayerTable[osLayerName] = oLayerProperties; if( nCode == 0 ) UnreadValue(); }
void OGRDXFDataSource::ReadLayerDefinition() { char szLineBuf[257]; int nCode; std::map<CPLString,CPLString> oLayerProperties; CPLString osLayerName = ""; while( (nCode = ReadValue( szLineBuf, sizeof(szLineBuf) )) > 0 ) { switch( nCode ) { case 2: osLayerName = szLineBuf; oLayerProperties["Exists"] = "1"; break; case 6: oLayerProperties["Linetype"] = szLineBuf; break; case 62: oLayerProperties["Color"] = szLineBuf; break; case 70: oLayerProperties["Flags"] = szLineBuf; break; case 370: case 39: oLayerProperties["LineWeight"] = szLineBuf; break; default: break; } } if( oLayerProperties.size() > 0 ) oLayerTable[osLayerName] = oLayerProperties; UnreadValue(); }
void OGRDXFDataSource::ReadLineTypeDefinition() { char szLineBuf[257]; int nCode; CPLString osLineTypeName; CPLString osLineTypeDef; while( (nCode = ReadValue( szLineBuf, sizeof(szLineBuf) )) > 0 ) { switch( nCode ) { case 2: osLineTypeName = ACTextUnescape(szLineBuf,GetEncoding()); break; case 49: { if( osLineTypeDef != "" ) osLineTypeDef += " "; if( szLineBuf[0] == '-' ) osLineTypeDef += szLineBuf+1; else osLineTypeDef += szLineBuf; osLineTypeDef += "g"; } break; default: break; } } if( osLineTypeDef != "" ) oLineTypeTable[osLineTypeName] = osLineTypeDef; if( nCode == 0 ) UnreadValue(); }
void OGRDXFDataSource::ReadHeaderSection() { char szLineBuf[257]; int nCode; while( (nCode = ReadValue( szLineBuf, sizeof(szLineBuf) )) > -1 && !EQUAL(szLineBuf,"ENDSEC") ) { if( nCode != 9 ) continue; CPLString osName = szLineBuf; ReadValue( szLineBuf, sizeof(szLineBuf) ); CPLString osValue = szLineBuf; oHeaderVariables[osName] = osValue; } if (nCode != -1) { nCode = ReadValue( szLineBuf, sizeof(szLineBuf) ); UnreadValue(); } /* Unusual DXF files produced by dxflib */ /* such as http://www.ribbonsoft.com/library/architecture/plants/decd5.dxf */ /* where there is a spurious ENDSEC in the middle of the header variables */ if (nCode == 9 && EQUALN(szLineBuf,"$", 1) ) { while( (nCode = ReadValue( szLineBuf, sizeof(szLineBuf) )) > -1 && !EQUAL(szLineBuf,"ENDSEC") ) { if( nCode != 9 ) continue; CPLString osName = szLineBuf; ReadValue( szLineBuf, sizeof(szLineBuf) ); CPLString osValue = szLineBuf; oHeaderVariables[osName] = osValue; } } CPLDebug( "DXF", "Read %d header variables.", (int) oHeaderVariables.size() ); /* -------------------------------------------------------------------- */ /* Decide on what CPLRecode() name to use for the files */ /* encoding or allow the encoding to be overridden. */ /* -------------------------------------------------------------------- */ CPLString osCodepage = GetVariable( "$DWGCODEPAGE", "ANSI_1252" ); // not strictly accurate but works even without iconv. if( osCodepage == "ANSI_1252" ) osEncoding = CPL_ENC_ISO8859_1; else if( EQUALN(osCodepage,"ANSI_",5) ) { osEncoding = "CP"; osEncoding += osCodepage + 5; } else { // fallback to the default osEncoding = CPL_ENC_ISO8859_1; } if( CPLGetConfigOption( "DXF_ENCODING", NULL ) != NULL ) osEncoding = CPLGetConfigOption( "DXF_ENCODING", NULL ); if( osEncoding != CPL_ENC_ISO8859_1 ) CPLDebug( "DXF", "Treating DXF as encoding '%s', $DWGCODEPAGE='%s'", osEncoding.c_str(), osCodepage.c_str() ); }
void OGRDXFDataSource::ReadBlocksSection() { char szLineBuf[257]; int nCode; OGRDXFLayer *poReaderLayer = (OGRDXFLayer *) GetLayerByName( "Entities" ); iEntitiesSectionOffset = oReader.iSrcBufferFileOffset + oReader.iSrcBufferOffset; while( (nCode = ReadValue( szLineBuf, sizeof(szLineBuf) )) > -1 && !EQUAL(szLineBuf,"ENDSEC") ) { // We are only interested in extracting blocks. if( nCode != 0 || !EQUAL(szLineBuf,"BLOCK") ) continue; // Process contents of BLOCK definition till we find the // first entity. CPLString osBlockName; while( (nCode = ReadValue( szLineBuf,sizeof(szLineBuf) )) > 0 ) { if( nCode == 2 ) osBlockName = szLineBuf; // anything else we want? } if( EQUAL(szLineBuf,"ENDBLK") ) continue; UnreadValue(); // Now we will process entities till we run out at the ENDBLK code. // we aggregate the geometries of the features into a multi-geometry, // but throw away other stuff attached to the features. OGRFeature *poFeature; OGRGeometryCollection *poColl = new OGRGeometryCollection(); std::vector<OGRFeature*> apoFeatures; while( (poFeature = poReaderLayer->GetNextUnfilteredFeature()) != NULL ) { if( poFeature->GetStyleString() != NULL && strstr(poFeature->GetStyleString(),"LABEL") != NULL ) { apoFeatures.push_back( poFeature ); } else { poColl->addGeometryDirectly( poFeature->StealGeometry() ); delete poFeature; } } if( poColl->getNumGeometries() == 0 ) delete poColl; else oBlockMap[osBlockName].poGeometry = SimplifyBlockGeometry(poColl); if( apoFeatures.size() > 0 ) oBlockMap[osBlockName].apoFeatures = apoFeatures; } CPLDebug( "DXF", "Read %d blocks with meaningful geometry.", (int) oBlockMap.size() ); }