From 5cd9ce80fd86e5aa9cefc229ac1c1773a40c2897 Mon Sep 17 00:00:00 2001 From: isn Date: Thu, 25 Jun 2015 17:45:28 +0300 Subject: [PATCH] Import/Export new corrections --- src/HYDROGUI/HYDROGUI_ExportFileOp.cxx | 81 +++++++++++++++++++++----- src/HYDROGUI/HYDROGUI_ExportFileOp.h | 6 +- 2 files changed, 69 insertions(+), 18 deletions(-) diff --git a/src/HYDROGUI/HYDROGUI_ExportFileOp.cxx b/src/HYDROGUI/HYDROGUI_ExportFileOp.cxx index b52e18b0..e5dcd7ff 100644 --- a/src/HYDROGUI/HYDROGUI_ExportFileOp.cxx +++ b/src/HYDROGUI/HYDROGUI_ExportFileOp.cxx @@ -46,9 +46,13 @@ #include #include #include +#include #include #include - +#include +#include +#include +#include HYDROGUI_ExportFileOp::HYDROGUI_ExportFileOp( HYDROGUI_Module* theModule ) : HYDROGUI_Operation( theModule ) @@ -93,34 +97,49 @@ void HYDROGUI_ExportFileOp::startOperation() SUIT_MessageBox::warning( module()->getApp()->desktop(), "Export Polyline", "Cannot export polylines of different kind"); else { - QString aPolyName = ""; + QString aName = ""; if (aPolyXYSeq.Size() == 1 && aPoly3DSeq.IsEmpty()) - aPolyName = aPolyXYSeq(1)->GetName(); + aName = aPolyXYSeq(1)->GetName(); if (aPoly3DSeq.Size() == 1 && aPolyXYSeq.IsEmpty()) - aPolyName = aPoly3DSeq(1)->GetName(); - QString aFileName = SUIT_FileDlg::getFileName( module()->getApp()->desktop(), aPolyName, aFilter, tr( "EXPORT_TO_SHAPE_FILE" ), false ); + aName = aPoly3DSeq(1)->GetName(); + if (aLCSeq.Size() == 1 && aPolyXYSeq.IsEmpty() && aPoly3DSeq.IsEmpty()) + aName = aLCSeq(1)->GetName(); + QString aFileName = SUIT_FileDlg::getFileName( module()->getApp()->desktop(), aName, aFilter, tr( "EXPORT_TO_SHAPE_FILE" ), false ); if (!aFileName.isEmpty()) { SHPHandle hSHPHandle; + QStringList aNonExpList; if (!aPolyXYSeq.IsEmpty() && aPoly3DSeq.IsEmpty()) { - hSHPHandle = SHPCreate( aFileName.toAscii().data(), SHPT_ARC ); + hSHPHandle = SHPCreate( aFileName.toAscii().data(), SHPT_ARC ); for (int i = 1; i <= aPolyXYSeq.Size(); i++) - WriteObjectPolyXY(hSHPHandle, aPolyXYSeq(i)); + if (WriteObjectPolyXY(hSHPHandle, aPolyXYSeq(i)) != 1) + aNonExpList.append(aPolyXYSeq(i)->GetName()); + } else if (aPolyXYSeq.IsEmpty() && !aPoly3DSeq.IsEmpty()) { hSHPHandle = SHPCreate( aFileName.toAscii().data(), SHPT_ARCZ ); for (int i = 1; i <= aPoly3DSeq.Size(); i++) - WriteObjectPoly3D(hSHPHandle, aPoly3DSeq(i)); + if (WriteObjectPoly3D(hSHPHandle, aPoly3DSeq(i)) != 1) + aNonExpList.append(aPoly3DSeq(i)->GetName()); } else if (aPolyXYSeq.IsEmpty() && aPoly3DSeq.IsEmpty() && !aLCSeq.IsEmpty()) { hSHPHandle = SHPCreate( aFileName.toAscii().data(), SHPT_POLYGON ); for (int i = 1; i <= aLCSeq.Size(); i++) - WriteObjectLC(hSHPHandle, aLCSeq(i)); + if (WriteObjectLC(hSHPHandle, aLCSeq(i)) != 1) + aNonExpList.append(aLCSeq(i)->GetName()); } SHPClose( hSHPHandle ); + if (!aNonExpList.empty()) + { + QString aMessage = "The next entities cannot be exported:\n"; + foreach (QString anNonExpEntName, aNonExpList) + aMessage += anNonExpEntName + "\n"; + SUIT_MessageBox::warning( module()->getApp()->desktop(), "Export warning", aMessage); + } + //TODO pint aNonExpList commit(); } else @@ -129,12 +148,16 @@ void HYDROGUI_ExportFileOp::startOperation() } -void HYDROGUI_ExportFileOp::WriteObjectPolyXY(SHPHandle theShpHandle, Handle_HYDROData_PolylineXY thePoly ) +int HYDROGUI_ExportFileOp::WriteObjectPolyXY(SHPHandle theShpHandle, Handle_HYDROData_PolylineXY thePoly ) { SHPObject *aSHPObj; std::vector x, y; std::vector anPartStart; + for (int i = 0; i < thePoly->NbSections(); i++) + if (thePoly->GetSectionType(i) == HYDROData_IPolyline::SECTION_SPLINE) + return -1; + for (int i = 0; i < thePoly->NbSections(); i++) { anPartStart.push_back(x.size()); @@ -154,13 +177,18 @@ void HYDROGUI_ExportFileOp::WriteObjectPolyXY(SHPHandle theShpHandle, Handle_HYD aSHPObj = SHPCreateObject( SHPT_ARC, -1, thePoly->NbSections(), &anPartStart[0], NULL, x.size(), &x[0], &y[0], NULL, NULL ); SHPWriteObject( theShpHandle, -1, aSHPObj ); SHPDestroyObject( aSHPObj ); + return 1; } -void HYDROGUI_ExportFileOp::WriteObjectPoly3D(SHPHandle theShpHandle, Handle_HYDROData_Polyline3D thePoly ) +int HYDROGUI_ExportFileOp::WriteObjectPoly3D(SHPHandle theShpHandle, Handle_HYDROData_Polyline3D thePoly ) { SHPObject *aSHPObj; std::vector x, y, z; std::vector anPartStart; + + for (int i = 0; i < thePoly->GetPolylineXY()->NbSections(); i++) + if (thePoly->GetPolylineXY()->GetSectionType(i) == HYDROData_IPolyline::SECTION_SPLINE) + return -1; for (int i = 0; i < thePoly->GetPolylineXY()->NbSections(); i++) { @@ -184,14 +212,35 @@ void HYDROGUI_ExportFileOp::WriteObjectPoly3D(SHPHandle theShpHandle, Handle_HYD aSHPObj = SHPCreateObject( SHPT_ARCZ, -1, thePoly->GetPolylineXY()->NbSections(), &anPartStart[0], NULL, x.size(), &x[0], &y[0], &z[0], NULL ); SHPWriteObject( theShpHandle, -1, aSHPObj ); SHPDestroyObject( aSHPObj ); + return 1; } -void HYDROGUI_ExportFileOp::WriteObjectLC(SHPHandle theShpHandle, Handle_HYDROData_LandCover theLC ) +int HYDROGUI_ExportFileOp::WriteObjectLC(SHPHandle theShpHandle, Handle_HYDROData_LandCover theLC ) { - TopoDS_Shape aSh = theLC->GetShape(); if (aSh.IsNull()) - return; + return 0; + TopExp_Explorer anEdgeEx(aSh, TopAbs_EDGE); + for (; anEdgeEx.More(); anEdgeEx.Next()) + { + TopoDS_Edge E = TopoDS::Edge(anEdgeEx.Current()); + double aFP, aLP; + Handle_Geom_Curve aCur = BRep_Tool::Curve(E, aFP, aLP); + Handle(Geom_Line) aLine = Handle(Geom_Line)::DownCast(aCur); + if (aLine.IsNull()) + { + Handle(Geom_TrimmedCurve) aTC = Handle(Geom_TrimmedCurve)::DownCast(aCur); + if (!aTC.IsNull()) + { + Handle(Geom_Line) aLine = Handle(Geom_Line)::DownCast(aTC->BasisCurve()); + if (aLine.IsNull()) + return -1; + } + else + return -1; + } + + } if (aSh.ShapeType() == TopAbs_FACE) { ProcessFace(TopoDS::Face(aSh), theShpHandle); @@ -208,7 +257,9 @@ void HYDROGUI_ExportFileOp::WriteObjectLC(SHPHandle theShpHandle, Handle_HYDRODa } } else - return; + return 0; + + return 1; } diff --git a/src/HYDROGUI/HYDROGUI_ExportFileOp.h b/src/HYDROGUI/HYDROGUI_ExportFileOp.h index ed9baa99..886424df 100644 --- a/src/HYDROGUI/HYDROGUI_ExportFileOp.h +++ b/src/HYDROGUI/HYDROGUI_ExportFileOp.h @@ -47,9 +47,9 @@ public: protected: virtual void startOperation(); - void WriteObjectPolyXY(SHPHandle theShpHandle, Handle_HYDROData_PolylineXY thePoly ); - void WriteObjectPoly3D(SHPHandle theShpHandle, Handle_HYDROData_Polyline3D thePoly ); - void WriteObjectLC(SHPHandle theShpHandle, Handle_HYDROData_LandCover theLC ); + int WriteObjectPolyXY(SHPHandle theShpHandle, Handle_HYDROData_PolylineXY thePoly ); + int WriteObjectPoly3D(SHPHandle theShpHandle, Handle_HYDROData_Polyline3D thePoly ); + int WriteObjectLC(SHPHandle theShpHandle, Handle_HYDROData_LandCover theLC ); private: void ProcessFace(TopoDS_Face theFace, SHPHandle theShpHandle); private: -- 2.39.2