Salome HOME
Exlude the user input during process events by application (Bug #325).
[modules/hydro.git] / src / HYDROGUI / HYDROGUI_OCCDisplayer.cxx
index 39810702fbeaccabbfdbc72d8898469c6b6a041b..3dbe862ccf5f9ab5d9b88fc8a76b5a526482f7dc 100644 (file)
@@ -31,6 +31,8 @@
 #include <AIS_ListIteratorOfListOfInteractive.hxx>
 #include <AIS_ListOfInteractive.hxx>
 
+#include <TColStd_SequenceOfInteger.hxx>
+
 #include <OCCViewer_ViewManager.h>
 #include <OCCViewer_ViewModel.h>
 #include <OCCViewer_ViewWindow.h>
@@ -122,9 +124,33 @@ void HYDROGUI_OCCDisplayer::Display( const HYDROData_SequenceOfObjects& theObjs,
   if( aCtx.IsNull() )
     return;
 
-  for ( int i = 1, n = theObjs.Length(); i <= n; i++ )
-  {
+  // Sort objects by display order ( needed for Z layers assignment only )
+  HYDROData_SequenceOfObjects anObjects;
+  int aMaxIndex = -1;
+  for ( int i = 1, n = theObjs.Length(); i <= n; i++ ) {
     Handle(HYDROData_Entity) anObj = theObjs.Value( i );
+    if ( anObj.IsNull() || anObj->IsRemoved() ) {
+      continue;
+    }
+
+    int aDisplayOrderIndex = module()->getObjectDisplayOrder( (size_t)aViewer, anObj );
+    if ( aDisplayOrderIndex > aMaxIndex ) {
+      anObjects.Append( anObj );
+      aMaxIndex = aDisplayOrderIndex;
+    } else {
+      anObjects.Prepend( anObj );
+    }
+  }
+
+  // Get existing Z layers
+  TColStd_SequenceOfInteger anExistingZLayers;
+  aViewer->getViewer3d()->GetAllZLayers( anExistingZLayers );
+  int aNbLayers = anExistingZLayers.Length();
+
+  // Display
+  for ( int i = 1, n = anObjects.Length(); i <= n; i++ )
+  {
+    Handle(HYDROData_Entity) anObj = anObjects.Value( i );
     if ( anObj.IsNull() || anObj->IsRemoved() )
       continue;
 
@@ -143,6 +169,20 @@ void HYDROGUI_OCCDisplayer::Display( const HYDROData_SequenceOfObjects& theObjs,
     {
       bool anIsVisible = module()->isObjectVisible( (size_t)aViewer, anObj );
       anObjShape->setVisible( anIsVisible, false );
+
+      // Set Z layer
+      Standard_Integer aLayerId = -1;
+      if ( i <= aNbLayers ) {
+        aLayerId = anExistingZLayers.Value( i );
+      } else {
+        Standard_Integer aNewId = -1;
+        if ( aViewer->getViewer3d()->AddZLayer( aNewId ) ) {
+          aLayerId = aNewId;
+        }
+      }
+      if ( aLayerId >= 0 ) {
+        aCtx->SetZLayer( anObjShape->getAISShape(), aLayerId );
+      }
     }
   }