X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FHYDROData%2FHYDROData_PolylineOperator.cxx;h=fd4a5edcd397fd155d866c3e9d177bedf8fec365;hb=d398a8be8e0b0259b476b358d53d234ce4c82379;hp=7e44abefa551166741ff52efc984e12951d4047a;hpb=e744ba34fd38d6744d11b54cd15b6f86350695b2;p=modules%2Fhydro.git diff --git a/src/HYDROData/HYDROData_PolylineOperator.cxx b/src/HYDROData/HYDROData_PolylineOperator.cxx index 7e44abef..fd4a5edc 100644 --- a/src/HYDROData/HYDROData_PolylineOperator.cxx +++ b/src/HYDROData/HYDROData_PolylineOperator.cxx @@ -19,6 +19,7 @@ #include #include #include +#include #ifndef LIGHT_MODE #include @@ -46,9 +47,15 @@ #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 ) { int aSize = theList.size(); @@ -80,8 +87,8 @@ bool HYDROData_PolylineOperator::Split( const Handle( HYDROData_Document )& theD for( int i=0, n=aCurves.size(); i aCurvesList; - Split(aCurves[i], thePoint, theTolerance, aCurvesList); - bool isLocalOK = CreatePolylines( theDoc, thePolyline->GetName(), aCurvesList, true ); + Split( aCurves[i], thePoint, theTolerance, aCurvesList ); + bool isLocalOK = CreatePolylines( theDoc, thePolyline, aCurvesList, true ); isOK = isOK && isLocalOK; } return isOK; @@ -124,43 +131,47 @@ bool HYDROData_PolylineOperator::Merge( const Handle( HYDROData_Document )& theD bool isConnectByNewSegment, double theTolerance ) { - std::deque aMergedCurves; + Handle( HYDROData_PolylineXY ) aNewPolyline = + Handle( HYDROData_PolylineXY )::DownCast( theDoc->CreateObject( KIND_POLYLINEXY ) ); + int ins =0; + HYDROData_SequenceOfObjects::Iterator aPIt(thePolylines); - for (; aPIt.More(); aPIt.Next()) + + for (int ip=1; aPIt.More(); aPIt.Next(), ip++) { Handle(HYDROData_PolylineXY) aPolyline = Handle(HYDROData_PolylineXY)::DownCast(aPIt.Value()); - std::vector aWires; - GetWires(aPolyline, aWires); - for (std::vector::const_iterator aWIt = aWires.begin(), - aLastWIt = aWires.end(); aWIt != aLastWIt; ++aWIt) + NCollection_Sequence aSectNames; + NCollection_Sequence aSectTypes; + NCollection_Sequence aSectClosures; + aPolyline->GetSections( aSectNames, aSectTypes, aSectClosures ); + + for ( int i = 1, n = aSectNames.Size(); i <= n; ++i ) { - const Standard_Boolean aResult = !isConnectByNewSegment ? - HYDROData_TopoCurve::Merge(theTolerance, *aWIt, aMergedCurves) : - HYDROData_TopoCurve::Connect(theTolerance, *aWIt, aMergedCurves); - if (!aResult) - { - return false; - } + 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); } } - - TopoDS_Compound aWireSet; - BRep_Builder aBuilder; - aBuilder.MakeCompound(aWireSet); - std::deque::iterator aCIt = aMergedCurves.begin(); - std::deque::iterator aLastCIt = aMergedCurves.end(); - for (; aCIt != aLastCIt; ++aCIt) - { - if (!aCIt->IsEmpty()) + QString aName = theName; + if( aName.isEmpty() ) { - aBuilder.Add(aWireSet, aCIt->Wire()); + 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 aPolylines(1); - aPolylines[0] = aWireSet; - CreatePolylines(theDoc, theName, aPolylines, false); + aNewPolyline->SetName(aName); + aNewPolyline->Update(); return true; } @@ -205,6 +216,7 @@ bool HYDROData_PolylineOperator::split( const Handle( HYDROData_Document )& theD for (int aPSI = 0; aPSI < aPSCount; ++aPSI) { HYDROData_TopoCurve aCurve; + DEBTRACE("Initialize curve " << aPSI); if (!aCurve.Initialize(aCurves[aPSI])) { continue; @@ -216,19 +228,24 @@ bool HYDROData_PolylineOperator::split( const Handle( HYDROData_Document )& theD aCurve.Intersect(aToolCurves[aTSI], aParams); } - std::deque aSplittedCurves; - theIsIntersected |= aCurve.Cut(aParams, aSplittedCurves); + std::deque aSplitCurves; + theIsIntersected |= aCurve.Cut(aParams, aSplitCurves); std::deque::const_iterator aCIt = - aSplittedCurves.begin(); + aSplitCurves.begin(); std::deque::const_iterator aLastCIt = - aSplittedCurves.end(); - for (; aCIt != aLastCIt; ++aCIt) + 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->GetName(), aResult, true); + CreatePolylines( theDoc, thePolyline, aResult, true ); return true; } @@ -278,14 +295,20 @@ void HYDROData_PolylineOperator::Split( } bool HYDROData_PolylineOperator::CreatePolylines( const Handle( HYDROData_Document )& theDoc, - const QString& theNamePrefix, + const Handle( HYDROData_PolylineXY )& theOldPolyline, const std::vector& theShapes, bool isUseIndices ) { if( theDoc.IsNull() ) return false; + 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; iSetShape( theShapes[i] ); + aPolyline->ImportShape(theShapes[i], false, theOldPolyline, false); if( isUseIndices ) { QString aNewName = theNamePrefix + "_" + QString::number( anIndex ); - if( theDoc->FindObjectByName( aNewName ).IsNull() ) // the object with such a name is not found - aPolyline->SetName( aNewName ); - anIndex++; + while( !theDoc->FindObjectByName( aNewName ).IsNull() ) // the object with such a name is not found + { + anIndex++; + aNewName = theNamePrefix + "_" + QString::number( anIndex ); + } + aPolyline->SetName( aNewName ); } else { aPolyline->SetName( theNamePrefix ); } + + if( theColor.isValid() ) + aPolyline->SetWireColor( theColor ); } return true; } @@ -412,3 +441,43 @@ double HYDROData_PolylineOperator::ReduceDeflection( } return aMaxDefl; } + +bool HYDROData_PolylineOperator::Extract( const Handle(HYDROData_Document)& theDocument, + const Handle(HYDROData_Object)& theObject ) +{ + if( theObject.IsNull() || theDocument.IsNull() ) + return false; + + QList aBoundShapes; + QStringList aBoundNames; + + theObject->GetBoundaries( aBoundShapes, aBoundNames ); + + for( int i=0, n=aBoundShapes.size(); iCreateObject( KIND_POLYLINEXY ) ); + + if( aPolyline.IsNull() ) + return false; + + aPolyline->SetShape( aShape ); + + int anIndex = 0; + QString aName = aBoundName; + while( !theDocument->FindObjectByName( aName ).IsNull() ) + { + anIndex++; + aName = aBoundName + "_" + QString::number( anIndex ); + } + aPolyline->SetName( aName ); + } + + return true; +}