Salome HOME
++ shapefil
[modules/hydro.git] / src / HYDROGUI / HYDROGUI_ImportPolylineOp.cxx
index f13933dd37fba2678e5eec2dfb0a385c92c9816c..a3c7f833205e32a8f7d36fafb8656da35172235a 100644 (file)
@@ -30,6 +30,7 @@
 #include <HYDROData_Polyline3D.h>
 #include <HYDROGUI_DataObject.h>
 #include <HYDROData_Bathymetry.h>
+#include <HYDROData_Iterator.h>
 
 #include <HYDROData_Profile.h>
 
@@ -40,6 +41,8 @@
 #include <QApplication>
 #include <QFile>
 #include <QFileInfo>
+#include <SUIT_MessageBox.h>
+
 
 HYDROGUI_ImportPolylineOp::HYDROGUI_ImportPolylineOp( HYDROGUI_Module* theModule )
 : HYDROGUI_Operation( theModule )
@@ -74,37 +77,150 @@ void HYDROGUI_ImportPolylineOp::onApply()
     return;
   }
 
-  QString aFileName = myFileDlg->selectedFile();
-  if ( aFileName.isEmpty() )
+  QStringList aFileNames = myFileDlg->selectedFiles();
+  
+  QApplication::setOverrideCursor( Qt::WaitCursor );  
+  startDocOperation();
+
+  foreach (QString aFileName, aFileNames) 
   {
-    abort();
-    return;
-  }
+    if ( aFileName.isEmpty() )
+      continue;
 
-  QFile aFile (aFileName);
-  aFile.open(QIODevice::ReadOnly);
+    QString anExt = aFileName.split('.', QString::SkipEmptyParts).back();
 
-  Parse(aFile);
+    if (anExt == "shp")
+    {
+      SHPHandle aHSHP;
+      aHSHP = SHPOpen( aFileName.toAscii().data(), "rb" );
+      Parse(aHSHP);
 
-  QApplication::setOverrideCursor( Qt::WaitCursor );
+      HYDROData_Iterator anIter( doc() );
+      int anInd = 0;
+      QStringList anExistingNames;
+      std::vector<int> anAllowedIndexes;
+      for( ; anIter.More(); anIter.Next() )
+        anExistingNames.push_back(anIter.Current()->GetName());
 
-  startDocOperation();
+      QFileInfo aFileInfo(aFileName);
+      QString aBaseFileName = aFileInfo.baseName();
 
-  Process();
+      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++;
+        }
+        
+        for (size_t i = 0; i < mySHPObjects.size(); i++ )
+        {
+          ProcessSHPPolyXY(mySHPObjects[i], aBaseFileName, anAllowedIndexes[i]);
+        }
+      }
+      else if (aHSHP->nShapeType == 13)
+      {
+        anInd = 0;
+        for (;anAllowedIndexes.size() < mySHPObjects.size();)
+        {
+          if (!anExistingNames.contains(aBaseFileName + "_PolyXY_" + QString::number(anInd)) &&
+              !anExistingNames.contains(aBaseFileName + "_Poly3D_" + QString::number(anInd)) &&
+              !anExistingNames.contains(aBaseFileName + "_Bath_" + QString::number(anInd)))
+          {
+            anAllowedIndexes.push_back(anInd);
+            anInd++;
+          }
+          else
+            anInd++;
+        }
+        for (size_t i = 0; i < mySHPObjects.size(); i++ )
+          ProcessSHPPoly3D(mySHPObjects[i], aBaseFileName, anAllowedIndexes[i]);
+      }
+      else  
+      {
+        SUIT_MessageBox::warning( module()->getApp()->desktop(), tr( "IMPORT_POLYLINE" ), "Cannot import polyline;\nThe shape type is incorrect" );
+      }
+    
+      for (size_t i = 0; i < mySHPObjects.size(); i++ )
+        free (mySHPObjects[i]);
 
-  commitDocOperation();
-  commit();
+      mySHPObjects.clear();
+      SHPClose(aHSHP);
+    }
+  }
+  if (!aFileNames.empty())
+  {
+    commitDocOperation();
+    commit();
+    module()->update( UF_Model | UF_VTKViewer | UF_VTK_Forced | UF_VTK_Init );
+  }
+  else
+    abort();
+  
+  QApplication::restoreOverrideCursor();
+}
 
-  module()->update( UF_Model | UF_VTKViewer | UF_VTK_Forced | UF_VTK_Init );
+void HYDROGUI_ImportPolylineOp::ProcessSHPPolyXY(SHPObject* anObj, QString theFileName, int theInd)
+{
+  //if (anObj->nSHPType != SHPT_ARC && anObj->nSHPType != SHPT_ARCM)
+  // return false;
+  Handle(HYDROData_PolylineXY) aPolylineXY = Handle(HYDROData_PolylineXY)::DownCast( doc()->CreateObject( KIND_POLYLINEXY ) );
+  
+  int nParts = anObj->nParts;
+  for ( int i = 0 ; i < nParts ; i++ )
+  {
+    int StartIndex = anObj->panPartStart[i];
+    int EndIndex;
+    if (i != nParts - 1)
+      EndIndex = anObj->panPartStart[i + 1];
+    else
+      EndIndex = anObj->nVertices;
 
-  aFile.close();
+    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] )
+    {
+      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--;
+    for ( int k = StartIndex; k < EndIndex ; k++ )
+    {
+      HYDROData_PolylineXY::Point aSectPoint;
+      aSectPoint.SetX( anObj->padfX[k] );
+      aSectPoint.SetY( anObj->padfY[k] );
+      aPolylineXY->AddPoint( i, aSectPoint );
+    }
 
-  QApplication::restoreOverrideCursor();
+  }
+  
+  aPolylineXY->SetWireColor( HYDROData_PolylineXY::DefaultWireColor() );
+  aPolylineXY->SetName( theFileName + "_PolyXY_" + QString::number(theInd) );
+  
+  aPolylineXY->Update();
+  
+  size_t anActiveViewId = HYDROGUI_Tool::GetActiveGraphicsViewId( module() );
+  if ( anActiveViewId == 0 )
+    anActiveViewId = HYDROGUI_Tool::GetActiveOCCViewId( module() );
+  
+  module()->setObjectVisible( anActiveViewId, aPolylineXY, true );
+  
+  module()->setIsToUpdate( aPolylineXY );
 }
 
-void HYDROGUI_ImportPolylineOp::Process()
+void HYDROGUI_ImportPolylineOp::ProcessSHPPoly3D(SHPObject* anObj, QString theFileName, int theInd)
 {
-
   Handle(HYDROData_PolylineXY) aPolylineXY = Handle(HYDROData_PolylineXY)::DownCast( doc()->CreateObject( KIND_POLYLINEXY ) );
 
   Handle(HYDROData_Polyline3D) aPolylineObj = Handle(HYDROData_Polyline3D)::DownCast( doc()->CreateObject( KIND_POLYLINE ) );
@@ -112,40 +228,45 @@ void HYDROGUI_ImportPolylineOp::Process()
   Handle(HYDROData_Bathymetry) aBath = Handle(HYDROData_Bathymetry)::DownCast( doc()->CreateObject( KIND_BATHYMETRY ) );
   HYDROData_Bathymetry::AltitudePoints aAPoints;
 
-  int aNSect = myCurveBlocks.size();
-  for ( int i = 0 ; i < aNSect ; i++ )
+  int nParts = anObj->nParts;
+  for ( int i = 0 ; i < nParts ; i++ )
   {
-    bool aSectClosure = true;
-    HYDROData_PolylineXY::SectionType aSectType = HYDROData_PolylineXY::SECTION_POLYLINE; 
-    aPolylineXY->AddSection( TCollection_AsciiString(myCurveBlocks[i].myName.toStdString().c_str()), aSectType, myCurveBlocks[i].myIsConnected );
+    //bool aSectClosure = true;
+    int StartIndex = anObj->panPartStart[i];
+    int EndIndex;
+    if (i != nParts - 1)
+      EndIndex = anObj->panPartStart[i + 1];
+    else
+      EndIndex = anObj->nVertices;
 
-    for ( int k = 0 ; k < myCurveBlocks[i].myXYZPoints.size() ; k+=3 )
+    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] &&
+        anObj->padfZ[StartIndex] == anObj->padfZ[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--;
+    for ( int k = StartIndex ; k < EndIndex ; k++ )
     {
       HYDROData_PolylineXY::Point aSectPoint;
-      aSectPoint.SetX( myCurveBlocks[i].myXYZPoints[k].X() );
-      aSectPoint.SetY( myCurveBlocks[i].myXYZPoints[k].Y() );
+      aSectPoint.SetX( anObj->padfX[k] );
+      aSectPoint.SetY( anObj->padfY[k] );
       aPolylineXY->AddPoint( i, aSectPoint );
-
-         aAPoints.Append(myCurveBlocks[i].myXYZPoints[k]);
+      aAPoints.Append(gp_XYZ (anObj->padfX[k], anObj->padfY[k], anObj->padfZ[k]));
     }
   }
-  QString aFileName = myFileDlg->selectedFile();
-  QFileInfo aFileInfo(aFileName);
-  QString aBaseFileName = aFileInfo.baseName();
-  QString aBathName = aBaseFileName + "_bath_1";
-  QString aPolyXYName = aBaseFileName + "_polyXY_1";
-  QString aPoly3DName = aBaseFileName + "_poly3D_1";
-
-  int anInd = 2;
-  for (;HYDROGUI_Tool::FindObjectByName( module(), aBathName, KIND_BATHYMETRY) || 
-        HYDROGUI_Tool::FindObjectByName( module(), aPolyXYName, KIND_POLYLINEXY) ||
-        HYDROGUI_Tool::FindObjectByName( module(), aPoly3DName, KIND_POLYLINE);)
-  {
-    aBathName = aBaseFileName + "_bath_" + QString::number(anInd);
-    aPolyXYName = aBaseFileName + "_polyXY_" + QString::number(anInd);
-    aPoly3DName = aBaseFileName + "_poly3D_" + QString::number(anInd);
-    anInd++;
-  }
+
+
+  QString aBathName = theFileName + "_bath_" + QString::number(theInd);
+  QString aPolyXYName = theFileName + "_polyXY_" + QString::number(theInd);
+  QString aPoly3DName = theFileName + "_poly3D_" + QString::number(theInd);
 
   aPolylineXY->SetName( aPolyXYName );
   aPolylineXY->SetWireColor(HYDROData_PolylineXY::DefaultWireColor());
@@ -162,7 +283,6 @@ void HYDROGUI_ImportPolylineOp::Process()
   
   aPolylineObj->Update();
 
-
   size_t anActiveViewId = HYDROGUI_Tool::GetActiveGraphicsViewId( module() );
   if ( anActiveViewId == 0 )
     anActiveViewId = HYDROGUI_Tool::GetActiveOCCViewId( module() );
@@ -173,104 +293,14 @@ void HYDROGUI_ImportPolylineOp::Process()
   module()->setIsToUpdate( aPolylineObj );
 }
 
-bool HYDROGUI_ImportPolylineOp::Parse( QFile& theFile)
+void HYDROGUI_ImportPolylineOp::Parse(SHPHandle theHandle)
 {
-  if ( !theFile.isOpen() )
-    return false;
-
-  QString aLine;
-  QString aBLine;
-  QStringList aList;
-  QStringList aBList;
-  myCurveBlocks.clear();
-  bool aTotStat = true;
-
-  aLine = theFile.readLine().simplified();
-  aList = aLine.split( ' ', QString::SkipEmptyParts );
-
-  for (;!theFile.atEnd();) 
+  int aShapeType;
+  mySHPObjects.clear();
+  SHPGetInfo( theHandle, NULL, &aShapeType, NULL, NULL );
+  if (aShapeType == 3 || aShapeType == 13 || aShapeType == 23) 
   {
-    if (aList[0] == "B" && (aList[1] == "C" || aList[1] == "P" || aList[1] == "N"))
-    {  
-      HYDROGUI_CurveBlock aCurveBlockInfo;
-      if (aList[1] == "C")
-        aCurveBlockInfo.myType = 1;
-      else if (aList[1] == "P")
-        aCurveBlockInfo.myType = 2;
-      else if (aList[1] == "N")
-        aCurveBlockInfo.myType = 2;
-
-      if (aList.size() == 9)
-      {
-        for (int j = 2; j < 8; j++)
-          aCurveBlockInfo.myRefCoords.push_back(aList[j].toDouble());
-        aCurveBlockInfo.myRefRatio = aList[8].toDouble();
-      }
-
-      QString Name;
-      do
-      {
-        aBLine = theFile.readLine().simplified();
-        aBList = aBLine.split( ' ', QString::SkipEmptyParts );
-         
-        if (aBList[0] == "CP")
-        {
-          if (aBList.size() == 2 && (aBList[1] == "0" || aBList[1] == "1" || aBList[1] == "2"))
-            aCurveBlockInfo.myCurvePlane = aBList[1].toInt();
-          else if (aBList.size() == 3 && (aBList[1] == "0" || aBList[1] == "1") && (aBList[2] == "0" || aBList[2] == "1"))
-          {
-            aCurveBlockInfo.myIsClosed = aBList[1].toInt();
-            aCurveBlockInfo.myIsClosed = aBList[2].toInt();
-          }
-          else
-          {
-            for (int j = 1; j < aBList.size(); j++)
-              aCurveBlockInfo.myAdditionalCurveInfo.push_back(aBList[j].toDouble());
-          }
-        }
-        if (aBList[0] == "CN")
-        {
-           for (int i = 1; i < aBList.size(); i++)
-             Name += aBList[i] + "_"; 
-           Name.remove(Name.size() - 1, 1);
-           aCurveBlockInfo.myName = Name;
-        }
-      } while (!theFile.atEnd() && aBLine[0] == 'C' );
-
-      bool aStat;
-      aTotStat = true;
-      do
-      {
-        if (aBList.size() >= 3 && aBLine[0] != 'B' && aBLine[0] != 'C') {
-          gp_XYZ anXYZ;
-          anXYZ.SetX (aBList[0].toDouble(&aStat));  
-          aTotStat = aTotStat && aStat;
-          anXYZ.SetY (aBList[1].toDouble(&aStat));
-          aTotStat = aTotStat && aStat;
-          anXYZ.SetZ (aBList[2].toDouble(&aStat));
-          aTotStat = aTotStat && aStat;
-
-          aCurveBlockInfo.myXYZPoints.push_back(anXYZ);
-          
-          aBLine = theFile.readLine().simplified();
-          aBList = aBLine.split( ' ', QString::SkipEmptyParts );
-        }
-        else 
-          break;
-    
-      } while (!theFile.atEnd()/* && aBLine[0] == 'B'*/ );
-      if (aTotStat)
-        myCurveBlocks.push_back(aCurveBlockInfo);
-
-    }
-    else
-    {
-      aLine = theFile.readLine().simplified();
-      aList = aLine.split( ' ', QString::SkipEmptyParts );
-    }
-
+    for (int i = 0; i < theHandle->nRecords; i++) 
+      mySHPObjects.push_back(SHPReadObject(theHandle, i));
   }
-
-  return true;
-
 }
\ No newline at end of file