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() ); }
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 ); }