X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FVISUGUI%2FVisuGUI_ClippingDlg.cxx;h=f5891a70076054ab25dbd8e410e52f54216c4e61;hb=777aad1f889cc3fe09e75a5dfaf46919076f117c;hp=b62289281f3ed0f1bff5bed3350b498292a22bea;hpb=41ce2db19b72f290f671bc1abfd9691b9dd9b17e;p=modules%2Fvisu.git diff --git a/src/VISUGUI/VisuGUI_ClippingDlg.cxx b/src/VISUGUI/VisuGUI_ClippingDlg.cxx index b6228928..f5891a70 100644 --- a/src/VISUGUI/VisuGUI_ClippingDlg.cxx +++ b/src/VISUGUI/VisuGUI_ClippingDlg.cxx @@ -7,12 +7,15 @@ #include "VISU_Prs3d_i.hh" #include "VISU_Result_i.hh" +#include "VISU_PipeLine.hxx" + #include "SalomeApp_SelectionMgr.h" #include "SVTK_ViewWindow.h" #include "SUIT_Session.h" #include "SUIT_Desktop.h" +#include "SUIT_MessageBox.h" #include "SUIT_ResourceMgr.h" #include "SUIT_OverrideCursor.h" @@ -60,10 +63,8 @@ namespace VISU { void RenderViewWindow (SVTK_ViewWindow* vw) { if (vw) { -//if (vw->getRenderer()->GetActors()->GetNumberOfItems() > 0) { - vw->getRenderer()->ResetCameraClippingRange(); - vw->Repaint(); -//} + vw->getRenderer()->ResetCameraClippingRange(); + vw->Repaint(); } } @@ -160,18 +161,23 @@ protected: vtkProperty* aProp = vtkProperty::New(); float anRGB[3]; - anRGB[0] = VISU::GetFloat("SMESH:SettingsFillColorRed", 0)/255.; - anRGB[1] = VISU::GetFloat("SMESH:SettingsFillColorGreen", 170)/255.; - anRGB[2] = VISU::GetFloat("SMESH:SettingsFillColorBlue", 255)/255.; + + SUIT_ResourceMgr* aResourceMgr = VISU::GetResourceMgr(); + + QColor aFillColor = aResourceMgr->colorValue("SMESH", "fill_color", QColor(0, 170, 255)); + anRGB[0] = aFillColor.red()/255.; + anRGB[1] = aFillColor.green()/255.; + anRGB[2] = aFillColor.blue()/255.; aProp->SetColor(anRGB[0],anRGB[1],anRGB[2]); aProp->SetOpacity(0.75); myActor->SetProperty(aProp); aProp->Delete(); vtkProperty* aBackProp = vtkProperty::New(); - anRGB[0] = VISU::GetFloat("SMESH:SettingsBackFaceColorRed", 0)/255.; - anRGB[1] = VISU::GetFloat("SMESH:SettingsBackFaceColorGreen", 0)/255.; - anRGB[2] = VISU::GetFloat("SMESH:SettingsBackFaceColorBlue", 255)/255.; + QColor aBackFaceColor = aResourceMgr->colorValue("SMESH", "backface_color", QColor(0, 0, 255));//@ + anRGB[0] = aBackFaceColor.red()/255.; + anRGB[1] = aBackFaceColor.green()/255.; + anRGB[2] = aBackFaceColor.blue()/255.; aBackProp->SetColor(anRGB[0],anRGB[1],anRGB[2]); aBackProp->SetOpacity(0.75); myActor->SetBackfaceProperty(aBackProp); @@ -331,27 +337,26 @@ VisuGUI_ClippingDlg::VisuGUI_ClippingDlg (VisuGUI* theModule, onSelectionChanged(); // signals and slots connections : - connect(ComboBoxPlanes, SIGNAL(activated(int)), this, SLOT(onSelectPlane(int))); - connect(buttonNew, SIGNAL(clicked()), this, SLOT(ClickOnNew())); - connect(buttonDelete, SIGNAL(clicked()), this, SLOT(ClickOnDelete())); - connect(ComboBoxOrientation, SIGNAL(activated(int)), this, SLOT(onSelectOrientation(int))); - connect(SpinBoxDistance, SIGNAL(valueChanged(double)), this, SLOT(SetCurrentPlaneParam())); - connect(SpinBoxRot1, SIGNAL(valueChanged(double)), this, SLOT(SetCurrentPlaneParam())); - connect(SpinBoxRot2, SIGNAL(valueChanged(double)), this, SLOT(SetCurrentPlaneParam())); - connect(ButtonGroupIJKAxis, SIGNAL(clicked(int)), this, SLOT(onIJKAxisChanged(int))); - connect(SpinBoxIJKIndex, SIGNAL(valueChanged(int)), this, SLOT(SetCurrentPlaneIJKParam())); - connect(CheckBoxIJKPlaneReverse, SIGNAL(toggled(bool)), this, SLOT(SetCurrentPlaneIJKParam())); - connect(TabPane, SIGNAL(currentChanged (QWidget*)), this, SLOT(onTabChanged(QWidget*))); - - connect(PreviewCheckBox, SIGNAL(toggled(bool)), this, SLOT(OnPreviewToggle(bool))); + connect(ComboBoxPlanes , SIGNAL(activated(int)) , this, SLOT(onSelectPlane(int))); + connect(buttonNew , SIGNAL(clicked()) , this, SLOT(ClickOnNew())); + connect(buttonDelete , SIGNAL(clicked()) , this, SLOT(ClickOnDelete())); + connect(ComboBoxOrientation , SIGNAL(activated(int)) , this, SLOT(onSelectOrientation(int))); + connect(SpinBoxDistance , SIGNAL(valueChanged(double)) , this, SLOT(SetCurrentPlaneParam())); + connect(SpinBoxRot1 , SIGNAL(valueChanged(double)) , this, SLOT(SetCurrentPlaneParam())); + connect(SpinBoxRot2 , SIGNAL(valueChanged(double)) , this, SLOT(SetCurrentPlaneParam())); + connect(ButtonGroupIJKAxis , SIGNAL(clicked(int)) , this, SLOT(onIJKAxisChanged(int))); + connect(SpinBoxIJKIndex , SIGNAL(valueChanged(int)) , this, SLOT(SetCurrentPlaneIJKParam())); + connect(CheckBoxIJKPlaneReverse, SIGNAL(toggled(bool)) , this, SLOT(SetCurrentPlaneIJKParam())); + connect(TabPane , SIGNAL(currentChanged (QWidget*)), this, SLOT(onTabChanged(QWidget*))); + + connect(PreviewCheckBox , SIGNAL(toggled(bool)), this, SLOT(OnPreviewToggle(bool))); connect(AutoApplyCheckBox, SIGNAL(toggled(bool)), this, SLOT(ClickOnApply())); - connect(buttonOk, SIGNAL(clicked()), this, SLOT(ClickOnOk())); + + connect(buttonOk , SIGNAL(clicked()), this, SLOT(ClickOnOk())); + connect(buttonApply , SIGNAL(clicked()), this, SLOT(ClickOnApply())); connect(buttonCancel, SIGNAL(clicked()), this, SLOT(ClickOnCancel())); - connect(buttonApply, SIGNAL(clicked()), this, SLOT(ClickOnApply())); - connect(myVisuGUI, SIGNAL(SignalCloseAllDialogs()), this, SLOT(ClickOnOk())); + connect(mySelectionMgr, SIGNAL(currentSelectionChanged()), this, SLOT(onSelectionChanged())); - /* to close dialog if study frame change */ - connect(myVisuGUI, SIGNAL(SignalStudyFrameChanged()), this, SLOT(ClickOnCancel())); this->show(); } @@ -459,17 +464,59 @@ void VisuGUI_ClippingDlg::ClickOnApply() if (SVTK_ViewWindow* aViewWindow = VISU::GetViewWindow(myVisuGUI)) { SUIT_OverrideCursor wc; + // Save clipping planes, currently applied to the presentation + // to enable restoring this state in case of failure. + // Refer to bugs IPAL8849, IPAL8850 for more information. + typedef vtkSmartPointer TPln; + typedef std::vector TPlns; + bool isFailed = false; + TPlns anOldPlanes; + int iopl = 0, nbOldPlanes = myPrs3d->GetNumberOfClippingPlanes(); + for (; iopl < nbOldPlanes; iopl++) { + anOldPlanes.push_back(myPrs3d->GetClippingPlane(iopl)); + } + + // Try to apply new clipping myPrs3d->RemoveAllClippingPlanes(); VISU::TPlanes::iterator anIter = myPlanes.begin(); - for (;anIter != myPlanes.end();anIter++) { + for (; anIter != myPlanes.end(); anIter++) { OrientedPlane* anOrientedPlane = OrientedPlane::New(aViewWindow); anOrientedPlane->ShallowCopy(anIter->GetPointer()); - myPrs3d->AddClippingPlane(anOrientedPlane); + if (!myPrs3d->AddClippingPlane(anOrientedPlane)) { + isFailed = true; + } anOrientedPlane->Delete(); } - VISU::RenderViewWindow(aViewWindow); + // Check contents of the resulting (clipped) presentation data + if (!isFailed) { + VISU_PipeLine* aPL = myPrs3d->GetPL(); + VISU_PipeLine::TMapper* aM = aPL->GetMapper(); + vtkDataSet* aPrsData = aM->GetInput(); + aPrsData->Update(); + if (aPrsData->GetNumberOfCells() < 1) { + isFailed = true; + } + } + + if (isFailed) { + // Restore previous clipping state because of failure. + myPrs3d->RemoveAllClippingPlanes(); + + TPlns::iterator anOldIter = anOldPlanes.begin(); + for (; anOldIter != anOldPlanes.end(); anOldIter++) { + myPrs3d->AddClippingPlane(anOldIter->GetPointer()); + } + + SUIT_MessageBox::warn1(VISU::GetDesktop(myVisuGUI), + tr("WRN_VISU"), + tr("WRN_EMPTY_RESULTING_PRS"), + tr("BUT_OK") ); + } + + //VISU::RenderViewWindow(aViewWindow); + VISU::RepaintViewWindows(myVisuGUI, myIO); } } @@ -501,6 +548,7 @@ void VisuGUI_ClippingDlg::onSelectionChanged() if (SVTK_ViewWindow* aViewWindow = VISU::GetViewWindow(myVisuGUI)) { Handle(SALOME_InteractiveObject) anIO; CORBA::Object_var anObject = VISU::GetSelectedObj(myVisuGUI, &anIO); + myIO = anIO; if (CORBA::is_nil(anObject)) return; PortableServer::ServantBase_var aServant = VISU::GetServant(anObject); if (!aServant.in()) return;