OGRDWGLayer::OGRDWGLayer( OGRDWGDataSource *poDSIn ) { this->poDS = poDSIn; iNextFID = 0; poFeatureDefn = new OGRFeatureDefn( "entities" ); SetDescription( poFeatureDefn->GetName() ); poFeatureDefn->Reference(); poDS->AddStandardFields( poFeatureDefn ); if( !poDS->InlineBlocks() ) { OGRFieldDefn oScaleField( "BlockScale", OFTRealList ); poFeatureDefn->AddFieldDefn( &oScaleField ); OGRFieldDefn oBlockAngleField( "BlockAngle", OFTReal ); poFeatureDefn->AddFieldDefn( &oBlockAngleField ); } /* -------------------------------------------------------------------- */ /* Find the *Paper_Space block, which seems to contain all the */ /* regular entities. */ /* -------------------------------------------------------------------- */ OdDbBlockTablePtr pTable = poDS->GetDB()->getBlockTableId().safeOpenObject(); OdDbSymbolTableIteratorPtr pBlkIter = pTable->newIterator(); for (pBlkIter->start(); ! pBlkIter->done(); pBlkIter->step()) { m_poBlock = pBlkIter->getRecordId().safeOpenObject(); if( EQUAL(m_poBlock->getName(),"*Model_Space") ) break; else m_poBlock = NULL; } ResetReading(); }
void OGRDWGDataSource::ReadBlocksSection() { OGRDWGLayer *poReaderLayer = (OGRDWGLayer *) GetLayerByName( "Entities" ); int bMergeBlockGeometries = CSLTestBoolean( CPLGetConfigOption( "DWG_MERGE_BLOCK_GEOMETRIES", "TRUE" ) ); /* -------------------------------------------------------------------- */ /* Loop over all the block tables, skipping *Model_Space which */ /* we assume is primary entities. */ /* -------------------------------------------------------------------- */ OdDbBlockTableRecordPtr poModelSpace, poBlock; OdDbBlockTablePtr pTable = GetDB()->getBlockTableId().safeOpenObject(); OdDbSymbolTableIteratorPtr pBlkIter = pTable->newIterator(); for (pBlkIter->start(); ! pBlkIter->done(); pBlkIter->step()) { poBlock = pBlkIter->getRecordId().safeOpenObject(); CPLString osBlockName = (const char *) poBlock->getName(); if( EQUAL(osBlockName,"*Model_Space") ) { poModelSpace = poBlock; continue; } poReaderLayer->SetBlockTable( poBlock ); // Now we will process entities till we run out. // 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) || !bMergeBlockGeometries ) { 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( "DWG", "Read %d blocks with meaningful geometry.", (int) oBlockMap.size() ); poReaderLayer->SetBlockTable( poModelSpace ); }