Salome HOME
Remove QT4 compatibility.
[modules/hexablock.git] / src / HEXABLOCKGUI / HEXABLOCKGUI_DocumentModel.cxx
old mode 100755 (executable)
new mode 100644 (file)
index 3cad03d..60b97c1
@@ -1,9 +1,9 @@
-// Copyright (C) 2009-2012  CEA/DEN, EDF R&D
+// Copyright (C) 2009-2019  CEA/DEN, EDF R&D
 //
 // 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.
+// 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
 
 #include "HexVertex.hxx"
 #include "HexShape.hxx"
+#include "HexSubShape.hxx"
+#include "HexAssoEdge.hxx"
+#include "HexBiCylinder.hxx"
+
+#include <TopoDS.hxx>
+#include <BRepBuilderAPI_MakeVertex.hxx>
 
-#include <GEOMBase.h>
 #include "HEXABLOCKGUI_SalomeTools.hxx"
 
+#include <SALOME_ListIO.hxx>
+#include <SALOMEconfig.h>
+#include <SUIT_ViewWindow.h>
+
 #include <qglobal.h>
+
+#include "HEXABLOCKGUI_VtkDocumentGraphicView.hxx"
+
+#include <Geom_Circle.hxx>
+#include <gp_Circ.hxx>
+#include <BRep_Tool.hxx>
+#include <TopoDS_Edge.hxx>
 //#define _DEVDEBUG_
 
 
@@ -46,307 +62,602 @@ using namespace HEXABLOCK::GUI;
 
 /*****************************************************************
                       DocumentModel
-*****************************************************************/
+ *****************************************************************/
 // DocumentModel::DocumentModel(QObject * parent):
 DocumentModel::DocumentModel(HEXA_NS::Document* docIn, const QString& entryIn, QObject * parent):
-  QStandardItemModel(parent),
-  _hexaFile( new QTemporaryFile() ),
-  _hexaDocument( docIn ),
-  _entry( entryIn ),
-//   _hexaDocument(  new HEXA_NS::Document("/tmp/doc.hex") ), //CS_TODO
-
-  _vertexDirItem( new QStandardItem(tr("TREE_ITEM_VERTEX")) ),
-  _edgeDirItem(   new QStandardItem(tr("TREE_ITEM_EDGE")) ),
-  _quadDirItem(   new QStandardItem(tr("TREE_ITEM_QUAD")) ),
-  _hexaDirItem(   new QStandardItem(tr("TREE_ITEM_HEXA")) ),
-
-  _vectorDirItem(        new QStandardItem(tr("TREE_ITEM_VECTOR")) ),
-  _cylinderDirItem(      new QStandardItem(tr("TREE_ITEM_CYLINDER")) ),
-  _pipeDirItem(          new QStandardItem(tr("TREE_ITEM_PIPE")) ),
-  _elementsDirItem(      new QStandardItem(tr("TREE_ITEM_ELEMENT")) ),
-  _crossElementsDirItem( new QStandardItem(tr("TREE_ITEM_CROSSELEMENT")) ),
-
-  _groupDirItem( new QStandardItem(tr("TREE_ITEM_GROUP")) ),
-
-  _lawDirItem( new QStandardItem(tr("TREE_ITEM_LAW")) ),
-  _propagationDirItem( new QStandardItem(tr("TREE_ITEM_PROPAGATION")) ),
-
-  _vertexItemFlags( Qt::NoItemFlags ),
-  _edgeItemFlags( Qt::NoItemFlags ),
-  _quadItemFlags( Qt::NoItemFlags ),
-  _hexaItemFlags( Qt::NoItemFlags ),
-  _vectorItemFlags( Qt::NoItemFlags ),
-  _cylinderItemFlags( Qt::NoItemFlags ),
-  _pipeItemFlags( Qt::NoItemFlags ),
-  _elementsItemFlags( Qt::NoItemFlags ),
-  _crossElementsItemFlags( Qt::NoItemFlags ),
-  _disallowEdition( false )
-{
-//   setColumnCount( 4 ); //CS_TEST
-  if ( !_hexaDocument && _hexaFile->open() ){
-    _hexaDocument =  new HEXA_NS::Document( _hexaFile->fileName().toLatin1() );
-    _hexaDocument->reorderFaces();
-  }
-
-  QStandardItem *parentItem = invisibleRootItem();
-//   parentItem->setData( QString::number( reinterpret_cast<intptr_t>(_hexaDocument) ), HEXA_ENTRY_ROLE );
-  parentItem->setData( _entry, HEXA_ENTRY_ROLE );
-
-  _vertexDirItem->setData( VERTEX_DIR_TREE,           HEXA_TREE_ROLE );
-  _edgeDirItem->setData( EDGE_DIR_TREE,               HEXA_TREE_ROLE );
-  _quadDirItem->setData( QUAD_DIR_TREE,               HEXA_TREE_ROLE );
-  _hexaDirItem->setData( HEXA_DIR_TREE,               HEXA_TREE_ROLE );
-
-  _vectorDirItem->setData( VECTOR_DIR_TREE,           HEXA_TREE_ROLE );
-  _cylinderDirItem->setData( CYLINDER_DIR_TREE,       HEXA_TREE_ROLE );
-  _pipeDirItem->setData( PIPE_DIR_TREE,                   HEXA_TREE_ROLE );
-  _elementsDirItem->setData( ELEMENTS_DIR_TREE,           HEXA_TREE_ROLE );
-  _crossElementsDirItem->setData( CROSSELEMENTS_DIR_TREE, HEXA_TREE_ROLE );
-
-  _groupDirItem->setData( GROUP_DIR_TREE, HEXA_TREE_ROLE );
-
-  //CS_TODO associations
-
-  _lawDirItem->setData( LAW_DIR_TREE, HEXA_TREE_ROLE );
-  _propagationDirItem->setData( PROPAGATION_DIR_TREE, HEXA_TREE_ROLE );
-
-
-  parentItem->appendRow(_vertexDirItem);
-  parentItem->appendRow(_edgeDirItem);
-  parentItem->appendRow(_quadDirItem);
-  parentItem->appendRow(_hexaDirItem);
-  parentItem->appendRow(_vectorDirItem);
-  parentItem->appendRow(_cylinderDirItem);
-  parentItem->appendRow(_pipeDirItem);
-  parentItem->appendRow(_elementsDirItem);
-  parentItem->appendRow(_crossElementsDirItem);
-  parentItem->appendRow(_groupDirItem);
-  parentItem->appendRow(_lawDirItem);
-  parentItem->appendRow(_propagationDirItem);
+                              QStandardItemModel(parent),
+                              _hexaFile( new QTemporaryFile() ),
+                              _hexaDocument( docIn ),
+                              _entry( entryIn ),
+                              //   _hexaDocument(  new HEXA_NS::Document("/tmp/doc.hex") ), //CS_TODO
+
+                              _vertexDirItem( new QStandardItem(tr("TREE_ITEM_VERTEX")) ),
+                              _edgeDirItem( new QStandardItem(tr("TREE_ITEM_EDGE")) ),
+                              _quadDirItem( new QStandardItem(tr("TREE_ITEM_QUAD")) ),
+                              _hexaDirItem( new QStandardItem(tr("TREE_ITEM_HEXA")) ),
+
+                              _vectorDirItem( new QStandardItem(tr("TREE_ITEM_VECTOR")) ),
+                              _elementsDirItem( new QStandardItem(tr("TREE_ITEM_ELEMENT")) ),
+                              _crossElementsDirItem( new QStandardItem(tr("TREE_ITEM_CROSSELEMENT")) ),
+
+                              _explicitShapesDirItem( new QStandardItem(tr("TREE_ITEM_EXPSHAPE")) ),
+                              _implicitShapesDirItem( new QStandardItem(tr("TREE_ITEM_IMPSHAPE")) ),
+                              _cloudOfPointsDirItem( new QStandardItem(tr("TREE_ITEM_CLOUD_OF_POINT")) ),
+
+                              _groupDirItem( new QStandardItem(tr("TREE_ITEM_GROUP")) ),
+
+                              _lawDirItem( new QStandardItem(tr("TREE_ITEM_LAW")) ),
+                              _propagationDirItem( new QStandardItem(tr("TREE_ITEM_PROPAGATION")) ),
+
+                              _vertexItemFlags( Qt::NoItemFlags ),
+                              _edgeItemFlags( Qt::NoItemFlags ),
+                              _quadItemFlags( Qt::NoItemFlags ),
+                              _hexaItemFlags( Qt::NoItemFlags ),
+                              _vectorItemFlags( Qt::NoItemFlags ),
+                              _elementsItemFlags( Qt::NoItemFlags ),
+                              _crossElementsItemFlags( Qt::NoItemFlags ),
+
+                              _disallowEdition( false )
+{
+    //   setColumnCount( 4 ); //CS_TEST
+    if ( !_hexaDocument && _hexaFile->open() ){
+        _hexaDocument =  new HEXA_NS::Document( _hexaFile->fileName().toLatin1() );
+        _hexaDocument->reorderFaces();
+    }
+
+    QStandardItem *parentItem = invisibleRootItem();
+    //   parentItem->setData( QString::number( reinterpret_cast<intptr_t>(_hexaDocument) ), HEXA_ENTRY_ROLE );
+    parentItem->setData( _entry, HEXA_ENTRY_ROLE );
+
+    _vertexDirItem->setData( VERTEX_DIR_TREE,           HEXA_TREE_ROLE );
+    _edgeDirItem->setData( EDGE_DIR_TREE,               HEXA_TREE_ROLE );
+    _quadDirItem->setData( QUAD_DIR_TREE,               HEXA_TREE_ROLE );
+    _hexaDirItem->setData( HEXA_DIR_TREE,               HEXA_TREE_ROLE );
+
+    _vectorDirItem->setData( VECTOR_DIR_TREE,           HEXA_TREE_ROLE );
+    _elementsDirItem->setData( ELEMENTS_DIR_TREE,           HEXA_TREE_ROLE );
+    _crossElementsDirItem->setData( CROSSELEMENTS_DIR_TREE, HEXA_TREE_ROLE );
+
+    _explicitShapesDirItem->setData( EXPLICIT_SHAPES_DIR_TREE, HEXA_TREE_ROLE );
+    _implicitShapesDirItem->setData( IMPLICIT_SHAPES_DIR_TREE, HEXA_TREE_ROLE );
+    _cloudOfPointsDirItem->setData( CLOUD_OF_POINTS_DIR_TREE, HEXA_TREE_ROLE );
+
+    _groupDirItem->setData( GROUP_DIR_TREE, HEXA_TREE_ROLE );
+
+    //CS_TODO associations
+
+    _lawDirItem->setData( LAW_DIR_TREE, HEXA_TREE_ROLE );
+    _propagationDirItem->setData( PROPAGATION_DIR_TREE, HEXA_TREE_ROLE );
+
+    parentItem->appendRow(_vertexDirItem);
+    parentItem->appendRow(_edgeDirItem);
+    parentItem->appendRow(_quadDirItem);
+    parentItem->appendRow(_hexaDirItem);
+
+    parentItem->appendRow(_vectorDirItem);
+    parentItem->appendRow(_elementsDirItem);
+    parentItem->appendRow(_crossElementsDirItem);
+
+    parentItem->appendRow(_explicitShapesDirItem);
+    parentItem->appendRow(_implicitShapesDirItem);
+
+    parentItem->appendRow(_groupDirItem);
+    parentItem->appendRow(_lawDirItem);
+    parentItem->appendRow(_propagationDirItem);
 }
 
 DocumentModel::~DocumentModel()
 {
-  delete _hexaDocument;
-  delete _hexaFile;
+    if (_hexaDocument != NULL)
+        delete _hexaDocument;
+
+    if (_hexaFile != NULL)
+        delete _hexaFile;
 }
 
 void DocumentModel::setName(const QString& name)
 {
-  _hexaDocument->setName( name.toLocal8Bit().constData() );
-  emit nameChanged(name);
+    _hexaDocument->setName( name.toLocal8Bit().constData() );
+    emit nameChanged(QString(_hexaDocument->getName()));
 }
 
-QString DocumentModel::getName()
+HEXA_NS::EltBase* DocumentModel::getHexaPtr(const QModelIndex& iElt)
 {
-  return _hexaDocument->getName();
+    HEXA_NS::EltBase *elt = NULL;
+    switch ( /*data(iElt, HEXA_TREE_ROLE).toInt()*/iElt.data(HEXA_TREE_ROLE).toInt() ){
+    case VERTEX_TREE : elt = getHexaPtr<HEXA_NS::Vertex*>(iElt); break;
+    case EDGE_TREE : elt = getHexaPtr<HEXA_NS::Edge*>(iElt); break;
+    case QUAD_TREE : elt = getHexaPtr<HEXA_NS::Quad*>(iElt); break;
+    case HEXA_TREE : elt = getHexaPtr<HEXA_NS::Hexa*>(iElt); break;
+    case VECTOR_TREE : elt = getHexaPtr<HEXA_NS::Vector*>(iElt); break;
+    case ELEMENTS_TREE : elt = getHexaPtr<HEXA_NS::Elements*>(iElt); break;
+//  case CROSSELEMENTS_TREE : elt = getHexaPtr<HEXA_NS::CrossElements*>(iElt); break;
+    case GEOMSHAPE_TREE: elt = getHexaPtr<HEXA_NS::NewShape*>(iElt); break;
+    case GEOMPOINT_TREE: elt = getHexaPtr<HEXA_NS::VertexShape*>(iElt); break;
+    case GEOMEDGE_TREE:  elt = getHexaPtr<HEXA_NS::EdgeShape*>(iElt); break;
+    case GEOMFACE_TREE:  elt = getHexaPtr<HEXA_NS::FaceShape*>(iElt); break;
+    }
+    return elt;
 }
 
-HEXA_NS::EltBase* DocumentModel::getHexaPtr(const QModelIndex& iElt)
+//get the number of elements of type 'eltType' in the document
+int DocumentModel::getNbrElt(HEXA_NS::EnumElt eltType)
+{
+    if (_hexaDocument == NULL) return 0;
+
+   return _hexaDocument->getNbrElt(eltType);
+}
+
+//get the number of elements of type 'eltType' used in the document
+int DocumentModel::getNbrUsedElt(HEXA_NS::EnumElt eltType)
+{
+    if (_hexaDocument == NULL) return 0;
+
+    switch(eltType) {
+    case HEXA_NS::EL_VERTEX:
+        return _hexaDocument->countUsedVertex();
+    case HEXA_NS::EL_EDGE:
+        return _hexaDocument->countUsedEdge();
+    case HEXA_NS::EL_QUAD:
+        return _hexaDocument->countUsedQuad();
+    case HEXA_NS::EL_HEXA:
+        return _hexaDocument->countUsedHexa();
+    default: return 0;
+    }
+}
+
+//associate a shape to the current document
+bool DocumentModel::addShape(TopoDS_Shape& aShape, QString& name, bool publish)
+{
+    if (aShape.IsNull() || name.isEmpty())
+        return false;
+    bool ok = (_hexaDocument != NULL ? _hexaDocument->addShape(aShape, name.toStdString().c_str()) != NULL : false);
+
+    // * publish the shape in the study
+    if (ok && publish)
+    {
+        HEXABLOCKGUI* module = HEXABLOCKGUI::getInstance();
+        if (module != NULL)
+        {
+            QMap<QString, TopoDS_Shape> topo_shapes;
+            topo_shapes[name] = aShape;
+            module->addInStudy(topo_shapes, docShapesEntry, docShapesName);
+        }
+    }
+
+    // * update data
+    if (ok)
+        updateGeomTree();
+
+    return ok;
+}
+
+//get the number of unused elements of type 'eltType' in the document
+int DocumentModel::getNbrUnusedElt(HEXA_NS::EnumElt eltType)
+{
+    if (_hexaDocument == NULL)
+        return 0;
+
+    return getNbrElt(eltType) - getNbrUsedElt(eltType);
+}
+
+// compute the length of the given edge
+double DocumentModel::getLength(const QModelIndex& iEdge)
+{
+    // * Get the pointer to the edge
+    HEXA_NS::Edge*        edge     = getHexaPtr<HEXA_NS::Edge*>(iEdge);
+    HEXA_NS::EdgeShape*   geomEdge = getHexaPtr<HEXA_NS::EdgeShape*>(iEdge);
+
+    // * The edge can be from VTK or OCC View
+    if (edge != NULL)
+        return edge->getLength();
+    else if (geomEdge != NULL)
+        return geomEdge->getLength();
+    else
+        return 0.;
+}
+
+// Compute the radius of the given edge
+double DocumentModel::getRadius(const QModelIndex& iEdge)
+{
+    // * Get the pointer to the edge
+    // * In our case only an OCC edge can have a radius
+    HEXA_NS::EdgeShape* edge = getHexaPtr<HEXA_NS::EdgeShape*>(iEdge);
+    if (edge == NULL)
+        return 0.;
+
+    return edge->getRadius();
+}
+
+// Compute the angle of the given edge (internal angle)
+double DocumentModel::getAngle(const QModelIndex& iEdge)
+{
+    // * Get the pointer to the edge
+    HEXA_NS::EdgeShape* edge = getHexaPtr<HEXA_NS::EdgeShape*>(iEdge);
+    if (edge == NULL)
+        return 0.;
+
+    return edge->getAngle();
+}
+
+//Load the current Document
+void DocumentModel::load()
 {
-       HEXA_NS::EltBase *elt = NULL;
-       switch ( /*data(iElt, HEXA_TREE_ROLE).toInt()*/iElt.data(HEXA_TREE_ROLE).toInt() ){
-               case VERTEX_TREE : elt = getHexaPtr<HEXA_NS::Vertex*>(iElt); break;
-               case EDGE_TREE : elt = getHexaPtr<HEXA_NS::Edge*>(iElt); break;
-               case QUAD_TREE : elt = getHexaPtr<HEXA_NS::Quad*>(iElt); break;
-               case HEXA_TREE : elt = getHexaPtr<HEXA_NS::Hexa*>(iElt); break;
-               case VECTOR_TREE : elt = getHexaPtr<HEXA_NS::Vector*>(iElt); break;
-               case CYLINDER_TREE : elt = getHexaPtr<HEXA_NS::Cylinder*>(iElt); break;
-               case PIPE_TREE : elt = getHexaPtr<HEXA_NS::Pipe*>(iElt); break;
-               case ELEMENTS_TREE : elt = getHexaPtr<HEXA_NS::Elements*>(iElt); break;
-               case CROSSELEMENTS_TREE : elt = getHexaPtr<HEXA_NS::CrossElements*>(iElt); break;
-       }
-       return elt;
-}
-
-DocumentModel::GeomObj* DocumentModel::convertToGeomObj(GEOM::GeomObjPtr geomObjPtr)
-{
-       TopoDS_Shape aShape;
-       DocumentModel::GeomObj *res = NULL;
-
-       if ( geomObjPtr && GEOMBase::GetShape(geomObjPtr.get(), aShape) && !aShape.IsNull() )
-       {
-               res = new DocumentModel::GeomObj;
-               if (res == NULL) return NULL;
-               QString mainShapeEntry;
-               int     subId = -1;
-               QString brep;
-
-               if ( geomObjPtr->IsMainShape() ){
-                       mainShapeEntry = geomObjPtr->GetStudyEntry();
-                       brep =  shape2string( aShape ).c_str();
-               } else {
-                       TopoDS_Shape shape;
-                       TopoDS_Shape subshape;
-                       GEOM::GEOM_Object_var mainShape = geomObjPtr->GetMainShape();
-                       mainShapeEntry = mainShape->GetStudyEntry();
-                       // CS_TODO : à optimiser
-                       bool okShape = GEOMBase::GetShape( mainShape , shape);//,const TopAbs_ShapeEnum type = TopAbs_SHAPE );
-                       bool oksubShape = GEOMBase::GetShape( geomObjPtr.get(), subshape );//,const TopAbs_ShapeEnum type = TopAbs_SHAPE );
-                       if ( okShape && oksubShape ){
-                               brep =  shape2string( subshape ).c_str();
-                               subId = GEOMBase::GetIndex( subshape, shape );
-                       }
-               }
-               res->name  = GEOMBase::GetName( geomObjPtr.get() );
-               res->entry = mainShapeEntry;
-               res->subid = QString::number(subId);
-               res->brep  = brep;
-               res->start = 0.;
-               res->end   = 1.;
-       }
-
-       return res;
+    if (_hexaDocument == NULL)
+        return;
+
+    load(_hexaDocument->getName());
 }
 
 
 void DocumentModel::load( const QString& xmlFileName ) // Fill Data
 {
-  MESSAGE("HEXABLOCKGUI::load()  => "<<xmlFileName.toStdString());
-  _hexaDocument->loadXml(xmlFileName.toLocal8Bit().constData() );
-  clearAll();
+    _hexaDocument->loadXml(xmlFileName.toLocal8Bit().constData() );
+    clearAll();
 
-  fillData();
-  fillBuilder();
-  fillAssociation();
-  fillGroups();
-  fillMesh();
+    fillData();
+//    fillBuilder();
+    fillGeometry();
+    fillAssociation();
+    fillGroups();
+    fillMesh();
 
-  emit patternDataChanged();
+    emit patternDataChanged();
+}
 
-  // BUILDER, ASSOCIATION, GROUPS, ... CS_TODO _fillBuilderFrom( _hexaDocument );
+bool DocumentModel::isEmpty() const
+{
+    if (_hexaDocument == NULL) return true;
+    return _hexaDocument->isEmpty();
 }
 
 void DocumentModel::save( const QString& xmlFileName )
 {
-  MESSAGE("HEXABLOCKGUI::save()  => "<<xmlFileName.toStdString());
-  _hexaDocument->save( xmlFileName.toLocal8Bit().constData() );
+    _hexaDocument->save( xmlFileName.toLocal8Bit().constData() );
+}
+
+QString DocumentModel::getName()
+{
+    return _hexaDocument->getName();
 }
 
 void DocumentModel::updateData()
 {
-  clearData();
-  fillData();
-  clearMesh();
-  fillMesh();
-  emit patternDataChanged();
+    clearData();
+    fillData();
+    clearMesh();
+    fillMesh();
+    emit patternDataChanged();
+}
+
+void DocumentModel::updateGeomTree()
+{
+    clearGeometry();
+    fillGeometry();
+}
+
+QModelIndex DocumentModel::addElementsToTree(HEXA_NS::Elements* helts, QStandardItem* tree)
+{
+    QModelIndex eltIndex;
+    if (helts == NULL || tree == NULL)
+        return eltIndex;
+
+    updateData();
+    ElementsItem* eltsItem = new ElementsItem(helts);
+    tree->appendRow(eltsItem);
+
+    return eltsItem->index();
+}
+
+void DocumentModel::refresh()
+{
+    clearAll();
+
+    fillData();
+//    fillBuilder();
+    fillGeometry();
+    fillAssociation();
+    fillGroups();
+    fillMesh();
+
+    emit patternDataChanged();
 }
 
-void DocumentModel::clearAll() 
+void DocumentModel::clearAll()
 {
-  clearData();
-  clearBuilder();
-  clearAssociation();
-  clearGroups();
-  clearMesh();
-  //dataChanged( const QModelIndex & topLeft, const QModelIndex & bottomRight )
-  //CS_TODO : todo : association, groups, mesh
+    clearData();
+//    clearBuilder();
+    clearGeometry();
+    clearAssociation();
+    clearGroups();
+    clearMesh();
 }
 
 void DocumentModel::clearData()
 {
-  _vertexDirItem->removeRows( 0, _vertexDirItem->rowCount() );
-  _edgeDirItem->removeRows(0, _edgeDirItem->rowCount() );
-  _quadDirItem->removeRows(0, _quadDirItem->rowCount() );
-  _hexaDirItem->removeRows(0, _hexaDirItem->rowCount() );
+    _vertexDirItem->removeRows( 0, _vertexDirItem->rowCount() );
+    _edgeDirItem->removeRows(0, _edgeDirItem->rowCount() );
+    _quadDirItem->removeRows(0, _quadDirItem->rowCount() );
+    _hexaDirItem->removeRows(0, _hexaDirItem->rowCount() );
+
+    _vectorDirItem->removeRows(0, _vectorDirItem->rowCount() );
+    _elementsDirItem->removeRows(0, _elementsDirItem->rowCount() );
+    _crossElementsDirItem->removeRows(0, _crossElementsDirItem->rowCount() );
 }
 
 
-void DocumentModel::clearBuilder()
+//void DocumentModel::clearBuilder()
+//{
+//    _vectorDirItem->removeRows(0, _vectorDirItem->rowCount() );
+//    _elementsDirItem->removeRows(0, _elementsDirItem->rowCount() );
+//    _crossElementsDirItem->removeRows(0, _crossElementsDirItem->rowCount() );
+//}
+
+void DocumentModel::clearGeometry()
 {
-  _vectorDirItem->removeRows(0, _vectorDirItem->rowCount() );
-  _cylinderDirItem->removeRows(0, _cylinderDirItem->rowCount() );
-  _pipeDirItem->removeRows(0, _pipeDirItem->rowCount() );
-  _elementsDirItem->removeRows(0, _elementsDirItem->rowCount() );
-  _crossElementsDirItem->removeRows(0, _crossElementsDirItem->rowCount() );
+    _explicitShapesDirItem->removeRows(0, _explicitShapesDirItem->rowCount() );
+    _implicitShapesDirItem->removeRows(0, _implicitShapesDirItem->rowCount() );
+    _cloudOfPointsDirItem->removeRows(0, _cloudOfPointsDirItem->rowCount() );
 }
 
-void DocumentModel::clearAssociation() 
+void DocumentModel::clearAssociation()
 {
-  //CS_TODO
+    //CS_TODO
 }
 
 void DocumentModel::clearGroups()
 {
-  _groupDirItem->removeRows(0, _groupDirItem->rowCount() );
+    _groupDirItem->removeRows(0, _groupDirItem->rowCount() );
 }
 
 void DocumentModel::clearMesh()
 {
-  _lawDirItem->removeRows(0, _lawDirItem->rowCount() );
-  _propagationDirItem->removeRows(0, _propagationDirItem->rowCount() );
+    _lawDirItem->removeRows(0, _lawDirItem->rowCount() );
+    _propagationDirItem->removeRows(0, _propagationDirItem->rowCount() );
 }
 
 
 void DocumentModel::fillData()
 {
-  // DATA
-  HEXA_NS::Vertex *v     = NULL;
-  VertexItem      *vItem = NULL;
-  for ( int i=0; i<_hexaDocument->countVertex(); ++i ){
-    v = _hexaDocument->getVertex(i);
-
-    vItem = new VertexItem(v, _entry);
-    _vertexDirItem->appendRow(vItem);
-  }
-
-  HEXA_NS::Edge *e     = NULL;
-  EdgeItem      *eItem = NULL;
-  for ( int i=0; i<_hexaDocument->countEdge(); ++i ){
-    e = _hexaDocument->getEdge(i);
-    eItem = new EdgeItem(e, _entry);
-    _edgeDirItem->appendRow(eItem);
-  }
-
-  HEXA_NS::Quad *q     = NULL;
-  QuadItem      *qItem = NULL;
-  for ( int i=0; i<_hexaDocument->countQuad(); ++i ){
-    q = _hexaDocument->getQuad(i);
-    qItem = new QuadItem(q, _entry);
-    _quadDirItem->appendRow(qItem);
-  }
-
-  HEXA_NS::Hexa *h     = NULL;
-  HexaItem      *hItem = NULL;
-  for ( int i=0; i<_hexaDocument->countHexa(); ++i ){
-    h = _hexaDocument->getHexa(i);
-    hItem = new HexaItem(h, _entry);
-    _hexaDirItem->appendRow(hItem);
-  }
-}
-
-
-void DocumentModel::fillBuilder() 
-{
-  HEXA_NS::Vector *v     = NULL;
-  VectorItem      *vItem = NULL;
-  for ( int i=0; i<_hexaDocument->countVector(); ++i ){
-    v = _hexaDocument->getVector(i);
-    vItem = new VectorItem(v);
-    _vectorDirItem->appendRow(vItem);
-  }
-
-  //   _cylinderDirItem
-  HEXA_NS::Cylinder *c     = NULL;
-  CylinderItem      *cItem = NULL;
-  for ( int i=0; i<_hexaDocument->countCylinder(); ++i ){
-    c = _hexaDocument->getCylinder(i);
-    cItem = new CylinderItem(c, _entry);
-    _cylinderDirItem->appendRow(cItem);
-  }
-
-//   _pipeDirItem
-  HEXA_NS::Pipe *p     = NULL;
-  PipeItem      *pItem = NULL;
-  for ( int i=0; i<_hexaDocument->countPipe(); ++i ){
-    p = _hexaDocument->getPipe(i);
-    pItem = new PipeItem(p);
-    _pipeDirItem->appendRow(pItem);
-  }
+    PatternDataSelectionModel* pdsm = HEXABLOCKGUI::currentDocGView->getPatternDataSelectionModel();
+    if (pdsm == NULL)
+        return;
+    pdsm->clearHighlightedItems();
+
+    // DATA
+    HEXA_NS::Vertex *v     = NULL;
+    VertexItem      *vItem = NULL;
+    int nbVertex = _hexaDocument->countVertex();
+    for ( int i=0; i<nbVertex; ++i ){
+        v = _hexaDocument->getVertex(i);
+        vItem = new VertexItem(v, _entry);
+        _vertexDirItem->appendRow(vItem);
+    }
+
+    HEXA_NS::Edge *e     = NULL;
+    EdgeItem      *eItem = NULL;
+    int nbEdge = _hexaDocument->countEdge();
+    for ( int i=0; i<nbEdge; ++i ){
+        e = _hexaDocument->getEdge(i);
+        eItem = new EdgeItem(e, _entry);
+        _edgeDirItem->appendRow(eItem);
+    }
+
+    HEXA_NS::Quad *q     = NULL;
+    QuadItem      *qItem = NULL;
+    int nbQuad = _hexaDocument->countQuad();
+    for ( int i=0; i<nbQuad; ++i ){
+        q = _hexaDocument->getQuad(i);
+        qItem = new QuadItem(q, _entry);
+        _quadDirItem->appendRow(qItem);
+    }
+
+    HEXA_NS::Hexa *h     = NULL;
+    HexaItem      *hItem = NULL;
+    int nbHexa = _hexaDocument->countHexa();
+    for ( int i=0; i<nbHexa; ++i ){
+        h = _hexaDocument->getHexa(i);
+        hItem = new HexaItem(h, _entry);
+        _hexaDirItem->appendRow(hItem);
+    }
+
+    // +++++ Builder ++++++++++++++++++++++++++++++
+
+    HEXA_NS::Vector *vec     = NULL;
+    VectorItem      *vecItem = NULL;
+    int nbVector = _hexaDocument->countVector();
+    for ( int i=0; i<nbVector; ++i ){
+        vec = _hexaDocument->getVector(i);
+        vecItem = new VectorItem(vec);
+        _vectorDirItem->appendRow(vecItem);
+    }
+
+    //******* A VOIR AVEC ALAIN POUR LE REMPLISSAGE DE L'ARBRE ELEMENTS ET CROSSELEMENTS (ByCylinder) *******/
+    //******* OU SONT STOCKES LES ELEMENTS ET LES CROSSELEMENTS DANS LE DOCUMENT?                     ******/
+
+    //   _cylinderDirItem
+    //    HEXA_NS::Cylinder *c     = NULL;
+    //    HEXA_NS::Elements* c = NULL;
+    //    CylinderItem      *cItem = NULL;
+    //    ElementsItem* cItem = NULL;
+    //    int nbCylinder = _hexaDocument->countCylinder();
+    //    for ( int i=0; i<nbCylinder; ++i ){
+    //        c = _hexaDocument->getCylinder(i);
+    //        cItem = new CylinderItem(c, _entry);
+    //        cItem = new ElementsItem(c, _entry);
+    //        _cylinderDirItem->appendRow(cItem);
+    //        _elementsDirItem->appendRow(cItem);
+    //    }
+
+    //   _pipeDirItem
+    //    HEXA_NS::Pipe *p     = NULL;
+    //    HEXA_NS::Elements* p = NULL;
+    //    PipeItem      *pItem = NULL;
+    //    ElementsItem* pItem = NULL;
+    //    int nbPipe = _hexaDocument->countPipe();
+    //    for ( int i=0; i<nbPipe; ++i ){
+    //        p = _hexaDocument->getPipe(i);
+    //        pItem = new PipeItem(p);
+    //        pItem = new ElementsItem(p, _entry);
+    //        _pipeDirItem->appendRow(pItem);
+    //        _elementsDirItem->appendRow(pItem);
+    //    }
+    //********************************************************************************************************
+}
+
+
+//void DocumentModel::fillBuilder()
+//{
+//    HEXA_NS::Vector *v     = NULL;
+//    VectorItem      *vItem = NULL;
+//    int nbVector = _hexaDocument->countVector();
+//    for ( int i=0; i<nbVector; ++i ){
+//        v = _hexaDocument->getVector(i);
+//        vItem = new VectorItem(v);
+//        _vectorDirItem->appendRow(vItem);
+//    }
+//
+//    //******* A VOIR AVEC ALAIN POUR LE REMPLISSAGE DE L'ARBRE ELEMENTS ET CROSSELEMENTS (ByCylinder) *******/
+//    //******* OU SONT STOCKES LES ELEMENTS ET LES CROSSELEMENTS DANS LE DOCUMENT?                     ******/
+//
+//    //   _cylinderDirItem
+////    HEXA_NS::Cylinder *c     = NULL;
+////    HEXA_NS::Elements* c = NULL;
+////    CylinderItem      *cItem = NULL;
+////    ElementsItem* cItem = NULL;
+////    int nbCylinder = _hexaDocument->countCylinder();
+////    for ( int i=0; i<nbCylinder; ++i ){
+////        c = _hexaDocument->getCylinder(i);
+////        cItem = new CylinderItem(c, _entry);
+////        cItem = new ElementsItem(c, _entry);
+////        _cylinderDirItem->appendRow(cItem);
+////        _elementsDirItem->appendRow(cItem);
+////    }
+//
+//    //   _pipeDirItem
+////    HEXA_NS::Pipe *p     = NULL;
+////    HEXA_NS::Elements* p = NULL;
+////    PipeItem      *pItem = NULL;
+////    ElementsItem* pItem = NULL;
+////    int nbPipe = _hexaDocument->countPipe();
+////    for ( int i=0; i<nbPipe; ++i ){
+////        p = _hexaDocument->getPipe(i);
+////        pItem = new PipeItem(p);
+////        pItem = new ElementsItem(p, _entry);
+////        _pipeDirItem->appendRow(pItem);
+////        _elementsDirItem->appendRow(pItem);
+////    }
+//    //********************************************************************************************************
+//}
+
+void DocumentModel::fillGeometry()
+{
+    PatternGeomSelectionModel* pgsm = HEXABLOCKGUI::currentDocGView->getPatternGeomSelectionModel();
+    if (_hexaDocument == NULL /*|| isEmpty()*/ || pgsm == NULL)
+        return;
+
+    HEXA_NS::NewShape* shape;
+    HEXA_NS::VertexShape* node;
+    HEXA_NS::EdgeShape* line;
+    HEXA_NS::FaceShape* face;
+    TopoDS_Compound vertexCompound;
+    BRep_Builder compoundBuilder;
+
+    // * fill the shape tree
+
+    shapeById.clear();
+    pgsm->clearHighlightedItems();
+    QMap<QString, TopoDS_Shape> topo_shapes;
+    int nbShapes = _hexaDocument->countShape();
+    for (int i=0; i < nbShapes; ++i)
+    {
+        shape = _hexaDocument->getShape(i);
+        QString shapeName = shape->getName();
+        if (!docShapesEntry.contains(shapeName))
+        {
+            if (shape->getOrigin() == HEXA_NS::SH_CLOUD)
+            {
+                compoundBuilder.MakeCompound(vertexCompound);
+                topo_shapes[shapeName] = vertexCompound;
+            }
+            else
+                topo_shapes[shapeName] = shape->getShape();
+        }
+
+        GeomShapeItem* shItem = new GeomShapeItem(shape);
+        if (shape->getOrigin() == HEXA_NS::SH_IMPORT)
+            // * explicit shapes
+            _explicitShapesDirItem->appendRow(shItem);
+        else
+            // * implicit shapes
+            _implicitShapesDirItem->appendRow(shItem);
+
+        //add vertices to the tree
+        QStandardItem* geomPointDirItem = NULL;
+        if (shape->getOrigin() != HEXA_NS::SH_CLOUD)
+        {
+            geomPointDirItem = new QStandardItem(tr("TREE_ITEM_VERTEX"));
+            geomPointDirItem->setData( GEOMPOINT_DIR_TREE, HEXA_TREE_ROLE );
+        }
+        if (geomPointDirItem != NULL)
+            shItem->appendRow(geomPointDirItem);
+        int nbVertexShape = shape->countVertex();
+        for (int j=0; j < nbVertexShape; ++j)
+        {
+            node = shape->getVertexShape(j);
+            GeomPointItem* gPointItem = new GeomPointItem(node);
+            if (geomPointDirItem != NULL)
+                geomPointDirItem->appendRow(gPointItem);
+            else
+                shItem->appendRow(gPointItem);
+            shapeById[shapeName+","+QString::number(node->getIdent())] = node;
+
+            // * update the compound of vertices
+            if (shape->getOrigin() == HEXA_NS::SH_CLOUD && !vertexCompound.IsNull())
+                compoundBuilder.Add(topo_shapes[shapeName], node->getShape());
+        }
+
+        if (shape->getOrigin() == HEXA_NS::SH_CLOUD)
+            continue; // * it's a cloud of points, there's no edges and no quads to fill
+
+        //add edges to the tree
+        QStandardItem* geomEdgeDirItem = new QStandardItem(tr("TREE_ITEM_EDGE"));
+        geomEdgeDirItem->setData( GEOMEDGE_DIR_TREE, HEXA_TREE_ROLE );
+        shItem->appendRow(geomEdgeDirItem);
+        int nbEdgeShape = shape->countEdge();
+        for (int j = 0; j < nbEdgeShape; ++j)
+        {
+            line = shape->getEdgeShape(j);
+            GeomEdgeItem* gEdgeItem = new GeomEdgeItem(line);
+            geomEdgeDirItem->appendRow(gEdgeItem);
+            shapeById[shapeName+","+QString::number(line->getIdent())] = line;
+        }
+
+        //add faces to the tree
+        QStandardItem* geomFaceDirItem = new QStandardItem(tr("TREE_ITEM_QUAD"));
+        geomFaceDirItem->setData( GEOMFACE_DIR_TREE, HEXA_TREE_ROLE );
+        shItem->appendRow(geomFaceDirItem);
+        int nbFaceShape = shape->countFace();
+        for (int j = 0; j < nbFaceShape; ++j)
+        {
+            face = shape->getFaceShape(j);
+            GeomFaceItem* gFaceItem = new GeomFaceItem(face);
+            geomFaceDirItem->appendRow(gFaceItem);
+            shapeById[shapeName+","+QString::number(face->getIdent())] = face;
+        }
+    }
+
+    if (topo_shapes.size() == 0)
+        return;
+
+    // * register shapes
+    HEXABLOCKGUI* module = HEXABLOCKGUI::getInstance();
+    if (module != NULL)
+        module->addInStudy(topo_shapes, docShapesEntry, docShapesName);
 }
+
 void DocumentModel::fillAssociation()
 {
-
 }
 
 //------------------------------------------- NEW ITEMS
@@ -354,7 +665,8 @@ void DocumentModel::fillAssociation()
 //{
 //  HEXA_NS::Group *g     = NULL;
 //  GroupItem      *gItem = NULL;
-//  for ( int i=0; i<_hexaDocument->countGroup(); ++i ){
+//  int nbGroup = _hexaDocument->countGroup();
+//  for ( int i=0; i<nbGroup; ++i ){
 //    g = _hexaDocument->getGroup(i);
 //    gItem = new GroupItem(g, _entry);
 //    _groupDirItem->appendRow(gItem);
@@ -365,7 +677,8 @@ void DocumentModel::fillAssociation()
 //{
 //  HEXA_NS::Law *l     = NULL;
 //  LawItem      *lItem = NULL;
-//  for ( int i=0; i<_hexaDocument->countLaw(); ++i ){
+//  int nbLaw = _hexaDocument->countLaw();
+//  for ( int i=0; i<nbLaw; ++i ){
 //    l = _hexaDocument->getLaw(i);
 //    lItem = new LawItem(l);
 //    _lawDirItem->appendRow(lItem);
@@ -373,7 +686,8 @@ void DocumentModel::fillAssociation()
 //
 //  HEXA_NS::Propagation *p     = NULL;
 //  PropagationItem      *pItem = NULL;
-//  for ( int i=0; i<_hexaDocument->countPropagation(); ++i ){
+//  int nbPropagation = _hexaDocument->countPropagation();
+//  for ( int i=0; i<nbPropagation; ++i ){
 //    p = _hexaDocument->getPropagation(i);
 //    pItem = new PropagationItem(p, _entry);
 //    pItem->setText(QString("Propagation%1").arg(i) );
@@ -384,94 +698,92 @@ void DocumentModel::fillAssociation()
 
 void DocumentModel::fillGroups()
 {
-  HEXA_NS::Group *g     = NULL;
-  GroupItem      *gItem = NULL;
-  for ( int i=0; i<_hexaDocument->countGroup(); ++i ){
-    g = _hexaDocument->getGroup(i);
-    //std::cout<<"getGroup => "<< i << std::endl;
-    gItem = new GroupItem(g);
-    gItem->setData( _entry, HEXA_DOC_ENTRY_ROLE );
-    _groupDirItem->appendRow(gItem);
-  } 
+    HEXA_NS::Group *g     = NULL;
+    GroupItem      *gItem = NULL;
+    int nbGroup = _hexaDocument->countGroup();
+    for ( int i=0; i<nbGroup; ++i ){
+        g = _hexaDocument->getGroup(i);
+        //std::cout<<"getGroup => "<< i << std::endl;
+        gItem = new GroupItem(g);
+        gItem->setData( _entry, HEXA_DOC_ENTRY_ROLE );
+        _groupDirItem->appendRow(gItem);
+    }
 }
 
 void DocumentModel::fillMesh()
 {
-  //   _lawDirItem
-  HEXA_NS::Law *l     = NULL;
-  LawItem      *lItem = NULL;
-  for ( int i=0; i<_hexaDocument->countLaw(); ++i ){
-    l = _hexaDocument->getLaw(i);
-    lItem = new LawItem(l);
-    _lawDirItem->appendRow(lItem);
-  }
-
-  //   _propagationDirItem
-  HEXA_NS::Propagation *p     = NULL;
-  PropagationItem      *pItem = NULL;
-  for ( int i=0; i<_hexaDocument->countPropagation(); ++i ){
-    p = _hexaDocument->getPropagation(i);
-    pItem = new PropagationItem(p);
-    pItem->setText(QString("Propagation%1").arg(i) );
-    pItem->setData( _entry, HEXA_DOC_ENTRY_ROLE );
-    _propagationDirItem->appendRow(pItem);
-  }
+    //   _lawDirItem
+    HEXA_NS::Law *l     = NULL;
+    LawItem      *lItem = NULL;
+    int nbLaw = _hexaDocument->countLaw();
+    for ( int i=0; i<nbLaw; ++i ){
+        l = _hexaDocument->getLaw(i);
+        lItem = new LawItem(l);
+        _lawDirItem->appendRow(lItem);
+    }
+
+    //   _propagationDirItem
+    HEXA_NS::Propagation *p     = NULL;
+    PropagationItem      *pItem = NULL;
+    int nbPropagation = _hexaDocument->countPropagation();
+    for ( int i=0; i<nbPropagation; ++i ){
+        p = _hexaDocument->getPropagation(i);
+        pItem = new PropagationItem(p);
+        pItem->setText(QString("Propagation%1").arg(i) );
+        pItem->setData( _entry, HEXA_DOC_ENTRY_ROLE );
+        _propagationDirItem->appendRow(pItem);
+    }
 }
 
 HEXA_NS::Hexa* DocumentModel::getQuadHexa(HEXA_NS::Quad* quad)
 {
-       HEXA_NS::Hexa* hexa;
-       for ( int i=0; i<_hexaDocument->countHexa(); ++i ){
-               hexa = _hexaDocument->getHexa(i);
-               if (hexa->findQuad(quad) > -1) return hexa;
-       }
-       return NULL;
+    HEXA_NS::Hexa* hexa;
+    int nbHexa = _hexaDocument->countHexa();
+    for ( int i=0; i<nbHexa; ++i ){
+        hexa = _hexaDocument->getHexa(i);
+        if (hexa->findQuad(quad) > -1) return hexa;
+    }
+    return NULL;
 }
 
 
 Qt::ItemFlags DocumentModel::flags(const QModelIndex &index) const
 {
-  Qt::ItemFlags flags;
+    Qt::ItemFlags flags;
 
-  if (!index.isValid()) return Qt::ItemIsEnabled;
+    if (!index.isValid()) return Qt::ItemIsEnabled;
 
-  if ( _disallowEdition ){
-    return QAbstractItemModel::flags(index) | Qt::ItemFlags( ~Qt::ItemIsEditable );
-  } else {
-    return QAbstractItemModel::flags(index) | Qt::ItemIsEditable;
-  }
+    if ( _disallowEdition ){
+        return QAbstractItemModel::flags(index) | Qt::ItemFlags( ~Qt::ItemIsEditable );
+    } else {
+        return QAbstractItemModel::flags(index) | Qt::ItemIsEditable;
+    }
 }
 
 void DocumentModel::allowEdition()
 {
-  MESSAGE("DocumentModel::allowEdition(){");
-  _disallowEdition = false;
-  MESSAGE("}");
+    _disallowEdition = false;
 }
 
 void DocumentModel::disallowEdition()
 {
-  MESSAGE("DocumentModel::disallowEdition (){");
-  _disallowEdition = true;
-  MESSAGE("}");
+    _disallowEdition = true;
 }
 
 void DocumentModel::allowDataSelectionOnly()
 {
-  _vertexItemFlags = Qt::ItemFlags( ~Qt::ItemIsEditable );
-  _edgeItemFlags   = Qt::ItemFlags( ~Qt::ItemIsEditable );
-  _quadItemFlags   = Qt::ItemFlags( ~Qt::ItemIsEditable );
-  _hexaItemFlags   = Qt::ItemFlags( ~Qt::ItemIsEditable );
+    _vertexItemFlags = Qt::ItemFlags( ~Qt::ItemIsEditable );
+    _edgeItemFlags   = Qt::ItemFlags( ~Qt::ItemIsEditable );
+    _quadItemFlags   = Qt::ItemFlags( ~Qt::ItemIsEditable );
+    _hexaItemFlags   = Qt::ItemFlags( ~Qt::ItemIsEditable );
 
-  _vectorItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
-  _cylinderItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
-  _pipeItemFlags     = Qt::ItemFlags( ~Qt::ItemIsEnabled );
-  _elementsItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
-  _crossElementsItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
+    _vectorItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
+    _elementsItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
+    _crossElementsItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
 
-  _groupItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
-  _lawItemFlags   = Qt::ItemFlags( ~Qt::ItemIsEnabled );
-  _propagationItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
+    _groupItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
+    _lawItemFlags   = Qt::ItemFlags( ~Qt::ItemIsEnabled );
+    _propagationItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
 }
 
 void DocumentModel::allowVertexSelectionOnly()
@@ -482,8 +794,6 @@ void DocumentModel::allowVertexSelectionOnly()
     _hexaItemFlags   = Qt::ItemFlags( ~Qt::ItemIsEditable );
 
     _vectorItemFlags = Qt::ItemFlags( ~Qt::ItemIsEditable );
-    _cylinderItemFlags = Qt::ItemFlags( ~Qt::ItemIsEditable );
-    _pipeItemFlags     = Qt::ItemFlags( ~Qt::ItemIsEditable );
     _elementsItemFlags = Qt::ItemFlags( ~Qt::ItemIsEditable );
     _crossElementsItemFlags = Qt::ItemFlags( ~Qt::ItemIsEditable );
 
@@ -491,2342 +801,2439 @@ void DocumentModel::allowVertexSelectionOnly()
     _lawItemFlags   = Qt::ItemFlags( ~Qt::ItemIsEditable );
     _propagationItemFlags = Qt::ItemFlags( ~Qt::ItemIsEditable );
 
-//     emit layoutChanged();
+    //     emit layoutChanged();
 }
 
 void DocumentModel::allowEdgeSelectionOnly()
 {
-  _vertexItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
-  _edgeItemFlags   = Qt::ItemFlags( ~Qt::ItemIsEditable );
-  _quadItemFlags   = Qt::ItemFlags( ~Qt::ItemIsEnabled );
-  _hexaItemFlags   = Qt::ItemFlags( ~Qt::ItemIsEnabled );
+    _vertexItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
+    _edgeItemFlags   = Qt::ItemFlags( ~Qt::ItemIsEditable );
+    _quadItemFlags   = Qt::ItemFlags( ~Qt::ItemIsEnabled );
+    _hexaItemFlags   = Qt::ItemFlags( ~Qt::ItemIsEnabled );
 
-  _vectorItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
-  _cylinderItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
-  _pipeItemFlags     = Qt::ItemFlags( ~Qt::ItemIsEnabled );
-  _elementsItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
-  _crossElementsItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
-  
-  _groupItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
-  _lawItemFlags   = Qt::ItemFlags( ~Qt::ItemIsEnabled );
-  _propagationItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
+    _vectorItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
+    _elementsItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
+    _crossElementsItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
+
+    _groupItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
+    _lawItemFlags   = Qt::ItemFlags( ~Qt::ItemIsEnabled );
+    _propagationItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
 }
 
 void DocumentModel::allowQuadSelectionOnly()
 {
-  _vertexItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
-  _edgeItemFlags   = Qt::ItemFlags( ~Qt::ItemIsEnabled );
-  _quadItemFlags = Qt::ItemFlags( ~Qt::ItemIsEditable );
-  _hexaItemFlags   = Qt::ItemFlags( ~Qt::ItemIsEnabled );
+    _vertexItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
+    _edgeItemFlags   = Qt::ItemFlags( ~Qt::ItemIsEnabled );
+    _quadItemFlags = Qt::ItemFlags( ~Qt::ItemIsEditable );
+    _hexaItemFlags   = Qt::ItemFlags( ~Qt::ItemIsEnabled );
 
-  _vectorItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
-  _cylinderItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
-  _pipeItemFlags     = Qt::ItemFlags( ~Qt::ItemIsEnabled );
-  _elementsItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
-  _crossElementsItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
+    _vectorItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
+    _elementsItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
+    _crossElementsItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
 
-  _groupItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
-  _lawItemFlags   = Qt::ItemFlags( ~Qt::ItemIsEnabled );
-  _propagationItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
+    _groupItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
+    _lawItemFlags   = Qt::ItemFlags( ~Qt::ItemIsEnabled );
+    _propagationItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
 }
 
 void DocumentModel::allowHexaSelectionOnly()
 {
-  _vertexItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
-  _edgeItemFlags   = Qt::ItemFlags( ~Qt::ItemIsEnabled );
-  _quadItemFlags   = Qt::ItemFlags( ~Qt::ItemIsEnabled );
-  _hexaItemFlags   = Qt::ItemFlags( ~Qt::ItemIsEditable );
+    _vertexItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
+    _edgeItemFlags   = Qt::ItemFlags( ~Qt::ItemIsEnabled );
+    _quadItemFlags   = Qt::ItemFlags( ~Qt::ItemIsEnabled );
+    _hexaItemFlags   = Qt::ItemFlags( ~Qt::ItemIsEditable );
 
-  _vectorItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
-  _cylinderItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
-  _pipeItemFlags     = Qt::ItemFlags( ~Qt::ItemIsEnabled );
-  _elementsItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
-  _crossElementsItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
+    _vectorItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
+    _elementsItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
+    _crossElementsItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
 
-  _groupItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
-  _lawItemFlags   = Qt::ItemFlags( ~Qt::ItemIsEnabled );
-  _propagationItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
+    _groupItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
+    _lawItemFlags   = Qt::ItemFlags( ~Qt::ItemIsEnabled );
+    _propagationItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
 }
 
 void DocumentModel::allowVectorSelectionOnly()
 {
-  _vertexItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
-  _edgeItemFlags   = Qt::ItemFlags( ~Qt::ItemIsEnabled );
-  _quadItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
-  _hexaItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
+    _vertexItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
+    _edgeItemFlags   = Qt::ItemFlags( ~Qt::ItemIsEnabled );
+    _quadItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
+    _hexaItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
 
-  _vectorItemFlags   = Qt::ItemFlags( ~Qt::ItemIsEditable );
-  _cylinderItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
-  _pipeItemFlags     = Qt::ItemFlags( ~Qt::ItemIsEnabled );
-  _elementsItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
-  _crossElementsItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
+    _vectorItemFlags   = Qt::ItemFlags( ~Qt::ItemIsEditable );
+    _elementsItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
+    _crossElementsItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
 
-  _groupItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
-  _lawItemFlags   = Qt::ItemFlags( ~Qt::ItemIsEnabled );
-  _propagationItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
+    _groupItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
+    _lawItemFlags   = Qt::ItemFlags( ~Qt::ItemIsEnabled );
+    _propagationItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
 }
 
 void DocumentModel::allowCylinderSelectionOnly()
 {
-  _vertexItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
-  _edgeItemFlags   = Qt::ItemFlags( ~Qt::ItemIsEnabled );
-  _quadItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
-  _hexaItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
+    _vertexItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
+    _edgeItemFlags   = Qt::ItemFlags( ~Qt::ItemIsEnabled );
+    _quadItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
+    _hexaItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
 
-  _vectorItemFlags   = Qt::ItemFlags( ~Qt::ItemIsEnabled );
-  _cylinderItemFlags = Qt::ItemFlags( ~Qt::ItemIsEditable );
-  _pipeItemFlags     = Qt::ItemFlags( ~Qt::ItemIsEnabled );
-  _elementsItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
-  _crossElementsItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
+    _vectorItemFlags   = Qt::ItemFlags( ~Qt::ItemIsEnabled );
+    _elementsItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
+    _crossElementsItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
 
-  _groupItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
-  _lawItemFlags   = Qt::ItemFlags( ~Qt::ItemIsEnabled );
-  _propagationItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
+    _groupItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
+    _lawItemFlags   = Qt::ItemFlags( ~Qt::ItemIsEnabled );
+    _propagationItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
 }
 
 void DocumentModel::allowPipeSelectionOnly()
 {
-  _vertexItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
-  _edgeItemFlags   = Qt::ItemFlags( ~Qt::ItemIsEnabled );
-  _quadItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
-  _hexaItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
+    _vertexItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
+    _edgeItemFlags   = Qt::ItemFlags( ~Qt::ItemIsEnabled );
+    _quadItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
+    _hexaItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
 
-  _vectorItemFlags   = Qt::ItemFlags( ~Qt::ItemIsEnabled );
-  _cylinderItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
-  _pipeItemFlags     = Qt::ItemFlags( ~Qt::ItemIsEditable );
-  _elementsItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
-  _crossElementsItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
+    _vectorItemFlags   = Qt::ItemFlags( ~Qt::ItemIsEnabled );
+    _elementsItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
+    _crossElementsItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
 
-  _groupItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
-  _lawItemFlags   = Qt::ItemFlags( ~Qt::ItemIsEnabled );
-  _propagationItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
+    _groupItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
+    _lawItemFlags   = Qt::ItemFlags( ~Qt::ItemIsEnabled );
+    _propagationItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
 }
 
 void DocumentModel::allowElementsSelectionOnly()
 {
-  _vertexItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
-  _edgeItemFlags   = Qt::ItemFlags( ~Qt::ItemIsEnabled );
-  _quadItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
-  _hexaItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
+    _vertexItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
+    _edgeItemFlags   = Qt::ItemFlags( ~Qt::ItemIsEnabled );
+    _quadItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
+    _hexaItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
 
-  _vectorItemFlags   = Qt::ItemFlags( ~Qt::ItemIsEnabled );
-  _cylinderItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
-  _pipeItemFlags     = Qt::ItemFlags( ~Qt::ItemIsEnabled );
-  _elementsItemFlags = Qt::ItemFlags( ~Qt::ItemIsEditable );
-  _crossElementsItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
+    _vectorItemFlags   = Qt::ItemFlags( ~Qt::ItemIsEnabled );
+    _elementsItemFlags = Qt::ItemFlags( ~Qt::ItemIsEditable );
+    _crossElementsItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
 
-  _groupItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
-  _lawItemFlags   = Qt::ItemFlags( ~Qt::ItemIsEnabled );
-  _propagationItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
+    _groupItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
+    _lawItemFlags   = Qt::ItemFlags( ~Qt::ItemIsEnabled );
+    _propagationItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
 }
 
+/**********************************************************
 void DocumentModel::allowCrossElementsSelectionOnly()
 {
-  _vertexItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
-  _edgeItemFlags   = Qt::ItemFlags( ~Qt::ItemIsEnabled );
-  _quadItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
-  _hexaItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
+    _vertexItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
+    _edgeItemFlags   = Qt::ItemFlags( ~Qt::ItemIsEnabled );
+    _quadItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
+    _hexaItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
 
-  _vectorItemFlags   = Qt::ItemFlags( ~Qt::ItemIsEnabled );
-  _cylinderItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
-  _pipeItemFlags     = Qt::ItemFlags( ~Qt::ItemIsEnabled );
-  _elementsItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
-  _crossElementsItemFlags = Qt::ItemFlags( ~Qt::ItemIsEditable );
+    _vectorItemFlags   = Qt::ItemFlags( ~Qt::ItemIsEnabled );
+    _elementsItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
+    _crossElementsItemFlags = Qt::ItemFlags( ~Qt::ItemIsEditable );
 
-  _groupItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
-  _lawItemFlags   = Qt::ItemFlags( ~Qt::ItemIsEnabled );
-  _propagationItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
+    _groupItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
+    _lawItemFlags   = Qt::ItemFlags( ~Qt::ItemIsEnabled );
+    _propagationItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
 }
+ ********************************************************** */
 
 void DocumentModel::allowLawSelectionOnly()
 {
-  _vertexItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
-  _edgeItemFlags   = Qt::ItemFlags( ~Qt::ItemIsEnabled );
-  _quadItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
-  _hexaItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
+    _vertexItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
+    _edgeItemFlags   = Qt::ItemFlags( ~Qt::ItemIsEnabled );
+    _quadItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
+    _hexaItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
 
-  _vectorItemFlags   = Qt::ItemFlags( ~Qt::ItemIsEnabled );
-  _cylinderItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
-  _pipeItemFlags     = Qt::ItemFlags( ~Qt::ItemIsEnabled );
-  _elementsItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
-  _crossElementsItemFlags = Qt::ItemFlags( Qt::ItemIsEnabled );
+    _vectorItemFlags   = Qt::ItemFlags( ~Qt::ItemIsEnabled );
+    _elementsItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
+    _crossElementsItemFlags = Qt::ItemFlags( Qt::ItemIsEnabled );
 
-  _groupItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
-  _lawItemFlags   = Qt::ItemFlags( ~Qt::ItemIsEditable );
-  _propagationItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
+    _groupItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
+    _lawItemFlags   = Qt::ItemFlags( ~Qt::ItemIsEditable );
+    _propagationItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
 }
 
 
 void DocumentModel::setName( const QModelIndex& iElt, const QString& name )
 {
-       HEXA_NS::EltBase *elt = NULL;
+    HEXA_NS::EltBase *elt = NULL;
 
-       switch ( data(iElt, HEXA_TREE_ROLE).toInt() ){
-       case GROUP_TREE :
-       {
-               HEXA_NS::Group* grp = iElt.data( HEXA_DATA_ROLE ).value< HEXA_NS::Group* >();
-               grp->setName( name.toLatin1().data() );
-               break;
-       }
-       case LAW_TREE :
-       {
-               HEXA_NS::Law* l = iElt.data( HEXA_DATA_ROLE ).value< HEXA_NS::Law* >();
-               l->setName( name.toLatin1().data() );
-               break;
-       }
-       //   case PROPAGATION_TREE : elt = iElt.data( HEXA_DATA_ROLE ).value< HEXA_NS::Propagation* >(); break;
-       default: elt = getHexaPtr(iElt);
-       }
+    switch ( data(iElt, HEXA_TREE_ROLE).toInt() ){
+    case GROUP_TREE :
+    {
+        HEXA_NS::Group* grp = iElt.data( HEXA_DATA_ROLE ).value< HEXA_NS::Group* >();
+        grp->setName( name.toLatin1().data() );
+        break;
+    }
+    case LAW_TREE :
+    {
+        HEXA_NS::Law* l = iElt.data( HEXA_DATA_ROLE ).value< HEXA_NS::Law* >();
+        l->setName( name.toLatin1().data() );
+        break;
+    }
+    //   case PROPAGATION_TREE : elt = iElt.data( HEXA_DATA_ROLE ).value< HEXA_NS::Propagation* >(); break;
+    default: elt = getHexaPtr(iElt);
+    }
 
-       if ( elt != NULL ) elt->setName( name.toStdString() );
-       setData( iElt, name );
+    if ( elt != NULL ) elt->setName( name.toStdString() );
+    setData( iElt, name );
 
 }
 
 bool DocumentModel::clearEltAssociations( const QModelIndex& iElt )
 {
-  bool isOk = false;
-  HEXA_NS::EltBase *elt = getHexaPtr(iElt);
+    bool isOk = false;
+    HEXA_NS::EltBase *elt = getHexaPtr(iElt);
+
+    if ( elt != NULL ){
+        elt->clearAssociation();
+        setData( iElt, QVariant(), HEXA_ASSOC_ENTRY_ROLE );
+        isOk = true;
+    }
+
+    return isOk;
+}
+
+void DocumentModel::clearAssociation(HEXA_NS::EnumElt& eltType)
+{
+    if (_hexaDocument != NULL)
+        _hexaDocument->clearAssociation(eltType);
 
-  if ( elt != NULL ){
-    elt->clearAssociation();
-    setData( iElt, QVariant(), HEXA_ASSOC_ENTRY_ROLE );
-    isOk = true;
-  }
+    QModelIndex iElt;
+    HEXA_NS::Vertex* vertex;
+    HEXA_NS::Edge* edge;
+    HEXA_NS::Quad* quad;
+    int nbElts;
 
-  return isOk;
+    if (HEXABLOCKGUI::currentDocGView == NULL) return;
+    PatternDataSelectionModel* pdsm = HEXABLOCKGUI::currentDocGView->getPatternDataSelectionModel();
+    PatternDataModel* pdm = HEXABLOCKGUI::currentDocGView->getPatternDataModel();
+    if (pdsm == NULL || pdm == NULL) return;
+
+    //update associations in the model
+    if (eltType == HEXA_NS::EL_VERTEX)
+    {
+        nbElts = _hexaDocument->countVertex();
+        for (int i = 0; i < nbElts; ++i)
+        {
+            vertex = _hexaDocument->getVertex(i);
+            iElt = pdm->mapToSource(pdsm->indexBy(HEXA_DATA_ROLE, QVariant::fromValue(vertex)));
+            if (iElt.isValid())
+                setData( iElt, QVariant(), HEXA_ASSOC_ENTRY_ROLE );
+        }
+    }
+    else if (eltType == HEXA_NS::EL_EDGE)
+    {
+        nbElts = _hexaDocument->countEdge();
+        for (int i = 0; i < nbElts; ++i)
+        {
+            edge = _hexaDocument->getEdge(i);
+            iElt = pdm->mapToSource(pdsm->indexBy(HEXA_DATA_ROLE, QVariant::fromValue(edge)));
+            if (iElt.isValid())
+                setData( iElt, QVariant(), HEXA_ASSOC_ENTRY_ROLE );
+        }
+    }
+    else if (eltType == HEXA_NS::EL_QUAD)
+    {
+        nbElts = _hexaDocument->countQuad();
+        for (int i = 0; i < nbElts; ++i)
+        {
+            quad = _hexaDocument->getQuad(i);
+            iElt = pdm->mapToSource(pdsm->indexBy(HEXA_DATA_ROLE, QVariant::fromValue(quad)));
+            if (iElt.isValid())
+                setData( iElt, QVariant(), HEXA_ASSOC_ENTRY_ROLE );
+        }
+    }
 }
 
+
 QModelIndex DocumentModel::addVertex( double x, double y, double z )
 {
-  QModelIndex vertexIndex;
+    QModelIndex vertexIndex;
+
+    HEXA_NS::Vertex* hv = _hexaDocument->addVertex(x, y, z);
+    if (BadElement(hv)) return vertexIndex;
 
-  HEXA_NS::Vertex* hv = _hexaDocument->addVertex(x, y, z);
-  if ( hv->isValid() ){
     VertexItem* v = new VertexItem(hv, _entry);
     _vertexDirItem->appendRow(v);
     vertexIndex = v->index();
     emit patternDataChanged();
-  } else {
-    delete hv;
-  }
 
-  return vertexIndex;
+    return vertexIndex;
 }
 
 QModelIndex DocumentModel::addEdgeVertices (const QModelIndex &i_v0, const QModelIndex &i_v1 )
 {
-  QModelIndex edgeIndex;
+    QModelIndex edgeIndex;
 
-  HEXA_NS::Vertex* hv0 = getHexaPtr<HEXA_NS::Vertex*>(i_v0);
-  HEXA_NS::Vertex* hv1 = getHexaPtr<HEXA_NS::Vertex*>(i_v1);
+    HEXA_NS::Vertex* hv0 = getHexaPtr<HEXA_NS::Vertex*>(i_v0);
+    HEXA_NS::Vertex* hv1 = getHexaPtr<HEXA_NS::Vertex*>(i_v1);
 
-  HEXA_NS::Edge* he = _hexaDocument->addEdge( hv0, hv1 );
+    HEXA_NS::Edge* he = _hexaDocument->addEdge( hv0, hv1 );
+    if ( BadElement(he) ) return edgeIndex;
 
-  if ( he->isValid() ){
     EdgeItem* e = new EdgeItem(he, _entry);
     _edgeDirItem->appendRow(e);
     edgeIndex = e->index();
     emit patternDataChanged();
-  } else {
-    delete he;
-  }
-  return edgeIndex;
+
+    return edgeIndex;
 }
 
 QModelIndex DocumentModel::addEdgeVector( const QModelIndex &i_v, const QModelIndex &i_vec )
 {
-  QModelIndex edgeIndex;
+    QModelIndex edgeIndex;
 
-  HEXA_NS::Vertex* hv   = getHexaPtr<HEXA_NS::Vertex*>(i_v);
-  HEXA_NS::Vector* hvec = getHexaPtr<HEXA_NS::Vector*>(i_vec);
+    HEXA_NS::Vertex* hv   = getHexaPtr<HEXA_NS::Vertex*>(i_v);
+    HEXA_NS::Vector* hvec = getHexaPtr<HEXA_NS::Vector*>(i_vec);
 
-  if (!hv || !hvec) return edgeIndex;
+    if (hv == NULL || hvec == NULL) return edgeIndex;
 
-  HEXA_NS::Edge* he = _hexaDocument->addEdge( hv, hvec );
-  if (!he) return edgeIndex;
-  HEXA_NS::Vertex* hv2 = he->getAval(); //the new vertex resulting from the creation of the edge
-  if (!hv2) return edgeIndex;
+    HEXA_NS::Edge* he = _hexaDocument->addEdgeVector( hv, hvec );
+    if ( BadElement(he) ) return edgeIndex;
 
-  //ADD the elements in the treeview
-  if ( he->isValid() ){
-       //The Edge
+    HEXA_NS::Vertex* hv2 = he->getAval(); //the new vertex resulting from the creation of the edge
+    if (hv2 == NULL) return edgeIndex;
+
+    //ADD the edge in the treeview
     EdgeItem* e = new EdgeItem(he, _entry);
     _edgeDirItem->appendRow(e);
+    edgeIndex = e->index();
 
-    //The Vertex
+    //The resulting Vertex
     VertexItem* v = new VertexItem(hv2, _entry);
     _vertexDirItem->appendRow(v);
 
-    edgeIndex = e->index();
     emit patternDataChanged();
-  } else
-    delete he;
 
-  return edgeIndex;
+    return edgeIndex;
 }
 
 QModelIndex DocumentModel::addQuadVertices( const QModelIndex &i_v0, const QModelIndex &i_v1,
-                                            const QModelIndex &i_v2, const QModelIndex &i_v3 )
+        const QModelIndex &i_v2, const QModelIndex &i_v3 )
 { //CS_TODO : gestion erreur
-  QModelIndex quadIndex;
-
-  HEXA_NS::Vertex* hv0 = getHexaPtr<HEXA_NS::Vertex*>(i_v0);
-  HEXA_NS::Vertex* hv1 = getHexaPtr<HEXA_NS::Vertex*>(i_v1);
-  HEXA_NS::Vertex* hv2 = getHexaPtr<HEXA_NS::Vertex*>(i_v2);
-  HEXA_NS::Vertex* hv3 = getHexaPtr<HEXA_NS::Vertex*>(i_v3);
-
-  if ( hv0 and hv1 and hv2 and hv3 ){
-    HEXA_NS::Quad* hq = _hexaDocument->addQuadVertices( hv0, hv1, hv2, hv3 );
-    if ( hq->isValid() ){
-      QuadItem* q = new QuadItem(hq, _entry);
-      _quadDirItem->appendRow(q);
-      quadIndex = q->index();
-      emit patternDataChanged();
-    } else {
-      delete hq;
+    QModelIndex quadIndex;
+
+    HEXA_NS::Vertex* hv0 = getHexaPtr<HEXA_NS::Vertex*>(i_v0);
+    HEXA_NS::Vertex* hv1 = getHexaPtr<HEXA_NS::Vertex*>(i_v1);
+    HEXA_NS::Vertex* hv2 = getHexaPtr<HEXA_NS::Vertex*>(i_v2);
+    HEXA_NS::Vertex* hv3 = getHexaPtr<HEXA_NS::Vertex*>(i_v3);
+
+    if ( hv0 && hv1 && hv2 && hv3 ){
+        HEXA_NS::Quad* hq = _hexaDocument->addQuadVertices( hv0, hv1, hv2, hv3 );
+        if ( BadElement(hq) ) return quadIndex;
+
+        QuadItem* q = new QuadItem(hq, _entry);
+        _quadDirItem->appendRow(q);
+        quadIndex = q->index();
+        emit patternDataChanged();
     }
-  }
-  return quadIndex;
+
+    return quadIndex;
 }
 
 QModelIndex DocumentModel::addQuadEdges( const QModelIndex &e0, const QModelIndex &e1,
-                                         const QModelIndex &e2, const QModelIndex &e3 )
+        const QModelIndex &e2, const QModelIndex &e3 )
 { //CS_TODO
-  QModelIndex quadIndex;
-
-  HEXA_NS::Edge* he0 = getHexaPtr<HEXA_NS::Edge*>(e0);
-  HEXA_NS::Edge* he1 = getHexaPtr<HEXA_NS::Edge*>(e1);
-  HEXA_NS::Edge* he2 = getHexaPtr<HEXA_NS::Edge*>(e2);
-  HEXA_NS::Edge* he3 = getHexaPtr<HEXA_NS::Edge*>(e3);
-
-  if ( he0 and he1 and he2 and he3 ){
-    HEXA_NS::Quad* hq = _hexaDocument->addQuad( he0, he1, he2, he3 );
-    if ( hq->isValid() ){
-      QuadItem* q = new QuadItem(hq, _entry);
-      _quadDirItem->appendRow(q);
-      quadIndex = q->index();
-      emit patternDataChanged();
-    } else {
-      delete hq;
+    QModelIndex quadIndex;
+
+    HEXA_NS::Edge* he0 = getHexaPtr<HEXA_NS::Edge*>(e0);
+    HEXA_NS::Edge* he1 = getHexaPtr<HEXA_NS::Edge*>(e1);
+    HEXA_NS::Edge* he2 = getHexaPtr<HEXA_NS::Edge*>(e2);
+    HEXA_NS::Edge* he3 = getHexaPtr<HEXA_NS::Edge*>(e3);
+
+    if ( he0 && he1 && he2 && he3 ){
+
+        HEXA_NS::Quad* hq = _hexaDocument->addQuad( he0, he1, he2, he3 );
+        if ( BadElement(hq) ) return quadIndex;
+
+        QuadItem* q = new QuadItem(hq, _entry);
+        _quadDirItem->appendRow(q);
+        quadIndex = q->index();
+        emit patternDataChanged();
     }
-  }
-  return quadIndex;
+
+    return quadIndex;
 }
 
-QModelIndex DocumentModel::addHexaVertices( 
-            const QModelIndex &iv0, const QModelIndex &iv1,
-            const QModelIndex &iv2, const QModelIndex &iv3,
-            const QModelIndex &iv4, const QModelIndex &iv5,
-            const QModelIndex &iv6, const QModelIndex &iv7 )
-{ 
-  QModelIndex iHexa;
+QModelIndex DocumentModel::addHexaVertices(
+        const QModelIndex &iv0, const QModelIndex &iv1,
+        const QModelIndex &iv2, const QModelIndex &iv3,
+        const QModelIndex &iv4, const QModelIndex &iv5,
+        const QModelIndex &iv6, const QModelIndex &iv7 )
+{
+    QModelIndex iHexa;
+
+    HEXA_NS::Vertex* hv0 = getHexaPtr<HEXA_NS::Vertex*>(iv0);
+    HEXA_NS::Vertex* hv1 = getHexaPtr<HEXA_NS::Vertex*>(iv1);
+    HEXA_NS::Vertex* hv2 = getHexaPtr<HEXA_NS::Vertex*>(iv2);
+    HEXA_NS::Vertex* hv3 = getHexaPtr<HEXA_NS::Vertex*>(iv3);
+    HEXA_NS::Vertex* hv4 = getHexaPtr<HEXA_NS::Vertex*>(iv4);
+    HEXA_NS::Vertex* hv5 = getHexaPtr<HEXA_NS::Vertex*>(iv5);
+    HEXA_NS::Vertex* hv6 = getHexaPtr<HEXA_NS::Vertex*>(iv6);
+    HEXA_NS::Vertex* hv7 = getHexaPtr<HEXA_NS::Vertex*>(iv7);
 
-  HEXA_NS::Vertex* hv0 = getHexaPtr<HEXA_NS::Vertex*>(iv0);
-  HEXA_NS::Vertex* hv1 = getHexaPtr<HEXA_NS::Vertex*>(iv1);
-  HEXA_NS::Vertex* hv2 = getHexaPtr<HEXA_NS::Vertex*>(iv2);
-  HEXA_NS::Vertex* hv3 = getHexaPtr<HEXA_NS::Vertex*>(iv3);
-  HEXA_NS::Vertex* hv4 = getHexaPtr<HEXA_NS::Vertex*>(iv4);
-  HEXA_NS::Vertex* hv5 = getHexaPtr<HEXA_NS::Vertex*>(iv5);
-  HEXA_NS::Vertex* hv6 = getHexaPtr<HEXA_NS::Vertex*>(iv6);
-  HEXA_NS::Vertex* hv7 = getHexaPtr<HEXA_NS::Vertex*>(iv7);
+    HEXA_NS::Hexa* hh = _hexaDocument->addHexaVertices( hv0, hv1, hv2, hv3,
+            hv4, hv5, hv6, hv7 );
 
-  HEXA_NS::Hexa* hh = _hexaDocument->addHexaVertices( hv0, hv1, hv2, hv3,
-                                                      hv4, hv5, hv6, hv7 );
+    if ( BadElement(hh) ) return iHexa;
 
-  if ( hh->isValid() ){
     HexaItem* h = new HexaItem(hh, _entry);
     _hexaDirItem->appendRow(h);
     iHexa = h->index();
     emit patternDataChanged();
-  } else {
-    delete hh;
-  }
 
-  return iHexa;
+    return iHexa;
 }
 
 QModelIndex DocumentModel::addHexaQuad( const QModelIndex &i_q0, const QModelIndex &i_q1,
-    const QModelIndex &i_q2,const QModelIndex &i_q3, const QModelIndex &i_q4, const QModelIndex &i_q5 )
+        const QModelIndex &i_q2,const QModelIndex &i_q3, const QModelIndex &i_q4, const QModelIndex &i_q5 )
 { //CS_TODO : gestion erreur
-  QModelIndex hexaIndex;
+    QModelIndex hexaIndex;
 
-  HEXA_NS::Quad* hq0 = getHexaPtr<HEXA_NS::Quad*>(i_q0);
-  HEXA_NS::Quad* hq1 = getHexaPtr<HEXA_NS::Quad*>(i_q1);
-  HEXA_NS::Quad* hq2 = getHexaPtr<HEXA_NS::Quad*>(i_q2);
-  HEXA_NS::Quad* hq3 = getHexaPtr<HEXA_NS::Quad*>(i_q3);
-  HEXA_NS::Quad* hq4 = getHexaPtr<HEXA_NS::Quad*>(i_q4);
-  HEXA_NS::Quad* hq5 = getHexaPtr<HEXA_NS::Quad*>(i_q5);
+    HEXA_NS::Quad* hq0 = getHexaPtr<HEXA_NS::Quad*>(i_q0);
+    HEXA_NS::Quad* hq1 = getHexaPtr<HEXA_NS::Quad*>(i_q1);
+    HEXA_NS::Quad* hq2 = getHexaPtr<HEXA_NS::Quad*>(i_q2);
+    HEXA_NS::Quad* hq3 = getHexaPtr<HEXA_NS::Quad*>(i_q3);
+    HEXA_NS::Quad* hq4 = getHexaPtr<HEXA_NS::Quad*>(i_q4);
+    HEXA_NS::Quad* hq5 = getHexaPtr<HEXA_NS::Quad*>(i_q5);
 
-  HEXA_NS::Hexa* hh = _hexaDocument->addHexa( hq0, hq1, hq2, hq3, hq4, hq5 );
+    HEXA_NS::Hexa* hh = _hexaDocument->addHexa( hq0, hq1, hq2, hq3, hq4, hq5 );
+    if ( BadElement(hh) ) return hexaIndex;
 
-  if ( hh->isValid() ){
     HexaItem* h = new HexaItem(hh, _entry);
     _hexaDirItem->appendRow(h);
     hexaIndex = h->index();
     emit patternDataChanged();
-  } else
-    delete hh;
 
-  return hexaIndex;
+    return hexaIndex;
 }
 
 QModelIndex DocumentModel::addHexaQuads( const QModelIndexList &iquads)
-{ 
-  QModelIndex hexaIndex;
-
-  HEXA_NS::Hexa* hh = NULL;
-  HEXA_NS::Quad* hq0, *hq1, *hq2, *hq3, *hq4, *hq5 = NULL;
-
-  hq0 = getHexaPtr<HEXA_NS::Quad*>(iquads.value(0));
-  hq1 = getHexaPtr<HEXA_NS::Quad*>(iquads.value(1));
-  hq2 = getHexaPtr<HEXA_NS::Quad*>(iquads.value(2));
-  hq3 = getHexaPtr<HEXA_NS::Quad*>(iquads.value(3));
-  hq4 = getHexaPtr<HEXA_NS::Quad*>(iquads.value(4));
-  hq5 = getHexaPtr<HEXA_NS::Quad*>(iquads.value(5));
-
-  if ( hq0 && hq1 && hq2 && hq3 && hq4 && hq5 )
-         hh = _hexaDocument->addHexa( hq0, hq1, hq2, hq3, hq4, hq5 );
-  else if ( hq0 && hq1 && hq2 && hq3 && hq4 )
-         hh = _hexaDocument->addHexa5Quads( hq0, hq1, hq2, hq3, hq4 );
-  else if ( hq0 && hq1 && hq2 && hq3 )
-         hh = _hexaDocument->addHexa4Quads( hq0, hq1, hq2, hq3 );
-  else if ( hq0 && hq1 && hq2)
-         hh = _hexaDocument->addHexa3Quads( hq0, hq1, hq2 );
-  else if ( hq0 && hq1 )
-         hh = _hexaDocument->addHexa2Quads( hq0, hq1);
-
-  if ( hh && hh->isValid() ){
-       updateData();
-       unsigned int nbRows = _hexaDirItem->rowCount();
-       if (nbRows > 0)
-               hexaIndex = _hexaDirItem->child(nbRows-1)->index();
-  } else
-    delete hh;
-
-  return hexaIndex;
-}
-
-// Vector addVector( in double dx, in double dy, in double dz )
-//         raises (SALOME::SALOME_Exception);
+{
+    QModelIndex hexaIndex;
+
+    HEXA_NS::Hexa* hh = NULL;
+    HEXA_NS::Quad* hq0, *hq1, *hq2, *hq3, *hq4, *hq5 = NULL;
+
+    hq0 = getHexaPtr<HEXA_NS::Quad*>(iquads.value(0));
+    hq1 = getHexaPtr<HEXA_NS::Quad*>(iquads.value(1));
+    hq2 = getHexaPtr<HEXA_NS::Quad*>(iquads.value(2));
+    hq3 = getHexaPtr<HEXA_NS::Quad*>(iquads.value(3));
+    hq4 = getHexaPtr<HEXA_NS::Quad*>(iquads.value(4));
+    hq5 = getHexaPtr<HEXA_NS::Quad*>(iquads.value(5));
+
+    if ( hq0 && hq1 && hq2 && hq3 && hq4 && hq5 )
+        hh = _hexaDocument->addHexa( hq0, hq1, hq2, hq3, hq4, hq5 );
+    else if ( hq0 && hq1 && hq2 && hq3 && hq4 )
+        hh = _hexaDocument->addHexa5Quads( hq0, hq1, hq2, hq3, hq4 );
+    else if ( hq0 && hq1 && hq2 && hq3 )
+        hh = _hexaDocument->addHexa4Quads( hq0, hq1, hq2, hq3 );
+    else if ( hq0 && hq1 && hq2)
+        hh = _hexaDocument->addHexa3Quads( hq0, hq1, hq2 );
+    else if ( hq0 && hq1 )
+        hh = _hexaDocument->addHexa2Quads( hq0, hq1);
+
+    if ( BadElement(hh) ) return hexaIndex;
+
+    updateData();
+    unsigned int nbRows = _hexaDirItem->rowCount();
+    if (nbRows > 0)
+        hexaIndex = _hexaDirItem->child(nbRows-1)->index();
+
+    return hexaIndex;
+}
+
 QModelIndex DocumentModel::addVector( double dx, double dy, double dz )
 {
-  QModelIndex vectorIndex;
+    QModelIndex vectorIndex;
 
-  HEXA_NS::Vector* hv = _hexaDocument->addVector(dx, dy, dz);
+    HEXA_NS::Vector* hv = _hexaDocument->addVector(dx, dy, dz);
+    if ( BadElement(hv) ) return vectorIndex; //Invalid index
 
-  if ( hv->isValid() ){
     VectorItem* v = new VectorItem(hv);
     _vectorDirItem->appendRow(v);
     vectorIndex = v->index();
 
-  } else
-    delete hv;
-
-  return vectorIndex;
+    return vectorIndex;
 }
 
 QModelIndex DocumentModel::addVectorVertices( const QModelIndex &iv0, const QModelIndex &iv1 )
 {
-  QModelIndex iVec;
+    QModelIndex iVec;
 
-  HEXA_NS::Vertex* hv0 = getHexaPtr<HEXA_NS::Vertex*>(iv0);
-  HEXA_NS::Vertex* hv1 = getHexaPtr<HEXA_NS::Vertex*>(iv1);
+    HEXA_NS::Vertex* hv0 = getHexaPtr<HEXA_NS::Vertex*>(iv0);
+    HEXA_NS::Vertex* hv1 = getHexaPtr<HEXA_NS::Vertex*>(iv1);
 
-  HEXA_NS::Vector* hvec = _hexaDocument->addVectorVertices( hv0, hv1 );
+    HEXA_NS::Vector* hvec = _hexaDocument->addVectorVertices( hv0, hv1 );
+    if ( BadElement(hvec) ) return iVec;
 
-  if ( hvec->isValid() ){
     VectorItem* vec = new VectorItem(hvec);
     _vectorDirItem->appendRow(vec);
     iVec = vec->index();
-  } else {
-    delete hvec;
-  }
 
-  return iVec;
+    return iVec;
 }
 
-QModelIndex DocumentModel::addCylinder( const QModelIndex &iv, const QModelIndex &ivec, double r,  double h )
-{
-  QModelIndex iCyl;
 
-  HEXA_NS::Vertex* hv   = getHexaPtr<HEXA_NS::Vertex*>(iv);
-  HEXA_NS::Vector* hvec = getHexaPtr<HEXA_NS::Vector*>(ivec);
+// ************  EDIT HEXABLOCK MODEL ************
+
+bool DocumentModel::updateVertex( const QModelIndex& ivertex, double x, double y, double z )
+{
+    bool ret = false;
 
-  HEXA_NS::Cylinder* hcyl = _hexaDocument->addCylinder( hv, hvec, r, h );
+    HEXA_NS::Vertex* hVertex = getHexaPtr<HEXA_NS::Vertex*>(ivertex);
 
-  if ( hcyl->isValid() ){
-    CylinderItem* cyl = new CylinderItem(hcyl);
-    _cylinderDirItem->appendRow(cyl);
-    iCyl = cyl->index();
-  } else {
-    delete hcyl;
-  }
+    if ( hVertex ){
+//        hVertex->setName( name.toStdString() );
+        hVertex->setX ( x );
+        hVertex->setY ( y );
+        hVertex->setZ ( z );
+        emit patternDataChanged();
+        ret = true;
+    }
 
-  return iCyl;
+    return ret;
 }
 
-QModelIndex DocumentModel::addPipe( const QModelIndex &iv, const QModelIndex &ivec, double ri, double re, double h )
+bool DocumentModel::removeHexa( const QModelIndex& ihexa )
 {
-  QModelIndex iPipe;
-
-  HEXA_NS::Vertex* hv   = getHexaPtr<HEXA_NS::Vertex*>(iv);
-  HEXA_NS::Vector* hvec = getHexaPtr<HEXA_NS::Vector*>(ivec);
+    HEXA_NS::Hexa* hHexa = getHexaPtr<HEXA_NS::Hexa*>(ihexa);
 
-  HEXA_NS::Pipe* hPipe = _hexaDocument->addPipe( hv, hvec, ri, re, h );
-
-  if ( hPipe->isValid() ){
-    PipeItem* pipe = new PipeItem(hPipe);
-    _pipeDirItem->appendRow(pipe);
-    iPipe = pipe->index();
-  } else {
-    delete hPipe;
-  }
+    int r = _hexaDocument->removeHexa( hHexa );
+    if ( r == HOK ){
+        updateData();
+        return true;
+    }
 
-  return iPipe;
+    return false;
 }
 
-QModelIndex DocumentModel::makeCartesian( const QModelIndex& i_pt,
-      const QModelIndex& i_vec_x, const QModelIndex& i_vec_y, const QModelIndex& i_vec_z,
-      long nx, long ny, long nz)
+bool DocumentModel::removeConnectedHexa( const QModelIndex& ihexa )
 {
-  QModelIndex eltsIndex;
-  //std::cout<<"makeCartesian begin"<<std::endl; 
+    HEXA_NS::Hexa* hHexa = getHexaPtr<HEXA_NS::Hexa*>(ihexa);
+
+    int r = _hexaDocument->removeConnectedHexa( hHexa );
+    if ( r == HOK ){
+        updateData();
+        return true;
+    }
 
-  HEXA_NS::Vertex* hpt    = getHexaPtr<HEXA_NS::Vertex*>(i_pt);
-  HEXA_NS::Vector* hvec_x = getHexaPtr<HEXA_NS::Vector*>(i_vec_x);
-  HEXA_NS::Vector* hvec_y = getHexaPtr<HEXA_NS::Vector*>(i_vec_y);
-  HEXA_NS::Vector* hvec_z = getHexaPtr<HEXA_NS::Vector*>(i_vec_z);
+    return false;
+}
 
-  HEXA_NS::Elements* new_helts = _hexaDocument->makeCartesian( hpt,
-                                                               hvec_x, hvec_y, hvec_z,
-                                                               nx, ny, nz );
+bool DocumentModel::mergeVertices( const QModelIndex &iv0, const QModelIndex &iv1 ) //CS_TODO : impact sur le model?
+{
+    HEXA_NS::Vertex* hv0 = getHexaPtr<HEXA_NS::Vertex*>(iv0);
+    HEXA_NS::Vertex* hv1 = getHexaPtr<HEXA_NS::Vertex*>(iv1);
 
-  if ( new_helts->isValid() ){
-    updateData(); //CS_TODO more or less?
-    ElementsItem* eltsItem = new ElementsItem(new_helts);
-    _elementsDirItem->appendRow(eltsItem);
-    eltsIndex = eltsItem->index();
-  } else
-    delete new_helts;
+    int r = _hexaDocument->mergeVertices( hv0, hv1 );
+    if ( r == HOK ){
+        updateData(); //CS_TODO more or less?
+        return true;
+    }
 
-  return eltsIndex;
+    return false;
 }
 
-QModelIndex DocumentModel::makeCartesian( const QModelIndex& ivex,
-                                          const QModelIndex& ivec,
-                                          int nx, int ny, int nz )
+bool DocumentModel::mergeEdges( const QModelIndex &ie0, const QModelIndex &ie1,
+        const QModelIndex &iv0, const QModelIndex &iv1 )
+//CS_TODO : impact sur le model?
 {
-  QModelIndex iElts;
+    HEXA_NS::Edge* he0 = getHexaPtr<HEXA_NS::Edge*>(ie0);
+    HEXA_NS::Edge* he1 = getHexaPtr<HEXA_NS::Edge*>(ie1);
 
-  HEXA_NS::Vertex* hVex = getHexaPtr<HEXA_NS::Vertex*>(ivex);
-  HEXA_NS::Vector* hVec = getHexaPtr<HEXA_NS::Vector*>(ivec);
+    HEXA_NS::Vertex* hv0 = getHexaPtr<HEXA_NS::Vertex*>(iv0);
+    HEXA_NS::Vertex* hv1 = getHexaPtr<HEXA_NS::Vertex*>(iv1);
 
-  HEXA_NS::Elements* hElts = _hexaDocument->makeCartesian( hVex,
-                                                           hVec,
-                                                           nx, ny, nz );
-  if ( hElts->isValid() ){
-    updateData(); //CS_TODO more or less?
-    ElementsItem* elts = new ElementsItem(hElts);
-    _elementsDirItem->appendRow(elts);
-    iElts = elts->index();
-  } else {
-    delete hElts;
-  }
+    //Merge
+    int r = _hexaDocument->mergeEdges( he0, he1, hv0, hv1 );
+    if ( r == HOK ){
+        updateData();
+        return true;
+    }
 
-  return iElts;
+    return false;
 }
 
-// Elements makeCylindrical( in Vertex pt,
-//           in Vector vex, in Vector vez,
-//           in double dr, in double da, in double dl,
-//           in long nr, in long na, in long nl,
-//           in boolean fill )
-//         raises (SALOME::SALOME_Exception);
-QModelIndex DocumentModel::makeCylindrical( const QModelIndex& i_pt,
-        const QModelIndex& i_vec_x, const QModelIndex& i_vec_z,
-        double dr, double da, double dl,
-        long nr, long na, long nl,
-        bool fill )
+bool DocumentModel::mergeQuads( const QModelIndex& iquad0, const QModelIndex& iquad1,
+        const QModelIndex& iv0, const QModelIndex& iv1,
+        const QModelIndex& iv2, const QModelIndex& iv3 )
 {
+    HEXA_NS::Quad* hquad0 = data(iquad0, HEXA_DATA_ROLE).value<HEXA_NS::Quad *>();
+    HEXA_NS::Quad* hquad1 = data(iquad1, HEXA_DATA_ROLE).value<HEXA_NS::Quad *>();
 
-  QModelIndex eltsIndex;
-
-  HEXA_NS::Vertex* hpt    = getHexaPtr<HEXA_NS::Vertex*>(i_pt);
-  HEXA_NS::Vector* hvec_x = getHexaPtr<HEXA_NS::Vector*>(i_vec_x);
-  HEXA_NS::Vector* hvec_z = getHexaPtr<HEXA_NS::Vector*>(i_vec_z);
-
-  HEXA_NS::Elements* new_helts = _hexaDocument->makeCylindrical( hpt, hvec_x, hvec_z, dr, da, dl, nr, na, nl, fill );
+    HEXA_NS::Vertex* hv0 = getHexaPtr<HEXA_NS::Vertex*>(iv0);
+    HEXA_NS::Vertex* hv1 = getHexaPtr<HEXA_NS::Vertex*>(iv1);
+    HEXA_NS::Vertex* hv2 = getHexaPtr<HEXA_NS::Vertex*>(iv2);
+    HEXA_NS::Vertex* hv3 = getHexaPtr<HEXA_NS::Vertex*>(iv3);
 
-  if ( new_helts->isValid() ){
-    updateData(); //CS_TODO  more or less?
-    ElementsItem* eltsItem = new ElementsItem(new_helts);
-    _elementsDirItem->appendRow(eltsItem);
-    eltsIndex = eltsItem->index();
-  } else {
-    delete new_helts;
-  }
+    int r = _hexaDocument->mergeQuads( hquad0, hquad1, hv0, hv1, hv2, hv3 );
+    if ( r == HOK ){
+        updateData();
+        return true;
+    }
 
-  return eltsIndex;
+    return false;
 }
 
-QModelIndex DocumentModel::makeCylindricals( 
-    const QModelIndex& icenter, const QModelIndex& ibase, const QModelIndex& iheight,
-    QList< double> radius, QList<double> angles, QList<double> heights, 
-    bool fill ) //HEXA3
+//
+QModelIndex DocumentModel::disconnectVertex( const QModelIndex& ihexa, const QModelIndex& ivertex )
 {
-  QModelIndex eltsIndex;
+    QModelIndex iElts;
 
-  HEXA_NS::Vertex* hcenter = getHexaPtr<HEXA_NS::Vertex*>(icenter);
-  HEXA_NS::Vector* hbase   =getHexaPtr<HEXA_NS::Vector*>(ibase);
-  HEXA_NS::Vector* hheight = getHexaPtr<HEXA_NS::Vector*>(iheight);
+    HEXA_NS::Hexa*   hHexa   = getHexaPtr<HEXA_NS::Hexa*>(ihexa);
+    HEXA_NS::Vertex* hVertex = getHexaPtr<HEXA_NS::Vertex*>(ivertex);
 
-//   HEXA_NS::Elements* helts;
-  std::vector<double> r = radius.toVector().toStdVector();
-  std::vector<double> a = angles.toVector().toStdVector();
-  std::vector<double> h = heights.toVector().toStdVector();
+    HEXA_NS::Elements* hElts = _hexaDocument->disconnectVertex( hHexa, hVertex );
+    if ( BadElement(hElts) ) return iElts;
 
-  HEXA_NS::Elements* helts = _hexaDocument->makeCylindricals(
-             hcenter, hbase, hheight,
-             r, a, h,
-             fill );
+    updateData(); //CS_TO_CHECK
+    ElementsItem* elts = new ElementsItem(hElts);
+    _elementsDirItem->appendRow(elts);
+    iElts = elts->index();
 
-  if ( helts->isValid() ){
-    updateData(); //CS_TODO  more or less?
-    ElementsItem* eltsItem = new ElementsItem(helts);
-    _elementsDirItem->appendRow(eltsItem);
-    eltsIndex = eltsItem->index();
-  } else {
-    delete helts;
-  }
-  return eltsIndex;
+    return iElts;
 }
 
-QModelIndex DocumentModel::makeSpherical( const QModelIndex& iv, const QModelIndex& ivec, int nb, double k)
+QModelIndex DocumentModel::disconnectEdge( const QModelIndex& ihexa, const QModelIndex& iedge )
 {
-  QModelIndex iElts;
+    QModelIndex iElts;
 
-  HEXA_NS::Vertex* hv   = getHexaPtr<HEXA_NS::Vertex*>(iv);
-  HEXA_NS::Vector* hvec = getHexaPtr<HEXA_NS::Vector*>(ivec);
+    HEXA_NS::Hexa* hHexa = getHexaPtr<HEXA_NS::Hexa*>(ihexa);
+    HEXA_NS::Edge* hEdge = getHexaPtr<HEXA_NS::Edge*>(iedge);
 
-  HEXA_NS::Elements* hElts = _hexaDocument->makeSpherical( hv, hvec, nb, k );
+    HEXA_NS::Elements* hElts = _hexaDocument->disconnectEdge( hHexa, hEdge );
+    if ( BadElement(hElts) ) return iElts;
 
-  if ( hElts->isValid() ){
-    updateData(); //CS_TODO more or less?
+    updateData(); //CS_TO_CHECK
     ElementsItem* elts = new ElementsItem(hElts);
     _elementsDirItem->appendRow(elts);
     iElts = elts->index();
-  } else {
-    delete hElts;
-  }
 
-  return iElts;
+    return iElts;
 }
 
-QModelIndex DocumentModel::makeSpherical( const QModelIndex& icenter, double radius, int nb, double k )
-{
-  QModelIndex iElts;
 
-  HEXA_NS::Vertex* hcenter = getHexaPtr<HEXA_NS::Vertex*>(icenter);
+QModelIndex DocumentModel::disconnectEdges( const QModelIndexList& ihexas, const QModelIndexList& iedges )
+{
+    QModelIndex iElts;
 
-  HEXA_NS::Elements* helts = _hexaDocument->makeSpherical( hcenter, radius, nb, k );
+    HEXA_NS::Hexas hHexas;
+    HEXA_NS::Edges hEdges;
 
-  if ( helts->isValid() ){
-    updateData(); //CS_TODO more or less?
-    ElementsItem* eltsItem = new ElementsItem(helts);
-    _elementsDirItem->appendRow(eltsItem);
-    iElts = eltsItem->index();
-  } else {
-    delete helts;
-  }
+    //edges list
+    HEXA_NS::Edge* hedge = NULL;
+    foreach( const QModelIndex& iedge, iedges ){
+        hedge = getHexaPtr<HEXA_NS::Edge*>(iedge);
+        hEdges.push_back( hedge );
+    }
 
-  return iElts;
-}
+    //hexas list
+    HEXA_NS::Hexa* hhexa = NULL;
+    foreach( const QModelIndex& ihexa, ihexas ){
+        hhexa = getHexaPtr<HEXA_NS::Hexa*>(ihexa);
+        hHexas.push_back( hhexa );
+    }
 
-QModelIndex DocumentModel::makeCylinder( const QModelIndex& icyl, const QModelIndex& ivec,
-                                         int nr, int na, int nl )
-{
-  QModelIndex iElts;
 
-  HEXA_NS::Cylinder* hcyl = getHexaPtr<HEXA_NS::Cylinder*>(icyl);
-  HEXA_NS::Vector* hvec   = getHexaPtr<HEXA_NS::Vector*>(ivec);
+    HEXA_NS::Elements* hElts = _hexaDocument->disconnectEdges( hHexas, hEdges );
+    if ( BadElement(hElts) ) return iElts;
 
-  HEXA_NS::Elements* hElts = _hexaDocument->makeCylinder( hcyl, hvec, nr, na, nl );
-  if ( hElts->isValid() ){
-    updateData(); //CS_TODO more or less?
+    updateData(); //CS_TO_CHECK
     ElementsItem* elts = new ElementsItem(hElts);
     _elementsDirItem->appendRow(elts);
     iElts = elts->index();
-  } else {
-    delete hElts;
-  }
 
-  return iElts;
+    return iElts;
 }
 
-QModelIndex DocumentModel::makePipe( const QModelIndex& ipipe, const QModelIndex& ivecx, 
-                                     int nr, int na, int nl )
-{ 
-  QModelIndex iElts;
 
-  HEXA_NS::Pipe*   hPipe  = getHexaPtr<HEXA_NS::Pipe*>(ipipe);
-  HEXA_NS::Vector* hVecx  = getHexaPtr<HEXA_NS::Vector*>(ivecx);
+QModelIndex DocumentModel::disconnectQuad( const QModelIndex& ihexa, const QModelIndex& iquad )
+{
+    QModelIndex iElts;
+
+    HEXA_NS::Hexa* hHexa = getHexaPtr<HEXA_NS::Hexa*>(ihexa);
+    HEXA_NS::Quad* hQuad = getHexaPtr<HEXA_NS::Quad*>(iquad);
 
-  HEXA_NS::Elements* hElts = _hexaDocument->makePipe( hPipe, hVecx, nr, na, nl );
+    HEXA_NS::Elements* hElts = _hexaDocument->disconnectQuad( hHexa, hQuad );
+    if ( BadElement(hElts) ) return iElts;
 
-  if ( hElts->isValid() ){
-    updateData(); //CS_TODO more or less?
+    updateData(); //CS_TO_CHECK
     ElementsItem* elts = new ElementsItem(hElts);
     _elementsDirItem->appendRow(elts);
     iElts = elts->index();
-  } else {
-    delete hElts;
-  }
 
-  return iElts;
+    return iElts;
 }
 
-QModelIndex DocumentModel::makeCylinders(const QModelIndex& icyl1, const QModelIndex& icyl2)
-{ //CS_TODO
-  QModelIndex iCrossElts;
-  
-  HEXA_NS::Cylinder* hCyl1  = getHexaPtr<HEXA_NS::Cylinder*>(icyl1);
-  HEXA_NS::Cylinder* hCyl2  = getHexaPtr<HEXA_NS::Cylinder*>(icyl2);
-
-  HEXA_NS::CrossElements* hCrossElts = _hexaDocument->makeCylinders( hCyl1, hCyl2 );
-  
-  if ( hCrossElts->isValid() ){
-    updateData(); //CS_TODO more or less?
-    ElementsItem* crossElts = new ElementsItem(hCrossElts);
-    _crossElementsDirItem->appendRow(crossElts);
-    iCrossElts = crossElts->index();    
-  } else {
-    delete hCrossElts;
-  }
-    
-  return iCrossElts;
-}
 
-//
-QModelIndex DocumentModel::makePipes( const QModelIndex& ipipe1, const QModelIndex& ipipe2 )
-{ 
-  QModelIndex iCrossElts;
-  
-  HEXA_NS::Pipe* hPipe1  = getHexaPtr<HEXA_NS::Pipe*>(ipipe1);
-  HEXA_NS::Pipe* hPipe2  = getHexaPtr<HEXA_NS::Pipe*>(ipipe2);
-
-  HEXA_NS::CrossElements* hCrossElts = _hexaDocument->makePipes( hPipe1, hPipe2 );
-  
-  if ( hCrossElts->isValid() ){
-    updateData(); //CS_TODO more or less?
-    ElementsItem* crossElts = new ElementsItem(hCrossElts);
-    _crossElementsDirItem->appendRow(crossElts);
-    iCrossElts = crossElts->index();
-    QString tmp = "/tmp/makePipes.vtk";
-    _hexaDocument->saveVtk( tmp.toLocal8Bit().constData() );
-  } else {
-    delete hCrossElts;
-  }
-  
-  return iCrossElts;
-}
-
-QModelIndex DocumentModel::makeRind( const QModelIndex& icenter, 
-                    const QModelIndex& ivecx, const QModelIndex& ivecz,
-                    double  radext, double radint, double radhole,
-                    const QModelIndex& iplorig,
-                    int nrad, int nang, int nhaut )
-{
-  QModelIndex iElts;
-
-  HEXA_NS::Vertex* hcenter = getHexaPtr<HEXA_NS::Vertex*>(icenter);
-  HEXA_NS::Vector* hvecx   = getHexaPtr<HEXA_NS::Vector*>(ivecx);
-  HEXA_NS::Vector* hvecz   = getHexaPtr<HEXA_NS::Vector*>(ivecz);
-  HEXA_NS::Vertex* hplorig = getHexaPtr<HEXA_NS::Vertex*>(iplorig);
-
-  HEXA_NS::Elements* hElts = _hexaDocument->makeRind( hcenter,
-                            hvecx, hvecz,
-                            radext, radint, radhole,
-                            hplorig,
-                            nrad, nang, nhaut );
-
-  if ( hElts->isValid() ){
-    updateData(); //CS_TODO more or less?
-    ElementsItem* eltsItem = new ElementsItem(hElts);
+QModelIndex DocumentModel::makeTranslation( const QModelIndex& ielts, const QModelIndex& ivec )
+{
+    QModelIndex iElts;
+
+    HEXA_NS::Elements* hElts = getHexaPtr<HEXA_NS::Elements*>(ielts);
+    HEXA_NS::Vector*   hVec  = getHexaPtr<HEXA_NS::Vector*>(ivec);
+
+    HEXA_NS::Elements* hNewElts = _hexaDocument->makeTranslation( hElts, hVec );
+    if ( BadElement(hNewElts) ) return iElts;
+
+    updateData(); //CS_TODO  more or less?
+    ElementsItem* eltsItem = new ElementsItem(hNewElts);
     _elementsDirItem->appendRow(eltsItem);
     iElts = eltsItem->index();
-  } else {
-    delete hElts;
-  }
 
-  return iElts;
+    return iElts;
 }
 
-QModelIndex DocumentModel::makePartRind( const QModelIndex& icenter, 
-                    const QModelIndex& ivecx, const QModelIndex& ivecz,
-                    double  radext, double radint, double radhole,
-                    const QModelIndex& iplorig, double angle,
-                    int nrad, int nang, int nhaut )
+
+
+QModelIndex DocumentModel::makeScale( const QModelIndex& ielts, const QModelIndex& ivex, double k )
 {
-  QModelIndex iElts;
+    QModelIndex iElts;
 
-  HEXA_NS::Vertex* hcenter = getHexaPtr<HEXA_NS::Vertex*>(icenter);
-  HEXA_NS::Vector* hvecx   = getHexaPtr<HEXA_NS::Vector*>(ivecx);
-  HEXA_NS::Vector* hvecz   = getHexaPtr<HEXA_NS::Vector*>(ivecz);
-  HEXA_NS::Vertex* hplorig = getHexaPtr<HEXA_NS::Vertex*>(iplorig);
+    HEXA_NS::Elements* hElts = getHexaPtr<HEXA_NS::Elements*>(ielts);
+    HEXA_NS::Vertex*   hVex  = getHexaPtr<HEXA_NS::Vertex*>(ivex);
 
-  HEXA_NS::Elements* hElts = _hexaDocument->makePartRind( hcenter,
-                            hvecx, hvecz,
-                            radext, radint, radhole,
-                            hplorig, angle,
-                            nrad, nang, nhaut );
+    HEXA_NS::Elements* hNewElts = _hexaDocument->makeScale( hElts, hVex, k );
+    if ( BadElement(hNewElts) ) return iElts;
 
-  if ( hElts->isValid() ){
-    updateData();
-    ElementsItem* eltsItem = new ElementsItem(hElts);
+    updateData(); //CS_TODO  more or less?
+    ElementsItem* eltsItem = new ElementsItem(hNewElts);
     _elementsDirItem->appendRow(eltsItem);
     iElts = eltsItem->index();
-  } else {
-    delete hElts;
-  }
 
-  return iElts;
+    return iElts;
 }
 
-QModelIndex DocumentModel::makeSphere( const QModelIndex& icenter, 
-                    const QModelIndex& ivecx, const QModelIndex& ivecz,
-                    double radius, double radhole,
-                    const QModelIndex& iplorig,
-                    int nrad, int nang, int nhaut )
+QModelIndex DocumentModel::makeRotation( const QModelIndex& ielts,
+        const QModelIndex& iv,
+        const QModelIndex& ivec, double angle )
 {
-  QModelIndex iElts;
+    QModelIndex iElts;
 
-  HEXA_NS::Vertex* hcenter = getHexaPtr<HEXA_NS::Vertex*>(icenter);
-  HEXA_NS::Vector* hvecx   = getHexaPtr<HEXA_NS::Vector*>(ivecx);
-  HEXA_NS::Vector* hvecz   = getHexaPtr<HEXA_NS::Vector*>(ivecz);
-  HEXA_NS::Vertex* hplorig = getHexaPtr<HEXA_NS::Vertex*>(iplorig);
+    HEXA_NS::Elements* hElts = getHexaPtr<HEXA_NS::Elements*>(ielts);
+    HEXA_NS::Vertex*   hVex  = getHexaPtr<HEXA_NS::Vertex*>(iv);
+    HEXA_NS::Vector*   hVec  = getHexaPtr<HEXA_NS::Vector*>(ivec);
 
-  HEXA_NS::Elements* hElts = _hexaDocument->makeSphere( hcenter,
-                                                hvecx, hvecz, 
-                                                radius, radhole,
-                                                hplorig, 
-                                                nrad, nang, nhaut);
+    HEXA_NS::Elements* hNewElts = _hexaDocument->makeRotation( hElts, hVex, hVec, angle );
+    if ( BadElement(hNewElts) ) return iElts;
 
-  if ( hElts->isValid() ){
-    updateData();
-    ElementsItem* eltsItem = new ElementsItem(hElts);
+    updateData(); //CS_TODO  more or less?
+    ElementsItem* eltsItem = new ElementsItem(hNewElts);
     _elementsDirItem->appendRow(eltsItem);
     iElts = eltsItem->index();
-  } else {
-    delete hElts;
-  }
 
-  return iElts;
+    return iElts;
 }
 
-QModelIndex DocumentModel::makePartSphere( const QModelIndex& icenter, 
-                    const QModelIndex& ivecx, const QModelIndex& ivecz,
-                    double  radius, double radhole,
-                    const QModelIndex& iplorig, double angle,
-                    int nrad, int nang, int nhaut )
+
+QModelIndex DocumentModel::makeSymmetryPoint( const QModelIndex& ielts, const QModelIndex& iv )
 {
-  QModelIndex iElts;
+    QModelIndex iElts;
 
-  HEXA_NS::Vertex* hcenter = getHexaPtr<HEXA_NS::Vertex*>(icenter);
-  HEXA_NS::Vector* hvecx   = getHexaPtr<HEXA_NS::Vector*>(ivecx);
-  HEXA_NS::Vector* hvecz   = getHexaPtr<HEXA_NS::Vector*>(ivecz);
-  HEXA_NS::Vertex* hplorig = getHexaPtr<HEXA_NS::Vertex*>(iplorig);
+    HEXA_NS::Elements* hElts = getHexaPtr<HEXA_NS::Elements*>(ielts);
+    HEXA_NS::Vertex*   hVex  = getHexaPtr<HEXA_NS::Vertex*>(iv);
 
-  HEXA_NS::Elements* hElts = _hexaDocument->makePartSphere( hcenter,
-                                                hvecx, hvecz,
-                                                radius, radhole,
-                                                hplorig, angle, 
-                                                nrad, nang, nhaut);
+    HEXA_NS::Elements* hNewElts = _hexaDocument->makeSymmetryPoint (hElts, hVex);
+    if ( BadElement(hNewElts) ) return iElts;
 
-  if ( hElts->isValid() ){
-    updateData();
-    ElementsItem* eltsItem = new ElementsItem(hElts);
+    updateData(); //CS_TODO  more or less?
+    ElementsItem* eltsItem = new ElementsItem(hNewElts);
     _elementsDirItem->appendRow(eltsItem);
     iElts = eltsItem->index();
-  } else {
-    delete hElts;
-  }
 
-  return iElts;
+    return iElts;
 }
 
-// ************  EDIT HEXABLOCK MODEL ************
 
-bool DocumentModel::updateVertex( const QModelIndex& ivertex, double x, double y, double z )
+QModelIndex DocumentModel::makeSymmetryLine( const QModelIndex& ielts,
+        const QModelIndex& iv,
+        const QModelIndex& ivec )
 {
-  bool ret = false;
+    QModelIndex iElts;
 
-  //HEXA_NS::Vertex* hVertex = ivertex.data(HEXA_DATA_ROLE).value<HEXA_NS::Vertex *>(); //CS_TODO?  pareil pour toutes les autres méthodes du modèle?
-  HEXA_NS::Vertex* hVertex = getHexaPtr<HEXA_NS::Vertex*>(ivertex);
+    HEXA_NS::Elements* hElts = getHexaPtr<HEXA_NS::Elements*>(ielts);
+    HEXA_NS::Vertex*   hVex  = getHexaPtr<HEXA_NS::Vertex*>(iv);
+    HEXA_NS::Vector*   hVec  = getHexaPtr<HEXA_NS::Vector*>(ivec);
 
-  if ( hVertex ){
-//     hVertex->setName( name.toStdString() );
-    hVertex->setX ( x );
-    hVertex->setY ( y );
-    hVertex->setZ ( z );
-    emit patternDataChanged();
-    ret = true;
-  }
 
-  return ret;
+    HEXA_NS::Elements* hNewElts = _hexaDocument->makeSymmetryLine( hElts, hVex, hVec );
+    if ( BadElement(hNewElts) ) return iElts;
+
+    updateData(); //CS_TODO  more or less?
+    ElementsItem* eltsItem = new ElementsItem(hNewElts);
+    _elementsDirItem->appendRow(eltsItem);
+    iElts = eltsItem->index();
+
+    return iElts;
 }
 
-bool DocumentModel::removeHexa( const QModelIndex& ihexa )
+
+QModelIndex DocumentModel::makeSymmetryPlane( const QModelIndex& ielts, const QModelIndex& iv, const QModelIndex& ivec )
 {
-  bool ret = false;
-  HEXA_NS::Hexa* hHexa = getHexaPtr<HEXA_NS::Hexa*>(ihexa);
+    QModelIndex iElts;
 
+    HEXA_NS::Elements* hElts = getHexaPtr<HEXA_NS::Elements*>(ielts);
+    HEXA_NS::Vertex*   hVex  = getHexaPtr<HEXA_NS::Vertex*>(iv);
+    HEXA_NS::Vector*   hVec  = getHexaPtr<HEXA_NS::Vector*>(ivec);
 
-  int r = _hexaDocument->removeHexa( hHexa );
-  if ( r == HOK ){
-    updateData();
-    ret = true;
-  } else if ( r == HERR ){    
-    ret = false;
-  }
-  
-  return ret;
+    HEXA_NS::Elements* hNewElts = _hexaDocument->makeSymmetryPlane( hElts, hVex, hVec );
+    if ( BadElement(hNewElts) ) return iElts;
+
+    updateData(); //CS_TODO  more or less?
+    ElementsItem* eltsItem = new ElementsItem(hNewElts);
+    _elementsDirItem->appendRow(eltsItem);
+    iElts = eltsItem->index();
+
+    return iElts;
 }
 
-bool DocumentModel::removeConnectedHexa( const QModelIndex& ihexa )
+
+bool DocumentModel::performTranslation( const QModelIndex& ielts, const QModelIndex& ivec )
+{
+    HEXA_NS::Elements* hElts = getHexaPtr<HEXA_NS::Elements*>(ielts);
+    HEXA_NS::Vector*   hVec  = getHexaPtr<HEXA_NS::Vector*>(ivec);
+
+    int r = _hexaDocument->performTranslation (hElts, hVec);
+    if ( r == HOK ){ //Job well done?
+        updateData();
+        return true;
+    }
+
+    return false;
+}
+
+
+//
+bool DocumentModel::performScale( const QModelIndex& ielts, const QModelIndex& ivex, double k )
+{
+    HEXA_NS::Elements* hElts = getHexaPtr<HEXA_NS::Elements*>(ielts);
+    HEXA_NS::Vertex*   hVex  = getHexaPtr<HEXA_NS::Vertex*>(ivex);
+
+    int r = _hexaDocument->performScale (hElts, hVex, k);
+    if ( r == HOK ){
+        updateData();
+        return true;
+    }
+
+    return false;
+}
+
+//
+bool DocumentModel::performRotation( const QModelIndex& ielts, const QModelIndex& ivex, const QModelIndex& ivec, double angle )
+{
+    HEXA_NS::Elements* hElts = getHexaPtr<HEXA_NS::Elements*>(ielts);
+    HEXA_NS::Vertex*   hVex  = getHexaPtr<HEXA_NS::Vertex*>(ivex);
+    HEXA_NS::Vector*   hVec  = getHexaPtr<HEXA_NS::Vector*>(ivec);
+
+    int r = _hexaDocument-> performRotation( hElts, hVex, hVec, angle );
+    if ( r == HOK ){
+        updateData();
+        return true;
+    }
+
+    return false;
+}
+
+
+//
+bool DocumentModel::performSymmetryPoint( const QModelIndex& ielts, const QModelIndex& ivex )
+{
+    HEXA_NS::Elements* hElts = getHexaPtr<HEXA_NS::Elements*>(ielts);
+    HEXA_NS::Vertex*   hVex  = getHexaPtr<HEXA_NS::Vertex*>(ivex);
+
+    int r = _hexaDocument->performSymmetryPoint( hElts, hVex );
+    if ( r == HOK ){
+        updateData();
+        return true;
+    }
+
+    return false;
+}
+
+
+bool DocumentModel::performSymmetryLine( const QModelIndex& ielts, const QModelIndex& ivex, const QModelIndex& ivec )
+{
+    HEXA_NS::Elements* hElts = getHexaPtr<HEXA_NS::Elements*>(ielts);
+    HEXA_NS::Vertex*   hVex  = getHexaPtr<HEXA_NS::Vertex*>(ivex);
+    HEXA_NS::Vector*   hVec  = getHexaPtr<HEXA_NS::Vector*>(ivec);
+
+    int r = _hexaDocument->performSymmetryLine( hElts, hVex, hVec );
+    if ( r == HOK ){
+        updateData();
+        return true;
+    }
+
+    return false;
+}
+
+
+bool DocumentModel::performSymmetryPlane( const QModelIndex& ielts,
+        const QModelIndex& ivex,
+        const QModelIndex& ivec )
+{
+    HEXA_NS::Elements* hElts = getHexaPtr<HEXA_NS::Elements*>(ielts);
+    HEXA_NS::Vertex*   hVex  = getHexaPtr<HEXA_NS::Vertex*>(ivex);
+    HEXA_NS::Vector*   hVec  = getHexaPtr<HEXA_NS::Vector*>(ivec);
+
+    int r = _hexaDocument->performSymmetryPlane( hElts, hVex, hVec );
+    if ( r == HOK ){
+        updateData();
+        return true;
+    }
+
+    return false;
+}
+
+QModelIndex DocumentModel::replace( const QModelIndexList& iquads_source,
+                                    const QModelIndexList& iquads_dest,
+                                    const QModelIndex& ip1_source, const QModelIndex& ic1_dest,
+                                    const QModelIndex& ip2_source, const QModelIndex& ic2_dest)
 {
-  bool ret = false;
-  HEXA_NS::Hexa* hHexa = getHexaPtr<HEXA_NS::Hexa*>(ihexa);
-  
-  int r = _hexaDocument->removeConnectedHexa( hHexa );
-  
-  if ( r == HOK ){    
+    QModelIndex ielts;
+
+    HEXA_NS::Vertex* hp1 = getHexaPtr<HEXA_NS::Vertex*>(ip1_source);
+    HEXA_NS::Vertex* hp2 = getHexaPtr<HEXA_NS::Vertex*>(ip2_source);
+    HEXA_NS::Vertex* hc1 = getHexaPtr<HEXA_NS::Vertex*>(ic1_dest);
+    HEXA_NS::Vertex* hc2 = getHexaPtr<HEXA_NS::Vertex*>(ic2_dest);
+
+    HEXA_NS::Quads   hquads_source, hquads_dest;
+    HEXA_NS::Quad*   hquad = NULL;
+    foreach( const QModelIndex& iquad, iquads_source ){
+        hquad = getHexaPtr<HEXA_NS::Quad*>(iquad);
+        hquads_source.push_back( hquad );
+    }
+
+    foreach( const QModelIndex& iquad, iquads_dest) {
+        hquad = getHexaPtr<HEXA_NS::Quad*>(iquad);
+        hquads_dest.push_back(hquad);
+    }
+
+    HEXA_NS::Elements* helts = _hexaDocument->replace( hquads_source,
+                                                            hquads_dest,
+                                                            hp1, hc1, hp2, hc2);
+    if ( BadElement(helts) )
+        return ielts;
+
     updateData();
-    ret = true;
-  } else if ( r == HERR ){    
-    ret = false;
-  }
-  
-  return ret;
+    ElementsItem* eltsItem = new ElementsItem(helts);
+    _elementsDirItem->appendRow(eltsItem);
+    ielts = eltsItem->index();
+
+    return ielts;
+}
+
+QModelIndex DocumentModel::getGeomModelIndex(QString& id) const
+{
+    QModelIndex result;
+    PatternGeomSelectionModel* pgsm = HEXABLOCKGUI::currentDocGView->getPatternGeomSelectionModel();
+
+    // ** get the model index of the geom element having this ID
+    HEXA_NS::SubShape* eltPtr = getGeomPtr(id);
+    HEXA_NS::VertexShape* geomVertex = dynamic_cast<HEXA_NS::VertexShape*>(eltPtr);
+    HEXA_NS::EdgeShape* geomEdge = dynamic_cast<HEXA_NS::EdgeShape*>(eltPtr);
+    HEXA_NS::FaceShape* geomFace = dynamic_cast<HEXA_NS::FaceShape*>(eltPtr);
+    if (geomVertex != NULL)
+        result = pgsm->indexBy( HEXA_DATA_ROLE, QVariant::fromValue(geomVertex));
+    if (geomEdge != NULL)
+        result = pgsm->indexBy( HEXA_DATA_ROLE, QVariant::fromValue(geomEdge));
+    if (geomFace != NULL)
+        result = pgsm->indexBy( HEXA_DATA_ROLE, QVariant::fromValue(geomFace));
+
+    return result;
+}
+
+QMultiMap< QString, int >     DocumentModel::getAssocShapesIds(const QModelIndex& dataIndex)
+{
+   QMultiMap< QString, int > result;
+   HEXA_NS::NewShape* mainShape;
+   HEXA_NS::VertexShape* node;
+   HEXA_NS::EdgeShape* line;
+   HEXA_NS::FaceShape* face;
+   QString shapeName;
+   int subid;
+
+   PatternDataSelectionModel* pdsm = HEXABLOCKGUI::currentDocGView->getPatternDataSelectionModel();
+   QModelIndexList assocsInd = pdsm->getGeomAssociations(dataIndex);
+   foreach( const QModelIndex& anAssoc, assocsInd )
+   {
+      node = getHexaPtr<HEXA_NS::VertexShape*>(anAssoc);
+      line = getHexaPtr<HEXA_NS::EdgeShape*>(anAssoc);
+      face = getHexaPtr<HEXA_NS::FaceShape*>(anAssoc);
+
+      if (node != NULL)
+         {
+            mainShape = node->getParentShape();
+            if (mainShape != NULL)
+               {
+                  shapeName = mainShape->getName();
+                  subid = node->getIdent();
+               }
+         }
+      else if (line != NULL)
+         {
+            mainShape = line->getParentShape();
+            if (mainShape != NULL)
+               {
+                  shapeName = mainShape->getName();
+                  subid = line->getIdent();
+               }
+         }
+      else if (face != NULL)
+         {
+            mainShape = face->getParentShape();
+            if (mainShape != NULL)
+               {
+                  shapeName = mainShape->getName();
+                  subid = face->getIdent();
+               }
+         }
+
+      if (!shapeName.isEmpty())
+         result.insert( shapeName, subid );
+
+      shapeName = QString();
+   }
+   return result;
+}
+
+bool DocumentModel::setVertexAssociation( const QModelIndex& iVertex, double x, double y, double z)
+{
+    HEXA_NS::Vertex* vertex = getHexaPtr<HEXA_NS::Vertex *>(iVertex);
+
+    if (vertex == NULL || _hexaDocument == NULL || vertex->setAssociation(x, y, z) != HOK)
+        return false;
+
+    HEXA_NS::VertexShape* assoc = vertex->getAssociation();
+    if (assoc != NULL)
+    {
+        HEXA_NS::NewShape* mainSh = assoc->getParentShape();
+        setData( iVertex, QVariant::fromValue(QString(mainSh->getName())+","+QString::number(assoc->getIdent())+";"), HEXA_ASSOC_ENTRY_ROLE );
+    }
+
+    return true;
 }
 
-QModelIndex DocumentModel::prismQuad( const QModelIndex& iquad, const QModelIndex& ivec, int nb)
-{ 
-  QModelIndex iElts;
+bool DocumentModel::setVertexAssociation( const QModelIndex& iVertex, const QModelIndex& iGeomVertex)
+{
+    //parameters control
+    QString newAssoc;
+    HEXA_NS::Vertex* vertex = getHexaPtr<HEXA_NS::Vertex *>(iVertex);
+    HEXA_NS::VertexShape* geomVertex = getHexaPtr<HEXA_NS::VertexShape*>(iGeomVertex);
+    if (_hexaDocument == NULL || vertex == NULL || geomVertex == NULL) return false;
+    HEXA_NS::NewShape* mainShape = geomVertex->getParentShape();
+    if (mainShape == NULL) return false;
 
-  HEXA_NS::Quad*   hQuad = getHexaPtr<HEXA_NS::Quad*>(iquad);
-  HEXA_NS::Vector* hVect = getHexaPtr<HEXA_NS::Vector*>(ivec);
+    //add association
+    if (vertex->setAssociation(geomVertex) != HOK)
+        return false;
 
-  HEXA_NS::Elements* hElts = _hexaDocument->prismQuad( hQuad, hVect, nb );
+    //update association state in the model
+    newAssoc =  QString(mainShape->getName()) + "," + QString::number(geomVertex->getIdent()) + ";";
+    setData( iVertex, QVariant::fromValue(newAssoc), HEXA_ASSOC_ENTRY_ROLE );
 
-  if ( hElts->isValid() ){
-    updateData(); //CS_TODO more or less?
-    ElementsItem* elts = new ElementsItem(hElts);
-    _elementsDirItem->appendRow(elts);
-    iElts = elts->index();
-  } else {
-    delete hElts;
-  }
+    return true;
+}
 
-  return iElts;
+bool DocumentModel::addEdgeAssociation( const QModelIndex& iEdge, const QModelIndex& iGeomEdge, double start, double end)
+{
+    //parameters control
+    QString currentAssoc, newAssoc;
+    HEXA_NS::Edge* edge = getHexaPtr<HEXA_NS::Edge*>(iEdge);
+    HEXA_NS::EdgeShape* geomEdge = getHexaPtr<HEXA_NS::EdgeShape*>(iGeomEdge);
+    if (_hexaDocument == NULL || edge == NULL ||
+            geomEdge == NULL || start > end) return false;
+    HEXA_NS::NewShape* mainShape = geomEdge->getParentShape();
+    if (mainShape == NULL) return false;
+
+    //add association in the engine side
+    if (edge->addAssociation(geomEdge, start, end) != HOK)
+        return false;
+
+    //add/update association in the model side (UI)
+    currentAssoc = data(iEdge, HEXA_ASSOC_ENTRY_ROLE).toString();
+    newAssoc = QString(mainShape->getName()) + "," + QString::number(geomEdge->getIdent()) + ";";
+    if (!currentAssoc.isEmpty()) newAssoc = currentAssoc + newAssoc;
+
+    setData( iEdge, QVariant::fromValue(newAssoc), HEXA_ASSOC_ENTRY_ROLE );
+
+    return true;
 }
 
-QModelIndex DocumentModel::prismQuads( const QModelIndexList& iquads, const QModelIndex& ivec, int nb)
+
+bool DocumentModel::addQuadAssociation (const QModelIndex& iQuad, const QModelIndex& iGeomFace)
 {
-  QModelIndex iElts;
+    //parameters control
+    QString currentAssoc, newAssoc;
+    HEXA_NS::Quad* quad = getHexaPtr<HEXA_NS::Quad*>(iQuad);
+    HEXA_NS::FaceShape* geomFace = getHexaPtr<HEXA_NS::FaceShape*>(iGeomFace);
+    if (_hexaDocument == NULL || quad == NULL || geomFace == NULL)
+        return false;
+    HEXA_NS::NewShape* mainShape = geomFace->getParentShape();
+    if (mainShape == NULL) return false;
 
-  HEXA_NS::Quads   hQuads;
-  HEXA_NS::Quad*   hQuad = NULL;
-  foreach( const QModelIndex& iquad, iquads ){
-    hQuad = getHexaPtr<HEXA_NS::Quad*>(iquad);
-    hQuads.push_back( hQuad );
-  }
-  HEXA_NS::Vector* hVect = getHexaPtr<HEXA_NS::Vector*>(ivec);
+    //add association
+    if (quad->addAssociation(geomFace) != HOK)
+        return false;
 
-  HEXA_NS::Elements* hElts = _hexaDocument->prismQuads( hQuads, hVect, nb );
-  if ( hElts->isValid() ){
-    updateData(); //CS_TODO more or less?
-    ElementsItem* elts = new ElementsItem(hElts);
-    _elementsDirItem->appendRow(elts);
-    iElts = elts->index();
-  } else {
-    delete hElts;
-  }
-  return iElts;
+    //update association
+    currentAssoc = data( iQuad, HEXA_ASSOC_ENTRY_ROLE).toString();
+    newAssoc = QString(mainShape->getName()) + "," + QString::number(geomFace->getIdent()) + ";";
+    if (!currentAssoc.isEmpty()) newAssoc = currentAssoc + newAssoc;
+    setData( iQuad, QVariant::fromValue(newAssoc), HEXA_ASSOC_ENTRY_ROLE );
+
+    return true;
+}
+
+
+QModelIndex DocumentModel::getVertexAssociation(const QModelIndex& iVertex)
+{
+    HEXA_NS::Vertex* vertex = getHexaPtr<HEXA_NS::Vertex*>(iVertex);
+    if (vertex == NULL)
+        return QModelIndex();
+
+    //get the associated geom vertex
+    HEXA_NS::VertexShape* geomVertex = vertex->getAssociation();
+    if (geomVertex == NULL)
+        return QModelIndex();
+
+    //convert geom vertex to qmodelindex
+    PatternGeomSelectionModel* pgsm = HEXABLOCKGUI::currentDocGView->getPatternGeomSelectionModel();
+    if (pgsm == NULL)
+        return QModelIndex();
+
+    return pgsm->indexBy(HEXA_DATA_ROLE, QVariant::fromValue(geomVertex));
+}
+
+
+QModelIndexList DocumentModel::getEdgeAssociations(const QModelIndex& iEdge)
+{
+    QModelIndexList result;
+    HEXA_NS::Edge* edge = getHexaPtr<HEXA_NS::Edge*>(iEdge);
+    if (edge == NULL) return result;
+
+    HEXA_NS::EdgeShape* geomEdge;
+    HEXA_NS::AssoEdge* anEdgeAssoc;
+
+    PatternGeomSelectionModel* pGSModel = HEXABLOCKGUI::currentDocGView->getPatternGeomSelectionModel();
+    int nbAssocs = edge->countAssociation();
+    for (int i = 0; i < nbAssocs; ++i)
+    {
+        anEdgeAssoc = edge->getAssociation(i);
+        if (anEdgeAssoc == NULL) continue;
+        geomEdge = anEdgeAssoc->getEdgeShape();
+        if (geomEdge == NULL) continue;
+        result << pGSModel->indexBy( HEXA_DATA_ROLE, QVariant::fromValue(geomEdge));
+    }
+
+    return result;
+}
+
+
+QModelIndexList DocumentModel::getQuadAssociations(const QModelIndex& iQuad)
+{
+    QModelIndexList result;
+    QModelIndex geomQuadIndex;
+    HEXA_NS::Quad* quad = getHexaPtr<HEXA_NS::Quad*>(iQuad);
+    if (quad == NULL) return result;
+
+    if (HEXABLOCKGUI::currentDocGView == NULL) return result;
+    PatternGeomSelectionModel* pgsm = HEXABLOCKGUI::currentDocGView->getPatternGeomSelectionModel();
+    PatternGeomModel* pgm = HEXABLOCKGUI::currentDocGView->getPatternGeomModel();
+    if (pgsm == NULL || pgm == NULL) return result;
+
+    HEXA_NS::FaceShape* geomFace;
+
+    int nbAssocs = quad->countAssociation();
+    for (int i = 0; i < nbAssocs; ++i)
+    {
+        geomFace = quad->getAssociation(i);
+        if (geomFace == NULL) continue;
+
+        geomQuadIndex = pgsm->indexBy( HEXA_DATA_ROLE, QVariant::fromValue(geomFace) );
+        result << geomQuadIndex;
+    }
+
+    return result;
+}
+
+
+bool DocumentModel::associateOpenedLine( const QModelIndexList& iedges,
+        HEXA_NS::NewShapes shapes,
+        HEXA_NS::IntVector subIds,
+        double pstart,
+        double pend )
+{
+
+    HEXA_NS::Edges  mline;
+
+    HEXA_NS::Edge* hedge = NULL;
+    foreach( const QModelIndex& iedge, iedges ){
+        hedge = getHexaPtr<HEXA_NS::Edge*>(iedge);
+        if (hedge != NULL)
+            mline.push_back( hedge );
+    }
+
+    int err = _hexaDocument->associateOpenedLine( mline, shapes, subIds, pstart, pend );
+    if ( err == HOK ){
+        updateData();
+        return true;
+    }
+    return false;
 }
 
-QModelIndex DocumentModel::prismQuads( const QModelIndexList& iquads, const QModelIndex& ivec, std::vector<double> layersSize, int nb)
+bool DocumentModel::associateClosedLine( const  QModelIndex& ivertex,
+        const  QModelIndexList& iedges,
+        HEXA_NS::NewShapes shapes,
+        HEXA_NS::IntVector subIds,
+        double pstart,
+        bool   inv )
 {
-       QModelIndex iElts;
+    HEXA_NS::Vertex* mfirst = getHexaPtr<HEXA_NS::Vertex*>(ivertex);
+    HEXA_NS::Edges   mline;
 
-        HEXA_NS::Quads   hQuads;
-         HEXA_NS::Quad*   hQuad = NULL;
-         foreach( const QModelIndex& iquad, iquads ){
-           hQuad = getHexaPtr<HEXA_NS::Quad*>(iquad);
-           hQuads.push_back( hQuad );
-         }
-         HEXA_NS::Vector* hVect = getHexaPtr<HEXA_NS::Vector*>(ivec);
+    HEXA_NS::Edge* hedge = NULL;
+    foreach( const QModelIndex& iedge, iedges ){
+        hedge = getHexaPtr<HEXA_NS::Edge*>(iedge);
+        if (hedge != NULL)
+            mline.push_back( hedge );
+    }
 
-       HEXA_NS::Elements* hElts = _hexaDocument->prismQuadsVec( hQuads, hVect, layersSize, nb );
-       if ( hElts->isValid() ){
-               updateData(); //CS_TODO more or less?
-               ElementsItem* elts = new ElementsItem(hElts);
-               _elementsDirItem->appendRow(elts);
-               iElts = elts->index();
-       } else {
-               delete hElts;
-       }
-       return iElts;
+    int err = _hexaDocument->associateClosedLine( mfirst, mline, shapes, subIds, pstart, inv);
+    if ( err == HOK ){
+        updateData();
+        return true;
+    }
+    return false;
 }
 
+// ************  GROUPS  ************
 //
-QModelIndex DocumentModel::joinQuad(
-      const QModelIndex& iquadstart, const QModelIndex& iquaddest,
-      const QModelIndex& iv0, const QModelIndex& iv1,
-      const QModelIndex& iv2, const QModelIndex& iv3,
-      int nb )
+QModelIndex DocumentModel::addGroup( const QString& name, Group kind )
 {
-  QModelIndex iElts;
+    QModelIndex iGroup;
 
-  HEXA_NS::Quad*   hQuadStart  = getHexaPtr<HEXA_NS::Quad*>(iquadstart);
-  HEXA_NS::Quad*   hQuadDest   = getHexaPtr<HEXA_NS::Quad*>(iquaddest);
+    HEXA_NS::Group* hGroup = _hexaDocument->addGroup( name.toLocal8Bit().constData(), kind );
+    if ( hGroup == NULL ) return iGroup;
 
-  HEXA_NS::Vertex* hVertex0 = getHexaPtr<HEXA_NS::Vertex*>(iv0);
-  HEXA_NS::Vertex* hVertex1 = getHexaPtr<HEXA_NS::Vertex*>(iv1);
-  HEXA_NS::Vertex* hVertex2 = getHexaPtr<HEXA_NS::Vertex*>(iv2);
-  HEXA_NS::Vertex* hVertex3 = getHexaPtr<HEXA_NS::Vertex*>(iv3);
+    GroupItem* groupItem = new GroupItem(hGroup);
+    groupItem->setData( _entry, HEXA_DOC_ENTRY_ROLE );
+    _groupDirItem->appendRow(groupItem);
+    iGroup = groupItem->index();
 
-  HEXA_NS::Elements* hElts = _hexaDocument->joinQuad( hQuadStart, hQuadDest,
-                        hVertex0,  hVertex1,  hVertex2,  hVertex3, nb );
+    return iGroup;
+}
 
-  if ( hElts->isValid() ){
-    updateData(); //CS_TODO more or less?
-    ElementsItem* elts = new ElementsItem(hElts);
-    _elementsDirItem->appendRow(elts);
-    iElts = elts->index();
-  } else {
-    delete hElts;
-  }
 
-  return iElts;
+bool DocumentModel::removeGroup( const QModelIndex& igrp )
+{
+    HEXA_NS::Group* hGroup = data(igrp, HEXA_DATA_ROLE).value<HEXA_NS::Group *>();
+    int r = _hexaDocument->removeGroup ( hGroup );
+
+    if ( r == HOK ){
+        removeRow( igrp.row(), igrp.parent());
+        return true;
+    }
+
+    return false;
 }
 
-QModelIndex DocumentModel::joinQuads( 
-      const QModelIndexList& iquadsstart, const QModelIndex& iquaddest,
-      const QModelIndex& iv0, const QModelIndex& iv1,
-      const QModelIndex& iv2, const QModelIndex& iv3,
-      int nb )
+
+QModelIndexList DocumentModel::getGroupElements( const QModelIndex& iGroup, DocumentModel::Group& kind ) const
 {
-  QModelIndex iElts;
+    QModelIndexList iElements;
+
+    HEXA_NS::Group* g = iGroup.data(HEXA_DATA_ROLE).value<HEXA_NS::Group *>();
+    if ( g == NULL ) return iElements;
+
+    QModelIndexList iFound;
+    QVariant q;
+    HEXA_NS::EltBase* eltBase = NULL;
+    int nbElement = g->countElement();
+    for ( int nr = 0; nr < nbElement; ++nr ){
+        eltBase = g->getElement( nr );
+        kind = g->getKind();
+        switch ( kind ){
+        case HEXA_NS::HexaCell: case HEXA_NS::HexaNode: q = QVariant::fromValue( (HEXA_NS::Hexa *)eltBase ); break;
+        case HEXA_NS::QuadCell: case HEXA_NS::QuadNode: q = QVariant::fromValue( (HEXA_NS::Quad *)eltBase ); break;
+        case HEXA_NS::EdgeCell: case HEXA_NS::EdgeNode: q = QVariant::fromValue( (HEXA_NS::Edge *)eltBase ); break;
+        case HEXA_NS::VertexNode: q = QVariant::fromValue( (HEXA_NS::Vertex *)eltBase ); break;
+        }
+        iFound = match( index(0, 0),
+                HEXA_DATA_ROLE,
+                q,
+                1,
+                Qt::MatchRecursive );
+        if ( !iFound.isEmpty() )
+            iElements << iFound[0];
+    }
+    return iElements;
+}
 
-  HEXA_NS::Quad*   hQuadStart;
-  HEXA_NS::Quads  hQuadsStart;
+// 7.4 Boite: éditer un groupe
+void DocumentModel::setGroupName( const QModelIndex& igrp, const QString& name )
+{
+    HEXA_NS::Group* hGroup = data(igrp, HEXA_DATA_ROLE).value<HEXA_NS::Group *>();
 
-  foreach( const QModelIndex& iquad, iquadsstart ){
-    hQuadStart = data( iquad, HEXA_DATA_ROLE ).value<HEXA_NS::Quad *>();
-    hQuadsStart.push_back( hQuadStart );
-  }
-  HEXA_NS::Quad*   hQuadDest = data( iquaddest, HEXA_DATA_ROLE ).value<HEXA_NS::Quad *>();
+    if ( hGroup ){
+        hGroup->setName( name.toLocal8Bit().constData() );
+        setData(igrp, QVariant::fromValue( name ) );
+    }
+}
 
-  HEXA_NS::Vertex* hVertex0 = getHexaPtr<HEXA_NS::Vertex*>(iv0);
-  HEXA_NS::Vertex* hVertex1 = getHexaPtr<HEXA_NS::Vertex*>(iv1);
-  HEXA_NS::Vertex* hVertex2 = getHexaPtr<HEXA_NS::Vertex*>(iv2);
-  HEXA_NS::Vertex* hVertex3 = getHexaPtr<HEXA_NS::Vertex*>(iv3);
+bool DocumentModel::addGroupElement( const QModelIndex& igrp, const QModelIndex& ielt )
+{
+    HEXA_NS::Group*   hGroup = data(igrp, HEXA_DATA_ROLE).value<HEXA_NS::Group *>();
+    if (hGroup == NULL) return false;
 
-  HEXA_NS::Elements* hElts = _hexaDocument->joinQuads(
-                        hQuadsStart, hQuadDest,
-                        hVertex0,  hVertex1,  hVertex2,  hVertex3,
-                        nb );
+    HEXA_NS::EltBase* hElt   = NULL;
+    switch ( hGroup->getKind() ){
+    case HEXA_NS::HexaCell: case HEXA_NS::HexaNode: hElt = getHexaPtr<HEXA_NS::Hexa*>(ielt); break;
+    case HEXA_NS::QuadCell: case HEXA_NS::QuadNode: hElt = getHexaPtr<HEXA_NS::Quad*>(ielt); break;
+    case HEXA_NS::EdgeCell: case HEXA_NS::EdgeNode: hElt = getHexaPtr<HEXA_NS::Edge*>(ielt); break;
+    case HEXA_NS::VertexNode: hElt = getHexaPtr<HEXA_NS::Vertex*>(ielt); break;
+    }
 
-  if ( hElts->isValid() ){
-    updateData(); //CS_TODO more or less?
-    ElementsItem* elts = new ElementsItem(hElts);
-    _elementsDirItem->appendRow(elts);
-    iElts = elts->index();
-  } else {
-    delete hElts;
-  }
+    int res = HERR;
+    if ( hElt != NULL )
+        res = hGroup->addElement( hElt );
+
+    if ( res == HOK ) return true;
 
-  return iElts;
+    return false;
 }
 
-bool DocumentModel::mergeVertices( const QModelIndex &iv0, const QModelIndex &iv1 ) //CS_TODO : impact sur le model?
+bool DocumentModel::removeGroupElement( const QModelIndex& igrp, int nro )
+{ //CS_TODO : remove child?
+    HEXA_NS::Group* hGroup = data(igrp, HEXA_DATA_ROLE).value<HEXA_NS::Group *>();
+    if (hGroup == NULL) return false;
+
+    if (hGroup->removeElement( nro ) == HOK) return true;
+
+    return false;
+}
+
+bool DocumentModel::clearGroupElement( const QModelIndex& igrp )
 {
-  bool ret = false;
+    HEXA_NS::Group* hGroup = data(igrp, HEXA_DATA_ROLE).value<HEXA_NS::Group *>();
 
-  HEXA_NS::Vertex* hv0 = getHexaPtr<HEXA_NS::Vertex*>(iv0);
-  HEXA_NS::Vertex* hv1 = getHexaPtr<HEXA_NS::Vertex*>(iv1);
+    if ( hGroup != NULL)
+    {
+        hGroup->clearElement();
+        return true;
+    }
+    return false;
+}
+
+// ************  LAWS  ************
+
+//
+QModelIndex DocumentModel::addLaw( const QString& name, int nbnodes )
+{
+    QModelIndex iLaw;
 
-  int r = _hexaDocument->mergeVertices( hv0, hv1 );
-  if ( r == HOK ){
-    updateData(); //CS_TODO more or less?
-    ret = true;
-  } else if ( r == HERR ){
-    ret = false;
-  }
+    HEXA_NS::Law* hLaw = _hexaDocument->addLaw( name.toLocal8Bit().constData(), nbnodes );
+    if ( BadElement(hLaw) ) return iLaw;
 
-  return ret;
+    LawItem* lawItem = new LawItem(hLaw);
+    _lawDirItem->appendRow(lawItem);
+    iLaw = lawItem->index();
+
+    return iLaw;
 }
 
-bool DocumentModel::mergeEdges( const QModelIndex &ie0, const QModelIndex &ie1,
-                                const QModelIndex &iv0, const QModelIndex &iv1 )
-//CS_TODO : impact sur le model?
+bool DocumentModel::setLaw( const QModelIndex& ilaw, int nbnodes, double coeff, KindLaw type )
 {
-  bool ret = false;
+    bool ret = false;
 
-  HEXA_NS::Edge* he0 = getHexaPtr<HEXA_NS::Edge*>(ie0);
-  HEXA_NS::Edge* he1 = getHexaPtr<HEXA_NS::Edge*>(ie1);
+    HEXA_NS::Law* hLaw = data(ilaw, HEXA_DATA_ROLE).value<HEXA_NS::Law *>();
 
-  HEXA_NS::Vertex* hv0 = getHexaPtr<HEXA_NS::Vertex*>(iv0);
-  HEXA_NS::Vertex* hv1 = getHexaPtr<HEXA_NS::Vertex*>(iv1);
+    if ( hLaw ){
+        int ok;
+        ok = hLaw->setNodes( nbnodes );
+        ( ok == HOK) ? ret = true : ret = false;
+        ok = hLaw->setCoefficient( coeff );
+        hLaw->setKind(type);
+    }
 
-  int r = _hexaDocument->mergeEdges( he0, he1, hv0, hv1 ); 
-  if ( r == HOK ){
-    updateData();
-    ret = true;
-  } else if ( r == HERR ){
-    ret = false;
-  }
+    return ret;
+}
 
-  return ret;
+//
+bool  DocumentModel::removeLaw( const QModelIndex& ilaw )
+{
+    HEXA_NS::Law* hLaw = data(ilaw, HEXA_DATA_ROLE).value<HEXA_NS::Law *>();
+    int r = _hexaDocument->removeLaw( hLaw );
+
+    if ( r == HOK ){
+        removeRow( ilaw.row(),  ilaw.parent());
+        return true;
+    }
+
+    return false;
 }
 
-bool DocumentModel::mergeQuads( const QModelIndex& iquad0, const QModelIndex& iquad1,
-                                const QModelIndex& iv0, const QModelIndex& iv1,
-                                const QModelIndex& iv2, const QModelIndex& iv3 )
+bool DocumentModel::setPropagation( const QModelIndex& iPropagation, const QModelIndex& iLaw, bool way )
+{
+    HEXA_NS::Propagation* hPropagation = data(iPropagation, HEXA_DATA_ROLE).value<HEXA_NS::Propagation *>();
+    HEXA_NS::Law* hLaw = data(iLaw, HEXA_DATA_ROLE).value<HEXA_NS::Law *>();
+
+    int r = hPropagation->setLaw( hLaw );
+    hPropagation->setWay( way );
+
+    if ( r == HOK ) return true;
+
+    return false;
+}
+
+
+QModelIndexList DocumentModel::getPropagation( const QModelIndex& iPropagation ) const
+{
+    QModelIndexList iEdges;
+
+    QModelIndexList iFound;
+    HEXA_NS::Propagation* propa = iPropagation.data(HEXA_DATA_ROLE).value<HEXA_NS::Propagation *>();
+    if ( propa == NULL ) return iEdges;
+
+    const HEXA_NS::Edges& edges = propa->getEdges();
+    for ( HEXA_NS::Edges::const_iterator anEdge = edges.begin(), endIt = edges.end();
+            anEdge != endIt;
+            ++anEdge ){
+        iFound = match( index(0, 0),
+                HEXA_DATA_ROLE,
+                QVariant::fromValue( *anEdge ),
+                1,
+                Qt::MatchRecursive);
+        if ( !iFound.isEmpty() )
+            iEdges << iFound[0];
+    }
+
+    return iEdges;
+}
+
+HEXA_NS::Document* DocumentModel::documentImpl()
+{
+    return _hexaDocument;
+}
+
+QString DocumentModel::documentEntry()
+{
+    return _entry;
+}
+
+// 8.3 Boite: éditer une loi  CS_TODO
+// (idem création)
+
+/*****************************************************************
+                      PatternDataModel
+ *****************************************************************/
+
+PatternDataModel::PatternDataModel( QObject * parent ) :
+                              QSortFilterProxyModel( parent )
+{
+    QString dataRegExp = QString("(%1|%2|%3|%4|%5|%6|%7|%8|%9|%10|%11|%12)").
+            arg(VERTEX_TREE).arg(EDGE_TREE).arg(QUAD_TREE).arg(HEXA_TREE).arg(VECTOR_TREE).arg(ELEMENTS_TREE).
+            arg(VERTEX_DIR_TREE).arg(EDGE_DIR_TREE).arg(QUAD_DIR_TREE).arg(HEXA_DIR_TREE).arg(VECTOR_DIR_TREE).
+            arg(ELEMENTS_DIR_TREE);
+
+    setFilterRole(HEXA_TREE_ROLE);
+    setFilterRegExp ( QRegExp(dataRegExp) );
+}
+
+// *** Pour suppression des panneaux "Builder" et "Geometry" ****/
+
+//PatternDataModel::PatternDataModel( QObject * parent ) :
+//                              QSortFilterProxyModel( parent )
+//{
+//    QString dataRegExp = QString("(%1|%2|%3|%4|%5|%6|%7|%8|%9|%10|%11|%12|%13|%14|%15|%16|%17|%18|%19|%20|%21|%22|%23|%24|%25|%26)").
+//            arg(VERTEX_TREE).arg(EDGE_TREE).arg(QUAD_TREE).arg(HEXA_TREE).
+//            arg(VERTEX_DIR_TREE).arg(EDGE_DIR_TREE).arg(QUAD_DIR_TREE).
+//            arg(HEXA_DIR_TREE).arg(VECTOR_TREE).arg(ELEMENTS_TREE).
+//            arg(VECTOR_DIR_TREE).arg(ELEMENTS_DIR_TREE).
+//            arg(IMPLICIT_SHAPES_TREE).arg(EXPLICIT_SHAPES_TREE).arg(CLOUD_OF_POINTS_TREE).
+//            arg(GEOMSHAPE_TREE).arg(GEOMPOINT_TREE).arg(GEOMEDGE_TREE).arg(GEOMFACE_TREE).
+//            arg(IMPLICIT_SHAPES_DIR_TREE).arg(EXPLICIT_SHAPES_DIR_TREE).arg(CLOUD_OF_POINTS_DIR_TREE).
+//            arg(GEOMSHAPE_DIR_TREE).arg(GEOMPOINT_DIR_TREE).arg(GEOMEDGE_DIR_TREE).arg(GEOMFACE_DIR_TREE);
+//
+//    setFilterRole(HEXA_TREE_ROLE);
+//    setFilterRegExp ( QRegExp(dataRegExp) );
+//}
+
+// ****************
+
+PatternDataModel::~PatternDataModel()
+{
+}
+
+HEXA_NS::Document* PatternDataModel::documentImpl()
+{
+    HEXA_NS::Document* doc = NULL;
+    DocumentModel *m = dynamic_cast<DocumentModel *>( sourceModel() );
+    if (m) doc = m->documentImpl();
+    return doc;
+}
+
+QString PatternDataModel::documentEntry()
+{
+    QString entry;
+    DocumentModel *m = dynamic_cast<DocumentModel *>( sourceModel() );
+    if (m) entry = m->documentEntry();
+    return entry;
+}
+
+Qt::ItemFlags PatternDataModel::flags(const QModelIndex &index) const
+{
+    Qt::ItemFlags flags;
+
+    DocumentModel *m = dynamic_cast<DocumentModel *>( sourceModel() );
+    if ( m != NULL ){
+        flags = m->flags( mapToSource(index) );
+    }
+    return flags;
+}
+
+
+QVariant PatternDataModel::headerData ( int section, Qt::Orientation orientation, int role ) const
+{
+    if ( section == 0 && orientation == Qt::Horizontal && role == Qt::DisplayRole ){
+        return QVariant( "Data" );
+    } else {
+        return QSortFilterProxyModel::headerData ( section, orientation, role );
+    }
+}
+
+
+QStandardItem* PatternDataModel::itemFromIndex ( const QModelIndex & index ) const
 {
-  bool ret = false;
+    QStandardItem *item = NULL;
+    DocumentModel *m = dynamic_cast<DocumentModel *>( sourceModel() );
+    if ( m != NULL ){
+        item = m->itemFromIndex( mapToSource(index) );
+    }
+    return item;
+}
 
-  HEXA_NS::Quad* hquad0 = data(iquad0, HEXA_DATA_ROLE).value<HEXA_NS::Quad *>();
-  HEXA_NS::Quad* hquad1 = data(iquad1, HEXA_DATA_ROLE).value<HEXA_NS::Quad *>();
+//PatternBuilderModel::PatternBuilderModel( QObject * parent ) :
+//                              QSortFilterProxyModel( parent )
+//{
+//    QString builderRegExp =QString("(%1|%2|%3|%4|%5|%6)").
+//            arg(VECTOR_TREE).arg(ELEMENTS_TREE).
+//            arg(CROSSELEMENTS_TREE).arg(VECTOR_DIR_TREE).arg(ELEMENTS_DIR_TREE).arg(CROSSELEMENTS_DIR_TREE);
+//
+//    setFilterRole( HEXA_TREE_ROLE );
+//    setFilterRegExp ( QRegExp( builderRegExp ) );
+//}
+
+//PatternBuilderModel::~PatternBuilderModel()
+//{
+//}
+
+//Qt::ItemFlags PatternBuilderModel::flags(const QModelIndex &index) const
+//{
+//    Qt::ItemFlags flags;
+//
+//    DocumentModel *m = dynamic_cast<DocumentModel *>( sourceModel() );
+//    if ( m != NULL ){
+//        flags = m->flags( mapToSource(index) );
+//    }
+//    return flags;
+//}
+
+//QVariant PatternBuilderModel::headerData ( int section, Qt::Orientation orientation, int role ) const
+//{
+//    if ( section == 0 && orientation == Qt::Horizontal && role == Qt::DisplayRole ){
+//        return QVariant( "Builder" );
+//    } else {
+//        return QSortFilterProxyModel::headerData ( section, orientation, role );
+//    }
+//}
+
+//QStandardItem* PatternBuilderModel::itemFromIndex ( const QModelIndex & index ) const
+//{
+//    QStandardItem *item = NULL;
+//    DocumentModel *m = dynamic_cast<DocumentModel *>( sourceModel() );
+//    if ( m != NULL ){
+//        item = m->itemFromIndex( mapToSource(index) );
+//    }
+//    return item;
+//}
+
+//====================================================================
+//              PatternGeomModel
+//====================================================================
+PatternGeomModel::PatternGeomModel( QObject * parent ) :
+                              QSortFilterProxyModel( parent )
+{
+    QString builderRegExp =QString("(%1|%2|%3|%4|%5|%6|%7|%8|%9|%10|%11|%12|%13|%14)").
+            arg(EXPLICIT_SHAPES_TREE).arg(IMPLICIT_SHAPES_TREE).arg(CLOUD_OF_POINTS_TREE).
+            arg(GEOMSHAPE_TREE).arg(GEOMPOINT_TREE).arg(GEOMEDGE_TREE).arg(GEOMFACE_TREE).
+            arg(EXPLICIT_SHAPES_DIR_TREE).arg(IMPLICIT_SHAPES_DIR_TREE).arg(CLOUD_OF_POINTS_DIR_TREE).
+            arg(GEOMSHAPE_DIR_TREE).arg(GEOMPOINT_DIR_TREE).arg(GEOMEDGE_DIR_TREE).arg(GEOMFACE_DIR_TREE);
+
+    setFilterRole( HEXA_TREE_ROLE );
+    setFilterRegExp ( QRegExp(builderRegExp ) );
+}
+
+PatternGeomModel::~PatternGeomModel()
+{
+}
+
+Qt::ItemFlags PatternGeomModel::flags(const QModelIndex &index) const
+{
+    Qt::ItemFlags flags;
+
+    DocumentModel *m = dynamic_cast<DocumentModel *>( sourceModel() );
+    if ( m != NULL ){
+        flags = m->flags( mapToSource(index) );
+    }
+    return flags;
+}
+
+QVariant PatternGeomModel::headerData ( int section, Qt::Orientation orientation, int role ) const
+{
+    if ( section == 0 && orientation == Qt::Horizontal && role == Qt::DisplayRole ){
+        return QVariant( "Geometry" );
+    } else {
+        return QSortFilterProxyModel::headerData ( section, orientation, role );
+    }
+}
+
+QStandardItem* PatternGeomModel::itemFromIndex ( const QModelIndex & index ) const
+{
+    QStandardItem *item = NULL;
+    DocumentModel *m = dynamic_cast<DocumentModel *>( sourceModel() );
+    if ( m != NULL ){
+        item = m->itemFromIndex( mapToSource(index) );
+    }
+    return item;
+}
+//==============================================================
+
+
+AssociationsModel::AssociationsModel( QObject * parent ) :
+                              QSortFilterProxyModel( parent )
+{
+    QString assocRegExp;
+
+    setFilterRole( HEXA_TREE_ROLE );
+    setFilterRegExp ( QRegExp(assocRegExp) );
+}
+
+AssociationsModel::~AssociationsModel()
+{
+}
+
+Qt::ItemFlags AssociationsModel::flags(const QModelIndex &index) const
+{
+    Qt::ItemFlags flags;
+
+    DocumentModel *m = dynamic_cast<DocumentModel *>( sourceModel() );
+    if ( m != NULL ){
+        flags = m->flags( mapToSource(index) );
+    }
+    return flags;
+}
+
+QVariant AssociationsModel::headerData ( int section, Qt::Orientation orientation, int role ) const
+{
+    if ( section == 0 && orientation == Qt::Horizontal && role == Qt::DisplayRole ){
+        return QVariant( "Associations" );
+    } else {
+        return QSortFilterProxyModel::headerData ( section, orientation, role );
+    }
+}
+
+QStandardItem* AssociationsModel::itemFromIndex ( const QModelIndex & index ) const
+{
+    QStandardItem *item = NULL;
+    DocumentModel *m = dynamic_cast<DocumentModel *>( sourceModel() );
+    if ( m != NULL ){
+        item = m->itemFromIndex( mapToSource(index) );
+    }
+    return item;
+}
+
+GroupsModel::GroupsModel( QObject * parent ) :
+                              QSortFilterProxyModel( parent )
+{
+    QString groupsRegExp =QString("(%1|%2)").arg(GROUP_TREE).arg(GROUP_DIR_TREE);
+
+    setFilterRole( HEXA_TREE_ROLE );
+    setFilterRegExp ( QRegExp(groupsRegExp ) );
+}
+
+GroupsModel::~GroupsModel()
+{
+}
+
+Qt::ItemFlags GroupsModel::flags(const QModelIndex &index) const
+{
+    Qt::ItemFlags flags;
+
+    DocumentModel *m = dynamic_cast<DocumentModel *>( sourceModel() );
+    if ( m != NULL ){
+        flags = m->flags( mapToSource(index) );
+    }
+    return flags;
+}
+
+QVariant GroupsModel::headerData ( int section, Qt::Orientation orientation, int role ) const
+{
+    if ( section == 0 && orientation == Qt::Horizontal && role == Qt::DisplayRole ){
+        return QVariant( "Groups" );
+    } else {
+        return QSortFilterProxyModel::headerData ( section, orientation, role );
+    }
+}
+
+QStandardItem* GroupsModel::itemFromIndex ( const QModelIndex & index ) const
+{
+    QStandardItem *item = NULL;
+    DocumentModel *m = dynamic_cast<DocumentModel *>( sourceModel() );
+    if ( m != NULL ){
+        item = m->itemFromIndex( mapToSource(index) );
+    }
+    return item;
+}
+
+QModelIndexList GroupsModel::getGroupElements( const QModelIndex& iGroup, DocumentModel::Group& kind ) const
+{
+    QModelIndexList elements;
+    DocumentModel *m = dynamic_cast<DocumentModel *>( sourceModel() );
+    if ( m != NULL ){
+        elements = m->getGroupElements( mapToSource(iGroup), kind );
+    }
+    return elements;
+}
+
+MeshModel::MeshModel( QObject * parent ) :
+                              QSortFilterProxyModel( parent )
+{
+    QString meshRegExp =QString("(%1|%2|%3|%4)").arg(LAW_TREE).arg(LAW_DIR_TREE)                            .arg(PROPAGATION_TREE).arg(PROPAGATION_DIR_TREE);
+
+    setFilterRole( HEXA_TREE_ROLE );
+    setFilterRegExp ( QRegExp(meshRegExp) );
+}
+
+MeshModel::~MeshModel()
+{
+}
+
+Qt::ItemFlags MeshModel::flags(const QModelIndex &index) const
+{
+    Qt::ItemFlags flags;
+
+    DocumentModel *m = dynamic_cast<DocumentModel *>( sourceModel() );
+    if ( m != NULL ){
+        flags = m->flags( mapToSource(index) );
+    }
+    return flags;
+}
+
+QVariant MeshModel::headerData ( int section, Qt::Orientation orientation, int role ) const
+{
+    if ( section == 0 && orientation == Qt::Horizontal && role == Qt::DisplayRole ){
+        return QVariant( "Mesh" );
+    } else {
+        return QSortFilterProxyModel::headerData ( section, orientation, role );
+    }
+}
+
+QStandardItem* MeshModel::itemFromIndex ( const QModelIndex & index ) const
+{
+    QStandardItem *item = NULL;
+    DocumentModel *m = dynamic_cast<DocumentModel *>( sourceModel() );
+    if ( m != NULL ){
+        item = m->itemFromIndex( mapToSource(index) );
+    }
+    return item;
+}
+
+QModelIndexList MeshModel::getPropagation( const QModelIndex& iPropagation ) const
+{
+    QModelIndexList edges;
+    DocumentModel *m = dynamic_cast<DocumentModel *>( sourceModel() );
+    if ( m != NULL ){
+        edges = m->getPropagation( mapToSource(iPropagation) );
+    }
+    return edges;
+}
 
-  HEXA_NS::Vertex* hv0 = getHexaPtr<HEXA_NS::Vertex*>(iv0);
-  HEXA_NS::Vertex* hv1 = getHexaPtr<HEXA_NS::Vertex*>(iv1);
-  HEXA_NS::Vertex* hv2 = getHexaPtr<HEXA_NS::Vertex*>(iv2);
-  HEXA_NS::Vertex* hv3 = getHexaPtr<HEXA_NS::Vertex*>(iv3);
 
-  int r = _hexaDocument->mergeQuads( hquad0, hquad1, hv0, hv1, hv2, hv3 );
-  if ( r == HOK ){
-    updateData();
-    ret = true;
-  } else if ( r == HERR ){
-    ret = false;
-  }
+// ================================== NEW ======================================
 
-  return ret;
-}
+// ===== CARTESIAN GRID
 
-//
-QModelIndex DocumentModel::disconnectVertex( const QModelIndex& ihexa, const QModelIndex& ivertex )
+QModelIndex DocumentModel::makeCartesianTop(int nx, int ny, int nz)
 {
-  QModelIndex iElts;
+    QModelIndex result;
 
-  HEXA_NS::Hexa*   hHexa   = getHexaPtr<HEXA_NS::Hexa*>(ihexa);
-  HEXA_NS::Vertex* hVertex = getHexaPtr<HEXA_NS::Vertex*>(ivertex);
+    HEXA_NS::Elements* helts = _hexaDocument->makeCartesianTop( nx, ny, nz );
+    if ( BadElement(helts) )
+        return result;
 
-  HEXA_NS::Elements* hElts = _hexaDocument->disconnectVertex( hHexa, hVertex );
-
-  if ( hElts && hElts->isValid() ){
-    updateData(); //CS_TO_CHECK
-    ElementsItem* elts = new ElementsItem(hElts);
-    _elementsDirItem->appendRow(elts);
-    iElts = elts->index();
-  } else {
-    delete hElts;
-  }
+    result = addElementsToTree(helts, _elementsDirItem);
 
-  return iElts;
+    return result;
 }
 
-QModelIndex DocumentModel::disconnectEdge( const QModelIndex& ihexa, const QModelIndex& iedge )
+QModelIndex DocumentModel::makeCartesianUni(const QModelIndex& icenter,
+                            const QModelIndex& ibase, const QModelIndex& ivec, const QModelIndex& iaxis,
+                            double lx, double ly, double lz, int nx, int ny, int nz)
 {
-  QModelIndex iElts;
+    QModelIndex result;
 
-  HEXA_NS::Hexa* hHexa = getHexaPtr<HEXA_NS::Hexa*>(ihexa);
-  HEXA_NS::Edge* hEdge = getHexaPtr<HEXA_NS::Edge*>(iedge);
+    HEXA_NS::Vertex* hcenter = getHexaPtr<HEXA_NS::Vertex*>(icenter);
+    HEXA_NS::Vector* hbase   = getHexaPtr<HEXA_NS::Vector*>(ibase);
+    HEXA_NS::Vector* hvec    = getHexaPtr<HEXA_NS::Vector*>(ivec);
+    HEXA_NS::Vector* haxis   = getHexaPtr<HEXA_NS::Vector*>(iaxis);
 
-  HEXA_NS::Elements* hElts = _hexaDocument->disconnectEdge( hHexa, hEdge );
+    HEXA_NS::Elements* helts = _hexaDocument->makeCartesianUni( hcenter, hbase, hvec, haxis,
+                                                                lx, ly, lz, nx, ny, nz);
+    if ( BadElement(helts) )
+        return result;
 
-  if ( hElts->isValid() ){
-    updateData(); //CS_TO_CHECK
-    ElementsItem* elts = new ElementsItem(hElts);
-    _elementsDirItem->appendRow(elts);
-    iElts = elts->index();
-  } else {
-    delete hElts;
-  }
+    result = addElementsToTree(helts, _elementsDirItem);
 
-  return iElts;
+    return result;
 }
 
-
-QModelIndex DocumentModel::disconnectEdges( const QModelIndexList& ihexas, const QModelIndexList& iedges )
+QModelIndex DocumentModel::makeCartesian(const QModelIndex& icenter,
+                                         const QModelIndex& ibase, const QModelIndex& ivec, const QModelIndex& iaxis,
+                                         std::vector<double>& radius, std::vector<double>& angles, std::vector<double>& heights)
 {
-  QModelIndex iElts;
+    QModelIndex result;
 
-  HEXA_NS::Hexas hHexas;
-  HEXA_NS::Edges hEdges;
+    HEXA_NS::Vertex* hcenter = getHexaPtr<HEXA_NS::Vertex*>(icenter);
+    HEXA_NS::Vector* hbase   = getHexaPtr<HEXA_NS::Vector*>(ibase);
+    HEXA_NS::Vector* hvec    = getHexaPtr<HEXA_NS::Vector*>(ivec);
+    HEXA_NS::Vector* haxis   = getHexaPtr<HEXA_NS::Vector*>(iaxis);
 
-  //Construction de la liste des edges
-  HEXA_NS::Edge* hedge = NULL;
-  foreach( const QModelIndex& iedge, iedges ){
-    hedge = getHexaPtr<HEXA_NS::Edge*>(iedge);
-    hEdges.push_back( hedge );
-  }
+    HEXA_NS::Elements* helts = _hexaDocument->makeCartesian( hcenter, hbase, hvec, haxis,
+                                                             radius, angles, heights);
+    if ( BadElement(helts) )
+        return result;
 
-  //Construction de la liste des hexas
-  HEXA_NS::Hexa* hhexa = NULL;
-  foreach( const QModelIndex& ihexa, ihexas ){
-    hhexa = getHexaPtr<HEXA_NS::Hexa*>(ihexa);
-    hHexas.push_back( hhexa );
-  }
+    result = addElementsToTree(helts, _elementsDirItem);
 
-
-  HEXA_NS::Elements* hElts = _hexaDocument->disconnectEdges( hHexas, hEdges );
-
-  if ( hElts->isValid() ){
-    updateData(); //CS_TO_CHECK
-    ElementsItem* elts = new ElementsItem(hElts);
-    _elementsDirItem->appendRow(elts);
-    iElts = elts->index();
-  } else {
-    delete hElts;
-  }
-
-  return iElts;
+    return result;
 }
 
 
-QModelIndex DocumentModel::disconnectQuad( const QModelIndex& ihexa, const QModelIndex& iquad )
-{
-  QModelIndex iElts;
+// ===== SPHERE
 
-  HEXA_NS::Hexa* hHexa = getHexaPtr<HEXA_NS::Hexa*>(ihexa);
-  HEXA_NS::Quad* hQuad = getHexaPtr<HEXA_NS::Quad*>(iquad);
+QModelIndex DocumentModel::makeSphereTop (int nr, int na, int nh)
+{
+    QModelIndex result;
 
-  HEXA_NS::Elements* hElts = _hexaDocument->disconnectQuad( hHexa, hQuad );
+    HEXA_NS::Elements* helts = _hexaDocument->makeSphereTop( nr, na, nh );
+    if ( BadElement(helts) )
+        return result;
 
-  if ( hElts->isValid() ){
-    updateData(); //CS_TO_CHECK
-    ElementsItem* elts = new ElementsItem(hElts);
-    _elementsDirItem->appendRow(elts);
-    iElts = elts->index();
-  } else {
-    delete hElts;
-  }
+    result = addElementsToTree(helts, _elementsDirItem);
 
-  return iElts;
+    return result;
 }
 
-
-QModelIndex DocumentModel::cutEdge( const QModelIndex &i_e0, int nbcuts )
-//CS_TODO : impact sur le model?
+QModelIndex DocumentModel::makeSphereUni (QModelIndex& icenter,
+                                          QModelIndex& ivec_x, QModelIndex& ivec_z,
+                                          double rtrou, double rext, double ang,
+                                          QModelIndex& ivplan,
+                                          int nr, int na, int nh)
 {
-  QModelIndex iElts;
+    QModelIndex result;
 
-  HEXA_NS::Edge* he0 = getHexaPtr<HEXA_NS::Edge*>(i_e0);
-  HEXA_NS::Elements* helts = _hexaDocument->cut( he0, nbcuts );
+    HEXA_NS::Vertex* hcenter = getHexaPtr<HEXA_NS::Vertex*>(icenter);
+    HEXA_NS::Vector* hvec_x  = getHexaPtr<HEXA_NS::Vector*>(ivec_x);
+    HEXA_NS::Vector* hvec_z  = getHexaPtr<HEXA_NS::Vector*>(ivec_z);
+    HEXA_NS::Vertex* hvplan  = getHexaPtr<HEXA_NS::Vertex*>(ivplan);
 
-  if ( helts->isValid() ){
-    updateData(); //CS_TODO more?
-    ElementsItem* elts = new ElementsItem(helts);
-    _elementsDirItem->appendRow(elts);
-    iElts = elts->index();
-  } else {
-    delete helts;
-  }
+    HEXA_NS::Elements* helts = _hexaDocument->makeSphereUni( hcenter, hvec_x, hvec_z,
+                                                             rtrou, rext, ang, hvplan,
+                                                             nr, na, nh);
+    result = addElementsToTree(helts, _elementsDirItem);
 
-  return iElts;
+    return result;
 }
 
-
-
-
-// Elements makeTranslation( in Elements l, in Vector vec )
-//         raises (SALOME::SALOME_Exception);
-QModelIndex DocumentModel::makeTranslation( const QModelIndex& ielts, const QModelIndex& ivec )
+QModelIndex DocumentModel::makeSphere    (QModelIndex& icenter,
+                                          QModelIndex& ivec_x, QModelIndex& ivec_z,
+                                          std::vector<double>& tray, std::vector<double>& tang, std::vector<double>& thaut)
 {
-  QModelIndex iElts;
+    QModelIndex result;
 
-  HEXA_NS::Elements* hElts = getHexaPtr<HEXA_NS::Elements*>(ielts);
-  HEXA_NS::Vector*   hVec  = getHexaPtr<HEXA_NS::Vector*>(ivec);
+    HEXA_NS::Vertex* hcenter = getHexaPtr<HEXA_NS::Vertex*>(icenter);
+    HEXA_NS::Vector* hvec_x  = getHexaPtr<HEXA_NS::Vector*>(ivec_x);
+    HEXA_NS::Vector* hvec_z  = getHexaPtr<HEXA_NS::Vector*>(ivec_z);
 
-  HEXA_NS::Elements* hNewElts = _hexaDocument->makeTranslation( hElts, hVec );
+    HEXA_NS::Elements* helts = _hexaDocument->makeSphere( hcenter, hvec_x, hvec_z,
+                                                          tray, tang, thaut);
 
-  if ( hNewElts->isValid() ){
-    updateData(); //CS_TODO  more or less?
-    ElementsItem* eltsItem = new ElementsItem(hNewElts);
-    _elementsDirItem->appendRow(eltsItem);
-    iElts = eltsItem->index();
-  } else {
-    delete hNewElts;
-  }
+    result = addElementsToTree(helts, _elementsDirItem);
 
-  return iElts;
+    return result;
 }
 
+// ====== SPHERICAL
 
-
-QModelIndex DocumentModel::makeScale( const QModelIndex& ielts, const QModelIndex& ivex, double k )
+QModelIndex DocumentModel::makeSphericalTop (int nbre, int crit)
 {
-  QModelIndex iElts;
+    QModelIndex result;
 
-  HEXA_NS::Elements* hElts = getHexaPtr<HEXA_NS::Elements*>(ielts);
-  HEXA_NS::Vertex*   hVex  = getHexaPtr<HEXA_NS::Vertex*>(ivex);
+    HEXA_NS::Elements* helts = _hexaDocument->makeSphericalTop(nbre, crit);
+    if (BadElement(helts))
+        return result;
 
-  HEXA_NS::Elements* hNewElts = _hexaDocument->makeScale( hElts, hVex, k );
-
-  if ( hNewElts->isValid() ){
-    updateData(); //CS_TODO  more or less?
-    ElementsItem* eltsItem = new ElementsItem(hNewElts);
-    _elementsDirItem->appendRow(eltsItem);
-    iElts = eltsItem->index();
-  } else {
-    delete hNewElts;
-  }
+    result = addElementsToTree(helts, _elementsDirItem);
 
-  return iElts;
+    return result;
 }
 
-
-
-QModelIndex DocumentModel::makeRotation( const QModelIndex& ielts, 
-                                         const QModelIndex& iv, 
-                                         const QModelIndex& ivec, double angle )
+QModelIndex DocumentModel::makeSphericalUni (QModelIndex& icenter,
+                                             QModelIndex& ivec_x, QModelIndex& ivec_z,
+                                             double rayon,
+                                             int nbre, int crit)
 {
-  QModelIndex iElts;
+    QModelIndex result;
 
-  HEXA_NS::Elements* hElts = getHexaPtr<HEXA_NS::Elements*>(ielts);
-  HEXA_NS::Vertex*   hVex  = getHexaPtr<HEXA_NS::Vertex*>(iv);
-  HEXA_NS::Vector*   hVec  = getHexaPtr<HEXA_NS::Vector*>(ivec);
+    HEXA_NS::Vertex* hcenter = getHexaPtr<HEXA_NS::Vertex*>(icenter);
+    HEXA_NS::Vector* hvec_x  = getHexaPtr<HEXA_NS::Vector*>(ivec_x);
+    HEXA_NS::Vector* hvec_z  = getHexaPtr<HEXA_NS::Vector*>(ivec_z);
 
-  HEXA_NS::Elements* hNewElts = _hexaDocument->makeRotation( hElts, hVex, hVec, angle );
+    HEXA_NS::Elements* helts = _hexaDocument->makeSphericalUni(hcenter, hvec_x, hvec_z, rayon, nbre, crit);
+    if (BadElement(helts))
+        return result;
 
-  if ( hNewElts->isValid() ){
-    updateData(); //CS_TODO  more or less?
-    ElementsItem* eltsItem = new ElementsItem(hNewElts);
-    _elementsDirItem->appendRow(eltsItem);
-    iElts = eltsItem->index();
-  } else {
-    delete hNewElts;
-  }
+    result = addElementsToTree(helts, _elementsDirItem);
 
-  return iElts;
+    return result;
 }
 
-
-QModelIndex DocumentModel::makeSymmetryPoint( const QModelIndex& ielts, const QModelIndex& iv )
+QModelIndex DocumentModel::makeSpherical    (QModelIndex& icenter,
+                                             QModelIndex& ivec_x, QModelIndex& ivec_z,
+                                             std::vector<double>& rayon,
+                                             int crit)
 {
-  QModelIndex iElts;
+    QModelIndex result;
 
-  HEXA_NS::Elements* hElts = getHexaPtr<HEXA_NS::Elements*>(ielts);
-  HEXA_NS::Vertex*   hVex  = getHexaPtr<HEXA_NS::Vertex*>(iv);
+    HEXA_NS::Vertex* hcenter = getHexaPtr<HEXA_NS::Vertex*>(icenter);
+    HEXA_NS::Vector* hvec_x = getHexaPtr<HEXA_NS::Vector*>(ivec_x);
+    HEXA_NS::Vector* hvec_z = getHexaPtr<HEXA_NS::Vector*>(ivec_z);
 
-  HEXA_NS::Elements* hNewElts = _hexaDocument->makeSymmetryPoint (hElts, hVex);
+    HEXA_NS::Elements* helts = _hexaDocument->makeSpherical(hcenter, hvec_x, hvec_z, rayon, crit);
+    if (BadElement(helts))
+        return result;
 
-  if ( hNewElts->isValid() ){
-    updateData(); //CS_TODO  more or less?
-    ElementsItem* eltsItem = new ElementsItem(hNewElts);
-    _elementsDirItem->appendRow(eltsItem);
-    iElts = eltsItem->index();
-  } else {
-    delete hNewElts;
-  }
+    result = addElementsToTree(helts, _elementsDirItem);
 
-  return iElts;
+    return result;
 }
 
-
-QModelIndex DocumentModel::makeSymmetryLine( const QModelIndex& ielts, 
-                                             const QModelIndex& iv, 
-                                             const QModelIndex& ivec )
+// ===== RIND
+QModelIndex DocumentModel::makeRindTop (int nr, int na, int nh)
 {
-  QModelIndex iElts;
-
-  HEXA_NS::Elements* hElts = getHexaPtr<HEXA_NS::Elements*>(ielts);
-  HEXA_NS::Vertex*   hVex  = getHexaPtr<HEXA_NS::Vertex*>(iv);
-  HEXA_NS::Vector*   hVec  = getHexaPtr<HEXA_NS::Vector*>(ivec);
-
+    QModelIndex result;
 
-  HEXA_NS::Elements* hNewElts = _hexaDocument->makeSymmetryLine( hElts, hVex, hVec );
+    HEXA_NS::Elements* helts = _hexaDocument->makeRindTop(nr, na, nh);
+    if (BadElement(helts))
+        return result;
 
-  if ( hNewElts->isValid() ){
-    updateData(); //CS_TODO  more or less?
-    ElementsItem* eltsItem = new ElementsItem(hNewElts);
-    _elementsDirItem->appendRow(eltsItem);
-    iElts = eltsItem->index();
-  } else {
-    delete hNewElts;
-  }
+    result = addElementsToTree(helts, _elementsDirItem);
 
-  return iElts;
+    return result;
 }
 
-
-QModelIndex DocumentModel::makeSymmetryPlane( const QModelIndex& ielts, const QModelIndex& iv, const QModelIndex& ivec )
+QModelIndex DocumentModel::makeRindUni (QModelIndex& icenter,
+                                        QModelIndex& ivec_x, QModelIndex& ivec_z,
+                                        double raytrou, double rint, double rext, double ang,
+                                        QModelIndex& ivplan,
+                                        int nr, int na, int nh)
 {
-  QModelIndex iElts;
+    QModelIndex result;
 
-  HEXA_NS::Elements* hElts = getHexaPtr<HEXA_NS::Elements*>(ielts);
-  HEXA_NS::Vertex*   hVex  = getHexaPtr<HEXA_NS::Vertex*>(iv);
-  HEXA_NS::Vector*   hVec  = getHexaPtr<HEXA_NS::Vector*>(ivec);
+    HEXA_NS::Vertex* hcenter = getHexaPtr<HEXA_NS::Vertex*>(icenter);
+    HEXA_NS::Vector* hvec_x = getHexaPtr<HEXA_NS::Vector*>(ivec_x);
+    HEXA_NS::Vector* hvec_z = getHexaPtr<HEXA_NS::Vector*>(ivec_z);
+    HEXA_NS::Vertex* hvplan = getHexaPtr<HEXA_NS::Vertex*>(ivplan);
 
-  HEXA_NS::Elements* hNewElts = _hexaDocument->makeSymmetryPlane( hElts, hVex, hVec );
+    HEXA_NS::Elements* helts = _hexaDocument->makeRindUni(hcenter, hvec_x, hvec_z, raytrou, rint, rext, ang,
+                                                          hvplan, nr, na, nh);
+    if (BadElement(helts))
+        return result;
 
-  if ( hNewElts->isValid() ){
-    updateData(); //CS_TODO  more or less?
-    ElementsItem* eltsItem = new ElementsItem(hNewElts);
-    _elementsDirItem->appendRow(eltsItem);
-    iElts = eltsItem->index();
-  } else {
-    delete hNewElts;
-  }
+    result = addElementsToTree(helts, _elementsDirItem);
 
-  return iElts;
+    return result;
 }
 
-
-bool DocumentModel::performTranslation( const QModelIndex& ielts, const QModelIndex& ivec )
+QModelIndex DocumentModel::makeRind    (QModelIndex& icenter,
+                                        QModelIndex& ivec_x, QModelIndex& ivec_z,
+                                        std::vector<double>& tray, std::vector<double>& tang, std::vector<double>& thaut)
 {
-  bool ret = false;
+    QModelIndex result;
 
-  HEXA_NS::Elements* hElts = getHexaPtr<HEXA_NS::Elements*>(ielts);
-  HEXA_NS::Vector*   hVec  = getHexaPtr<HEXA_NS::Vector*>(ivec);
+    HEXA_NS::Vertex* hcenter = getHexaPtr<HEXA_NS::Vertex*>(icenter);
+    HEXA_NS::Vector* hvec_x = getHexaPtr<HEXA_NS::Vector*>(ivec_x);
+    HEXA_NS::Vector* hvec_z = getHexaPtr<HEXA_NS::Vector*>(ivec_z);
 
-  int r = _hexaDocument->performTranslation (hElts, hVec);
-  if ( r == HOK ){
-    updateData();
-    ret = true;
-  } else if ( r == HERR ){
-    ret = false;
-  }
+    HEXA_NS::Elements* helts = _hexaDocument->makeRind(hcenter, hvec_x, hvec_z, tray, tang, thaut);
+    if (BadElement(helts))
+        return result;
 
-  return ret;
-}
+    result = addElementsToTree(helts, _elementsDirItem);
 
+    return result;
+}
 
-//
-bool DocumentModel::performScale( const QModelIndex& ielts, const QModelIndex& ivex, double k )
+// ======== Cylinder
+QModelIndex DocumentModel::makeCylinderTop(int nr, int na, int nh)
 {
-  bool ret = false;
+    QModelIndex result;
 
-  HEXA_NS::Elements* hElts = getHexaPtr<HEXA_NS::Elements*>(ielts);
-  HEXA_NS::Vertex*   hVex  = getHexaPtr<HEXA_NS::Vertex*>(ivex);
+    HEXA_NS::Elements* helts = _hexaDocument->makeCylinderTop(nr, na, nh);
+    if (BadElement(helts))
+        return result;
 
-  int r = _hexaDocument->performScale (hElts, hVex, k);
-  if ( r == HOK ){
-    updateData();
-    ret = true;
-  } else if ( r == HERR ){
-    ret = false;
-  }
+    result = addElementsToTree(helts, _elementsDirItem);
 
-  return ret;
+    return result;
 }
 
-//
-bool DocumentModel::performRotation( const QModelIndex& ielts, const QModelIndex& ivex, const QModelIndex& ivec, double angle )
+QModelIndex DocumentModel::makeCylinderUni(QModelIndex& iorig, QModelIndex& ivecx, QModelIndex& ivecz,
+                                           double rint, double rext, double angle, double haut,
+                                           int nr, int na, int nh)
 {
-  bool ret = false;
+    QModelIndex result;
 
-  HEXA_NS::Elements* hElts = getHexaPtr<HEXA_NS::Elements*>(ielts);
-  HEXA_NS::Vertex*   hVex  = getHexaPtr<HEXA_NS::Vertex*>(ivex);
-  HEXA_NS::Vector*   hVec  = getHexaPtr<HEXA_NS::Vector*>(ivec);
+    HEXA_NS::Vertex* horig = getHexaPtr<HEXA_NS::Vertex*>(iorig);
+    HEXA_NS::Vector* hvecx = getHexaPtr<HEXA_NS::Vector*>(ivecx);
+    HEXA_NS::Vector* hvecz = getHexaPtr<HEXA_NS::Vector*>(ivecz);
 
-  int r = _hexaDocument-> performRotation( hElts, hVex, hVec, angle );
-  if ( r == HOK ){
-    updateData();
-    ret = true;
-  } else if ( r == HERR ){
-    ret = false;
-  }
+    HEXA_NS::Elements* helts = _hexaDocument->makeCylinderUni(horig, hvecx, hvecz,
+                                                              rint, rext, angle, haut,
+                                                              nr, na, nh);
+    if (BadElement(helts))
+        return result;
 
-  return ret;
-}
+    result = addElementsToTree(helts, _elementsDirItem);
 
+    return result;
+}
 
-//
-bool DocumentModel::performSymmetryPoint( const QModelIndex& ielts, const QModelIndex& ivex )
+QModelIndex DocumentModel::makeCylinder(QModelIndex& iorig, QModelIndex& ivecx, QModelIndex& ivecz,
+                                        std::vector<double>& tray, std::vector<double>& tang, std::vector<double>& thaut)
 {
-  bool ret = false;
+    QModelIndex result;
 
-  HEXA_NS::Elements* hElts = getHexaPtr<HEXA_NS::Elements*>(ielts);
-  HEXA_NS::Vertex*   hVex  = getHexaPtr<HEXA_NS::Vertex*>(ivex);
+    HEXA_NS::Vertex* horig = getHexaPtr<HEXA_NS::Vertex*>(iorig);
+    HEXA_NS::Vector* hvecx = getHexaPtr<HEXA_NS::Vector*>(ivecx);
+    HEXA_NS::Vector* hvecz = getHexaPtr<HEXA_NS::Vector*>(ivecz);
 
-  int r = _hexaDocument->performSymmetryPoint( hElts, hVex );
-  if ( r == HOK ){
-    updateData();
-    ret = true;
-  } else if ( r == HERR ){
-    ret = false;
-  }
+    HEXA_NS::Elements* helts = _hexaDocument->makeCylinder(horig, hvecx, hvecz, tray, tang, thaut);
+    if (BadElement(helts))
+        return result;
 
-  return ret;
+    result = addElementsToTree(helts, _elementsDirItem);
+
+    return result;
 }
 
 
-bool DocumentModel::performSymmetryLine( const QModelIndex& ielts, const QModelIndex& ivex, const QModelIndex& ivec )
+// ======== Cylinders
+QModelIndex DocumentModel::makeCylinders(QModelIndex& iorig1, QModelIndex& ivecz1,  double r1, double h1,
+                                         QModelIndex& iorig2, QModelIndex& ivecz2, double r2, double h2)
 {
-  bool ret = false;
+    QModelIndex result;
 
-  HEXA_NS::Elements* hElts = getHexaPtr<HEXA_NS::Elements*>(ielts);
-  HEXA_NS::Vertex*   hVex  = getHexaPtr<HEXA_NS::Vertex*>(ivex);
-  HEXA_NS::Vector*   hVec  = getHexaPtr<HEXA_NS::Vector*>(ivec);
+    HEXA_NS::Vertex* horig1 = getHexaPtr<HEXA_NS::Vertex*>(iorig1);
+    HEXA_NS::Vertex* horig2 = getHexaPtr<HEXA_NS::Vertex*>(iorig2);
+    HEXA_NS::Vector* hvecz1 = getHexaPtr<HEXA_NS::Vector*>(ivecz1);
+    HEXA_NS::Vector* hvecz2 = getHexaPtr<HEXA_NS::Vector*>(ivecz2);
 
-  int r = _hexaDocument->performSymmetryLine( hElts, hVex, hVec );
-  if ( r == HOK ){
-    updateData();
-    ret = true;
-  } else if ( r == HERR ){
-    ret = false;
-  }
+    HEXA_NS::BiCylinder* helts = _hexaDocument->makeCylinders(horig1, hvecz1, r1, h1,
+                                                              horig2, hvecz2, r2, h2);
+    if (BadElement(helts))
+        return result;
 
-  return ret;
-}
+    result = addElementsToTree(helts, _crossElementsDirItem);
 
+    return result;
+}
 
-bool DocumentModel::performSymmetryPlane( const QModelIndex& ielts,
-                                          const QModelIndex& ivex,
-                                          const QModelIndex& ivec )
+// =========== PIPE
+QModelIndex DocumentModel::makePipeTop(int nr, int na, int nh)
 {
-  bool ret = false;
+    QModelIndex result;
 
-  HEXA_NS::Elements* hElts = getHexaPtr<HEXA_NS::Elements*>(ielts);
-  HEXA_NS::Vertex*   hVex  = getHexaPtr<HEXA_NS::Vertex*>(ivex);
-  HEXA_NS::Vector*   hVec  = getHexaPtr<HEXA_NS::Vector*>(ivec);
+    HEXA_NS::Elements* helts = _hexaDocument->makePipeTop(nr, na, nh);
+    if (BadElement(helts))
+        return result;
 
-  int r = _hexaDocument->performSymmetryPlane( hElts, hVex, hVec );
-  if ( r == HOK ){
-    updateData();
-    ret = true;
-  } else if ( r == HERR ){
-    ret = false;
-  }
+    result = addElementsToTree(helts, _elementsDirItem);
 
-  return ret;
+    return result;
 }
 
-QModelIndex DocumentModel::revolutionQuads( const QModelIndexList& istartquads,
-                                            const QModelIndex& icenter, 
-                                            const QModelIndex& ivecaxis, 
-                                            const QList<double>& angles )
+QModelIndex DocumentModel::makePipeUni(QModelIndex& iorig, QModelIndex& ivecx, QModelIndex& ivecz,
+                                       double rint, double rext, double angle, double haut,
+                                       int nr, int na, int nh)
 {
-  QModelIndex ielts;
+    QModelIndex result;
 
-  HEXA_NS::Quads   hstartquads;
-  HEXA_NS::Quad*   hquad = NULL;
-  foreach( const QModelIndex& iquad, istartquads){
-    hquad = data( iquad, HEXA_DATA_ROLE ).value<HEXA_NS::Quad*>();
-    hstartquads.push_back( hquad );
-  }
-  HEXA_NS::Vertex* hcenter = getHexaPtr<HEXA_NS::Vertex*>(icenter);
-  HEXA_NS::Vector* haxis   = getHexaPtr<HEXA_NS::Vector*>(ivecaxis);
-  std::vector<double> hangles = angles.toVector().toStdVector();
+    HEXA_NS::Vertex* horig = getHexaPtr<HEXA_NS::Vertex*>(iorig);
+    HEXA_NS::Vector* hvecx = getHexaPtr<HEXA_NS::Vector*>(ivecx);
+    HEXA_NS::Vector* hvecz = getHexaPtr<HEXA_NS::Vector*>(ivecz);
 
-  HEXA_NS::Elements* helts = _hexaDocument->revolutionQuads( hstartquads, hcenter, haxis, hangles );
+    HEXA_NS::Elements* helts = _hexaDocument->makePipeUni(horig, hvecx, hvecz, rint, rext, angle,
+                                                          haut, nr, na, nh);
+    if (BadElement(helts))
+        return result;
 
-  if ( helts && helts->isValid() ){
-    updateData();
-    ElementsItem* eltsItem = new ElementsItem(helts);
-    _elementsDirItem->appendRow(eltsItem);
-    ielts = eltsItem->index();
-  } else {
-    delete helts;
-  }
+    result = addElementsToTree(helts, _elementsDirItem);
 
-  return ielts;
+    return result;
 }
 
-QModelIndex DocumentModel::replace( const QModelIndexList& iquadsPattern,
-                             const QModelIndex& ip1, const QModelIndex& ic1,
-                             const QModelIndex& ip2, const QModelIndex& ic2,
-                             const QModelIndex& ip3, const QModelIndex& ic3 )
+QModelIndex DocumentModel::makePipe(QModelIndex& iorig, QModelIndex& ivecx, QModelIndex& ivecz,
+                                    std::vector<double>& tray, std::vector<double>& tang, std::vector<double>& thaut)
 {
-  QModelIndex ielts;
-
-  HEXA_NS::Vertex* hp1 = getHexaPtr<HEXA_NS::Vertex*>(ip1);
-  HEXA_NS::Vertex* hc1 = getHexaPtr<HEXA_NS::Vertex*>(ic1);
-  HEXA_NS::Vertex* hp2 = getHexaPtr<HEXA_NS::Vertex*>(ip2);
-  HEXA_NS::Vertex* hc2 = getHexaPtr<HEXA_NS::Vertex*>(ic2);
-  HEXA_NS::Vertex* hp3 = getHexaPtr<HEXA_NS::Vertex*>(ip3);
-  HEXA_NS::Vertex* hc3 = getHexaPtr<HEXA_NS::Vertex*>(ic3);
+    QModelIndex result;
 
-  HEXA_NS::Quads   hquads;
-  HEXA_NS::Quad*   hquad = NULL;
-  foreach( const QModelIndex& iquad, iquadsPattern ){
-    hquad = getHexaPtr<HEXA_NS::Quad*>(iquad);
-    hquads.push_back( hquad );
-  }
+    HEXA_NS::Vertex* horig = getHexaPtr<HEXA_NS::Vertex*>(iorig);
+    HEXA_NS::Vector* hvecx = getHexaPtr<HEXA_NS::Vector*>(ivecx);
+    HEXA_NS::Vector* hvecz = getHexaPtr<HEXA_NS::Vector*>(ivecz);
 
-  HEXA_NS::Elements* helts = _hexaDocument->replace( hquads,
-                                hp1, hc1, hp2, hc2, hp3, hc3 );
-//   HEXA_NS::Elements* helts = NULL;
+    HEXA_NS::Elements* helts = _hexaDocument->makePipe(horig, hvecx, hvecz, tray, tang, thaut);
+    if (BadElement(helts))
+        return result;
 
-  if ( helts && helts->isValid() ){
-    updateData();
-    ElementsItem* eltsItem = new ElementsItem(helts);
-    _elementsDirItem->appendRow(eltsItem);
-    ielts = eltsItem->index();
-  } else {
-    delete helts;
-  }
+    result = addElementsToTree(helts, _elementsDirItem);
 
-  return ielts;
+    return result;
 }
 
-// ************  ADD ASSOCIATION ************
-//
-void DocumentModel::addAssociation( const QModelIndex& iElt, const DocumentModel::GeomObj& assocIn )
-{
-//   assocIn.name;
-  HEXA_NS::Shape* assoc = new HEXA_NS::Shape( assocIn.brep.toStdString() );//CS_TODO : delete assoc
-  assoc->debut =  assocIn.start;
-  assoc->fin   =  assocIn.end;
-  assoc->ident =  ( assocIn.entry + "," + assocIn.subid ).toStdString();
-  _assocName[ assocIn.entry ] = assocIn.name; // for getAssociations()
-
-  QString currentAssoc, newAssoc;
-
-  if ( data(iElt, HEXA_TREE_ROLE) == VERTEX_TREE ){
-    HEXA_NS::Vertex* hVex = getHexaPtr<HEXA_NS::Vertex*>(iElt);
-    hVex->setAssociation( assoc );
-  } else if ( data(iElt, HEXA_TREE_ROLE) == EDGE_TREE ){
-    HEXA_NS::Edge*   hEdge = getHexaPtr<HEXA_NS::Edge*>(iElt);
-    hEdge->addAssociation( assoc );
-  } else if ( data(iElt, HEXA_TREE_ROLE) == QUAD_TREE ){
-    HEXA_NS::Quad*   hQuad  = getHexaPtr<HEXA_NS::Quad*>(iElt);
-    hQuad->addAssociation( assoc );
-  }
-
-  currentAssoc = data( iElt, HEXA_ASSOC_ENTRY_ROLE ).toString();
-  if ( !currentAssoc.isEmpty() ){
-    newAssoc = currentAssoc + assocIn.entry + "," + assocIn.subid + ";";
-  } else {
-    newAssoc = assocIn.entry + "," + assocIn.subid + ";";
-  }
-
-  setData( iElt, QVariant::fromValue(newAssoc), HEXA_ASSOC_ENTRY_ROLE );
-}
-
-
-QList<DocumentModel::GeomObj> DocumentModel::getAssociations( const QModelIndex& iElt )
-{
-  MESSAGE("DocumentModel::getAssociations( "<< iElt.data().toString().toStdString() << " )" );
-  QList<DocumentModel::GeomObj> res;
-  DocumentModel::GeomObj        assoc;
-
-  //std::cout << "getAssociations() start"  << std::endl;
-  if ( data(iElt, HEXA_TREE_ROLE) == VERTEX_TREE ){
-    MESSAGE("*  of a Vertex");
-//    HEXA_NS::Vertex* hVex = data(iElt, HEXA_DATA_ROLE).value<HEXA_NS::Vertex *>();
-    HEXA_NS::Vertex *hVex = getHexaPtr<HEXA_NS::Vertex *>(iElt);
-    HEXA_NS::Shape* hShape = hVex->getAssociation();
-    QStringList shapeID;
-    if ( hShape != NULL ){
-      assoc.entry = "";
-      assoc.subid = QString::number(-1);
-      assoc.name  = "";
-      assoc.brep  = hShape->getBrep().c_str();
-      assoc.start = hShape->debut;
-      assoc.end   = hShape->fin;
-
-      shapeID = QString( hShape->ident.c_str() ).split(",");
-      if ( shapeID.count() == 2 ){
-        assoc.entry = shapeID[0];
-        assoc.subid = shapeID[1].isEmpty()? QString::number(-1) : shapeID[1];
-        assoc.name  = _assocName[assoc.entry];
-      }
-      MESSAGE("*  assoc.entry"  << assoc.entry.toStdString() );
-      MESSAGE("*  assoc.subid"  << assoc.subid.toStdString() );
-      MESSAGE("*  -----------" );
-      res << assoc;
-    }
-  } else if ( data(iElt, HEXA_TREE_ROLE) == EDGE_TREE ){
-    MESSAGE("*  of an Edge");
-    HEXA_NS::Edge*   hEdge = getHexaPtr<HEXA_NS::Edge *>(iElt);
-    HEXA_NS::Shapes  hShapes = hEdge->getAssociations();
-    QStringList shapeID;
-    for ( HEXA_NS::Shapes::iterator it = hShapes.begin(); it != hShapes.end(); ++it){
-      assoc.entry = "";
-      assoc.subid = QString::number(-1);
-      assoc.name  = "";
-      assoc.brep  = (*it)->getBrep().c_str();
-      assoc.start = (*it)->debut;
-      assoc.end   = (*it)->fin;
-
-      MESSAGE("*  assoc.ident " << (*it)->ident );
-      shapeID = QString( (*it)->ident.c_str() ).split(",");
-      if ( shapeID.count() == 2 ){
-        assoc.entry = shapeID[0];
-        assoc.subid = shapeID[1].isEmpty()? QString::number(-1) : shapeID[1];
-        assoc.name  = _assocName[assoc.entry];
-      }
-      MESSAGE("*  assoc.entry" << assoc.entry.toStdString() );
-      MESSAGE("*  assoc.subid" << assoc.subid.toStdString() );
-      MESSAGE("*  assoc.brep"  << assoc.brep.toStdString() );
-      MESSAGE("*  assoc.start" << assoc.start );
-      MESSAGE("*  assoc.end"   << assoc.end );
-      MESSAGE("*  -----------" );
-      res << assoc;
-    }
-  } else if ( data(iElt, HEXA_TREE_ROLE) == QUAD_TREE ){
-    MESSAGE("*  of a Quad");
-    HEXA_NS::Quad*   hQuad  = getHexaPtr<HEXA_NS::Quad*>(iElt);
-    HEXA_NS::Shapes  hShapes = hQuad->getAssociations();
-    QStringList shapeID;
-    for ( HEXA_NS::Shapes::iterator it = hShapes.begin(); it != hShapes.end(); ++it){
-      assoc.entry = "";
-      assoc.subid = QString::number(-1);
-      assoc.name  = "";
-      assoc.brep  = (*it)->getBrep().c_str();
-      assoc.start = (*it)->debut;
-      assoc.end   = (*it)->fin;
-      MESSAGE("*  assoc.entry" << assoc.entry.toStdString() );
-      MESSAGE("*  assoc.subid" << assoc.subid.toStdString() );
-//       MESSAGE("*  assoc.brep"  << assoc.brep.toStdString() );
-//       MESSAGE("*  assoc.start" << assoc.start );
-//       MESSAGE("*  assoc.end"   << assoc.end );
-      MESSAGE("*  -----------" );
-      shapeID = QString( (*it)->ident.c_str() ).split(",");
-      if ( shapeID.count() == 2 ){
-        assoc.entry = shapeID[0];
-        assoc.subid = shapeID[1].isEmpty()? QString::number(-1) : shapeID[1];
-        assoc.name  = _assocName[assoc.entry];
-      }
-
-      res << assoc;
-    }
-  }
-
-  MESSAGE("}" );
-  return res;
-}
-
-//         int associateOpenedLine (Edge*  mstart, Edges&  mline, Shape* gstart, 
-//                              double pstart, Shapes& gline, double pend);
-//         int  associateClosedLine (Vertex* mfirst, Edge*  mstart, Edges&  mline, 
-//                              Shape*  gstart, double pstart, Shapes& gline);
-bool DocumentModel::associateOpenedLine( const QModelIndexList& iedges,
-                                         const GeomObjList&     assocs,
-                                         double pstart,
-                                         double pend )
+// ======== Pipes
+QModelIndex DocumentModel::makePipes(QModelIndex& iorig1, QModelIndex& ivecz1, double rint1, double rex1, double h1,
+                                     QModelIndex& iorig2, QModelIndex& ivecz2, double rint2, double rex2, double h2)
 {
-    MESSAGE("DocumentModel::associateOpenedLine() ");
-    bool ret = false;
-    HEXA_NS::Edge*  mstart = NULL;
-    HEXA_NS::Edges  mline;
-    HEXA_NS::Shape* gstart = NULL;
-//     double pstart;
-    HEXA_NS::Shapes gline;
-//     double pend;
+    QModelIndex result;
 
-    HEXA_NS::Edge* hedge = NULL;
-    foreach( const QModelIndex& iedge, iedges ){
-        hedge = getHexaPtr<HEXA_NS::Edge*>(iedge);
-        if ( mstart == NULL ){
-            mstart = hedge;
-            MESSAGE("*    mstart" << iedge.data().toString().toStdString() );
-        } else {
-            mline.push_back( hedge );
-            MESSAGE("*    mline :" << iedge.data().toString().toStdString() );
-        }
-    }
+    HEXA_NS::Vertex* horig1 = getHexaPtr<HEXA_NS::Vertex*>(iorig1);
+    HEXA_NS::Vertex* horig2 = getHexaPtr<HEXA_NS::Vertex*>(iorig2);
+    HEXA_NS::Vector* hvecz1 = getHexaPtr<HEXA_NS::Vector*>(ivecz1);
+    HEXA_NS::Vector* hvecz2 = getHexaPtr<HEXA_NS::Vector*>(ivecz2);
 
-    HEXA_NS::Shape* hshape = NULL;
-    foreach( const GeomObj& anAssoc, assocs ){
-        hshape = new HEXA_NS::Shape( anAssoc.brep.toStdString() );
-        hshape->debut = anAssoc.start;  //0.;
-        hshape->fin   = anAssoc.end;    //1.;
-        hshape->ident = ( anAssoc.entry + "," + anAssoc.subid ).toStdString(); //anAssoc.entry.toStdString();
-
-        if ( gstart == NULL ){
-            gstart = hshape; // CS_TODO :gstart.debut = pstart ??
-            MESSAGE("*    gstart->debut" << gstart->debut);
-            MESSAGE("*    gstart->fin"   << gstart->fin);
-            MESSAGE("*    gstart->ident" << gstart->ident);
-            MESSAGE("*    gstart->getBrep()" << gstart->getBrep());
-//             pstart = anAssoc.start;
-        } else {
-            gline.push_back( hshape ); //CS_TODO : hshape.fin = pend ??
-            MESSAGE("*    gline->debut" << hshape->debut);
-            MESSAGE("*    gline->fin"   << hshape->fin);
-            MESSAGE("*    gline->ident" << hshape->ident);
-            MESSAGE("*    gline->getBrep()" << hshape->getBrep());
-        }
-    }
-//     pend = assocs.last().end;
-    MESSAGE("*    pstart" << pstart );
-    MESSAGE("*    pend"   << pend );
+    HEXA_NS::BiCylinder* helts = _hexaDocument->makePipes(horig1, hvecz1, rint1, rex1, h1,
+                                                        horig2, hvecz2, rint2, rex2, h2);
+    if (BadElement(helts))
+        return result;
 
-    int r = _hexaDocument->associateOpenedLine( mstart, mline,
-                                                gstart, pstart, gline, pend );
-    if ( r == HOK ){
-        updateData();
-        MESSAGE("*    DocumentModel:: associateOpenedLine() => OK ");
-        ret = true;
-    } else if ( r == HERR ){
-        MESSAGE("*    DocumentModel:: associateOpenedLine() => ERR ");
-        ret = false;
-    }
-    delete gstart; //CS_TODO : delete gline?
-    return ret;
+    result = addElementsToTree(helts, _crossElementsDirItem);
+
+    return result;
 }
 
-bool DocumentModel::associateClosedLine( const  QModelIndex& ivertex,
-                                         const  QModelIndexList& iedges,
-                                         const  GeomObjList&     assocs,
-                                         double pstart,
-                                        bool   inv )
+// ======== Join Quads
+QModelIndex DocumentModel::joinQuadUni(QModelIndex&  istart, QModelIndex& idest, QModelIndex& iv1, QModelIndex& iv2,
+                                       QModelIndex& iv3, QModelIndex& iv4, int nb)
 {
-    MESSAGE("DocumentModel::associateClosedLine() ");
-    bool ret = false;
-    HEXA_NS::Vertex* mfirst = getHexaPtr<HEXA_NS::Vertex*>(ivertex);
-    HEXA_NS::Edge*   mstart = NULL;
-    HEXA_NS::Edges   mline;
-    HEXA_NS::Shape*  gstart = NULL;
-//     double  pstart;
-    HEXA_NS::Shapes  gline;
+    QModelIndex result;
 
+    HEXA_NS::Quad* hstart = getHexaPtr<HEXA_NS::Quad*>(istart);
+    HEXA_NS::Quad* hdest = getHexaPtr<HEXA_NS::Quad*>(idest);
+    HEXA_NS::Vertex* hv1 = getHexaPtr<HEXA_NS::Vertex*>(iv1);
+    HEXA_NS::Vertex* hv2 = getHexaPtr<HEXA_NS::Vertex*>(iv2);
+    HEXA_NS::Vertex* hv3 = getHexaPtr<HEXA_NS::Vertex*>(iv3);
+    HEXA_NS::Vertex* hv4 = getHexaPtr<HEXA_NS::Vertex*>(iv4);
 
-    HEXA_NS::Edge* hedge = NULL;
-    foreach( const QModelIndex& iedge, iedges ){
-        hedge = getHexaPtr<HEXA_NS::Edge*>(iedge);
-        if ( mstart == NULL ){
-            mstart = hedge;
-            MESSAGE("*    mstart" << iedge.data().toString().toStdString() );
-        } else {
-            mline.push_back( hedge );
-            MESSAGE("*    mline :" << iedge.data().toString().toStdString() );
-        }
-    }
+    HEXA_NS::Elements* helts = _hexaDocument->joinQuadUni(hstart, hdest, hv1, hv2, hv3, hv4, nb);
+    if (BadElement(helts))
+        return result;
 
-    HEXA_NS::Shape* hshape = NULL;
-    foreach( const GeomObj& anAssoc, assocs ){
-        hshape = new HEXA_NS::Shape( anAssoc.brep.toStdString() );
-        hshape->debut = anAssoc.start; //0.;
-        hshape->fin   = anAssoc.end; //1.;
-        hshape->ident = ( anAssoc.entry + "," + anAssoc.subid ).toStdString();//anAssoc.entry.toStdString();
-
-        if ( gstart == NULL ){
-            gstart = hshape; // CS_TODO :gstart.debut = pstart ??
-//             pstart = anAssoc.start;
-            MESSAGE("*    gstart->debut" << gstart->debut);
-            MESSAGE("*    gstart->fin"   << gstart->fin);
-            MESSAGE("*    gstart->ident" << gstart->ident);
-            MESSAGE("*    gstart->getBrep()" << gstart->getBrep());
-        } else {
-            gline.push_back( hshape ); //CS_TODO : hshape.fin = pend ??
-            MESSAGE("*    gline->debut" << hshape->debut);
-            MESSAGE("*    gline->fin"   << hshape->fin);
-            MESSAGE("*    gline->ident" << hshape->ident);
-            MESSAGE("*    gline->getBrep()" << hshape->getBrep());
-        }
-    }
-    MESSAGE("*    pstart" << pstart );
+    result = addElementsToTree(helts, _elementsDirItem);
 
-    int r = _hexaDocument->associateClosedLine( mfirst, mstart, mline,
-                                                gstart, pstart, inv, gline );
-    if ( r == HOK ){
-        updateData();
-        ret = true;
-    } else if ( r == HERR ){
-        ret = false;
-    }
-    return ret;
+    return result;
 }
 
-// ************  GROUPS  ************
-//
-QModelIndex DocumentModel::addGroup( const QString& name, Group kind )
+QModelIndex DocumentModel::joinQuad(QModelIndex&  istart, QModelIndex& idest, QModelIndex& iva1, QModelIndex& ivb1,
+                     QModelIndex& iva2, QModelIndex& ivb2, std::vector<double>& tlen)
 {
-  QModelIndex iGroup;
+    QModelIndex result;
 
-  HEXA_NS::Group* hGroup = _hexaDocument->addGroup( name.toLocal8Bit().constData(), kind );
+    HEXA_NS::Quad* hstart = getHexaPtr<HEXA_NS::Quad*>(istart);
+    HEXA_NS::Quad* hdest = getHexaPtr<HEXA_NS::Quad*>(idest);
+    HEXA_NS::Vertex* hva1 = getHexaPtr<HEXA_NS::Vertex*>(iva1);
+    HEXA_NS::Vertex* hvb1 = getHexaPtr<HEXA_NS::Vertex*>(ivb1);
+    HEXA_NS::Vertex* hva2 = getHexaPtr<HEXA_NS::Vertex*>(iva2);
+    HEXA_NS::Vertex* hvb2 = getHexaPtr<HEXA_NS::Vertex*>(ivb2);
 
-  GroupItem* groupItem = new GroupItem(hGroup);
-  groupItem->setData( _entry, HEXA_DOC_ENTRY_ROLE );
-  _groupDirItem->appendRow(groupItem);
-  iGroup = groupItem->index();
+    HEXA_NS::Elements* helts = _hexaDocument->joinQuad(hstart, hdest, hva1, hvb1, hva2, hvb2, tlen);
+    if (BadElement(helts))
+        return result;
 
-  return iGroup;
+    result = addElementsToTree(helts, _elementsDirItem);
+
+    return result;
 }
 
-//
-bool DocumentModel::removeGroup( const QModelIndex& igrp )
+QModelIndex DocumentModel::joinQuadsUni(QModelIndexList& istarts, QModelIndex& idest, QModelIndex& iv1, QModelIndex& iv2,
+                                        QModelIndex& iv3, QModelIndex& iv4, int nb)
 {
-  bool ret = false;
-
-  HEXA_NS::Group* hGroup = data(igrp, HEXA_DATA_ROLE).value<HEXA_NS::Group *>();
-  int r = _hexaDocument->removeGroup ( hGroup );
+    QModelIndex result;
 
-  if ( r == HOK ){
-    removeRow( igrp.row(), igrp.parent());
-    ret = true;
-  } else if ( r == HERR ){
-    ret = false;
-  }
-  return ret;
-}
-/*
-QModelIndex* DocumentModel::found(eltBase)
-{
-       TODO_JMD
-}
-*/
+    HEXA_NS::Quads hstarts;
+    int nbQuads = istarts.size();
+    for (int i = 0; i < nbQuads; ++i)
+        hstarts.push_back(getHexaPtr<HEXA_NS::Quad*>(istarts[i]));
 
-QModelIndexList DocumentModel::getGroupElements( const QModelIndex& iGroup, DocumentModel::Group& kind ) const
-{
-  QModelIndexList iElements;
-
-  HEXA_NS::Group* g = iGroup.data(HEXA_DATA_ROLE).value<HEXA_NS::Group *>();
-  if ( !g ) return iElements;
-
-  QModelIndexList iFound;
-  QVariant q;
-  HEXA_NS::EltBase* eltBase = NULL;
-  for ( int nr = 0; nr < g->countElement(); ++nr ){
-    eltBase = g->getElement( nr );
-    kind = g->getKind();
-    switch ( kind ){
-      case HEXA_NS::HexaCell: case HEXA_NS::HexaNode: q = QVariant::fromValue( (HEXA_NS::Hexa *)eltBase ); break;
-      case HEXA_NS::QuadCell: case HEXA_NS::QuadNode: q = QVariant::fromValue( (HEXA_NS::Quad *)eltBase ); break;
-      case HEXA_NS::EdgeCell: case HEXA_NS::EdgeNode: q = QVariant::fromValue( (HEXA_NS::Edge *)eltBase ); break;
-      case HEXA_NS::VertexNode: q = QVariant::fromValue( (HEXA_NS::Vertex *)eltBase ); break;
-    }
-    iFound = match( index(0, 0),
-                    HEXA_DATA_ROLE,
-                    q,
-                    1,
-                    Qt::MatchRecursive );
-    if ( !iFound.isEmpty() )
-      iElements << iFound[0];
-  }
-  return iElements;
-}
+    HEXA_NS::Quad* hdest = getHexaPtr<HEXA_NS::Quad*>(idest);
+    HEXA_NS::Vertex* hv1 = getHexaPtr<HEXA_NS::Vertex*>(iv1);
+    HEXA_NS::Vertex* hv2 = getHexaPtr<HEXA_NS::Vertex*>(iv2);
+    HEXA_NS::Vertex* hv3 = getHexaPtr<HEXA_NS::Vertex*>(iv3);
+    HEXA_NS::Vertex* hv4 = getHexaPtr<HEXA_NS::Vertex*>(iv4);
 
-// 7.4 Boite: éditer un groupe
-void DocumentModel::setGroupName( const QModelIndex& igrp, const QString& name )
-{
-  HEXA_NS::Group* hGroup = data(igrp, HEXA_DATA_ROLE).value<HEXA_NS::Group *>();
+    HEXA_NS::Elements* helts = _hexaDocument->joinQuadsUni(hstarts, hdest, hv1, hv2, hv3, hv4, nb);
+    if (BadElement(helts))
+        return result;
 
-  if ( hGroup ){
-    hGroup->setName( name.toLocal8Bit().constData() );
-    setData(igrp, QVariant::fromValue( name ) );
-  }
+    result = addElementsToTree(helts, _elementsDirItem);
 
+    return result;
 }
 
-bool DocumentModel::addGroupElement( const QModelIndex& igrp, const QModelIndex& ielt )
-{ //CS_TODO : check input? add child?
-// int       addElement    (EltBase* elt);
-
-  bool addOk = false;
-  HEXA_NS::Group*   hGroup = data(igrp, HEXA_DATA_ROLE).value<HEXA_NS::Group *>();
-  HEXA_NS::EltBase* hElt   = NULL;
-  switch ( hGroup->getKind() ){
-  case HEXA_NS::HexaCell: case HEXA_NS::HexaNode: hElt = getHexaPtr<HEXA_NS::Hexa*>(ielt); break;
-  case HEXA_NS::QuadCell: case HEXA_NS::QuadNode: hElt = getHexaPtr<HEXA_NS::Quad*>(ielt); break;
-  case HEXA_NS::EdgeCell: case HEXA_NS::EdgeNode: hElt = getHexaPtr<HEXA_NS::Edge*>(ielt); break;
-  case HEXA_NS::VertexNode: hElt = getHexaPtr<HEXA_NS::Vertex*>(ielt); break;
-  }
+QModelIndex DocumentModel::joinQuads(QModelIndexList& istarts, QModelIndex& idest, QModelIndex& iva1, QModelIndex& ivb1,
+                                     QModelIndex& iva2, QModelIndex& ivb2, std::vector<double>& tlen)
+{
+    QModelIndex result;
 
-  int res = HERR;   
-  if ( hGroup and hElt )
-    res = hGroup->addElement( hElt );
+    HEXA_NS::Quads hstarts;
+    int nbQuads = istarts.size();
+    for (int i = 0; i < nbQuads; ++i)
+        hstarts.push_back(getHexaPtr<HEXA_NS::Quad*>(istarts[i]));
 
-  if ( res == HOK ) addOk = true;
+    HEXA_NS::Quad* hdest = getHexaPtr<HEXA_NS::Quad*>(idest);
+    HEXA_NS::Vertex* hva1 = getHexaPtr<HEXA_NS::Vertex*>(iva1);
+    HEXA_NS::Vertex* hvb1 = getHexaPtr<HEXA_NS::Vertex*>(ivb1);
+    HEXA_NS::Vertex* hva2 = getHexaPtr<HEXA_NS::Vertex*>(iva2);
+    HEXA_NS::Vertex* hvb2 = getHexaPtr<HEXA_NS::Vertex*>(ivb2);
 
-  return addOk;
-}
+    HEXA_NS::Elements* helts = _hexaDocument->joinQuads(hstarts, hdest, hva1, hvb1, hva2, hvb2, tlen);
+    if (BadElement(helts))
+        return result;
 
-bool DocumentModel::removeGroupElement( const QModelIndex& igrp, int nro )
-{ //CS_TODO : remove child?
-  HEXA_NS::Group* hGroup = data(igrp, HEXA_DATA_ROLE).value<HEXA_NS::Group *>();
+    result = addElementsToTree(helts, _elementsDirItem);
 
-  if ( hGroup )
-  {
-    if (hGroup->removeElement( nro ) == HOK)
-       return true;
-  }
-  return false;
+    return result;
 }
 
-bool DocumentModel::clearGroupElement( const QModelIndex& igrp )
+// ======== Quad Revolution
+QModelIndex DocumentModel::revolutionQuadUni(QModelIndex& istart, QModelIndex& icenter, QModelIndex& iaxis,
+                                             double angle, int nbre)
 {
-  HEXA_NS::Group* hGroup = data(igrp, HEXA_DATA_ROLE).value<HEXA_NS::Group *>();
-
-  if ( hGroup )
-  {
-    hGroup->clearElement();
-    return true;
-  }
-  return false;
-}
-
-// ************  LAWS  ************
+    QModelIndex result;
 
-//
-QModelIndex DocumentModel::addLaw( const QString& name, int nbnodes )
-{
-  QModelIndex iLaw;
+    HEXA_NS::Quad* hstart = getHexaPtr<HEXA_NS::Quad*>(istart);
+    HEXA_NS::Vertex* hcenter = getHexaPtr<HEXA_NS::Vertex*>(icenter);
+    HEXA_NS::Vector* haxis = getHexaPtr<HEXA_NS::Vector*>(iaxis);
 
-  HEXA_NS::Law* hLaw = _hexaDocument->addLaw( name.toLocal8Bit().constData(), nbnodes );
+    HEXA_NS::Elements* helts = _hexaDocument->revolutionQuadUni(hstart, hcenter, haxis, angle, nbre);
+    if (BadElement(helts))
+        return result;
 
-  LawItem* lawItem = new LawItem(hLaw);
-  _lawDirItem->appendRow(lawItem);
-  iLaw = lawItem->index();
+    result = addElementsToTree(helts, _elementsDirItem);
 
-  return iLaw;
+    return result;
 }
 
-bool DocumentModel::setLaw( const QModelIndex& ilaw, int nbnodes, double coeff, KindLaw type )
+QModelIndex DocumentModel::revolutionQuad(QModelIndex& istart, QModelIndex& icenter, QModelIndex& iaxis,
+                                          std::vector<double>& angles)
 {
-  bool ret = false;
-
-  HEXA_NS::Law* hLaw = data(ilaw, HEXA_DATA_ROLE).value<HEXA_NS::Law *>();
+    QModelIndex result;
 
-  if ( hLaw ){
-    int ok;
-    ok = hLaw->setNodes( nbnodes );
-    ( ok == HOK) ? ret = true : ret = false;
-    ok = hLaw->setCoefficient( coeff );
-    hLaw->setKind(type);
-  }
-
-  return ret;
-}
+    HEXA_NS::Quad* hstart = getHexaPtr<HEXA_NS::Quad*>(istart);
+    HEXA_NS::Vertex* hcenter = getHexaPtr<HEXA_NS::Vertex*>(icenter);
+    HEXA_NS::Vector* haxis = getHexaPtr<HEXA_NS::Vector*>(iaxis);
 
-// 
-bool  DocumentModel::removeLaw( const QModelIndex& ilaw )
-{
-  bool ret = false;
-  HEXA_NS::Law* hLaw = data(ilaw, HEXA_DATA_ROLE).value<HEXA_NS::Law *>();
-  int r = _hexaDocument->removeLaw( hLaw );
+    HEXA_NS::Elements* helts = _hexaDocument->revolutionQuad(hstart, hcenter, haxis, angles);
+    if (BadElement(helts))
+        return result;
 
-  if ( r == HOK ){
-    removeRow( ilaw.row(),  ilaw.parent());
-    ret = true;
-  } else if ( r == HERR ){
-    ret = false;
-  }
+    result = addElementsToTree(helts, _elementsDirItem);
 
-  return ret;
+    return result;
 }
 
-bool DocumentModel::setPropagation( const QModelIndex& iPropagation, const QModelIndex& iLaw, bool way )
+QModelIndex DocumentModel::revolutionQuadsUni(QModelIndexList& istarts, QModelIndex& icenter, QModelIndex& iaxis,
+                                              double angle, int nbre)
 {
-  bool ret = false;
-  HEXA_NS::Propagation* hPropagation = data(iPropagation, HEXA_DATA_ROLE).value<HEXA_NS::Propagation *>();
-  HEXA_NS::Law* hLaw = data(iLaw, HEXA_DATA_ROLE).value<HEXA_NS::Law *>();
-
-  int r = hPropagation->setLaw( hLaw );
-  hPropagation->setWay( way );
+    QModelIndex result;
 
-  if ( r == HOK ){
-    ret = true;
-  } else if ( r == HERR ){
-    ret = false;
-  }
-  return ret;
-}
+    HEXA_NS::Quads hstarts;
+    int nbQuads = istarts.count();
+    for (int i = 0; i < nbQuads; ++i)
+        hstarts.push_back(getHexaPtr<HEXA_NS::Quad*>(istarts[i]));
 
-QModelIndexList DocumentModel::getPropagation( const QModelIndex& iPropagation ) const
-{
-  QModelIndexList iEdges;
+    HEXA_NS::Vertex* hcenter = getHexaPtr<HEXA_NS::Vertex*>(icenter);
+    HEXA_NS::Vector* haxis = getHexaPtr<HEXA_NS::Vector*>(iaxis);
 
-  QModelIndexList iFound;
-  HEXA_NS::Propagation* propa = iPropagation.data(HEXA_DATA_ROLE).value<HEXA_NS::Propagation *>();
-  if ( !propa ) return iEdges;
+    HEXA_NS::Elements* helts = _hexaDocument->revolutionQuadsUni(hstarts, hcenter, haxis, angle, nbre);
+    if (BadElement(helts))
+        return result;
 
-  const HEXA_NS::Edges& edges = propa->getEdges();
-  for ( HEXA_NS::Edges::const_iterator anEdge = edges.begin();
-        anEdge != edges.end();
-        ++anEdge ){
-    iFound = match( index(0, 0),
-              HEXA_DATA_ROLE,
-              QVariant::fromValue( *anEdge ),
-              1,
-              Qt::MatchRecursive);
-    if ( !iFound.isEmpty() )
-      iEdges << iFound[0];
-  }
+    result = addElementsToTree(helts, _elementsDirItem);
 
-  return iEdges;
+    return result;
 }
 
-HEXA_NS::Document* DocumentModel::documentImpl()
+QModelIndex DocumentModel::revolutionQuads(QModelIndexList& istarts, QModelIndex& icenter, QModelIndex& iaxis,
+                                           std::vector<double>& angles)
 {
-  return _hexaDocument;
-}
+    QModelIndex result;
 
-QString DocumentModel::documentEntry()
-{
-  return _entry;
-}
+    HEXA_NS::Quads hstarts;
+    int nbQuads = istarts.count();
+    for (int i = 0; i < nbQuads; ++i)
+        hstarts.push_back(getHexaPtr<HEXA_NS::Quad*>(istarts[i]));
 
-// 8.3 Boite: éditer une loi  CS_TODO
-// (idem création)
+    HEXA_NS::Vertex* hcenter = getHexaPtr<HEXA_NS::Vertex*>(icenter);
+    HEXA_NS::Vector* haxis = getHexaPtr<HEXA_NS::Vector*>(iaxis);
 
-/*****************************************************************
-                      PatternDataModel
-*****************************************************************/
+    HEXA_NS::Elements* helts = _hexaDocument->revolutionQuads(hstarts, hcenter, haxis, angles);
+    if (BadElement(helts))
+        return result;
 
-PatternDataModel::PatternDataModel( QObject * parent ) :
-  QSortFilterProxyModel( parent )
-{
-  QString dataRegExp = QString("(%1|%2|%3|%4|%5|%6|%7|%8)").
-        arg(VERTEX_TREE).arg(EDGE_TREE).arg(QUAD_TREE).arg(HEXA_TREE).
-        arg(VERTEX_DIR_TREE).arg(EDGE_DIR_TREE).arg(QUAD_DIR_TREE).arg(HEXA_DIR_TREE);
+    result = addElementsToTree(helts, _elementsDirItem);
 
-  setFilterRole(HEXA_TREE_ROLE);
-  setFilterRegExp ( QRegExp(dataRegExp) );
-}
+    return result;
 
-PatternDataModel::~PatternDataModel()
-{
 }
 
-HEXA_NS::Document* PatternDataModel::documentImpl()
+// ==== PrismQuad or ExtrudeQuad
+QModelIndex DocumentModel::extrudeQuadTop(QModelIndex& istart, int nbre)
 {
-  HEXA_NS::Document* doc = NULL;
-  DocumentModel *m = dynamic_cast<DocumentModel *>( sourceModel() );
-  if (m) doc = m->documentImpl();
-  return doc;
-}
+    QModelIndex result;
 
-QString PatternDataModel::documentEntry()
-{
-  QString entry;
-  DocumentModel *m = dynamic_cast<DocumentModel *>( sourceModel() );
-  if (m) entry = m->documentEntry();
-  return entry;
-}
+    HEXA_NS::Quad* hstart = getHexaPtr<HEXA_NS::Quad*>(istart);
+    HEXA_NS::Elements* helts = _hexaDocument->extrudeQuadTop(hstart, nbre);
+    if (BadElement(helts))
+        return result;
 
-Qt::ItemFlags PatternDataModel::flags(const QModelIndex &index) const
-{
-//   MESSAGE("PatternDataModel::flags() "<< index.data().toString().toStdString() );
-  Qt::ItemFlags flags;
+    result = addElementsToTree(helts, _elementsDirItem);
 
-  DocumentModel *m = dynamic_cast<DocumentModel *>( sourceModel() );
-  if ( m != NULL ){
-    flags = m->flags( mapToSource(index) );
-  }
-  return flags;
+    return result;
 }
 
-
-QVariant PatternDataModel::headerData ( int section, Qt::Orientation orientation, int role ) const
+QModelIndex DocumentModel::extrudeQuadUni(QModelIndex& istart, QModelIndex& dv, double len, int nbre)
 {
-  if ( section == 0 and orientation == Qt::Horizontal and role == Qt::DisplayRole ){
-    return QVariant( "Data" );
-  } else {
-    return QSortFilterProxyModel::headerData ( section, orientation, role );
-  }
-}
+    QModelIndex result;
 
+    HEXA_NS::Quad* hstart = getHexaPtr<HEXA_NS::Quad*>(istart);
+    HEXA_NS::Vector* hvec = getHexaPtr<HEXA_NS::Vector*>(dv);
 
-QStandardItem* PatternDataModel::itemFromIndex ( const QModelIndex & index ) const
-{
-  QStandardItem *item = NULL;
-  DocumentModel *m = dynamic_cast<DocumentModel *>( sourceModel() );
-  if ( m != NULL ){
-    item = m->itemFromIndex( mapToSource(index) );
-  }
-  return item;
-}
+    HEXA_NS::Elements* helts = _hexaDocument->extrudeQuadUni(hstart, hvec, len, nbre);
+    if (BadElement(helts))
+        return result;
 
-PatternBuilderModel::PatternBuilderModel( QObject * parent ) :
-  QSortFilterProxyModel( parent )
-{
-  QString builderRegExp =QString("(%1|%2|%3|%4|%5|%6|%7|%8|%9|%10)").
-    arg(VECTOR_TREE).arg(CYLINDER_TREE).arg(PIPE_TREE).arg(ELEMENTS_TREE).
-    arg(CROSSELEMENTS_TREE).arg(VECTOR_DIR_TREE).arg(CYLINDER_DIR_TREE).
-    arg(PIPE_DIR_TREE).arg(ELEMENTS_DIR_TREE).arg(CROSSELEMENTS_DIR_TREE);
+    result = addElementsToTree(helts, _elementsDirItem);
 
-  setFilterRole( HEXA_TREE_ROLE );
-  setFilterRegExp ( QRegExp(builderRegExp ) ); 
+    return result;
 }
 
-PatternBuilderModel::~PatternBuilderModel() 
+QModelIndex DocumentModel::extrudeQuad(QModelIndex& istart, QModelIndex& dv, std::vector<double>& tlen)
 {
-}
+    QModelIndex result;
 
-Qt::ItemFlags PatternBuilderModel::flags(const QModelIndex &index) const
-{
-//   std::cout<<"PatternBuilderModel::flags()"<<std::endl;
-  Qt::ItemFlags flags;
+    HEXA_NS::Quad* hstart = getHexaPtr<HEXA_NS::Quad*>(istart);
+    HEXA_NS::Vector* hvec = getHexaPtr<HEXA_NS::Vector*>(dv);
 
-  DocumentModel *m = dynamic_cast<DocumentModel *>( sourceModel() );
-  if ( m != NULL ){
-    flags = m->flags( mapToSource(index) );
-  }
-  return flags;
-}
+    HEXA_NS::Elements* helts = _hexaDocument->extrudeQuad(hstart, hvec, tlen);
+    if (BadElement(helts))
+        return result;
+    result = addElementsToTree(helts, _elementsDirItem);
 
-QVariant PatternBuilderModel::headerData ( int section, Qt::Orientation orientation, int role ) const
-{
-  if ( section == 0 and orientation == Qt::Horizontal and role == Qt::DisplayRole ){
-      return QVariant( "Builder" );
-  } else {
-      return QSortFilterProxyModel::headerData ( section, orientation, role );
-  }
+    return result;
 }
 
-QStandardItem* PatternBuilderModel::itemFromIndex ( const QModelIndex & index ) const
+QModelIndex DocumentModel::extrudeQuadsTop (QModelIndexList& istarts, int nbre)
 {
-  QStandardItem *item = NULL;
-  DocumentModel *m = dynamic_cast<DocumentModel *>( sourceModel() );
-  if ( m != NULL ){
-    item = m->itemFromIndex( mapToSource(index) );
-  }
-  return item;
-}
+    QModelIndex result;
 
-AssociationsModel::AssociationsModel( QObject * parent ) :
-  QSortFilterProxyModel( parent )
-{
-  QString assocRegExp;// =QString("(%1|%2)").arg(GROUP_TREE).arg(GROUP_DIR_TREE); CS_TODO
+    HEXA_NS::Quads hquads;
+    int nbQuads = istarts.count();
+    for (int i = 0; i < nbQuads; ++i)
+        hquads.push_back(getHexaPtr<HEXA_NS::Quad*>(istarts[i]));
 
-  setFilterRole( HEXA_TREE_ROLE );
-  setFilterRegExp ( QRegExp(assocRegExp) ); 
-}
+    HEXA_NS::Elements* helts = _hexaDocument->extrudeQuadsTop(hquads, nbre);
+    if (BadElement(helts))
+        return result;
+    result = addElementsToTree(helts, _elementsDirItem);
 
-AssociationsModel::~AssociationsModel() 
-{
+    return result;
 }
 
-Qt::ItemFlags AssociationsModel::flags(const QModelIndex &index) const
+QModelIndex DocumentModel::extrudeQuadsUni (QModelIndexList& istarts, QModelIndex& axis, double len, int nbre)
 {
-  Qt::ItemFlags flags;
-
-  DocumentModel *m = dynamic_cast<DocumentModel *>( sourceModel() );
-  if ( m != NULL ){
-    flags = m->flags( mapToSource(index) );
-  }
-  return flags;
-}
+    QModelIndex result;
 
-QVariant AssociationsModel::headerData ( int section, Qt::Orientation orientation, int role ) const
-{
-  if ( section == 0 and orientation == Qt::Horizontal and role == Qt::DisplayRole ){
-      return QVariant( "Associations" );
-  } else {
-      return QSortFilterProxyModel::headerData ( section, orientation, role );
-  }
-}
+    HEXA_NS::Quads hquads;
+    int nbQuads = istarts.count();
+    for (int i = 0; i < nbQuads; ++i)
+        hquads.push_back(getHexaPtr<HEXA_NS::Quad*>(istarts[i]));
 
-QStandardItem* AssociationsModel::itemFromIndex ( const QModelIndex & index ) const
-{
-  QStandardItem *item = NULL;
-  DocumentModel *m = dynamic_cast<DocumentModel *>( sourceModel() );
-  if ( m != NULL ){
-    item = m->itemFromIndex( mapToSource(index) );
-  }
-  return item;
-}
+    HEXA_NS::Vector* haxis = getHexaPtr<HEXA_NS::Vector*>(axis);
 
-GroupsModel::GroupsModel( QObject * parent ) :
-  QSortFilterProxyModel( parent )
-{
-  QString groupsRegExp =QString("(%1|%2)").arg(GROUP_TREE).arg(GROUP_DIR_TREE);
+    HEXA_NS::Elements* helts = _hexaDocument->extrudeQuadsUni(hquads, haxis, len, nbre);
+    if (BadElement(helts))
+        return result;
+    result = addElementsToTree(helts, _elementsDirItem);
 
-  setFilterRole( HEXA_TREE_ROLE );
-  setFilterRegExp ( QRegExp(groupsRegExp ) ); 
+    return result;
 }
 
-GroupsModel::~GroupsModel() 
+QModelIndex DocumentModel::extrudeQuads(QModelIndexList& istarts, QModelIndex& iaxis, std::vector<double>& tlen)
 {
-}
+    QModelIndex result;
 
-Qt::ItemFlags GroupsModel::flags(const QModelIndex &index) const
-{
-  Qt::ItemFlags flags;
+    HEXA_NS::Quads hquads;
+    int nbQuads = istarts.count();
+    for (int i=0; i < nbQuads; ++i)
+        hquads.push_back(getHexaPtr<HEXA_NS::Quad*>(istarts[i]));
 
-  DocumentModel *m = dynamic_cast<DocumentModel *>( sourceModel() );
-  if ( m != NULL ){
-    flags = m->flags( mapToSource(index) );
-  }
-  return flags;
-}
+    HEXA_NS::Vector* haxis = getHexaPtr<HEXA_NS::Vector*>(iaxis);
 
-QVariant GroupsModel::headerData ( int section, Qt::Orientation orientation, int role ) const
-{
-  if ( section == 0 and orientation == Qt::Horizontal and role == Qt::DisplayRole ){
-      return QVariant( "Groups" );
-  } else {
-      return QSortFilterProxyModel::headerData ( section, orientation, role );
-  }
-}
+    HEXA_NS::Elements* helts = _hexaDocument->extrudeQuads(hquads, haxis, tlen);
+    if (BadElement(helts))
+        return result;
+    result = addElementsToTree(helts, _elementsDirItem);
 
-QStandardItem* GroupsModel::itemFromIndex ( const QModelIndex & index ) const
-{
-  QStandardItem *item = NULL;
-  DocumentModel *m = dynamic_cast<DocumentModel *>( sourceModel() );
-  if ( m != NULL ){
-    item = m->itemFromIndex( mapToSource(index) );
-  }
-  return item;
+    return result;
 }
 
-QModelIndexList GroupsModel::getGroupElements( const QModelIndex& iGroup, DocumentModel::Group& kind ) const
+// ==== Cut Edge
+QModelIndex DocumentModel::cutUni(QModelIndex& iEdge, int nbre)
 {
-  QModelIndexList elements;
-  DocumentModel *m = dynamic_cast<DocumentModel *>( sourceModel() );
-  if ( m != NULL ){
-    elements = m->getGroupElements( mapToSource(iGroup), kind );
-  }
-  return elements;
-}
+    QModelIndex result;
 
-MeshModel::MeshModel( QObject * parent ) :
-  QSortFilterProxyModel( parent )
-{
-  QString meshRegExp =QString("(%1|%2|%3|%4)").arg(LAW_TREE).arg(LAW_DIR_TREE)                            .arg(PROPAGATION_TREE).arg(PROPAGATION_DIR_TREE);
+    HEXA_NS::Edge* hedge = getHexaPtr<HEXA_NS::Edge*>(iEdge);
 
-  setFilterRole( HEXA_TREE_ROLE );
-  setFilterRegExp ( QRegExp(meshRegExp) );
-}
+    HEXA_NS::Elements* helts = _hexaDocument->cutUni(hedge, nbre);
+    if (BadElement(helts))
+        return result;
+    result = addElementsToTree(helts, _elementsDirItem);
 
-MeshModel::~MeshModel() 
-{
+    return result;
 }
 
-Qt::ItemFlags MeshModel::flags(const QModelIndex &index) const
+QModelIndex DocumentModel::cut(QModelIndex& iEdge, std::vector<double>& tlen)
 {
-  Qt::ItemFlags flags;
+    QModelIndex result;
 
-  DocumentModel *m = dynamic_cast<DocumentModel *>( sourceModel() );
-  if ( m != NULL ){
-    flags = m->flags( mapToSource(index) );
-  }
-  return flags;
-}
+    HEXA_NS::Edge* hedge = getHexaPtr<HEXA_NS::Edge*>(iEdge);
 
-QVariant MeshModel::headerData ( int section, Qt::Orientation orientation, int role ) const
-{
-  if ( section == 0 and orientation == Qt::Horizontal and role == Qt::DisplayRole ){
-      return QVariant( "Mesh" );
-  } else {
-      return QSortFilterProxyModel::headerData ( section, orientation, role );
-  }
-}
+    HEXA_NS::Elements* helts = _hexaDocument->cut(hedge, tlen);
+    if (BadElement(helts))
+        return result;
+    result = addElementsToTree(helts, _elementsDirItem);
 
-QStandardItem* MeshModel::itemFromIndex ( const QModelIndex & index ) const
-{
-  QStandardItem *item = NULL;
-  DocumentModel *m = dynamic_cast<DocumentModel *>( sourceModel() );
-  if ( m != NULL ){
-    item = m->itemFromIndex( mapToSource(index) );
-  }
-  return item;
+    return result;
 }
 
-QModelIndexList MeshModel::getPropagation( const QModelIndex& iPropagation ) const
-{
-  QModelIndexList edges;
-  DocumentModel *m = dynamic_cast<DocumentModel *>( sourceModel() );
-  if ( m != NULL ){
-    edges = m->getPropagation( mapToSource(iPropagation) );
-  }
-  return edges;
-}
+// ================================== END NEW ==================================