X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FSMESH_SWIG_WITHIHM%2FlibSMESH_Swig.cxx;h=a5a5dfe01e4cb991ecee9e37fb3a0f610e8e767f;hb=10191484fe88a27e962b8e4b57e09d390d8705c7;hp=e0d44ec30fb3eaafeeebaae5b179c4311782ea0a;hpb=3e56460d2056836f223ebe90647f57fd067f633e;p=modules%2Fsmesh.git diff --git a/src/SMESH_SWIG_WITHIHM/libSMESH_Swig.cxx b/src/SMESH_SWIG_WITHIHM/libSMESH_Swig.cxx index e0d44ec30..a5a5dfe01 100644 --- a/src/SMESH_SWIG_WITHIHM/libSMESH_Swig.cxx +++ b/src/SMESH_SWIG_WITHIHM/libSMESH_Swig.cxx @@ -24,6 +24,7 @@ // #include "libSMESH_Swig.h" +#include #include #include @@ -35,6 +36,7 @@ #include #include #include +#include #include @@ -49,6 +51,7 @@ #include #include #include +#include // OCCT includes #include @@ -62,6 +65,10 @@ #include CORBA_SERVER_HEADER(SMESH_Gen) #include CORBA_SERVER_HEADER(SMESH_Hypothesis) +// VTK includes +#include +#include + static CORBA::ORB_var anORB; namespace @@ -202,14 +209,13 @@ namespace void SetDomain(const char* theMeshOrSubMeshEntry, const char* theDomainEntry, - const SALOMEDS::Study_var& theStudy, const SALOMEDS::StudyBuilder_var& theStudyBuilder, long theRefOnAppliedDomainTag, const QString& theAppliedDomainMEN, const QString& theAppliedDomainICON) { - SALOMEDS::SObject_var aMeshOrSubMeshSO = theStudy->FindObjectID(theMeshOrSubMeshEntry); - SALOMEDS::SObject_var aHypothesisSO = theStudy->FindObjectID(theDomainEntry); + SALOMEDS::SObject_var aMeshOrSubMeshSO = KERNEL::getStudyServant()->FindObjectID(theMeshOrSubMeshEntry); + SALOMEDS::SObject_var aHypothesisSO = KERNEL::getStudyServant()->FindObjectID(theDomainEntry); if(!aMeshOrSubMeshSO->_is_nil() && !aHypothesisSO->_is_nil()){ //Find or Create Applied Hypothesis root @@ -245,12 +251,10 @@ namespace void SetHypothesis(const char* theMeshOrSubMeshEntry, const char* theDomainEntry, - const SALOMEDS::Study_var& theStudy, const SALOMEDS::StudyBuilder_var& theStudyBuilder) { SetDomain(theMeshOrSubMeshEntry, theDomainEntry, - theStudy, theStudyBuilder, SMESH::Tag_RefOnAppliedHypothesis, QObject::tr("SMESH_MEN_APPLIED_HYPOTHESIS"), @@ -262,12 +266,10 @@ namespace void SetAlgorithms(const char* theMeshOrSubMeshEntry, const char* theDomainEntry, - const SALOMEDS::Study_var& theStudy, const SALOMEDS::StudyBuilder_var& theStudyBuilder) { SetDomain(theMeshOrSubMeshEntry, theDomainEntry, - theStudy, theStudyBuilder, SMESH::Tag_RefOnAppliedAlgorithms, QObject::tr("SMESH_MEN_APPLIED_ALGORIHTMS"), @@ -313,21 +315,15 @@ SMESH_Swig::SMESH_Swig() //=============================================================== void -SMESH_Swig::Init(int theStudyID) +SMESH_Swig::Init() { class TEvent: public SALOME_Event { - int myStudyID; - SALOMEDS::Study_var& myStudy; SALOMEDS::StudyBuilder_var& myStudyBuilder; SALOMEDS::SComponent_var& mySComponentMesh; public: - TEvent(int theStudyID, - SALOMEDS::Study_var& theStudy, - SALOMEDS::StudyBuilder_var& theStudyBuilder, + TEvent(SALOMEDS::StudyBuilder_var& theStudyBuilder, SALOMEDS::SComponent_var& theSComponentMesh): - myStudyID (theStudyID), - myStudy (theStudy), myStudyBuilder (theStudyBuilder), mySComponentMesh(theSComponentMesh) {} @@ -345,26 +341,22 @@ SMESH_Swig::Init(int theStudyID) SUIT_Application* anApplication = aSession->activeApplication(); SalomeApp_Application* anApp = dynamic_cast(anApplication); - SALOME_NamingService* aNamingService = anApp->namingService(); - CORBA::Object_var anObject = aNamingService->Resolve("/myStudyManager"); - SALOMEDS::StudyManager_var aStudyMgr = SALOMEDS::StudyManager::_narrow(anObject); - myStudy = aStudyMgr->GetStudyByID(myStudyID); + SALOMEDS::Study_var aStudy = KERNEL::getStudyServant(); SMESH::SMESH_Gen_var aSMESHGen = SMESHGUI::GetSMESHGen(); - aSMESHGen->SetCurrentStudy( myStudy.in() ); - myStudyBuilder = myStudy->NewBuilder(); + myStudyBuilder = aStudy->NewBuilder(); SALOMEDS::GenericAttribute_var anAttr; SALOMEDS::AttributeName_var aName; SALOMEDS::AttributePixMap_var aPixmap; - SALOMEDS::SComponent_var aSComponent = myStudy->FindComponent("SMESH"); + SALOMEDS::SComponent_var aSComponent = aStudy->FindComponent("SMESH"); if ( aSComponent->_is_nil() ) { - bool aLocked = myStudy->GetProperties()->IsLocked(); + bool aLocked = aStudy->GetProperties()->IsLocked(); if (aLocked) - myStudy->GetProperties()->SetLocked(false); + aStudy->GetProperties()->SetLocked(false); SMESHGUI* aSMESHGUI = SMESHGUI::GetSMESHGUI(); //SRN: BugID IPAL9186, load a SMESH gui if it hasn't been loaded @@ -387,13 +379,13 @@ SMESH_Swig::Init(int theStudyID) aPixmap->SetPixMap( "ICON_OBJBROWSER_SMESH" ); aPixmap->UnRegister(); - SALOMEDS::UseCaseBuilder_var useCaseBuilder = myStudy->GetUseCaseBuilder(); + SALOMEDS::UseCaseBuilder_var useCaseBuilder = KERNEL::getStudyServant()->GetUseCaseBuilder(); useCaseBuilder->SetRootCurrent(); useCaseBuilder->Append( aSComponent.in() ); myStudyBuilder->DefineComponentInstance(aSComponent,aSMESHGen); if (aLocked) - myStudy->GetProperties()->SetLocked(true); + KERNEL::getStudyServant()->GetProperties()->SetLocked(true); } mySComponentMesh = SALOMEDS::SComponent::_narrow(aSComponent); @@ -404,9 +396,7 @@ SMESH_Swig::Init(int theStudyID) //MESSAGE("Init"); - ProcessVoidEvent(new TEvent(theStudyID, - myStudy, - myStudyBuilder, + ProcessVoidEvent(new TEvent(myStudyBuilder, mySComponentMesh)); } @@ -423,7 +413,7 @@ const char* SMESH_Swig::AddNewMesh(const char* theIOR) { // VSR: added temporarily - to be removed - objects are published automatically by engine - SALOMEDS::SObject_var aSObject = myStudy->FindObjectIOR(theIOR); + SALOMEDS::SObject_var aSObject = KERNEL::getStudyServant()->FindObjectIOR(theIOR); if (aSObject->_is_nil()) { //Find or Create Hypothesis root @@ -482,8 +472,8 @@ const char* SMESH_Swig::AddNewAlgorithms(const char* theIOR) void SMESH_Swig::SetShape(const char* theShapeEntry, const char* theMeshEntry) { - SALOMEDS::SObject_var aGeomShapeSO = myStudy->FindObjectID( theShapeEntry ); - SALOMEDS::SObject_var aMeshSO = myStudy->FindObjectID( theMeshEntry ); + SALOMEDS::SObject_var aGeomShapeSO = KERNEL::getStudyServant()->FindObjectID( theShapeEntry ); + SALOMEDS::SObject_var aMeshSO = KERNEL::getStudyServant()->FindObjectID( theMeshEntry ); if(!aMeshSO->_is_nil() && !aGeomShapeSO->_is_nil()){ SALOMEDS::SObject_var aSObject = myStudyBuilder->NewObjectToTag(aMeshSO, SMESH::Tag_RefOnShape); @@ -501,7 +491,6 @@ void SMESH_Swig::SetHypothesis(const char* theMeshOrSubMeshEntry, { ::SetHypothesis(theMeshOrSubMeshEntry, theDomainEntry, - myStudy, myStudyBuilder); } @@ -512,7 +501,6 @@ void SMESH_Swig::SetAlgorithms(const char* theMeshOrSubMeshEntry, { ::SetAlgorithms(theMeshOrSubMeshEntry, theDomainEntry, - myStudy, myStudyBuilder); } @@ -521,7 +509,7 @@ void SMESH_Swig::SetAlgorithms(const char* theMeshOrSubMeshEntry, void SMESH_Swig::UnSetHypothesis(const char* theDomainEntry) { - SALOMEDS::SObject_var aDomainSO = myStudy->FindObjectID(theDomainEntry); + SALOMEDS::SObject_var aDomainSO = KERNEL::getStudyServant()->FindObjectID(theDomainEntry); if(!aDomainSO->_is_nil()) myStudyBuilder->RemoveObject(aDomainSO); } @@ -530,7 +518,7 @@ const char* SMESH_Swig::AddSubMesh(const char* theMeshEntry, const char* theSubMeshIOR, int theShapeType) { - SALOMEDS::SObject_var aMeshSO = myStudy->FindObjectID(theMeshEntry); + SALOMEDS::SObject_var aMeshSO = KERNEL::getStudyServant()->FindObjectID(theMeshEntry); if(!aMeshSO->_is_nil()) { long aShapeTag; QString aSubMeshName; @@ -593,11 +581,11 @@ const char* SMESH_Swig::AddSubMeshOnShape(const char* theMeshEntry, const char* theSubMeshIOR, int ShapeType) { - SALOMEDS::SObject_var aGeomShapeSO = myStudy->FindObjectID(theGeomShapeEntry); + SALOMEDS::SObject_var aGeomShapeSO = KERNEL::getStudyServant()->FindObjectID(theGeomShapeEntry); if(!aGeomShapeSO->_is_nil()) { const char * aSubMeshEntry = AddSubMesh(theMeshEntry,theSubMeshIOR,ShapeType); - SALOMEDS::SObject_var aSubMeshSO = myStudy->FindObjectID(aSubMeshEntry); + SALOMEDS::SObject_var aSubMeshSO = KERNEL::getStudyServant()->FindObjectID(aSubMeshEntry); if ( !aSubMeshSO->_is_nil()) { SetShape( theGeomShapeEntry, aSubMeshEntry ); CORBA::String_var aString = aSubMeshSO->GetID(); @@ -638,22 +626,19 @@ SUIT_ViewWindow* getWnd( const int id ) return resWnd; } - -actorAspect SMESH_Swig::GetActorAspect( const char* Mesh_Entry, int viewId ) +class TGetActorAspect: public SALOME_Event { - class TGetActorAspect: public SALOME_Event +public: + typedef actorAspect TResult; + TResult myResult; + const char* _entry; + int _wid; + TGetActorAspect( const char* Mesh_Entry, int viewId ) { - public: - typedef actorAspect TResult; - TResult myResult; - const char* _entry; - int _wid; - TGetActorAspect( const char* Mesh_Entry, int viewId ) - { - _entry = Mesh_Entry; - _wid = viewId; - } - virtual void Execute() + _entry = Mesh_Entry; + _wid = viewId; + } + virtual void Execute() { SMESH_Actor* anActor; if (_wid) @@ -685,8 +670,10 @@ actorAspect SMESH_Swig::GetActorAspect( const char* Mesh_Entry, int viewId ) myResult.opacity= anActor->GetOpacity(); MESSAGE("opacity: " << myResult.opacity); } - }; +}; +actorAspect SMESH_Swig::GetActorAspect( const char* Mesh_Entry, int viewId ) +{ return ProcessEvent(new TGetActorAspect( Mesh_Entry, viewId)); } @@ -816,10 +803,29 @@ void SMESH_Swig::EraseActor( const char* Mesh_Entry, const bool allViewers ) ProcessVoidEvent(new TEvent(Mesh_Entry, allViewers)); } +void SMESH_Swig::UpdateActor( const char* Mesh_Entry ) { + class TEvent: public SALOME_Event + { + private: + const char* _entry; + public: + TEvent( const char* Mesh_Entry ) { + _entry = Mesh_Entry; + } + virtual void Execute() { + Handle(SALOME_InteractiveObject) anIO = new SALOME_InteractiveObject + ( _entry, "SMESH", "" ); + SMESH::Update( anIO, true ); + } + }; + + ProcessVoidEvent( new TEvent(Mesh_Entry) ); +} + void SMESH_Swig::SetName(const char* theEntry, const char* theName) { - SALOMEDS::SObject_var aSObject = myStudy->FindObjectID(theEntry); + SALOMEDS::SObject_var aSObject = KERNEL::getStudyServant()->FindObjectID(theEntry); SALOMEDS::GenericAttribute_var anAttr; SALOMEDS::AttributeName_var aName; if(!aSObject->_is_nil()){ @@ -845,15 +851,12 @@ void SMESH_Swig::SetMeshIcon(const char* theMeshEntry, { class TEvent: public SALOME_Event { - SALOMEDS::Study_var myStudy; std::string myMeshEntry; bool myIsComputed, myIsEmpty; public: - TEvent(const SALOMEDS::Study_var& theStudy, - const std::string& theMeshEntry, + TEvent(const std::string& theMeshEntry, const bool theIsComputed, const bool isEmpty): - myStudy (theStudy), myMeshEntry (theMeshEntry), myIsComputed(theIsComputed), myIsEmpty (isEmpty) @@ -863,15 +866,14 @@ void SMESH_Swig::SetMeshIcon(const char* theMeshEntry, void Execute() { - SALOMEDS::SObject_ptr aMeshSO = myStudy->FindObjectID(myMeshEntry.c_str()); + SALOMEDS::SObject_ptr aMeshSO = KERNEL::getStudyServant()->FindObjectID(myMeshEntry.c_str()); if(_PTR(SObject) aMesh = ClientFactory::SObject(aMeshSO)) SMESH::ModifiedMesh(aMesh,myIsComputed,myIsEmpty); // aMeshSO->UnRegister(); ~aMesh() already called UnRegister()! } }; - ProcessVoidEvent(new TEvent(myStudy, - theMeshEntry, + ProcessVoidEvent(new TEvent(theMeshEntry, theIsComputed, isEmpty)); } @@ -893,17 +895,18 @@ public: {} virtual void Execute() { - SMESHGUI* aSMESHGUI = SMESHGUI::GetSMESHGUI(); - if( !aSMESHGUI ) - return; - LightApp_SelectionMgr* selMgr = SMESH::GetSelectionMgr( aSMESHGUI ); + LightApp_SelectionMgr* selMgr = 0; + SalomeApp_Application* anApp = dynamic_cast( SUIT_Session::session()->activeApplication() ); + if( anApp ) + selMgr = dynamic_cast( anApp->selectionMgr() ); + if( !selMgr ) return; selMgr->clearFilters(); - SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( aSMESHGUI ); + SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow(); if(!aViewWindow) return; @@ -957,30 +960,225 @@ void SMESH_Swig::select( const char* id, int id1, bool append ) { ProcessVoidEvent( new TSelectListEvent( id, ids, append ) ); } +/*! + \brief Helper class for selection edges of cell event +*/ +class TSelectListOfPairEvent: public SALOME_Event +{ + const char* myId; + std::vector > myIdsList; + bool myIsAppend; + +public: + TSelectListOfPairEvent(const char* id, std::vector > ids, bool append) : + myId(id), + myIdsList(ids), + myIsAppend(append) + {} + virtual void Execute() + { + + LightApp_SelectionMgr* selMgr = 0; + SalomeApp_Application* anApp = dynamic_cast( SUIT_Session::session()->activeApplication() ); + if( anApp ) + selMgr = dynamic_cast( anApp->selectionMgr() ); + + if( !selMgr ) + return; + + selMgr->clearFilters(); + + SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow(); + if(!aViewWindow) + return; + + SMESH_Actor* anActor = SMESH::FindActorByEntry( myId ); + + if (!anActor || !anActor->hasIO()) + return; + + Handle(SALOME_InteractiveObject) anIO = anActor->getIO(); + SALOME_ListIO aList; + aList.Append(anIO); + selMgr->setSelectedObjects(aList, false); + + if ( aViewWindow->SelectionMode() != EdgeOfCellSelection ) { + return; + } + + SVTK_IndexedMapOfIds aMap; + std::vector >::const_iterator anIter; + for (anIter = myIdsList.begin(); anIter != myIdsList.end(); ++anIter) { + std::vector aCompositeId; + aCompositeId.push_back((*anIter).first); + aCompositeId.push_back((*anIter).second); + aMap.Add(aCompositeId); + } + + // Set new selection + SVTK_Selector* aSelector = aViewWindow->GetSelector(); + aSelector->AddOrRemoveCompositeIndex(anIO, aMap, myIsAppend); + aViewWindow->highlight( anIO, true, true ); + aViewWindow->GetInteractor()->onEmitSelectionChanged(); + } +}; + +/*! + \brief Select the elements on the mesh, sub-mesh or group. + \param id object entry + \param ids list of the element ids + \param mode selection mode +*/ +void SMESH_Swig::select( const char* id, std::vector > ids, bool append ) { + ProcessVoidEvent( new TSelectListOfPairEvent( id, ids, append ) ); +} class TGetSelectionModeEvent : public SALOME_Event { public: - typedef int TResult; + typedef SelectionMode TResult; TResult myResult; - TGetSelectionModeEvent() : myResult( -1 ) {} + TGetSelectionModeEvent() : myResult( Undefined ) {} virtual void Execute() { - SMESHGUI* aSMESHGUI = SMESHGUI::GetSMESHGUI(); - if( !aSMESHGUI ) - return; - - SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( aSMESHGUI ); + SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( ); if(!aViewWindow) return; - myResult = aViewWindow->SelectionMode(); + myResult = (SelectionMode) aViewWindow->SelectionMode(); } }; /*! \brief Get selection mode of the active VTK View window. */ -int SMESH_Swig::getSelectionMode() { +SelectionMode SMESH_Swig::getSelectionMode() { return ProcessEvent( new TGetSelectionModeEvent() ); } + + +/*! + * Event to set selection mode +*/ +class TSetSelectionModeEvent : public SALOME_Event +{ + SelectionMode mySelectionMode; + +public: + + TSetSelectionModeEvent(const SelectionMode selectionMode) : + mySelectionMode(selectionMode) + {} + + virtual void Execute() + { + SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow(); + if(!aViewWindow) + return; + + Selection_Mode prevMode = aViewWindow->SelectionMode(); + bool changePointRepresentation = ( prevMode == NodeSelection && mySelectionMode != Node ) || + (prevMode != NodeSelection && mySelectionMode == Node); + + if( changePointRepresentation ) { + vtkRenderer *aRenderer = aViewWindow->getRenderer(); + VTK::ActorCollectionCopy aCopy(aRenderer->GetActors()); + vtkActorCollection *aCollection = aCopy.GetActors(); + aCollection->InitTraversal(); + while(vtkActor *anAct = aCollection->GetNextActor()){ + if(SMESH_Actor *anActor = dynamic_cast(anAct)){ + if(anActor->GetVisibility()){ + anActor->SetPointRepresentation(mySelectionMode == Node); + } + } + } + } + aViewWindow->SetSelectionMode(mySelectionMode); + } +}; + +void SMESH_Swig::setSelectionMode(SelectionMode selectionMode){ + ProcessVoidEvent( new TSetSelectionModeEvent( selectionMode ) ); +} + +class TGetSelectedEvent : public SALOME_Event +{ +public: + typedef std::vector TResult; + TResult myResult; + const char* myId; + + TGetSelectedEvent( const char* id) : + myResult( std::vector() ), + myId(id) + {} + + virtual void Execute() + { + SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow(); + if( !aViewWindow ) + return; + + SVTK_Selector* aSelector = aViewWindow->GetSelector(); + if( !aSelector ) + return; + + SMESH_Actor* anActor = SMESH::FindActorByEntry( myId ); + + if ( !anActor || !anActor->hasIO() ) + return; + + TColStd_IndexedMapOfInteger aMapIndex; + aSelector->GetIndex(anActor->getIO(),aMapIndex); + + for( int i = 1; i <= aMapIndex.Extent(); i++ ) + myResult.push_back( aMapIndex( i ) ); + } +}; + +std::vector SMESH_Swig::getSelected( const char* Mesh_Entry ) { + return ProcessEvent( new TGetSelectedEvent(Mesh_Entry) ); +} + +class TGetSelectedPairEvent : public SALOME_Event +{ +public: + typedef std::vector > TResult; + TResult myResult; + const char* myId; + + TGetSelectedPairEvent( const char* id) : + myResult( std::vector >() ), + myId(id) + {} + + virtual void Execute() + { + SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow(); + if( !aViewWindow ) + return; + + if(aViewWindow->SelectionMode() != EdgeOfCellSelection ) + return; + + SVTK_Selector* aSelector = aViewWindow->GetSelector(); + if( !aSelector ) + return; + + SMESH_Actor* anActor = SMESH::FindActorByEntry( myId ); + + if ( !anActor || !anActor->hasIO() ) + return; + + SVTK_IndexedMapOfIds aMapIndex; + aSelector->GetCompositeIndex(anActor->getIO(),aMapIndex); + + for( int i = 1; i <= aMapIndex.Extent(); i++ ) + myResult.push_back( std::make_pair( (int)aMapIndex( i )[0], (int)aMapIndex( i )[1]) ); + } +}; + +std::vector > SMESH_Swig::getSelectedEdgeOfCell( const char* Mesh_Entry ) { + return ProcessEvent( new TGetSelectedPairEvent(Mesh_Entry) ); +} +