Salome HOME
untabify
[modules/smesh.git] / src / SMESHGUI / SMESHGUI.cxx
index 062b376c0fd1102be17839c9a019ef603feb38da..4226a8a3f10cf2a12a6d905a6a24451332dbdc80 100644 (file)
 #include <SALOMEDSClient_SComponent.hxx>
 #include <SALOMEDSClient_StudyBuilder.hxx>
 #include <SALOMEDS_Study.hxx>
+#include <SALOMEDS_SObject.hxx>
 
 // OCCT includes
 #include <Standard_ErrorHandler.hxx>
     }
   }
 
+  void sortChildren(){
+    LightApp_SelectionMgr *aSel = SMESHGUI::selectionMgr();
+    SALOME_ListIO selected;
+    if( aSel ) {
+      aSel->selectedObjects( selected );
+      
+      if(selected.Extent()){
+        Handle(SALOME_InteractiveObject) anIObject = selected.First();
+        _PTR(Study) aStudy = SMESH::GetActiveStudyDocument();
+        _PTR(SObject) aSObj = aStudy->FindObjectID(anIObject->getEntry());
+        if (aSObj) {
+          if ( aStudy->GetUseCaseBuilder()->SortChildren( aSObj, true/*AscendingOrder*/ ) ) {
+            SMESHGUI::GetSMESHGUI()->updateObjBrowser();
+          }
+        }
+      }
+    }
+  }
+
   void SetDisplayMode(int theCommandID, SMESHGUI_StudyId2MarkerMap& theMarkerMap)
   {
     SALOME_ListIO selected;
@@ -1976,6 +1996,82 @@ bool SMESHGUI::automaticUpdate(unsigned int requestedSize, bool* limitExceeded)
   return autoUpdate && !exceeded;
 }
 
+//=============================================================================
+/*!
+ *
+ */
+//=============================================================================
+bool SMESHGUI::automaticUpdate( SMESH::SMESH_Mesh_ptr theMesh,
+                                int* entities, bool* limitExceeded )
+{
+  SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr();
+  if ( !resMgr )
+    return false;
+
+  bool autoUpdate  = resMgr->booleanValue( "SMESH", "auto_update", false );
+  long updateLimit = resMgr->integerValue( "SMESH", "update_limit", 500000 );
+  bool incrementalLimit = resMgr->booleanValue( "SMESH", "incremental_limit", false );
+
+  long requestedSize = theMesh->NbElements();
+
+  *entities = SMESH_Actor::eAllEntity;
+
+  bool exceeded = updateLimit > 0 && requestedSize > updateLimit;
+
+  if ( limitExceeded ) *limitExceeded = autoUpdate && exceeded;
+
+  if ( incrementalLimit ) {
+    long nbOdElems = theMesh->Nb0DElements();
+    long nbEdges   = theMesh->NbEdges();
+    long nbFaces   = theMesh->NbFaces();
+    long nbVolumes = theMesh->NbVolumes();
+    long nbBalls   = theMesh->NbBalls();
+    long total     = 0;
+
+    if ( nbOdElems > 0 ) {
+      if ( total + nbOdElems > updateLimit )
+        *entities = *entities & ~SMESH_Actor::e0DElements;
+      else
+        exceeded = false;
+    }
+    total += nbOdElems;
+
+    if ( nbEdges > 0 ) {
+      if ( total + nbEdges > updateLimit )
+        *entities = *entities & ~SMESH_Actor::eEdges;
+      else
+        exceeded = false;
+    }
+    total += nbEdges;
+
+    if ( nbFaces > 0 ) {
+      if ( total + nbFaces > updateLimit )
+        *entities = *entities & ~SMESH_Actor::eFaces;
+      else
+        exceeded = false;
+    }
+    total += nbFaces;
+
+    if ( nbVolumes > 0 ) {
+      if ( total + nbVolumes > updateLimit )
+        *entities = *entities & ~SMESH_Actor::eVolumes;
+      else
+        exceeded = false;
+    }
+    total += nbVolumes;
+
+    if ( nbBalls > 0 ) {
+      if ( total + nbBalls > updateLimit )
+        *entities = *entities & ~SMESH_Actor::eBallElem;
+      else
+        exceeded = false;
+    }
+    total += nbBalls;
+  }
+  
+  return autoUpdate && !exceeded;
+}
+
 //=============================================================================
 /*!
  *
@@ -3457,6 +3553,10 @@ bool SMESHGUI::OnGUIEvent( int theCommandID )
       dlg->show();
       break;
     }
+  case 41:
+    ::sortChildren();
+    break;
+
   }
 
   anApp->updateActions(); //SRN: To update a Save button in the toolbar
@@ -3754,6 +3854,8 @@ void SMESHGUI::initialize( CAM_Application* app )
   createSMESHAction( 301, "SHOW" );
   createSMESHAction( 302, "DISPLAY_ONLY" );
 
+  createSMESHAction( 41, "SORT_CHILD_ITEMS" );
+
   // ----- create menu --------------
   int fileId    = createMenu( tr( "MEN_FILE" ),    -1,  1 ),
       editId    = createMenu( tr( "MEN_EDIT" ),    -1,  3 ),
@@ -4144,6 +4246,7 @@ void SMESHGUI::initialize( CAM_Application* app )
   popupMgr()->insert( separator(), -1, 0 );
   createPopupItem( 214, View, mesh_part );  // UPDATE
   createPopupItem( 900, View, mesh_part );  // ADV_INFO
+  createPopupItem( 6032,View, mesh_part );  // CTRL_INFO
   createPopupItem( 904, View, mesh );       // FIND_ELEM
   popupMgr()->insert( separator(), -1, 0 );
 
@@ -4388,7 +4491,7 @@ void SMESHGUI::initialize( CAM_Application* app )
   popupMgr()->insert ( action( 6031 ), aSubId, -1 ); // EQUAL_VOLUME
   popupMgr()->setRule( action( 6031 ), aMeshInVtkHasVolumes, QtxPopupMgr::VisibleRule );
   popupMgr()->setRule( action( 6031 ), "controlMode = 'eCoincidentElems3D'", QtxPopupMgr::ToggleRule );
-
   popupMgr()->insert( separator(), anId, -1 );
 
   popupMgr()->insert( action( 201 ), anId, -1 ); // SCALAR_BAR_PROP
@@ -4435,6 +4538,10 @@ void SMESHGUI::initialize( CAM_Application* app )
 
   popupMgr()->insert( separator(), -1, -1 );
 
+  popupMgr()->insert( action( 41 ), -1, -1 );
+  popupMgr()->setRule( action( 41 ), "$component={'SMESH'} and client='ObjectBrowser' and isContainer and nbChildren>1", QtxPopupMgr::VisibleRule );
+  popupMgr()->insert( separator(), -1, -1 );
+
   connect( application(), SIGNAL( viewManagerActivated( SUIT_ViewManager* ) ),
            this, SLOT( onViewManagerActivated( SUIT_ViewManager* ) ) );
 
@@ -4675,11 +4782,13 @@ void SMESHGUI::createPreferences()
   int genTab = addPreference( tr( "PREF_TAB_GENERAL" ) );
 
   int autoUpdate = addPreference( tr( "PREF_AUTO_UPDATE" ), genTab, LightApp_Preferences::Auto, "SMESH", "auto_update" );
+  setPreferenceProperty( autoUpdate, "columns", 2 );
   int lim = addPreference( tr( "PREF_UPDATE_LIMIT" ), autoUpdate, LightApp_Preferences::IntSpin, "SMESH", "update_limit" );
   setPreferenceProperty( lim, "min",  0 );
   setPreferenceProperty( lim, "max",  100000000 );
   setPreferenceProperty( lim, "step", 1000 );
   setPreferenceProperty( lim, "special", tr( "PREF_UPDATE_LIMIT_NOLIMIT" ) );
+  addPreference( tr( "PREF_INCREMENTAL_LIMIT" ), autoUpdate, LightApp_Preferences::Bool, "SMESH", "incremental_limit" );
 
   int qaGroup = addPreference( tr( "PREF_GROUP_QUALITY" ), genTab );
   setPreferenceProperty( qaGroup, "columns", 2 );
@@ -4765,6 +4874,7 @@ void SMESHGUI::createPreferences()
   setPreferenceProperty( nodesLim, "step", 10000 );
   setPreferenceProperty( nodesLim, "special", tr( "PREF_UPDATE_LIMIT_NOLIMIT" ) );
   int ctrlLim = addPreference( tr( "PREF_CTRL_LIMIT" ), infoGroup, LightApp_Preferences::IntSpin, "SMESH", "info_controls_limit" );
+  setPreferenceProperty( ctrlLim, "special", tr( "PREF_UPDATE_LIMIT_NOLIMIT" ) );
   setPreferenceProperty( ctrlLim, "min", 0 );
   setPreferenceProperty( ctrlLim, "max", 10000000 );
   setPreferenceProperty( ctrlLim, "step", 1000 );