]> SALOME platform Git repositories - modules/hydro.git/commitdiff
Salome HOME
Bug #224: Objects interpolate each other in OCC viewer.
authormzn <mzn@opencascade.com>
Wed, 25 Dec 2013 14:07:25 +0000 (14:07 +0000)
committermzn <mzn@opencascade.com>
Wed, 25 Dec 2013 14:07:25 +0000 (14:07 +0000)
src/HYDROGUI/HYDROGUI_ChannelOp.cxx
src/HYDROGUI/HYDROGUI_Module.cxx
src/HYDROGUI/HYDROGUI_Module.h
src/HYDROGUI/HYDROGUI_OCCDisplayer.cxx
src/HYDROGUI/HYDROGUI_Shape.cxx
src/HYDROGUI/HYDROGUI_Shape.h
src/HYDROGUI/HYDROGUI_StreamOp.cxx

index 2f7074aee2ba45c64ee628fa4ef485adf99c79b6..2ffdc5430d9462acec9f976708c2513cad10a1b4 100644 (file)
@@ -236,7 +236,7 @@ void HYDROGUI_ChannelOp::onCreatePreview( const bool theIsInit )
   if ( !myViewManager || !myPreviewPrs )
     return;
 
-  myPreviewPrs->update();
+  myPreviewPrs->update( true, true );
 }
 
 void HYDROGUI_ChannelOp::erasePreview()
index 4d6b818bdfcd83e947bf4485f356516691c24dbc..c8da5e4d08c7e7451192408b1e43091dee9d5b36 100644 (file)
@@ -190,6 +190,7 @@ bool HYDROGUI_Module::activateModule( SUIT_Study* theStudy )
   foreach ( const int anId, anObsoleteIds ) {
     myViewManagerMap.remove( anId );
     myObjectStateMap.remove( anId );
+    myObjectDisplayOrderMap.remove( anId );
     myShapesMap.remove( anId );
     myVTKPrsMap.remove( anId );
   }
@@ -867,6 +868,13 @@ void HYDROGUI_Module::setObjectVisible( const int theViewId,
 
     ObjectState& anObjectState = aEntry2ObjectStateMap[ anEntry ];
     anObjectState.Visibility = theState;
+
+    // Remember the display order ( needed for Z layers assignment only )
+    QStringList& anObjectEntries = myObjectDisplayOrderMap[ theViewId ];
+    anObjectEntries.removeAll( anEntry );
+    if ( theState ) {
+      anObjectEntries.append( anEntry );
+    }
   }
 }
 
@@ -1517,4 +1525,19 @@ void HYDROGUI_Module::onMouseMove( SUIT_ViewWindow* theViewWindow, QMouseEvent*
       aDesktop->statusBar()->showMessage( tr("COORDINATES_INFO").arg( aX ).arg( anY ) );
     }
   }
+}
+
+/**
+ * Get the object display order. Needed for Z layers assignment only.
+ */
+int HYDROGUI_Module::getObjectDisplayOrder( 
+  const int theViewId, const Handle(HYDROData_Entity)& theObject) const
+{
+  if( theObject.IsNull() )
+    return -1;
+
+  QString anEntry = HYDROGUI_DataObject::dataObjectEntry( theObject );
+  QStringList anObjectEntries = myObjectDisplayOrderMap.value( theViewId );
+
+  return anObjectEntries.indexOf( anEntry );
 }
\ No newline at end of file
index a51ef9d27558b318fffcac036f07e72445935e2c..58583ab50477a05e058e2d2e050d5c26040eeaf3 100644 (file)
@@ -171,6 +171,9 @@ public:
    */
   virtual bool                    renameObject( const QString& theEntry, const QString& theName );
 
+  int                             getObjectDisplayOrder( const int theViewId,
+                                                         const Handle(HYDROData_Entity)& theObject ) const;
+
 protected:
   CAM_DataModel*                  createDataModel();
 
@@ -236,7 +239,9 @@ private:
   HYDROGUI_VTKPrsDisplayer*       myVTKDisplayer;
 
   ViewManagerMap                  myViewManagerMap;
-  ViewId2Entry2ObjectStateMap      myObjectStateMap;
+  ViewId2Entry2ObjectStateMap     myObjectStateMap;
+
+  QMap<int, QStringList>          myObjectDisplayOrderMap;
 
   ViewId2ListOfShapes             myShapesMap;
   ViewId2ListOfVTKPrs             myVTKPrsMap;
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 );
+      }
     }
   }
 
index 37eaf35001c6050e1f74bab38968ac0aaa59cef9..ca88fc01f75ba050ebd222463b41c5630578fd48 100644 (file)
@@ -28,6 +28,8 @@
 #include <AIS_Drawer.hxx>
 #include <AIS_TexturedShape.hxx>
 
+#include <V3d_Viewer.hxx>
+
 #include <BRepBuilderAPI_MakeEdge.hxx>
 #include <BRepBuilderAPI_MakeWire.hxx>
 #include <BRepBuilderAPI_MakeFace.hxx>
@@ -110,7 +112,8 @@ void HYDROGUI_Shape::erase( const bool theIsUpdateViewer )
   myContext->Erase( myShape, theIsUpdateViewer );
 }
 
-void HYDROGUI_Shape::update( const bool theIsUpdateViewer )
+void HYDROGUI_Shape::update( const bool theIsUpdateViewer,
+                             const bool theIsDisplayOnTop )
 {
   setIsToUpdate( false );
 
@@ -379,6 +382,17 @@ void HYDROGUI_Shape::update( const bool theIsUpdateViewer )
     return;
 
   myContext->Display( myShape, theIsUpdateViewer );
+  
+  if ( theIsDisplayOnTop ) {
+    // Display the shape on the top Z layer
+    Standard_Integer aNewLayerId = -1;
+    if ( myContext->CurrentViewer() && 
+         myContext->CurrentViewer()->AddZLayer( aNewLayerId ) &&
+         aNewLayerId > 0 ) {
+      myContext->SetZLayer( myShape, aNewLayerId );
+    }
+  }
+
   if (isDeactivateSelection)
     myContext->Deactivate(myShape);
 }
index a1af4dbb7390e8041fe874daa7c01864d6f95ff4..b16161ce6cfa97cac37e304b9604ae897e92ccc1 100644 (file)
@@ -51,7 +51,8 @@ public:
 
   Handle(HYDROData_Entity)   getObject() const { return myObject; }
 
-  virtual void               update( const bool theIsUpdateViewer = true );
+  virtual void               update( const bool theIsUpdateViewer = true, 
+                                     const bool theIsDisplayOnTop = false );
 
   virtual bool               getIsToUpdate() const { return myIsToUpdate; }
   virtual void               setIsToUpdate( bool theState ) { myIsToUpdate = theState; }
@@ -98,6 +99,8 @@ public:
                                                  const bool     theIsUpdateViewer = true );
   virtual QString            getTextureFileName() const;
 
+  virtual Handle(AIS_Shape)  getAISShape() const { return myShape; }
+
 protected:
   virtual void               buildShape();
   virtual void               updateShape( const bool theToDisplay      = true,
index 06f07cfc0464c6608e4c9b701224fc79575bca79..66178e7d720e6db6e872be9e451027ad5d897537 100755 (executable)
@@ -221,7 +221,7 @@ void HYDROGUI_StreamOp::createPreview()
   }
 
   if ( myPreviewPrs ) {
-    myPreviewPrs->update();  
+    myPreviewPrs->update( true, true );  
   }
 }