OGRErr OGRDXFWriterLayer::ICreateFeature( OGRFeature *poFeature ) { OGRGeometry *poGeom = poFeature->GetGeometryRef(); OGRwkbGeometryType eGType = wkbNone; if( poGeom != nullptr ) { if( !poGeom->IsEmpty() ) { OGREnvelope sEnvelope; poGeom->getEnvelope(&sEnvelope); poDS->UpdateExtent(&sEnvelope); } eGType = wkbFlatten(poGeom->getGeometryType()); } if( eGType == wkbPoint ) { const char *pszBlockName = poFeature->GetFieldAsString("BlockName"); // We don't want to treat as a blocks ref if the block is not defined if( pszBlockName && poDS->oHeaderDS.LookupBlock(pszBlockName) == nullptr ) { if( poDS->poBlocksLayer == nullptr || poDS->poBlocksLayer->FindBlock(pszBlockName) == nullptr ) pszBlockName = nullptr; } if( pszBlockName != nullptr ) return WriteINSERT( poFeature ); else if( poFeature->GetStyleString() != nullptr && STARTS_WITH_CI(poFeature->GetStyleString(), "LABEL") ) return WriteTEXT( poFeature ); else return WritePOINT( poFeature ); } else if( eGType == wkbLineString || eGType == wkbMultiLineString ) return WritePOLYLINE( poFeature ); else if( eGType == wkbPolygon || eGType == wkbTriangle || eGType == wkbMultiPolygon) { if( bWriteHatch ) return WriteHATCH( poFeature ); else return WritePOLYLINE( poFeature ); } // Explode geometry collections into multiple entities. else if( eGType == wkbGeometryCollection ) { OGRGeometryCollection *poGC = poFeature->StealGeometry()->toGeometryCollection(); for( auto&& poMember: poGC ) { poFeature->SetGeometry( poMember ); OGRErr eErr = CreateFeature( poFeature ); if( eErr != OGRERR_NONE ) { delete poGC; return eErr; } } poFeature->SetGeometryDirectly( poGC ); return OGRERR_NONE; } else { CPLError( CE_Failure, CPLE_AppDefined, "No known way to write feature with geometry '%s'.", OGRGeometryTypeToName(eGType) ); return OGRERR_FAILURE; } }
OGRErr OGRDXFWriterLayer::ICreateFeature( OGRFeature *poFeature ) { OGRGeometry *poGeom = poFeature->GetGeometryRef(); OGRwkbGeometryType eGType = wkbNone; if( poGeom != NULL ) { if( !poGeom->IsEmpty() ) { OGREnvelope sEnvelope; poGeom->getEnvelope(&sEnvelope); poDS->UpdateExtent(&sEnvelope); } eGType = wkbFlatten(poGeom->getGeometryType()); } if( eGType == wkbPoint ) { const char *pszBlockName = poFeature->GetFieldAsString("BlockName"); // we don't want to treat as a block ref if we are writing blocks layer if( pszBlockName != NULL && poDS->poBlocksLayer != NULL && poFeature->GetDefnRef() == poDS->poBlocksLayer->GetLayerDefn()) pszBlockName = NULL; // We don't want to treat as a blocks ref if the block is not defined if( pszBlockName && poDS->oHeaderDS.LookupBlock(pszBlockName) == NULL ) { if( poDS->poBlocksLayer == NULL || poDS->poBlocksLayer->FindBlock(pszBlockName) == NULL ) pszBlockName = NULL; } if( pszBlockName != NULL ) return WriteINSERT( poFeature ); else if( poFeature->GetStyleString() != NULL && EQUALN(poFeature->GetStyleString(),"LABEL",5) ) return WriteTEXT( poFeature ); else return WritePOINT( poFeature ); } else if( eGType == wkbLineString || eGType == wkbMultiLineString ) return WritePOLYLINE( poFeature ); else if( eGType == wkbPolygon || eGType == wkbMultiPolygon ) { if( bWriteHatch ) return WriteHATCH( poFeature ); else return WritePOLYLINE( poFeature ); } // Explode geometry collections into multiple entities. else if( eGType == wkbGeometryCollection ) { OGRGeometryCollection *poGC = (OGRGeometryCollection *) poFeature->StealGeometry(); int iGeom; for( iGeom = 0; iGeom < poGC->getNumGeometries(); iGeom++ ) { poFeature->SetGeometry( poGC->getGeometryRef(iGeom) ); OGRErr eErr = CreateFeature( poFeature ); if( eErr != OGRERR_NONE ) return eErr; } poFeature->SetGeometryDirectly( poGC ); return OGRERR_NONE; } else { CPLError( CE_Failure, CPLE_AppDefined, "No known way to write feature with geometry '%s'.", OGRGeometryTypeToName(eGType) ); return OGRERR_FAILURE; } }