Salome HOME
0020104: EDF 861 SMESH : Mesh element info evolution
[modules/smesh.git] / src / SMESHGUI / SMESHGUI_WhatIsDlg.cxx
index c49e2dc1cc7398be14468f15bf4512fcd79d2bc2..1af954d482cb6f515c4735cb66ebbbc4cb112c08 100755 (executable)
@@ -51,6 +51,7 @@
 #include <SVTK_Selection.h>
 #include <SVTK_ViewWindow.h>
 #include <SALOME_ListIO.hxx>
+#include <SALOME_ListIteratorOfListIO.hxx>
 
 // OCCT includes
 #include <TColStd_MapOfInteger.hxx>
@@ -135,7 +136,7 @@ SMESHGUI_WhatIsDlg::SMESHGUI_WhatIsDlg( SMESHGUI* theModule )
 
   // information text browser
   Info = new QTextBrowser(GroupArguments);
-  Info->setMinimumSize(200, 150);
+  Info->setMinimumSize(300, 200);
   GroupArgumentsLayout->addWidget(Info, 1, 0, 1, 2);
 
   /***************************************************************/
@@ -373,7 +374,7 @@ void SMESHGUI_WhatIsDlg::SelectionIntoArgument()
 
   int nbSel = aList.Extent();
 
-  if (nbSel != 1)
+  if (nbSel < 1)
     return;
 
   Handle(SALOME_InteractiveObject) IO = aList.First();
@@ -381,15 +382,43 @@ void SMESHGUI_WhatIsDlg::SelectionIntoArgument()
   if (myMesh->_is_nil())
     return;
 
+  if (nbSel != 1) {
+    //check if all selected objects belongs to one mesh
+    SALOME_ListIteratorOfListIO io( aList );
+    for (io.Next(); io.More(); io.Next() ) {
+      SMESH::SMESH_Mesh_var mesh = SMESH::GetMeshByIO(io.Value());
+      if (!mesh->_is_nil() && !mesh->_is_equivalent( myMesh ))
+        return;
+    }
+    // select IO with any element selected (for case of selection by rectangle)
+    IO.Nullify();
+    for (io.Initialize(aList); io.More() && IO.IsNull(); io.Next() )
+      if ( mySelector->HasIndex( io.Value() ))
+        IO = io.Value();
+    if ( IO.IsNull() ) return;
+    // unhilight others
+    if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) {
+      for (io.Initialize(aList); io.More(); io.Next() )
+        if ( !IO->isSame( io.Value() ))
+          aViewWindow->highlight( io.Value(), false, true );
+    }
+  }
+
   myActor = SMESH::FindActorByObject(myMesh);
   if (!myActor)
     myActor = SMESH::FindActorByEntry(IO->getEntry());
   if (!myActor)
     return;
 
-  QString aName;
-  SMESH::GetNameOfSelectedIObjects(mySelectionMgr, aName);
-  MeshName->setText(aName);
+  QString aName = IO->getName();
+  // cut off wite spaces from tail, else meaningful head is not visible
+  int size = aName.length();
+  while (size && aName.at(size-1).isSpace() )
+    --size;
+  if ( size != aName.length() )
+    aName.truncate( size );
+  MeshName->setText(aName); // can be something like "2 objects"
+
   if(!SMESH::IObjectToInterface<SMESH::SMESH_Mesh>(IO)->_is_nil()) {
     GroupMesh->setTitle(tr("SMESH_MESH"));
   } else if(!SMESH::IObjectToInterface<SMESH::SMESH_subMesh>(IO)->_is_nil()) {
@@ -410,19 +439,19 @@ void SMESHGUI_WhatIsDlg::SelectionIntoArgument()
     myActor->GetObject()->GetMesh()->FindElement(aString.toInt());
   if (e) {
     QString anInfo;
-    anInfo=tr("ENTITY_TYPE") + ": ";
+    anInfo="<b>" + tr("ENTITY_TYPE") + ":</b> ";
     if(e->GetType() == SMDSAbs_Node) {
-      anInfo+=tr("MESH_NODE")+"\n";
+      anInfo+=tr("MESH_NODE")+"<br>";
       //const SMDS_MeshNode *en = (SMDS_MeshNode*) e; // VSR: not used!
     } else if(e->GetType() == SMDSAbs_Edge) {
-      anInfo+=tr("SMESH_EDGE")+"\n";
-      anInfo+=tr("SMESH_MESHINFO_TYPE")+": ";
+      anInfo+=tr("SMESH_EDGE")+"<br>";
+      anInfo+="<b>" + tr("SMESH_MESHINFO_TYPE")+":</b> ";
       const SMDS_MeshEdge *ee = (SMDS_MeshEdge*) e;
-      anInfo+=(ee->IsQuadratic()?tr("SMESH_MESHINFO_ORDER2"):tr("SMESH_MESHINFO_ORDER1"))+"\n";
+      anInfo+=(ee->IsQuadratic()?tr("SMESH_MESHINFO_ORDER2"):tr("SMESH_MESHINFO_ORDER1"))+"<br>";
     } else if(e->GetType() == SMDSAbs_Face) {
       const SMDS_MeshFace *ef = (SMDS_MeshFace*) e;
-      anInfo+=tr("SMESH_FACE")+"\n";
-      anInfo+=tr("SMESH_MESHINFO_TYPE")+": ";
+      anInfo+=tr("SMESH_FACE")+"<br>";
+      anInfo+="<b>" + tr("SMESH_MESHINFO_TYPE")+":</b> ";
       if(!ef->IsPoly())
        anInfo+=(ef->IsQuadratic()?tr("SMESH_MESHINFO_ORDER2"):tr("SMESH_MESHINFO_ORDER1"))+" ";
       switch(ef->NbNodes()) {
@@ -441,10 +470,10 @@ void SMESHGUI_WhatIsDlg::SelectionIntoArgument()
       default:
        break;
       }
-      anInfo+="\n";
+      anInfo+="<br>";
     } else if(e->GetType() == SMDSAbs_Volume) {
-      anInfo+=tr("SMESH_VOLUME")+"\n";
-      anInfo+=tr("SMESH_MESHINFO_TYPE")+": ";
+      anInfo+=tr("SMESH_VOLUME")+"<br>";
+      anInfo+="<b>" + tr("SMESH_MESHINFO_TYPE")+":</b> ";
       const SMDS_MeshVolume *ev = (SMDS_MeshVolume*) e;
       SMDS_VolumeTool vt(ev);
       if(vt.GetVolumeType() != SMDS_VolumeTool::POLYHEDA)
@@ -482,19 +511,37 @@ void SMESHGUI_WhatIsDlg::SelectionIntoArgument()
       default:
        break;
       }
-      anInfo+="\n";
+      anInfo+="<br>";
     }
-    if(e->GetType() != SMDSAbs_Node)
-      anInfo+=tr("GRAVITY_CENTER") + ":\n";
     gp_XYZ anXYZ(0.,0.,0.);
     SMDS_ElemIteratorPtr nodeIt = e->nodesIterator();
     int nbNodes = 0;
+    QString aNodesInfo="";
     for( ; nodeIt->more(); nbNodes++) {
       const SMDS_MeshNode* node = static_cast<const SMDS_MeshNode*>( nodeIt->next() );
       anXYZ.Add( gp_XYZ( node->X(), node->Y(), node->Z() ) );
+      if(e->GetType() != SMDSAbs_Node)
+       aNodesInfo+=QString("<b>Node %1:</b><br>Id=%2, X=%3, Y=%4, Z=%5<br>").arg(nbNodes+1).arg(node->GetID()).arg(node->X()).arg(node->Y()).arg(node->Z());
+      // Calculate Connectivity
+      SMDS_ElemIteratorPtr it = node->GetInverseElementIterator();
+      if (it) {
+       aNodesInfo+="<b>" + tr("CONNECTED_ELEMENTS") + ":</b>";
+       while (it->more()) {
+         const SMDS_MeshElement* elem = it->next();
+         aNodesInfo+=QString(" %1").arg(elem->GetID());
+       }
+       if ( (nbNodes+1) != e->NbNodes())
+         aNodesInfo+=QString("<br><br>");
+      }
     }
+    if(e->GetType() != SMDSAbs_Node)
+      anInfo+="<b>" + tr("GRAVITY_CENTER") + ":</b><br>";
     anXYZ.Divide(e->NbNodes());
-    anInfo+=QString("X=%1\nY=%2\nZ=%3\n").arg(anXYZ.X()).arg(anXYZ.Y()).arg(anXYZ.Z());
+    anInfo+=QString("X=%1, Y=%2, Z=%3").arg(anXYZ.X()).arg(anXYZ.Y()).arg(anXYZ.Z());
+    if(e->GetType() != SMDSAbs_Node)
+      anInfo+="<br>";
+    if (aNodesInfo!="")
+      anInfo+= "<br>" + aNodesInfo;
     Info->setText(anInfo);
   }