Salome HOME
more orthography
[modules/smesh.git] / src / SMESHGUI / SMESHGUI_MultiEditDlg.cxx
index c4fabd9f825801dfd5efea92e32c058831ad7c3c..bf0074babdea4173a4ac79fc4e46d9ea922d0fdc 100755 (executable)
@@ -1,4 +1,4 @@
-// Copyright (C) 2007-2012  CEA/DEN, EDF R&D, OPEN CASCADE
+// Copyright (C) 2007-2013  CEA/DEN, EDF R&D, OPEN CASCADE
 //
 // Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
 // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
@@ -34,6 +34,7 @@
 #include "SMESHGUI_MeshUtils.h"
 #include "SMESHGUI_FilterUtils.h"
 #include "SMESHGUI_SpinBox.h"
+#include "SMESHGUI_MeshEditPreview.h"
 
 #include <SMESH_Actor.h>
 #include <SMESH_TypeFilter.hxx>
@@ -105,7 +106,7 @@ SMESHGUI_MultiEditDlg
 ::SMESHGUI_MultiEditDlg(SMESHGUI* theModule,
                         const int theMode,
                         const bool the3d2d):
-  QDialog(SMESH::GetDesktop(theModule)),
+  SMESHGUI_PreviewDlg(theModule),
   mySelector(SMESH::GetViewWindow(theModule)->GetSelector()),
   mySelectionMgr(SMESH::GetSelectionMgr(theModule)),
   mySMESHGUI(theModule)
@@ -439,65 +440,6 @@ SMESH::long_array_var SMESHGUI_MultiEditDlg::getIds(SMESH::SMESH_IDSource_var& o
   {
     myIds.Clear();
     obj = SMESH::SMESH_IDSource::_narrow( myMesh );
-//     SMESH_Actor * anActor = SMESH::FindActorByObject(myMesh);
-//     if (!anActor)
-//       anActor = myActor;
-//     if (anActor != 0)
-//     {
-//       // skl 07.02.2006
-//       SMDS_Mesh* aMesh = myActor->GetObject()->GetMesh();
-//       if( myFilterType == SMESH::TriaFilter || 
-//           myFilterType == SMESH::QuadFilter ||
-//           myFilterType == SMESH::FaceFilter ) {
-//         SMDS_FaceIteratorPtr it = aMesh->facesIterator();
-//         while(it->more()) {
-//           const SMDS_MeshFace* f = it->next();
-//           if(myFilterType == SMESH::FaceFilter) {
-//             myIds.Add(f->GetID());
-//           }
-//           else if( myFilterType==SMESH::TriaFilter &&
-//                    ( f->NbNodes()==3 || f->NbNodes()==6 ) ) {
-//             myIds.Add(f->GetID());
-//           }
-//           else if( myFilterType==SMESH::QuadFilter &&
-//                    ( f->NbNodes()==4 || f->NbNodes()==8 ) ) {
-//             myIds.Add(f->GetID());
-//           }
-//         }
-//       }
-//       else if(myFilterType == SMESH::VolumeFilter) {
-//         SMDS_VolumeIteratorPtr it = aMesh->volumesIterator();
-//         while(it->more()) {
-//           const SMDS_MeshVolume* f = it->next();
-//           myIds.Add(f->GetID());
-//         }
-//       }
-      /* commented by skl 07.02.2006 - to work with quadratic elements
-      TVisualObjPtr aVisualObj = anActor->GetObject();
-      vtkUnstructuredGrid* aGrid = aVisualObj->GetUnstructuredGrid();
-      if (aGrid != 0) {
-        for (int i = 0, n = aGrid->GetNumberOfCells(); i < n; i++) {
-          vtkCell* aCell = aGrid->GetCell(i);
-          if (aCell != 0) {
-            vtkTriangle* aTri = vtkTriangle::SafeDownCast(aCell);
-            vtkQuad*     aQua = vtkQuad::SafeDownCast(aCell);
-            vtkPolygon*  aPG  = vtkPolygon::SafeDownCast(aCell);
-
-            vtkCell3D*   a3d  = vtkCell3D::SafeDownCast(aCell);
-            vtkConvexPointSet* aPH = vtkConvexPointSet::SafeDownCast(aCell);
-
-            if (aTri && myFilterType == SMESHGUI_TriaFilter ||
-                aQua && myFilterType == SMESHGUI_QuadFilter ||
-                (aTri || aQua || aPG) && myFilterType == SMESHGUI_FaceFilter ||
-                (a3d || aPH) && myFilterType == SMESHGUI_VolumeFilter) {
-              int anObjId = aVisualObj->GetElemObjId(i);
-              myIds.Add(anObjId);
-            }
-          }
-        }
-      }
-      */
-    //}
   }
 
   anIds->length(myIds.Extent());
@@ -607,7 +549,9 @@ void SMESHGUI_MultiEditDlg::onSelectionDone()
           anItem->setSelected(true);
       }
     }
-    myMesh = SMESH::GetMeshByIO(anIO);
+    SMESH::SMESH_Mesh_var aSelMesh = SMESH::GetMeshByIO(anIO);
+    if (!aSelMesh->_is_nil())
+      myMesh = aSelMesh;
   }
 
   if (nbSel > 0) {
@@ -662,7 +606,7 @@ void SMESHGUI_MultiEditDlg::onFilterBtn()
 
   myFilterDlg->SetSelection();
   myFilterDlg->SetMesh(myMesh);
-  myFilterDlg->SetSourceWg(myListBox);
+  myFilterDlg->SetSourceWg(myListBox, false);
 
   myFilterDlg->show();
 }
@@ -976,7 +920,7 @@ void SMESHGUI_MultiEditDlg::setSelectionMode()
 {
   SMESH::RemoveFilters();
 
-  mySelectionMgr->clearSelected();
+  //  mySelectionMgr->clearSelected();
   mySelectionMgr->clearFilters();
 
   if (mySubmeshChk->isChecked()) {
@@ -1137,6 +1081,11 @@ SMESHGUI_UnionOfTrianglesDlg
 {
   setWindowTitle(tr("CAPTION"));
 
+  //Preview check box
+  myPreviewCheckBox = new QCheckBox(tr("PREVIEW"), mySelGrp);
+  QGridLayout* aLay = (QGridLayout*)(mySelGrp->layout());
+  aLay->addWidget(myPreviewCheckBox, aLay->rowCount(), 0, 1, aLay->columnCount());
+
   myComboBoxFunctor->setEnabled(true);  
   myComboBoxFunctor->addItem(tr("AREA_ELEMENTS"));
   myComboBoxFunctor->addItem(tr("WARP_ELEMENTS")); // for quadrangles only
@@ -1159,6 +1108,14 @@ SMESHGUI_UnionOfTrianglesDlg
   ((QVBoxLayout*)(myCriterionGrp->layout()))->addWidget(aMaxAngleGrp);
   myCriterionGrp->show();
 
+  connect(myComboBoxFunctor, SIGNAL(activated(int)),       this, SLOT(toDisplaySimulation()));
+  connect(myMaxAngleSpin,    SIGNAL(valueChanged(int)),    this, SLOT(toDisplaySimulation()));
+  connect(this,              SIGNAL(ListContensChanged()), this, SLOT(toDisplaySimulation()));
+  connectPreviewControl(); //To Connect preview check box
+
+  myPreviewCheckBox->setChecked(false);
+  onDisplaySimulation(false);
+
   myHelpFileName = "uniting_set_of_triangles_page.html";
 }
 
@@ -1205,7 +1162,47 @@ bool SMESHGUI_UnionOfTrianglesDlg::process (SMESH::SMESH_MeshEditor_ptr theEdito
     ok = theEditor->TriToQuadObject(obj, aCriterion, aMaxAngle);
   return ok;
 }
-
+  
+void SMESHGUI_UnionOfTrianglesDlg::onDisplaySimulation( bool toDisplayPreview )
+{
+  if ( myPreviewCheckBox->isChecked() && toDisplayPreview ) {
+    if ( isValid( true ) ) {
+      try{
+       SUIT_OverrideCursor aWaitCursor;
+       // get Ids of elements
+       SMESH::SMESH_IDSource_var obj;
+       SMESH::long_array_var anElemIds = getIds( obj );
+
+       SMESH::NumericalFunctor_var aCriterion  = getNumericalFunctor();
+       SMESH::SMESH_MeshEditor_var aMeshEditor = myMesh->GetMeshEditPreviewer();
+
+       double aMaxAngle = myMaxAngleSpin->GetValue() * M_PI / 180.0;
+      
+       if ( CORBA::is_nil( obj ) )
+         aMeshEditor->TriToQuad( anElemIds.inout(), aCriterion, aMaxAngle );
+       else
+         aMeshEditor->TriToQuadObject( obj, aCriterion, aMaxAngle );
+      
+       SMESH::MeshPreviewStruct_var aMeshPreviewStruct = aMeshEditor->GetPreviewData();
+
+       vtkProperty* aProp = vtkProperty::New();
+       aProp->SetRepresentationToWireframe();
+       aProp->SetColor( 250, 0, 250 );
+       aProp->SetLineWidth( SMESH::GetFloat( "SMESH:element_width", 1 ) + 3 );
+       mySimulation->GetActor()->SetProperty( aProp );
+       aProp->Delete();
+
+       mySimulation->SetData( aMeshPreviewStruct._retn() );
+      } catch ( ... ) {
+       hidePreview();
+      }
+    } else {
+      hidePreview();
+    }
+  } else {
+    hidePreview();
+  }
+}
 
 /*!
  *  Class       : SMESHGUI_CuttingOfQuadsDlg
@@ -1223,6 +1220,14 @@ SMESHGUI_CuttingOfQuadsDlg
   QGridLayout* aLay = (QGridLayout*)(mySelGrp->layout());
   aLay->addWidget(myPreviewChk, aLay->rowCount(), 0, 1, aLay->columnCount());
 
+  // "split to 4 tria" option
+
+  QRadioButton* to4TriaRB = new QRadioButton(tr("TO_4_TRIA"), myChoiceWidget);
+  ((QVBoxLayout*)(myCriterionGrp->layout()))->insertWidget(0, to4TriaRB);
+  myGroupChoice->addButton(to4TriaRB, 3);
+  to4TriaRB->setChecked(true);
+  onCriterionRB();
+
   myCriterionGrp->show();
   myChoiceWidget->show();
   myComboBoxFunctor->insertItem(0, tr("MIN_DIAG_ELEMENTS"));
@@ -1257,6 +1262,14 @@ bool SMESHGUI_CuttingOfQuadsDlg::process (SMESH::SMESH_MeshEditor_ptr theEditor,
     return hasObj ? theEditor->SplitQuadObject(obj, true) : theEditor->SplitQuad(theIds, true);
   case 1: // use diagonal 2-4
     return hasObj ? theEditor->SplitQuadObject(obj, false) : theEditor->SplitQuad(theIds, false);
+  case 3: // split to 4 tria
+    {
+      if ( hasObj )
+        return theEditor->QuadTo4Tri( obj ), true;
+      SMESH::SMESH_IDSource_wrap elems = theEditor->MakeIDSource( theIds, SMESH::FACE );
+      theEditor->QuadTo4Tri( elems );
+      return true;
+    }
   default: // use numeric functor
     break;
   }
@@ -1272,6 +1285,16 @@ void SMESHGUI_CuttingOfQuadsDlg::onCriterionRB()
   else
     myComboBoxFunctor->setEnabled(false);
 
+  if (myGroupChoice->checkedId() == 3) // To 4 tria
+  {
+    if ( myPreviewChk->isChecked() )
+      myPreviewChk->setChecked( false );
+    myPreviewChk->setEnabled( false );
+  }
+  else
+  {
+    myPreviewChk->setEnabled( true );
+  }
   onPreviewChk();
 }
 
@@ -1301,6 +1324,7 @@ void SMESHGUI_CuttingOfQuadsDlg::displayPreview()
   if (myPreviewActor != 0)
     erasePreview();
 
+  SUIT_OverrideCursor aWaitCursor;
   // get Ids of elements
   SMESH::SMESH_IDSource_var obj;
   SMESH::long_array_var anElemIds = getIds(obj);
@@ -1322,6 +1346,10 @@ void SMESHGUI_CuttingOfQuadsDlg::displayPreview()
       return;
   }
 
+  if ( anElemIds->length() == 0 ) {
+    anElemIds = obj->GetIDs();
+  }
+
   //Create grid
   vtkUnstructuredGrid* aGrid = vtkUnstructuredGrid::New();
 
@@ -1497,9 +1525,11 @@ bool SMESHGUI_CuttingIntoTetraDlg::process (SMESH::SMESH_MeshEditor_ptr theEdito
                                             const SMESH::long_array&    theIds,
                                             SMESH::SMESH_IDSource_ptr   theObj)
 {
-  SMESH::SMESH_IDSource_var obj = theObj;
+  SMESH::SMESH_IDSource_wrap obj = theObj;
   if ( CORBA::is_nil( obj ))
     obj = theEditor->MakeIDSource( theIds, myEntityType ? SMESH::VOLUME : SMESH::FACE );
+  else
+    obj->Register();
   try {
     theEditor->SplitVolumesIntoTetra( obj, myGroupChoice->checkedId()+1 );
   }
@@ -1507,5 +1537,8 @@ bool SMESHGUI_CuttingIntoTetraDlg::process (SMESH::SMESH_MeshEditor_ptr theEdito
     SalomeApp_Tools::QtCatchCorbaException( S_ex );
     return false;
   }
+  catch(...) {
+    return false;
+  }
   return true;
 }