Free();
}
-void HYDROData_ShapeFile::Export(const QString& aFileName,
- NCollection_Sequence<Handle_HYDROData_PolylineXY> aPolyXYSeq,
- NCollection_Sequence<Handle_HYDROData_Polyline3D> aPoly3DSeq,
- QStringList& aNonExpList)
+void HYDROData_ShapeFile::Export(Handle(HYDROData_Document) theDocument,
+ const QString& aFileName,
+ NCollection_Sequence<Handle_HYDROData_PolylineXY> aPolyXYSeq,
+ NCollection_Sequence<Handle_HYDROData_Polyline3D> aPoly3DSeq,
+ QStringList& aNonExpList)
{
SHPHandle hSHPHandle;
if (!aPolyXYSeq.IsEmpty() && aPoly3DSeq.IsEmpty())
{
hSHPHandle = SHPCreate( aFileName.toAscii().data(), SHPT_ARC );
for (int i = 1; i <= aPolyXYSeq.Size(); i++)
- if (WriteObjectPolyXY(hSHPHandle, aPolyXYSeq(i)) != 1)
+ if (WriteObjectPolyXY(theDocument, 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++)
- if (WriteObjectPoly3D(hSHPHandle, aPoly3DSeq(i)) != 1)
+ if (WriteObjectPoly3D(theDocument, hSHPHandle, aPoly3DSeq(i)) != 1)
aNonExpList.append(aPoly3DSeq(i)->GetName());
}
if (hSHPHandle->nRecords > 0)
}
}
-void HYDROData_ShapeFile::Export(const QString& aFileName, const Handle_HYDROData_LandCoverMap& aLCM,
- QStringList& aNonExpList, bool bCheckLinear, bool bUseDiscr, double theDefl)
+void HYDROData_ShapeFile::Export(Handle(HYDROData_Document) theDocument,
+ const QString& aFileName,
+ const Handle_HYDROData_LandCoverMap& aLCM,
+ QStringList& aNonExpList,
+ bool bCheckLinear, bool bUseDiscr, double theDefl)
{
if (bCheckLinear && !aLCM->CheckLinear())
return;
for( ; It.More(); It.Next())
{
TopoDS_Face aFace = It.Face();
- if (WriteObjectPolygon(hSHPHandle, aFace, bUseDiscr, theDefl) != 1)
+ if (WriteObjectPolygon(theDocument, hSHPHandle, aFace, bUseDiscr, theDefl) != 1)
aNonExpList.append(aLCM->GetName() + "_" + QString::number(It.Index()));
}
}
}
-int HYDROData_ShapeFile::WriteObjectPolyXY(SHPHandle theShpHandle, Handle_HYDROData_PolylineXY thePoly )
+int HYDROData_ShapeFile::WriteObjectPolyXY(Handle(HYDROData_Document) theDocument,
+ SHPHandle theShpHandle,
+ Handle_HYDROData_PolylineXY thePoly )
{
SHPObject *aSHPObj;
std::vector<double> x, y;
HYDROData_PolylineXY::PointsList aPointList = thePoly->GetPoints(i);
for (int j = 1; j <= aPointList.Size(); j++)
{
- x.push_back( aPointList(j).X());
- y.push_back( aPointList(j).Y());
+ gp_XY P = aPointList(j);
+ theDocument->Transform(P, false);
+ x.push_back( P.X());
+ y.push_back( P.Y());
}
if (thePoly->IsClosedSection(i))
{
- x.push_back( aPointList(1).X());
- y.push_back( aPointList(1).Y());
+ gp_XY P = aPointList(1);
+ theDocument->Transform(P, false);
+ x.push_back( P.X());
+ y.push_back( P.Y());
}
}
return 1;
}
-int HYDROData_ShapeFile::WriteObjectPoly3D(SHPHandle theShpHandle, Handle_HYDROData_Polyline3D thePoly )
+int HYDROData_ShapeFile::WriteObjectPoly3D(Handle(HYDROData_Document) theDocument,
+ SHPHandle theShpHandle,
+ Handle_HYDROData_Polyline3D thePoly )
{
SHPObject *aSHPObj;
std::vector<double> x, y, z;
HYDROData_PolylineXY::PointsList aPointList = thePoly->GetPolylineXY()->GetPoints(i);
for (int j = 1; j <= aPointList.Size(); j++)
{
- x.push_back( aPointList(j).X());
- y.push_back( aPointList(j).Y());
+ gp_XY P = aPointList(j);
+ theDocument->Transform(P, false);
+ x.push_back( P.X());
+ y.push_back( P.Y());
z.push_back(thePoly->GetAltitudeObject()->GetAltitudeForPoint(gp_XY (aPointList(j).X(), aPointList(j).Y())));
}
if ( thePoly->GetPolylineXY()->IsClosedSection(i))
{
- x.push_back( aPointList(1).X());
- y.push_back( aPointList(1).Y());
+ gp_XY P = aPointList(1);
+ theDocument->Transform(P, false);
+ x.push_back( P.X());
+ y.push_back( P.Y());
z.push_back(thePoly->GetAltitudeObject()->GetAltitudeForPoint(gp_XY (aPointList(1).X(), aPointList(1).Y())));
}
return 1;
}
-int HYDROData_ShapeFile::WriteObjectPolygon(SHPHandle theShpHandle, const TopoDS_Shape& theInputShape,
+int HYDROData_ShapeFile::WriteObjectPolygon(Handle(HYDROData_Document) theDocument,
+ SHPHandle theShpHandle,
+ const TopoDS_Shape& theInputShape,
bool bUseDiscr, double theDefl)
{
if (theInputShape.IsNull())
if (theInputShape.ShapeType() == TopAbs_FACE)
{
- ProcessFace(TopoDS::Face(theInputShape), theShpHandle, bUseDiscr, theDefl);
+ ProcessFace(theDocument, TopoDS::Face(theInputShape), theShpHandle, bUseDiscr, theDefl);
}
else if (theInputShape.ShapeType() == TopAbs_COMPOUND)
{
TopoDS_Face aF = TopoDS::Face(Ex.Current());
if (aF.IsNull())
continue;
- ProcessFace(aF, theShpHandle, bUseDiscr, theDefl);
+ ProcessFace(theDocument, aF, theShpHandle, bUseDiscr, theDefl);
}
}
else
}
-void HYDROData_ShapeFile::ProcessFace(const TopoDS_Face& theFace, SHPHandle theShpHandle,
+void HYDROData_ShapeFile::ProcessFace(Handle(HYDROData_Document) theDocument,
+ const TopoDS_Face& theFace,
+ SHPHandle theShpHandle,
bool bUseDiscr, double theDefl )
{
if (theFace.ShapeType() != TopAbs_FACE)
//any other wires (holes) - in anticlockwise direction
for (int j = aNPnts.Size(); j >= 1; j--)
{
- x.push_back( aNPnts(j).X());
- y.push_back( aNPnts(j).Y());
+ gp_XY P = gp_XY(aNPnts(j).X(), aNPnts(j).Y());
+ theDocument->Transform(P, false);
+ x.push_back( P.X());
+ y.push_back( P.Y());
}
//first point is same as the last one => closed polygon
- x.push_back( aNPnts.Last().X());
- y.push_back( aNPnts.Last().Y());
+ gp_XY P = gp_XY(aNPnts.Last().X(), aNPnts.Last().Y());
+ theDocument->Transform(P, false);
+ x.push_back( P.X());
+ y.push_back( P.Y());
}
mySHPObjects.clear();
SHPGetInfo( theHandle, NULL, &aShapeType, NULL, NULL );
theShapeTypeOfFile = aShapeType;
- bool ToRead = (theType == ShapeType_Polyline && (aShapeType == 3 || aShapeType == 13 || aShapeType == 23)) ||
+ bool ToRead = (theType == ShapeType_Polyline &&
+ (aShapeType == 3 || aShapeType == 13 || aShapeType == 23 || aShapeType == 5)) ||
(theType == ShapeType_Polygon && aShapeType == 5);
if (ToRead)
{
void HYDROData_ShapeFile::ReadSHPPolyXY(Handle(HYDROData_Document) theDocument, SHPObject* anObj, QString theFileName,
- int theInd, NCollection_Sequence<Handle_HYDROData_Entity>& theEntities)
+ int theInd, NCollection_Sequence<Handle_HYDROData_Entity>& theEntities, bool bReadAsPolyline)
{
Handle(HYDROData_PolylineXY) aPolylineXY = Handle(HYDROData_PolylineXY)::DownCast( theDocument->CreateObject( KIND_POLYLINEXY ) );
else
EndIndex = anObj->nVertices;
- bool IsClosed = false;
HYDROData_PolylineXY::SectionType aSectType = HYDROData_PolylineXY::SECTION_POLYLINE;
- if (anObj->padfX[StartIndex] == anObj->padfX[EndIndex - 1] &&
- anObj->padfY[StartIndex] == anObj->padfY[EndIndex - 1] )
+ if (!bReadAsPolyline)
{
- IsClosed = true;
- aPolylineXY->AddSection( TCollection_AsciiString( ("poly_section_" + QString::number(i)).data()->toAscii()), aSectType, true);
+ bool IsClosed = false;
+ if (anObj->padfX[StartIndex] == anObj->padfX[EndIndex - 1] &&
+ anObj->padfY[StartIndex] == anObj->padfY[EndIndex - 1] )
+ {
+ IsClosed = true;
+ aPolylineXY->AddSection( TCollection_AsciiString( ("poly_section_" + QString::number(i)).data()->toAscii()), aSectType, true);
+ }
+ else
+ aPolylineXY->AddSection( TCollection_AsciiString( ("poly_section_" + QString::number(i)).data()->toAscii()), aSectType, false);
+
+ if (IsClosed)
+ EndIndex--;
}
else
- aPolylineXY->AddSection( TCollection_AsciiString( ("poly_section_" + QString::number(i)).data()->toAscii()), aSectType, false);
-
- if (IsClosed)
+ {
+ //polygon; contours always closed
+ aPolylineXY->AddSection( TCollection_AsciiString( ("poly_section_" + QString::number(i)).data()->toAscii()), aSectType, true);
EndIndex--;
+ }
for ( int k = StartIndex; k < EndIndex ; k++ )
{
HYDROData_PolylineXY::Point aSectPoint = gp_XY(anObj->padfX[k], anObj->padfY[k]);
HYDROData_PolylineXY::Point aSectPoint = gp_XY(anObj->padfX[k], anObj->padfY[k]);
theDocument->Transform(aSectPoint, true);
aPolylineXY->AddPoint( i, aSectPoint );
- aAPoints.Append(gp_XYZ (aSectPoint.X(), aSectPoint.Y(), anObj->padfZ[k]));
+ HYDROData_Bathymetry::AltitudePoint p;
+ p.X = aSectPoint.X();
+ p.Y = aSectPoint.Y();
+ p.Z = anObj->padfZ[k];
+ aAPoints.push_back(p);
}
}
}
-
+void HYDROData_ShapeFile::GetFreeIndices(std::vector<int>& theAllowedIndexes, QString strName, size_t theObjsSize,
+ QStringList theExistingNames, QString theBaseFileName)
+{
+ int anInd = 0;
+ for (;theAllowedIndexes.size() < theObjsSize;)
+ {
+ if (!theExistingNames.contains(theBaseFileName + strName + QString::number(anInd)))
+ {
+ theAllowedIndexes.push_back(anInd);
+ anInd++;
+ }
+ else
+ anInd++;
+ }
+}
int HYDROData_ShapeFile::ImportPolylines(Handle(HYDROData_Document) theDocument, const QString& theFileName,
NCollection_Sequence<Handle_HYDROData_Entity>& theEntities, int& theShapeTypeOfFile)
return 0;
if (aHSHP->nShapeType == 3 || aHSHP->nShapeType == 23)
{
- anInd = 0;
- for (;anAllowedIndexes.size() < mySHPObjects.size();)
- {
- if (!anExistingNames.contains(aBaseFileName + "_PolyXY_" + QString::number(anInd)))
- {
- anAllowedIndexes.push_back(anInd);
- anInd++;
- }
- else
- anInd++;
- }
-
+ size_t anObjsSize = mySHPObjects.size();
+ GetFreeIndices(anAllowedIndexes, "_PolyXY_", anObjsSize, anExistingNames, aBaseFileName);
+
for (size_t i = 0; i < mySHPObjects.size(); i++ )
{
- ReadSHPPolyXY(theDocument, mySHPObjects[i], aBaseFileName, anAllowedIndexes[i], theEntities);
+ ReadSHPPolyXY(theDocument, mySHPObjects[i], aBaseFileName, anAllowedIndexes[i], theEntities, false);
}
aStat = 1;
}
anInd++;
}
for (size_t i = 0; i < mySHPObjects.size(); i++ )
+ {
ReadSHPPoly3D(theDocument, mySHPObjects[i], aBaseFileName, anAllowedIndexes[i], theEntities);
+ }
aStat = 1;
}
+ else if (aHSHP->nShapeType == 5)
+ {
+ //import polygon's contours as polylines
+ size_t anObjsSize = mySHPObjects.size();
+ GetFreeIndices(anAllowedIndexes, "_PolyXY_", anObjsSize, anExistingNames, aBaseFileName);
+
+ for (size_t i = 0; i < mySHPObjects.size(); i++ )
+ {
+ ReadSHPPolyXY(theDocument, mySHPObjects[i], aBaseFileName, anAllowedIndexes[i], theEntities, true);
+ }
+ aStat = 2;
+ }
else
{
aStat = 0;