1 // Copyright (C) 2009-2013 CEA/DEN, EDF R&D
3 // This library is free software; you can redistribute it and/or
4 // modify it under the terms of the GNU Lesser General Public
5 // License as published by the Free Software Foundation; either
6 // version 2.1 of the License.
8 // This library is distributed in the hope that it will be useful,
9 // but WITHOUT ANY WARRANTY; without even the implied warranty of
10 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11 // Lesser General Public License for more details.
13 // You should have received a copy of the GNU Lesser General Public
14 // License along with this library; if not, write to the Free Software
15 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
20 //CS_TODO: relever les fonctions qui nécessitent updateData().
21 // addGroupElement à tester
25 #include "utilities.h"
27 #include "HEXABLOCKGUI_DocumentModel.hxx"
28 #include "HEXABLOCKGUI_DocumentItem.hxx"
30 #include "HEXABLOCKGUI.hxx"
31 #include "HEXABLOCKGUI_Trace.hxx"
33 #include "HexVertex.hxx"
34 #include "HexShape.hxx"
35 #include "HexSubShape.hxx"
36 #include "HexAssoEdge.hxx"
37 #include "HexBiCylinder.hxx"
40 #include <BRepBuilderAPI_MakeVertex.hxx>
43 #include "HEXABLOCKGUI_SalomeTools.hxx"
45 #include "GEOM_GEOMBase.hxx"
47 #include <SALOME_ListIO.hxx>
48 #include <SALOMEconfig.h>
49 #include <SUIT_ViewWindow.h>
53 #include "HEXABLOCKGUI_VtkDocumentGraphicView.hxx"
60 //using namespace HEXA_NS;
61 using namespace HEXABLOCK::GUI;
63 /*****************************************************************
65 *****************************************************************/
66 // DocumentModel::DocumentModel(QObject * parent):
67 DocumentModel::DocumentModel(HEXA_NS::Document* docIn, const QString& entryIn, QObject * parent):
68 QStandardItemModel(parent),
69 _hexaFile( new QTemporaryFile() ),
70 _hexaDocument( docIn ),
72 // _hexaDocument( new HEXA_NS::Document("/tmp/doc.hex") ), //CS_TODO
74 _vertexDirItem( new QStandardItem(tr("TREE_ITEM_VERTEX")) ),
75 _edgeDirItem( new QStandardItem(tr("TREE_ITEM_EDGE")) ),
76 _quadDirItem( new QStandardItem(tr("TREE_ITEM_QUAD")) ),
77 _hexaDirItem( new QStandardItem(tr("TREE_ITEM_HEXA")) ),
79 _vectorDirItem( new QStandardItem(tr("TREE_ITEM_VECTOR")) ),
80 _cylinderDirItem( new QStandardItem(tr("TREE_ITEM_CYLINDER")) ),
81 _pipeDirItem( new QStandardItem(tr("TREE_ITEM_PIPE")) ),
82 _elementsDirItem( new QStandardItem(tr("TREE_ITEM_ELEMENT")) ),
83 _crossElementsDirItem( new QStandardItem(tr("TREE_ITEM_CROSSELEMENT")) ),
85 _explicitShapesDirItem( new QStandardItem(tr("TREE_ITEM_EXPSHAPE")) ),
86 _implicitShapesDirItem( new QStandardItem(tr("TREE_ITEM_IMPSHAPE")) ),
87 _cloudOfPointsDirItem( new QStandardItem(tr("TREE_ITEM_CLOUD_OF_POINT")) ),
89 _groupDirItem( new QStandardItem(tr("TREE_ITEM_GROUP")) ),
91 _lawDirItem( new QStandardItem(tr("TREE_ITEM_LAW")) ),
92 _propagationDirItem( new QStandardItem(tr("TREE_ITEM_PROPAGATION")) ),
94 _vertexItemFlags( Qt::NoItemFlags ),
95 _edgeItemFlags( Qt::NoItemFlags ),
96 _quadItemFlags( Qt::NoItemFlags ),
97 _hexaItemFlags( Qt::NoItemFlags ),
98 _vectorItemFlags( Qt::NoItemFlags ),
99 _cylinderItemFlags( Qt::NoItemFlags ),
100 _pipeItemFlags( Qt::NoItemFlags ),
101 _elementsItemFlags( Qt::NoItemFlags ),
102 _crossElementsItemFlags( Qt::NoItemFlags ),
104 _disallowEdition( false )
106 // setColumnCount( 4 ); //CS_TEST
107 if ( !_hexaDocument && _hexaFile->open() ){
108 _hexaDocument = new HEXA_NS::Document( _hexaFile->fileName().toLatin1() );
109 _hexaDocument->reorderFaces();
112 QStandardItem *parentItem = invisibleRootItem();
113 // parentItem->setData( QString::number( reinterpret_cast<intptr_t>(_hexaDocument) ), HEXA_ENTRY_ROLE );
114 parentItem->setData( _entry, HEXA_ENTRY_ROLE );
116 _vertexDirItem->setData( VERTEX_DIR_TREE, HEXA_TREE_ROLE );
117 _edgeDirItem->setData( EDGE_DIR_TREE, HEXA_TREE_ROLE );
118 _quadDirItem->setData( QUAD_DIR_TREE, HEXA_TREE_ROLE );
119 _hexaDirItem->setData( HEXA_DIR_TREE, HEXA_TREE_ROLE );
121 _vectorDirItem->setData( VECTOR_DIR_TREE, HEXA_TREE_ROLE );
122 _cylinderDirItem->setData( CYLINDER_DIR_TREE, HEXA_TREE_ROLE );
123 _pipeDirItem->setData( PIPE_DIR_TREE, HEXA_TREE_ROLE );
124 _elementsDirItem->setData( ELEMENTS_DIR_TREE, HEXA_TREE_ROLE );
125 _crossElementsDirItem->setData( CROSSELEMENTS_DIR_TREE, HEXA_TREE_ROLE );
127 _explicitShapesDirItem->setData( EXPLICIT_SHAPES_DIR_TREE, HEXA_TREE_ROLE );
128 _implicitShapesDirItem->setData( IMPLICIT_SHAPES_DIR_TREE, HEXA_TREE_ROLE );
129 _cloudOfPointsDirItem->setData( CLOUD_OF_POINTS_DIR_TREE, HEXA_TREE_ROLE );
131 _groupDirItem->setData( GROUP_DIR_TREE, HEXA_TREE_ROLE );
133 //CS_TODO associations
135 _lawDirItem->setData( LAW_DIR_TREE, HEXA_TREE_ROLE );
136 _propagationDirItem->setData( PROPAGATION_DIR_TREE, HEXA_TREE_ROLE );
138 parentItem->appendRow(_vertexDirItem);
139 parentItem->appendRow(_edgeDirItem);
140 parentItem->appendRow(_quadDirItem);
141 parentItem->appendRow(_hexaDirItem);
143 parentItem->appendRow(_vectorDirItem);
144 parentItem->appendRow(_cylinderDirItem);
145 parentItem->appendRow(_pipeDirItem);
146 parentItem->appendRow(_elementsDirItem);
147 parentItem->appendRow(_crossElementsDirItem);
149 parentItem->appendRow(_explicitShapesDirItem);
150 parentItem->appendRow(_implicitShapesDirItem);
152 parentItem->appendRow(_groupDirItem);
153 parentItem->appendRow(_lawDirItem);
154 parentItem->appendRow(_propagationDirItem);
157 DocumentModel::~DocumentModel()
159 if (_hexaDocument != NULL)
160 delete _hexaDocument;
162 if (_hexaFile != NULL)
166 void DocumentModel::setName(const QString& name)
168 _hexaDocument->setName( name.toLocal8Bit().constData() );
169 emit nameChanged(QString(_hexaDocument->getName()));
172 HEXA_NS::EltBase* DocumentModel::getHexaPtr(const QModelIndex& iElt)
174 HEXA_NS::EltBase *elt = NULL;
175 switch ( /*data(iElt, HEXA_TREE_ROLE).toInt()*/iElt.data(HEXA_TREE_ROLE).toInt() ){
176 case VERTEX_TREE : elt = getHexaPtr<HEXA_NS::Vertex*>(iElt); break;
177 case EDGE_TREE : elt = getHexaPtr<HEXA_NS::Edge*>(iElt); break;
178 case QUAD_TREE : elt = getHexaPtr<HEXA_NS::Quad*>(iElt); break;
179 case HEXA_TREE : elt = getHexaPtr<HEXA_NS::Hexa*>(iElt); break;
180 case VECTOR_TREE : elt = getHexaPtr<HEXA_NS::Vector*>(iElt); break;
181 case CYLINDER_TREE : elt = getHexaPtr<HEXA_NS::Cylinder*>(iElt); break;
182 case PIPE_TREE : elt = getHexaPtr<HEXA_NS::Pipe*>(iElt); break;
183 case ELEMENTS_TREE : elt = getHexaPtr<HEXA_NS::Elements*>(iElt); break;
184 case CROSSELEMENTS_TREE : elt = getHexaPtr<HEXA_NS::CrossElements*>(iElt); break;
185 case GEOMSHAPE_TREE: elt = getHexaPtr<HEXA_NS::NewShape*>(iElt); break;
186 case GEOMPOINT_TREE: elt = getHexaPtr<HEXA_NS::VertexShape*>(iElt); break;
187 case GEOMEDGE_TREE: elt = getHexaPtr<HEXA_NS::EdgeShape*>(iElt); break;
188 case GEOMFACE_TREE: elt = getHexaPtr<HEXA_NS::FaceShape*>(iElt); break;
193 //get the number of elements of type 'eltType' in the document
194 int DocumentModel::getNbrElt(HEXA_NS::EnumElt eltType)
196 if (_hexaDocument == NULL) return 0;
198 return _hexaDocument->getNbrElt(eltType);
201 //get the number of elements of type 'eltType' used in the document
202 int DocumentModel::getNbrUsedElt(HEXA_NS::EnumElt eltType)
204 if (_hexaDocument == NULL) return 0;
207 case HEXA_NS::EL_VERTEX:
208 return _hexaDocument->countUsedVertex();
209 case HEXA_NS::EL_EDGE:
210 return _hexaDocument->countUsedEdge();
211 case HEXA_NS::EL_QUAD:
212 return _hexaDocument->countUsedQuad();
213 case HEXA_NS::EL_HEXA:
214 return _hexaDocument->countUsedHexa();
219 //associate a shape to the current document
220 bool DocumentModel::addShape(TopoDS_Shape& aShape, QString& name, bool publish)
222 if (aShape.IsNull() || name.isEmpty())
224 bool ok = (_hexaDocument != NULL ? _hexaDocument->addShape(aShape, name.toStdString().c_str()) != NULL : false);
226 // * publish the shape in the study
229 HEXABLOCKGUI* module = HEXABLOCKGUI::getInstance();
232 QMap<QString, TopoDS_Shape> topo_shapes;
233 topo_shapes[name] = aShape;
234 module->addInStudy(topo_shapes, docShapesEntry, docShapesName);
245 //get the number of unused elements of type 'eltType' in the document
246 int DocumentModel::getNbrUnusedElt(HEXA_NS::EnumElt eltType)
248 if (_hexaDocument == NULL)
251 return getNbrElt(eltType) - getNbrUsedElt(eltType);
255 //Load the current Document
256 void DocumentModel::load()
258 if (_hexaDocument == NULL)
261 load(_hexaDocument->getName());
265 void DocumentModel::load( const QString& xmlFileName ) // Fill Data
267 _hexaDocument->loadXml(xmlFileName.toLocal8Bit().constData() );
277 emit patternDataChanged();
280 bool DocumentModel::isEmpty() const
282 if (_hexaDocument == NULL) return true;
283 return _hexaDocument->isEmpty();
286 void DocumentModel::save( const QString& xmlFileName )
288 _hexaDocument->save( xmlFileName.toLocal8Bit().constData() );
291 QString DocumentModel::getName()
293 return _hexaDocument->getName();
296 void DocumentModel::updateData()
302 emit patternDataChanged();
305 void DocumentModel::updateGeomTree()
311 QModelIndex DocumentModel::addToElementsTree(HEXA_NS::Elements* helts)
314 ElementsItem* eltsItem = new ElementsItem(helts);
315 _elementsDirItem->appendRow(eltsItem);
317 return eltsItem->index();
320 void DocumentModel::refresh()
331 emit patternDataChanged();
334 void DocumentModel::clearAll()
344 void DocumentModel::clearData()
346 _vertexDirItem->removeRows( 0, _vertexDirItem->rowCount() );
347 _edgeDirItem->removeRows(0, _edgeDirItem->rowCount() );
348 _quadDirItem->removeRows(0, _quadDirItem->rowCount() );
349 _hexaDirItem->removeRows(0, _hexaDirItem->rowCount() );
353 void DocumentModel::clearBuilder()
355 _vectorDirItem->removeRows(0, _vectorDirItem->rowCount() );
356 _cylinderDirItem->removeRows(0, _cylinderDirItem->rowCount() );
357 _pipeDirItem->removeRows(0, _pipeDirItem->rowCount() );
358 _elementsDirItem->removeRows(0, _elementsDirItem->rowCount() );
359 _crossElementsDirItem->removeRows(0, _crossElementsDirItem->rowCount() );
362 void DocumentModel::clearGeometry()
364 _explicitShapesDirItem->removeRows(0, _explicitShapesDirItem->rowCount() );
365 _implicitShapesDirItem->removeRows(0, _implicitShapesDirItem->rowCount() );
366 _cloudOfPointsDirItem->removeRows(0, _cloudOfPointsDirItem->rowCount() );
369 void DocumentModel::clearAssociation()
374 void DocumentModel::clearGroups()
376 _groupDirItem->removeRows(0, _groupDirItem->rowCount() );
379 void DocumentModel::clearMesh()
381 _lawDirItem->removeRows(0, _lawDirItem->rowCount() );
382 _propagationDirItem->removeRows(0, _propagationDirItem->rowCount() );
386 void DocumentModel::fillData()
388 PatternDataSelectionModel* pdsm = HEXABLOCKGUI::currentDocGView->getPatternDataSelectionModel();
391 pdsm->clearHighlightedItems();
394 HEXA_NS::Vertex *v = NULL;
395 VertexItem *vItem = NULL;
396 int nbVertex = _hexaDocument->countVertex();
397 for ( int i=0; i<nbVertex; ++i ){
398 v = _hexaDocument->getVertex(i);
399 vItem = new VertexItem(v, _entry);
400 _vertexDirItem->appendRow(vItem);
403 HEXA_NS::Edge *e = NULL;
404 EdgeItem *eItem = NULL;
405 int nbEdge = _hexaDocument->countEdge();
406 for ( int i=0; i<nbEdge; ++i ){
407 e = _hexaDocument->getEdge(i);
408 eItem = new EdgeItem(e, _entry);
409 _edgeDirItem->appendRow(eItem);
412 HEXA_NS::Quad *q = NULL;
413 QuadItem *qItem = NULL;
414 int nbQuad = _hexaDocument->countQuad();
415 for ( int i=0; i<nbQuad; ++i ){
416 q = _hexaDocument->getQuad(i);
417 qItem = new QuadItem(q, _entry);
418 _quadDirItem->appendRow(qItem);
421 HEXA_NS::Hexa *h = NULL;
422 HexaItem *hItem = NULL;
423 int nbHexa = _hexaDocument->countHexa();
424 for ( int i=0; i<nbHexa; ++i ){
425 h = _hexaDocument->getHexa(i);
426 hItem = new HexaItem(h, _entry);
427 _hexaDirItem->appendRow(hItem);
432 void DocumentModel::fillBuilder()
434 HEXA_NS::Vector *v = NULL;
435 VectorItem *vItem = NULL;
436 int nbVector = _hexaDocument->countVector();
437 for ( int i=0; i<nbVector; ++i ){
438 v = _hexaDocument->getVector(i);
439 vItem = new VectorItem(v);
440 _vectorDirItem->appendRow(vItem);
444 HEXA_NS::Cylinder *c = NULL;
445 CylinderItem *cItem = NULL;
446 int nbCylinder = _hexaDocument->countCylinder();
447 for ( int i=0; i<nbCylinder; ++i ){
448 c = _hexaDocument->getCylinder(i);
449 cItem = new CylinderItem(c, _entry);
450 _cylinderDirItem->appendRow(cItem);
454 HEXA_NS::Pipe *p = NULL;
455 PipeItem *pItem = NULL;
456 int nbPipe = _hexaDocument->countPipe();
457 for ( int i=0; i<nbPipe; ++i ){
458 p = _hexaDocument->getPipe(i);
459 pItem = new PipeItem(p);
460 _pipeDirItem->appendRow(pItem);
464 void DocumentModel::fillGeometry()
466 PatternGeomSelectionModel* pgsm = HEXABLOCKGUI::currentDocGView->getPatternGeomSelectionModel();
467 if (_hexaDocument == NULL || isEmpty() || pgsm == NULL)
470 HEXA_NS::NewShape* shape;
471 HEXA_NS::VertexShape* node;
472 HEXA_NS::EdgeShape* line;
473 HEXA_NS::FaceShape* face;
474 TopoDS_Compound vertexCompound;
475 BRep_Builder compoundBuilder;
477 // * fill the shape tree
480 pgsm->clearHighlightedItems();
481 QMap<QString, TopoDS_Shape> topo_shapes;
482 int nbShapes = _hexaDocument->countShape();
483 for (int i=0; i < nbShapes; ++i)
485 shape = _hexaDocument->getShape(i);
486 QString shapeName = shape->getName();
487 if (!docShapesEntry.contains(shapeName))
489 if (shape->getOrigin() == HEXA_NS::SH_CLOUD)
491 compoundBuilder.MakeCompound(vertexCompound);
492 topo_shapes[shapeName] = vertexCompound;
495 topo_shapes[shapeName] = shape->getShape();
498 GeomShapeItem* shItem = new GeomShapeItem(shape);
499 if (shape->getOrigin() == HEXA_NS::SH_IMPORT)
501 _explicitShapesDirItem->appendRow(shItem);
504 _implicitShapesDirItem->appendRow(shItem);
506 //add vertices to the tree
507 QStandardItem* geomPointDirItem = new QStandardItem(tr("TREE_ITEM_VERTEX"));
508 geomPointDirItem->setData( GEOMPOINT_DIR_TREE, HEXA_TREE_ROLE );
509 shItem->appendRow(geomPointDirItem);
510 int nbVertexShape = shape->countVertex();
511 for (int j=0; j < nbVertexShape; ++j)
513 node = shape->getVertexShape(j);
514 GeomPointItem* gPointItem = new GeomPointItem(node);
515 geomPointDirItem->appendRow(gPointItem);
516 shapeById[shapeName+","+QString::number(node->getIdent())] = node;
518 // * update the compound of vertices
519 if (shape->getOrigin() == HEXA_NS::SH_CLOUD && !vertexCompound.IsNull())
520 compoundBuilder.Add(topo_shapes[shapeName], node->getShape());
523 //add edges to the tree
524 QStandardItem* geomEdgeDirItem = new QStandardItem(tr("TREE_ITEM_EDGE"));
525 geomEdgeDirItem->setData( GEOMEDGE_DIR_TREE, HEXA_TREE_ROLE );
526 shItem->appendRow(geomEdgeDirItem);
527 int nbEdgeShape = shape->countEdge();
528 for (int j = 0; j < nbEdgeShape; ++j)
530 line = shape->getEdgeShape(j);
531 GeomEdgeItem* gEdgeItem = new GeomEdgeItem(line);
532 geomEdgeDirItem->appendRow(gEdgeItem);
533 shapeById[shapeName+","+QString::number(line->getIdent())] = line;
536 //add faces to the tree
537 QStandardItem* geomFaceDirItem = new QStandardItem(tr("TREE_ITEM_QUAD"));
538 geomFaceDirItem->setData( GEOMFACE_DIR_TREE, HEXA_TREE_ROLE );
539 shItem->appendRow(geomFaceDirItem);
540 int nbFaceShape = shape->countFace();
541 for (int j = 0; j < nbFaceShape; ++j)
543 face = shape->getFaceShape(j);
544 GeomFaceItem* gFaceItem = new GeomFaceItem(face);
545 geomFaceDirItem->appendRow(gFaceItem);
546 shapeById[shapeName+","+QString::number(face->getIdent())] = face;
550 if (topo_shapes.size() == 0)
554 HEXABLOCKGUI* module = HEXABLOCKGUI::getInstance();
556 module->addInStudy(topo_shapes, docShapesEntry, docShapesName);
559 void DocumentModel::fillAssociation()
563 //------------------------------------------- NEW ITEMS
564 //void DocumentModel::fillGroups()
566 // HEXA_NS::Group *g = NULL;
567 // GroupItem *gItem = NULL;
568 // int nbGroup = _hexaDocument->countGroup();
569 // for ( int i=0; i<nbGroup; ++i ){
570 // g = _hexaDocument->getGroup(i);
571 // gItem = new GroupItem(g, _entry);
572 // _groupDirItem->appendRow(gItem);
576 //void DocumentModel::fillMesh()
578 // HEXA_NS::Law *l = NULL;
579 // LawItem *lItem = NULL;
580 // int nbLaw = _hexaDocument->countLaw();
581 // for ( int i=0; i<nbLaw; ++i ){
582 // l = _hexaDocument->getLaw(i);
583 // lItem = new LawItem(l);
584 // _lawDirItem->appendRow(lItem);
587 // HEXA_NS::Propagation *p = NULL;
588 // PropagationItem *pItem = NULL;
589 // int nbPropagation = _hexaDocument->countPropagation();
590 // for ( int i=0; i<nbPropagation; ++i ){
591 // p = _hexaDocument->getPropagation(i);
592 // pItem = new PropagationItem(p, _entry);
593 // pItem->setText(QString("Propagation%1").arg(i) );
594 // _propagationDirItem->appendRow(pItem);
597 //----------------------------------------------- END NEW ITEMS
599 void DocumentModel::fillGroups()
601 HEXA_NS::Group *g = NULL;
602 GroupItem *gItem = NULL;
603 int nbGroup = _hexaDocument->countGroup();
604 for ( int i=0; i<nbGroup; ++i ){
605 g = _hexaDocument->getGroup(i);
606 //std::cout<<"getGroup => "<< i << std::endl;
607 gItem = new GroupItem(g);
608 gItem->setData( _entry, HEXA_DOC_ENTRY_ROLE );
609 _groupDirItem->appendRow(gItem);
613 void DocumentModel::fillMesh()
616 HEXA_NS::Law *l = NULL;
617 LawItem *lItem = NULL;
618 int nbLaw = _hexaDocument->countLaw();
619 for ( int i=0; i<nbLaw; ++i ){
620 l = _hexaDocument->getLaw(i);
621 lItem = new LawItem(l);
622 _lawDirItem->appendRow(lItem);
625 // _propagationDirItem
626 HEXA_NS::Propagation *p = NULL;
627 PropagationItem *pItem = NULL;
628 int nbPropagation = _hexaDocument->countPropagation();
629 for ( int i=0; i<nbPropagation; ++i ){
630 p = _hexaDocument->getPropagation(i);
631 pItem = new PropagationItem(p);
632 pItem->setText(QString("Propagation%1").arg(i) );
633 pItem->setData( _entry, HEXA_DOC_ENTRY_ROLE );
634 _propagationDirItem->appendRow(pItem);
638 HEXA_NS::Hexa* DocumentModel::getQuadHexa(HEXA_NS::Quad* quad)
641 int nbHexa = _hexaDocument->countHexa();
642 for ( int i=0; i<nbHexa; ++i ){
643 hexa = _hexaDocument->getHexa(i);
644 if (hexa->findQuad(quad) > -1) return hexa;
650 Qt::ItemFlags DocumentModel::flags(const QModelIndex &index) const
654 if (!index.isValid()) return Qt::ItemIsEnabled;
656 if ( _disallowEdition ){
657 return QAbstractItemModel::flags(index) | Qt::ItemFlags( ~Qt::ItemIsEditable );
659 return QAbstractItemModel::flags(index) | Qt::ItemIsEditable;
663 void DocumentModel::allowEdition()
665 _disallowEdition = false;
668 void DocumentModel::disallowEdition()
670 _disallowEdition = true;
673 void DocumentModel::allowDataSelectionOnly()
675 _vertexItemFlags = Qt::ItemFlags( ~Qt::ItemIsEditable );
676 _edgeItemFlags = Qt::ItemFlags( ~Qt::ItemIsEditable );
677 _quadItemFlags = Qt::ItemFlags( ~Qt::ItemIsEditable );
678 _hexaItemFlags = Qt::ItemFlags( ~Qt::ItemIsEditable );
680 _vectorItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
681 _cylinderItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
682 _pipeItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
683 _elementsItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
684 _crossElementsItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
686 _groupItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
687 _lawItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
688 _propagationItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
691 void DocumentModel::allowVertexSelectionOnly()
693 _vertexItemFlags = Qt::ItemFlags( ~Qt::ItemIsEditable);
694 _edgeItemFlags = Qt::ItemFlags( ~Qt::ItemIsEditable );
695 _quadItemFlags = Qt::ItemFlags( ~Qt::ItemIsEditable );
696 _hexaItemFlags = Qt::ItemFlags( ~Qt::ItemIsEditable );
698 _vectorItemFlags = Qt::ItemFlags( ~Qt::ItemIsEditable );
699 _cylinderItemFlags = Qt::ItemFlags( ~Qt::ItemIsEditable );
700 _pipeItemFlags = Qt::ItemFlags( ~Qt::ItemIsEditable );
701 _elementsItemFlags = Qt::ItemFlags( ~Qt::ItemIsEditable );
702 _crossElementsItemFlags = Qt::ItemFlags( ~Qt::ItemIsEditable );
704 _groupItemFlags = Qt::ItemFlags( ~Qt::ItemIsEditable );
705 _lawItemFlags = Qt::ItemFlags( ~Qt::ItemIsEditable );
706 _propagationItemFlags = Qt::ItemFlags( ~Qt::ItemIsEditable );
708 // emit layoutChanged();
711 void DocumentModel::allowEdgeSelectionOnly()
713 _vertexItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
714 _edgeItemFlags = Qt::ItemFlags( ~Qt::ItemIsEditable );
715 _quadItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
716 _hexaItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
718 _vectorItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
719 _cylinderItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
720 _pipeItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
721 _elementsItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
722 _crossElementsItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
724 _groupItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
725 _lawItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
726 _propagationItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
729 void DocumentModel::allowQuadSelectionOnly()
731 _vertexItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
732 _edgeItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
733 _quadItemFlags = Qt::ItemFlags( ~Qt::ItemIsEditable );
734 _hexaItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
736 _vectorItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
737 _cylinderItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
738 _pipeItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
739 _elementsItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
740 _crossElementsItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
742 _groupItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
743 _lawItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
744 _propagationItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
747 void DocumentModel::allowHexaSelectionOnly()
749 _vertexItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
750 _edgeItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
751 _quadItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
752 _hexaItemFlags = Qt::ItemFlags( ~Qt::ItemIsEditable );
754 _vectorItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
755 _cylinderItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
756 _pipeItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
757 _elementsItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
758 _crossElementsItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
760 _groupItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
761 _lawItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
762 _propagationItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
765 void DocumentModel::allowVectorSelectionOnly()
767 _vertexItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
768 _edgeItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
769 _quadItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
770 _hexaItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
772 _vectorItemFlags = Qt::ItemFlags( ~Qt::ItemIsEditable );
773 _cylinderItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
774 _pipeItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
775 _elementsItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
776 _crossElementsItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
778 _groupItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
779 _lawItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
780 _propagationItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
783 void DocumentModel::allowCylinderSelectionOnly()
785 _vertexItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
786 _edgeItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
787 _quadItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
788 _hexaItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
790 _vectorItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
791 _cylinderItemFlags = Qt::ItemFlags( ~Qt::ItemIsEditable );
792 _pipeItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
793 _elementsItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
794 _crossElementsItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
796 _groupItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
797 _lawItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
798 _propagationItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
801 void DocumentModel::allowPipeSelectionOnly()
803 _vertexItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
804 _edgeItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
805 _quadItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
806 _hexaItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
808 _vectorItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
809 _cylinderItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
810 _pipeItemFlags = Qt::ItemFlags( ~Qt::ItemIsEditable );
811 _elementsItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
812 _crossElementsItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
814 _groupItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
815 _lawItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
816 _propagationItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
819 void DocumentModel::allowElementsSelectionOnly()
821 _vertexItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
822 _edgeItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
823 _quadItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
824 _hexaItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
826 _vectorItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
827 _cylinderItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
828 _pipeItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
829 _elementsItemFlags = Qt::ItemFlags( ~Qt::ItemIsEditable );
830 _crossElementsItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
832 _groupItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
833 _lawItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
834 _propagationItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
837 void DocumentModel::allowCrossElementsSelectionOnly()
839 _vertexItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
840 _edgeItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
841 _quadItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
842 _hexaItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
844 _vectorItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
845 _cylinderItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
846 _pipeItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
847 _elementsItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
848 _crossElementsItemFlags = Qt::ItemFlags( ~Qt::ItemIsEditable );
850 _groupItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
851 _lawItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
852 _propagationItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
855 void DocumentModel::allowLawSelectionOnly()
857 _vertexItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
858 _edgeItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
859 _quadItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
860 _hexaItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
862 _vectorItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
863 _cylinderItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
864 _pipeItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
865 _elementsItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
866 _crossElementsItemFlags = Qt::ItemFlags( Qt::ItemIsEnabled );
868 _groupItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
869 _lawItemFlags = Qt::ItemFlags( ~Qt::ItemIsEditable );
870 _propagationItemFlags = Qt::ItemFlags( ~Qt::ItemIsEnabled );
874 void DocumentModel::setName( const QModelIndex& iElt, const QString& name )
876 HEXA_NS::EltBase *elt = NULL;
878 switch ( data(iElt, HEXA_TREE_ROLE).toInt() ){
881 HEXA_NS::Group* grp = iElt.data( HEXA_DATA_ROLE ).value< HEXA_NS::Group* >();
882 grp->setName( name.toLatin1().data() );
887 HEXA_NS::Law* l = iElt.data( HEXA_DATA_ROLE ).value< HEXA_NS::Law* >();
888 l->setName( name.toLatin1().data() );
891 // case PROPAGATION_TREE : elt = iElt.data( HEXA_DATA_ROLE ).value< HEXA_NS::Propagation* >(); break;
892 default: elt = getHexaPtr(iElt);
895 if ( elt != NULL ) elt->setName( name.toStdString() );
896 setData( iElt, name );
900 bool DocumentModel::clearEltAssociations( const QModelIndex& iElt )
903 HEXA_NS::EltBase *elt = getHexaPtr(iElt);
906 elt->clearAssociation();
907 setData( iElt, QVariant(), HEXA_ASSOC_ENTRY_ROLE );
914 void DocumentModel::clearAssociation(HEXA_NS::EnumElt& eltType)
916 if (_hexaDocument != NULL)
917 _hexaDocument->clearAssociation(eltType);
920 HEXA_NS::Vertex* vertex;
925 if (HEXABLOCKGUI::currentDocGView == NULL) return;
926 PatternDataSelectionModel* pdsm = HEXABLOCKGUI::currentDocGView->getPatternDataSelectionModel();
927 PatternDataModel* pdm = HEXABLOCKGUI::currentDocGView->getPatternDataModel();
928 if (pdsm == NULL || pdm == NULL) return;
930 //update associations in the model
931 if (eltType == HEXA_NS::EL_VERTEX)
933 nbElts = _hexaDocument->countVertex();
934 for (int i = 0; i < nbElts; ++i)
936 vertex = _hexaDocument->getVertex(i);
937 iElt = pdm->mapToSource(pdsm->indexBy(HEXA_DATA_ROLE, QVariant::fromValue(vertex)));
939 setData( iElt, QVariant(), HEXA_ASSOC_ENTRY_ROLE );
942 else if (eltType == HEXA_NS::EL_EDGE)
944 nbElts = _hexaDocument->countEdge();
945 for (int i = 0; i < nbElts; ++i)
947 edge = _hexaDocument->getEdge(i);
948 iElt = pdm->mapToSource(pdsm->indexBy(HEXA_DATA_ROLE, QVariant::fromValue(edge)));
950 setData( iElt, QVariant(), HEXA_ASSOC_ENTRY_ROLE );
953 else if (eltType == HEXA_NS::EL_QUAD)
955 nbElts = _hexaDocument->countQuad();
956 for (int i = 0; i < nbElts; ++i)
958 quad = _hexaDocument->getQuad(i);
959 iElt = pdm->mapToSource(pdsm->indexBy(HEXA_DATA_ROLE, QVariant::fromValue(quad)));
961 setData( iElt, QVariant(), HEXA_ASSOC_ENTRY_ROLE );
967 QModelIndex DocumentModel::addVertex( double x, double y, double z )
969 QModelIndex vertexIndex;
971 HEXA_NS::Vertex* hv = _hexaDocument->addVertex(x, y, z);
972 if (BadElement(hv)) return vertexIndex;
974 VertexItem* v = new VertexItem(hv, _entry);
975 _vertexDirItem->appendRow(v);
976 vertexIndex = v->index();
977 emit patternDataChanged();
982 QModelIndex DocumentModel::addEdgeVertices (const QModelIndex &i_v0, const QModelIndex &i_v1 )
984 QModelIndex edgeIndex;
986 HEXA_NS::Vertex* hv0 = getHexaPtr<HEXA_NS::Vertex*>(i_v0);
987 HEXA_NS::Vertex* hv1 = getHexaPtr<HEXA_NS::Vertex*>(i_v1);
989 HEXA_NS::Edge* he = _hexaDocument->addEdge( hv0, hv1 );
990 if ( BadElement(he) ) return edgeIndex;
992 EdgeItem* e = new EdgeItem(he, _entry);
993 _edgeDirItem->appendRow(e);
994 edgeIndex = e->index();
995 emit patternDataChanged();
1000 QModelIndex DocumentModel::addQuadVertices( const QModelIndex &i_v0, const QModelIndex &i_v1,
1001 const QModelIndex &i_v2, const QModelIndex &i_v3 )
1002 { //CS_TODO : gestion erreur
1003 QModelIndex quadIndex;
1005 HEXA_NS::Vertex* hv0 = getHexaPtr<HEXA_NS::Vertex*>(i_v0);
1006 HEXA_NS::Vertex* hv1 = getHexaPtr<HEXA_NS::Vertex*>(i_v1);
1007 HEXA_NS::Vertex* hv2 = getHexaPtr<HEXA_NS::Vertex*>(i_v2);
1008 HEXA_NS::Vertex* hv3 = getHexaPtr<HEXA_NS::Vertex*>(i_v3);
1010 if ( hv0 and hv1 and hv2 and hv3 ){
1011 HEXA_NS::Quad* hq = _hexaDocument->addQuadVertices( hv0, hv1, hv2, hv3 );
1012 if ( BadElement(hq) ) return quadIndex;
1014 QuadItem* q = new QuadItem(hq, _entry);
1015 _quadDirItem->appendRow(q);
1016 quadIndex = q->index();
1017 emit patternDataChanged();
1023 QModelIndex DocumentModel::addQuadEdges( const QModelIndex &e0, const QModelIndex &e1,
1024 const QModelIndex &e2, const QModelIndex &e3 )
1026 QModelIndex quadIndex;
1028 HEXA_NS::Edge* he0 = getHexaPtr<HEXA_NS::Edge*>(e0);
1029 HEXA_NS::Edge* he1 = getHexaPtr<HEXA_NS::Edge*>(e1);
1030 HEXA_NS::Edge* he2 = getHexaPtr<HEXA_NS::Edge*>(e2);
1031 HEXA_NS::Edge* he3 = getHexaPtr<HEXA_NS::Edge*>(e3);
1033 if ( he0 and he1 and he2 and he3 ){
1035 HEXA_NS::Quad* hq = _hexaDocument->addQuad( he0, he1, he2, he3 );
1036 if ( BadElement(hq) ) return quadIndex;
1038 QuadItem* q = new QuadItem(hq, _entry);
1039 _quadDirItem->appendRow(q);
1040 quadIndex = q->index();
1041 emit patternDataChanged();
1047 QModelIndex DocumentModel::addHexaVertices(
1048 const QModelIndex &iv0, const QModelIndex &iv1,
1049 const QModelIndex &iv2, const QModelIndex &iv3,
1050 const QModelIndex &iv4, const QModelIndex &iv5,
1051 const QModelIndex &iv6, const QModelIndex &iv7 )
1055 HEXA_NS::Vertex* hv0 = getHexaPtr<HEXA_NS::Vertex*>(iv0);
1056 HEXA_NS::Vertex* hv1 = getHexaPtr<HEXA_NS::Vertex*>(iv1);
1057 HEXA_NS::Vertex* hv2 = getHexaPtr<HEXA_NS::Vertex*>(iv2);
1058 HEXA_NS::Vertex* hv3 = getHexaPtr<HEXA_NS::Vertex*>(iv3);
1059 HEXA_NS::Vertex* hv4 = getHexaPtr<HEXA_NS::Vertex*>(iv4);
1060 HEXA_NS::Vertex* hv5 = getHexaPtr<HEXA_NS::Vertex*>(iv5);
1061 HEXA_NS::Vertex* hv6 = getHexaPtr<HEXA_NS::Vertex*>(iv6);
1062 HEXA_NS::Vertex* hv7 = getHexaPtr<HEXA_NS::Vertex*>(iv7);
1064 HEXA_NS::Hexa* hh = _hexaDocument->addHexaVertices( hv0, hv1, hv2, hv3,
1065 hv4, hv5, hv6, hv7 );
1067 if ( BadElement(hh) ) return iHexa;
1069 HexaItem* h = new HexaItem(hh, _entry);
1070 _hexaDirItem->appendRow(h);
1072 emit patternDataChanged();
1077 QModelIndex DocumentModel::addHexaQuad( const QModelIndex &i_q0, const QModelIndex &i_q1,
1078 const QModelIndex &i_q2,const QModelIndex &i_q3, const QModelIndex &i_q4, const QModelIndex &i_q5 )
1079 { //CS_TODO : gestion erreur
1080 QModelIndex hexaIndex;
1082 HEXA_NS::Quad* hq0 = getHexaPtr<HEXA_NS::Quad*>(i_q0);
1083 HEXA_NS::Quad* hq1 = getHexaPtr<HEXA_NS::Quad*>(i_q1);
1084 HEXA_NS::Quad* hq2 = getHexaPtr<HEXA_NS::Quad*>(i_q2);
1085 HEXA_NS::Quad* hq3 = getHexaPtr<HEXA_NS::Quad*>(i_q3);
1086 HEXA_NS::Quad* hq4 = getHexaPtr<HEXA_NS::Quad*>(i_q4);
1087 HEXA_NS::Quad* hq5 = getHexaPtr<HEXA_NS::Quad*>(i_q5);
1089 HEXA_NS::Hexa* hh = _hexaDocument->addHexa( hq0, hq1, hq2, hq3, hq4, hq5 );
1090 if ( BadElement(hh) ) return hexaIndex;
1092 HexaItem* h = new HexaItem(hh, _entry);
1093 _hexaDirItem->appendRow(h);
1094 hexaIndex = h->index();
1095 emit patternDataChanged();
1100 QModelIndex DocumentModel::addHexaQuads( const QModelIndexList &iquads)
1102 QModelIndex hexaIndex;
1104 HEXA_NS::Hexa* hh = NULL;
1105 HEXA_NS::Quad* hq0, *hq1, *hq2, *hq3, *hq4, *hq5 = NULL;
1107 hq0 = getHexaPtr<HEXA_NS::Quad*>(iquads.value(0));
1108 hq1 = getHexaPtr<HEXA_NS::Quad*>(iquads.value(1));
1109 hq2 = getHexaPtr<HEXA_NS::Quad*>(iquads.value(2));
1110 hq3 = getHexaPtr<HEXA_NS::Quad*>(iquads.value(3));
1111 hq4 = getHexaPtr<HEXA_NS::Quad*>(iquads.value(4));
1112 hq5 = getHexaPtr<HEXA_NS::Quad*>(iquads.value(5));
1114 if ( hq0 && hq1 && hq2 && hq3 && hq4 && hq5 )
1115 hh = _hexaDocument->addHexa( hq0, hq1, hq2, hq3, hq4, hq5 );
1116 else if ( hq0 && hq1 && hq2 && hq3 && hq4 )
1117 hh = _hexaDocument->addHexa5Quads( hq0, hq1, hq2, hq3, hq4 );
1118 else if ( hq0 && hq1 && hq2 && hq3 )
1119 hh = _hexaDocument->addHexa4Quads( hq0, hq1, hq2, hq3 );
1120 else if ( hq0 && hq1 && hq2)
1121 hh = _hexaDocument->addHexa3Quads( hq0, hq1, hq2 );
1122 else if ( hq0 && hq1 )
1123 hh = _hexaDocument->addHexa2Quads( hq0, hq1);
1125 if ( BadElement(hh) ) return hexaIndex;
1128 unsigned int nbRows = _hexaDirItem->rowCount();
1130 hexaIndex = _hexaDirItem->child(nbRows-1)->index();
1135 QModelIndex DocumentModel::addVector( double dx, double dy, double dz )
1137 QModelIndex vectorIndex;
1139 HEXA_NS::Vector* hv = _hexaDocument->addVector(dx, dy, dz);
1140 if ( BadElement(hv) ) return vectorIndex; //Invalid index
1142 VectorItem* v = new VectorItem(hv);
1143 _vectorDirItem->appendRow(v);
1144 vectorIndex = v->index();
1149 QModelIndex DocumentModel::addVectorVertices( const QModelIndex &iv0, const QModelIndex &iv1 )
1153 HEXA_NS::Vertex* hv0 = getHexaPtr<HEXA_NS::Vertex*>(iv0);
1154 HEXA_NS::Vertex* hv1 = getHexaPtr<HEXA_NS::Vertex*>(iv1);
1156 HEXA_NS::Vector* hvec = _hexaDocument->addVectorVertices( hv0, hv1 );
1157 if ( BadElement(hvec) ) return iVec;
1159 VectorItem* vec = new VectorItem(hvec);
1160 _vectorDirItem->appendRow(vec);
1161 iVec = vec->index();
1167 // ************ EDIT HEXABLOCK MODEL ************
1169 bool DocumentModel::updateVertex( const QModelIndex& ivertex, double x, double y, double z )
1173 HEXA_NS::Vertex* hVertex = getHexaPtr<HEXA_NS::Vertex*>(ivertex);
1176 // hVertex->setName( name.toStdString() );
1177 hVertex->setX ( x );
1178 hVertex->setY ( y );
1179 hVertex->setZ ( z );
1180 emit patternDataChanged();
1187 bool DocumentModel::removeHexa( const QModelIndex& ihexa )
1189 HEXA_NS::Hexa* hHexa = getHexaPtr<HEXA_NS::Hexa*>(ihexa);
1191 int r = _hexaDocument->removeHexa( hHexa );
1200 bool DocumentModel::removeConnectedHexa( const QModelIndex& ihexa )
1202 HEXA_NS::Hexa* hHexa = getHexaPtr<HEXA_NS::Hexa*>(ihexa);
1204 int r = _hexaDocument->removeConnectedHexa( hHexa );
1213 bool DocumentModel::mergeVertices( const QModelIndex &iv0, const QModelIndex &iv1 ) //CS_TODO : impact sur le model?
1215 HEXA_NS::Vertex* hv0 = getHexaPtr<HEXA_NS::Vertex*>(iv0);
1216 HEXA_NS::Vertex* hv1 = getHexaPtr<HEXA_NS::Vertex*>(iv1);
1218 int r = _hexaDocument->mergeVertices( hv0, hv1 );
1220 updateData(); //CS_TODO more or less?
1227 bool DocumentModel::mergeEdges( const QModelIndex &ie0, const QModelIndex &ie1,
1228 const QModelIndex &iv0, const QModelIndex &iv1 )
1229 //CS_TODO : impact sur le model?
1231 HEXA_NS::Edge* he0 = getHexaPtr<HEXA_NS::Edge*>(ie0);
1232 HEXA_NS::Edge* he1 = getHexaPtr<HEXA_NS::Edge*>(ie1);
1234 HEXA_NS::Vertex* hv0 = getHexaPtr<HEXA_NS::Vertex*>(iv0);
1235 HEXA_NS::Vertex* hv1 = getHexaPtr<HEXA_NS::Vertex*>(iv1);
1238 int r = _hexaDocument->mergeEdges( he0, he1, hv0, hv1 );
1247 bool DocumentModel::mergeQuads( const QModelIndex& iquad0, const QModelIndex& iquad1,
1248 const QModelIndex& iv0, const QModelIndex& iv1,
1249 const QModelIndex& iv2, const QModelIndex& iv3 )
1251 HEXA_NS::Quad* hquad0 = data(iquad0, HEXA_DATA_ROLE).value<HEXA_NS::Quad *>();
1252 HEXA_NS::Quad* hquad1 = data(iquad1, HEXA_DATA_ROLE).value<HEXA_NS::Quad *>();
1254 HEXA_NS::Vertex* hv0 = getHexaPtr<HEXA_NS::Vertex*>(iv0);
1255 HEXA_NS::Vertex* hv1 = getHexaPtr<HEXA_NS::Vertex*>(iv1);
1256 HEXA_NS::Vertex* hv2 = getHexaPtr<HEXA_NS::Vertex*>(iv2);
1257 HEXA_NS::Vertex* hv3 = getHexaPtr<HEXA_NS::Vertex*>(iv3);
1259 int r = _hexaDocument->mergeQuads( hquad0, hquad1, hv0, hv1, hv2, hv3 );
1269 QModelIndex DocumentModel::disconnectVertex( const QModelIndex& ihexa, const QModelIndex& ivertex )
1273 HEXA_NS::Hexa* hHexa = getHexaPtr<HEXA_NS::Hexa*>(ihexa);
1274 HEXA_NS::Vertex* hVertex = getHexaPtr<HEXA_NS::Vertex*>(ivertex);
1276 HEXA_NS::Elements* hElts = _hexaDocument->disconnectVertex( hHexa, hVertex );
1277 if ( BadElement(hElts) ) return iElts;
1279 updateData(); //CS_TO_CHECK
1280 ElementsItem* elts = new ElementsItem(hElts);
1281 _elementsDirItem->appendRow(elts);
1282 iElts = elts->index();
1287 QModelIndex DocumentModel::disconnectEdge( const QModelIndex& ihexa, const QModelIndex& iedge )
1291 HEXA_NS::Hexa* hHexa = getHexaPtr<HEXA_NS::Hexa*>(ihexa);
1292 HEXA_NS::Edge* hEdge = getHexaPtr<HEXA_NS::Edge*>(iedge);
1294 HEXA_NS::Elements* hElts = _hexaDocument->disconnectEdge( hHexa, hEdge );
1295 if ( BadElement(hElts) ) return iElts;
1297 updateData(); //CS_TO_CHECK
1298 ElementsItem* elts = new ElementsItem(hElts);
1299 _elementsDirItem->appendRow(elts);
1300 iElts = elts->index();
1306 QModelIndex DocumentModel::disconnectEdges( const QModelIndexList& ihexas, const QModelIndexList& iedges )
1310 HEXA_NS::Hexas hHexas;
1311 HEXA_NS::Edges hEdges;
1314 HEXA_NS::Edge* hedge = NULL;
1315 foreach( const QModelIndex& iedge, iedges ){
1316 hedge = getHexaPtr<HEXA_NS::Edge*>(iedge);
1317 hEdges.push_back( hedge );
1321 HEXA_NS::Hexa* hhexa = NULL;
1322 foreach( const QModelIndex& ihexa, ihexas ){
1323 hhexa = getHexaPtr<HEXA_NS::Hexa*>(ihexa);
1324 hHexas.push_back( hhexa );
1328 HEXA_NS::Elements* hElts = _hexaDocument->disconnectEdges( hHexas, hEdges );
1329 if ( BadElement(hElts) ) return iElts;
1331 updateData(); //CS_TO_CHECK
1332 ElementsItem* elts = new ElementsItem(hElts);
1333 _elementsDirItem->appendRow(elts);
1334 iElts = elts->index();
1340 QModelIndex DocumentModel::disconnectQuad( const QModelIndex& ihexa, const QModelIndex& iquad )
1344 HEXA_NS::Hexa* hHexa = getHexaPtr<HEXA_NS::Hexa*>(ihexa);
1345 HEXA_NS::Quad* hQuad = getHexaPtr<HEXA_NS::Quad*>(iquad);
1347 HEXA_NS::Elements* hElts = _hexaDocument->disconnectQuad( hHexa, hQuad );
1348 if ( BadElement(hElts) ) return iElts;
1350 updateData(); //CS_TO_CHECK
1351 ElementsItem* elts = new ElementsItem(hElts);
1352 _elementsDirItem->appendRow(elts);
1353 iElts = elts->index();
1359 QModelIndex DocumentModel::makeTranslation( const QModelIndex& ielts, const QModelIndex& ivec )
1363 HEXA_NS::Elements* hElts = getHexaPtr<HEXA_NS::Elements*>(ielts);
1364 HEXA_NS::Vector* hVec = getHexaPtr<HEXA_NS::Vector*>(ivec);
1366 HEXA_NS::Elements* hNewElts = _hexaDocument->makeTranslation( hElts, hVec );
1367 if ( BadElement(hNewElts) ) return iElts;
1369 updateData(); //CS_TODO more or less?
1370 ElementsItem* eltsItem = new ElementsItem(hNewElts);
1371 _elementsDirItem->appendRow(eltsItem);
1372 iElts = eltsItem->index();
1379 QModelIndex DocumentModel::makeScale( const QModelIndex& ielts, const QModelIndex& ivex, double k )
1383 HEXA_NS::Elements* hElts = getHexaPtr<HEXA_NS::Elements*>(ielts);
1384 HEXA_NS::Vertex* hVex = getHexaPtr<HEXA_NS::Vertex*>(ivex);
1386 HEXA_NS::Elements* hNewElts = _hexaDocument->makeScale( hElts, hVex, k );
1387 if ( BadElement(hNewElts) ) return iElts;
1389 updateData(); //CS_TODO more or less?
1390 ElementsItem* eltsItem = new ElementsItem(hNewElts);
1391 _elementsDirItem->appendRow(eltsItem);
1392 iElts = eltsItem->index();
1399 QModelIndex DocumentModel::makeRotation( const QModelIndex& ielts,
1400 const QModelIndex& iv,
1401 const QModelIndex& ivec, double angle )
1405 HEXA_NS::Elements* hElts = getHexaPtr<HEXA_NS::Elements*>(ielts);
1406 HEXA_NS::Vertex* hVex = getHexaPtr<HEXA_NS::Vertex*>(iv);
1407 HEXA_NS::Vector* hVec = getHexaPtr<HEXA_NS::Vector*>(ivec);
1409 HEXA_NS::Elements* hNewElts = _hexaDocument->makeRotation( hElts, hVex, hVec, angle );
1410 if ( BadElement(hNewElts) ) return iElts;
1412 updateData(); //CS_TODO more or less?
1413 ElementsItem* eltsItem = new ElementsItem(hNewElts);
1414 _elementsDirItem->appendRow(eltsItem);
1415 iElts = eltsItem->index();
1421 QModelIndex DocumentModel::makeSymmetryPoint( const QModelIndex& ielts, const QModelIndex& iv )
1425 HEXA_NS::Elements* hElts = getHexaPtr<HEXA_NS::Elements*>(ielts);
1426 HEXA_NS::Vertex* hVex = getHexaPtr<HEXA_NS::Vertex*>(iv);
1428 HEXA_NS::Elements* hNewElts = _hexaDocument->makeSymmetryPoint (hElts, hVex);
1429 if ( BadElement(hNewElts) ) return iElts;
1431 updateData(); //CS_TODO more or less?
1432 ElementsItem* eltsItem = new ElementsItem(hNewElts);
1433 _elementsDirItem->appendRow(eltsItem);
1434 iElts = eltsItem->index();
1440 QModelIndex DocumentModel::makeSymmetryLine( const QModelIndex& ielts,
1441 const QModelIndex& iv,
1442 const QModelIndex& ivec )
1446 HEXA_NS::Elements* hElts = getHexaPtr<HEXA_NS::Elements*>(ielts);
1447 HEXA_NS::Vertex* hVex = getHexaPtr<HEXA_NS::Vertex*>(iv);
1448 HEXA_NS::Vector* hVec = getHexaPtr<HEXA_NS::Vector*>(ivec);
1451 HEXA_NS::Elements* hNewElts = _hexaDocument->makeSymmetryLine( hElts, hVex, hVec );
1452 if ( BadElement(hNewElts) ) return iElts;
1454 updateData(); //CS_TODO more or less?
1455 ElementsItem* eltsItem = new ElementsItem(hNewElts);
1456 _elementsDirItem->appendRow(eltsItem);
1457 iElts = eltsItem->index();
1463 QModelIndex DocumentModel::makeSymmetryPlane( const QModelIndex& ielts, const QModelIndex& iv, const QModelIndex& ivec )
1467 HEXA_NS::Elements* hElts = getHexaPtr<HEXA_NS::Elements*>(ielts);
1468 HEXA_NS::Vertex* hVex = getHexaPtr<HEXA_NS::Vertex*>(iv);
1469 HEXA_NS::Vector* hVec = getHexaPtr<HEXA_NS::Vector*>(ivec);
1471 HEXA_NS::Elements* hNewElts = _hexaDocument->makeSymmetryPlane( hElts, hVex, hVec );
1472 if ( BadElement(hNewElts) ) return iElts;
1474 updateData(); //CS_TODO more or less?
1475 ElementsItem* eltsItem = new ElementsItem(hNewElts);
1476 _elementsDirItem->appendRow(eltsItem);
1477 iElts = eltsItem->index();
1483 bool DocumentModel::performTranslation( const QModelIndex& ielts, const QModelIndex& ivec )
1485 HEXA_NS::Elements* hElts = getHexaPtr<HEXA_NS::Elements*>(ielts);
1486 HEXA_NS::Vector* hVec = getHexaPtr<HEXA_NS::Vector*>(ivec);
1488 int r = _hexaDocument->performTranslation (hElts, hVec);
1489 if ( r == HOK ){ //Job well done?
1499 bool DocumentModel::performScale( const QModelIndex& ielts, const QModelIndex& ivex, double k )
1501 HEXA_NS::Elements* hElts = getHexaPtr<HEXA_NS::Elements*>(ielts);
1502 HEXA_NS::Vertex* hVex = getHexaPtr<HEXA_NS::Vertex*>(ivex);
1504 int r = _hexaDocument->performScale (hElts, hVex, k);
1514 bool DocumentModel::performRotation( const QModelIndex& ielts, const QModelIndex& ivex, const QModelIndex& ivec, double angle )
1516 HEXA_NS::Elements* hElts = getHexaPtr<HEXA_NS::Elements*>(ielts);
1517 HEXA_NS::Vertex* hVex = getHexaPtr<HEXA_NS::Vertex*>(ivex);
1518 HEXA_NS::Vector* hVec = getHexaPtr<HEXA_NS::Vector*>(ivec);
1520 int r = _hexaDocument-> performRotation( hElts, hVex, hVec, angle );
1531 bool DocumentModel::performSymmetryPoint( const QModelIndex& ielts, const QModelIndex& ivex )
1533 HEXA_NS::Elements* hElts = getHexaPtr<HEXA_NS::Elements*>(ielts);
1534 HEXA_NS::Vertex* hVex = getHexaPtr<HEXA_NS::Vertex*>(ivex);
1536 int r = _hexaDocument->performSymmetryPoint( hElts, hVex );
1546 bool DocumentModel::performSymmetryLine( const QModelIndex& ielts, const QModelIndex& ivex, const QModelIndex& ivec )
1548 HEXA_NS::Elements* hElts = getHexaPtr<HEXA_NS::Elements*>(ielts);
1549 HEXA_NS::Vertex* hVex = getHexaPtr<HEXA_NS::Vertex*>(ivex);
1550 HEXA_NS::Vector* hVec = getHexaPtr<HEXA_NS::Vector*>(ivec);
1552 int r = _hexaDocument->performSymmetryLine( hElts, hVex, hVec );
1562 bool DocumentModel::performSymmetryPlane( const QModelIndex& ielts,
1563 const QModelIndex& ivex,
1564 const QModelIndex& ivec )
1566 HEXA_NS::Elements* hElts = getHexaPtr<HEXA_NS::Elements*>(ielts);
1567 HEXA_NS::Vertex* hVex = getHexaPtr<HEXA_NS::Vertex*>(ivex);
1568 HEXA_NS::Vector* hVec = getHexaPtr<HEXA_NS::Vector*>(ivec);
1570 int r = _hexaDocument->performSymmetryPlane( hElts, hVex, hVec );
1579 QModelIndex DocumentModel::revolutionQuads( const QModelIndexList& istartquads,
1580 const QModelIndex& icenter,
1581 const QModelIndex& ivecaxis,
1582 const QList<double>& angles )
1586 HEXA_NS::Quads hstartquads;
1587 HEXA_NS::Quad* hquad = NULL;
1588 foreach( const QModelIndex& iquad, istartquads){
1589 hquad = data( iquad, HEXA_DATA_ROLE ).value<HEXA_NS::Quad*>();
1590 hstartquads.push_back( hquad );
1592 HEXA_NS::Vertex* hcenter = getHexaPtr<HEXA_NS::Vertex*>(icenter);
1593 HEXA_NS::Vector* haxis = getHexaPtr<HEXA_NS::Vector*>(ivecaxis);
1594 std::vector<double> hangles = angles.toVector().toStdVector();
1596 HEXA_NS::Elements* helts = _hexaDocument->revolutionQuads( hstartquads, hcenter, haxis, hangles );
1597 if ( BadElement(helts) ) return ielts;
1600 ElementsItem* eltsItem = new ElementsItem(helts);
1601 _elementsDirItem->appendRow(eltsItem);
1602 ielts = eltsItem->index();
1607 QModelIndex DocumentModel::replace( const QModelIndexList& iquadsPattern,
1608 const QModelIndex& ip1, const QModelIndex& ic1,
1609 const QModelIndex& ip2, const QModelIndex& ic2,
1610 const QModelIndex& ip3, const QModelIndex& ic3 )
1614 HEXA_NS::Vertex* hp1 = getHexaPtr<HEXA_NS::Vertex*>(ip1);
1615 HEXA_NS::Vertex* hc1 = getHexaPtr<HEXA_NS::Vertex*>(ic1);
1616 HEXA_NS::Vertex* hp2 = getHexaPtr<HEXA_NS::Vertex*>(ip2);
1617 HEXA_NS::Vertex* hc2 = getHexaPtr<HEXA_NS::Vertex*>(ic2);
1618 HEXA_NS::Vertex* hp3 = getHexaPtr<HEXA_NS::Vertex*>(ip3);
1619 HEXA_NS::Vertex* hc3 = getHexaPtr<HEXA_NS::Vertex*>(ic3);
1621 HEXA_NS::Quads hquads;
1622 HEXA_NS::Quad* hquad = NULL;
1623 foreach( const QModelIndex& iquad, iquadsPattern ){
1624 hquad = getHexaPtr<HEXA_NS::Quad*>(iquad);
1625 hquads.push_back( hquad );
1628 HEXA_NS::Elements* helts = _hexaDocument->replace( hquads,
1629 hp1, hc1, hp2, hc2, hp3, hc3 );
1630 if ( BadElement(helts) ) return ielts;
1633 ElementsItem* eltsItem = new ElementsItem(helts);
1634 _elementsDirItem->appendRow(eltsItem);
1635 ielts = eltsItem->index();
1640 QModelIndex DocumentModel::getGeomModelIndex(QString& id) const
1643 PatternGeomSelectionModel* pgsm = HEXABLOCKGUI::currentDocGView->getPatternGeomSelectionModel();
1645 // ** get the model index of the geom element having this ID
1646 HEXA_NS::SubShape* eltPtr = getGeomPtr(id);
1647 HEXA_NS::VertexShape* geomVertex = dynamic_cast<HEXA_NS::VertexShape*>(eltPtr);
1648 HEXA_NS::EdgeShape* geomEdge = dynamic_cast<HEXA_NS::EdgeShape*>(eltPtr);
1649 HEXA_NS::FaceShape* geomFace = dynamic_cast<HEXA_NS::FaceShape*>(eltPtr);
1650 if (geomVertex != NULL)
1651 result = pgsm->indexBy( HEXA_DATA_ROLE, QVariant::fromValue(geomVertex));
1652 if (geomEdge != NULL)
1653 result = pgsm->indexBy( HEXA_DATA_ROLE, QVariant::fromValue(geomEdge));
1654 if (geomFace != NULL)
1655 result = pgsm->indexBy( HEXA_DATA_ROLE, QVariant::fromValue(geomFace));
1660 QMultiMap< QString, int > DocumentModel::getAssocShapesIds(const QModelIndex& dataIndex)
1662 QMultiMap< QString, int > result;
1663 HEXA_NS::NewShape* mainShape;
1664 HEXA_NS::VertexShape* node;
1665 HEXA_NS::EdgeShape* line;
1666 HEXA_NS::FaceShape* face;
1670 PatternDataSelectionModel* pdsm = HEXABLOCKGUI::currentDocGView->getPatternDataSelectionModel();
1671 QModelIndexList assocsInd = pdsm->getGeomAssociations(dataIndex);
1672 foreach( const QModelIndex& anAssoc, assocsInd )
1674 node = getHexaPtr<HEXA_NS::VertexShape*>(anAssoc);
1675 line = getHexaPtr<HEXA_NS::EdgeShape*>(anAssoc);
1676 face = getHexaPtr<HEXA_NS::FaceShape*>(anAssoc);
1680 mainShape = node->getParentShape();
1681 if (mainShape != NULL)
1683 shapeName = mainShape->getName();
1684 subid = node->getIdent();
1687 else if (line != NULL)
1689 mainShape = line->getParentShape();
1690 if (mainShape != NULL)
1692 shapeName = mainShape->getName();
1693 subid = line->getIdent();
1696 else if (face != NULL)
1698 mainShape = face->getParentShape();
1699 if (mainShape != NULL)
1701 shapeName = mainShape->getName();
1702 subid = face->getIdent();
1706 if (!shapeName.isEmpty())
1707 result.insert( shapeName, subid );
1709 shapeName = QString();
1714 bool DocumentModel::setVertexAssociation( const QModelIndex& iVertex, double x, double y, double z)
1716 HEXA_NS::Vertex* vertex = getHexaPtr<HEXA_NS::Vertex *>(iVertex);
1718 if (vertex == NULL || _hexaDocument == NULL || vertex->setAssociation(x, y, z) != HOK)
1721 HEXA_NS::VertexShape* assoc = vertex->getAssociation();
1724 HEXA_NS::NewShape* mainSh = assoc->getParentShape();
1725 setData( iVertex, QVariant::fromValue(QString(mainSh->getName())+","+QString::number(assoc->getIdent())+";"), HEXA_ASSOC_ENTRY_ROLE );
1731 bool DocumentModel::setVertexAssociation( const QModelIndex& iVertex, const QModelIndex& iGeomVertex)
1733 //parameters control
1735 HEXA_NS::Vertex* vertex = getHexaPtr<HEXA_NS::Vertex *>(iVertex);
1736 HEXA_NS::VertexShape* geomVertex = getHexaPtr<HEXA_NS::VertexShape*>(iGeomVertex);
1737 if (_hexaDocument == NULL || vertex == NULL || geomVertex == NULL) return false;
1738 HEXA_NS::NewShape* mainShape = geomVertex->getParentShape();
1739 if (mainShape == NULL) return false;
1742 if (vertex->setAssociation(geomVertex) != HOK)
1745 //update association state in the model
1746 newAssoc = QString(mainShape->getName()) + "," + QString::number(geomVertex->getIdent()) + ";";
1747 setData( iVertex, QVariant::fromValue(newAssoc), HEXA_ASSOC_ENTRY_ROLE );
1752 bool DocumentModel::addEdgeAssociation( const QModelIndex& iEdge, const QModelIndex& iGeomEdge, double start, double end)
1754 //parameters control
1755 QString currentAssoc, newAssoc;
1756 HEXA_NS::Edge* edge = getHexaPtr<HEXA_NS::Edge*>(iEdge);
1757 HEXA_NS::EdgeShape* geomEdge = getHexaPtr<HEXA_NS::EdgeShape*>(iGeomEdge);
1758 if (_hexaDocument == NULL || edge == NULL ||
1759 geomEdge == NULL || start > end) return false;
1760 HEXA_NS::NewShape* mainShape = geomEdge->getParentShape();
1761 if (mainShape == NULL) return false;
1763 //add association in the engine side
1764 if (edge->addAssociation(geomEdge, start, end) != HOK)
1767 //add/update association in the model side (UI)
1768 currentAssoc = data(iEdge, HEXA_ASSOC_ENTRY_ROLE).toString();
1769 newAssoc = QString(mainShape->getName()) + "," + QString::number(geomEdge->getIdent()) + ";";
1770 if (!currentAssoc.isEmpty()) newAssoc = currentAssoc + newAssoc;
1772 setData( iEdge, QVariant::fromValue(newAssoc), HEXA_ASSOC_ENTRY_ROLE );
1778 bool DocumentModel::addQuadAssociation (const QModelIndex& iQuad, const QModelIndex& iGeomFace)
1780 //parameters control
1781 QString currentAssoc, newAssoc;
1782 HEXA_NS::Quad* quad = getHexaPtr<HEXA_NS::Quad*>(iQuad);
1783 HEXA_NS::FaceShape* geomFace = getHexaPtr<HEXA_NS::FaceShape*>(iGeomFace);
1784 if (_hexaDocument == NULL || quad == NULL || geomFace == NULL)
1786 HEXA_NS::NewShape* mainShape = geomFace->getParentShape();
1787 if (mainShape == NULL) return false;
1790 if (quad->addAssociation(geomFace) != HOK)
1793 //update association
1794 currentAssoc = data( iQuad, HEXA_ASSOC_ENTRY_ROLE).toString();
1795 newAssoc = QString(mainShape->getName()) + "," + QString::number(geomFace->getIdent()) + ";";
1796 if (!currentAssoc.isEmpty()) newAssoc = currentAssoc + newAssoc;
1797 setData( iQuad, QVariant::fromValue(newAssoc), HEXA_ASSOC_ENTRY_ROLE );
1803 QModelIndex DocumentModel::getVertexAssociation(const QModelIndex& iVertex)
1805 HEXA_NS::Vertex* vertex = getHexaPtr<HEXA_NS::Vertex*>(iVertex);
1807 return QModelIndex();
1809 //get the associated geom vertex
1810 HEXA_NS::VertexShape* geomVertex = vertex->getAssociation();
1811 if (geomVertex == NULL)
1812 return QModelIndex();
1814 //convert geom vertex to qmodelindex
1815 PatternGeomSelectionModel* pgsm = HEXABLOCKGUI::currentDocGView->getPatternGeomSelectionModel();
1817 return QModelIndex();
1819 return pgsm->indexBy(HEXA_DATA_ROLE, QVariant::fromValue(geomVertex));
1823 QModelIndexList DocumentModel::getEdgeAssociations(const QModelIndex& iEdge)
1825 QModelIndexList result;
1826 HEXA_NS::Edge* edge = getHexaPtr<HEXA_NS::Edge*>(iEdge);
1827 if (edge == NULL) return result;
1829 HEXA_NS::EdgeShape* geomEdge;
1830 HEXA_NS::AssoEdge* anEdgeAssoc;
1832 PatternGeomSelectionModel* pGSModel = HEXABLOCKGUI::currentDocGView->getPatternGeomSelectionModel();
1833 int nbAssocs = edge->countAssociation();
1834 for (int i = 0; i < nbAssocs; ++i)
1836 anEdgeAssoc = edge->getAssociation(i);
1837 if (anEdgeAssoc == NULL) continue;
1838 geomEdge = anEdgeAssoc->getEdgeShape();
1839 if (geomEdge == NULL) continue;
1840 result << pGSModel->indexBy( HEXA_DATA_ROLE, QVariant::fromValue(geomEdge));
1847 QModelIndexList DocumentModel::getQuadAssociations(const QModelIndex& iQuad)
1849 QModelIndexList result;
1850 QModelIndex geomQuadIndex;
1851 HEXA_NS::Quad* quad = getHexaPtr<HEXA_NS::Quad*>(iQuad);
1852 if (quad == NULL) return result;
1854 if (HEXABLOCKGUI::currentDocGView == NULL) return result;
1855 PatternGeomSelectionModel* pgsm = HEXABLOCKGUI::currentDocGView->getPatternGeomSelectionModel();
1856 PatternGeomModel* pgm = HEXABLOCKGUI::currentDocGView->getPatternGeomModel();
1857 if (pgsm == NULL || pgm == NULL) return result;
1859 HEXA_NS::FaceShape* geomFace;
1861 int nbAssocs = quad->countAssociation();
1862 for (int i = 0; i < nbAssocs; ++i)
1864 geomFace = quad->getAssociation(i);
1865 if (geomFace == NULL) continue;
1867 geomQuadIndex = pgsm->indexBy( HEXA_DATA_ROLE, QVariant::fromValue(geomFace) );
1868 result << geomQuadIndex;
1875 bool DocumentModel::associateOpenedLine( const QModelIndexList& iedges,
1876 HEXA_NS::NewShapes shapes,
1877 HEXA_NS::IntVector subIds,
1882 HEXA_NS::Edges mline;
1884 HEXA_NS::Edge* hedge = NULL;
1885 foreach( const QModelIndex& iedge, iedges ){
1886 hedge = getHexaPtr<HEXA_NS::Edge*>(iedge);
1888 mline.push_back( hedge );
1891 int err = _hexaDocument->associateOpenedLine( mline, shapes, subIds, pstart, pend );
1899 bool DocumentModel::associateClosedLine( const QModelIndex& ivertex,
1900 const QModelIndexList& iedges,
1901 HEXA_NS::NewShapes shapes,
1902 HEXA_NS::IntVector subIds,
1906 HEXA_NS::Vertex* mfirst = getHexaPtr<HEXA_NS::Vertex*>(ivertex);
1907 HEXA_NS::Edges mline;
1909 HEXA_NS::Edge* hedge = NULL;
1910 foreach( const QModelIndex& iedge, iedges ){
1911 hedge = getHexaPtr<HEXA_NS::Edge*>(iedge);
1913 mline.push_back( hedge );
1916 int err = _hexaDocument->associateClosedLine( mfirst, mline, shapes, subIds, pstart, inv);
1924 // ************ GROUPS ************
1926 QModelIndex DocumentModel::addGroup( const QString& name, Group kind )
1930 HEXA_NS::Group* hGroup = _hexaDocument->addGroup( name.toLocal8Bit().constData(), kind );
1931 if ( hGroup == NULL ) return iGroup;
1933 GroupItem* groupItem = new GroupItem(hGroup);
1934 groupItem->setData( _entry, HEXA_DOC_ENTRY_ROLE );
1935 _groupDirItem->appendRow(groupItem);
1936 iGroup = groupItem->index();
1942 bool DocumentModel::removeGroup( const QModelIndex& igrp )
1944 HEXA_NS::Group* hGroup = data(igrp, HEXA_DATA_ROLE).value<HEXA_NS::Group *>();
1945 int r = _hexaDocument->removeGroup ( hGroup );
1948 removeRow( igrp.row(), igrp.parent());
1956 QModelIndexList DocumentModel::getGroupElements( const QModelIndex& iGroup, DocumentModel::Group& kind ) const
1958 QModelIndexList iElements;
1960 HEXA_NS::Group* g = iGroup.data(HEXA_DATA_ROLE).value<HEXA_NS::Group *>();
1961 if ( g == NULL ) return iElements;
1963 QModelIndexList iFound;
1965 HEXA_NS::EltBase* eltBase = NULL;
1966 int nbElement = g->countElement();
1967 for ( int nr = 0; nr < nbElement; ++nr ){
1968 eltBase = g->getElement( nr );
1969 kind = g->getKind();
1971 case HEXA_NS::HexaCell: case HEXA_NS::HexaNode: q = QVariant::fromValue( (HEXA_NS::Hexa *)eltBase ); break;
1972 case HEXA_NS::QuadCell: case HEXA_NS::QuadNode: q = QVariant::fromValue( (HEXA_NS::Quad *)eltBase ); break;
1973 case HEXA_NS::EdgeCell: case HEXA_NS::EdgeNode: q = QVariant::fromValue( (HEXA_NS::Edge *)eltBase ); break;
1974 case HEXA_NS::VertexNode: q = QVariant::fromValue( (HEXA_NS::Vertex *)eltBase ); break;
1976 iFound = match( index(0, 0),
1980 Qt::MatchRecursive );
1981 if ( !iFound.isEmpty() )
1982 iElements << iFound[0];
1987 // 7.4 Boite: éditer un groupe
1988 void DocumentModel::setGroupName( const QModelIndex& igrp, const QString& name )
1990 HEXA_NS::Group* hGroup = data(igrp, HEXA_DATA_ROLE).value<HEXA_NS::Group *>();
1993 hGroup->setName( name.toLocal8Bit().constData() );
1994 setData(igrp, QVariant::fromValue( name ) );
1998 bool DocumentModel::addGroupElement( const QModelIndex& igrp, const QModelIndex& ielt )
2000 HEXA_NS::Group* hGroup = data(igrp, HEXA_DATA_ROLE).value<HEXA_NS::Group *>();
2001 if (hGroup == NULL) return false;
2003 HEXA_NS::EltBase* hElt = NULL;
2004 switch ( hGroup->getKind() ){
2005 case HEXA_NS::HexaCell: case HEXA_NS::HexaNode: hElt = getHexaPtr<HEXA_NS::Hexa*>(ielt); break;
2006 case HEXA_NS::QuadCell: case HEXA_NS::QuadNode: hElt = getHexaPtr<HEXA_NS::Quad*>(ielt); break;
2007 case HEXA_NS::EdgeCell: case HEXA_NS::EdgeNode: hElt = getHexaPtr<HEXA_NS::Edge*>(ielt); break;
2008 case HEXA_NS::VertexNode: hElt = getHexaPtr<HEXA_NS::Vertex*>(ielt); break;
2013 res = hGroup->addElement( hElt );
2015 if ( res == HOK ) return true;
2020 bool DocumentModel::removeGroupElement( const QModelIndex& igrp, int nro )
2021 { //CS_TODO : remove child?
2022 HEXA_NS::Group* hGroup = data(igrp, HEXA_DATA_ROLE).value<HEXA_NS::Group *>();
2023 if (hGroup == NULL) return false;
2025 if (hGroup->removeElement( nro ) == HOK) return true;
2030 bool DocumentModel::clearGroupElement( const QModelIndex& igrp )
2032 HEXA_NS::Group* hGroup = data(igrp, HEXA_DATA_ROLE).value<HEXA_NS::Group *>();
2034 if ( hGroup != NULL)
2036 hGroup->clearElement();
2042 // ************ LAWS ************
2045 QModelIndex DocumentModel::addLaw( const QString& name, int nbnodes )
2049 HEXA_NS::Law* hLaw = _hexaDocument->addLaw( name.toLocal8Bit().constData(), nbnodes );
2050 if ( BadElement(hLaw) ) return iLaw;
2052 LawItem* lawItem = new LawItem(hLaw);
2053 _lawDirItem->appendRow(lawItem);
2054 iLaw = lawItem->index();
2059 bool DocumentModel::setLaw( const QModelIndex& ilaw, int nbnodes, double coeff, KindLaw type )
2063 HEXA_NS::Law* hLaw = data(ilaw, HEXA_DATA_ROLE).value<HEXA_NS::Law *>();
2067 ok = hLaw->setNodes( nbnodes );
2068 ( ok == HOK) ? ret = true : ret = false;
2069 ok = hLaw->setCoefficient( coeff );
2070 hLaw->setKind(type);
2077 bool DocumentModel::removeLaw( const QModelIndex& ilaw )
2079 HEXA_NS::Law* hLaw = data(ilaw, HEXA_DATA_ROLE).value<HEXA_NS::Law *>();
2080 int r = _hexaDocument->removeLaw( hLaw );
2083 removeRow( ilaw.row(), ilaw.parent());
2090 bool DocumentModel::setPropagation( const QModelIndex& iPropagation, const QModelIndex& iLaw, bool way )
2092 HEXA_NS::Propagation* hPropagation = data(iPropagation, HEXA_DATA_ROLE).value<HEXA_NS::Propagation *>();
2093 HEXA_NS::Law* hLaw = data(iLaw, HEXA_DATA_ROLE).value<HEXA_NS::Law *>();
2095 int r = hPropagation->setLaw( hLaw );
2096 hPropagation->setWay( way );
2098 if ( r == HOK ) return true;
2104 QModelIndexList DocumentModel::getPropagation( const QModelIndex& iPropagation ) const
2106 QModelIndexList iEdges;
2108 QModelIndexList iFound;
2109 HEXA_NS::Propagation* propa = iPropagation.data(HEXA_DATA_ROLE).value<HEXA_NS::Propagation *>();
2110 if ( propa == NULL ) return iEdges;
2112 const HEXA_NS::Edges& edges = propa->getEdges();
2113 for ( HEXA_NS::Edges::const_iterator anEdge = edges.begin(), endIt = edges.end();
2116 iFound = match( index(0, 0),
2118 QVariant::fromValue( *anEdge ),
2120 Qt::MatchRecursive);
2121 if ( !iFound.isEmpty() )
2122 iEdges << iFound[0];
2128 HEXA_NS::Document* DocumentModel::documentImpl()
2130 return _hexaDocument;
2133 QString DocumentModel::documentEntry()
2138 // 8.3 Boite: éditer une loi CS_TODO
2141 /*****************************************************************
2143 *****************************************************************/
2145 PatternDataModel::PatternDataModel( QObject * parent ) :
2146 QSortFilterProxyModel( parent )
2148 QString dataRegExp = QString("(%1|%2|%3|%4|%5|%6|%7|%8)").
2149 arg(VERTEX_TREE).arg(EDGE_TREE).arg(QUAD_TREE).arg(HEXA_TREE).
2150 arg(VERTEX_DIR_TREE).arg(EDGE_DIR_TREE).arg(QUAD_DIR_TREE).arg(HEXA_DIR_TREE);
2152 setFilterRole(HEXA_TREE_ROLE);
2153 setFilterRegExp ( QRegExp(dataRegExp) );
2156 // *** Pour suppression des panneaux "Builder" et "Geometry" ****/
2158 //PatternDataModel::PatternDataModel( QObject * parent ) :
2159 // QSortFilterProxyModel( parent )
2161 // 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)").
2162 // arg(VERTEX_TREE).arg(EDGE_TREE).arg(QUAD_TREE).arg(HEXA_TREE).
2163 // arg(VERTEX_DIR_TREE).arg(EDGE_DIR_TREE).arg(QUAD_DIR_TREE).
2164 // arg(HEXA_DIR_TREE).arg(VECTOR_TREE).arg(ELEMENTS_TREE).
2165 // arg(VECTOR_DIR_TREE).arg(ELEMENTS_DIR_TREE).
2166 // arg(IMPLICIT_SHAPES_TREE).arg(EXPLICIT_SHAPES_TREE).arg(CLOUD_OF_POINTS_TREE).
2167 // arg(GEOMSHAPE_TREE).arg(GEOMPOINT_TREE).arg(GEOMEDGE_TREE).arg(GEOMFACE_TREE).
2168 // arg(IMPLICIT_SHAPES_DIR_TREE).arg(EXPLICIT_SHAPES_DIR_TREE).arg(CLOUD_OF_POINTS_DIR_TREE).
2169 // arg(GEOMSHAPE_DIR_TREE).arg(GEOMPOINT_DIR_TREE).arg(GEOMEDGE_DIR_TREE).arg(GEOMFACE_DIR_TREE);
2171 // setFilterRole(HEXA_TREE_ROLE);
2172 // setFilterRegExp ( QRegExp(dataRegExp) );
2177 PatternDataModel::~PatternDataModel()
2181 HEXA_NS::Document* PatternDataModel::documentImpl()
2183 HEXA_NS::Document* doc = NULL;
2184 DocumentModel *m = dynamic_cast<DocumentModel *>( sourceModel() );
2185 if (m) doc = m->documentImpl();
2189 QString PatternDataModel::documentEntry()
2192 DocumentModel *m = dynamic_cast<DocumentModel *>( sourceModel() );
2193 if (m) entry = m->documentEntry();
2197 Qt::ItemFlags PatternDataModel::flags(const QModelIndex &index) const
2199 Qt::ItemFlags flags;
2201 DocumentModel *m = dynamic_cast<DocumentModel *>( sourceModel() );
2203 flags = m->flags( mapToSource(index) );
2209 QVariant PatternDataModel::headerData ( int section, Qt::Orientation orientation, int role ) const
2211 if ( section == 0 and orientation == Qt::Horizontal and role == Qt::DisplayRole ){
2212 return QVariant( "Data" );
2214 return QSortFilterProxyModel::headerData ( section, orientation, role );
2219 QStandardItem* PatternDataModel::itemFromIndex ( const QModelIndex & index ) const
2221 QStandardItem *item = NULL;
2222 DocumentModel *m = dynamic_cast<DocumentModel *>( sourceModel() );
2224 item = m->itemFromIndex( mapToSource(index) );
2229 PatternBuilderModel::PatternBuilderModel( QObject * parent ) :
2230 QSortFilterProxyModel( parent )
2232 QString builderRegExp =QString("(%1|%2|%3|%4|%5|%6|%7|%8|%9|%10)").
2233 arg(VECTOR_TREE).arg(CYLINDER_TREE).arg(PIPE_TREE).arg(ELEMENTS_TREE).
2234 arg(CROSSELEMENTS_TREE).arg(VECTOR_DIR_TREE).arg(CYLINDER_DIR_TREE).
2235 arg(PIPE_DIR_TREE).arg(ELEMENTS_DIR_TREE).arg(CROSSELEMENTS_DIR_TREE);
2237 setFilterRole( HEXA_TREE_ROLE );
2238 setFilterRegExp ( QRegExp( builderRegExp ) );
2241 PatternBuilderModel::~PatternBuilderModel()
2245 Qt::ItemFlags PatternBuilderModel::flags(const QModelIndex &index) const
2247 Qt::ItemFlags flags;
2249 DocumentModel *m = dynamic_cast<DocumentModel *>( sourceModel() );
2251 flags = m->flags( mapToSource(index) );
2256 QVariant PatternBuilderModel::headerData ( int section, Qt::Orientation orientation, int role ) const
2258 if ( section == 0 and orientation == Qt::Horizontal and role == Qt::DisplayRole ){
2259 return QVariant( "Builder" );
2261 return QSortFilterProxyModel::headerData ( section, orientation, role );
2265 QStandardItem* PatternBuilderModel::itemFromIndex ( const QModelIndex & index ) const
2267 QStandardItem *item = NULL;
2268 DocumentModel *m = dynamic_cast<DocumentModel *>( sourceModel() );
2270 item = m->itemFromIndex( mapToSource(index) );
2275 //====================================================================
2277 //====================================================================
2278 PatternGeomModel::PatternGeomModel( QObject * parent ) :
2279 QSortFilterProxyModel( parent )
2281 QString builderRegExp =QString("(%1|%2|%3|%4|%5|%6|%7|%8|%9|%10|%11|%12|%13|%14)").
2282 arg(EXPLICIT_SHAPES_TREE).arg(IMPLICIT_SHAPES_TREE).arg(CLOUD_OF_POINTS_TREE).
2283 arg(GEOMSHAPE_TREE).arg(GEOMPOINT_TREE).arg(GEOMEDGE_TREE).arg(GEOMFACE_TREE).
2284 arg(EXPLICIT_SHAPES_DIR_TREE).arg(IMPLICIT_SHAPES_DIR_TREE).arg(CLOUD_OF_POINTS_DIR_TREE).
2285 arg(GEOMSHAPE_DIR_TREE).arg(GEOMPOINT_DIR_TREE).arg(GEOMEDGE_DIR_TREE).arg(GEOMFACE_DIR_TREE);
2287 setFilterRole( HEXA_TREE_ROLE );
2288 setFilterRegExp ( QRegExp(builderRegExp ) );
2291 PatternGeomModel::~PatternGeomModel()
2295 Qt::ItemFlags PatternGeomModel::flags(const QModelIndex &index) const
2297 Qt::ItemFlags flags;
2299 DocumentModel *m = dynamic_cast<DocumentModel *>( sourceModel() );
2301 flags = m->flags( mapToSource(index) );
2306 QVariant PatternGeomModel::headerData ( int section, Qt::Orientation orientation, int role ) const
2308 if ( section == 0 and orientation == Qt::Horizontal and role == Qt::DisplayRole ){
2309 return QVariant( "Geometry" );
2311 return QSortFilterProxyModel::headerData ( section, orientation, role );
2315 QStandardItem* PatternGeomModel::itemFromIndex ( const QModelIndex & index ) const
2317 QStandardItem *item = NULL;
2318 DocumentModel *m = dynamic_cast<DocumentModel *>( sourceModel() );
2320 item = m->itemFromIndex( mapToSource(index) );
2324 //==============================================================
2327 AssociationsModel::AssociationsModel( QObject * parent ) :
2328 QSortFilterProxyModel( parent )
2330 QString assocRegExp;
2332 setFilterRole( HEXA_TREE_ROLE );
2333 setFilterRegExp ( QRegExp(assocRegExp) );
2336 AssociationsModel::~AssociationsModel()
2340 Qt::ItemFlags AssociationsModel::flags(const QModelIndex &index) const
2342 Qt::ItemFlags flags;
2344 DocumentModel *m = dynamic_cast<DocumentModel *>( sourceModel() );
2346 flags = m->flags( mapToSource(index) );
2351 QVariant AssociationsModel::headerData ( int section, Qt::Orientation orientation, int role ) const
2353 if ( section == 0 and orientation == Qt::Horizontal and role == Qt::DisplayRole ){
2354 return QVariant( "Associations" );
2356 return QSortFilterProxyModel::headerData ( section, orientation, role );
2360 QStandardItem* AssociationsModel::itemFromIndex ( const QModelIndex & index ) const
2362 QStandardItem *item = NULL;
2363 DocumentModel *m = dynamic_cast<DocumentModel *>( sourceModel() );
2365 item = m->itemFromIndex( mapToSource(index) );
2370 GroupsModel::GroupsModel( QObject * parent ) :
2371 QSortFilterProxyModel( parent )
2373 QString groupsRegExp =QString("(%1|%2)").arg(GROUP_TREE).arg(GROUP_DIR_TREE);
2375 setFilterRole( HEXA_TREE_ROLE );
2376 setFilterRegExp ( QRegExp(groupsRegExp ) );
2379 GroupsModel::~GroupsModel()
2383 Qt::ItemFlags GroupsModel::flags(const QModelIndex &index) const
2385 Qt::ItemFlags flags;
2387 DocumentModel *m = dynamic_cast<DocumentModel *>( sourceModel() );
2389 flags = m->flags( mapToSource(index) );
2394 QVariant GroupsModel::headerData ( int section, Qt::Orientation orientation, int role ) const
2396 if ( section == 0 and orientation == Qt::Horizontal and role == Qt::DisplayRole ){
2397 return QVariant( "Groups" );
2399 return QSortFilterProxyModel::headerData ( section, orientation, role );
2403 QStandardItem* GroupsModel::itemFromIndex ( const QModelIndex & index ) const
2405 QStandardItem *item = NULL;
2406 DocumentModel *m = dynamic_cast<DocumentModel *>( sourceModel() );
2408 item = m->itemFromIndex( mapToSource(index) );
2413 QModelIndexList GroupsModel::getGroupElements( const QModelIndex& iGroup, DocumentModel::Group& kind ) const
2415 QModelIndexList elements;
2416 DocumentModel *m = dynamic_cast<DocumentModel *>( sourceModel() );
2418 elements = m->getGroupElements( mapToSource(iGroup), kind );
2423 MeshModel::MeshModel( QObject * parent ) :
2424 QSortFilterProxyModel( parent )
2426 QString meshRegExp =QString("(%1|%2|%3|%4)").arg(LAW_TREE).arg(LAW_DIR_TREE) .arg(PROPAGATION_TREE).arg(PROPAGATION_DIR_TREE);
2428 setFilterRole( HEXA_TREE_ROLE );
2429 setFilterRegExp ( QRegExp(meshRegExp) );
2432 MeshModel::~MeshModel()
2436 Qt::ItemFlags MeshModel::flags(const QModelIndex &index) const
2438 Qt::ItemFlags flags;
2440 DocumentModel *m = dynamic_cast<DocumentModel *>( sourceModel() );
2442 flags = m->flags( mapToSource(index) );
2447 QVariant MeshModel::headerData ( int section, Qt::Orientation orientation, int role ) const
2449 if ( section == 0 and orientation == Qt::Horizontal and role == Qt::DisplayRole ){
2450 return QVariant( "Mesh" );
2452 return QSortFilterProxyModel::headerData ( section, orientation, role );
2456 QStandardItem* MeshModel::itemFromIndex ( const QModelIndex & index ) const
2458 QStandardItem *item = NULL;
2459 DocumentModel *m = dynamic_cast<DocumentModel *>( sourceModel() );
2461 item = m->itemFromIndex( mapToSource(index) );
2466 QModelIndexList MeshModel::getPropagation( const QModelIndex& iPropagation ) const
2468 QModelIndexList edges;
2469 DocumentModel *m = dynamic_cast<DocumentModel *>( sourceModel() );
2471 edges = m->getPropagation( mapToSource(iPropagation) );
2477 // ================================== NEW ======================================
2479 // ===== CARTESIAN GRID
2481 QModelIndex DocumentModel::makeCartesianTop(int nx, int ny, int nz)
2485 HEXA_NS::Elements* helts = _hexaDocument->makeCartesianTop( nx, ny, nz );
2486 if ( BadElement(helts) )
2489 result = addToElementsTree(helts);
2494 QModelIndex DocumentModel::makeCartesianUni(const QModelIndex& icenter,
2495 const QModelIndex& ibase, const QModelIndex& ivec, const QModelIndex& iaxis,
2496 double lx, double ly, double lz, int nx, int ny, int nz)
2500 HEXA_NS::Vertex* hcenter = getHexaPtr<HEXA_NS::Vertex*>(icenter);
2501 HEXA_NS::Vector* hbase = getHexaPtr<HEXA_NS::Vector*>(ibase);
2502 HEXA_NS::Vector* hvec = getHexaPtr<HEXA_NS::Vector*>(ivec);
2503 HEXA_NS::Vector* haxis = getHexaPtr<HEXA_NS::Vector*>(iaxis);
2505 HEXA_NS::Elements* helts = _hexaDocument->makeCartesianUni( hcenter, hbase, hvec, haxis,
2506 lx, ly, lz, nx, ny, nz);
2507 if ( BadElement(helts) )
2510 result = addToElementsTree(helts);
2515 QModelIndex DocumentModel::makeCartesian(const QModelIndex& icenter,
2516 const QModelIndex& ibase, const QModelIndex& ivec, const QModelIndex& iaxis,
2517 vector<double>& radius, vector<double>& angles, vector<double>& heights)
2521 HEXA_NS::Vertex* hcenter = getHexaPtr<HEXA_NS::Vertex*>(icenter);
2522 HEXA_NS::Vector* hbase = getHexaPtr<HEXA_NS::Vector*>(ibase);
2523 HEXA_NS::Vector* hvec = getHexaPtr<HEXA_NS::Vector*>(ivec);
2524 HEXA_NS::Vector* haxis = getHexaPtr<HEXA_NS::Vector*>(iaxis);
2526 HEXA_NS::Elements* helts = _hexaDocument->makeCartesian( hcenter, hbase, hvec, haxis,
2527 radius, angles, heights);
2528 if ( BadElement(helts) )
2531 result = addToElementsTree(helts);
2539 QModelIndex DocumentModel::makeSphereTop (int nr, int na, int nh)
2543 HEXA_NS::Elements* helts = _hexaDocument->makeSphereTop( nr, na, nh );
2544 if ( BadElement(helts) )
2547 result = addToElementsTree(helts);
2552 QModelIndex DocumentModel::makeSphereUni (QModelIndex& icenter,
2553 QModelIndex& ivec_x, QModelIndex& ivec_z,
2554 double rtrou, double rext, double ang,
2555 QModelIndex& ivplan,
2556 int nr, int na, int nh)
2560 HEXA_NS::Vertex* hcenter = getHexaPtr<HEXA_NS::Vertex*>(icenter);
2561 HEXA_NS::Vector* hvec_x = getHexaPtr<HEXA_NS::Vector*>(ivec_x);
2562 HEXA_NS::Vector* hvec_z = getHexaPtr<HEXA_NS::Vector*>(ivec_z);
2563 HEXA_NS::Vertex* hvplan = getHexaPtr<HEXA_NS::Vertex*>(ivplan);
2565 HEXA_NS::Elements* helts = _hexaDocument->makeSphereUni( hcenter, hvec_x, hvec_z,
2566 rtrou, rext, ang, hvplan,
2568 result = addToElementsTree(helts);
2573 QModelIndex DocumentModel::makeSphere (QModelIndex& icenter,
2574 QModelIndex& ivec_x, QModelIndex& ivec_z,
2575 vector<double>& tray, vector<double>& tang, vector<double>& thaut)
2579 HEXA_NS::Vertex* hcenter = getHexaPtr<HEXA_NS::Vertex*>(icenter);
2580 HEXA_NS::Vector* hvec_x = getHexaPtr<HEXA_NS::Vector*>(ivec_x);
2581 HEXA_NS::Vector* hvec_z = getHexaPtr<HEXA_NS::Vector*>(ivec_z);
2583 HEXA_NS::Elements* helts = _hexaDocument->makeSphere( hcenter, hvec_x, hvec_z,
2586 result = addToElementsTree(helts);
2593 QModelIndex DocumentModel::makeSphericalTop (int nbre, int crit)
2597 HEXA_NS::Elements* helts = _hexaDocument->makeSphericalTop(nbre, crit);
2598 if (BadElement(helts))
2601 result = addToElementsTree(helts);
2606 QModelIndex DocumentModel::makeSphericalUni (QModelIndex& icenter,
2607 QModelIndex& ivec_x, QModelIndex& ivec_z,
2613 HEXA_NS::Vertex* hcenter = getHexaPtr<HEXA_NS::Vertex*>(icenter);
2614 HEXA_NS::Vector* hvec_x = getHexaPtr<HEXA_NS::Vector*>(ivec_x);
2615 HEXA_NS::Vector* hvec_z = getHexaPtr<HEXA_NS::Vector*>(ivec_z);
2617 HEXA_NS::Elements* helts = _hexaDocument->makeSphericalUni(hcenter, hvec_x, hvec_z, rayon, nbre, crit);
2618 if (BadElement(helts))
2621 result = addToElementsTree(helts);
2626 QModelIndex DocumentModel::makeSpherical (QModelIndex& icenter,
2627 QModelIndex& ivec_x, QModelIndex& ivec_z,
2628 vector<double>& rayon,
2633 HEXA_NS::Vertex* hcenter = getHexaPtr<HEXA_NS::Vertex*>(icenter);
2634 HEXA_NS::Vector* hvec_x = getHexaPtr<HEXA_NS::Vector*>(ivec_x);
2635 HEXA_NS::Vector* hvec_z = getHexaPtr<HEXA_NS::Vector*>(ivec_z);
2637 HEXA_NS::Elements* helts = _hexaDocument->makeSpherical(hcenter, hvec_x, hvec_z, rayon, crit);
2638 if (BadElement(helts))
2641 result = addToElementsTree(helts);
2647 QModelIndex DocumentModel::makeRindTop (int nr, int na, int nh)
2651 HEXA_NS::Elements* helts = _hexaDocument->makeRindTop(nr, na, nh);
2652 if (BadElement(helts))
2655 result = addToElementsTree(helts);
2660 QModelIndex DocumentModel::makeRindUni (QModelIndex& icenter,
2661 QModelIndex& ivec_x, QModelIndex& ivec_z,
2662 double raytrou, double rint, double rext, double ang,
2663 QModelIndex& ivplan,
2664 int nr, int na, int nh)
2668 HEXA_NS::Vertex* hcenter = getHexaPtr<HEXA_NS::Vertex*>(icenter);
2669 HEXA_NS::Vector* hvec_x = getHexaPtr<HEXA_NS::Vector*>(ivec_x);
2670 HEXA_NS::Vector* hvec_z = getHexaPtr<HEXA_NS::Vector*>(ivec_z);
2671 HEXA_NS::Vertex* hvplan = getHexaPtr<HEXA_NS::Vertex*>(ivplan);
2673 HEXA_NS::Elements* helts = _hexaDocument->makeRindUni(hcenter, hvec_x, hvec_z, raytrou, rint, rext, ang,
2674 hvplan, nr, na, nh);
2675 if (BadElement(helts))
2678 result = addToElementsTree(helts);
2683 QModelIndex DocumentModel::makeRind (QModelIndex& icenter,
2684 QModelIndex& ivec_x, QModelIndex& ivec_z,
2685 vector<double>& tray, vector<double>& tang, vector<double>& thaut)
2689 HEXA_NS::Vertex* hcenter = getHexaPtr<HEXA_NS::Vertex*>(icenter);
2690 HEXA_NS::Vector* hvec_x = getHexaPtr<HEXA_NS::Vector*>(ivec_x);
2691 HEXA_NS::Vector* hvec_z = getHexaPtr<HEXA_NS::Vector*>(ivec_z);
2693 HEXA_NS::Elements* helts = _hexaDocument->makeRind(hcenter, hvec_x, hvec_z, tray, tang, thaut);
2694 if (BadElement(helts))
2697 result = addToElementsTree(helts);
2702 // ======== Cylinder
2703 QModelIndex DocumentModel::makeCylinderTop(int nr, int na, int nh)
2707 HEXA_NS::Elements* helts = _hexaDocument->makeCylinderTop(nr, na, nh);
2708 if (BadElement(helts))
2711 result = addToElementsTree(helts);
2716 QModelIndex DocumentModel::makeCylinderUni(QModelIndex& iorig, QModelIndex& ivecx, QModelIndex& ivecz,
2717 double rint, double rext, double angle, double haut,
2718 int nr, int na, int nh)
2722 HEXA_NS::Vertex* horig = getHexaPtr<HEXA_NS::Vertex*>(iorig);
2723 HEXA_NS::Vector* hvecx = getHexaPtr<HEXA_NS::Vector*>(ivecx);
2724 HEXA_NS::Vector* hvecz = getHexaPtr<HEXA_NS::Vector*>(ivecz);
2726 HEXA_NS::Elements* helts = _hexaDocument->makeCylinderUni(horig, hvecx, hvecz,
2727 rint, rext, angle, haut,
2729 if (BadElement(helts))
2732 result = addToElementsTree(helts);
2737 QModelIndex DocumentModel::makeCylinder(QModelIndex& iorig, QModelIndex& ivecx, QModelIndex& ivecz,
2738 vector<double>& tray, vector<double>& tang, vector<double>& thaut)
2742 HEXA_NS::Vertex* horig = getHexaPtr<HEXA_NS::Vertex*>(iorig);
2743 HEXA_NS::Vector* hvecx = getHexaPtr<HEXA_NS::Vector*>(ivecx);
2744 HEXA_NS::Vector* hvecz = getHexaPtr<HEXA_NS::Vector*>(ivecz);
2746 HEXA_NS::Elements* helts = _hexaDocument->makeCylinder(horig, hvecx, hvecz, tray, tang, thaut);
2747 if (BadElement(helts))
2750 result = addToElementsTree(helts);
2756 // ======== Cylinders
2757 QModelIndex DocumentModel::makeCylinders(QModelIndex& iorig1, QModelIndex& ivecz1, double r1, double h1,
2758 QModelIndex& iorig2, QModelIndex& ivecz2, double r2, double h2)
2762 HEXA_NS::Vertex* horig1 = getHexaPtr<HEXA_NS::Vertex*>(iorig1);
2763 HEXA_NS::Vertex* horig2 = getHexaPtr<HEXA_NS::Vertex*>(iorig2);
2764 HEXA_NS::Vector* hvecz1 = getHexaPtr<HEXA_NS::Vector*>(ivecz1);
2765 HEXA_NS::Vector* hvecz2 = getHexaPtr<HEXA_NS::Vector*>(ivecz2);
2767 HEXA_NS::BiCylinder* helts = _hexaDocument->makeCylinders(horig1, hvecz1, r1, h1,
2768 horig2, hvecz2, r2, h2);
2769 if (BadElement(helts))
2772 result = addToElementsTree(helts);
2778 QModelIndex DocumentModel::makePipeTop(int nr, int na, int nh)
2782 HEXA_NS::Elements* helts = _hexaDocument->makePipeTop(nr, na, nh);
2783 if (BadElement(helts))
2786 result = addToElementsTree(helts);
2791 QModelIndex DocumentModel::makePipeUni(QModelIndex& iorig, QModelIndex& ivecx, QModelIndex& ivecz,
2792 double rint, double rext, double angle, double haut,
2793 int nr, int na, int nh)
2797 HEXA_NS::Vertex* horig = getHexaPtr<HEXA_NS::Vertex*>(iorig);
2798 HEXA_NS::Vector* hvecx = getHexaPtr<HEXA_NS::Vector*>(ivecx);
2799 HEXA_NS::Vector* hvecz = getHexaPtr<HEXA_NS::Vector*>(ivecz);
2801 HEXA_NS::Elements* helts = _hexaDocument->makePipeUni(horig, hvecx, hvecz, rint, rext, angle,
2803 if (BadElement(helts))
2806 result = addToElementsTree(helts);
2811 QModelIndex DocumentModel::makePipe(QModelIndex& iorig, QModelIndex& ivecx, QModelIndex& ivecz,
2812 vector<double>& tray, vector<double>& tang, vector<double>& thaut)
2816 HEXA_NS::Vertex* horig = getHexaPtr<HEXA_NS::Vertex*>(iorig);
2817 HEXA_NS::Vector* hvecx = getHexaPtr<HEXA_NS::Vector*>(ivecx);
2818 HEXA_NS::Vector* hvecz = getHexaPtr<HEXA_NS::Vector*>(ivecz);
2820 HEXA_NS::Elements* helts = _hexaDocument->makePipe(horig, hvecx, hvecz, tray, tang, thaut);
2821 if (BadElement(helts))
2824 result = addToElementsTree(helts);
2830 QModelIndex DocumentModel::makePipes(QModelIndex& iorig1, QModelIndex& ivecz1, double rint1, double rex1, double h1,
2831 QModelIndex& iorig2, QModelIndex& ivecz2, double rint2, double rex2, double h2)
2835 HEXA_NS::Vertex* horig1 = getHexaPtr<HEXA_NS::Vertex*>(iorig1);
2836 HEXA_NS::Vertex* horig2 = getHexaPtr<HEXA_NS::Vertex*>(iorig2);
2837 HEXA_NS::Vector* hvecz1 = getHexaPtr<HEXA_NS::Vector*>(ivecz1);
2838 HEXA_NS::Vector* hvecz2 = getHexaPtr<HEXA_NS::Vector*>(ivecz2);
2840 HEXA_NS::BiCylinder* helts = _hexaDocument->makePipes(horig1, hvecz1, rint1, rex1, h1,
2841 horig2, hvecz2, rint2, rex2, h2);
2842 if (BadElement(helts))
2845 result = addToElementsTree(helts);
2850 // ======== Join Quads
2851 QModelIndex DocumentModel::joinQuadUni(QModelIndex& istart, QModelIndex& idest, QModelIndex& iv1, QModelIndex& iv2,
2852 QModelIndex& iv3, QModelIndex& iv4, int nb)
2856 HEXA_NS::Quad* hstart = getHexaPtr<HEXA_NS::Quad*>(istart);
2857 HEXA_NS::Quad* hdest = getHexaPtr<HEXA_NS::Quad*>(idest);
2858 HEXA_NS::Vertex* hv1 = getHexaPtr<HEXA_NS::Vertex*>(iv1);
2859 HEXA_NS::Vertex* hv2 = getHexaPtr<HEXA_NS::Vertex*>(iv2);
2860 HEXA_NS::Vertex* hv3 = getHexaPtr<HEXA_NS::Vertex*>(iv3);
2861 HEXA_NS::Vertex* hv4 = getHexaPtr<HEXA_NS::Vertex*>(iv4);
2863 HEXA_NS::Elements* helts = _hexaDocument->joinQuadUni(hstart, hdest, hv1, hv2, hv3, hv4, nb);
2864 if (BadElement(helts))
2867 result = addToElementsTree(helts);
2872 QModelIndex DocumentModel::joinQuad(QModelIndex& istart, QModelIndex& idest, QModelIndex& iva1, QModelIndex& ivb1,
2873 QModelIndex& iva2, QModelIndex& ivb2, vector<double>& tlen)
2877 HEXA_NS::Quad* hstart = getHexaPtr<HEXA_NS::Quad*>(istart);
2878 HEXA_NS::Quad* hdest = getHexaPtr<HEXA_NS::Quad*>(idest);
2879 HEXA_NS::Vertex* hva1 = getHexaPtr<HEXA_NS::Vertex*>(iva1);
2880 HEXA_NS::Vertex* hvb1 = getHexaPtr<HEXA_NS::Vertex*>(ivb1);
2881 HEXA_NS::Vertex* hva2 = getHexaPtr<HEXA_NS::Vertex*>(iva2);
2882 HEXA_NS::Vertex* hvb2 = getHexaPtr<HEXA_NS::Vertex*>(ivb2);
2884 HEXA_NS::Elements* helts = _hexaDocument->joinQuad(hstart, hdest, hva1, hvb1, hva2, hvb2, tlen);
2885 if (BadElement(helts))
2888 result = addToElementsTree(helts);
2893 QModelIndex DocumentModel::joinQuadsUni(QModelIndexList& istarts, QModelIndex& idest, QModelIndex& iv1, QModelIndex& iv2,
2894 QModelIndex& iv3, QModelIndex& iv4, int nb)
2898 HEXA_NS::Quads hstarts;
2899 int nbQuads = istarts.size();
2900 for (int i = 0; i < nbQuads; ++i)
2901 hstarts.push_back(getHexaPtr<HEXA_NS::Quad*>(istarts[i]));
2903 HEXA_NS::Quad* hdest = getHexaPtr<HEXA_NS::Quad*>(idest);
2904 HEXA_NS::Vertex* hv1 = getHexaPtr<HEXA_NS::Vertex*>(iv1);
2905 HEXA_NS::Vertex* hv2 = getHexaPtr<HEXA_NS::Vertex*>(iv2);
2906 HEXA_NS::Vertex* hv3 = getHexaPtr<HEXA_NS::Vertex*>(iv3);
2907 HEXA_NS::Vertex* hv4 = getHexaPtr<HEXA_NS::Vertex*>(iv4);
2909 HEXA_NS::Elements* helts = _hexaDocument->joinQuadsUni(hstarts, hdest, hv1, hv2, hv3, hv4, nb);
2910 if (BadElement(helts))
2913 result = addToElementsTree(helts);
2918 QModelIndex DocumentModel::joinQuads(QModelIndexList& istarts, QModelIndex& idest, QModelIndex& iva1, QModelIndex& ivb1,
2919 QModelIndex& iva2, QModelIndex& ivb2, vector<double>& tlen)
2923 HEXA_NS::Quads hstarts;
2924 int nbQuads = istarts.size();
2925 for (int i = 0; i < nbQuads; ++i)
2926 hstarts.push_back(getHexaPtr<HEXA_NS::Quad*>(istarts[i]));
2928 HEXA_NS::Quad* hdest = getHexaPtr<HEXA_NS::Quad*>(idest);
2929 HEXA_NS::Vertex* hva1 = getHexaPtr<HEXA_NS::Vertex*>(iva1);
2930 HEXA_NS::Vertex* hvb1 = getHexaPtr<HEXA_NS::Vertex*>(ivb1);
2931 HEXA_NS::Vertex* hva2 = getHexaPtr<HEXA_NS::Vertex*>(iva2);
2932 HEXA_NS::Vertex* hvb2 = getHexaPtr<HEXA_NS::Vertex*>(ivb2);
2934 HEXA_NS::Elements* helts = _hexaDocument->joinQuads(hstarts, hdest, hva1, hvb1, hva2, hvb2, tlen);
2935 if (BadElement(helts))
2938 result = addToElementsTree(helts);
2943 // ======== Quad Revolution
2944 QModelIndex DocumentModel::revolutionQuadUni(QModelIndex& istart, QModelIndex& icenter, QModelIndex& iaxis,
2945 double angle, int nbre)
2949 HEXA_NS::Quad* hstart = getHexaPtr<HEXA_NS::Quad*>(istart);
2950 HEXA_NS::Vertex* hcenter = getHexaPtr<HEXA_NS::Vertex*>(icenter);
2951 HEXA_NS::Vector* haxis = getHexaPtr<HEXA_NS::Vector*>(iaxis);
2953 HEXA_NS::Elements* helts = _hexaDocument->revolutionQuadUni(hstart, hcenter, haxis, angle, nbre);
2954 if (BadElement(helts))
2957 result = addToElementsTree(helts);
2962 QModelIndex DocumentModel::revolutionQuad(QModelIndex& istart, QModelIndex& icenter, QModelIndex& iaxis,
2963 vector<double>& angles)
2967 HEXA_NS::Quad* hstart = getHexaPtr<HEXA_NS::Quad*>(istart);
2968 HEXA_NS::Vertex* hcenter = getHexaPtr<HEXA_NS::Vertex*>(icenter);
2969 HEXA_NS::Vector* haxis = getHexaPtr<HEXA_NS::Vector*>(iaxis);
2971 HEXA_NS::Elements* helts = _hexaDocument->revolutionQuad(hstart, hcenter, haxis, angles);
2972 if (BadElement(helts))
2975 result = addToElementsTree(helts);
2980 QModelIndex DocumentModel::revolutionQuadsUni(QModelIndexList& istarts, QModelIndex& icenter, QModelIndex& iaxis,
2981 double angle, int nbre)
2985 HEXA_NS::Quads hstarts;
2986 int nbQuads = istarts.count();
2987 for (int i = 0; i < nbQuads; ++i)
2988 hstarts.push_back(getHexaPtr<HEXA_NS::Quad*>(istarts[i]));
2990 HEXA_NS::Vertex* hcenter = getHexaPtr<HEXA_NS::Vertex*>(icenter);
2991 HEXA_NS::Vector* haxis = getHexaPtr<HEXA_NS::Vector*>(iaxis);
2993 HEXA_NS::Elements* helts = _hexaDocument->revolutionQuadsUni(hstarts, hcenter, haxis, angle, nbre);
2994 if (BadElement(helts))
2997 result = addToElementsTree(helts);
3002 QModelIndex DocumentModel::revolutionQuads(QModelIndexList& istarts, QModelIndex& icenter, QModelIndex& iaxis,
3003 vector<double>& angles)
3007 HEXA_NS::Quads hstarts;
3008 int nbQuads = istarts.count();
3009 for (int i = 0; i < nbQuads; ++i)
3010 hstarts.push_back(getHexaPtr<HEXA_NS::Quad*>(istarts[i]));
3012 HEXA_NS::Vertex* hcenter = getHexaPtr<HEXA_NS::Vertex*>(icenter);
3013 HEXA_NS::Vector* haxis = getHexaPtr<HEXA_NS::Vector*>(iaxis);
3015 HEXA_NS::Elements* helts = _hexaDocument->revolutionQuads(hstarts, hcenter, haxis, angles);
3016 if (BadElement(helts))
3019 result = addToElementsTree(helts);
3025 // ==== PrismQuad or ExtrudeQuad
3026 QModelIndex DocumentModel::extrudeQuadTop(QModelIndex& istart, int nbre)
3030 HEXA_NS::Quad* hstart = getHexaPtr<HEXA_NS::Quad*>(istart);
3031 HEXA_NS::Elements* helts = _hexaDocument->extrudeQuadTop(hstart, nbre);
3032 if (BadElement(helts))
3035 result = addToElementsTree(helts);
3040 QModelIndex DocumentModel::extrudeQuadUni(QModelIndex& istart, QModelIndex& dv, double len, int nbre)
3044 HEXA_NS::Quad* hstart = getHexaPtr<HEXA_NS::Quad*>(istart);
3045 HEXA_NS::Vector* hvec = getHexaPtr<HEXA_NS::Vector*>(dv);
3047 HEXA_NS::Elements* helts = _hexaDocument->extrudeQuadUni(hstart, hvec, len, nbre);
3048 if (BadElement(helts))
3051 result = addToElementsTree(helts);
3056 QModelIndex DocumentModel::extrudeQuad(QModelIndex& istart, QModelIndex& dv, vector<double>& tlen)
3060 HEXA_NS::Quad* hstart = getHexaPtr<HEXA_NS::Quad*>(istart);
3061 HEXA_NS::Vector* hvec = getHexaPtr<HEXA_NS::Vector*>(dv);
3063 HEXA_NS::Elements* helts = _hexaDocument->extrudeQuad(hstart, hvec, tlen);
3064 if (BadElement(helts))
3066 result = addToElementsTree(helts);
3071 QModelIndex DocumentModel::extrudeQuadsTop (QModelIndexList& istarts, int nbre)
3075 HEXA_NS::Quads hquads;
3076 int nbQuads = istarts.count();
3077 for (int i = 0; i < nbQuads; ++i)
3078 hquads.push_back(getHexaPtr<HEXA_NS::Quad*>(istarts[i]));
3080 HEXA_NS::Elements* helts = _hexaDocument->extrudeQuadsTop(hquads, nbre);
3081 if (BadElement(helts))
3083 result = addToElementsTree(helts);
3088 QModelIndex DocumentModel::extrudeQuadsUni (QModelIndexList& istarts, QModelIndex& axis, double len, int nbre)
3092 HEXA_NS::Quads hquads;
3093 int nbQuads = istarts.count();
3094 for (int i = 0; i < nbQuads; ++i)
3095 hquads.push_back(getHexaPtr<HEXA_NS::Quad*>(istarts[i]));
3097 HEXA_NS::Vector* haxis = getHexaPtr<HEXA_NS::Vector*>(axis);
3099 HEXA_NS::Elements* helts = _hexaDocument->extrudeQuadsUni(hquads, haxis, len, nbre);
3100 if (BadElement(helts))
3102 result = addToElementsTree(helts);
3107 QModelIndex DocumentModel::extrudeQuads(QModelIndexList& istarts, QModelIndex& iaxis, vector<double>& tlen)
3111 HEXA_NS::Quads hquads;
3112 int nbQuads = istarts.count();
3113 for (int i=0; i < nbQuads; ++i)
3114 hquads.push_back(getHexaPtr<HEXA_NS::Quad*>(istarts[i]));
3116 HEXA_NS::Vector* haxis = getHexaPtr<HEXA_NS::Vector*>(iaxis);
3118 HEXA_NS::Elements* helts = _hexaDocument->extrudeQuads(hquads, haxis, tlen);
3119 if (BadElement(helts))
3121 result = addToElementsTree(helts);
3127 QModelIndex DocumentModel::cutUni(QModelIndex& iEdge, int nbre)
3131 HEXA_NS::Edge* hedge = getHexaPtr<HEXA_NS::Edge*>(iEdge);
3133 HEXA_NS::Elements* helts = _hexaDocument->cutUni(hedge, nbre);
3134 if (BadElement(helts))
3136 result = addToElementsTree(helts);
3141 QModelIndex DocumentModel::cut(QModelIndex& iEdge, vector<double>& tlen)
3145 HEXA_NS::Edge* hedge = getHexaPtr<HEXA_NS::Edge*>(iEdge);
3147 HEXA_NS::Elements* helts = _hexaDocument->cut(hedge, tlen);
3148 if (BadElement(helts))
3150 result = addToElementsTree(helts);
3155 // ================================== END NEW ==================================
3158 // ================================== OBSOLETE =============================================
3160 QModelIndex DocumentModel::makeCartesian( const QModelIndex& i_pt,
3161 const QModelIndex& i_vec_x, const QModelIndex& i_vec_y, const QModelIndex& i_vec_z,
3162 long nx, long ny, long nz)
3164 QModelIndex eltsIndex;
3166 HEXA_NS::Vertex* hpt = getHexaPtr<HEXA_NS::Vertex*>(i_pt);
3167 HEXA_NS::Vector* hvec_x = getHexaPtr<HEXA_NS::Vector*>(i_vec_x);
3168 HEXA_NS::Vector* hvec_y = getHexaPtr<HEXA_NS::Vector*>(i_vec_y);
3169 HEXA_NS::Vector* hvec_z = getHexaPtr<HEXA_NS::Vector*>(i_vec_z);
3171 HEXA_NS::Elements* new_helts = _hexaDocument->makeCartesian( hpt,
3172 hvec_x, hvec_y, hvec_z,
3174 if ( BadElement(new_helts) )
3177 updateData(); //CS_TODO more or less?
3178 ElementsItem* eltsItem = new ElementsItem(new_helts);
3179 _elementsDirItem->appendRow(eltsItem);
3180 eltsIndex = eltsItem->index();
3185 QModelIndex DocumentModel::makeCartesian( const QModelIndex& ivex,
3186 const QModelIndex& ivec,
3187 int nx, int ny, int nz )
3191 HEXA_NS::Vertex* hVex = getHexaPtr<HEXA_NS::Vertex*>(ivex);
3192 HEXA_NS::Vector* hVec = getHexaPtr<HEXA_NS::Vector*>(ivec);
3194 HEXA_NS::Elements* hElts = _hexaDocument->makeCartesian( hVex,
3197 if ( BadElement(hElts) ) return iElts;
3199 updateData(); //CS_TODO more or less?
3200 ElementsItem* elts = new ElementsItem(hElts);
3201 _elementsDirItem->appendRow(elts);
3202 iElts = elts->index();
3207 QModelIndex DocumentModel::makeCylindrical( const QModelIndex& i_pt,
3208 const QModelIndex& i_vec_x, const QModelIndex& i_vec_z,
3209 double dr, double da, double dl,
3210 long nr, long na, long nl,
3214 QModelIndex eltsIndex;
3216 HEXA_NS::Vertex* hpt = getHexaPtr<HEXA_NS::Vertex*>(i_pt);
3217 HEXA_NS::Vector* hvec_x = getHexaPtr<HEXA_NS::Vector*>(i_vec_x);
3218 HEXA_NS::Vector* hvec_z = getHexaPtr<HEXA_NS::Vector*>(i_vec_z);
3220 HEXA_NS::Elements* new_helts = _hexaDocument->makeCylindrical( hpt, hvec_x, hvec_z, dr, da, dl, nr, na, nl, fill );
3221 if ( BadElement(new_helts) ) return eltsIndex;
3223 updateData(); //CS_TODO more or less?
3224 ElementsItem* eltsItem = new ElementsItem(new_helts);
3225 _elementsDirItem->appendRow(eltsItem);
3226 eltsIndex = eltsItem->index();
3231 QModelIndex DocumentModel::makeCylindricals(
3232 const QModelIndex& icenter, const QModelIndex& ibase, const QModelIndex& iheight,
3233 QList< double> radius, QList<double> angles, QList<double> heights,
3236 QModelIndex eltsIndex;
3238 HEXA_NS::Vertex* hcenter = getHexaPtr<HEXA_NS::Vertex*>(icenter);
3239 HEXA_NS::Vector* hbase =getHexaPtr<HEXA_NS::Vector*>(ibase);
3240 HEXA_NS::Vector* hheight = getHexaPtr<HEXA_NS::Vector*>(iheight);
3242 std::vector<double> r = radius.toVector().toStdVector();
3243 std::vector<double> a = angles.toVector().toStdVector();
3244 std::vector<double> h = heights.toVector().toStdVector();
3246 HEXA_NS::Elements* helts = _hexaDocument->makeCylindricals(
3247 hcenter, hbase, hheight,
3250 if ( BadElement(helts) ) return eltsIndex;
3252 updateData(); //CS_TODO more or less?
3253 ElementsItem* eltsItem = new ElementsItem(helts);
3254 _elementsDirItem->appendRow(eltsItem);
3255 eltsIndex = eltsItem->index();
3260 QModelIndex DocumentModel::makeSpherical( const QModelIndex& iv, const QModelIndex& ivec, int nb, double k)
3264 // HEXA_NS::Vertex* hv = getHexaPtr<HEXA_NS::Vertex*>(iv);
3265 // HEXA_NS::Vector* hvec = getHexaPtr<HEXA_NS::Vector*>(ivec);
3267 // HEXA_NS::Elements* hElts = _hexaDocument->makeSpherical( hv, hvec, nb, k ); // OBSOLETE
3268 // HEXA_NS::Elements* hElts = NULL;
3269 // if ( BadElement(hElts) ) return iElts;
3271 // updateData(); //CS_TODO more or less?
3272 // ElementsItem* elts = new ElementsItem(hElts);
3273 // _elementsDirItem->appendRow(elts);
3274 // iElts = elts->index();
3279 QModelIndex DocumentModel::makeSpherical( const QModelIndex& icenter, double radius, int nb, double k )
3283 HEXA_NS::Vertex* hcenter = getHexaPtr<HEXA_NS::Vertex*>(icenter);
3285 HEXA_NS::Elements* helts = _hexaDocument->makeSpherical( hcenter, radius, nb, k );
3286 if ( BadElement(helts) ) return iElts;
3288 updateData(); //CS_TODO more or less?
3289 ElementsItem* eltsItem = new ElementsItem(helts);
3290 _elementsDirItem->appendRow(eltsItem);
3291 iElts = eltsItem->index();
3296 QModelIndex DocumentModel::makeCylinder( const QModelIndex& icyl, const QModelIndex& ivec,
3297 int nr, int na, int nl )
3301 HEXA_NS::Cylinder* hcyl = getHexaPtr<HEXA_NS::Cylinder*>(icyl);
3302 HEXA_NS::Vector* hvec = getHexaPtr<HEXA_NS::Vector*>(ivec);
3304 HEXA_NS::Elements* hElts = _hexaDocument->makeCylinder( hcyl, hvec, nr, na, nl );
3305 if ( BadElement(hElts) ) return iElts;
3307 updateData(); //CS_TODO more or less?
3308 ElementsItem* elts = new ElementsItem(hElts);
3309 _elementsDirItem->appendRow(elts);
3310 iElts = elts->index();
3315 QModelIndex DocumentModel::makeCylinders(const QModelIndex& icyl1, const QModelIndex& icyl2)
3317 QModelIndex iCrossElts;
3319 HEXA_NS::Cylinder* hCyl1 = getHexaPtr<HEXA_NS::Cylinder*>(icyl1);
3320 HEXA_NS::Cylinder* hCyl2 = getHexaPtr<HEXA_NS::Cylinder*>(icyl2);
3322 HEXA_NS::CrossElements* hCrossElts = _hexaDocument->makeCylinders( hCyl1, hCyl2 );
3323 if ( BadElement(hCrossElts) ) return iCrossElts;
3325 updateData(); //CS_TODO more or less?
3326 ElementsItem* crossElts = new ElementsItem(hCrossElts);
3327 _crossElementsDirItem->appendRow(crossElts);
3328 iCrossElts = crossElts->index();
3333 QModelIndex DocumentModel::addEdgeVector( const QModelIndex &i_v, const QModelIndex &i_vec )
3335 QModelIndex edgeIndex;
3337 HEXA_NS::Vertex* hv = getHexaPtr<HEXA_NS::Vertex*>(i_v);
3338 HEXA_NS::Vector* hvec = getHexaPtr<HEXA_NS::Vector*>(i_vec);
3340 if (!hv || !hvec) return edgeIndex;
3342 // HEXA_NS::Edge* he = _hexaDocument->addEdge( hv, hvec ); //OBSOLETE
3343 HEXA_NS::Edge* he = NULL;
3344 if ( BadElement(he) ) return edgeIndex;
3346 HEXA_NS::Vertex* hv2 = he->getAval(); //the new vertex resulting from the creation of the edge
3347 if (hv2 == NULL) return edgeIndex;
3349 //ADD the elements in the treeview
3351 EdgeItem* e = new EdgeItem(he, _entry);
3352 _edgeDirItem->appendRow(e);
3354 //The resulting Vertex
3355 VertexItem* v = new VertexItem(hv2, _entry);
3356 _vertexDirItem->appendRow(v);
3357 edgeIndex = e->index();
3358 emit patternDataChanged();
3363 QModelIndex DocumentModel::addCylinder( const QModelIndex &iv, const QModelIndex &ivec, double r, double h )
3367 HEXA_NS::Vertex* hv = getHexaPtr<HEXA_NS::Vertex*>(iv);
3368 HEXA_NS::Vector* hvec = getHexaPtr<HEXA_NS::Vector*>(ivec);
3370 HEXA_NS::Cylinder* hcyl = _hexaDocument->addCylinder( hv, hvec, r, h );
3371 if ( BadElement(hcyl) ) return iCyl;
3373 CylinderItem* cyl = new CylinderItem(hcyl);
3374 _cylinderDirItem->appendRow(cyl);
3375 iCyl = cyl->index();
3381 QModelIndex DocumentModel::addPipe( const QModelIndex &iv, const QModelIndex &ivec, double ri, double re, double h )
3385 HEXA_NS::Vertex* hv = getHexaPtr<HEXA_NS::Vertex*>(iv);
3386 HEXA_NS::Vector* hvec = getHexaPtr<HEXA_NS::Vector*>(ivec);
3388 HEXA_NS::Pipe* hPipe = _hexaDocument->addPipe( hv, hvec, ri, re, h );
3389 if ( BadElement(hPipe) ) return iPipe;
3391 PipeItem* pipe = new PipeItem(hPipe);
3392 _pipeDirItem->appendRow(pipe);
3393 iPipe = pipe->index();
3398 QModelIndex DocumentModel::makePipe( const QModelIndex& ipipe, const QModelIndex& ivecx,
3399 int nr, int na, int nl )
3403 HEXA_NS::Pipe* hPipe = getHexaPtr<HEXA_NS::Pipe*>(ipipe);
3404 HEXA_NS::Vector* hVecx = getHexaPtr<HEXA_NS::Vector*>(ivecx);
3406 HEXA_NS::Elements* hElts = _hexaDocument->makePipe( hPipe, hVecx, nr, na, nl );
3407 if ( BadElement(hElts) ) return iElts;
3409 updateData(); //CS_TODO more or less?
3410 ElementsItem* elts = new ElementsItem(hElts);
3411 _elementsDirItem->appendRow(elts);
3412 iElts = elts->index();
3418 QModelIndex DocumentModel::makePipes( const QModelIndex& ipipe1, const QModelIndex& ipipe2 )
3420 QModelIndex iCrossElts;
3422 HEXA_NS::Pipe* hPipe1 = getHexaPtr<HEXA_NS::Pipe*>(ipipe1);
3423 HEXA_NS::Pipe* hPipe2 = getHexaPtr<HEXA_NS::Pipe*>(ipipe2);
3425 HEXA_NS::CrossElements* hCrossElts = _hexaDocument->makePipes( hPipe1, hPipe2 );
3426 if ( BadElement(hCrossElts) ) return iCrossElts;
3428 updateData(); //CS_TODO more or less?
3429 ElementsItem* crossElts = new ElementsItem(hCrossElts);
3430 _crossElementsDirItem->appendRow(crossElts);
3431 iCrossElts = crossElts->index();
3436 QModelIndex DocumentModel::makeRind( const QModelIndex& icenter,
3437 const QModelIndex& ivecx, const QModelIndex& ivecz,
3438 double radext, double radint, double radhole,
3439 const QModelIndex& iplorig,
3440 int nrad, int nang, int nhaut )
3444 HEXA_NS::Vertex* hcenter = getHexaPtr<HEXA_NS::Vertex*>(icenter);
3445 HEXA_NS::Vector* hvecx = getHexaPtr<HEXA_NS::Vector*>(ivecx);
3446 HEXA_NS::Vector* hvecz = getHexaPtr<HEXA_NS::Vector*>(ivecz);
3447 HEXA_NS::Vertex* hplorig = getHexaPtr<HEXA_NS::Vertex*>(iplorig);
3449 HEXA_NS::Elements* hElts = _hexaDocument->makeRind( hcenter,
3451 radext, radint, radhole,
3453 nrad, nang, nhaut );
3454 if ( BadElement(hElts) ) return iElts;
3456 updateData(); //CS_TODO more or less?
3457 ElementsItem* eltsItem = new ElementsItem(hElts);
3458 _elementsDirItem->appendRow(eltsItem);
3459 iElts = eltsItem->index();
3464 QModelIndex DocumentModel::makePartRind( const QModelIndex& icenter,
3465 const QModelIndex& ivecx, const QModelIndex& ivecz,
3466 double radext, double radint, double radhole,
3467 const QModelIndex& iplorig, double angle,
3468 int nrad, int nang, int nhaut )
3472 HEXA_NS::Vertex* hcenter = getHexaPtr<HEXA_NS::Vertex*>(icenter);
3473 HEXA_NS::Vector* hvecx = getHexaPtr<HEXA_NS::Vector*>(ivecx);
3474 HEXA_NS::Vector* hvecz = getHexaPtr<HEXA_NS::Vector*>(ivecz);
3475 HEXA_NS::Vertex* hplorig = getHexaPtr<HEXA_NS::Vertex*>(iplorig);
3477 HEXA_NS::Elements* hElts = _hexaDocument->makePartRind( hcenter,
3479 radext, radint, radhole,
3481 nrad, nang, nhaut );
3482 if ( BadElement(hElts) ) return iElts;
3485 ElementsItem* eltsItem = new ElementsItem(hElts);
3486 _elementsDirItem->appendRow(eltsItem);
3487 iElts = eltsItem->index();
3492 QModelIndex DocumentModel::makeSphere( const QModelIndex& icenter,
3493 const QModelIndex& ivecx, const QModelIndex& ivecz,
3494 double radius, double radhole,
3495 const QModelIndex& iplorig,
3496 int nrad, int nang, int nhaut )
3500 HEXA_NS::Vertex* hcenter = getHexaPtr<HEXA_NS::Vertex*>(icenter);
3501 HEXA_NS::Vector* hvecx = getHexaPtr<HEXA_NS::Vector*>(ivecx);
3502 HEXA_NS::Vector* hvecz = getHexaPtr<HEXA_NS::Vector*>(ivecz);
3503 HEXA_NS::Vertex* hplorig = getHexaPtr<HEXA_NS::Vertex*>(iplorig);
3505 HEXA_NS::Elements* hElts = _hexaDocument->makeSphere( hcenter,
3510 if ( BadElement(hElts) ) return iElts;
3513 ElementsItem* eltsItem = new ElementsItem(hElts);
3514 _elementsDirItem->appendRow(eltsItem);
3515 iElts = eltsItem->index();
3520 QModelIndex DocumentModel::makePartSphere( const QModelIndex& icenter,
3521 const QModelIndex& ivecx, const QModelIndex& ivecz,
3522 double radius, double radhole,
3523 const QModelIndex& iplorig, double angle,
3524 int nrad, int nang, int nhaut )
3528 HEXA_NS::Vertex* hcenter = getHexaPtr<HEXA_NS::Vertex*>(icenter);
3529 HEXA_NS::Vector* hvecx = getHexaPtr<HEXA_NS::Vector*>(ivecx);
3530 HEXA_NS::Vector* hvecz = getHexaPtr<HEXA_NS::Vector*>(ivecz);
3531 HEXA_NS::Vertex* hplorig = getHexaPtr<HEXA_NS::Vertex*>(iplorig);
3533 HEXA_NS::Elements* hElts = _hexaDocument->makePartSphere( hcenter,
3538 if ( BadElement(hElts) ) return iElts;
3541 ElementsItem* eltsItem = new ElementsItem(hElts);
3542 _elementsDirItem->appendRow(eltsItem);
3543 iElts = eltsItem->index();
3548 QModelIndex DocumentModel::prismQuad( const QModelIndex& iquad, const QModelIndex& ivec, int nb)
3552 HEXA_NS::Quad* hQuad = getHexaPtr<HEXA_NS::Quad*>(iquad);
3553 HEXA_NS::Vector* hVect = getHexaPtr<HEXA_NS::Vector*>(ivec);
3555 HEXA_NS::Elements* hElts = _hexaDocument->prismQuad( hQuad, hVect, nb );
3556 if ( BadElement(hElts) ) return iElts;
3558 updateData(); //CS_TODO more or less?
3559 ElementsItem* elts = new ElementsItem(hElts);
3560 _elementsDirItem->appendRow(elts);
3561 iElts = elts->index();
3566 QModelIndex DocumentModel::prismQuads( const QModelIndexList& iquads, const QModelIndex& ivec, int nb)
3570 HEXA_NS::Quads hQuads;
3571 HEXA_NS::Quad* hQuad = NULL;
3572 foreach( const QModelIndex& iquad, iquads ){
3573 hQuad = getHexaPtr<HEXA_NS::Quad*>(iquad);
3574 hQuads.push_back( hQuad );
3576 HEXA_NS::Vector* hVect = getHexaPtr<HEXA_NS::Vector*>(ivec);
3578 HEXA_NS::Elements* hElts = _hexaDocument->prismQuads( hQuads, hVect, nb );
3579 if ( BadElement(hElts) ) return iElts;
3581 updateData(); //CS_TODO more or less?
3582 ElementsItem* elts = new ElementsItem(hElts);
3583 _elementsDirItem->appendRow(elts);
3584 iElts = elts->index();
3589 QModelIndex DocumentModel::prismQuads( const QModelIndexList& iquads, const QModelIndex& ivec, std::vector<double> layersSize, int nb)
3593 HEXA_NS::Quads hQuads;
3594 HEXA_NS::Quad* hQuad = NULL;
3595 foreach( const QModelIndex& iquad, iquads ){
3596 hQuad = getHexaPtr<HEXA_NS::Quad*>(iquad);
3597 hQuads.push_back( hQuad );
3599 HEXA_NS::Vector* hVect = getHexaPtr<HEXA_NS::Vector*>(ivec);
3601 HEXA_NS::Elements* hElts = _hexaDocument->prismQuadsVec( hQuads, hVect, layersSize, nb );
3602 if ( BadElement(hElts) ) return iElts;
3604 updateData(); //CS_TODO more or less?
3605 ElementsItem* elts = new ElementsItem(hElts);
3606 _elementsDirItem->appendRow(elts);
3607 iElts = elts->index();
3613 QModelIndex DocumentModel::joinQuad(
3614 const QModelIndex& iquadstart, const QModelIndex& iquaddest,
3615 const QModelIndex& iv0, const QModelIndex& iv1,
3616 const QModelIndex& iv2, const QModelIndex& iv3,
3621 HEXA_NS::Quad* hQuadStart = getHexaPtr<HEXA_NS::Quad*>(iquadstart);
3622 HEXA_NS::Quad* hQuadDest = getHexaPtr<HEXA_NS::Quad*>(iquaddest);
3624 HEXA_NS::Vertex* hVertex0 = getHexaPtr<HEXA_NS::Vertex*>(iv0);
3625 HEXA_NS::Vertex* hVertex1 = getHexaPtr<HEXA_NS::Vertex*>(iv1);
3626 HEXA_NS::Vertex* hVertex2 = getHexaPtr<HEXA_NS::Vertex*>(iv2);
3627 HEXA_NS::Vertex* hVertex3 = getHexaPtr<HEXA_NS::Vertex*>(iv3);
3629 HEXA_NS::Elements* hElts = _hexaDocument->joinQuad( hQuadStart, hQuadDest,
3630 hVertex0, hVertex1, hVertex2, hVertex3, nb );
3631 if ( BadElement(hElts) ) return iElts;
3633 updateData(); //CS_TODO more or less?
3634 ElementsItem* elts = new ElementsItem(hElts);
3635 _elementsDirItem->appendRow(elts);
3636 iElts = elts->index();
3641 QModelIndex DocumentModel::joinQuads(
3642 const QModelIndexList& iquadsstart, const QModelIndex& iquaddest,
3643 const QModelIndex& iv0, const QModelIndex& iv1,
3644 const QModelIndex& iv2, const QModelIndex& iv3,
3649 HEXA_NS::Quad* hQuadStart;
3650 HEXA_NS::Quads hQuadsStart;
3652 foreach( const QModelIndex& iquad, iquadsstart ){
3653 hQuadStart = data( iquad, HEXA_DATA_ROLE ).value<HEXA_NS::Quad *>();
3654 hQuadsStart.push_back( hQuadStart );
3656 HEXA_NS::Quad* hQuadDest = data( iquaddest, HEXA_DATA_ROLE ).value<HEXA_NS::Quad *>();
3658 HEXA_NS::Vertex* hVertex0 = getHexaPtr<HEXA_NS::Vertex*>(iv0);
3659 HEXA_NS::Vertex* hVertex1 = getHexaPtr<HEXA_NS::Vertex*>(iv1);
3660 HEXA_NS::Vertex* hVertex2 = getHexaPtr<HEXA_NS::Vertex*>(iv2);
3661 HEXA_NS::Vertex* hVertex3 = getHexaPtr<HEXA_NS::Vertex*>(iv3);
3663 HEXA_NS::Elements* hElts = _hexaDocument->joinQuads(
3664 hQuadsStart, hQuadDest,
3665 hVertex0, hVertex1, hVertex2, hVertex3,
3667 if ( BadElement(hElts) ) return iElts;
3669 updateData(); //CS_TODO more or less?
3670 ElementsItem* elts = new ElementsItem(hElts);
3671 _elementsDirItem->appendRow(elts);
3672 iElts = elts->index();
3677 QModelIndex DocumentModel::cutEdge( const QModelIndex &i_e0, int nbcuts )
3678 //CS_TODO : impact sur le model?
3682 HEXA_NS::Edge* he0 = getHexaPtr<HEXA_NS::Edge*>(i_e0);
3683 HEXA_NS::Elements* helts = _hexaDocument->cut( he0, nbcuts );
3685 if ( BadElement(helts) ) return iElts;
3687 updateData(); //CS_TODO more?
3688 ElementsItem* elts = new ElementsItem(helts);
3689 _elementsDirItem->appendRow(elts);
3690 iElts = elts->index();
3695 // ===================================== END OBSOLETE ==========================================