Salome HOME
debug salome tests
[modules/hydro.git] / src / HYDROData / HYDROData_PolylineOperator.cxx
index 7e44abefa551166741ff52efc984e12951d4047a..c89d189fbdb99c3de39fd93c618b26b20570e45f 100644 (file)
@@ -19,6 +19,7 @@
 #include <HYDROData_PolylineOperator.h>
 #include <HYDROData_Document.h>
 #include <HYDROData_TopoCurve.h>
+#include <HYDROData_Object.h>
 
 #ifndef LIGHT_MODE
 #include <CurveCreator_Utils.hxx>
 #include <TopExp.hxx>
 #include <TopExp_Explorer.hxx>
 #include <TopTools_IndexedDataMapOfShapeListOfShape.hxx>
-#include <QString>
+#include <QStringList>
+#include <QColor>
 #include <Geom_BSplineCurve.hxx>
+#include <TopTools_IndexedMapOfShape.hxx>
+#include <BRepLib_MakeWire.hxx>
+
+//#define _DEVDEBUG_
+#include "HYDRO_trace.hxx"
+#include <BRepTools.hxx>
+#include <sstream>
 
 template<class T> void append( std::vector<T>& theList, const std::vector<T>& theList2 )
 {
@@ -80,8 +89,8 @@ bool HYDROData_PolylineOperator::Split( const Handle( HYDROData_Document )& theD
   for( int i=0, n=aCurves.size(); i<n; i++ )
   {
     std::vector<TopoDS_Shape> aCurvesList;
-    Split(aCurves[i], thePoint, theTolerance, aCurvesList);
-    bool isLocalOK = CreatePolylines( theDoc, thePolyline->GetName(), aCurvesList, true );
+    Split( aCurves[i], thePoint, theTolerance, aCurvesList );
+    bool isLocalOK = CreatePolylines( theDoc, thePolyline, aCurvesList, true );
     isOK = isOK && isLocalOK;
   }
   return isOK;
@@ -124,43 +133,47 @@ bool HYDROData_PolylineOperator::Merge( const Handle( HYDROData_Document )& theD
                                         bool isConnectByNewSegment,
                                         double theTolerance )
 {
-  std::deque<HYDROData_TopoCurve> aMergedCurves;
+  Handle( HYDROData_PolylineXY ) aNewPolyline =
+    Handle( HYDROData_PolylineXY )::DownCast( theDoc->CreateObject( KIND_POLYLINEXY ) );
+  int ins =0;
+
   HYDROData_SequenceOfObjects::Iterator aPIt(thePolylines);
-  for (; aPIt.More(); aPIt.Next())
+
+  for (int ip=1; aPIt.More(); aPIt.Next(), ip++)
   {
     Handle(HYDROData_PolylineXY) aPolyline =
       Handle(HYDROData_PolylineXY)::DownCast(aPIt.Value());
-    std::vector<TopoDS_Wire> aWires;
-    GetWires(aPolyline, aWires);
-    for (std::vector<TopoDS_Wire>::const_iterator aWIt = aWires.begin(),
-      aLastWIt = aWires.end(); aWIt != aLastWIt; ++aWIt)
+    NCollection_Sequence<TCollection_AsciiString>           aSectNames;
+    NCollection_Sequence<HYDROData_PolylineXY::SectionType> aSectTypes;
+    NCollection_Sequence<bool>                              aSectClosures;
+    aPolyline->GetSections( aSectNames, aSectTypes, aSectClosures );
+
+    for ( int i = 1, n = aSectNames.Size(); i <= n; ++i )
     {
-      const Standard_Boolean aResult = !isConnectByNewSegment ?
-        HYDROData_TopoCurve::Merge(theTolerance, *aWIt, aMergedCurves) :
-        HYDROData_TopoCurve::Connect(theTolerance, *aWIt, aMergedCurves);
-      if (!aResult)
-      {
-        return false;
-      }
+      const TCollection_AsciiString& aSectName = aSectNames.Value( i ) + "_" + ip;
+      const HYDROData_PolylineXY::SectionType& aSectType = aSectTypes.Value( i );
+      bool aSectClosure = aSectClosures.Value( i );
+      aNewPolyline->AddSection(aSectName, aSectType, aSectClosure);
+      HYDROData_PolylineXY::PointsList aPointsList = aPolyline->GetPoints(i-1, false);
+      aNewPolyline->SetPoints(ins++, aPointsList);
     }
   }
-
-  TopoDS_Compound aWireSet;
-  BRep_Builder aBuilder;
-  aBuilder.MakeCompound(aWireSet);
-  std::deque<HYDROData_TopoCurve>::iterator aCIt = aMergedCurves.begin();
-  std::deque<HYDROData_TopoCurve>::iterator aLastCIt = aMergedCurves.end();
-  for (; aCIt != aLastCIt; ++aCIt)
-  {
-    if (!aCIt->IsEmpty())
+  QString aName = theName;
+  if( aName.isEmpty() )
     {
-      aBuilder.Add(aWireSet, aCIt->Wire());
+      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;
     }
-  }
 
-  std::vector<TopoDS_Shape> aPolylines(1);
-  aPolylines[0] = aWireSet;
-  CreatePolylines(theDoc, theName, aPolylines, false);
+  aNewPolyline->SetName(aName);
+  aNewPolyline->Update();
   return true;
 }
 
@@ -205,6 +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);
     if (!aCurve.Initialize(aCurves[aPSI]))
     {
       continue;
@@ -216,19 +230,24 @@ bool HYDROData_PolylineOperator::split( const Handle( HYDROData_Document )& theD
       aCurve.Intersect(aToolCurves[aTSI], aParams);
     }
 
-    std::deque<HYDROData_TopoCurve> aSplittedCurves;
-    theIsIntersected |= aCurve.Cut(aParams, aSplittedCurves);
+    std::deque<HYDROData_TopoCurve> aSplitCurves;
+    theIsIntersected |= aCurve.Cut(aParams, aSplitCurves);
     std::deque<HYDROData_TopoCurve>::const_iterator aCIt =
-      aSplittedCurves.begin();
+      aSplitCurves.begin();
     std::deque<HYDROData_TopoCurve>::const_iterator aLastCIt =
-      aSplittedCurves.end();
-    for (; aCIt != aLastCIt; ++aCIt)
+      aSplitCurves.end();
+    for (int iw=0; aCIt != aLastCIt; ++aCIt, iw++)
     {
+      std::stringstream brepName;
+      brepName << "theSplitWire_";
+      brepName << iw;
+      brepName << ".brep";
+      BRepTools::Write(aCIt->Wire() , brepName.str().c_str() );
       aResult.push_back(aCIt->Wire());
     }
   }
 
-  CreatePolylines(theDoc, thePolyline->GetName(), aResult, true);
+  CreatePolylines( theDoc, thePolyline, aResult, true );
   return true;
 }
 
@@ -278,14 +297,20 @@ void HYDROData_PolylineOperator::Split(
 }
 
 bool HYDROData_PolylineOperator::CreatePolylines( const Handle( HYDROData_Document )& theDoc,
-                                                  const QString& theNamePrefix,
+                                                  const Handle( HYDROData_PolylineXY )& theOldPolyline,
                                                   const std::vector<TopoDS_Shape>& theShapes,
                                                   bool isUseIndices )
 {
   if( theDoc.IsNull() )
     return false;
 
+  if ( theOldPolyline.IsNull() )
+    return false;
+  const QString& theNamePrefix = theOldPolyline->GetName();
+  const QColor& theColor = theOldPolyline->GetWireColor();
+
   int n = theShapes.size();
+  DEBTRACE("theShapes.size() "<< n);
   int anIndex = 1;
   for( int i=0; i<n; i++ )
   {
@@ -294,19 +319,25 @@ bool HYDROData_PolylineOperator::CreatePolylines( const Handle( HYDROData_Docume
     if( aPolyline.IsNull() )
       return false;
 
-    aPolyline->SetShape( theShapes[i] );
+    aPolyline->ImportShape(theShapes[i], false, theOldPolyline, false);
 
     if( isUseIndices )
     {
       QString aNewName = theNamePrefix + "_" + QString::number( anIndex );
-      if( theDoc->FindObjectByName( aNewName ).IsNull() )  // the object with such a name is not found
-        aPolyline->SetName( aNewName );
-      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;
 }
@@ -412,3 +443,84 @@ double HYDROData_PolylineOperator::ReduceDeflection(
   }
   return aMaxDefl;
 }
+
+bool HYDROData_PolylineOperator::Extract( const Handle(HYDROData_Document)& theDocument,
+                                          const Handle(HYDROData_Object)& theObject )
+{
+  if( theObject.IsNull() || theDocument.IsNull() )
+    return false;
+
+  QList<TopoDS_Shape> aBoundShapes;
+  QStringList aBoundNames;
+  QMap<QString, TopTools_IndexedMapOfShape> aNameToShMap;
+
+  theObject->GetBoundaries( aBoundShapes, aBoundNames );
+
+  for( int i=0, n=aBoundShapes.size(); i<n; i++ )
+  {
+    TopoDS_Shape aShape = aBoundShapes[i];
+    if( aShape.IsNull() )
+      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( aShapeOut );
+
+    int anIndex = 0;
+    QString aName = K;
+    while( !theDocument->FindObjectByName( aName ).IsNull() )
+    {
+      anIndex++;
+      aName = K + "_" + QString::number( anIndex );
+    }
+    aPolyline->SetName( aName );
+  }
+
+  return true;
+}