From 1e288edaa13ed3cbbbc24bb3301a13d7f4dcbfd7 Mon Sep 17 00:00:00 2001 From: vsr Date: Thu, 20 Dec 2012 05:59:39 +0000 Subject: [PATCH] Imp: show element position in a mesh information dialog box --- idl/SMESH_Mesh.idl | 13 ++++ src/SMESHGUI/SMESHGUI_MeshInfo.cxx | 115 +++++++++++++++++++---------- src/SMESHGUI/SMESH_msg_en.ts | 10 ++- src/SMESHGUI/SMESH_msg_fr.ts | 10 ++- src/SMESH_I/SMESH_Mesh_i.cxx | 40 ++++++++++ src/SMESH_I/SMESH_Mesh_i.hxx | 5 ++ src/SMESH_SWIG/smeshDC.py | 6 ++ 7 files changed, 160 insertions(+), 39 deletions(-) diff --git a/idl/SMESH_Mesh.idl b/idl/SMESH_Mesh.idl index 56f465e45..cf14ece26 100644 --- a/idl/SMESH_Mesh.idl +++ b/idl/SMESH_Mesh.idl @@ -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 diff --git a/src/SMESHGUI/SMESHGUI_MeshInfo.cxx b/src/SMESHGUI/SMESHGUI_MeshInfo.cxx index 0e5fb950b..c3c87893d 100644 --- a/src/SMESHGUI/SMESHGUI_MeshInfo.cxx +++ b/src/SMESHGUI/SMESHGUI_MeshInfo.cxx @@ -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 @@ -1102,6 +1103,39 @@ void SMESHGUI_SimpleElemInfo::information( const QList& ids ) else { myInfo->append( QString( "%1" ).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( pos )->GetUParameter(); + break; + case SMDS_TOP_FACE: shapeType = SMESHGUI_ElemInfo::tr( "GEOM_FACE" ); + u = static_cast( pos )->GetUParameter(); + v = static_cast( 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( "%1: #%2" ).arg( SMESHGUI_ElemInfo::tr( "POSITION" ) ).arg( shapeID ) ); + if ( posType == SMDS_TOP_EDGE || posType == SMDS_TOP_FACE ) { + myInfo->append( QString( "- %1: #%2" ).arg( SMESHGUI_ElemInfo::tr( "U_POSITION" ) ). + arg( QString::number( u, precision > 0 ? 'f' : 'g', qAbs( precision )) ) ); + if ( posType == SMDS_TOP_FACE ) { + myInfo->append( QString( "- %1: #%2" ).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& ids ) afunctor->SetMesh( actor()->GetObject()->GetMesh() ); myInfo->append( QString( "- %1: %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( "%1: %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( 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( "%1: %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& 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& 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( 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 ) ); + } + } + } } } } diff --git a/src/SMESHGUI/SMESH_msg_en.ts b/src/SMESHGUI/SMESH_msg_en.ts index 068c9de26..3395865f7 100644 --- a/src/SMESHGUI/SMESH_msg_en.ts +++ b/src/SMESHGUI/SMESH_msg_en.ts @@ -6755,7 +6755,15 @@ as they are of improper type: Solid - NODE_POSITION + GEOM_SHELL + Shell + + + GEOM_SHAPE + Shape + + + POSITION Position diff --git a/src/SMESHGUI/SMESH_msg_fr.ts b/src/SMESHGUI/SMESH_msg_fr.ts index 7e238acb1..6cfae09fb 100755 --- a/src/SMESHGUI/SMESH_msg_fr.ts +++ b/src/SMESHGUI/SMESH_msg_fr.ts @@ -6626,7 +6626,15 @@ en raison de leurs types incompatibles: Solide - NODE_POSITION + GEOM_SHELL + Coque + + + GEOM_SHAPE + Forme + + + POSITION Position diff --git a/src/SMESH_I/SMESH_Mesh_i.cxx b/src/SMESH_I/SMESH_Mesh_i.cxx index e81c3a7e7..969109eca 100644 --- a/src/SMESH_I/SMESH_Mesh_i.cxx +++ b/src/SMESH_I/SMESH_Mesh_i.cxx @@ -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 diff --git a/src/SMESH_I/SMESH_Mesh_i.hxx b/src/SMESH_I/SMESH_Mesh_i.hxx index a1c27e00a..a98be336e 100644 --- a/src/SMESH_I/SMESH_Mesh_i.hxx +++ b/src/SMESH_I/SMESH_Mesh_i.hxx @@ -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 diff --git a/src/SMESH_SWIG/smeshDC.py b/src/SMESH_SWIG/smeshDC.py index 04b801399..24095c5b0 100644 --- a/src/SMESH_SWIG/smeshDC.py +++ b/src/SMESH_SWIG/smeshDC.py @@ -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 -- 2.30.2