Salome HOME
ILMAB: export GEOM fields to MED file
[modules/smesh.git] / src / SMESHGUI / SMESHGUI_FieldSelectorWdg.cxx
diff --git a/src/SMESHGUI/SMESHGUI_FieldSelectorWdg.cxx b/src/SMESHGUI/SMESHGUI_FieldSelectorWdg.cxx
new file mode 100644 (file)
index 0000000..3185ea3
--- /dev/null
@@ -0,0 +1,237 @@
+// Copyright (C) 2007-2014  CEA/DEN, EDF R&D, OPEN CASCADE
+//
+// Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
+// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+//
+// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//
+
+#include "SMESHGUI_FieldSelectorWdg.h"
+
+#include "SMESHGUI_Utils.h"
+#include "SMESHGUI_GEOMGenUtils.h"
+
+#include <SALOMEDSClient_Study.hxx>
+#include <GEOM_wrap.hxx>
+
+#include <QGroupBox>
+#include <QTreeWidget>
+#include <QTreeWidgetItem>
+#include <QTreeWidgetItemIterator>
+#include <QVBoxLayout>
+#include <QLabel>
+#include "SMESHGUI.h"
+
+namespace
+{
+  QTreeWidgetItem* createItem( QTreeWidget*     tree,
+                               const QString&   text,
+                               const int        index,
+                               QTreeWidgetItem* parentItem=0)
+  {
+    QTreeWidgetItem* item;
+    if ( parentItem )
+      item = new QTreeWidgetItem( parentItem );
+    else
+      item = new QTreeWidgetItem( tree );
+    item->setText( 0, text );
+    item->setData( 0, Qt::UserRole, index );
+    item->setFlags( item->flags() | Qt::ItemIsUserCheckable | Qt::ItemIsEditable );
+    item->setCheckState( 0, Qt::Unchecked );
+    item->setExpanded( true );
+    if ( index < 0 )
+    {
+      QFont f = item->font( 0 );
+      f.setItalic( true );
+      item->setFont( 0, f );
+    }
+    return item;
+  }
+}
+
+//--------------------------------------------------------------------------------
+/*!
+ * \brief Constructor of SMESHGUI_FieldSelectorWdg
+ */
+SMESHGUI_FieldSelectorWdg::SMESHGUI_FieldSelectorWdg( QWidget* p )
+  :QGroupBox( tr("FIELDS_TO_EXPORT"), p )
+{
+  setCheckable( true );
+  myTree = new QTreeWidget( this );
+  myTree->setHeaderHidden( true );
+  
+  QVBoxLayout* lay = new QVBoxLayout( this );
+  lay->addWidget( myTree );
+
+  connect( myTree, SIGNAL( itemChanged(QTreeWidgetItem*, int)),
+           this,   SLOT  ( onItemCheck(QTreeWidgetItem*, int)));
+}
+
+//--------------------------------------------------------------------------------
+/*!
+ * \brief Retrieves all fields defined on geometry of given meshes
+ */
+bool SMESHGUI_FieldSelectorWdg::
+GetAllFeilds(const QList< QPair< SMESH::SMESH_IDSource_var, QString > >& meshes,
+             QList< QPair< GEOM::ListOfFields_var, QString > >&          fields)
+{
+  myFields = & fields;
+  myTree->clear();
+  
+  _PTR(Study) study = SMESH::GetActiveStudyDocument();
+  GEOM::GEOM_Gen_var geomGen = SMESH::GetGEOMGen();
+  GEOM::GEOM_IFieldOperations_wrap fieldOp = geomGen->GetIFieldOperations( study->StudyId() );
+
+  for ( int iM = 0; iM < meshes.count(); ++iM )
+  {
+    GEOM::ListOfFields_var fields;
+    QString                geoAss;
+
+    SMESH::SMESH_Mesh_var mesh = meshes[iM].first->GetMesh();
+    if ( !mesh->_is_nil() && mesh->HasShapeToMesh() )
+    {
+      SMESH::array_of_ElementType_var elemTypes = meshes[iM].first->GetTypes();
+      if ( &elemTypes.in() && elemTypes->length() > 0 )
+      {
+        QTreeWidgetItem* meshItem = createItem( myTree, meshes[iM].second, iM );
+
+        GEOM::GEOM_Object_var shape = mesh->GetShapeToMesh();
+        fields = fieldOp->GetFields( shape );
+        for ( size_t iF = 0; iF < fields->length(); ++iF )
+        {
+          CORBA::String_var name = fields[iF]->GetName();
+          createItem( myTree, name.in(), iF, meshItem );
+        }
+        QString geoAss;
+        for ( size_t i = 0; i < elemTypes->length(); ++i )
+        {
+          QString name;
+          switch ( elemTypes[i] ) {
+          case SMESH::NODE:   name = "_vertices_"; break;
+          case SMESH::EDGE:   name = "_edges_"   ; break;
+          case SMESH::FACE:   name = "_faces_"   ; break;
+          case SMESH::VOLUME: name = "_solids_"  ; break;
+          default: continue;
+          }
+          geoAss += name[1];
+          createItem( myTree, name, -1, meshItem );
+        }
+        if ( !geoAss.isEmpty() && !geoAss.count('v') )
+        {
+          createItem( myTree, "_vertices_", -1, meshItem );
+        }
+      }
+    } // if ( mesh->HasShapeToMesh() )
+
+    if ( ! &fields.in() )
+      fields = new GEOM::ListOfFields();
+
+    myFields->push_back( qMakePair( fields, QString() ));
+
+  } // loop on meshes
+
+  setChecked( false );
+
+  return myTree->topLevelItemCount();
+}
+
+//--------------------------------------------------------------------------------
+/*!
+ * \brief Filter off not selected fields from myFields
+ */
+bool SMESHGUI_FieldSelectorWdg::GetSelectedFeilds()
+{
+  int nbSelected = 0;
+  if ( myTree->isEnabled() )
+    for ( size_t i = 0; i < myTree->topLevelItemCount(); ++i )
+    {
+      QTreeWidgetItem* meshItem = myTree->topLevelItem( i );
+      int iM = meshItem->data( 0, Qt::UserRole ).toInt();
+
+      GEOM::ListOfFields& fields = (*myFields)[ iM ].first.inout();
+      QString&            geoAss = (*myFields)[ iM ].second;
+
+      int nbF = 0;
+      QTreeWidgetItemIterator it ( meshItem, QTreeWidgetItemIterator::Checked );
+      if ( *it == meshItem ) ++it;
+      for ( ; *it ; ++it, ++nbSelected )
+      {
+        if ( !(*it)->parent() )
+          break; // next mesh item
+
+        int iF = (*it)->data( 0, Qt::UserRole ).toInt();
+        if ( iF < 0 )
+        {
+          geoAss += (*it)->text(0)[1];
+        }
+        else
+        {
+          if ( nbF != iF )
+            fields[ nbF ] = fields[ iF ];
+          ++nbF;
+        }
+      }
+      fields.length( nbF );
+    }
+  else
+  {
+    for ( size_t iF = 0; iF < myFields->count(); ++iF )
+    {
+      GEOM::ListOfFields& fields = (*myFields)[ iF ].first.inout();
+      fields.length( 0 );
+    }
+  }
+  return nbSelected;
+}
+
+//--------------------------------------------------------------------------------
+/*!
+ * \brief SLOT called when a tree item is checked
+ */
+void SMESHGUI_FieldSelectorWdg::onItemCheck(QTreeWidgetItem * item, int column)
+{
+  myTree->blockSignals( true );
+  if ( !item->parent() ) // mesh item
+  {
+    Qt::CheckState st = item->checkState(0);
+    QTreeWidgetItemIterator it( item );
+    for ( ++it; *it ; ++it )
+      if ( !(*it)->parent() )
+        break; // next mesh item
+      else
+        (*it)->setCheckState( 0, st );
+  }
+  else // field item
+  {
+    // update CheckState of a parent mesh item
+    QTreeWidgetItem* meshItem = item->parent();
+    Qt::CheckState st = item->checkState(0);
+    QTreeWidgetItemIterator it( meshItem );
+    for ( ++it; *it ; ++it )
+      if ( !(*it)->parent() )
+      {
+        break; // next mesh item
+      }
+      else if ( (*it)->checkState(0) != st )
+      {
+        st = Qt::PartiallyChecked;
+        break;
+      }
+    meshItem->setCheckState( 0, st );
+  }
+  myTree->blockSignals( false );
+}