OGRErr OGRDXFLayer::CollectPolylinePath( OGRGeometryCollection *poGC ) { int nCode; char szLineBuf[257]; DXFSmoothPolyline oSmoothPolyline; double dfBulge = 0.0; double dfX = 0.0, dfY = 0.0; int bHaveX = FALSE, bHaveY = FALSE; int bIsClosed = FALSE; int nVertexCount = -1; int bHaveBulges = FALSE; /* -------------------------------------------------------------------- */ /* Read the boundary path type. */ /* -------------------------------------------------------------------- */ while( (nCode = poDS->ReadValue(szLineBuf,sizeof(szLineBuf))) > 0 ) { if( nVertexCount > 0 && (int) oSmoothPolyline.size() == nVertexCount ) break; switch( nCode ) { case 93: nVertexCount = atoi(szLineBuf); break; case 72: bHaveBulges = atoi(szLineBuf); break; case 73: bIsClosed = atoi(szLineBuf); break; case 10: if( bHaveX && bHaveY ) { oSmoothPolyline.AddPoint(dfX, dfY, 0.0, dfBulge); dfBulge = 0.0; bHaveY = FALSE; } dfX = CPLAtof(szLineBuf); bHaveX = TRUE; break; case 20: if( bHaveX && bHaveY ) { oSmoothPolyline.AddPoint( dfX, dfY, 0.0, dfBulge ); dfBulge = 0.0; bHaveX = bHaveY = FALSE; } dfY = CPLAtof(szLineBuf); bHaveY = TRUE; if( bHaveX && bHaveY && !bHaveBulges ) { oSmoothPolyline.AddPoint( dfX, dfY, 0.0, dfBulge ); dfBulge = 0.0; bHaveX = bHaveY = FALSE; } break; case 42: dfBulge = CPLAtof(szLineBuf); if( bHaveX && bHaveY ) { oSmoothPolyline.AddPoint( dfX, dfY, 0.0, dfBulge ); dfBulge = 0.0; bHaveX = bHaveY = FALSE; } break; default: break; } } if( nCode != 10 && nCode != 20 && nCode != 42 && nCode >= 0) poDS->UnreadValue(); if( bHaveX && bHaveY ) oSmoothPolyline.AddPoint(dfX, dfY, 0.0, dfBulge); if( bIsClosed ) oSmoothPolyline.Close(); poGC->addGeometryDirectly( oSmoothPolyline.Tesselate() ); /* -------------------------------------------------------------------- */ /* Skip through source boundary objects if present. */ /* -------------------------------------------------------------------- */ nCode = poDS->ReadValue(szLineBuf,sizeof(szLineBuf)); if( nCode != 97 ) { if (nCode < 0) return OGRERR_FAILURE; poDS->UnreadValue(); } else { int iObj, nObjCount = atoi(szLineBuf); for( iObj = 0; iObj < nObjCount; iObj++ ) { if (poDS->ReadValue( szLineBuf, sizeof(szLineBuf) ) < 0) return OGRERR_FAILURE; } } return OGRERR_NONE; }
OGRErr OGRDXFLayer::CollectPolylinePath( OGRGeometryCollection *poGC, const double dfElevation ) { int nCode = 0; char szLineBuf[257]; DXFSmoothPolyline oSmoothPolyline; double dfBulge = 0.0; double dfX = 0.0; double dfY = 0.0; bool bHaveX = false; bool bHaveY = false; bool bIsClosed = false; int nVertexCount = -1; bool bHaveBulges = false; /* -------------------------------------------------------------------- */ /* Read the boundary path type. */ /* -------------------------------------------------------------------- */ while( (nCode = poDS->ReadValue(szLineBuf,sizeof(szLineBuf))) > 0 ) { if( nVertexCount > 0 && (int) oSmoothPolyline.size() == nVertexCount ) break; switch( nCode ) { case 93: nVertexCount = atoi(szLineBuf); break; case 72: bHaveBulges = CPL_TO_BOOL(atoi(szLineBuf)); break; case 73: bIsClosed = CPL_TO_BOOL(atoi(szLineBuf)); break; case 10: if( bHaveX && bHaveY ) { oSmoothPolyline.AddPoint(dfX, dfY, dfElevation, dfBulge); dfBulge = 0.0; bHaveY = false; } dfX = CPLAtof(szLineBuf); bHaveX = true; break; case 20: if( bHaveX && bHaveY ) { oSmoothPolyline.AddPoint( dfX, dfY, dfElevation, dfBulge ); dfBulge = 0.0; bHaveX = false; } dfY = CPLAtof(szLineBuf); bHaveY = true; if( bHaveX && bHaveY && !bHaveBulges ) { oSmoothPolyline.AddPoint( dfX, dfY, dfElevation, dfBulge ); dfBulge = 0.0; bHaveX = false; bHaveY = false; } break; case 42: dfBulge = CPLAtof(szLineBuf); if( bHaveX && bHaveY ) { oSmoothPolyline.AddPoint( dfX, dfY, dfElevation, dfBulge ); dfBulge = 0.0; bHaveX = false; bHaveY = false; } break; default: break; } } if( nCode < 0 ) { DXF_LAYER_READER_ERROR(); return OGRERR_FAILURE; } if( nCode != 10 && nCode != 20 && nCode != 42 ) poDS->UnreadValue(); if( bHaveX && bHaveY ) oSmoothPolyline.AddPoint(dfX, dfY, dfElevation, dfBulge); if( bIsClosed ) oSmoothPolyline.Close(); if(oSmoothPolyline.IsEmpty()) { return OGRERR_FAILURE; } poGC->addGeometryDirectly( oSmoothPolyline.Tesselate() ); /* -------------------------------------------------------------------- */ /* Skip through source boundary objects if present. */ /* -------------------------------------------------------------------- */ nCode = poDS->ReadValue(szLineBuf,sizeof(szLineBuf)); if( nCode != 97 ) { if (nCode < 0) return OGRERR_FAILURE; poDS->UnreadValue(); } else { int iObj, nObjCount = atoi(szLineBuf); for( iObj = 0; iObj < nObjCount; iObj++ ) { if (poDS->ReadValue( szLineBuf, sizeof(szLineBuf) ) < 0) return OGRERR_FAILURE; } } return OGRERR_NONE; }