Salome HOME
Merge branch 'BR_HYDRO_IMPS_WIN' of ssh://gitolite3@git.salome-platform.org/modules...
[modules/hydro.git] / src / HYDROData / HYDROData_PolylineOperator.cxx
index 5c241ad8ad45e12d65882632ebbe623ec73688f1..07387a6e9d0cf085fba22e6aca6e2ee26cee61fc 100644 (file)
@@ -50,6 +50,8 @@
 #include <QStringList>
 #include <QColor>
 #include <Geom_BSplineCurve.hxx>
+#include <TopTools_IndexedMapOfShape.hxx>
+#include <BRepLib_MakeWire.hxx>
 
 #define _DEVDEBUG_
 #include "HYDRO_trace.hxx"
@@ -158,8 +160,20 @@ bool HYDROData_PolylineOperator::Merge( const Handle( HYDROData_Document )& theD
   }
   QString aName = theName;
   if( aName.isEmpty() )
-    aName = "merged";
+    {
+      aName = "merged";
+      int anIndex = 1;
+      QString aNewName = aName + "_" + QString::number(anIndex);
+      while (!theDoc->FindObjectByName(aNewName).IsNull())  // the object with such a name is not found
+        {
+          anIndex++;
+          aNewName = aName + "_" + QString::number(anIndex);
+        }
+      aName = aNewName;
+    }
+
   aNewPolyline->SetName(aName);
+  aNewPolyline->Update();
   return true;
 }
 
@@ -204,7 +218,7 @@ bool HYDROData_PolylineOperator::split( const Handle( HYDROData_Document )& theD
   for (int aPSI = 0; aPSI < aPSCount; ++aPSI)
   {
     HYDROData_TopoCurve aCurve;
-    DEBTRACE("Initialize curve " << aPSI);
+    //DEBTRACE("Initialize curve " << aPSI);
     if (!aCurve.Initialize(aCurves[aPSI]))
     {
       continue;
@@ -224,17 +238,16 @@ bool HYDROData_PolylineOperator::split( const Handle( HYDROData_Document )& theD
       aSplitCurves.end();
     for (int iw=0; aCIt != aLastCIt; ++aCIt, iw++)
     {
-      std::stringstream brepName;
+      /*std::stringstream brepName;
       brepName << "theSplitWire_";
       brepName << iw;
       brepName << ".brep";
-      BRepTools::Write(aCIt->Wire() , brepName.str().c_str() );
+      BRepTools::Write(aCIt->Wire() , brepName.str().c_str() );*/
       aResult.push_back(aCIt->Wire());
     }
   }
 
   CreatePolylines( theDoc, thePolyline, aResult, true );
-  //CreatePolylinesSplit( theDoc, thePolyline, aResult, true );
   return true;
 }
 
@@ -283,56 +296,6 @@ void HYDROData_PolylineOperator::Split(
   }
 }
 
-//bool HYDROData_PolylineOperator::CreatePolylinesSplit(const Handle( HYDROData_Document )& theDoc,
-//                                                      const Handle( HYDROData_PolylineXY )& thePolyline,
-//                                                      const std::vector<TopoDS_Shape>& theShapes, bool isUseIndices)
-//{
-//
-//  if (theDoc.IsNull())
-//    return false;
-//
-//  int nbSections = thePolyline->NbSections();
-//  const QString& theNamePrefix = thePolyline->GetName();
-//  const QColor& theColor = thePolyline->GetWireColor();
-//
-//  int n = theShapes.size();
-//  DEBTRACE("theShapes.size() "<< n);
-//  int anIndex = 1;
-//  for (int i = 0; i < n; i++)
-//    {
-//      Handle( HYDROData_PolylineXY ) aPolyline =
-//      Handle( HYDROData_PolylineXY )::DownCast(theDoc->CreateObject(KIND_POLYLINEXY));
-//      if (aPolyline.IsNull())
-//        return false;
-//
-//      for (int isec = 0; isec < nbSections; isec++)
-//        {
-//          gp_XY p = gp_XY(0, 0);
-//          //double d = thePolyline->GetMinDistance(isec, p);
-//        }
-//
-//      if (isUseIndices)
-//        {
-//          QString aNewName = theNamePrefix + "_" + QString::number(anIndex);
-//          while (!theDoc->FindObjectByName(aNewName).IsNull())  // the object with such a name is not found
-//            {
-//              anIndex++;
-//              aNewName = theNamePrefix + "_" + QString::number(anIndex);
-//            }
-//          aPolyline->SetName(aNewName);
-//        }
-//      else
-//        {
-//          aPolyline->SetName(theNamePrefix);
-//        }
-//
-//      if (theColor.isValid())
-//        aPolyline->SetWireColor(theColor);
-//    }
-//  return true;
-//
-//}
-
 bool HYDROData_PolylineOperator::CreatePolylines( const Handle( HYDROData_Document )& theDoc,
                                                   const Handle( HYDROData_PolylineXY )& theOldPolyline,
                                                   const std::vector<TopoDS_Shape>& theShapes,
@@ -347,7 +310,7 @@ bool HYDROData_PolylineOperator::CreatePolylines( const Handle( HYDROData_Docume
   const QColor& theColor = theOldPolyline->GetWireColor();
 
   int n = theShapes.size();
-  DEBTRACE("theShapes.size() "<< n);
+  //DEBTRACE("theShapes.size() "<< n);
   int anIndex = 1;
   for( int i=0; i<n; i++ )
   {
@@ -357,8 +320,6 @@ bool HYDROData_PolylineOperator::CreatePolylines( const Handle( HYDROData_Docume
       return false;
 
     aPolyline->ImportShape(theShapes[i], false, theOldPolyline, false);
-    //aPolyline->SetShape( theShapes[i] );
-
 
     if( isUseIndices )
     {
@@ -491,6 +452,7 @@ bool HYDROData_PolylineOperator::Extract( const Handle(HYDROData_Document)& theD
 
   QList<TopoDS_Shape> aBoundShapes;
   QStringList aBoundNames;
+  QMap<QString, TopTools_IndexedMapOfShape> aNameToShMap;
 
   theObject->GetBoundaries( aBoundShapes, aBoundNames );
 
@@ -501,21 +463,61 @@ bool HYDROData_PolylineOperator::Extract( const Handle(HYDROData_Document)& theD
       continue;
 
     QString aBoundName = i<aBoundNames.size() ? aBoundNames[i] : "";
+    
+    if (!aNameToShMap.contains(aBoundName))
+    {
+      TopTools_IndexedMapOfShape IM;
+      IM.Add(aShape);
+      aNameToShMap[aBoundName] = IM;
+    }
+    else
+      aNameToShMap[aBoundName].Add(aShape);
+     
+  }
+
+  foreach( QString K, aNameToShMap.keys() )
+  {
+    const TopTools_IndexedMapOfShape& IM = aNameToShMap.value(K);
+    TopTools_ListOfShape LSE;
+    for (int i = 1; i <= IM.Extent(); i++)
+    {
+      const TopoDS_Edge& E = TopoDS::Edge(IM(i));
+      if (E.IsNull())
+        continue;
+      LSE.Append(E);
+    }
+
+
+    TopoDS_Shape aShapeOut;
+    if (LSE.Extent() == 1)
+    {
+      aShapeOut = LSE.First();
+    }
+    else if (LSE.Extent() > 1)
+    {
+      BRepLib_MakeWire WM;
+      WM.Add(LSE);
+      if (WM.IsDone())
+        aShapeOut = WM.Wire();
+      else
+        continue;
+    }
+    else continue;
 
     Handle( HYDROData_PolylineXY ) aPolyline = 
       Handle( HYDROData_PolylineXY )::DownCast( theDocument->CreateObject( KIND_POLYLINEXY ) );
-    
+
     if( aPolyline.IsNull() )
       return false;
 
-    aPolyline->SetShape( aShape );
+    aPolyline->SetShape( aShapeOut );
 
     int anIndex = 0;
-    QString aName = aBoundName;
+    QString aName = K;
     while( !theDocument->FindObjectByName( aName ).IsNull() )
     {
       anIndex++;
-      aName = aBoundName + "_" + QString::number( anIndex );
+      aName = K + "_" + QString::number( anIndex );
     }
     aPolyline->SetName( aName );
   }