Salome HOME
Fix for the bug IPAL22828 TC6.4.0: Displayed entities are wrong
authorana <ana@opencascade.com>
Thu, 15 Dec 2011 13:32:32 +0000 (13:32 +0000)
committerana <ana@opencascade.com>
Thu, 15 Dec 2011 13:32:32 +0000 (13:32 +0000)
src/OBJECT/SMESH_ActorUtils.cxx
src/OBJECT/SMESH_ActorUtils.h
src/OBJECT/SMESH_Object.cxx
src/OBJECT/SMESH_Object.h
src/OBJECT/SMESH_ObjectDef.h

index ee0a31efddfba1066958a292e2c63f91e5214bc3..3e2225b07c62511967f386e1e14c7d6ed1323f7c 100644 (file)
 #include "utilities.h"
 
 #include <vtkUnstructuredGrid.h>
+#include <vtkCellType.h>
 #include <vtkXMLUnstructuredGridWriter.h>
 #include <vtkUnstructuredGridWriter.h>
+#include <vtkUnsignedCharArray.h>
 
 //#ifdef _DEBUG_
 //static int MYDEBUG = 1;
@@ -155,6 +157,20 @@ namespace SMESH
     }
   }
 
+  std::map<SMDSAbs_ElementType,int> GetEntitiesFromObject(SMESH_VisualObj *theObject) {
+    std::map<SMDSAbs_ElementType,int> entities;
+       entities.insert(std::pair<SMDSAbs_ElementType,int>(SMDSAbs_0DElement,
+               theObject ? theObject->GetNbEntities(SMDSAbs_0DElement) : 0));
+    entities.insert(std::pair<SMDSAbs_ElementType,int>(SMDSAbs_Edge,
+               theObject ? theObject->GetNbEntities(SMDSAbs_Edge) : 0));
+    entities.insert(std::pair<SMDSAbs_ElementType,int>(SMDSAbs_Face,
+               theObject ? theObject->GetNbEntities(SMDSAbs_Face) : 0));
+    entities.insert(std::pair<SMDSAbs_ElementType,int>(SMDSAbs_Volume,
+               theObject ? theObject->GetNbEntities(SMDSAbs_Volume) : 0));
+    return entities;
+  }
+  
+
 
 #ifndef DISABLE_PLOT2DVIEWER
   //=======================================================================
index e98d0f5deeb3bc1eebe6a82a5107705813c1c768..5d02aaa88e832f164844cac0bfd9f9bf6c906069 100644 (file)
@@ -24,6 +24,7 @@
 #define SMESH_ACTORUTILS_H
 
 #include "SMESH_Object.h"
+#include <map>
 
 #include <QColor>
 
@@ -75,6 +76,10 @@ SMESHOBJECT_EXPORT
              int& delta,
              QString def);
    
+ SMESHOBJECT_EXPORT
+   std::map<SMDSAbs_ElementType,int>
+   GetEntitiesFromObject(SMESH_VisualObj *theObject);
+   
 SMESHOBJECT_EXPORT
   void 
   WriteUnstructuredGrid(vtkUnstructuredGrid* theGrid, 
index cfaa700cbaf98718cde07ae36f05dce4cc4fdad2..c12d63bfa68c6d733b7632f80495b6a7da527ed3 100644 (file)
@@ -136,6 +136,8 @@ SMESH_VisualObjDef::SMESH_VisualObjDef()
   MESSAGE("---------------------------------------------SMESH_VisualObjDef::SMESH_VisualObjDef");
   myGrid = vtkUnstructuredGrid::New();
   myLocalGrid = false;
+  ClearEntitiesFlags();
+  SMESH::GetEntitiesFromObject(NULL);
 }
 SMESH_VisualObjDef::~SMESH_VisualObjDef()
 {
@@ -275,6 +277,7 @@ void SMESH_VisualObjDef::buildPrs(bool buildGrid)
             GetMesh()->compactMesh();
           }
         vtkUnstructuredGrid *theGrid = GetMesh()->getGrid();
+       updateEntitiesFlags();
         myGrid->ShallowCopy(theGrid);
         //MESSAGE(myGrid->GetReferenceCount());
         //MESSAGE( "Update - myGrid->GetNumberOfCells() = "<<myGrid->GetNumberOfCells() );
@@ -598,6 +601,7 @@ vtkUnstructuredGrid* SMESH_VisualObjDef::GetUnstructuredGrid()
   if ( !myLocalGrid && !GetMesh()->isCompacted() )
   {
     GetMesh()->compactMesh();
+       updateEntitiesFlags();
     vtkUnstructuredGrid *theGrid = GetMesh()->getGrid();
     myGrid->ShallowCopy(theGrid);
   }
@@ -619,6 +623,62 @@ bool SMESH_VisualObjDef::IsValid() const
          GetNbEntities(SMDSAbs_Volume) > 0 ;
 }
 
+//=================================================================================
+// function : updateEntitiesFlags
+// purpose  : Update entities flags
+//=================================================================================
+void SMESH_VisualObjDef::updateEntitiesFlags() {
+
+       unsigned int tmp = myEntitiesState;
+       ClearEntitiesFlags();
+
+       map<SMDSAbs_ElementType,int> entities = SMESH::GetEntitiesFromObject(this);
+       
+
+       if( myEntitiesCache[SMDSAbs_0DElement] != 0 ||  myEntitiesCache[SMDSAbs_0DElement] >= entities[SMDSAbs_0DElement] )
+               myEntitiesState &= ~SMESH_Actor::e0DElements;
+
+       if( myEntitiesCache[SMDSAbs_Edge] != 0 || myEntitiesCache[SMDSAbs_Edge] >= entities[SMDSAbs_Edge] )
+               myEntitiesState &= ~SMESH_Actor::eEdges; 
+
+       if( myEntitiesCache[SMDSAbs_Face] != 0 || myEntitiesCache[SMDSAbs_Face] >= entities[SMDSAbs_Face] )
+               myEntitiesState &= ~SMESH_Actor::eFaces; 
+
+       if( myEntitiesCache[SMDSAbs_Volume] != 0 || myEntitiesCache[SMDSAbs_Volume] >= entities[SMDSAbs_Volume] )
+               myEntitiesState &= ~SMESH_Actor::eVolumes;
+
+       if( tmp != myEntitiesState ) {
+               myEntitiesFlag = true;
+       }
+       
+       myEntitiesCache = entities;
+}
+
+//=================================================================================
+// function : ClearEntitiesFlags
+// purpose  : Clear the entities flags
+//=================================================================================
+void SMESH_VisualObjDef::ClearEntitiesFlags() {
+       myEntitiesState = SMESH_Actor::eAllEntity;
+       myEntitiesFlag = false;
+}
+
+//=================================================================================
+// function : GetEntitiesFlag
+// purpose  : Return the entities flag
+//=================================================================================
+bool SMESH_VisualObjDef::GetEntitiesFlag() {
+       return myEntitiesFlag;
+}
+
+//=================================================================================
+// function : GetEntitiesState
+// purpose  : Return the entities state
+//=================================================================================
+unsigned int SMESH_VisualObjDef::GetEntitiesState() {
+       return myEntitiesState;
+}
+
 /*
   Class       : SMESH_MeshObj
   Description : Class for visualisation of mesh
index b96a26cdc1c2a134257756b72e841899862dfa8b..415b250cdb67966eedd87709b37ba1ca241b32ea 100644 (file)
@@ -75,6 +75,9 @@ public:
   virtual vtkIdType GetNodeVTKId( int theObjID ) = 0;
   virtual vtkIdType GetElemObjId( int theVTKID ) = 0;
   virtual vtkIdType GetElemVTKId( int theObjID ) = 0;
+  virtual void              ClearEntitiesFlags() = 0;
+  virtual bool              GetEntitiesFlag() = 0;
+  virtual unsigned int      GetEntitiesState() = 0;
 };
 
 typedef boost::shared_ptr<SMESH_VisualObj> TVisualObjPtr;
index 5bcbb3aedd3af700e3f8d6ee8776500fce56efde..edb905d54fd78482590f91a2d5915b66280e677b 100644 (file)
@@ -32,6 +32,7 @@
 #include "SMESH_Controls.hxx"
 #include "SMESH_Object.h"
 #include "SMESH_Client.hxx"
+#include "SMESH_Actor.h"
 
 // IDL Headers
 #include <SALOMEconfig.h>
@@ -44,7 +45,6 @@
 class vtkPoints;
 class SALOME_ExtractUnstructuredGrid;
 
-class SMESH_Actor;
 class SMDS_MeshNode;
 class SMDS_MeshElement;
 
@@ -85,13 +85,17 @@ public:
   virtual vtkIdType         GetElemObjId( int theVTKID );
   virtual vtkIdType         GetElemVTKId( int theObjID );
   
+  virtual void              ClearEntitiesFlags();
+  virtual bool              GetEntitiesFlag();
+  virtual unsigned int      GetEntitiesState();
+  
 protected:
 
   void                      createPoints( vtkPoints* );
   void                      buildPrs(bool buildGrid = false);
   void                      buildNodePrs();
   void                      buildElemPrs();
-  
+  void                      updateEntitiesFlags();
 //private:
 
   TMapOfIds                 mySMDS2VTKNodes;
@@ -100,7 +104,11 @@ protected:
   TMapOfIds                 myVTK2SMDSElems;
   bool                      myLocalGrid;
 
+  bool                      myEntitiesFlag;
+  unsigned int              myEntitiesState;
+
   vtkUnstructuredGrid*      myGrid;
+  std::map<SMDSAbs_ElementType,int> myEntitiesCache;
 };