#include <TDataStd_ListIteratorOfListOfExtendedString.hxx>
#include <TDataStd_RealList.hxx>
+#include <TopoDS_Iterator.hxx>
#include <TopTools_ListIteratorOfListOfShape.hxx>
-
+#include <TopTools_HSequenceOfShape.hxx>
+#include <TopExp_Explorer.hxx>
+#include <ShapeAnalysis_FreeBounds.hxx>
+#include <TopoDS.hxx>
+#include <QColor>
#include <QPainterPath>
#include <QVariant>
#define PYTHON_POLYLINEXY_ID "KIND_POLYLINEXY"
+const double LOCAL_SELECTION_TOLERANCE = 0.0001;
+
IMPLEMENT_STANDARD_HANDLE(HYDROData_PolylineXY, HYDROData_IPolyline)
IMPLEMENT_STANDARD_RTTIEXT(HYDROData_PolylineXY, HYDROData_IPolyline)
return aVarData;
}
+QColor HYDROData_PolylineXY::DefaultWireColor()
+{
+ return QColor( Qt::red );
+}
+
TopoDS_Shape HYDROData_PolylineXY::GetShape()
{
return getPolylineShape();
gp_Pnt aPnt1( aFirstPoint.X(), aFirstPoint.Y(), aFirstPoint.Z() );
gp_Pnt aPnt2( aLastPoint.X(), aLastPoint.Y(), aLastPoint.Z() );
+ if ( aPnt1.IsEqual( aPnt2, LOCAL_SELECTION_TOLERANCE ) )
+ continue;
+
TopoDS_Edge anEdge = BRepBuilderAPI_MakeEdge( aPnt1, aPnt2 ).Edge();
aMakeWire.Add( anEdge );
}
}
else //if( theType == PolylineSection::SECTION_SPLINE )
{
- HYDROData_BSplineOperation aBSpline( thePoints, theIsClosed );
+ HYDROData_BSplineOperation aBSpline( thePoints, theIsClosed, LOCAL_SELECTION_TOLERANCE );
TopoDS_Edge anEdge = BRepBuilderAPI_MakeEdge( aBSpline.Curve() ).Edge();
aMakeWire.Add( anEdge );
}
else
{
- HYDROData_BSplineOperation aBSpline( thePoints, theIsClosed );
+ HYDROData_BSplineOperation aBSpline( thePoints, theIsClosed, LOCAL_SELECTION_TOLERANCE );
aBSpline.ComputePath( thePath );
}
}
}
TopoDS_Wire aSectionWire = BuildWire( aSectionType, anIsSectionClosed, aPoints );
- aSectionWiresList.Append( aSectionWire );
- aMakeWire.Add( aSectionWire );
- }
-
- TopoDS_Shape aShape;
-
- if ( aMakeWire.IsDone() )
- {
- aShape = aMakeWire.Shape();
+ if ( !aSectionWire.IsNull() ) {
+ aSectionWiresList.Append( aSectionWire );
+ aMakeWire.Add( aSectionWire );
+ }
}
- else if ( !aSectionWiresList.IsEmpty() )
+// all input wires in the <aSectionWiresList>
+ Handle(TopTools_HSequenceOfShape) aSeqWires = new TopTools_HSequenceOfShape;
+ Handle(TopTools_HSequenceOfShape) aSeqEdges = new TopTools_HSequenceOfShape;
+ TopTools_ListIteratorOfListOfShape it(aSectionWiresList);
+ for(;it.More();it.Next())
{
- // build compound
- TopoDS_Compound aCompound;
-
- BRep_Builder aBuilder;
- aBuilder.MakeCompound( aCompound );
-
- TopTools_ListIteratorOfListOfShape anIter( aSectionWiresList );
- for ( ; anIter.More(); anIter.Next() )
- {
- aBuilder.Add( aCompound, anIter.Value() );
- }
-
- aShape = aCompound;
+ TopExp_Explorer it2(it.Value(), TopAbs_EDGE);
+ for(;it2.More();it2.Next())
+ aSeqEdges->Append(it2.Current());
}
-
- setPolylineShape( aShape );
+ BRep_Builder aBB;
+ TopoDS_Compound aCmp;
+ TopoDS_Shape aResult;
+ aBB.MakeCompound(aCmp);
+ if(aSeqEdges->Length() >1)
+ {
+ ShapeAnalysis_FreeBounds::ConnectEdgesToWires(aSeqEdges,1E-5,Standard_False,aSeqWires);
+
+ if( aSeqWires->Length()==1 )
+ aResult = aSeqWires->Value( 1 );
+ else
+ {
+ for (Standard_Integer i = 1; i <= aSeqWires->Length();i++)
+ {
+ const TopoDS_Shape& aS1 = aSeqWires->Value(i);
+ aBB.Add(aCmp, aS1);
+ }
+ aResult = aCmp;
+ }
+ }
+ else if (aSeqEdges->Length() == 1)
+ {
+ BRepBuilderAPI_MakeWire mkWire (TopoDS::Edge(aSeqEdges->Value(1)));
+ if (mkWire.IsDone())
+ aResult = mkWire.Wire();
+ }
+
+ setPolylineShape( aResult );
}
/**
const Point& aSectPoint = aSectPointsList.Value( i );
aResDistance += gp_Pnt2d( aPrevPoint ).Distance( aSectPoint );
aPrevPoint = aSectPoint;
+
+ if ( thePointIndex == i - 1 )
+ break;
}
}
else
aPointToTest = aPoint;
}
- HYDROData_BSplineOperation aBSpline( aPoints, anIsSectionClosed );
+ HYDROData_BSplineOperation aBSpline( aPoints, anIsSectionClosed, LOCAL_SELECTION_TOLERANCE );
Quantity_Parameter aFirstParam = aBSpline.Curve()->FirstParameter();
Quantity_Parameter aSecondParam = aBSpline.Curve()->LastParameter();