Salome HOME
Porting on OCCT 7.0 and Qt 5. Make compilable version.
[modules/hydro.git] / src / HYDROData / HYDROData_PolylineXY.cxx
index de46304ab5b80c1428617cbaf9f704636b98fe69..9987e16475caab8babcac885af8bd8590071ebb6 100644 (file)
@@ -126,7 +126,6 @@ TCollection_AsciiString getUniqueSectionName( const Handle(TDataStd_ExtStringLis
   return getUniqueSectionName( aNamesSeq );
 }
 
-IMPLEMENT_STANDARD_HANDLE(HYDROData_PolylineXY, HYDROData_IPolyline)
 IMPLEMENT_STANDARD_RTTIEXT(HYDROData_PolylineXY, HYDROData_IPolyline)
 
 HYDROData_PolylineXY::HYDROData_PolylineXY()
@@ -238,7 +237,7 @@ bool HYDROData_PolylineXY::ImportFromGeomIOR( const TCollection_AsciiString& the
   if ( aShape.IsNull() )
     return false;
 
-  return ImportShape( aShape, false );
+  return ImportShape( aShape, false, NULL );
 #endif
 }
 
@@ -505,11 +504,15 @@ bool convertEdgesToSections( const TopoDS_Edge&
                   double pmin = p[0];
                   double pmax = p[1];
                   bool forward = true;
-                  if (! isOldSectionclosed) // no need to check first and last points on an open curve
+                  DEBTRACE("isOldSectionclosed: " << isOldSectionclosed);
+                  if (!isOldSectionclosed) // no need to check first and last points on an open curve
                     {
-                      pmin = p[1];
-                      pmax = p[0];
-                      forward = false;
+                      if (pmin > pmax)
+                        {
+                          pmin = p[1];
+                          pmax = p[0];
+                          forward = false;
+                        }
                     }
                   else // old section closed: check if we use first or last points...
                     {
@@ -538,6 +541,7 @@ bool convertEdgesToSections( const TopoDS_Edge&
                       else if ((abs(pmax - pfirst) <1.e-3) and (p[2] > pmin)) // forward, replace pmax par plast
                         pmax = plast;
                    }
+                  DEBTRACE("forward: "<< forward << " pmin " << pmin <<  " pmax " << pmax);
                   HYDROData_PolylineXY::Point aFirstPoint, aLastPoint;
                   if (forward)
                     {
@@ -553,6 +557,7 @@ bool convertEdgesToSections( const TopoDS_Edge&
 
                   HYDROData_PolylineXY::PointsList aSectPoints = theOldPolyline->GetPoints(isec, false);
                   int nbPoints = aSectPoints.Length();
+                  DEBTRACE("nbPoints " << nbPoints);
                   if (forward)
                     for (int i=1; i<=nbPoints; i++)
                       {
@@ -618,6 +623,10 @@ bool HYDROData_PolylineXY::ImportShape( const TopoDS_Shape& theShape,
   if ( theShape.IsNull() )
     return false;
 
+  std::string brepName = this->GetName().toStdString();
+  brepName += ".brep";
+  BRepTools::Write( theShape, brepName.c_str() );
+
   RemoveSections();
 
   bool anIsCanBeImported = false;
@@ -695,7 +704,7 @@ bool HYDROData_PolylineXY::ImportShape( const TopoDS_Shape& theShape,
   }
 
   setEditable( anIsCanBeImported );
-
+  Update();
   return true;
 }
 
@@ -878,35 +887,99 @@ void HYDROData_PolylineXY::setEditable( const bool theIsEditable )
 /**
  * Returns true if polyline is closed
  */
-bool HYDROData_PolylineXY::IsClosed( const bool theIsSimpleCheck ) const
+bool HYDROData_PolylineXY::IsClosed(const bool theIsSimpleCheck) const
 {
+  //DEBTRACE("IsClosed " << theIsSimpleCheck << " " << GetName());
   bool anIsClosed = false;
 
   TopoDS_Shape aShape = GetShape();
-  if ( aShape.IsNull() )
+  if (aShape.IsNull())
     return anIsClosed;
 
   TopTools_SequenceOfShape aWires;
-  HYDROData_ShapesTool::ExploreShapeToShapes( aShape, TopAbs_WIRE, aWires );
+  HYDROData_ShapesTool::ExploreShapeToShapes(aShape, TopAbs_WIRE, aWires);
 
   int aNbWires = aWires.Length();
-  if ( theIsSimpleCheck )
-  {
-    anIsClosed = aNbWires > 0;
-    for ( int i = 1; i <= aNbWires && anIsClosed; ++i )
+  if (theIsSimpleCheck)
     {
-      const TopoDS_Shape& aWire = aWires.Value( i );
-      anIsClosed = BRep_Tool::IsClosed( aWire );
+      anIsClosed = aNbWires > 0;
+      for (int i = 1; i <= aNbWires && anIsClosed; ++i)
+        {
+          const TopoDS_Shape& aWire = aWires.Value(i);
+          anIsClosed = BRep_Tool::IsClosed(aWire);
+        }
     }
-  }
   else
-  {
-    anIsClosed = aNbWires == 1 && BRep_Tool::IsClosed( aWires.First() );
-  }
+    {
+      if (aNbWires == 1)
+        anIsClosed = BRep_Tool::IsClosed(aWires.First());
+      else
+        {
+          //DEBTRACE("aNbWires " << aNbWires);
+          Handle(TopTools_HSequenceOfShape) aSeqWires = new TopTools_HSequenceOfShape;
+          Handle(TopTools_HSequenceOfShape) aSeqEdges = new TopTools_HSequenceOfShape;
+          for (int i = 1; i <= aNbWires; ++i)
+            {
+              const TopoDS_Shape& aWire = aWires.Value(i);
+              TopExp_Explorer it2(aWire, TopAbs_EDGE);
+              for (; it2.More(); it2.Next())
+                aSeqEdges->Append(it2.Current());
+            }
+          if (aSeqEdges->Length() > 1)
+            {
+              //DEBTRACE(aSeqEdges->Length());
+              ShapeAnalysis_FreeBounds::ConnectEdgesToWires(aSeqEdges, 1E-5, Standard_False, aSeqWires);
+              if (aSeqWires->Length() == 1)
+                {
+                  //DEBTRACE(aSeqWires->Length());
+                  const TopoDS_Wire& aPolylineWire = TopoDS::Wire(aSeqWires->Value(1));
+                  anIsClosed = BRep_Tool::IsClosed(aPolylineWire);
+                }
+            }
+        }
+    }
 
   return anIsClosed;
 }
 
+int HYDROData_PolylineXY::GetNbConnectedWires(Handle(TopTools_HSequenceOfShape)& aConnectedWires) const
+{
+  TopoDS_Shape aShape = GetShape();
+  if (aShape.IsNull())
+    return 0;
+  int aNbconnectedWires = 0;
+  TopTools_SequenceOfShape aWires;
+  HYDROData_ShapesTool::ExploreShapeToShapes(aShape, TopAbs_WIRE, aWires);
+  int aNbWires = aWires.Length();
+  if (aNbWires == 1)
+    {
+      aNbconnectedWires = aNbWires;
+      aConnectedWires->Append(aWires.First());
+    }
+  else
+    {
+      //DEBTRACE("aNbWires " << aNbWires);
+      Handle(TopTools_HSequenceOfShape) aSeqWires = new TopTools_HSequenceOfShape;
+      Handle(TopTools_HSequenceOfShape) aSeqEdges = new TopTools_HSequenceOfShape;
+      for (int i = 1; i <= aNbWires; ++i)
+        {
+          const TopoDS_Shape& aWire = aWires.Value(i);
+          TopExp_Explorer it2(aWire, TopAbs_EDGE);
+          for (; it2.More(); it2.Next())
+            aSeqEdges->Append(it2.Current());
+        }
+      if (aSeqEdges->Length() > 1)
+        {
+          //DEBTRACE(aSeqEdges->Length());
+          ShapeAnalysis_FreeBounds::ConnectEdgesToWires(aSeqEdges, 1E-5, Standard_False, aSeqWires);
+        }
+      aConnectedWires = aSeqWires;
+      aNbconnectedWires = aConnectedWires->Length();
+      DEBTRACE("aNbconnectedWires " << aNbconnectedWires);
+    }
+return aNbconnectedWires;
+}
+
 double HYDROData_PolylineXY::GetDistance( const int theSectionIndex,
                                           const int thePointIndex ) const
 {
@@ -1506,5 +1579,5 @@ void HYDROData_PolylineXY::SetIsInCustomFlag( bool theValue )
 
 void HYDROData_PolylineXY::Interpolate()
 {
-  ImportShape( GetShape(), true );
+  ImportShape( GetShape(), true, NULL );
 }