--- /dev/null
+// Copyright (C) 2014-2015 EDF-R&D
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+//
+// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//
+
+#include "HYDROGUI_PolylineExtractionOp.h"
+
+#include <GraphicsView_Viewer.h>
+
+#include "HYDROGUI_Module.h"
+#include "HYDROGUI_Operations.h"
+#include "HYDROGUI_Tool.h"
+#include "HYDROGUI_UpdateFlags.h"
+
+#include <HYDROData_Profile.h>
+#include <HYDROData_Document.h>
+#include <HYDROData_PolylineXY.h>
+#include <HYDROData_ShapesGroup.h>
+
+#include <LightApp_Application.h>
+#include <LightApp_Displayer.h>
+
+#include <OCCViewer_ViewModel.h>
+#include <OCCViewer_ViewManager.h>
+
+#include <BRep_Builder.hxx>
+
+HYDROGUI_PolylineExtractionOp::HYDROGUI_PolylineExtractionOp( HYDROGUI_Module* theModule )
+: HYDROGUI_Operation( theModule )
+{
+ setName( tr( "POLYLINE_EXTRACTION" ) );
+}
+
+HYDROGUI_PolylineExtractionOp::~HYDROGUI_PolylineExtractionOp()
+{
+}
+
+void HYDROGUI_PolylineExtractionOp::startOperation()
+{
+ HYDROGUI_Operation::startOperation();
+
+ int anUpdateFlags = UF_ObjBrowser | UF_Model;
+ HYDROGUI_Module* aModule = module();
+
+ HYDROData_SequenceOfObjects aSeq = HYDROGUI_Tool::GetSelectedObjects( aModule );
+ if ( aSeq.IsEmpty() )
+ return;
+
+ for ( Standard_Integer anIndex = 1, aLength = aSeq.Length(); anIndex <= aLength; anIndex++ )
+ {
+ Handle(HYDROData_Entity) anObject = aSeq.Value( anIndex );
+ if ( anObject.IsNull() )
+ continue;
+
+ ShapeMap aMap;
+
+ switch ( anObject->GetKind() )
+ {
+ case KIND_STREAM:
+ aMap = extract( Handle(HYDROData_Stream)::DownCast( anObject ) );
+ break;
+ case KIND_DIGUE:
+ case KIND_CHANNEL:
+ aMap = extract( Handle(HYDROData_Channel)::DownCast( anObject ) );
+ break;
+ case KIND_OBSTACLE:
+ aMap = extract( Handle(HYDROData_Obstacle)::DownCast( anObject ) );
+ break;
+ }
+
+ startDocOperation();
+
+ for ( ShapeMap::Iterator it( aMap ); it.More(); it.Next() )
+ {
+ TopoDS_Shape aLine = it.Key();
+ QString aName = QString( "%1_%2" ).arg( anObject->GetName() ).arg( it.Value() );
+ 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();
+ }
+
+ aModule->update( anUpdateFlags );
+
+ commit();
+}
+
+HYDROGUI_PolylineExtractionOp::ShapeMap HYDROGUI_PolylineExtractionOp::extract( const Handle(HYDROData_Stream)& theStream )
+{
+ ShapeMap aMap;
+ if ( !theStream.IsNull() )
+ {
+ aMap.Bind( theStream->GetLeftShape(), "Left bank" );
+ aMap.Bind( theStream->GetRightShape(), "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 ) );
+ aMap.Bind( aProfile->GetTopShape(), aProfile->GetName() );
+ }
+ }
+ return aMap;
+}
+
+HYDROGUI_PolylineExtractionOp::ShapeMap HYDROGUI_PolylineExtractionOp::extract( const Handle(HYDROData_Channel)& aChannel )
+{
+ ShapeMap aMap;
+ 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 ) );
+ aMap.Bind( aWire, i > 1 ? "Right bank" : "Left bank" );
+ }
+ }
+ }
+ return aMap;
+}
+
+HYDROGUI_PolylineExtractionOp::ShapeMap HYDROGUI_PolylineExtractionOp::extract( const Handle(HYDROData_Obstacle)& theObstacle )
+{
+ ShapeMap aMap;
+ 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 ) );
+ }
+ aMap.Bind( aWire, "Contour" );
+ }
+ return aMap;
+}
--- /dev/null
+// Copyright (C) 2014-2015 EDF-R&D
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+//
+// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//
+
+#ifndef HYDROGUI_POLYLINEEXTRACTIONOP_H
+#define HYDROGUI_POLYLINEEXTRACTIONOP_H
+
+#include "HYDROGUI_Operation.h"
+
+#include <HYDROData_Stream.h>
+#include <HYDROData_Channel.h>
+#include <HYDROData_Obstacle.h>
+
+#include <NCollection_DataMap.hxx>
+
+class HYDROGUI_PolylineExtractionOp : public HYDROGUI_Operation
+{
+ Q_OBJECT
+
+public:
+
+ HYDROGUI_PolylineExtractionOp( HYDROGUI_Module* theModule );
+ virtual ~HYDROGUI_PolylineExtractionOp();
+
+protected:
+ virtual void startOperation();
+
+private:
+ typedef NCollection_DataMap<TopoDS_Shape, QString> ShapeMap;
+
+private:
+ ShapeMap extract( const Handle(HYDROData_Stream)& );
+ ShapeMap extract( const Handle(HYDROData_Channel)& );
+ ShapeMap extract( const Handle(HYDROData_Obstacle)& );
+};
+
+#endif