X-Git-Url: http://git.salome-platform.org/gitweb/?p=modules%2Fsmesh.git;a=blobdiff_plain;f=src%2FSMESHGUI%2FSMESHGUI_VTKUtils.cxx;h=e3d6adeab7f29434b546e565a93955d8a0e52dad;hp=a6755381339772b94d273354e213133579846cb7;hb=61bac50f78623aabd9e4ddbcbba072c63ea02165;hpb=ea8a0289f14641c23d515de68aa4fdc24a6208ba diff --git a/src/SMESHGUI/SMESHGUI_VTKUtils.cxx b/src/SMESHGUI/SMESHGUI_VTKUtils.cxx index a67553813..e3d6adeab 100644 --- a/src/SMESHGUI/SMESHGUI_VTKUtils.cxx +++ b/src/SMESHGUI/SMESHGUI_VTKUtils.cxx @@ -1,4 +1,4 @@ -// Copyright (C) 2007-2014 CEA/DEN, EDF R&D, OPEN CASCADE +// Copyright (C) 2007-2021 CEA/DEN, EDF R&D, OPEN CASCADE // // Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS @@ -28,16 +28,16 @@ #include "SMESHGUI_VTKUtils.h" #include "SMESHGUI.h" -#include "SMESHGUI_Utils.h" #include "SMESHGUI_Filter.h" +#include "SMESHGUI_Utils.h" +#include "SMDS_Mesh.hxx" +#include "SMESH_Actor.h" +#include "SMESH_ActorProps.h" +#include "SMESH_ActorUtils.h" +#include "SMESH_CellLabelActor.h" #include "SMESH_ControlsDef.hxx" - -#include -#include #include "SMESH_NodeLabelActor.h" -#include "SMESH_CellLabelActor.h" -#include -#include +#include "SMESH_ObjectDef.h" // SALOME GUI includes #include @@ -47,7 +47,6 @@ #include #include -#include #include #include @@ -74,20 +73,11 @@ #include // OCCT includes -#include #include -#include -#include -#include -#include -#include -#include -#include -#include namespace SMESH { - typedef std::map TVisualObjCont; + typedef std::map TVisualObjCont; static TVisualObjCont VISUAL_OBJ_CONT; //============================================================================= @@ -147,17 +137,13 @@ namespace SMESH } } - if (aViewManager ) { - int aStudyId = aViewManager->study()->id(); - TVisualObjCont::key_type aKey(aStudyId,theEntry); - TVisualObjCont::iterator anIter = VISUAL_OBJ_CONT.find(aKey); - if(anIter != VISUAL_OBJ_CONT.end()) { - // for unknown reason, object destructor is not called, so clear object manually - anIter->second->GetUnstructuredGrid()->SetCells(0,0,0,0,0); - anIter->second->GetUnstructuredGrid()->SetPoints(0); - } - VISUAL_OBJ_CONT.erase(aKey); + TVisualObjCont::iterator anIter = VISUAL_OBJ_CONT.find(theEntry); + if(anIter != VISUAL_OBJ_CONT.end()) { + // for unknown reason, object destructor is not called, so clear object manually + anIter->second->GetUnstructuredGrid()->SetCells(0,0,0,0,0); + anIter->second->GetUnstructuredGrid()->SetPoints(0); } + VISUAL_OBJ_CONT.erase(theEntry); if(actorRemoved) aStudy->setVisibilityState(theEntry, Qtx::HiddenState); @@ -210,7 +196,7 @@ namespace SMESH */ //================================================================================ - void RemoveVisuData(int studyID) + void RemoveVisuData() { SalomeApp_Application* app = dynamic_cast ( SUIT_Session::session()->activeApplication() ); @@ -218,8 +204,7 @@ namespace SMESH ViewManagerList viewMgrs = app->viewManagers(); for ( int iM = 0; iM < viewMgrs.count(); ++iM ) { SUIT_ViewManager* aViewManager = viewMgrs.at( iM ); - if ( aViewManager && aViewManager->getType() == SVTK_Viewer::Type() && - aViewManager->study()->id() == studyID ) { + if ( aViewManager && aViewManager->getType() == SVTK_Viewer::Type() ) { QVector views = aViewManager->getViews(); for ( int iV = 0; iV < views.count(); ++iV ) { if(SVTK_ViewWindow* vtkWnd = GetVtkViewWindow(views[iV])) { @@ -240,17 +225,91 @@ namespace SMESH } TVisualObjCont::iterator anIter = VISUAL_OBJ_CONT.begin(); for ( ; anIter != VISUAL_OBJ_CONT.end(); ) { - int curId = anIter->first.first; - if ( curId == studyID ) { - // for unknown reason, object destructor is not called, so clear object manually - anIter->second->GetUnstructuredGrid()->SetCells(0,0,0,0,0); - anIter->second->GetUnstructuredGrid()->SetPoints(0); - VISUAL_OBJ_CONT.erase( anIter++ ); // anIter++ returns a copy of self before incrementing - } - else { - anIter++; + // for unknown reason, object destructor is not called, so clear object manually + anIter->second->GetUnstructuredGrid()->SetCells(0,0,0,0,0); + anIter->second->GetUnstructuredGrid()->SetPoints(0); + VISUAL_OBJ_CONT.erase( anIter++ ); // anIter++ returns a copy of self before incrementing + } + } + + //================================================================================ + /*! + * \brief Remove/update actors while module activation + * \param [in] wnd - window + * + * At module activation, groups and sub-meshes can be removed on engine side due + * to modification of meshed geometry, while their actors can remain. + * Here we remove/update SMESH_Actor's of changed objects. State (emptiness) of objects + * is defined by their icons in the Object Browser + */ + //================================================================================ + + void UpdateActorsAfterUpdateStudy( SUIT_ViewWindow* theWindow ) + { + const char* emptyIcon = "ICON_SMESH_TREE_MESH_WARN"; + _PTR(Study) aStudy = SMESH::getStudy(); + + if ( SVTK_ViewWindow* aViewWindow = GetVtkViewWindow( theWindow )) + { + vtkRenderer *aRenderer = aViewWindow->getRenderer(); + VTK::ActorCollectionCopy aCopy(aRenderer->GetActors()); + vtkActorCollection *aCollection = aCopy.GetActors(); + aCollection->InitTraversal(); + while ( vtkActor *actor = aCollection->GetNextActor() ) { + if ( SMESH_Actor *smeshActor = dynamic_cast( actor )) + { + if ( !smeshActor->hasIO() ) + continue; + Handle(SALOME_InteractiveObject) io = smeshActor->getIO(); + if ( !io->hasEntry() ) + continue; + _PTR(SObject) so = aStudy->FindObjectID( io->getEntry() ); + if ( !so ) + continue; // seems impossible + + CORBA::Object_var obj = SMESH::SObjectToObject( so ); + if ( CORBA::is_nil( obj )) // removed object + { + RemoveActor( theWindow, smeshActor ); + continue; + } + + bool toShow = smeshActor->GetVisibility(); + _PTR(GenericAttribute) attr; + if ( toShow && so->FindAttribute( attr, "AttributePixMap" )) // check emptiness + { + _PTR(AttributePixMap) pixMap = attr; + toShow = ( pixMap->GetPixMap() != emptyIcon ); + } + //smeshActor->Update(); + UpdateView( theWindow, toShow ? eDisplay : eErase, io->getEntry() ); + } } } + return; + } + + //================================================================================ + /*! + * \brief Remove/update actors while module activation + * + * At module activation, groups and sub-meshes can be removed on engine side due + * to modification of meshed geometry, while their actors can remain. + * Here we remove/update SMESH_Actor's of changed objects. State (emptiness) of objects + * is defined by their icons in the Object Browser + */ + //================================================================================ + + void UpdateActorsAfterUpdateStudy() + { + SUIT_Study* study = SMESH::GetActiveStudy(); + if ( SUIT_Desktop* desk = study->application()->desktop() ) + { + QList wndList = desk->windows(); + SUIT_ViewWindow* wnd; + foreach ( wnd, wndList ) + SMESH::UpdateActorsAfterUpdateStudy(wnd); + } } //================================================================================ @@ -262,9 +321,7 @@ namespace SMESH void OnVisuException() { try { -#if (OCC_VERSION_MAJOR << 16 | OCC_VERSION_MINOR << 8 | OCC_VERSION_MAINTENANCE) > 0x060100 OCC_CATCH_SIGNALS; -#endif // PAL16774 (Crash after display of many groups). Salome sometimes crashes just // after or at showing this message, so we do an additional check of available memory // char* buf = new char[100*1024]; @@ -291,20 +348,17 @@ namespace SMESH */ //================================================================================ - TVisualObjPtr GetVisualObj(int theStudyId, const char* theEntry, bool nulData){ + TVisualObjPtr GetVisualObj(const char* theEntry, bool nulData){ TVisualObjPtr aVisualObj; - TVisualObjCont::key_type aKey(theStudyId,theEntry); try{ -#if (OCC_VERSION_MAJOR << 16 | OCC_VERSION_MINOR << 8 | OCC_VERSION_MAINTENANCE) > 0x060100 OCC_CATCH_SIGNALS; -#endif - TVisualObjCont::iterator anIter = VISUAL_OBJ_CONT.find(aKey); + TVisualObjCont::iterator anIter = VISUAL_OBJ_CONT.find(theEntry); if(anIter != VISUAL_OBJ_CONT.end()){ aVisualObj = anIter->second; }else{ SalomeApp_Application* app = dynamic_cast( SMESHGUI::activeStudy()->application() ); - _PTR(Study) aStudy = SMESHGUI::activeStudy()->studyDS(); + _PTR(Study) aStudy = SMESH::getStudy(); _PTR(SObject) aSObj = aStudy->FindObjectID(theEntry); if(aSObj){ _PTR(GenericAttribute) anAttr; @@ -317,7 +371,7 @@ namespace SMESH SMESH::SMESH_Mesh_var aMesh = SMESH::SMESH_Mesh::_narrow(anObj); if(!aMesh->_is_nil()){ aVisualObj.reset(new SMESH_MeshObj(aMesh)); - TVisualObjCont::value_type aValue(aKey,aVisualObj); + TVisualObjCont::value_type aValue(theEntry,aVisualObj); VISUAL_OBJ_CONT.insert(aValue); } //Try narrow to SMESH_Group interface @@ -328,10 +382,10 @@ namespace SMESH aFatherSObj = aFatherSObj->GetFather(); if(!aFatherSObj) return aVisualObj; CORBA::String_var anEntry = aFatherSObj->GetID().c_str(); - TVisualObjPtr aVisObj = GetVisualObj(theStudyId,anEntry.in()); + TVisualObjPtr aVisObj = GetVisualObj(anEntry.in()); if(SMESH_MeshObj* aMeshObj = dynamic_cast(aVisObj.get())){ aVisualObj.reset(new SMESH_GroupObj(aGroup,aMeshObj)); - TVisualObjCont::value_type aValue(aKey,aVisualObj); + TVisualObjCont::value_type aValue(theEntry,aVisualObj); VISUAL_OBJ_CONT.insert(aValue); } } @@ -343,10 +397,10 @@ namespace SMESH aFatherSObj = aFatherSObj->GetFather(); if(!aFatherSObj) return aVisualObj; CORBA::String_var anEntry = aFatherSObj->GetID().c_str(); - TVisualObjPtr aVisObj = GetVisualObj(theStudyId,anEntry.in()); + TVisualObjPtr aVisObj = GetVisualObj(anEntry.in()); if(SMESH_MeshObj* aMeshObj = dynamic_cast(aVisObj.get())){ aVisualObj.reset(new SMESH_subMeshObj(aSubMesh,aMeshObj)); - TVisualObjCont::value_type aValue(aKey,aVisualObj); + TVisualObjCont::value_type aValue(theEntry,aVisualObj); VISUAL_OBJ_CONT.insert(aValue); } } @@ -362,19 +416,14 @@ namespace SMESH bool objModified = false; if ( aVisualObj ) { try { -#if (OCC_VERSION_MAJOR << 16 | OCC_VERSION_MINOR << 8 | OCC_VERSION_MAINTENANCE) > 0x060100 OCC_CATCH_SIGNALS; -#endif - //MESSAGE("GetVisualObj"); if (nulData) - objModified = aVisualObj->NulData(); + objModified = aVisualObj->NulData(); else objModified = aVisualObj->Update(); } catch (...) { -#ifdef _DEBUG_ MESSAGE ( "Exception in SMESHGUI_VTKUtils::GetVisualObj()" ); -#endif RemoveVisualObjectWithActors( theEntry ); // remove this object OnVisuException(); aVisualObj.reset(); @@ -382,32 +431,32 @@ namespace SMESH } if ( objModified ) { - // PAL16631. Mesurements showed that to show aVisualObj in SHADING(default) mode, + // PAL16631. Measurements showed that to show aVisualObj in SHADING(default) mode, // ~5 times more memory is used than it occupies. // Warn the user if there is less free memory than 30 sizes of a grid // TODO: estimate memory usage in other modes and take current mode into account int freeMB = SMDS_Mesh::CheckMemory(true); int usedMB = aVisualObj->GetUnstructuredGrid()->GetActualMemorySize() / 1024; - MESSAGE("SMESHGUI_VTKUtils::GetVisualObj(), freeMB=" << freeMB << ", usedMB=" < freeMB ) + // don't even try to show + SUIT_MessageBox::warning(SMESHGUI::desktop(), QObject::tr("SMESH_WRN_WARNING"), + QObject::tr("SMESH_NO_MESH_VISUALIZATION")); + else + // there is a chance to succeed + continu = SUIT_MessageBox::warning + (SMESHGUI::desktop(), + QObject::tr("SMESH_WRN_WARNING"), + QObject::tr("SMESH_CONTINUE_MESH_VISUALIZATION"), + SUIT_MessageBox::Yes | SUIT_MessageBox::No, + SUIT_MessageBox::Yes ) == SUIT_MessageBox::Yes; + if ( !continu ) { + // remove the corresponding actors from all views + RemoveVisualObjectWithActors( theEntry ); + aVisualObj.reset(); + } } } @@ -416,7 +465,7 @@ namespace SMESH /*! Return active view window, if it instantiates SVTK_ViewWindow class, - * overwise find or create corresponding view window, make it active and return it. + * otherwise find or create corresponding view window, make it active and return it. * \note Active VVTK_ViewWindow can be returned, because it inherits SVTK_ViewWindow. */ SVTK_ViewWindow* GetViewWindow (const SalomeApp_Module* theModule, @@ -487,16 +536,12 @@ namespace SMESH if (SVTK_ViewWindow* wnd = GetCurrentVtkView()) { try { -#if (OCC_VERSION_MAJOR << 16 | OCC_VERSION_MINOR << 8 | OCC_VERSION_MAINTENANCE) > 0x060100 OCC_CATCH_SIGNALS; -#endif wnd->getRenderer()->Render(); wnd->Repaint(false); } catch (...) { -#ifdef _DEBUG_ MESSAGE ( "Exception in SMESHGUI_VTKUtils::RepaintCurrentView()" ); -#endif OnVisuException(); } } @@ -505,16 +550,12 @@ namespace SMESH void RepaintViewWindow(SVTK_ViewWindow* theWindow) { try { -#if (OCC_VERSION_MAJOR << 16 | OCC_VERSION_MINOR << 8 | OCC_VERSION_MAINTENANCE) > 0x060100 OCC_CATCH_SIGNALS; -#endif theWindow->getRenderer()->Render(); theWindow->Repaint(); } catch (...) { -#ifdef _DEBUG_ MESSAGE ( "Exception in SMESHGUI_VTKUtils::RepaintViewWindow(SVTK_ViewWindow*)" ); -#endif OnVisuException(); } } @@ -522,16 +563,12 @@ namespace SMESH void RenderViewWindow(SVTK_ViewWindow* theWindow) { try { -#if (OCC_VERSION_MAJOR << 16 | OCC_VERSION_MINOR << 8 | OCC_VERSION_MAINTENANCE) > 0x060100 OCC_CATCH_SIGNALS; -#endif theWindow->getRenderer()->Render(); theWindow->Repaint(); } catch (...) { -#ifdef _DEBUG_ MESSAGE ( "Exception in SMESHGUI_VTKUtils::RenderViewWindow(SVTK_ViewWindow*)" ); -#endif OnVisuException(); } } @@ -539,16 +576,12 @@ namespace SMESH void FitAll(){ if(SVTK_ViewWindow* wnd = GetCurrentVtkView() ){ try { -#if (OCC_VERSION_MAJOR << 16 | OCC_VERSION_MINOR << 8 | OCC_VERSION_MAINTENANCE) > 0x060100 OCC_CATCH_SIGNALS; -#endif wnd->onFitAll(); wnd->Repaint(); } catch (...) { -#ifdef _DEBUG_ MESSAGE ( "Exception in SMESHGUI_VTKUtils::FitAll()" ); -#endif OnVisuException(); } } @@ -589,7 +622,7 @@ namespace SMESH return NULL; if(!CORBA::is_nil(theObject)){ - _PTR(Study) aStudy = GetActiveStudyDocument(); + _PTR(Study) aStudy = getStudy(); CORBA::String_var anIOR = app->orb()->object_to_string( theObject ); _PTR(SObject) aSObject = aStudy->FindObjectIOR(anIOR.in()); if(aSObject){ @@ -601,14 +634,12 @@ namespace SMESH } - SMESH_Actor* CreateActor(_PTR(Study) theStudy, - const char* theEntry, + SMESH_Actor* CreateActor(const char* theEntry, int theIsClear) { SMESH_Actor *anActor = NULL; - CORBA::Long anId = theStudy->StudyId(); - if(TVisualObjPtr aVisualObj = GetVisualObj(anId,theEntry)){ - _PTR(SObject) aSObj = theStudy->FindObjectID(theEntry); + if(TVisualObjPtr aVisualObj = GetVisualObj(theEntry)){ + _PTR(SObject) aSObj = getStudy()->FindObjectID(theEntry); if(aSObj){ _PTR(GenericAttribute) anAttr; if(aSObj->FindAttribute(anAttr,"AttributeName")){ @@ -648,7 +679,7 @@ namespace SMESH } } } - MESSAGE("CreateActor " << anActor); + //MESSAGE("CreateActor " << anActor); if( anActor ) if( SMESHGUI* aSMESHGUI = SMESHGUI::GetSMESHGUI() ) aSMESHGUI->addActorAsObserver( anActor ); @@ -659,35 +690,29 @@ namespace SMESH void DisplayActor( SUIT_ViewWindow *theWnd, SMESH_Actor* theActor){ if(SVTK_ViewWindow* vtkWnd = GetVtkViewWindow(theWnd)){ try { -#if (OCC_VERSION_MAJOR << 16 | OCC_VERSION_MINOR << 8 | OCC_VERSION_MAINTENANCE) > 0x060100 OCC_CATCH_SIGNALS; -#endif - MESSAGE("DisplayActor " << theActor); + //MESSAGE("DisplayActor " << theActor); vtkWnd->AddActor(theActor); vtkWnd->Repaint(); } catch (...) { -#ifdef _DEBUG_ MESSAGE ( "Exception in SMESHGUI_VTKUtils::DisplayActor()" ); -#endif OnVisuException(); } } } - void RemoveActor( SUIT_ViewWindow *theWnd, SMESH_Actor* theActor){ - if(SVTK_ViewWindow* vtkWnd = GetVtkViewWindow(theWnd)){ - MESSAGE("RemoveActor " << theActor); + void RemoveActor( SUIT_ViewWindow *theWnd, SMESH_Actor* theActor) + { + if ( SVTK_ViewWindow* vtkWnd = GetVtkViewWindow(theWnd)) { + //MESSAGE("RemoveActor " << theActor); vtkWnd->RemoveActor(theActor); if(theActor->hasIO()){ Handle(SALOME_InteractiveObject) anIO = theActor->getIO(); if(anIO->hasEntry()){ std::string anEntry = anIO->getEntry(); - SalomeApp_Study* aStudy = dynamic_cast( vtkWnd->getViewManager()->study() ); - int aStudyId = aStudy->id(); - TVisualObjCont::key_type aKey(aStudyId,anEntry); - VISUAL_OBJ_CONT.erase(aKey); + VISUAL_OBJ_CONT.erase(anEntry); } } theActor->Delete(); @@ -701,9 +726,10 @@ namespace SMESH */ //================================================================================ - bool noSmeshActors(SUIT_ViewWindow *theWnd) + bool NoSmeshActors(SUIT_ViewWindow *theWnd) { - if(SVTK_ViewWindow* aViewWindow = GetVtkViewWindow(theWnd)) { + SUIT_ViewWindow* aWnd = ( theWnd == nullptr ) ? GetActiveWindow() : theWnd; + if(SVTK_ViewWindow* aViewWindow = GetVtkViewWindow(aWnd)) { vtkRenderer *aRenderer = aViewWindow->getRenderer(); VTK::ActorCollectionCopy aCopy(aRenderer->GetActors()); vtkActorCollection *aCollection = aCopy.GetActors(); @@ -717,7 +743,7 @@ namespace SMESH bool UpdateView(SUIT_ViewWindow *theWnd, EDisplaing theAction, const char* theEntry) { - //MESSAGE("UpdateView"); + //MESSAGE("UpdateView"); bool OK = false; SVTK_ViewWindow* aViewWnd = GetVtkViewWindow(theWnd); if (!aViewWnd) @@ -732,6 +758,7 @@ namespace SMESH if (!aStudy) return OK; + SUIT_ResourceMgr* resMgr; { OK = true; vtkRenderer *aRenderer = aViewWnd->getRenderer(); @@ -743,7 +770,7 @@ namespace SMESH case eDisplayAll: { while (vtkActor *anAct = aCollection->GetNextActor()) { if (SMESH_Actor *anActor = dynamic_cast(anAct)) { - MESSAGE("--- display " << anActor); + //MESSAGE("--- display " << anActor); anActor->SetVisibility(true); if(anActor->hasIO()){ @@ -761,54 +788,67 @@ namespace SMESH //MESSAGE("---case eDisplayOnly"); while (vtkActor *anAct = aCollection->GetNextActor()) { if (SMESH_Actor *anActor = dynamic_cast(anAct)) { - //MESSAGE("--- erase " << anActor); + //MESSAGE("--- erase " << anActor); anActor->SetVisibility(false); } } aStudy->setVisibilityStateForAll(Qtx::HiddenState); } + // fall through default: { if (SMESH_Actor *anActor = FindActorByEntry(theWnd,theEntry)) { switch (theAction) { case eDisplay: case eDisplayOnly: - //MESSAGE("--- display " << anActor); + //MESSAGE("--- display " << anActor); anActor->Update(); anActor->SetVisibility(true); if (theAction == eDisplayOnly) aRenderer->ResetCameraClippingRange(); aStudy->setVisibilityState(theEntry, Qtx::ShownState); + if (( theAction == eDisplayOnly ) && + ( resMgr = SMESHGUI::resourceMgr() ) && + ( resMgr->booleanValue( "SMESH", "fitall_on_displayonly", false ))) + FitAll(); // PAL23615 break; case eErase: - //MESSAGE("--- erase " << anActor); + //MESSAGE("--- erase " << anActor); anActor->SetVisibility(false); aStudy->setVisibilityState(theEntry, Qtx::HiddenState); break; + default:; } } else { switch (theAction) { case eDisplay: case eDisplayOnly: { - //MESSAGE("---"); + //MESSAGE("---"); SalomeApp_Study* aStudy = dynamic_cast(theWnd->getViewManager()->study()); - _PTR(Study) aDocument = aStudy->studyDS(); - // Pass non-visual objects (hypotheses, etc.), return true in this case - CORBA::Long anId = aDocument->StudyId(); TVisualObjPtr aVisualObj; - if ( (aVisualObj = GetVisualObj(anId,theEntry)) && aVisualObj->IsValid()) + if ( (aVisualObj = GetVisualObj(theEntry)) && aVisualObj->IsValid()) { - if ((anActor = CreateActor(aDocument,theEntry,true))) { - bool needFitAll = noSmeshActors(theWnd); // fit for the first object only + if ((anActor = CreateActor(theEntry,true))) { + bool needFitAll = NoSmeshActors(theWnd); // fit for the first object only DisplayActor(theWnd,anActor); + anActor->SetVisibility(true); aStudy->setVisibilityState(theEntry, Qtx::ShownState); // FitAll(); - PAL16770(Display of a group performs an automatic fit all) - if (needFitAll) FitAll(); - } else { + if (( !needFitAll ) && + ( theAction == eDisplayOnly ) && + ( resMgr = SMESHGUI::resourceMgr() )) + { + needFitAll = resMgr->booleanValue( "SMESH", "fitall_on_displayonly", false ); + } + if ( needFitAll ) + FitAll(); + } + else { OK = false; } } break; } + default:; } } } @@ -818,20 +858,25 @@ namespace SMESH } - bool UpdateView(EDisplaing theAction, const char* theEntry){ - //MESSAGE("UpdateView"); + bool UpdateView(EDisplaing theAction, const char* theEntry) { + //MESSAGE("UpdateView"); SalomeApp_Study* aStudy = dynamic_cast< SalomeApp_Study* >( GetActiveStudy() ); SalomeApp_Application* app = dynamic_cast< SalomeApp_Application* >( aStudy->application() ); - SUIT_ViewWindow *aWnd = app->activeViewManager()->getActiveView(); - return UpdateView(aWnd,theAction,theEntry); + if ( SUIT_ViewManager* vm = app->activeViewManager() ) + { + SUIT_ViewWindow *aWnd = vm->getActiveView(); + return UpdateView(aWnd,theAction,theEntry); + } + return false; } - void UpdateView(){ - if(SVTK_ViewWindow* aWnd = SMESH::GetCurrentVtkView()){ + void UpdateView( bool withChildrenOfSelected ) + { + if ( SVTK_ViewWindow* aWnd = SMESH::GetCurrentVtkView()) { LightApp_SelectionMgr* mgr = SMESHGUI::selectionMgr(); SALOME_ListIO selected; mgr->selectedObjects( selected ); - if( selected.Extent() == 0){ + if ( selected.Extent() == 0 ) { vtkRenderer* aRenderer = aWnd->getRenderer(); VTK::ActorCollectionCopy aCopy(aRenderer->GetActors()); vtkActorCollection *aCollection = aCopy.GetActors(); @@ -840,15 +885,39 @@ namespace SMESH if(SMESH_Actor *anActor = dynamic_cast(anAct)){ if(anActor->hasIO()) if (!Update(anActor->getIO(),anActor->GetVisibility())) - break; // avoid multiple warinings if visu failed + break; // avoid multiple warnings if visu failed } } - }else{ + } + else + { SALOME_ListIteratorOfListIO anIter( selected ); - for( ; anIter.More(); anIter.Next()){ + for( ; anIter.More(); anIter.Next()) + { Handle(SALOME_InteractiveObject) anIO = anIter.Value(); - if ( !Update(anIO,true) ) - break; // avoid multiple warinings if visu failed + if ( !Update( anIO, true )) + break; // avoid multiple warnings if visu failed + + if ( withChildrenOfSelected ) // update all visible children + { + QString aFatherID = anIO->getEntry(); + vtkRenderer* aRenderer = aWnd->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->hasIO() && anActor->GetVisibility() ) + { + QString aChildID = anActor->getIO()->getEntry(); + if ( aChildID.size() > aFatherID.size() && + aChildID.startsWith( aFatherID )) + if ( ! Update( anActor->getIO(), true )) + break; + } + } + } + } } } RepaintCurrentView(); @@ -858,10 +927,8 @@ namespace SMESH bool Update(const Handle(SALOME_InteractiveObject)& theIO, bool theDisplay) { - MESSAGE("Update"); - _PTR(Study) aStudy = GetActiveStudyDocument(); - CORBA::Long anId = aStudy->StudyId(); - if ( TVisualObjPtr aVisualObj = SMESH::GetVisualObj(anId,theIO->getEntry())) { + //MESSAGE("Update"); + if ( TVisualObjPtr aVisualObj = SMESH::GetVisualObj(theIO->getEntry())) { if ( theDisplay ) UpdateView(SMESH::eDisplay,theIO->getEntry()); return true; @@ -871,10 +938,8 @@ namespace SMESH bool UpdateNulData(const Handle(SALOME_InteractiveObject)& theIO, bool theDisplay) { - MESSAGE("UpdateNulData"); - _PTR(Study) aStudy = GetActiveStudyDocument(); - CORBA::Long anId = aStudy->StudyId(); - if ( TVisualObjPtr aVisualObj = SMESH::GetVisualObj(anId,theIO->getEntry(), true)) { + //MESSAGE("UpdateNulData"); + if ( TVisualObjPtr aVisualObj = SMESH::GetVisualObj(theIO->getEntry(), true)) { if ( theDisplay ) UpdateView(SMESH::eDisplay,theIO->getEntry()); return true; @@ -882,7 +947,8 @@ namespace SMESH return false; } - void UpdateSelectionProp( SMESHGUI* theModule ) { + void UpdateSelectionProp( SMESHGUI* theModule ) + { if( !theModule ) return; @@ -909,25 +975,31 @@ namespace SMESH return; } - QColor aHiColor = mgr->colorValue( "SMESH", "selection_object_color", Qt::white ), - aSelColor = mgr->colorValue( "SMESH", "selection_element_color", Qt::yellow ), - aPreColor = mgr->colorValue( "SMESH", "highlight_color", Qt::cyan ); + SMESH_ActorProps::props()->reset(); + + QColor + //aHiColor = mgr->colorValue( "SMESH", "selection_object_color", Qt::white ), + aSelColor = mgr->colorValue( "SMESH", "selection_element_color", Qt::yellow ), + aPreColor = mgr->colorValue( "SMESH", "highlight_color", Qt::cyan ); int aElem0DSize = mgr->integerValue("SMESH", "elem0d_size", 5); - int aBallSize = mgr->integerValue("SMESH", "ball_elem_size", 5); + // int aBallSize = mgr->integerValue("SMESH", "ball_elem_size", 5); int aLineWidth = mgr->integerValue("SMESH", "element_width", 1); int maxSize = aElem0DSize; if (aElem0DSize > maxSize) maxSize = aElem0DSize; if (aLineWidth > maxSize) maxSize = aLineWidth; - if (aBallSize > maxSize) maxSize = aBallSize; + // if (aBallSize > maxSize) maxSize = aBallSize; - double SP1 = mgr->doubleValue( "SMESH", "selection_precision_node", 0.025 ), - SP2 = mgr->doubleValue( "SMESH", "selection_precision_element", 0.001 ), - SP3 = mgr->doubleValue( "SMESH", "selection_precision_object", 0.025 ); + double + SP1 = mgr->doubleValue( "SMESH", "selection_precision_node", 0.025 ), + SP2 = mgr->doubleValue( "SMESH", "selection_precision_element", 0.001 ), + SP3 = mgr->doubleValue( "SMESH", "selection_precision_object", 0.025 ); - for ( int i=0, n=views.count(); iSetSelectionProp(aSelColor.red()/255., aSelColor.green()/255., @@ -944,14 +1016,9 @@ namespace SMESH VTK::ActorCollectionCopy aCopy(aRenderer->GetActors()); vtkActorCollection *aCollection = aCopy.GetActors(); aCollection->InitTraversal(); - while(vtkActor *anAct = aCollection->GetNextActor()){ - if(SMESH_Actor *anActor = dynamic_cast(anAct)){ - anActor->SetHighlightColor(aHiColor.red()/255., - aHiColor.green()/255., - aHiColor.blue()/255.); - anActor->SetPreHighlightColor(aPreColor.red()/255., - aPreColor.green()/255., - aPreColor.blue()/255.); + while ( vtkActor *anAct = aCollection->GetNextActor() ) { + if ( SMESH_Actor *anActor = dynamic_cast(anAct) ) { + anActor->UpdateSelectionProps(); } } } @@ -1080,8 +1147,9 @@ namespace SMESH //---------------------------------------------------------------------------- - void SetPointRepresentation(bool theIsVisible){ - if(SVTK_ViewWindow* aViewWindow = GetCurrentVtkView()){ + void SetPointRepresentation(bool theIsVisible) + { + if ( SVTK_ViewWindow* aViewWindow = GetCurrentVtkView() ) { vtkRenderer *aRenderer = aViewWindow->getRenderer(); VTK::ActorCollectionCopy aCopy(aRenderer->GetActors()); vtkActorCollection *aCollection = aCopy.GetActors(); @@ -1098,8 +1166,9 @@ namespace SMESH } - void SetPickable(SMESH_Actor* theActor){ - if(SVTK_ViewWindow* aWnd = GetCurrentVtkView()){ + void SetPickable(SMESH_Actor* theActor) + { + if ( SVTK_ViewWindow* aWnd = GetCurrentVtkView() ) { int anIsAllPickable = (theActor == NULL); vtkRenderer *aRenderer = aWnd->getRenderer(); VTK::ActorCollectionCopy aCopy(aRenderer->GetActors()); @@ -1120,141 +1189,12 @@ namespace SMESH //---------------------------------------------------------------------------- - int GetNameOfSelectedSortedNodes( SMDSAbs_EntityType theElementType, - SVTK_Selector* theSelector, - SMESH_Actor* theActor, - int theShift, - QString& theName) - { - theName = ""; - TColStd_IndexedMapOfInteger aMapIndex; - Handle(SALOME_InteractiveObject) anIO = theActor->getIO(); - theSelector->GetIndex(anIO, aMapIndex); - - SMDS_Mesh* aMesh = 0; - if (theActor) - aMesh = theActor->GetObject()->GetMesh(); - - std::vector aVectorOfNode; - std::list aListOfId; - int aSize = aMapIndex.Extent(); - for( int i = 1 ; i <= aSize; i++) { - SMESH_TNodeXYZ aCurNode = aMesh->FindNode( aMapIndex(i) ); - aVectorOfNode.push_back( aCurNode ); - aListOfId.push_back( aCurNode._node->GetID() ); - } - SMESH_TNodeXYZ aFirstNode; - if ( aSize > 0 ) - aFirstNode = aVectorOfNode[0]; - int myNbNodes = 0; - std::list aResultListId; - switch ( theElementType ) { - case SMDSEntity_0D: - myNbNodes = 1; - break; - case SMDSEntity_Ball: - myNbNodes = 1; - break; - case SMDSEntity_Edge: - case SMDSEntity_Quad_Edge: - myNbNodes = 2; - break; - case SMDSEntity_Triangle: - case SMDSEntity_Quad_Triangle: - case SMDSEntity_BiQuad_Triangle: - myNbNodes = 3; - break; - case SMDSEntity_Quadrangle: - case SMDSEntity_Quad_Quadrangle: - case SMDSEntity_BiQuad_Quadrangle: - myNbNodes = 4; - if ( myNbNodes <= aSize ) { - aVectorOfNode.resize( myNbNodes ); - aVectorOfNode[0] = aVectorOfNode[theShift % myNbNodes]; - aVectorOfNode[theShift % myNbNodes] = aFirstNode; - GetSortedNodesOnPolygon( aVectorOfNode, aResultListId ); - } - break; - case SMDSEntity_Polygon: - myNbNodes = 0; - if ( aSize > 0 ) { - aVectorOfNode[0] = aVectorOfNode[theShift % aVectorOfNode.size()]; - aVectorOfNode[theShift % aVectorOfNode.size()] = aFirstNode; - } - GetSortedNodesOnPolygon( aVectorOfNode, aResultListId ); - break; - case SMDSEntity_Tetra: - case SMDSEntity_Quad_Tetra: - myNbNodes = 4; - break; - case SMDSEntity_Pyramid: - case SMDSEntity_Quad_Pyramid: - myNbNodes = 5; - if ( myNbNodes <= aSize ) { - aVectorOfNode.resize( myNbNodes ); - aVectorOfNode[0] = aVectorOfNode[theShift % myNbNodes]; - aVectorOfNode[theShift % myNbNodes] = aFirstNode; - GetSortedNodesOnPyramid( aVectorOfNode, aResultListId ); - } - break; - case SMDSEntity_Hexa: - case SMDSEntity_Quad_Hexa: - case SMDSEntity_TriQuad_Hexa: - myNbNodes = 8; - if ( myNbNodes <= aSize ) { - aVectorOfNode.resize( myNbNodes ); - aVectorOfNode[0] = aVectorOfNode[theShift % myNbNodes]; - aVectorOfNode[theShift % myNbNodes] = aFirstNode; - GetSortedNodesOnPrism( aVectorOfNode, aResultListId ); - } - break; - case SMDSEntity_Penta: - case SMDSEntity_Quad_Penta: - myNbNodes = 6; - if ( myNbNodes <= aSize ) { - aVectorOfNode.resize( myNbNodes ); - aVectorOfNode[0] = aVectorOfNode[theShift % myNbNodes]; - aVectorOfNode[theShift % myNbNodes] = aFirstNode; - GetSortedNodesOnPrism( aVectorOfNode, aResultListId ); - } - break; - case SMDSEntity_Hexagonal_Prism: - myNbNodes = 12; - if ( myNbNodes <= aSize ) { - aVectorOfNode.resize( myNbNodes ); - aVectorOfNode[0] = aVectorOfNode[theShift % myNbNodes]; - aVectorOfNode[theShift % myNbNodes] = aFirstNode; - GetSortedNodesOnPrism( aVectorOfNode, aResultListId ); - } - break; - default: - myNbNodes = 2; - } - if( myNbNodes > 0 ) { - if ( myNbNodes <= 3 || myNbNodes > aSize || theElementType == SMDSEntity_Tetra ) - aResultListId = aListOfId; - if ( myNbNodes < aSize ) { - if ( aResultListId.size() == 0 ) - return 0; - aVectorOfNode.resize( myNbNodes ); - aResultListId.resize( myNbNodes ); - } - } - std::list::iterator anIter = aResultListId.begin(); - - for( ; anIter != aResultListId.end(); anIter++ ) { - theName += QString(" %1").arg( *anIter ); - } - if ( myNbNodes <= 3 || myNbNodes > aSize || theElementType == SMDSEntity_Tetra ) - return aSize; - return aVectorOfNode.size(); - } - int GetNameOfSelectedNodes(SVTK_Selector* theSelector, + int GetNameOfSelectedNodes(SVTK_Selector* theSelector, const Handle(SALOME_InteractiveObject)& theIO, - QString& theName) + QString& theName) { theName = ""; - TColStd_IndexedMapOfInteger aMapIndex; + SVTK_TIndexedMapOfVtkId aMapIndex; theSelector->GetIndex(theIO,aMapIndex); for(int i = 1; i <= aMapIndex.Extent(); i++) @@ -1268,10 +1208,10 @@ namespace SMESH QString& theName) { theName = ""; - TColStd_IndexedMapOfInteger aMapIndex; + SVTK_TIndexedMapOfVtkId aMapIndex; theSelector->GetIndex(theIO,aMapIndex); - typedef std::set TIdContainer; + typedef std::set TIdContainer; TIdContainer anIdContainer; for( int i = 1; i <= aMapIndex.Extent(); i++) anIdContainer.insert(aMapIndex(i)); @@ -1286,8 +1226,8 @@ namespace SMESH int GetEdgeNodes(SVTK_Selector* theSelector, const TVisualObjPtr& theVisualObject, - int& theId1, - int& theId2) + ::smIdType& theId1, + ::smIdType& theId2) { const SALOME_ListIO& selected = theSelector->StoredIObjects(); @@ -1298,14 +1238,14 @@ namespace SMESH if ( anIO.IsNull() || !anIO->hasEntry() ) return -1; - TColStd_IndexedMapOfInteger aMapIndex; + SVTK_TIndexedMapOfVtkId aMapIndex; theSelector->GetIndex( anIO, aMapIndex ); if ( aMapIndex.Extent() != 2 ) return -1; - int anObjId = -1, anEdgeNum = -1; - for ( int i = 1; i <= aMapIndex.Extent(); i++ ) { - int aVal = aMapIndex( i ); + ::smIdType anObjId = -1, anEdgeNum = -1; + for ( ::smIdType i = 1; i <= aMapIndex.Extent(); i++ ) { + ::smIdType aVal = aMapIndex( i ); if ( aVal > 0 ) anObjId = aVal; else @@ -1337,7 +1277,8 @@ namespace SMESH return -1; } - int GetNameOfSelectedNodes(LightApp_SelectionMgr *theMgr, QString& theName){ + int GetNameOfSelectedNodes(LightApp_SelectionMgr *theMgr, QString& theName) + { theName = ""; SALOME_ListIO selected; theMgr->selectedObjects( selected ); if(selected.Extent() == 1){ @@ -1348,9 +1289,9 @@ namespace SMESH } - int GetNameOfSelectedElements(LightApp_SelectionMgr *theMgr, + int GetNameOfSelectedElements(LightApp_SelectionMgr * theMgr, const Handle(SALOME_InteractiveObject)& theIO, - QString& theName) + QString& theName) { theName = ""; if(theIO->hasEntry()){ @@ -1386,7 +1327,7 @@ namespace SMESH int GetSelected(LightApp_SelectionMgr* theMgr, TColStd_IndexedMapOfInteger& theMap, - const bool theIsElement) + const bool /*theIsElement*/) { theMap.Clear(); SALOME_ListIO selected; theMgr->selectedObjects( selected ); @@ -1402,7 +1343,7 @@ namespace SMESH } - int GetEdgeNodes( LightApp_SelectionMgr* theMgr, int& theId1, int& theId2 ) + int GetEdgeNodes( LightApp_SelectionMgr* theMgr, ::smIdType& theId1, ::smIdType& theId2 ) { SALOME_ListIO selected; theMgr->selectedObjects( selected ); @@ -1422,9 +1363,9 @@ namespace SMESH if ( aMapIndex.Extent() != 2 ) return -1; - int anObjId = -1, anEdgeNum = -1; - for ( int i = 1; i <= aMapIndex.Extent(); i++ ) { - int aVal = aMapIndex( i ); + ::smIdType anObjId = -1, anEdgeNum = -1; + for ( ::smIdType i = 1; i <= aMapIndex.Extent(); i++ ) { + ::smIdType aVal = aMapIndex( i ); if ( aVal > 0 ) anObjId = aVal; else @@ -1475,13 +1416,13 @@ namespace SMESH } double aBoundPoints[8][3] = { {theBounds[0],theBounds[2],theBounds[4]}, - {theBounds[1],theBounds[2],theBounds[4]}, - {theBounds[0],theBounds[3],theBounds[4]}, - {theBounds[1],theBounds[3],theBounds[4]}, - {theBounds[0],theBounds[2],theBounds[5]}, - {theBounds[1],theBounds[2],theBounds[5]}, - {theBounds[0],theBounds[3],theBounds[5]}, - {theBounds[1],theBounds[3],theBounds[5]}}; + {theBounds[1],theBounds[2],theBounds[4]}, + {theBounds[0],theBounds[3],theBounds[4]}, + {theBounds[1],theBounds[3],theBounds[4]}, + {theBounds[0],theBounds[2],theBounds[5]}, + {theBounds[1],theBounds[2],theBounds[5]}, + {theBounds[0],theBounds[3],theBounds[5]}, + {theBounds[1],theBounds[3],theBounds[5]}}; int aMaxId = 0; theMaxBoundPrj = vtkMath::Dot(theDirection,aBoundPoints[aMaxId]); @@ -1544,590 +1485,9 @@ namespace SMESH DistanceToPosition( theBounds, theNormal, theDist, theOrigin ); return true; } - bool CreatePlaneOnThreePoints( const gp_Pnt& thePoint1, - const gp_Pnt& thePoint2, - const gp_Pnt& thePoint3, - gp_Pln& thePlane ) - { - gp_Vec aVec1, aVec2; - aVec1 = gp_Vec( thePoint1, thePoint2 ); - aVec2 = gp_Vec( thePoint1, thePoint3 ); - double anAngle = aVec1.Angle( aVec2 ); - bool isOnStraight = ( anAngle != 0 && anAngle != M_PI ); - if ( isOnStraight ) { - gce_MakePln aMakePln (thePoint1, thePoint2, thePoint3); - if ( aMakePln.IsDone() ) { - thePlane = aMakePln.Value(); - } - } - return isOnStraight; - } - void FindNbLowestPoint( std::list theList, gp_Pnt2d& theNode ) - { - std::list::iterator anIter = theList.begin(); - gp_Pnt2d aNode = gp_Pnt2d ( (*anIter).X(), (*anIter).Y()); - for( ; anIter != theList.end(); anIter++ ) { - if ( (*anIter).Y() < aNode.Y() || ( (*anIter).Y() == aNode.Y() && (*anIter).X() < aNode.X() ) ) - aNode = *anIter; - } - theNode = aNode; - } - - static bool CompareNodeOfAngleAndDist (const TNodeOfAngleAndDist& first, const TNodeOfAngleAndDist& second ) - { - if ( first.second.second == 0 ) - return true; - if ( second.second.second == 0 ) - return false; - if ( first.second.first == 0 && second.second.first == 0 ) - if ( first.second.second > second.second.second ) - return false; - else - return true; - if ( first.second.first < second.second.first || - ( first.second.first == second.second.first && first.second.second >= second.second.second ) ) - return true; - return false; - } - - static bool CompareNodeOfDist (const TNodeOfAngleAndDist& first, const TNodeOfAngleAndDist& second ) - { - if ( first.second.second < second.second.second ) - return true; - return false; - } - - static bool CompareDistOfPlane ( const TNodeOfDistToPlaneAndDist& first, const TNodeOfDistToPlaneAndDist& second ) - { - if ( first.second.first == 0 && second.second.first != 0 ) - return true; - if ( first.second.first != 0 && second.second.first == 0 ) - return false; - if ( first.second.first < second.second.first || - ( first.second.first != 0 && second.second.first != 0 && - first.second.first == second.second.first && first.second.second > second.second.second ) ) - return true; - return false; - } - - static bool CompareDistOfPlaneById ( const TIdOfDistToPlaneAndDist& first, const TIdOfDistToPlaneAndDist& second ) - { - if ( first.second.first == 0 && second.second.first != 0 ) - return true; - if ( first.second.first != 0 && second.second.first == 0 ) - return false; - if ( first.second.first < second.second.first || - ( first.second.first != 0 && second.second.first != 0 && - first.second.first == second.second.first && first.second.second > second.second.second ) ) - return true; - return false; - } - - static bool CompareDistForCorrectPlane ( const TNodeOfDist& first, const TNodeOfDist& second ) - { - if ( first.second < second.second ) return true; - return false; - } - - bool IsNotPlaneIntersection( std::vector& theVector, const gp_Pln& thePlane ) - { - double A, B, C, D, aCur; - thePlane.Coefficients(A, B, C, D); - int aPlus = -1; - for ( int i = 0 ; i < (int)theVector.size(); ++i ) { - aCur = A * theVector[i]._xyz[0] + B * theVector[i]._xyz[1] + C * theVector[i]._xyz[2] + D; - if ( aCur == 0 ) - continue; - if ( aPlus == -1 && aCur != 0 ) - aPlus = ( aCur < 0 ) ? 0 : 1; - if ( aPlus > -1 && aPlus != ( aCur < 0 ) ? 0 : 1 ) - return false; - } - return true; - } - - bool GetNextCombination ( std::vector& theVector1, std::vector& theVector2, int theNbPoint ) - { - int aSize = (int)theVector1.size(); - for ( int i = aSize - 1; i >= 0; --i ) { - if ( theVector1[i] < theNbPoint - aSize + i ) { - ++theVector1[i]; - for ( int j = i + 1; j < aSize; ++j ) - theVector1[j] = theVector1[j-1] + 1; - int it = 0; - int it2 = 0; - bool isVec; - for ( int k = 0; k < theNbPoint; ++k ) { - isVec = false; - if( it < aSize ) { - if( k == theVector1[it] ) { - isVec = true; - ++it; - } - } - if ( isVec ) - continue; - theVector2[it2] = k; - it2++; - if ( it2 == (int)theVector2.size() ) - break; - } - return true; - } - } - return false; - } - - bool Get2BasePlane( std::vector& theVector, - std::vector& thePlane1, - std::vector& thePlane2 ) - { - int aSize = (int)theVector.size() / 2; - if ( aSize < 3 || (int)theVector.size() % 2 != 0 ) - return false; - int anArr1[3]; - int anArr2[2 * aSize - 3]; - for (int i = 0; i < 3 ; i++) { - anArr1[i] = i; - } - for (int i = 0; i < 2 * aSize - 3 ; i++) { - anArr2[i] = i + 3; - } - int aNbSwapFirstPoint = 0; - while ( thePlane1.empty() && thePlane2.empty() && aNbSwapFirstPoint < aSize * 2 ) { - std::vector anIndexPlane1( anArr1, anArr1 + 3 ); - std::vector anIndexPlane2( anArr2, anArr2 + 2 * aSize - 3); - int aNbCombination = 0; - double aMax = 0; - double aSumMin = -1; - int aMaxCombination = 0; - thePlane1.clear(); - thePlane2.clear(); - for (int i = 1; i < 2 * aSize - 1; i++ ) { - aMaxCombination += i; - } - while ( aNbCombination < aMaxCombination ) { - gp_Pln aPlane; - double aSumMinDist1 = 0; - double aSumMinDist2 = 0; - std::vector aVectorOfPoint; - for(int i = 0; i < 2 * aSize - 3; i++) { - aVectorOfPoint.push_back(theVector[anIndexPlane2[i]]); - } - bool isCorrectPlane = false; - bool isCreatePlane = CreatePlaneOnThreePoints( gp_Pnt(theVector[anIndexPlane1[0]]._xyz[0], theVector[anIndexPlane1[0]]._xyz[1], theVector[anIndexPlane1[0]]._xyz[2]), - gp_Pnt(theVector[anIndexPlane1[1]]._xyz[0], theVector[anIndexPlane1[1]]._xyz[1], theVector[anIndexPlane1[1]]._xyz[2]), - gp_Pnt(theVector[anIndexPlane1[2]]._xyz[0], theVector[anIndexPlane1[2]]._xyz[1], theVector[anIndexPlane1[2]]._xyz[2]), - aPlane ); - if ( isCreatePlane ) { - isCorrectPlane = IsNotPlaneIntersection( aVectorOfPoint, aPlane ); - } - if ( !isCorrectPlane ) { - GetNextCombination( anIndexPlane1, anIndexPlane2, 2*aSize ); - aNbCombination++; - continue; - } - std::vector anIndexCorrectPlane1; - std::vector anIndexCorrectPlane2; - if ( aSize == 3 ) { - for (int i = 0; i < aSize ; i++) { - anIndexCorrectPlane1.push_back( anIndexPlane1[i] ); - anIndexCorrectPlane2.push_back( anIndexPlane2[i] ); - } - } - if ( aSize >= 4 ) { - std::list aListBaseOfPoint; - TIdOfDistToPlaneAndDist aCurDistOfPlane; - for (int i = 0; i < 2 * aSize - 3; i++ ) { - aCurDistOfPlane.second.first = aPlane.Distance( gp_Pnt( theVector[anIndexPlane2[i]]._xyz[0], theVector[anIndexPlane2[i]]._xyz[1], theVector[anIndexPlane2[i]]._xyz[2] )); - if ( aCurDistOfPlane.second.first == 0 ) - aCurDistOfPlane.second.second = 0; - else { - double aCurDist = 0; - for (int j = 0; j < 3; j++) { - aCurDist += pow( theVector[anIndexPlane1[j]]._xyz[0] - theVector[anIndexPlane2[i]]._xyz[0], 2.0 ) + - pow( theVector[anIndexPlane1[j]]._xyz[1] - theVector[anIndexPlane2[i]]._xyz[1], 2.0 ) + - pow( theVector[anIndexPlane1[j]]._xyz[2] - theVector[anIndexPlane2[i]]._xyz[2], 2.0 ); - } - aCurDistOfPlane.second.second = aCurDist; - } - aCurDistOfPlane.first = anIndexPlane2[i]; - aListBaseOfPoint.push_back( aCurDistOfPlane ); - } - aListBaseOfPoint.sort( CompareDistOfPlaneById ); - std::list::iterator anIterDist = aListBaseOfPoint.begin(); - for (int i = 0; i < 3; i++) { - anIndexCorrectPlane1.push_back( anIndexPlane1[i] ); - } - for (int i = 0; i < aSize - 3; i++, anIterDist++) { - anIndexCorrectPlane1.push_back((*anIterDist).first); - } - for (int i = 0; i < 2 * aSize - 3 ; i++) { - anIterDist = aListBaseOfPoint.begin(); - bool isFinded = false; - for (int j = 0; j < aSize - 3; j++, anIterDist++) { - if ( anIndexPlane2[i] == (*anIterDist).first ) { - isFinded = true; - break; - } - } - if ( !isFinded ) - anIndexCorrectPlane2.push_back( anIndexPlane2[i] ); - } - } - double aCurDist1, aCurDist2, aMinDist1, aMinDist2, aSumDist1, aSumDist2, aSumDistBase1, aSumDistBase2; - bool isCorrect2Base = true; - aSumDist1 = aSumDistBase1 = aSumDist2 = aSumDistBase2 = 0; - for( int i = 0 ; i < aSize ; i++ ) { - aMinDist1 = 0; - aMinDist2 = 0; - for(int j = 0 ; j < aSize ; j++ ) { - aCurDist1 = pow( theVector[anIndexCorrectPlane1[i]]._xyz[0] - theVector[anIndexCorrectPlane2[j]]._xyz[0], 2.0 ) + - pow( theVector[anIndexCorrectPlane1[i]]._xyz[1] - theVector[anIndexCorrectPlane2[j]]._xyz[1], 2.0 ) + - pow( theVector[anIndexCorrectPlane1[i]]._xyz[2] - theVector[anIndexCorrectPlane2[j]]._xyz[2], 2.0 ); - aCurDist2 = pow( theVector[anIndexCorrectPlane1[j]]._xyz[0] - theVector[anIndexCorrectPlane2[i]]._xyz[0], 2.0 ) + - pow( theVector[anIndexCorrectPlane1[j]]._xyz[1] - theVector[anIndexCorrectPlane2[i]]._xyz[1], 2.0 ) + - pow( theVector[anIndexCorrectPlane1[j]]._xyz[2] - theVector[anIndexCorrectPlane2[i]]._xyz[2], 2.0 ); - aSumDistBase1 += pow( theVector[anIndexCorrectPlane1[i]]._xyz[0] - theVector[anIndexCorrectPlane1[j]]._xyz[0], 2.0 ) + - pow( theVector[anIndexCorrectPlane1[i]]._xyz[1] - theVector[anIndexCorrectPlane1[j]]._xyz[1], 2.0 ) + - pow( theVector[anIndexCorrectPlane1[i]]._xyz[2] - theVector[anIndexCorrectPlane1[j]]._xyz[2], 2.0 ); - aSumDistBase2 += pow( theVector[anIndexCorrectPlane2[i]]._xyz[0] - theVector[anIndexCorrectPlane2[j]]._xyz[0], 2.0 ) + - pow( theVector[anIndexCorrectPlane2[i]]._xyz[1] - theVector[anIndexCorrectPlane2[j]]._xyz[1], 2.0 ) + - pow( theVector[anIndexCorrectPlane2[i]]._xyz[2] - theVector[anIndexCorrectPlane2[j]]._xyz[2], 2.0 ); - if ( aCurDist1 < aMinDist1 || aMinDist1 == 0) - aMinDist1 = aCurDist1; - if ( aCurDist2 < aMinDist2 || aMinDist2 == 0) - aMinDist2 = aCurDist2; - aSumDist1 += aCurDist1; - aSumDist2 += aCurDist2; - } - aSumMinDist1 += aMinDist1; - aSumDist1 -= aMinDist1; - aSumMinDist2 += aMinDist2; - aSumDist2 -= aMinDist2; - } - isCorrect2Base = ( aSumDistBase1 + aSumDistBase2 <= aSumDist1 + aSumDist2 ); - if ( isCorrect2Base && ( aSumMinDist1 == aSumMinDist2 || ( aSumMinDist1 + aSumMinDist2 ) > aMax || aMax == 0 || - ( (aSumMinDist1 + aSumMinDist2 ) == aMax && ( (aSumDist1 + aSumDist2 - aSumDistBase1 - aSumDistBase2) < aSumMin || aSumMin == -1 ) ) ) ) { - aMax = aSumMinDist1 + aSumMinDist2; - aSumMin = aSumDist1 + aSumDist2 - aSumDistBase1 - aSumDistBase2; - thePlane1.clear(); - thePlane2.clear(); - for(int i = 0; i < aSize; i++) { - thePlane1.push_back(theVector[anIndexCorrectPlane1[i]]); - thePlane2.push_back(theVector[anIndexCorrectPlane2[i]]); - } - } - if ( aSumMinDist1 == aSumMinDist2 ) - break; - if ( !GetNextCombination( anIndexPlane1, anIndexPlane2, 2 * aSize) ) - break; - aNbCombination++; - } - if ( thePlane1.empty() && thePlane2.empty() ) { - aNbSwapFirstPoint++; - SMESH_TNodeXYZ aPoint; - aPoint = theVector[0]; - theVector[0] = theVector[aNbSwapFirstPoint]; - theVector[aNbSwapFirstPoint] = aPoint; - } - } - if ( thePlane1.empty() && thePlane2.empty() ) - return false; - return true; - } - - bool GetCorrectSequenceOfId( std::vector& theVector ) - { - std::list aListProjection; - gp_Pnt2d aCurPoint; - int aSize = (int)theVector.size(); - if ( aSize < 3 ) - return false; - gp_Pln aPlane; - bool isCreatePlane = false; - for (int i = 0; i < aSize - 1; i++ ) { - isCreatePlane = CreatePlaneOnThreePoints( gp_Pnt( theVector[i]._xyz[0], theVector[i]._xyz[1], theVector[i]._xyz[2] ), - gp_Pnt( theVector[i+1]._xyz[0], theVector[i+1]._xyz[1], theVector[i+1]._xyz[2] ), - gp_Pnt( theVector[i+2]._xyz[0], theVector[i+2]._xyz[1], theVector[i+2]._xyz[2] ), aPlane ); - if ( isCreatePlane) - break; - } - if ( !isCreatePlane ) - return false; - for ( int i = 0; i < aSize; i++) { - aCurPoint = ProjLib::Project( aPlane, gp_Pnt( theVector[i]._xyz[0], theVector[i]._xyz[1], theVector[i]._xyz[2] )); - aListProjection.push_back( aCurPoint ); - } - std::list aListIdOfAngleAndDist; - TNodeOfAngleAndDist aCurIdOfAngleAndDist; - FindNbLowestPoint( aListProjection, aCurPoint); - std::list::iterator anIter2d = aListProjection.begin(); - gp_Vec2d aCurVec; - gp_Vec2d aAxisVec = gp_Vec2d( 1, 0 ); - for( int i = 0 ; anIter2d != aListProjection.end(); anIter2d++, i++) { - aCurVec = gp_Vec2d( (*anIter2d).X() - aCurPoint.X(), (*anIter2d).Y() - aCurPoint.Y() ); - aCurIdOfAngleAndDist.first = theVector[i]; - if ( (*anIter2d).X() == aCurPoint.X() && (*anIter2d).Y() == aCurPoint.Y() ) - aCurIdOfAngleAndDist.second.first = 0; - else { - double anAngle = aAxisVec.Angle( aCurVec ); - double anRoundAngle = anAngle * 100000; - int anIntAngle = anRoundAngle + 0.5; - anRoundAngle = (double) anIntAngle / 100000; - aCurIdOfAngleAndDist.second.first = anRoundAngle; - } - aCurIdOfAngleAndDist.second.second = pow( (*anIter2d).X() - aCurPoint.X(), 2.0 ) + - pow( (*anIter2d).Y() - aCurPoint.Y(), 2.0 ) + - pow( aPlane.Distance( gp_Pnt( theVector[i]._xyz[0], theVector[i]._xyz[1], theVector[i]._xyz[2] )), 2.0 ); - aListIdOfAngleAndDist.push_back( aCurIdOfAngleAndDist ); - } - aListIdOfAngleAndDist.sort( CompareNodeOfAngleAndDist ); - std::list::iterator anIter = aListIdOfAngleAndDist.begin(); - std::list aListResult; - double anAngle = 0; - bool isSort = true; - for(int i = 0 ; anIter != aListIdOfAngleAndDist.end(); anIter++, i++) { - if ( anAngle == (*anIter).second.first && anAngle != 0 ) { - isSort = false; - break; - } - if ( ( anAngle > (*anIter).second.first && anAngle != 0 ) || i > 1) - break; - if ( (*anIter).second.first > 0 ) - anAngle = (*anIter).second.first; - } - if ( !isSort ) { - anIter = aListIdOfAngleAndDist.begin(); - for( ; anIter != aListIdOfAngleAndDist.end(); anIter++) { - if ( anAngle == (*anIter).second.first) - aListResult.push_back( *anIter ); - else if ( anAngle < (*anIter).second.first) - break; - } - } - else - anAngle = 0; - aListResult.sort(CompareNodeOfDist); - anIter = aListIdOfAngleAndDist.begin(); - theVector.clear(); - for( ; anIter != aListIdOfAngleAndDist.end(); anIter++) { - if ( !isSort && anAngle == (*anIter).second.first ){ - for( std::list::iterator anIter2 = aListResult.begin() ; anIter2 != aListResult.end(); anIter2++) { - theVector.push_back((*anIter2).first); - } - isSort = true; - } - if ( isSort && anAngle != 0 && anAngle == (*anIter).second.first ) - continue; - theVector.push_back((*anIter).first); - } - - return true; -} - - void GetCorrectSequenceTwoPlaneOfId( std::vector& thePlane1, std::vector& thePlane2, std::list& theResultListId ) - { - int anIndex1, anIndex2, aShift = 0; - double aCurSum; - std::pair aShiftOfDist; - int aSize = (int)thePlane1.size(); - aShiftOfDist.first = aShiftOfDist.second = 0; - int anArr1[3]; - int anArr2[aSize - 3]; - for (int i = 0; i < 3 ; i++) { - anArr1[i] = i; - } - for (int i = 0; i < aSize - 3 ; i++) { - anArr2[i] = i + 3; - } - std::vector anIndexPlane1( anArr1, anArr1 + 3 ); - std::vector anIndexPlane2( anArr2, anArr2 + aSize - 3); - std::vector anIndexCorrectPlane; - std::vector theNewPlane; - std::vector theCorrectPlane; - - GetCorrectSequenceOfId ( thePlane1 ); - - while( true ) { - anIndexCorrectPlane.clear(); - std::vector theNewPlane; - for (int i = 0; i < 3; i++) { - anIndexCorrectPlane.push_back( anIndexPlane1[i] ); - } - for (int i = 0; i < aSize - 3; i++) { - anIndexCorrectPlane.push_back( anIndexPlane2[i] ); - } - for (int i = 0; i < aSize; i++) { - theNewPlane.push_back( thePlane2[anIndexCorrectPlane[i]] ); - } - aShift = 0; - if ( GetCorrectSequenceOfId ( theNewPlane ) ) - { - std::vector aVectorSum; - while ( aShift != 2 * aSize ) { - anIndex1 = 0; - aCurSum = 0; - ( aShift < aSize ) ? anIndex2 = 0 : anIndex2 = aSize - 1; - while ( ( aShift < aSize && anIndex2 < aSize ) || ( aShift >= aSize && anIndex2 >= 0 ) ) { - aCurSum += pow( thePlane1[anIndex1]._xyz[0] - theNewPlane[ ( anIndex2 + aShift ) % aSize ]._xyz[0], 2.0 ) + - pow( thePlane1[anIndex1]._xyz[1] - theNewPlane[ ( anIndex2 + aShift ) % aSize ]._xyz[1], 2.0 ) + - pow( thePlane1[anIndex1]._xyz[2] - theNewPlane[ ( anIndex2 + aShift ) % aSize ]._xyz[2], 2.0 ); - ( aShift < aSize ) ? anIndex2++ : anIndex2--; - anIndex1++; - } - aVectorSum.push_back( aCurSum ); - aShift++; - } - double aCurSumMin = 0; - std::pair aCurShiftOfDist; - aCurShiftOfDist.first = aCurShiftOfDist.second = 0; - for ( int i = 0; i < (int)aVectorSum.size(); i++ ) { - if ( aVectorSum[i] < aCurShiftOfDist.second || aCurShiftOfDist.second == 0 ) { - aCurShiftOfDist.first = i; - aCurShiftOfDist.second = aVectorSum[i]; - } - } - if ( aCurShiftOfDist.second <= aShiftOfDist.second || aShiftOfDist.second == 0){ - aShiftOfDist = aCurShiftOfDist; - theCorrectPlane = theNewPlane; - } - } - if ( !GetNextCombination( anIndexPlane1, anIndexPlane2, aSize) ) - break; - } - thePlane2 = theCorrectPlane; - aShift = aShiftOfDist.first; - anIndex1 = 0; - theResultListId.clear(); - ( aShift < aSize ) ? anIndex2 = 0 : anIndex2 = aSize - 1; - while ( anIndex1 != aSize ) { - theResultListId.push_back(thePlane1[anIndex1]._node->GetID()); - anIndex1++; - } - while ( ( aShift < aSize && anIndex2 < aSize ) || ( aShift >= aSize && anIndex2 >= 0 ) ) { - theResultListId.push_back( thePlane2[( anIndex2 + aShift ) % aSize]._node->GetID() ); - ( aShift < aSize ) ? anIndex2++ : anIndex2--; - } - } - - void GetSortedNodesOnPolygon( std::vector& theVectorOfNode, std::list& theResultListId ) - { - GetCorrectSequenceOfId ( theVectorOfNode ); - for (int i = 0; i < theVectorOfNode.size(); i++) { - theResultListId.push_back( theVectorOfNode[i]._node->GetID() ); - } - } - - void GetSortedNodesOnPrism( std::vector& theVectorOfNode, std::list& theResultListId ) - { - int aSize = (int)theVectorOfNode.size(); - if ( aSize < 6 && aSize % 2 == 0) - return; - std::vector aPlane1, aPlane2; - if ( Get2BasePlane( theVectorOfNode, aPlane1, aPlane2 ) ) { - GetCorrectSequenceTwoPlaneOfId( aPlane1, aPlane2, theResultListId); - } - } - - void GetSortedNodesOnPyramid( std::vector& theVectorOfNode, std::list& theResultListId ) - { - int aSize = (int)theVectorOfNode.size(); - if ( aSize < 5 ) - return; - gp_Pln aPlane; - bool isCreatePlane, isCorrectPlane; - int aNumPlane = 0; - double aMax = 0; - while ( aNumPlane != aSize ) { - isCreatePlane = CreatePlaneOnThreePoints( gp_Pnt( theVectorOfNode[aNumPlane]._xyz[0], theVectorOfNode[aNumPlane]._xyz[1], theVectorOfNode[aNumPlane]._xyz[2] ), - gp_Pnt( theVectorOfNode[(aNumPlane + 1) % aSize]._xyz[0], theVectorOfNode[(aNumPlane + 1) % aSize]._xyz[1], theVectorOfNode[(aNumPlane + 1) % aSize]._xyz[2] ), - gp_Pnt( theVectorOfNode[(aNumPlane + 2) % aSize]._xyz[0], theVectorOfNode[(aNumPlane + 2) % aSize]._xyz[1], theVectorOfNode[(aNumPlane + 2) % aSize]._xyz[2] ), aPlane ); - isCorrectPlane = false; - std::vector aVectorOfPoint; - if ( isCreatePlane ) { - for(int j = 0; j < aSize - 3; j++) { - aVectorOfPoint.push_back(theVectorOfNode[(aNumPlane + j + 3) % aSize]); - } - isCorrectPlane = IsNotPlaneIntersection( aVectorOfPoint, aPlane ); - } - if ( !isCorrectPlane ) { - aNumPlane++; - continue; - } - std::vector aVectorBaseOfPoint; - std::list aListBaseOfPoint; - TNodeOfDistToPlaneAndDist aCurDistOfPlane; - aListBaseOfPoint.clear(); - for (int i = 0; i < aSize; i++ ) { - aCurDistOfPlane.second.first = aPlane.Distance( gp_Pnt( theVectorOfNode[i]._xyz[0], theVectorOfNode[i]._xyz[1], theVectorOfNode[i]._xyz[2] )); - if ( aCurDistOfPlane.second.first == 0 ) - aCurDistOfPlane.second.second = 0; - else { - double aCurDist = 0; - for (int j = 0; j < 3; j++) { - aCurDist += pow( theVectorOfNode[(aNumPlane + j) % aSize]._xyz[0] - theVectorOfNode[i]._xyz[0], 2.0 ) + - pow( theVectorOfNode[(aNumPlane + j) % aSize]._xyz[1] - theVectorOfNode[i]._xyz[1], 2.0 ) + - pow( theVectorOfNode[(aNumPlane + j) % aSize]._xyz[2] - theVectorOfNode[i]._xyz[2], 2.0 ); - } - aCurDistOfPlane.second.second = aCurDist; - } - aCurDistOfPlane.first = theVectorOfNode[i]; - aListBaseOfPoint.push_back( aCurDistOfPlane ); - } - aListBaseOfPoint.sort( CompareDistOfPlane ); - std::list::iterator anIterDist = aListBaseOfPoint.begin(); - for (; anIterDist != aListBaseOfPoint.end(); anIterDist++ ) { - aVectorBaseOfPoint.push_back((*anIterDist).first); - } - SMESH_TNodeXYZ aTopNode = aVectorBaseOfPoint.back(); - aVectorBaseOfPoint.resize( aVectorBaseOfPoint.size() - 1); - double aCur = 0; - double aSum = 0; - std::list aListBaseCorrect; - for (int i = 0; i < aSize - 1; i++) { - aCur = pow( aVectorBaseOfPoint[i]._xyz[0] - aTopNode._xyz[0], 2.0 ) + - pow( aVectorBaseOfPoint[i]._xyz[1] - aTopNode._xyz[1], 2.0 ) + - pow( aVectorBaseOfPoint[i]._xyz[2] - aTopNode._xyz[2], 2.0 ); - aListBaseCorrect.push_back(std::make_pair(aVectorBaseOfPoint[i], aCur) ); - } - bool isCorrectTop = true; - for (int i = 0; i < aSize - 1; i++) { - isCreatePlane = CreatePlaneOnThreePoints( gp_Pnt( aVectorBaseOfPoint[i]._xyz[0], aVectorBaseOfPoint[i]._xyz[1], aVectorBaseOfPoint[i]._xyz[2] ), - gp_Pnt( aVectorBaseOfPoint[(i+1) % (aSize - 1)]._xyz[0], aVectorBaseOfPoint[(i+1) % (aSize - 1)]._xyz[1], aVectorBaseOfPoint[(i+1) % (aSize - 1)]._xyz[2] ), - gp_Pnt( aVectorBaseOfPoint[(i+2) % (aSize - 1)]._xyz[0], aVectorBaseOfPoint[(i+2) % (aSize - 1)]._xyz[1], aVectorBaseOfPoint[(i+2) % (aSize - 1)]._xyz[2] ), aPlane ); - if ( isCreatePlane ) { - aCur = aPlane.Distance( gp_Pnt( aTopNode._xyz[0], aTopNode._xyz[1], aTopNode._xyz[2] )); - if ( aCur == 0 ) { - isCorrectTop = false; - continue; - } - aSum += aCur; - } - } - aNumPlane++; - if ( ( isCorrectTop || aSum == 0 ) && ( aMax == 0 || aSum > aMax ) ) { - aListBaseCorrect.sort(CompareDistForCorrectPlane); - aVectorBaseOfPoint.clear(); - std::list::iterator anIter = aListBaseCorrect.begin(); - for ( ; anIter != aListBaseCorrect.end(); anIter++) { - aVectorBaseOfPoint.push_back((*anIter).first); - } - GetCorrectSequenceOfId( aVectorBaseOfPoint ); - aMax = aSum; - theResultListId.clear(); - for (int i = 0; i < aVectorBaseOfPoint.size(); i++) { - theResultListId.push_back( aVectorBaseOfPoint[i]._node->GetID() ); - } - theResultListId.push_back( aTopNode._node->GetID() ); - if ( aSum == 0 ) - break; - } - } - } bool ComputeBounds( std::list theActorList, - double theBounds[6]) + double theBounds[6]) { bool anIsOk = false; theBounds[0] = theBounds[2] = theBounds[4] = VTK_DOUBLE_MAX; @@ -2155,12 +1515,13 @@ namespace SMESH //================================================================================ /*! * \brief Find all SMESH_Actor's in the View Window. - * If actor constains Plot2d_Histogram object remove it from each Plot2d Viewer. + * If actor contains Plot2d_Histogram object remove it from each Plot2d Viewer. */ //================================================================================ - void ClearPlot2Viewers( SUIT_ViewWindow* theWindow ) { - if(SVTK_ViewWindow* aViewWindow = GetVtkViewWindow(theWindow)){ + void ClearPlot2Viewers( SUIT_ViewWindow* theWindow ) + { + if ( SVTK_ViewWindow* aViewWindow = GetVtkViewWindow(theWindow) ) { vtkRenderer *aRenderer = aViewWindow->getRenderer(); VTK::ActorCollectionCopy aCopy(aRenderer->GetActors()); vtkActorCollection *aCollection = aCopy.GetActors(); @@ -2174,7 +1535,7 @@ namespace SMESH } } } - + #endif } // end of namespace SMESH