X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FHYDROData%2FHYDROData_PolylineOperator.cxx;h=07387a6e9d0cf085fba22e6aca6e2ee26cee61fc;hb=0f4c16e80e5c9160fb6e240e3f09b151701a1e5b;hp=ed7a4a93fe558a958bbe7a5d2476eb3540fd11ce;hpb=870e07f3ae73696273c54934f17d86f4f030c6d5;p=modules%2Fhydro.git diff --git a/src/HYDROData/HYDROData_PolylineOperator.cxx b/src/HYDROData/HYDROData_PolylineOperator.cxx index ed7a4a93..07387a6e 100644 --- a/src/HYDROData/HYDROData_PolylineOperator.cxx +++ b/src/HYDROData/HYDROData_PolylineOperator.cxx @@ -18,22 +18,45 @@ #include #include +#include +#include + +#ifndef LIGHT_MODE +#include +#endif + #include #include +#include #include +#include #include +#include #include +#include #include #include #include #include +#include +#include +#include #include #include #include #include #include #include -#include +#include +#include +#include +#include +#include + +#define _DEVDEBUG_ +#include "HYDRO_trace.hxx" +#include +#include template void append( std::vector& theList, const std::vector& theList2 ) { @@ -53,14 +76,21 @@ bool HYDROData_PolylineOperator::Split( const Handle( HYDROData_Document )& theD const gp_Pnt2d& thePoint, double theTolerance ) const { + if (thePolyline.IsNull()) + { + return false; + } + std::vector aPointsList( 1 ); aPointsList[0] = thePoint; - std::vector aCurves = GetWires( thePolyline ); + std::vector aCurves; + GetWires(thePolyline, aCurves); bool isOK = true; for( int i=0, n=aCurves.size(); i aCurvesList = Split( aCurves[i], thePoint, theTolerance ); - bool isLocalOK = CreatePolylines( theDoc, thePolyline->GetName(), aCurvesList, true ); + std::vector aCurvesList; + Split( aCurves[i], thePoint, theTolerance, aCurvesList ); + bool isLocalOK = CreatePolylines( theDoc, thePolyline, aCurvesList, true ); isOK = isOK && isLocalOK; } return isOK; @@ -69,11 +99,17 @@ bool HYDROData_PolylineOperator::Split( const Handle( HYDROData_Document )& theD bool HYDROData_PolylineOperator::Split( const Handle( HYDROData_Document )& theDoc, const Handle( HYDROData_PolylineXY )& thePolyline, const Handle( HYDROData_PolylineXY )& theTool, - double theTolerance ) const + double theTolerance, + bool& theIsIntersected) const { + if (thePolyline.IsNull() || theTool.IsNull()) + { + return false; + } + HYDROData_SequenceOfObjects aSeq; aSeq.Append( theTool ); - return split( theDoc, thePolyline, aSeq, theTolerance, -1 ); + return split( theDoc, thePolyline, aSeq, theTolerance, -1, theIsIntersected); } bool HYDROData_PolylineOperator::Split( const Handle( HYDROData_Document )& theDoc, @@ -84,7 +120,8 @@ bool HYDROData_PolylineOperator::Split( const Handle( HYDROData_Document )& theD for( int i=f; i<=l; i++ ) { Handle( HYDROData_PolylineXY ) aPolyline = Handle( HYDROData_PolylineXY )::DownCast( thePolylines.Value( i ) ); - if( !split( theDoc, aPolyline, thePolylines, theTolerance, i ) ) + bool isIntersected; + if( !split( theDoc, aPolyline, thePolylines, theTolerance, i, isIntersected) ) return false; } return true; @@ -96,29 +133,47 @@ bool HYDROData_PolylineOperator::Merge( const Handle( HYDROData_Document )& theD bool isConnectByNewSegment, double theTolerance ) { - TopoDS_Shape aMergedPolyline; + Handle( HYDROData_PolylineXY ) aNewPolyline = + Handle( HYDROData_PolylineXY )::DownCast( theDoc->CreateObject( KIND_POLYLINEXY ) ); + int ins =0; - int f = thePolylines.Lower(), l = thePolylines.Upper(); - for( int i=f; i<=l; i++ ) + HYDROData_SequenceOfObjects::Iterator aPIt(thePolylines); + + for (int ip=1; aPIt.More(); aPIt.Next(), ip++) { - Handle( HYDROData_PolylineXY ) aPolyline = Handle( HYDROData_PolylineXY )::DownCast( thePolylines.Value( i ) ); - std::vector aCurves = GetWires( aPolyline ); - for( int j=0, m=aCurves.size(); j aSectNames; + NCollection_Sequence aSectTypes; + NCollection_Sequence aSectClosures; + aPolyline->GetSections( aSectNames, aSectTypes, aSectClosures ); + + for ( int i = 1, n = aSectNames.Size(); i <= n; ++i ) + { + 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); + } } + QString aName = theName; + if( aName.isEmpty() ) + { + 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 aShapes( 1 ); - aShapes[0] = aMergedPolyline; - CreatePolylines( theDoc, theName, aShapes, false ); - - return true; -} - -bool HYDROData_PolylineOperator::Merge( TopoDS_Shape& theShape, const TopoDS_Wire& theWire, - bool isConnectByNewSegment, double theTolerance ) -{ - //TODO + aNewPolyline->SetName(aName); + aNewPolyline->Update(); return true; } @@ -126,412 +181,346 @@ bool HYDROData_PolylineOperator::split( const Handle( HYDROData_Document )& theD const Handle( HYDROData_PolylineXY )& thePolyline, const HYDROData_SequenceOfObjects& theTools, double theTolerance, - int theIgnoreIndex ) const + int theIgnoreIndex, + bool& theIsIntersected) const { - std::vector aCurves = GetWires( thePolyline ); + theIsIntersected = false; + + if (thePolyline.IsNull()) + { + return false; + } + + std::vector aCurves; + GetWires(thePolyline, aCurves); std::vector aToolCurves; for( int i=theTools.Lower(), n=theTools.Upper(); i<=n; i++ ) if( i!=theIgnoreIndex ) { Handle( HYDROData_PolylineXY ) aToolPolyline = Handle( HYDROData_PolylineXY )::DownCast( theTools.Value( i ) ); - append( aToolCurves, GetWires( aToolPolyline ) ); + if (!aToolPolyline.IsNull()) + { + std::vector aTCurves; + GetWires(aToolPolyline, aTCurves); + append( aToolCurves, aTCurves); + } } - bool isOK = true; - - int n = aCurves.size(); - std::vector aResults( n ); - for( int i=0; i aResult; + for (int aPSI = 0; aPSI < aPSCount; ++aPSI) { - std::vector aNewResults; - for( int k=0, q=aResults.size(); k aCurvesList = Split( TopoDS::Wire( aResults[k] ), aToolCurves[j], theTolerance ); - append( aNewResults, aCurvesList ); + continue; } - aResults = aNewResults; - } - CreatePolylines( theDoc, thePolyline->GetName(), aResults, true ); + std::deque > aParams; + for (int aTSI = 0; aTSI < aTSCount; ++aTSI) + { + aCurve.Intersect(aToolCurves[aTSI], aParams); + } - return isOK; + std::deque aSplitCurves; + theIsIntersected |= aCurve.Cut(aParams, aSplitCurves); + std::deque::const_iterator aCIt = + aSplitCurves.begin(); + std::deque::const_iterator aLastCIt = + 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, aResult, true ); + return true; } -std::vector HYDROData_PolylineOperator::GetWires( const Handle( HYDROData_PolylineXY )& thePolyline ) +void HYDROData_PolylineOperator::GetWires( + const Handle( HYDROData_PolylineXY )& thePolyline, + std::vector& theWires) { - std::vector aResult; - TopoDS_Shape aShape = thePolyline->GetShape(); - if( aShape.ShapeType()==TopAbs_WIRE ) { - aResult.push_back( TopoDS::Wire( aShape ) ); + theWires.push_back( TopoDS::Wire( aShape ) ); } else { TopExp_Explorer anExp( aShape, TopAbs_WIRE ); for( ; anExp.More(); anExp.Next() ) { - aResult.push_back( TopoDS::Wire( anExp.Current() ) ); + theWires.push_back( TopoDS::Wire( anExp.Current() ) ); } } - return aResult; } -static Standard_Boolean OrderCurveEdges( +void HYDROData_PolylineOperator::Split( const TopoDS_Wire& theWire, - NCollection_Vector& theEdges, - Standard_Boolean& theIsClosed) + const gp_Pnt2d& thePoint, + double theTolerance, + std::vector& theWires) { - TopTools_IndexedDataMapOfShapeListOfShape aVertexToEdges; - TopExp::MapShapesAndAncestors(theWire, - TopAbs_VERTEX, TopAbs_EDGE, aVertexToEdges); - const Standard_Integer aVCount = aVertexToEdges.Extent(); - if (aVCount == 0) + HYDROData_TopoCurve aCurve; + if (!aCurve.Initialize(theWire)) { - return Standard_False; + theWires.push_back(theWire); + return; } + const gp_XYZ aP(thePoint.X(), thePoint.Y(), 0); + std::list::const_iterator aEPos; + double aParam; + aCurve.Project(aP, aEPos, aParam); + HYDROData_TopoCurve aCurve1, aCurve2; + aCurve.Cut(aEPos, aParam, aCurve1, aCurve2); + theWires.push_back(aCurve1.Wire()); + if (!aCurve2.IsEmpty()) { - Standard_Integer aEndCount = 0; - for (Standard_Integer aVN = 1; aVN <= aVCount; ++aVN) - { - const Standard_Integer aEdgeCount = - aVertexToEdges.FindFromIndex(aVN).Extent(); - if (aEdgeCount == 1) - { - ++aEndCount; - } - if (aEdgeCount > 2) - { - return Standard_False; - } - } - theIsClosed = (aEndCount == 0); - if (!theIsClosed && aEndCount != 2) - { - return Standard_False; - } + theWires.push_back(aCurve2.Wire()); } +} - Standard_Integer aVN = 1; - if (!theIsClosed) - { - while (aVN <= aVCount && - aVertexToEdges.FindFromIndex(aVN).Extent() == 2) - { - ++aVN; - } - } +bool HYDROData_PolylineOperator::CreatePolylines( const Handle( HYDROData_Document )& theDoc, + const Handle( HYDROData_PolylineXY )& theOldPolyline, + const std::vector& theShapes, + bool isUseIndices ) +{ + if( theDoc.IsNull() ) + return false; - TopTools_ListOfShape* aEdges = &aVertexToEdges.ChangeFromIndex(aVN); - while (!aEdges->IsEmpty()) + 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; iFirst()); - aEdges->RemoveFirst(); - theEdges.Append(aEdge); - Standard_Integer aVN2 = - aVertexToEdges.FindIndex(TopExp::FirstVertex(aEdge)); - if (aVN2 == aVN) - { - aVN2 = aVertexToEdges.FindIndex(TopExp::LastVertex(aEdge)); - } - aVN = aVN2; + Handle( HYDROData_PolylineXY ) aPolyline = + Handle( HYDROData_PolylineXY )::DownCast( theDoc->CreateObject( KIND_POLYLINEXY ) ); + if( aPolyline.IsNull() ) + return false; - aEdges = &aVertexToEdges.ChangeFromIndex(aVN2); - if (aEdges->First().IsEqual(aEdge)) - { - aEdges->RemoveFirst(); - } - else - { - const TopoDS_Edge aEdge = TopoDS::Edge(aEdges->First()); - aEdges->Clear(); - aEdges->Append(aEdge); - } - } - return (!theIsClosed && theEdges.Size() == aVCount - 1) || - (theIsClosed && theEdges.Size() == aVCount); -} + aPolyline->ImportShape(theShapes[i], false, theOldPolyline, false); -static Standard_Real ProjectPointToEdge( - const gp_Pnt& thePoint, - const TopoDS_Edge& theEdge, - Standard_Real& theParameter) -{ - BRepAdaptor_Curve aECurve(theEdge); - Extrema_ExtPC aAlgo(thePoint, aECurve); - Standard_Integer aMinEN = -2; - Standard_Real aMinSqDist = DBL_MAX; - if (aAlgo.IsDone()) - { - const Standard_Integer aECount = aAlgo.NbExt(); - if (aECount != 0) + if( isUseIndices ) { - for (Standard_Integer aEN = 1; aEN <= aECount; ++aEN) + QString aNewName = theNamePrefix + "_" + QString::number( anIndex ); + while( !theDoc->FindObjectByName( aNewName ).IsNull() ) // the object with such a name is not found { - const gp_Pnt& aP = aAlgo.Point(aEN).Value(); - const Standard_Real aSqDist = thePoint.SquareDistance(aP); - if (aMinSqDist > aSqDist) - { - aMinSqDist = aSqDist; - aMinEN = aEN; - } + anIndex++; + aNewName = theNamePrefix + "_" + QString::number( anIndex ); } + aPolyline->SetName( aNewName ); } - } - - const Standard_Real aParams[] = - {aECurve.FirstParameter(), aECurve.LastParameter()}; - const gp_Pnt aEnds[] = {aECurve.Value(aParams[0]), aECurve.Value(aParams[1])}; - const Standard_Real aSqDists[] = - {thePoint.SquareDistance(aEnds[0]), thePoint.SquareDistance(aEnds[1])}; - for (Standard_Integer aEI = 0; aEI < 2; ++aEI) - { - if (aMinSqDist > aSqDists[aEI]) + else { - aMinSqDist = aSqDists[aEI]; - aMinEN = -aEI; + aPolyline->SetName( theNamePrefix ); } - } - if (aMinEN <= 0) - { - theParameter = aParams[-aMinEN]; - return aMinSqDist; + if( theColor.isValid() ) + aPolyline->SetWireColor( theColor ); } - - const Extrema_POnCurv& aPOnC = aAlgo.Point(aMinEN); - const gp_Pnt& aPoint = aPOnC.Value(); - theParameter = aPOnC.Parameter(); - for (Standard_Integer aEI = 0; aEI < 2; ++aEI) - { - if (Abs(theParameter - aParams[aEI]) < Precision::PConfusion() || - aPoint.SquareDistance(aEnds[aEI]) < Precision::SquareConfusion()) - { - theParameter = aParams[aEI]; - } - } - return aMinSqDist; + return true; } -static void SplitCurveByPoint( - const NCollection_Vector& theEdges, - const Standard_Integer theEdgeIndex, - const Standard_Real theParameter, - NCollection_Vector& theEdges1, - NCollection_Vector& theEdges2) +double HYDROData_PolylineOperator::ReduceDeflection( + const double theDeflection, + HYDROData_TopoCurve& theCurve, + int& thePieceCount) { - for (Standard_Integer aEI = 0; aEI < theEdgeIndex; ++aEI) + // Construct the approximating B-spline. + std::list aPs; + if (!theCurve.ValuesInKnots(aPs)) { - theEdges1.Append(theEdges(aEI)); + return -1; } - const TopoDS_Edge& aEdge = theEdges(theEdgeIndex); - BRepAdaptor_Curve aECurve(aEdge); - Standard_Integer aParamI = -1; - const Standard_Real aEdgeEndParams[] = - {aECurve.FirstParameter(), aECurve.LastParameter()}; - if (Abs(theParameter - aEdgeEndParams[0]) < Precision::PConfusion()) + Handle(TColgp_HArray1OfPnt) aPs2 = new TColgp_HArray1OfPnt(1, aPs.size()); { - aParamI = 0; - } - else if (Abs(theParameter - aEdgeEndParams[1]) < Precision::PConfusion()) - { - aParamI = 1; - } - - const TopAbs_Orientation aOrient = aEdge.Orientation(); - if (aOrient == TopAbs_REVERSED) - { - aParamI ^= 1; - } - - const Standard_Integer aECount = theEdges.Size(); - if (aParamI == 0) - { - NCollection_Vector* aEdges = (theEdgeIndex != 0) ? &theEdges1 : &theEdges2; - for (Standard_Integer aEI = theEdgeIndex; aEI < aECount; ++aEI) + std::list::const_iterator aLastPIt = aPs.end(); + std::list::const_iterator aPIt = aPs.begin(); + for (int aPN = 1; aPIt != aLastPIt; ++aPN, ++aPIt) { - aEdges->Append(theEdges(aEI)); + aPs2->SetValue(aPN, *aPIt); } } - else if (aParamI == 1) + Handle(Geom_BSplineCurve) aBSpline2; + const bool isClosed = theCurve.IsClosed(); +#ifndef LIGHT_MODE + if (!CurveCreator_Utils::constructBSpline(aPs2, isClosed, aBSpline2)) +#endif { - theEdges1.Append(aEdge); - for (Standard_Integer aEI = theEdgeIndex; aEI < aECount; ++aEI) - { - theEdges2.Append(theEdges(aEI)); - } + return -1; } - else + + // Calculate the piece deflections. + std::deque aSqDefls; + double aMaxSqDefl = 0; + std::list& aEdges = theCurve.Edges(); + std::list::const_iterator aLastEIt = aEdges.end(); { - TopoDS_Edge aFE = TopoDS::Edge(aEdge.Oriented(TopAbs_FORWARD)); - ShapeAnalysis_TransferParametersProj aSATPP(aFE, TopoDS_Face()); - aSATPP.SetMaxTolerance(Precision::Confusion()); - TopoDS_Vertex aSplitV; - BRep_Builder().MakeVertex( - aSplitV, aECurve.Value(theParameter), Precision::Confusion()); - - TopoDS_Edge aEParts[] = { - ShapeBuild_Edge().CopyReplaceVertices(aFE, TopoDS_Vertex(), - TopoDS::Vertex(aSplitV.Oriented(TopAbs_REVERSED))), - ShapeBuild_Edge().CopyReplaceVertices(aFE, aSplitV, TopoDS_Vertex())}; - ShapeBuild_Edge().CopyPCurves(aEParts[0], aFE); - ShapeBuild_Edge().CopyPCurves(aEParts[1], aFE); - BRep_Builder().SameRange(aEParts[0], Standard_False); - BRep_Builder().SameRange(aEParts[1], Standard_False); - BRep_Builder().SameParameter(aEParts[0], Standard_False); - BRep_Builder().SameParameter(aEParts[1], Standard_False); - aSATPP.TransferRange(aEParts[0], - aEdgeEndParams[0], theParameter, Standard_False); - aSATPP.TransferRange(aEParts[1], - theParameter, aEdgeEndParams[1], Standard_False); - aEParts[0].Orientation(aOrient); - aEParts[1].Orientation(aOrient); - - const Standard_Integer aFirstPI = (aOrient != TopAbs_REVERSED) ? 0 : 1; - theEdges1.Append(aEParts[aFirstPI]); - theEdges2.Append(aEParts[1 - aFirstPI]); - - for (Standard_Integer aEI = theEdgeIndex + 1; aEI < aECount; ++aEI) + std::list::const_iterator aEIt = aEdges.begin(); + for (int aPrevKCount = 0; aEIt != aLastEIt; ++aEIt) { - theEdges2.Append(theEdges(aEI)); + TopLoc_Location aLoc; + double aParams[2]; + Handle(Geom_BSplineCurve) aBSpline = Handle(Geom_BSplineCurve)::DownCast( + BRep_Tool::Curve(*aEIt, aLoc, aParams[0], aParams[1])); + const int aKCount = aBSpline->NbKnots(); + for (int aKN = 1; aKN < aKCount; ++aKN) + { + const double aParam = + (aBSpline->Knot(aKN) + aBSpline->Knot(aKN + 1)) * 0.5; + const double aParam2 = (aBSpline2->Knot(aPrevKCount + aKN) + + aBSpline2->Knot(aPrevKCount + aKN + 1)) * 0.5; + const double aSqDefl = Abs(aBSpline->Value(aParam). + SquareDistance(aBSpline2->Value(aParam2))); + aSqDefls.push_back(aSqDefl); + if (aMaxSqDefl < aSqDefl) + { + aMaxSqDefl = aSqDefl; + } + } + aPrevKCount += aKCount - 1; } } -} -static void CollectCurveWire( - const NCollection_Vector& theEdges, TopoDS_Wire& theWire) -{ - BRep_Builder aBulder; - aBulder.MakeWire(theWire); - NCollection_Vector::Iterator aEIt(theEdges); - for (; aEIt.More(); aEIt.Next()) + // Check whether the reducing is necessary. + const double aMaxDefl = Sqrt(aMaxSqDefl); + if (aMaxDefl <= theDeflection) { - aBulder.Add(theWire, aEIt.Value()); + return aMaxDefl; } -} -static void CollectCurveWire( - const NCollection_Vector& theEdges1, - const NCollection_Vector& theEdges2, - TopoDS_Wire& theWire) -{ - BRep_Builder aBulder; - aBulder.MakeWire(theWire); - const NCollection_Vector* aEdges[] = {&theEdges1, &theEdges2}; - for (Standard_Integer aEI = 0; aEI < 2; ++aEI) + // Reduce the deflections. + const double aThresSqDefl = + Max(aMaxSqDefl * 0.25, theDeflection * theDeflection); + std::list::iterator aEIt = aEdges.begin(); + std::deque::const_iterator aSqDIt = aSqDefls.begin(); + thePieceCount = 0; + for (; aEIt != aLastEIt; ++aEIt) { - NCollection_Vector::Iterator aEIt(*aEdges[aEI]); - for (; aEIt.More(); aEIt.Next()) + TopLoc_Location aLoc; + double aParams[2]; + Handle(Geom_BSplineCurve) aBSpline = Handle(Geom_BSplineCurve)::DownCast( + BRep_Tool::Curve(*aEIt, aLoc, aParams[0], aParams[1])); + Handle(Geom_BSplineCurve) aBSpline2 = + Handle(Geom_BSplineCurve)::DownCast(aBSpline->Copy()); + const int aKCount = aBSpline->NbKnots(); + for (int aKN = 1; aKN < aKCount; ++aSqDIt, ++aKN) { - aBulder.Add(theWire, aEIt.Value()); + if (*aSqDIt > aThresSqDefl) + { + aBSpline2->InsertKnot( + (aBSpline->Knot(aKN) + aBSpline->Knot(aKN + 1)) * 0.5); + } } + TopoDS_Edge aEdge; + BRep_Builder().MakeEdge(aEdge, aBSpline2, Precision::Confusion()); + BRep_Builder().Add(aEdge, TopExp::FirstVertex(*aEIt)); + BRep_Builder().Add(aEdge, TopExp::LastVertex(*aEIt)); + thePieceCount += aBSpline2->NbKnots() - 1; + *aEIt = aEdge; } + return aMaxDefl; } -std::vector HYDROData_PolylineOperator::Split( const TopoDS_Wire& theWire, - const gp_Pnt2d& thePoint, - double theTolerance ) +bool HYDROData_PolylineOperator::Extract( const Handle(HYDROData_Document)& theDocument, + const Handle(HYDROData_Object)& theObject ) { - std::vector aResult; - NCollection_Vector aEdges; - Standard_Boolean isClosed; - if (!OrderCurveEdges(theWire, aEdges, isClosed)) - { - aResult.push_back(theWire); - return aResult; - } + if( theObject.IsNull() || theDocument.IsNull() ) + return false; + + QList aBoundShapes; + QStringList aBoundNames; + QMap aNameToShMap; + + theObject->GetBoundaries( aBoundShapes, aBoundNames ); - const gp_Pnt aP(thePoint.X(), thePoint.Y(), 0); - Standard_Real aMinSqDist = DBL_MAX; - int aSEI = -1; - Standard_Real aSParam; - for (int aECount = aEdges.Size(), aEI = 0; aEI < aECount; ++aEI) + for( int i=0, n=aBoundShapes.size(); i aSqDist) + TopoDS_Shape aShape = aBoundShapes[i]; + if( aShape.IsNull() ) + continue; + + QString aBoundName = i aEdges1, aEdges2; - SplitCurveByPoint(aEdges, aSEI, aSParam, aEdges1, aEdges2); - TopoDS_Wire aWire; - if (!isClosed) + foreach( QString K, aNameToShMap.keys() ) { - CollectCurveWire(aEdges1, aWire); - if (!aEdges2.IsEmpty()) + const TopTools_IndexedMapOfShape& IM = aNameToShMap.value(K); + TopTools_ListOfShape LSE; + for (int i = 1; i <= IM.Extent(); i++) { - aResult.push_back(aWire); - CollectCurveWire(aEdges2, aWire); + const TopoDS_Edge& E = TopoDS::Edge(IM(i)); + if (E.IsNull()) + continue; + LSE.Append(E); } - } - else - { - CollectCurveWire(aEdges2, aEdges1, aWire); - } - aResult.push_back(aWire); - return aResult; -} -std::vector HYDROData_PolylineOperator::Split( const TopoDS_Wire& theWire, - const TopoDS_Wire& theTool, - double theTolerance ) -{ - std::vector aResult; - //TODO - return aResult; -} -std::vector HYDROData_PolylineOperator::Split( const std::vector& theWires, - double theTolerance ) -{ - std::vector aResult; - //TODO - return aResult; -} - -bool HYDROData_PolylineOperator::CreatePolylines( const Handle( HYDROData_Document )& theDoc, - const QString& theNamePrefix, - const std::vector& theShapes, - bool isUseIndices ) -{ - if( theDoc.IsNull() ) - return false; + 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; - int n = theShapes.size(); - int anIndex = 1; - for( int i=0; iCreateObject( KIND_POLYLINEXY ) ); + Handle( HYDROData_PolylineXY )::DownCast( theDocument->CreateObject( KIND_POLYLINEXY ) ); + if( aPolyline.IsNull() ) return false; - aPolyline->SetShape( theShapes[i] ); + aPolyline->SetShape( aShapeOut ); - if( isUseIndices ) + int anIndex = 0; + QString aName = K; + while( !theDocument->FindObjectByName( aName ).IsNull() ) { - QString aNewName = theNamePrefix + "_" + QString::number( anIndex ); - if( theDoc->FindObjectByName( aNewName ).IsNull() ) // the object with such a name is not found - aPolyline->SetName( aNewName ); anIndex++; + aName = K + "_" + QString::number( anIndex ); } - else - { - aPolyline->SetName( theNamePrefix ); - } + aPolyline->SetName( aName ); } + return true; }