X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FHYDROGUI%2FHYDROGUI_PolylineOp.cxx;h=9666cf7afc5e9c300cba9c3c5b71c7b87995d748;hb=9d44116e703eee10527cef6c81ab5f6805515111;hp=745cf67dc6259e75a94b3978857d41d895e8e577;hpb=439579ec24edd8b147cab07f688d446d59029a1e;p=modules%2Fhydro.git diff --git a/src/HYDROGUI/HYDROGUI_PolylineOp.cxx b/src/HYDROGUI/HYDROGUI_PolylineOp.cxx index 745cf67d..9666cf7a 100755 --- a/src/HYDROGUI/HYDROGUI_PolylineOp.cxx +++ b/src/HYDROGUI/HYDROGUI_PolylineOp.cxx @@ -22,9 +22,12 @@ #include "HYDROGUI_DataObject.h" #include "HYDROGUI_PolylineDlg.h" #include "HYDROGUI_Tool.h" +#include "HYDROGUI_Tool2.h" #include "HYDROGUI_UpdateFlags.h" #include +#include +#include #include #include @@ -44,7 +47,11 @@ #include #include +#include +#include + //static int ZValueIncrement = 0; +static const double HYDROGUI_MAXIMAL_DEFLECTION = 1e-2; HYDROGUI_PolylineOp::HYDROGUI_PolylineOp( HYDROGUI_Module* theModule, bool theIsEdit ) : HYDROGUI_Operation( theModule ), @@ -148,27 +155,90 @@ void HYDROGUI_PolylineOp::startOperation() NCollection_Sequence aSectClosures; myEditedObject->GetSections( aSectNames, aSectTypes, aSectClosures ); - for ( int i = 1, n = aSectNames.Size(); i <= n; ++i ) + if (!aSectNames.IsEmpty()) { - QString aSectName = HYDROGUI_Tool::ToQString( aSectNames.Value( i ) ); - HYDROData_PolylineXY::SectionType aSectType = aSectTypes.Value( i ); - bool aSectClosure = aSectClosures.Value( i ); + for ( int i = 1, n = aSectNames.Size(); i <= n; ++i ) + { + QString aSectName = HYDROGUI_Tool::ToQString( aSectNames.Value( i ) ); + HYDROData_PolylineXY::SectionType aSectType = aSectTypes.Value( i ); + bool aSectClosure = aSectClosures.Value( i ); + + CurveCreator::SectionType aCurveType = CurveCreator::Polyline; + if( aSectType == HYDROData_PolylineXY::SECTION_SPLINE ) + aCurveType = CurveCreator::Spline; - CurveCreator::SectionType aCurveType = CurveCreator::Polyline; - if( aSectType == HYDROData_PolylineXY::SECTION_SPLINE ) - aCurveType = CurveCreator::Spline; + CurveCreator::Coordinates aCurveCoords; - CurveCreator::Coordinates aCurveCoords; + HYDROData_PolylineXY::PointsList aSectPointsList = + myEditedObject->GetPoints( i - 1 ); + for (int k = 1, aNbPoints = aSectPointsList.Size(); k <= aNbPoints; ++k) + { + const HYDROData_PolylineXY::Point& aSectPoint = + aSectPointsList.Value( k ); + aCurveCoords.push_back( aSectPoint.X() ); + aCurveCoords.push_back( aSectPoint.Y() ); + } - HYDROData_PolylineXY::PointsList aSectPointsList = myEditedObject->GetPoints( i - 1 ); - for ( int k = 1, aNbPoints = aSectPointsList.Size(); k <= aNbPoints; ++k ) + myCurve->addSectionInternal( aSectName.toStdString(), + aCurveType, aSectClosure, aCurveCoords ); + } + } + else + { + std::deque aPs; + std::deque isCloseds; + std::vector aWires; + HYDROData_PolylineOperator::GetWires(myEditedObject, aWires); + const int aSCount = aWires.size(); + bool isError = false; + for (int aSI = 0; aSI < aSCount; ++aSI) { - const HYDROData_PolylineXY::Point& aSectPoint = aSectPointsList.Value( k ); - aCurveCoords.push_back( aSectPoint.X() ); - aCurveCoords.push_back( aSectPoint.Y() ); + HYDROData_TopoCurve aCurve, aCurve2; + std::list aPs2; + int aMaxPieceCount; + if (!aCurve.Initialize(aWires[aSI]) || + (aMaxPieceCount = aCurve.BSplinePiecewiseCurve( + HYDROGUI_MAXIMAL_DEFLECTION * 0.1, aCurve2)) == 0) + { + isError = true; + break; + } + + double aDefl; + aMaxPieceCount *= 100; + int aPieceCount = 0; + while (aPieceCount < aMaxPieceCount && + (aDefl = HYDROData_PolylineOperator::ReduceDeflection( + HYDROGUI_MAXIMAL_DEFLECTION, aCurve2, aPieceCount)) > + HYDROGUI_MAXIMAL_DEFLECTION); + if (aDefl < 0 || !aCurve2.ValuesInKnots(aPs2)) + { + isError = true; + break; + } + + aPs.push_back(CurveCreator::Coordinates()); + CurveCreator::Coordinates& aPs3 = aPs.back(); + std::list::const_iterator aLastPIt = aPs2.end(); + std::list::const_iterator aPIt = aPs2.begin(); + for (; aPIt != aLastPIt; ++aPIt) + { + const gp_XYZ aP = *aPIt; + aPs3.push_back(aP.X()); + aPs3.push_back(aP.Y()); + } + isCloseds.push_back(aCurve.IsClosed()); } - myCurve->addSectionInternal( aSectName.toStdString(), aCurveType, aSectClosure, aCurveCoords ); + if (!isError) + { + const TCollection_AsciiString aNamePrefix = "Section_"; + for (int aSI = 0; aSI < aSCount; ++aSI) + { + myCurve->addSectionInternal((aNamePrefix + (aSI + 1)).ToCString(), + CurveCreator::Spline, isCloseds[aSI], aPs[aSI]); + } + } } aPolylineName = myEditedObject->GetName();