From 373e0c62c8707f9cfd43796069c9665665375627 Mon Sep 17 00:00:00 2001 From: asl Date: Wed, 21 Oct 2015 16:19:45 +0300 Subject: [PATCH] refs #611: redesign of the polylines extraction --- src/HYDROData/HYDROData_Object.cxx | 23 +++ src/HYDROData/HYDROData_Object.h | 3 + src/HYDROData/HYDROData_PolylineOperator.cxx | 43 +++++- src/HYDROData/HYDROData_PolylineOperator.h | 4 + .../HYDROGUI_PolylineExtractionOp.cxx | 145 ++---------------- src/HYDROGUI/HYDROGUI_PolylineExtractionOp.h | 22 +-- 6 files changed, 84 insertions(+), 156 deletions(-) diff --git a/src/HYDROData/HYDROData_Object.cxx b/src/HYDROData/HYDROData_Object.cxx index 78f734ea..20eead85 100644 --- a/src/HYDROData/HYDROData_Object.cxx +++ b/src/HYDROData/HYDROData_Object.cxx @@ -374,3 +374,26 @@ void HYDROData_Object::SetIsSubmersible( bool isSubmersible ) const { TDataStd_Integer::Set( myLab, isSubmersible ? 1 : 0 ); } + +void HYDROData_Object::GetBoundaries( QList& theBoundShapes, + QStringList& theBoundNames ) const +{ + HYDROData_SequenceOfObjects aGroups = GetGroups(); + HYDROData_SequenceOfObjects::Iterator anIter( aGroups ); + for ( ; anIter.More(); anIter.Next() ) + { + Handle(HYDROData_ShapesGroup) aGroup = + Handle(HYDROData_ShapesGroup)::DownCast( anIter.Value() ); + if( aGroup.IsNull() ) + continue; + + QString aName = aGroup->GetName(); + TopTools_SequenceOfShape aShapes; + aGroup->GetShapes( aShapes ); + for( int i=1, n=aShapes.Length(); i<=n; i++ ) + { + theBoundShapes.append( aShapes( i ) ); + theBoundNames.append( aName ); + } + } +} diff --git a/src/HYDROData/HYDROData_Object.h b/src/HYDROData/HYDROData_Object.h index aa85d5ac..0c217f27 100644 --- a/src/HYDROData/HYDROData_Object.h +++ b/src/HYDROData/HYDROData_Object.h @@ -160,6 +160,9 @@ public: HYDRODATA_EXPORT bool IsSubmersible() const; HYDRODATA_EXPORT void SetIsSubmersible( bool ) const; + HYDRODATA_EXPORT virtual void GetBoundaries( QList& theBoundShapes, + QStringList& theBoundNames ) const; + protected: /** diff --git a/src/HYDROData/HYDROData_PolylineOperator.cxx b/src/HYDROData/HYDROData_PolylineOperator.cxx index 7e44abef..a5768945 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,7 +47,7 @@ #include #include #include -#include +#include #include template void append( std::vector& theList, const std::vector& theList2 ) @@ -412,3 +413,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; +} diff --git a/src/HYDROData/HYDROData_PolylineOperator.h b/src/HYDROData/HYDROData_PolylineOperator.h index 8e27796c..4263370d 100644 --- a/src/HYDROData/HYDROData_PolylineOperator.h +++ b/src/HYDROData/HYDROData_PolylineOperator.h @@ -26,6 +26,7 @@ class Handle( HYDROData_Document ); class HYDROData_TopoCurve; +class Handle(HYDROData_Object); class HYDRODATA_EXPORT HYDROData_PolylineOperator { @@ -64,6 +65,9 @@ public: HYDROData_TopoCurve& theCurve, int& thePieceCount); + bool Extract( const Handle(HYDROData_Document)& theDocument, + const Handle(HYDROData_Object)& theObject ); + protected: bool split( const Handle( HYDROData_Document )& theDoc, const Handle( HYDROData_PolylineXY )& thePolyline, diff --git a/src/HYDROGUI/HYDROGUI_PolylineExtractionOp.cxx b/src/HYDROGUI/HYDROGUI_PolylineExtractionOp.cxx index ac0a39ad..591ae2de 100644 --- a/src/HYDROGUI/HYDROGUI_PolylineExtractionOp.cxx +++ b/src/HYDROGUI/HYDROGUI_PolylineExtractionOp.cxx @@ -16,27 +16,12 @@ // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com // -#include "HYDROGUI_PolylineExtractionOp.h" - -#include - -#include "HYDROGUI_Module.h" -#include "HYDROGUI_Operations.h" -#include "HYDROGUI_Tool.h" -#include "HYDROGUI_UpdateFlags.h" - -#include +#include +#include +#include +#include #include -#include -#include - -#include -#include - -#include -#include - -#include +#include HYDROGUI_PolylineExtractionOp::HYDROGUI_PolylineExtractionOp( HYDROGUI_Module* theModule ) : HYDROGUI_Operation( theModule ) @@ -59,124 +44,16 @@ void HYDROGUI_PolylineExtractionOp::startOperation() if ( aSeq.IsEmpty() ) return; + startDocOperation(); + HYDROData_PolylineOperator anOp; for ( Standard_Integer anIndex = 1, aLength = aSeq.Length(); anIndex <= aLength; anIndex++ ) { - Handle(HYDROData_Entity) anObject = aSeq.Value( anIndex ); - if ( anObject.IsNull() ) - continue; - - ShapeInfoList aList; - - switch ( anObject->GetKind() ) - { - case KIND_STREAM: - aList = extract( Handle(HYDROData_Stream)::DownCast( anObject ) ); - break; - case KIND_DIGUE: - case KIND_CHANNEL: - aList = extract( Handle(HYDROData_Channel)::DownCast( anObject ) ); - break; - case KIND_OBSTACLE: - aList = extract( Handle(HYDROData_Obstacle)::DownCast( anObject ) ); - break; - } - - startDocOperation(); - - for ( ShapeInfoList::const_iterator it = aList.begin(); it != aList.end(); ++it ) - { - const ShapeInfo& inf = *it; - TopoDS_Shape aLine = inf.shape(); - QString aName = QString( "%1_%2" ).arg( anObject->GetName() ).arg( inf.name() ); - if ( !HYDROGUI_Tool::FindObjectByName( aModule, aName ).IsNull() ) - { - int num = 1; - while ( !HYDROGUI_Tool::FindObjectByName( aModule, aName + QString( "_%1" ).arg( num ) ).IsNull() ) - num++; - - aName += QString( "_%1" ).arg( num ); - } - - Handle(HYDROData_PolylineXY) aPolylineObj = Handle(HYDROData_PolylineXY)::DownCast( doc()->CreateObject( KIND_POLYLINEXY ) ); - if ( !aPolylineObj.IsNull() ) - { - aPolylineObj->SetName( aName ); - aPolylineObj->ImportShape( aLine ); - aPolylineObj->Update(); - } - } - - commitDocOperation(); + Handle(HYDROData_Object) anObject = Handle(HYDROData_Object)::DownCast( aSeq.Value( anIndex ) ); + if( !anObject.IsNull() ) + anOp.Extract( doc(), anObject ); } + commitDocOperation(); aModule->update( anUpdateFlags ); - commit(); } - -HYDROGUI_PolylineExtractionOp::ShapeInfoList HYDROGUI_PolylineExtractionOp::extract( const Handle(HYDROData_Stream)& theStream ) const -{ - ShapeInfoList aList; - if ( !theStream.IsNull() ) - { - aList.append( ShapeInfo( theStream->GetLeftShape(), QString( "Left bank" ) ) ); - aList.append( ShapeInfo( theStream->GetRightShape(), QString( "Right bank" ) ) ); - - HYDROData_SequenceOfObjects aProfiles = theStream->GetProfiles(); - for ( int i = 1; i <= aProfiles.Length(); i++ ) - { - Handle(HYDROData_Profile) aProfile = Handle(HYDROData_Profile)::DownCast( aProfiles.Value( i ) ); - aList.append( ShapeInfo( aProfile->GetTopShape(), QString( "Profile_%1" ).arg( i ) ) ); - } - } - return aList; -} - -HYDROGUI_PolylineExtractionOp::ShapeInfoList HYDROGUI_PolylineExtractionOp::extract( const Handle(HYDROData_Channel)& aChannel ) const -{ - ShapeInfoList aList; - if ( !aChannel.IsNull() ) - { - HYDROData_SequenceOfObjects aGroups = aChannel->GetGroups(); - int aNum = qMin( aGroups.Length(), 2 ); - for ( int i = 1; i <= aNum; i++ ) - { - Handle(HYDROData_ShapesGroup) aGroup = Handle(HYDROData_ShapesGroup)::DownCast( aGroups.Value( i ) ); - TopTools_SequenceOfShape aShapes; - aGroup->GetShapes( aShapes ); - if ( !aShapes.IsEmpty() ) - { - TopoDS_Wire aWire; - BRep_Builder aBuilder; - aBuilder.MakeWire( aWire ); - - for ( int s = 1; s <= aShapes.Length(); s++ ) - aBuilder.Add( aWire, aShapes.Value( s ) ); - aList.append( ShapeInfo( aWire, i > 1 ? "Right bank" : "Left bank" ) ); - } - } - } - return aList; -} - -HYDROGUI_PolylineExtractionOp::ShapeInfoList HYDROGUI_PolylineExtractionOp::extract( const Handle(HYDROData_Obstacle)& theObstacle ) const -{ - ShapeInfoList aList; - if ( !theObstacle.IsNull() ) - { - TopoDS_Wire aWire; - BRep_Builder aBuilder; - aBuilder.MakeWire( aWire ); - HYDROData_SequenceOfObjects aGroups = theObstacle->GetGroups(); - for ( int i = 1; i <= aGroups.Length(); i++ ) - { - Handle(HYDROData_ShapesGroup) aGroup = Handle(HYDROData_ShapesGroup)::DownCast( aGroups.Value( i ) ); - TopTools_SequenceOfShape aShapes; - aGroup->GetShapes( aShapes ); - for ( int s = 1; s <= aShapes.Length(); s++ ) - aBuilder.Add( aWire, aShapes.Value( s ) ); - } - aList.append( ShapeInfo( aWire, QString( "Contour" ) ) ); - } - return aList; -} diff --git a/src/HYDROGUI/HYDROGUI_PolylineExtractionOp.h b/src/HYDROGUI/HYDROGUI_PolylineExtractionOp.h index 414799e5..1258e1f1 100644 --- a/src/HYDROGUI/HYDROGUI_PolylineExtractionOp.h +++ b/src/HYDROGUI/HYDROGUI_PolylineExtractionOp.h @@ -37,27 +37,7 @@ public: virtual ~HYDROGUI_PolylineExtractionOp(); protected: - virtual void startOperation(); - -private: - class ShapeInfo - { - public: - ShapeInfo( const TopoDS_Shape s, const QString& n ) : myShape( s ), myName( n ) {} - TopoDS_Shape shape() const { return myShape; } - QString name() const { return myName; } - - private: - TopoDS_Shape myShape; - QString myName; - }; - - typedef QList ShapeInfoList; - -private: - ShapeInfoList extract( const Handle(HYDROData_Stream)& ) const; - ShapeInfoList extract( const Handle(HYDROData_Channel)& ) const; - ShapeInfoList extract( const Handle(HYDROData_Obstacle)& ) const; + virtual void startOperation(); }; #endif -- 2.39.2