Salome HOME
Join modifications from branch OCC_development_for_3_2_0a2
[modules/visu.git] / src / VISUGUI / VisuGUI_CutLinesDlg.cxx
index 2153506b55db1465c3c1b612725a0fddbdd975a6..545e8c8168e9512dcde831a3e6afd821baf99495 100644 (file)
 
 #include "VisuGUI.h"
 #include "VisuGUI_Tools.h"
+#include "VisuGUI_ViewTools.h"
 
 #include "VISU_Gen_i.hh"
 #include "VISU_CutLines_i.hh"
 
 #include "VISU_PipeLine.hxx"
+#include "VISU_PipeLineUtils.hxx"
 #include "VISU_CutLinesPL.hxx"
 
 #include "SVTK_ViewWindow.h"
 #include <vtkPolyData.h>
 #include <vtkAppendPolyData.h>
 #include <vtkDataSetMapper.h>
+#include <vtkGlyph3D.h>
+#include <vtkPolyDataMapper.h>
+#include <vtkFloatArray.h>
+#include <vtkGlyphSource2D.h>
 
 using namespace std;
 
@@ -46,7 +52,7 @@ bool VisuGUI_CutLinesDlg::MYGenerateCurve = true;
 VisuGUI_CutLinesDlg::VisuGUI_CutLinesDlg (SalomeApp_Module* theModule)
      : QDialog(VISU::GetDesktop(theModule), "VisuGUI_CutLinesDlg", false,
                WStyle_Customize | WStyle_NormalBorder | WStyle_Title | WStyle_SysMenu),
-       myPreviewActor(0)
+       myPreviewActor(0),myPreviewActorGlyphs(0)
 {
   setCaption("Cut Lines Definition");
   setSizeGripEnabled(true);
@@ -70,6 +76,8 @@ VisuGUI_CutLinesDlg::VisuGUI_CutLinesDlg (SalomeApp_Module* theModule)
   QRadioButton* aBxy = new QRadioButton( tr( "PARALLEL_XOY" ), mySelPlane);  // 0
   QRadioButton* aByz = new QRadioButton( tr( "PARALLEL_YOZ" ), mySelPlane);  // 1
   QRadioButton* aBzx = new QRadioButton( tr( "PARALLEL_ZOX" ), mySelPlane);  // 2
+  aBxy->setChecked(false);
+  aByz->setChecked(false);
   aBzx->setChecked(true);
 
   aPlaneLayout->addWidget( mySelPlane );
@@ -98,7 +106,7 @@ VisuGUI_CutLinesDlg::VisuGUI_CutLinesDlg (SalomeApp_Module* theModule)
 
   QHBox* aPosBox = new QHBox (aPlanePane);
   aPosBox->setSpacing(5);
-  QLabel* aPosLbl = new QLabel (tr("LBL_POS"), aPosBox);
+  new QLabel (tr("LBL_POS"), aPosBox);
   myPosSpn = new QtxDblSpinBox (0, 1, 0.1, aPosBox);
   myPosSpn->setValue(0.5);
   aPlaneLayout->addWidget(aPosBox);
@@ -107,6 +115,10 @@ VisuGUI_CutLinesDlg::VisuGUI_CutLinesDlg (SalomeApp_Module* theModule)
   myPreviewCheck->setChecked(false);
   aPlaneLayout->addWidget(myPreviewCheck);
 
+  myAllCurvesInvertedCheck = new QCheckBox(tr("LBL_INVERT_CURVES"), aPlanePane);
+  myAllCurvesInvertedCheck->setChecked(false);
+  aPlaneLayout->addWidget(myAllCurvesInvertedCheck);
+
   myCreateTable = new QCheckBox (tr("LBL_GENERATE_TABLE"), aPlanePane);
   myCreateTable->setChecked(MYGenerateTable);
   aPlaneLayout->addWidget( myCreateTable );
@@ -155,7 +167,7 @@ VisuGUI_CutLinesDlg::VisuGUI_CutLinesDlg (SalomeApp_Module* theModule)
 
   QHBox* aNbBox = new QHBox(aLinesPane);
   aNbBox->setSpacing(5);
-  QLabel* aNbLbl = new QLabel( tr( "LBL_NB_PLANS" ), aNbBox );
+  new QLabel( tr( "LBL_NB_PLANS" ), aNbBox );
   myNbSpn = new QtxDblSpinBox( 1, 100, 1, aNbBox );
   myNbSpn->setValue( 10 );
 
@@ -175,7 +187,7 @@ VisuGUI_CutLinesDlg::VisuGUI_CutLinesDlg (SalomeApp_Module* theModule)
 
   QHBox* aPosBox2 = new QHBox(aLinesPane);
   aPosBox2->setSpacing(5);
-  QLabel* aPosLbl2 = new QLabel( tr( "LBL_POS" ), aPosBox2 );
+  new QLabel( tr( "LBL_POS" ), aPosBox2 );
   myPosSpn2 = new QtxDblSpinBox( 0, 1, 0.1, aPosBox2 );
   myPosSpn2->setValue( 0.5 );
   aLinesLayout->addWidget( aPosBox2 );
@@ -221,6 +233,7 @@ VisuGUI_CutLinesDlg::VisuGUI_CutLinesDlg (SalomeApp_Module* theModule)
   connect(th            , SIGNAL(clicked(int))          , this, SLOT(setDefault(int)));
   connect(myPosSpn2     , SIGNAL(valueChanged(double))  , this, SLOT(DrawTable()));
   connect(myPreviewCheck, SIGNAL(toggled(bool))         , this, SLOT(onPreviewCheck(bool)));
+  connect(myAllCurvesInvertedCheck, SIGNAL(toggled(bool)),this, SLOT(onAllCurvesInvertedCheck(bool)));
   connect(myPosTable    , SIGNAL(valueChanged(int, int)), this, SLOT(onValueChanged(int, int)));
   connect(myRotXSpn     , SIGNAL(valueChanged(double))  , this, SLOT(onRotation(double)));
   connect(myRotYSpn     , SIGNAL(valueChanged(double))  , this, SLOT(onRotation(double)));
@@ -246,7 +259,7 @@ VisuGUI_CutLinesDlg::~VisuGUI_CutLinesDlg()
   deletePlanes();
   if (myCutLines) //delete myCutLines;
     myCutLines->Destroy();
-  if (SVTK_ViewWindow* vf = VISU::GetViewWindow())
+  if (SVTK_ViewWindow* vf = VISU::GetActiveViewWindow<SVTK_ViewWindow>())
     vf->Repaint();
 }
 
@@ -270,6 +283,8 @@ void VisuGUI_CutLinesDlg::initFromPrsObject (VISU::CutLines_i* thePrs)
   hasInit = true;
   myCutLines = new VISU::CutLines_i(thePrs->GetResult(),false);
   myCutLines->SameAs(thePrs);
+  myCutLines->CopyCurvesInverted(thePrs->GetCurvesInverted());
+  if (myCutLines->IsAllCurvesInverted()) myAllCurvesInvertedCheck->setChecked(true);
   myBasePlanePos->setText( QString::number(myCutLines->GetBasePlanePosition()) );
   myCBSetDef->setChecked(thePrs->IsDefault());
   DrawTable();
@@ -305,13 +320,15 @@ int VisuGUI_CutLinesDlg::storeToPrsObject (VISU::CutLines_i* thePrs)
       thePrs->SetLinePosition( i, myPosTable->text( i, 0 ).toDouble() );
     else thePrs->SetDefaultPosition(i);
   }
+  if (myAllCurvesInvertedCheck->isChecked())
+    thePrs->SetAllCurvesInverted(true);
   return 1;
 }
 
 //------------------------------------------------------------------------------
 void VisuGUI_CutLinesDlg::createPlanes()
 {
-  SVTK_ViewWindow* aView = VISU::GetViewWindow();
+  SVTK_ViewWindow* aView = VISU::GetActiveViewWindow<SVTK_ViewWindow>();
   if (aView == NULL) return;
   if (myCutLines == NULL) return;
   if (myPreviewActor != 0) return;
@@ -322,12 +339,17 @@ void VisuGUI_CutLinesDlg::createPlanes()
   vtkDataSetMapper* aPlaneMapper = vtkDataSetMapper::New();
   aPlaneMapper->SetInput(aPolyData->GetOutput());
   aPlaneMapper->ScalarVisibilityOff();
-
+  
+  myPreviewActorGlyphs = myPreviewActorGlyphs = SALOME_Actor::New();
+  myPreviewActorGlyphs->PickableOff();
+  updateGlyphs(false);
+  
   myPreviewActor = SALOME_Actor::New();
   myPreviewActor->PickableOff();
   myPreviewActor->SetMapper(aPlaneMapper);
   aPlaneMapper->Delete();
   aView->AddActor(myPreviewActor);
+  aView->AddActor(myPreviewActorGlyphs);
   aView->getRenderer()->Render();
   aView->onFitAll();
 }
@@ -336,10 +358,14 @@ void VisuGUI_CutLinesDlg::createPlanes()
 void VisuGUI_CutLinesDlg::deletePlanes()
 {
   if (myPreviewActor == 0) return;
-  if (SVTK_ViewWindow* aView = VISU::GetViewWindow())
+  if (SVTK_ViewWindow* aView = VISU::GetActiveViewWindow<SVTK_ViewWindow>()){
     aView->RemoveActor(myPreviewActor);
+    aView->RemoveActor(myPreviewActorGlyphs);
+  }
   myPreviewActor->Delete();
+  myPreviewActorGlyphs->Delete();
   myPreviewActor = 0;
+  myPreviewActorGlyphs = 0;
 }
 
 
@@ -389,7 +415,8 @@ void VisuGUI_CutLinesDlg::onCutSelect (int theId, bool theUpdate)
     myRotXLbl2->setText( tr("LBL_ROT_Z"));
     myRotYLbl2->setText( tr("LBL_ROT_X"));
   }
-  if (SVTK_ViewWindow* aView = VISU::GetViewWindow()) {
+  SVTK_ViewWindow* aView = VISU::GetActiveViewWindow<SVTK_ViewWindow>();
+  if (aView) {
     if (theUpdate && myPreviewCheck->isChecked() && (myCutLines != NULL)) {
       /*myCutLines->SetOrientation2(getOrientaion(false),
                                   myRotXSpn2->value()*PI/180.,
@@ -417,7 +444,8 @@ void VisuGUI_CutLinesDlg::setBaseDefault (bool theUpdate)
     /*    float aPos = myCutLines->GetBasePlanePosition();
     myBasePlanePos->setText( QString::number(aPos) );
     myBasePlanePos->setEnabled(false);*/
-    if (SVTK_ViewWindow* aView = VISU::GetViewWindow()) {
+    SVTK_ViewWindow* aView = VISU::GetActiveViewWindow<SVTK_ViewWindow>();
+    if (aView) {
       if (theUpdate && myPreviewCheck->isChecked() && (myCutLines != NULL)) {
         //myCutLines->SetBasePlanePosition(aPos);
        //        myCutLines->GetPL()->Update();
@@ -488,7 +516,8 @@ void VisuGUI_CutLinesDlg::DrawTable()
     vh->setLabel( i, str.arg(i+1) );
   }
   // Update preview
-  if (SVTK_ViewWindow* aView = VISU::GetViewWindow()) {
+  SVTK_ViewWindow* aView = VISU::GetActiveViewWindow<SVTK_ViewWindow>();
+  if (aView) {
     if (myPreviewCheck->isChecked()) {
       //      myCutLines->GetPL()->Update();
       deletePlanes();
@@ -498,6 +527,78 @@ void VisuGUI_CutLinesDlg::DrawTable()
   }
 }
 
+void VisuGUI_CutLinesDlg::updateGlyphs(bool update){
+  if (myPreviewActorGlyphs == 0 ) return;
+  const float *aDirLn = myCutLines->GetCutLinesPL()->GetDirLn();
+  const float *aBasePnt = myCutLines->GetCutLinesPL()->GetBasePnt();
+  float aSecondPnt[3];
+  float aBoundCenter[3];
+
+  vtkAppendPolyData* aPolyData = myCutLines->GetCutLinesPL()->GetAppendPolyData();
+  vtkDataSetMapper* aPlaneMapper = vtkDataSetMapper::New();
+  aPlaneMapper->SetInput(aPolyData->GetOutput());
+  float bounds[6];
+  aPlaneMapper->GetBounds(bounds);
+
+  for(int i=0; i<3; i++) aBoundCenter[i] = (bounds[i*2] + bounds[i*2+1])/2.0;
+  for(int i=0; i<3; i++){ 
+    if (!myAllCurvesInvertedCheck->isChecked())
+      aSecondPnt[i] = aBasePnt[i] + aDirLn[i];
+    else
+      aSecondPnt[i] = -aBasePnt[i] - aDirLn[i];
+  }
+  
+  float max_bound = 0;
+  max_bound < bounds[1]-bounds[0] ? max_bound = bounds[1] - bounds[0] : max_bound = max_bound;
+  max_bound < bounds[3]-bounds[2] ? max_bound = bounds[3] - bounds[2] : max_bound = max_bound;
+  max_bound < bounds[5]-bounds[4] ? max_bound = bounds[5] - bounds[4] : max_bound = max_bound;
+
+  vtkPolyData* profile = vtkPolyData::New();
+  vtkPoints* aPoints = vtkPoints::New();
+  vtkGlyph3D* glyphs = vtkGlyph3D::New();
+  vtkFloatArray *aFloatArray = vtkFloatArray::New();
+  vtkGlyphSource2D* source = vtkGlyphSource2D::New();
+  
+  source->FilledOn();
+  source->SetCenter(aBoundCenter);
+  source->SetGlyphTypeToArrow();
+  
+  aPoints->InsertNextPoint(aBasePnt);
+  profile->SetPoints(aPoints);
+  
+  aFloatArray->SetNumberOfComponents(3);
+  for(int i=0; i<3 ;i++)
+      aFloatArray->InsertNextValue(aSecondPnt[i]);
+  
+  vtkDataSetAttributes* aDataSetAttributes;
+  aDataSetAttributes = profile->GetPointData();
+  aDataSetAttributes->SetVectors(aFloatArray);
+  
+  glyphs->SetScaleFactor(0.25*max_bound);
+  glyphs->SetVectorModeToUseVector();
+  glyphs->SetScaleModeToScaleByVector();
+  glyphs->SetInput(profile);
+  glyphs->SetSource(source->GetOutput());
+
+  vtkPolyDataMapper* aGlyphsMapper = vtkPolyDataMapper::New();
+  aGlyphsMapper->ScalarVisibilityOff();
+  aGlyphsMapper->SetInput(glyphs->GetOutput());
+  
+  myPreviewActorGlyphs->SetMapper(aGlyphsMapper);
+
+  profile->Delete();
+  glyphs->Delete();
+  aPoints->Delete();
+  aGlyphsMapper->Delete();
+  aFloatArray->Delete();
+  source->Delete();
+  aPlaneMapper->Delete();
+
+  if (SVTK_ViewWindow* vf = VISU::GetActiveViewWindow<SVTK_ViewWindow>())
+    if (update)
+      vf->Repaint();
+}
+
 //------------------------------------------------------------------------------
 void VisuGUI_CutLinesDlg::setDefault (int all)
 {
@@ -584,8 +685,8 @@ void VisuGUI_CutLinesDlg::onValueChanged (int theRow, int theCol)
     QString aTxt = myPosTable->text(theRow, 0);
     bool isChanged = !aTxt.isEmpty();
     ((QCheckTableItem*)myPosTable->item(theRow, 1))->setChecked(!isChanged);
-
-    if (SVTK_ViewWindow* aView = VISU::GetViewWindow()) {
+    SVTK_ViewWindow* aView = VISU::GetActiveViewWindow<SVTK_ViewWindow>();
+    if (aView) {
       if (myPreviewCheck->isChecked()) {
        //Update Preview
        //myCutLines->SetLinePosition( theRow, aTxt.toDouble());
@@ -595,13 +696,13 @@ void VisuGUI_CutLinesDlg::onValueChanged (int theRow, int theCol)
        //aView->Repaint();
       }
     }
-  } else {
+  } else if (theCol == 1){
     bool isDefault = ((QCheckTableItem*)myPosTable->item(theRow, theCol))->isChecked();
     if (isDefault) {
       //myCutLines->SetDefaultPosition(theRow);
       // myPosTable->setText(theRow, 0, QString::number(myCutLines->GetLinePosition(theRow)));
-
-      if (SVTK_ViewWindow* aView = VISU::GetViewWindow()) {
+      SVTK_ViewWindow* aView = VISU::GetActiveViewWindow<SVTK_ViewWindow>();
+      if (aView) {
        if (myPreviewCheck->isChecked()) {
          //Update Preview
          //      myCutLines->GetPL()->Update();
@@ -701,6 +802,7 @@ void VisuGUI_CutLinesDlg::accept()
       }
     }
     VisuGUI::application()->objectBrowser()->updateTree();*/
+    myScalarPane->deletePreview();
     deletePlanes();
     QDialog::accept();
     //  }
@@ -712,13 +814,14 @@ void VisuGUI_CutLinesDlg::reject()
     myPrs->RemoveFromStudy();
     VisuGUI::application()->objectBrowser()->updateTree();
   }*/
+  myScalarPane->deletePreview();
   deletePlanes();
   QDialog::reject();
 }
 
 void VisuGUI_CutLinesDlg::onPreviewCheck (bool thePreview)
 {
-  if (SVTK_ViewWindow* vf = VISU::GetViewWindow()) {
+  if (SVTK_ViewWindow* vf = VISU::GetActiveViewWindow<SVTK_ViewWindow>()) {
     if (thePreview) {
       //storeToPrsObject(myCutLines);
       //      myCutLines->GetPL()->Update();
@@ -731,10 +834,26 @@ void VisuGUI_CutLinesDlg::onPreviewCheck (bool thePreview)
   }
 }
 
+/*! Inverting all curves in the table
+ */
+void VisuGUI_CutLinesDlg::onAllCurvesInvertedCheck(bool theInvert)
+{
+  if (myAllCurvesInvertedCheck->isChecked()){
+    myCutLines->SetAllCurvesInverted(true);
+    myPrs->SetAllCurvesInverted(true);
+  }
+  else {
+    myCutLines->SetAllCurvesInverted(false);
+    myPrs->SetAllCurvesInverted(false);
+  }
+  updateGlyphs(true);
+}
+
 void VisuGUI_CutLinesDlg::onRotation (double theValue)
 {
   if (myCutLines == NULL) return;
-  if (SVTK_ViewWindow* aView = VISU::GetViewWindow()) {
+  SVTK_ViewWindow* aView = VISU::GetActiveViewWindow<SVTK_ViewWindow>();
+  if (aView) {
     if (myPreviewCheck->isChecked()) {
 
       /*myCutLines->SetOrientation(getOrientaion(),
@@ -754,7 +873,8 @@ void VisuGUI_CutLinesDlg::onRotation (double theValue)
 void VisuGUI_CutLinesDlg::onPlanePos (const QString& theValue)
 {
   if (myCutLines == NULL) return;
-  if (SVTK_ViewWindow* aView = VISU::GetViewWindow()) {
+  SVTK_ViewWindow* aView = VISU::GetActiveViewWindow<SVTK_ViewWindow>();
+  if (aView) {
     if (myPreviewCheck->isChecked()) {
       //myCutLines->SetBasePlanePosition(theValue.toDouble());
       //      myCutLines->GetPL()->Update();