Salome HOME
Imp: show element position in a mesh information dialog box
authorvsr <vsr@opencascade.com>
Thu, 20 Dec 2012 05:59:39 +0000 (05:59 +0000)
committervsr <vsr@opencascade.com>
Thu, 20 Dec 2012 05:59:39 +0000 (05:59 +0000)
idl/SMESH_Mesh.idl
src/SMESHGUI/SMESHGUI_MeshInfo.cxx
src/SMESHGUI/SMESH_msg_en.ts
src/SMESHGUI/SMESH_msg_fr.ts
src/SMESH_I/SMESH_Mesh_i.cxx
src/SMESH_I/SMESH_Mesh_i.hxx
src/SMESH_SWIG/smeshDC.py

index 56f465e45ecc838e7b9eddb4675c9432ac55170f..cf14ece26ce1ef218ff13989e0508d9293f8cbf1 100644 (file)
@@ -110,6 +110,14 @@ module SMESH
     double_array     params; // [U] on EDGE, [U,V] on FACE, [] on the rest shapes
   };
 
+  /*!
+   * Element location on a shape
+   */
+  struct ElementPosition {
+    long             shapeID;
+    GEOM::shape_type shapeType;
+  };
+
   /*!
    * Enumeration for element type, like in SMDS
    */
@@ -836,6 +844,11 @@ module SMESH
      */
     NodePosition GetNodePosition(in long NodeID);
 
+    /*!
+     * \brief Return position of an element on shape
+     */
+    ElementPosition GetElementPosition(in long ElemID);
+
     /*!
      * If given element is node returns IDs of shape from position
      * If there is not node for given ID - returns -1
index 0e5fb950be7362f34668350e71441346d1525fd9..c3c87893dea15bd11ab3ce803517e603b94f5227 100644 (file)
@@ -34,6 +34,7 @@
 #include "SMDS_BallElement.hxx"
 #include "SMDS_EdgePosition.hxx"
 #include "SMDS_FacePosition.hxx"
+#include "SMESHDS_Mesh.hxx"
 #include "SMESH_ControlsDef.hxx"
 
 #include <LightApp_SelectionMgr.h>
@@ -1102,6 +1103,39 @@ void SMESHGUI_SimpleElemInfo::information( const QList<long>& ids )
         else {
           myInfo->append( QString( "<b>%1</b>" ).arg( SMESHGUI_ElemInfo::tr( "FREE_NODE" ) ).arg( id ) );
         }
+        // node position
+        int shapeID = node->getshapeId();
+        if ( shapeID > 0 )
+        {
+          SMDS_PositionPtr        pos = node->GetPosition();
+          SMDS_TypeOfPosition posType = pos->GetTypeOfPosition();
+          QString shapeType;
+          double u,v;
+          switch ( posType ) {
+          case SMDS_TOP_EDGE:   shapeType = SMESHGUI_ElemInfo::tr( "GEOM_EDGE" );
+            u = static_cast<SMDS_EdgePosition*>( pos )->GetUParameter();
+            break;
+          case SMDS_TOP_FACE:   shapeType = SMESHGUI_ElemInfo::tr( "GEOM_FACE" );
+            u = static_cast<SMDS_FacePosition*>( pos )->GetUParameter();
+            v = static_cast<SMDS_FacePosition*>( pos )->GetVParameter();
+            break;
+          case SMDS_TOP_VERTEX: shapeType = SMESHGUI_ElemInfo::tr( "GEOM_VERTEX" );
+           break;
+          default:              shapeType = SMESHGUI_ElemInfo::tr( "GEOM_SOLID" );
+           break;
+          }
+         // separator
+         myInfo->append( "" );
+          myInfo->append( QString( "<b>%1: #%2</b>" ).arg( SMESHGUI_ElemInfo::tr( "POSITION" ) ).arg( shapeID ) );
+          if ( posType == SMDS_TOP_EDGE || posType == SMDS_TOP_FACE ) {
+           myInfo->append( QString( "- <b>%1: #%2</b>" ).arg( SMESHGUI_ElemInfo::tr( "U_POSITION" ) ).
+                           arg( QString::number( u, precision > 0 ? 'f' : 'g', qAbs( precision )) ) );
+            if ( posType == SMDS_TOP_FACE ) {
+             myInfo->append( QString( "- <b>%1: #%2</b>" ).arg( SMESHGUI_ElemInfo::tr( "V_POSITION" ) ).
+                             arg( QString::number( v, precision > 0 ? 'f' : 'g', qAbs( precision )) ) );
+            }
+          }
+        }
       }
       else {
         //
@@ -1275,24 +1309,27 @@ void SMESHGUI_SimpleElemInfo::information( const QList<long>& ids )
           afunctor->SetMesh( actor()->GetObject()->GetMesh() );
           myInfo->append( QString( "- <b>%1:</b> %2" ).arg( tr( "MAX_ELEMENT_LENGTH_3D" ) ).arg( afunctor->GetValue( id ) ) );
         }
-       /*
-        if( e->GetType() >= SMDSAbs_Edge && e->GetType() <= SMDSAbs_Volume ) {
-          // separator
-          myInfo->append( "" );
-          //shapeID
-          int shapeID = e->getshapeId();
-          if ( shapeID > 0 ) {     
-            QString shapeType;
-            switch ( actor()->GetObject()->GetMesh()->FindElement( shapeID )->GetType() ) {
-            case SMDS_TOP_EDGE:   shapeType = SMESHGUI_ElemInfo::tr( "GEOM_EDGE" ); break;
-            case SMDS_TOP_FACE:   shapeType = SMESHGUI_ElemInfo::tr( "GEOM_FACE" ); break;
-            case SMDS_TOP_VERTEX: shapeType = SMESHGUI_ElemInfo::tr( "GEOM_VERTEX" ); break;
-            default:              shapeType = SMESHGUI_ElemInfo::tr( "GEOM_SOLID" );
-            }     
-            myInfo->append( QString( "<b>%1:</b> %2 #%3" ).arg( SMESHGUI_ElemInfo::tr( "POSITION" ) ).arg( shapeType ).arg( shapeID ) );
-          }
-        }
-       */
+       // position (only in collocate mode)
+       if ( e->GetType() >= SMDSAbs_Edge && e->GetType() <= SMDSAbs_Volume ) {
+         SMESHDS_Mesh* aMesh = dynamic_cast<SMESHDS_Mesh*>( actor()->GetObject()->GetMesh() );
+         int shapeID = e->getshapeId();
+         if ( aMesh && shapeID > 0 ) {
+           const TopoDS_Shape& aShape = aMesh->IndexToShape( shapeID );
+           if ( !aShape.IsNull() ) {
+             myInfo->append( "" ); // separator
+             QString shapeType;
+             switch ( aShape.ShapeType() ) {
+             case TopAbs_EDGE:   shapeType = SMESHGUI_ElemInfo::tr( "GEOM_EDGE" );   break;
+             case TopAbs_FACE:   shapeType = SMESHGUI_ElemInfo::tr( "GEOM_FACE" );   break;
+             case TopAbs_VERTEX: shapeType = SMESHGUI_ElemInfo::tr( "GEOM_VERTEX" ); break;
+             case TopAbs_SOLID:  shapeType = SMESHGUI_ElemInfo::tr( "GEOM_SOLID" );  break;
+             case TopAbs_SHELL:  shapeType = SMESHGUI_ElemInfo::tr( "GEOM_SHELL" );  break;
+             default:            shapeType = SMESHGUI_ElemInfo::tr( "GEOM_SHAPE" );  break;
+             }
+             myInfo->append( QString( "<b>%1:</b> %2 #%3" ).arg( SMESHGUI_ElemInfo::tr( "POSITION" ) ).arg( shapeType ).arg( shapeID ) );
+           }
+         }
+       }
       }
       // separator
       if ( ids.count() > 1 ) {
@@ -1480,7 +1517,7 @@ void SMESHGUI_TreeElemInfo::information( const QList<long>& ids )
            break;
           }
           QTreeWidgetItem* posItem = createItem( nodeItem, Bold );
-          posItem->setText( 0, SMESHGUI_ElemInfo::tr("NODE_POSITION") );
+          posItem->setText( 0, SMESHGUI_ElemInfo::tr("POSITION") );
           posItem->setText( 1, (shapeType + " #%1").arg( shapeID ));
           if ( posType == SMDS_TOP_EDGE || posType == SMDS_TOP_FACE ) {
             QTreeWidgetItem* uItem = createItem( posItem );
@@ -1734,24 +1771,28 @@ void SMESHGUI_TreeElemInfo::information( const QList<long>& ids )
           diam3Item->setText( 0, tr( "MAX_ELEMENT_LENGTH_3D" ) );
           diam3Item->setText( 1, QString( "%1" ).arg( afunctor->GetValue( id ) ) );     
         }
-       /*
-        if( e->GetType() >= SMDSAbs_Edge && e->GetType() <= SMDSAbs_Volume ) {
-          //shapeID
-          int shapeID = e->getshapeId();
-          if ( shapeID > 0 ) {
-            QTreeWidgetItem* shItem = createItem( elemItem, Bold );
-            QString shapeType;
-            switch ( actor()->GetObject()->GetMesh()->FindElement( shapeID )->GetType() ) {
-            case SMDS_TOP_EDGE:   shapeType = SMESHGUI_ElemInfo::tr( "GEOM_EDGE" ); break;
-            case SMDS_TOP_FACE:   shapeType = SMESHGUI_ElemInfo::tr( "GEOM_FACE" ); break;
-            case SMDS_TOP_VERTEX: shapeType = SMESHGUI_ElemInfo::tr( "GEOM_VERTEX" ); break;
-            default:              shapeType = SMESHGUI_ElemInfo::tr( "GEOM_SOLID" );
-            }
-            shItem->setText( 0, SMESHGUI_ElemInfo::tr( "POSITION" ) );
-            shItem->setText( 1, QString( "%1 #%2" ).arg(shapeType).arg( shapeID ) );
-          }
-        }
-       */
+       // position (only in collocate mode)
+       if ( e->GetType() >= SMDSAbs_Edge && e->GetType() <= SMDSAbs_Volume ) {
+         SMESHDS_Mesh* aMesh = dynamic_cast<SMESHDS_Mesh*>( actor()->GetObject()->GetMesh() );
+         int shapeID = e->getshapeId();
+         if ( aMesh && shapeID > 0 ) {
+           const TopoDS_Shape& aShape = aMesh->IndexToShape( shapeID );
+           if ( !aShape.IsNull() ) {
+             QTreeWidgetItem* shItem = createItem( elemItem, Bold );
+             QString shapeType;
+             switch ( aShape.ShapeType() ) {
+             case TopAbs_EDGE:   shapeType = SMESHGUI_ElemInfo::tr( "GEOM_EDGE" );   break;
+             case TopAbs_FACE:   shapeType = SMESHGUI_ElemInfo::tr( "GEOM_FACE" );   break;
+             case TopAbs_VERTEX: shapeType = SMESHGUI_ElemInfo::tr( "GEOM_VERTEX" ); break;
+             case TopAbs_SOLID:  shapeType = SMESHGUI_ElemInfo::tr( "GEOM_SOLID" );  break;
+             case TopAbs_SHELL:  shapeType = SMESHGUI_ElemInfo::tr( "GEOM_SHELL" );  break;
+             default:            shapeType = SMESHGUI_ElemInfo::tr( "GEOM_SHAPE" );  break;
+             }
+             shItem->setText( 0, SMESHGUI_ElemInfo::tr( "POSITION" ) );
+             shItem->setText( 1, QString( "%1 #%2" ).arg( shapeType ).arg( shapeID ) );
+           }
+         }
+       }
       }
     }
   }
index 068c9de263c4400e21a4be6825f9a42a8cd78f43..3395865f7f82057830369dde8852c9c591bf12c4 100644 (file)
@@ -6755,7 +6755,15 @@ as they are of improper type:
         <translation>Solid</translation>
     </message>
     <message>
-        <source>NODE_POSITION</source>
+        <source>GEOM_SHELL</source>
+        <translation>Shell</translation>
+    </message>
+    <message>
+        <source>GEOM_SHAPE</source>
+        <translation>Shape</translation>
+    </message>
+    <message>
+        <source>POSITION</source>
         <translation>Position</translation>
     </message>
     <message>
index 7e238acb120b828a0247d27ed9e005be5d86542f..6cfae09fb6b44dbff1a13d1c823d6a7332cf95f0 100755 (executable)
@@ -6626,7 +6626,15 @@ en raison de leurs types incompatibles:
         <translation>Solide</translation>
     </message>
     <message>
-        <source>NODE_POSITION</source>
+        <source>GEOM_SHELL</source>
+        <translation>Coque</translation>
+    </message>
+    <message>
+        <source>GEOM_SHAPE</source>
+        <translation>Forme</translation>
+    </message>
+    <message>
+        <source>POSITION</source>
         <translation>Position</translation>
     </message>
     <message>
index e81c3a7e76592f6c572d4aae665ebaa2cc94656b..969109eca3222b0110db9654644963551c866359 100644 (file)
@@ -3709,6 +3709,46 @@ SMESH::NodePosition* SMESH_Mesh_i::GetNodePosition(CORBA::Long NodeID)
   return aNodePosition;
 }
 
+SMESH::ElementPosition SMESH_Mesh_i::GetElementPosition(CORBA::Long ElemID)
+{
+  if ( _preMeshInfo )
+    _preMeshInfo->FullLoadFromFile();
+
+  SMESH::ElementPosition anElementPosition;
+  anElementPosition.shapeID = 0;
+  anElementPosition.shapeType = GEOM::SHAPE;
+
+  SMESHDS_Mesh* mesh = _impl->GetMeshDS();
+  if ( !mesh ) return anElementPosition;
+
+  if ( const SMDS_MeshElement* anElem = mesh->FindElement( ElemID ) )
+  {
+    anElementPosition.shapeID = anElem->getshapeId();
+    const TopoDS_Shape& aSp = mesh->IndexToShape( anElem->getshapeId() );
+    if ( !aSp.IsNull() ) {
+      switch ( aSp.ShapeType() ) {
+      case TopAbs_EDGE:
+       anElementPosition.shapeType = GEOM::EDGE;
+       break;
+      case TopAbs_FACE:
+       anElementPosition.shapeType = GEOM::FACE;
+       break;
+      case TopAbs_VERTEX:
+       anElementPosition.shapeType = GEOM::VERTEX;
+       break;
+      case TopAbs_SOLID:
+       anElementPosition.shapeType = GEOM::SOLID;
+       break;
+      case TopAbs_SHELL:
+       anElementPosition.shapeType = GEOM::SHELL;
+       break;
+      default:;
+      }
+    }
+  }
+  return anElementPosition;
+}
+
 //=============================================================================
 /*!
  * If given element is node returns IDs of shape from position
index a1c27e00a858897ebe3e1497aa58cd9760464ef2..a98be336eeebaddacaf0d112eab0be9821d6a348 100644 (file)
@@ -459,6 +459,11 @@ public:
    */
   SMESH::NodePosition* GetNodePosition(CORBA::Long NodeID);
 
+  /*!
+   * \brief Return position of an element on shape
+   */
+  SMESH::ElementPosition GetElementPosition(CORBA::Long ElemID);
+
   /*!
    * If given element is node returns IDs of shape from position
    * If there is not node for given ID - returns -1
index 04b801399880689f1980dd7610bb2977f94d2651..24095c5b08d8d7312c6093c739174117397fde7c 100644 (file)
@@ -2118,6 +2118,12 @@ class Mesh:
     def GetNodePosition(self,NodeID):
         return self.mesh.GetNodePosition(NodeID)
 
+    ## @brief Returns the position of an element on the shape
+    #  @return SMESH::ElementPosition
+    #  @ingroup l1_meshinfo
+    def GetElementPosition(self,ElemID):
+        return self.mesh.GetElementPosition(ElemID)
+
     ## If the given element is a node, returns the ID of shape
     #  \n If there is no node for the given ID - returns -1
     #  @return an integer value