X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FHYDROData%2FHYDROData_PolylineXY.cxx;h=4b82850f80e1b0bda53f4f2cf2cd6517a7cfaea0;hb=9082efb75ca2505f8b4c5096d37e8d87491cd5d9;hp=5eb6ed56ed7476884dce507ca81195afed1748a9;hpb=0184a027dd5854562adf1bfa4dbf90865476d1d3;p=modules%2Fhydro.git diff --git a/src/HYDROData/HYDROData_PolylineXY.cxx b/src/HYDROData/HYDROData_PolylineXY.cxx index 5eb6ed56..4b82850f 100644 --- a/src/HYDROData/HYDROData_PolylineXY.cxx +++ b/src/HYDROData/HYDROData_PolylineXY.cxx @@ -238,7 +238,7 @@ bool HYDROData_PolylineXY::ImportFromGeomIOR( const TCollection_AsciiString& the if ( aShape.IsNull() ) return false; - return ImportShape( aShape, false ); + return ImportShape( aShape, false, NULL ); #endif } @@ -346,14 +346,14 @@ bool convertEdgesToSections( const TopoDS_Edge& double theDeflection, const Handle( HYDROData_PolylineXY )& theOldPolyline ) { - DEBTRACE("convertEdgesToSections") + //DEBTRACE("convertEdgesToSections") Standard_Real aFirst = 0.0, aLast = 0.0; Handle(Geom_Curve) anEdgeGeomCurve = BRep_Tool::Curve( theEdge, aFirst, aLast ); if ( anEdgeGeomCurve.IsNull() ) return false; bool isPrevious = (theSectTypes.Size() > 0); - DEBTRACE("nb sections: " << theSectTypes.Size()); + //DEBTRACE("nb sections: " << theSectTypes.Size()); HYDROData_PolylineXY::SectionType prevSectType = HYDROData_PolylineXY::SECTION_SPLINE;; HYDROData_PolylineXY::PointsList prevPointList; bool isPrevClosed = true; @@ -382,7 +382,7 @@ bool convertEdgesToSections( const TopoDS_Edge& } bool isNewSection = !isPrevious || isPrevClosed || anIsEdgeClosed || prevSectType != aSectionType; - DEBTRACE(isNewSection <<": " << !isPrevious << " " << isPrevClosed << " " << anIsEdgeClosed << " " << (prevSectType != aSectionType)); + //DEBTRACE(isNewSection <<": " << !isPrevious << " " << isPrevClosed << " " << anIsEdgeClosed << " " << (prevSectType != aSectionType)); HYDROData_PolylineXY::PointsList aPointsList; if (!isNewSection) @@ -392,7 +392,7 @@ bool convertEdgesToSections( const TopoDS_Edge& if( aSectionType == HYDROData_PolylineXY::SECTION_POLYLINE ) { - DEBTRACE("SECTION_POLYLINE"); + //DEBTRACE("SECTION_POLYLINE"); Handle(Geom_Line) aGeomLine = Handle(Geom_Line)::DownCast( anEdgeGeomCurve ); gp_Pnt aFirstPoint, aLastPoint; @@ -404,27 +404,27 @@ bool convertEdgesToSections( const TopoDS_Edge& { if (aSectFirstPoint == prevPointList.Last()) { - DEBTRACE("points shared: a");//aPointsList.Append( aSectFirstPoint ); + //DEBTRACE("points shared: a");//aPointsList.Append( aSectFirstPoint ); aPointsList.Append( aSectLastPoint ); } else if (aSectLastPoint == prevPointList.Last()) { - DEBTRACE("points shared: b");//aPointsList.Append( aSectLastPoint ); + //DEBTRACE("points shared: b");//aPointsList.Append( aSectLastPoint ); aPointsList.Append( aSectFirstPoint ); } else if (aSectFirstPoint == prevPointList.First()) { - DEBTRACE("points shared: c");//aPointsList.Prepend( aSectFirstPoint ); + //DEBTRACE("points shared: c");//aPointsList.Prepend( aSectFirstPoint ); aPointsList.Prepend( aSectLastPoint ); } else if (aSectLastPoint == prevPointList.First()) { - DEBTRACE("points shared: d");//aPointsList.Prepend( aSectLastPoint ); + //DEBTRACE("points shared: d");//aPointsList.Prepend( aSectLastPoint ); aPointsList.Prepend( aSectFirstPoint ); } else { - DEBTRACE("no point shared") + //DEBTRACE("no point shared") isNewSection = true; // no point shared, new section aPointsList.Clear(); aPointsList.Append( aSectFirstPoint ); @@ -433,14 +433,14 @@ bool convertEdgesToSections( const TopoDS_Edge& } else { - DEBTRACE("new section"); + //DEBTRACE("new section"); aPointsList.Append( aSectFirstPoint ); aPointsList.Append( aSectLastPoint ); } } else // aSectionType == HYDROData_PolylineXY::SECTION_SPLINE { - DEBTRACE("SECTION_SPLINE"); + //DEBTRACE("SECTION_SPLINE"); isNewSection = true; aPointsList.Clear(); @@ -465,8 +465,8 @@ bool convertEdgesToSections( const TopoDS_Edge& gp_Pnt endPts[] = {gp_Pnt(aPointsList.First().X(),aPointsList.First().Y(), 0), gp_Pnt(aPointsList.Last().X(),aPointsList.Last().Y(), 0) }; - DEBTRACE("curve start: "<< endPts[0].X() << " " << endPts[0].Y()); - DEBTRACE("curve end: "<< endPts[1].X() << " " << endPts[1].Y()); + //DEBTRACE("curve start: "<< endPts[0].X() << " " << endPts[0].Y()); + //DEBTRACE("curve end: "<< endPts[1].X() << " " << endPts[1].Y()); } else // --- split of a previous polyline: try to retrieve old sets of points and add intersection points { @@ -475,18 +475,18 @@ bool convertEdgesToSections( const TopoDS_Edge& double midPar = (anAdaptorCurve.LastParameter() + anAdaptorCurve.FirstParameter())/2; gp_Pnt midPnt; anAdaptorCurve.D0(midPar, midPnt); - DEBTRACE("curve first point: " << aEndPs[0].X() << " " << aEndPs[0].Y() << " " << aEndPs[0].Z()); - DEBTRACE("curve last point: " << aEndPs[1].X() << " " << aEndPs[1].Y() << " " << aEndPs[1].Z()); - DEBTRACE("curve mid point: " << midPnt.X() << " " << midPnt.Y() << " " << midPnt.Z()); + //DEBTRACE("curve first point: " << aEndPs[0].X() << " " << aEndPs[0].Y() << " " << aEndPs[0].Z()); + //DEBTRACE("curve last point: " << aEndPs[1].X() << " " << aEndPs[1].Y() << " " << aEndPs[1].Z()); + //DEBTRACE("curve mid point: " << midPnt.X() << " " << midPnt.Y() << " " << midPnt.Z()); std::vector aCurves; HYDROData_PolylineOperator::GetWires(theOldPolyline, aCurves); int nbSections = theOldPolyline->NbSections(); - DEBTRACE("nbSections: "<< nbSections << ", nbCurves: " << aCurves.size() ); + //DEBTRACE("nbSections: "<< nbSections << ", nbCurves: " << aCurves.size() ); for (int isec = 0; isec < nbSections; isec++) { - DEBTRACE("section: "<< isec); + //DEBTRACE("section: "<< isec); bool isOldSectionclosed = theOldPolyline->IsClosedSection(isec); TopoDS_Wire aWire = aCurves[isec]; // we suppose sections and wires are in the same order TopExp_Explorer anExp(aWire, TopAbs_EDGE); @@ -494,50 +494,55 @@ bool convertEdgesToSections( const TopoDS_Edge& BRepAdaptor_Curve adaptorOldCurve(anEdge); double pfirst = adaptorOldCurve.FirstParameter(); double plast = adaptorOldCurve.LastParameter(); - DEBTRACE("previous curve first last : "<< pfirst << " " << plast); + //DEBTRACE("previous curve first last : "<< pfirst << " " << plast); double p[3] = {-1, -1}; double d0= ProjectPointToCurve(aEndPs[0].XYZ(), adaptorOldCurve,p[0]); double d1= ProjectPointToCurve(aEndPs[1].XYZ(), adaptorOldCurve,p[1]); double d2= ProjectPointToCurve(midPnt.XYZ(), adaptorOldCurve, p[2]); - DEBTRACE("d0: "< pmax) + { + pmin = p[1]; + pmax = p[0]; + forward = false; + } } else // old section closed: check if we use first or last points... { - if((pmin < pmax) and((abs(pmin - pfirst)> 1.e-3) and (abs(pmax - plast) >1.e-3))) // internal points forward + if((pmin < pmax) && ((abs(pmin - pfirst)> 1.e-3) && (abs(pmax - plast) >1.e-3))) // internal points forward forward = true; - else if ((pmin > pmax) and((abs(pmin - plast)> 1.e-3) and (abs(pmax - pfirst) >1.e-3))) // internal points reverse + else if ((pmin > pmax) && ((abs(pmin - plast)> 1.e-3) && (abs(pmax - pfirst) >1.e-3))) // internal points reverse { pmin = p[1]; pmax = p[0]; forward = false; } - else if ((abs(pmin - plast) <1.e-3) and (p[2] < pmax)) // forward, replace pmin par pfirst + else if ((abs(pmin - plast) <1.e-3) && (p[2] < pmax)) // forward, replace pmin par pfirst pmin = pfirst; - else if ((abs(pmin - plast) <1.e-3) and (p[2] > pmax)) // reverse + else if ((abs(pmin - plast) <1.e-3) && (p[2] > pmax)) // reverse { pmin = p[1]; pmax = p[0]; forward = false; } - else if ((abs(pmax - pfirst) <1.e-3) and (p[2] < pmin)) // reverse + else if ((abs(pmax - pfirst) <1.e-3) && (p[2] < pmin)) // reverse { pmin = p[1]; pmax = p[0]; forward = false; } - else if ((abs(pmax - pfirst) <1.e-3) and (p[2] > pmin)) // forward, replace pmax par plast + else if ((abs(pmax - pfirst) <1.e-3) && (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,29 +558,30 @@ 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 pmin) and (param < pmax)) + if ((param > pmin) && (param < pmax)) { - DEBTRACE("param: " << param); + //DEBTRACE("param: " << param); aPointsList.Append(aPoint); } } else - for (int i=nbPoints -1; i>0; i--) + for (int i=nbPoints; i>0; i--) { HYDROData_PolylineXY::Point aPoint = aSectPoints.Value(i); gp_XYZ p(aPoint.X(), aPoint.Y(), 0); double param =-1; double d = ProjectPointToCurve(p, adaptorOldCurve, param); - if ((param > pmin) and (param < pmax)) + if ((param > pmin) && (param < pmax)) { - DEBTRACE("param: " << param); + //DEBTRACE("param: " << param); aPointsList.Append(aPoint); } } @@ -593,7 +599,7 @@ bool convertEdgesToSections( const TopoDS_Edge& TCollection_AsciiString aSectName = getUniqueSectionName( theSectNames ); if (isNewSection) { - DEBTRACE("isNewSection"); + //DEBTRACE("isNewSection"); theSectNames.Append( aSectName ); theSectTypes.Append( aSectionType ); theSectClosures.Append( anIsEdgeClosed ); @@ -601,7 +607,7 @@ bool convertEdgesToSections( const TopoDS_Edge& } else { - DEBTRACE("sameSection"); + //DEBTRACE("sameSection"); theSectPoints.SetValue(theSectPoints.Length(), aPointsList); } @@ -614,10 +620,14 @@ bool HYDROData_PolylineXY::ImportShape( const TopoDS_Shape& theShape, bool IsClosureAllowed, double theDeviation ) { - DEBTRACE("ImportShape"); + //DEBTRACE("ImportShape"); if ( theShape.IsNull() ) return false; + //std::string brepName = this->GetName().toStdString(); + //brepName += ".brep"; + //BRepTools::Write( theShape, brepName.c_str() ); + RemoveSections(); bool anIsCanBeImported = false; @@ -629,7 +639,7 @@ bool HYDROData_PolylineXY::ImportShape( const TopoDS_Shape& theShape, if ( theShape.ShapeType() == TopAbs_EDGE ) { - DEBTRACE("TopAbs_EDGE"); + //DEBTRACE("TopAbs_EDGE"); TopoDS_Edge anEdge = TopoDS::Edge( theShape ); // anIsCanBeImported = convertEdgeToSection( anEdge, aSectNames, aSectTypes, // aSectClosures, aSectPoints, true, IsInterpolationAllowed, theDeviation ); @@ -639,7 +649,7 @@ bool HYDROData_PolylineXY::ImportShape( const TopoDS_Shape& theShape, } else if ( theShape.ShapeType() == TopAbs_WIRE ) { - DEBTRACE("TopAbs_WIRE"); + //DEBTRACE("TopAbs_WIRE"); TopTools_SequenceOfShape anEdges; HYDROData_ShapesTool::ExploreShapeToShapes( theShape, TopAbs_EDGE, anEdges ); @@ -695,7 +705,7 @@ bool HYDROData_PolylineXY::ImportShape( const TopoDS_Shape& theShape, } setEditable( anIsCanBeImported ); - + Update(); return true; } @@ -878,35 +888,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 { @@ -975,38 +1049,6 @@ double HYDROData_PolylineXY::GetDistance( const int theSectionIndex, return aResDistance; } -//double HYDROData_PolylineXY::GetMinDistance( const int theSectionIndex, -// const Point& thePoint ) const -//{ -// double aResDistance = -1; -// if ( theSectionIndex < 0 || theSectionIndex >= NbSections() ) -// return aResDistance; -// -// std::vector aCurves; -// HYDROData_PolylineOperator::GetWires(this, aCurves); -// if (aCurves.size() != NbSections()) -// { -// DEBTRACE("nbCurves != nbSections " << aCurves.size() << " " << NbSections()); -// return aResDistance; -// } -// TopoDS_Wire aWire = aCurves[theSectionIndex]; -// TopTools_SequenceOfShape anEdges; -// HYDROData_ShapesTool::ExploreShapeToShapes( aWire, TopAbs_EDGE, anEdges ); -// for ( int i = 1, n = anEdges.Length(); i <= n; ++i ) -// { -// DEBTRACE("i: "<< i); -// TopoDS_Edge aWireEdge = TopoDS::Edge( anEdges.Value( i ) ); -// gp_XYZ aPointz = gp_XYZ(thePoint.X(), thePoint.Y(), 0); -// Adaptor3d_Curve theCurve = BRepAdaptor_Curve(aWireEdge); -// double theParameter = -1; -// double d = ProjectPointToCurve(aPointz, theCurve, theParameter); -// if (d