X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FEntityGUI%2FEntityGUI_SubShapeDlg.cxx;h=e65655656ae3511fe4dde3a60ca7bc68a6d722e4;hb=1192c0b6c16d629fabf9ef1cf872b80d4520373a;hp=b782a2bd2ed4a8e3caadaa6cc08b1f6f44bedfad;hpb=8bc9b430c5f9f3cf77539fee550f1b56769d3893;p=modules%2Fgeom.git diff --git a/src/EntityGUI/EntityGUI_SubShapeDlg.cxx b/src/EntityGUI/EntityGUI_SubShapeDlg.cxx index b782a2bd2..e65655656 100644 --- a/src/EntityGUI/EntityGUI_SubShapeDlg.cxx +++ b/src/EntityGUI/EntityGUI_SubShapeDlg.cxx @@ -1,79 +1,110 @@ -// GEOM GEOMGUI : GUI for Geometry component +// Copyright (C) 2007-2011 CEA/DEN, EDF R&D, OPEN CASCADE // -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org +// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS // +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. // +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. // -// File : EntityGUI_SubShapeDlg.cxx -// Author : Lucien PIGNOLONI -// Module : GEOM -// $Header$ +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com + +// GEOM GEOMGUI : GUI for Geometry component +// File : EntityGUI_SubShapeDlg.cxx +// Author : Lucien PIGNOLONI, Open CASCADE S.A.S. -using namespace std; #include "EntityGUI_SubShapeDlg.h" -#include "DisplayGUI.h" -#include "QAD_RightFrame.h" -#include "OCCViewer_Viewer3d.h" +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include #include +#include #include +#include -#include +#include + +#include + +#include //================================================================================= -// class : EntityGUI_SubShapeDlg() +// class : EntityGUI_SubShapeDlg // purpose : Constructs a EntityGUI_SubShapeDlg which is a child of 'parent', with the // name 'name' and widget flags set to 'f'. // The dialog will by default be modeless, unless you set 'modal' to // TRUE to construct a modal dialog. //================================================================================= -EntityGUI_SubShapeDlg::EntityGUI_SubShapeDlg(QWidget* parent, const char* name, EntityGUI* theEntityGUI, SALOME_Selection* Sel, Handle(AIS_InteractiveContext) ic, bool modal, WFlags fl) - :GEOMBase_Skeleton(parent, name, Sel, modal, WStyle_Customize | WStyle_NormalBorder | WStyle_Title | WStyle_SysMenu) +EntityGUI_SubShapeDlg::EntityGUI_SubShapeDlg(GeometryGUI* theGeometryGUI, QWidget* parent, + bool modal, Qt::WindowFlags fl) + : GEOMBase_Skeleton(theGeometryGUI, parent, modal, fl), + myWithShape(true), + myIsHiddenMain(false) { - QPixmap image0(QAD_Desktop::getResourceManager()->loadPixmap("GEOM",tr("ICON_DLG_SUBSHAPE"))); - QPixmap image1(QAD_Desktop::getResourceManager()->loadPixmap("GEOM",tr("ICON_SELECT"))); + QPixmap image0(SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("ICON_DLG_SUBSHAPE"))); + QPixmap image1(SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("ICON_SELECT"))); - setCaption(tr("GEOM_SUBSHAPE_TITLE")); + setWindowTitle(tr("GEOM_SUBSHAPE_TITLE")); /***************************************************************/ - GroupConstructors->setTitle(tr("GEOM_SUB_SHAPE")); - RadioButton1->setPixmap(image0); - RadioButton2->close(TRUE); - RadioButton3->close(TRUE); + mainFrame()->GroupConstructors->setTitle(tr("GEOM_SUB_SHAPE")); + mainFrame()->RadioButton1->setIcon(image0); + mainFrame()->RadioButton2->setAttribute(Qt::WA_DeleteOnClose); + mainFrame()->RadioButton2->close(); + mainFrame()->RadioButton3->setAttribute(Qt::WA_DeleteOnClose); + mainFrame()->RadioButton3->close(); + + GroupPoints = new DlgRef_1Sel1List1Check3Btn(centralWidget()); - GroupPoints = new DlgRef_1Sel1Check1List_QTD(this, "GroupPoints"); GroupPoints->GroupBox1->setTitle(tr("GEOM_ARGUMENTS")); GroupPoints->TextLabel1->setText(tr("GEOM_MAIN_OBJECT")); GroupPoints->TextLabel2->setText(tr("GEOM_SUBSHAPE_TYPE")); GroupPoints->CheckButton1->setText(tr("GEOM_SUBSHAPE_SELECT")); - GroupPoints->PushButton1->setPixmap(image1); - - Layout1->addWidget(GroupPoints, 1, 0); + GroupPoints->PushButton1->setIcon(image1); + GroupPoints->PushButton2->setText(tr("SHOW_ONLY_SELECTED")); + GroupPoints->PushButton3->setText(tr("HIDE_SELECTED")); + GroupPoints->PushButton4->setText(tr("SHOW_ALL_SUB_SHAPES")); + GroupPoints->LineEdit1->setReadOnly(true); + + QVBoxLayout* layout = new QVBoxLayout(centralWidget()); + layout->setMargin(0); layout->setSpacing(6); + layout->addWidget(GroupPoints); /***************************************************************/ - /* Initialisations */ - myEntityGUI = theEntityGUI; - Init(ic); -} + setIsOptimizedBrowsing(true); + + setHelpFileName("create_explode_page.html"); + mainFrame()->GroupBoxName->hide(); + + Init(); +} //================================================================================= // function : ~EntityGUI_SubShapeDlg() @@ -81,250 +112,263 @@ EntityGUI_SubShapeDlg::EntityGUI_SubShapeDlg(QWidget* parent, const char* name, //================================================================================= EntityGUI_SubShapeDlg::~EntityGUI_SubShapeDlg() { - // no need to delete child widgets, Qt does it all for us + if (myIsHiddenMain) { + GEOM_Displayer* aDisplayer = getDisplayer(); + aDisplayer->Display(myObject); + myIsHiddenMain = false; + } } - //================================================================================= // function : Init() // purpose : //================================================================================= -void EntityGUI_SubShapeDlg::Init(Handle(AIS_InteractiveContext) ic) +void EntityGUI_SubShapeDlg::Init() { /* init variables */ myEditCurrentArgument = GroupPoints->LineEdit1; + myObject = GEOM::GEOM_Object::_nil(); myWithShape = true; - myAbort = myOkShape = myUseLocalContext = false; - myIC = ic; - myLocalContextId = -1; /* type for sub shape selection */ - GroupPoints->ComboBox1->insertItem("Compound"); - GroupPoints->ComboBox1->insertItem("Compsolid"); - GroupPoints->ComboBox1->insertItem("Solid"); - GroupPoints->ComboBox1->insertItem("Shell"); - GroupPoints->ComboBox1->insertItem("Face"); - GroupPoints->ComboBox1->insertItem("Wire"); - GroupPoints->ComboBox1->insertItem("Edge"); - GroupPoints->ComboBox1->insertItem("Vertex"); - GroupPoints->ComboBox1->insertItem("Shape"); - - myShapeType = GroupPoints->ComboBox1->currentItem(); - myOkSelectSubMode = GroupPoints->CheckButton1->isChecked(); - - if(QAD_Application::getDesktop()->getActiveStudy()->getActiveStudyFrame()->getTypeView() != VIEW_OCC) + GroupPoints->ComboBox1->insertItem(GroupPoints->ComboBox1->count(), "Compound"); + GroupPoints->ComboBox1->insertItem(GroupPoints->ComboBox1->count(), "Compsolid"); + GroupPoints->ComboBox1->insertItem(GroupPoints->ComboBox1->count(), "Solid"); + GroupPoints->ComboBox1->insertItem(GroupPoints->ComboBox1->count(), "Shell"); + GroupPoints->ComboBox1->insertItem(GroupPoints->ComboBox1->count(), "Face"); + GroupPoints->ComboBox1->insertItem(GroupPoints->ComboBox1->count(), "Wire"); + GroupPoints->ComboBox1->insertItem(GroupPoints->ComboBox1->count(), "Edge"); + GroupPoints->ComboBox1->insertItem(GroupPoints->ComboBox1->count(), "Vertex"); + GroupPoints->ComboBox1->insertItem(GroupPoints->ComboBox1->count(), "Shape"); + + if (SUIT_Session::session()->activeApplication()->desktop()->activeWindow()->getViewManager()->getType() + != OCCViewer_Viewer::Type()) GroupPoints->CheckButton1->setEnabled(false); /* signals and slots connections */ - connect(buttonCancel, SIGNAL(clicked()), this, SLOT(ClickOnCancel())); connect(myGeomGUI, SIGNAL(SignalDeactivateActiveDialog()), this, SLOT(DeactivateActiveDialog())); - connect(myGeomGUI, SIGNAL(SignalCloseAllDialogs()), this, SLOT(ClickOnCancel())); - connect(buttonOk, SIGNAL(clicked()), this, SLOT(ClickOnOk())); - connect(buttonApply, SIGNAL(clicked()), this, SLOT(ClickOnApply())); + connect(buttonOk(), SIGNAL(clicked()), this, SLOT(ClickOnOk())); + connect(buttonApply(), SIGNAL(clicked()), this, SLOT(ClickOnApply())); - connect(GroupPoints->PushButton1, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); - connect(GroupPoints->LineEdit1, SIGNAL(returnPressed()), this, SLOT(LineEditReturnPressed())); + connect(GroupPoints->PushButton1, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); + connect(GroupPoints->LineEdit1, SIGNAL(returnPressed()), this, SLOT(LineEditReturnPressed())); - connect(GroupPoints->ComboBox1, SIGNAL(activated(int)), this, SLOT(ComboTextChanged())); - connect(GroupPoints->CheckButton1, SIGNAL(stateChanged(int)), this, SLOT(AllOrNotAll())); - - connect(mySelection, SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument())); + connect(GroupPoints->ComboBox1, SIGNAL(activated(int)), this, SLOT(ComboTextChanged())); + connect(GroupPoints->CheckButton1, SIGNAL(stateChanged(int)), this, SLOT(SubShapeToggled())); - /* displays Dialog */ - GroupPoints->show(); - this->show(); + connect(GroupPoints->PushButton2, SIGNAL(clicked()), this, SLOT(showOnlySelected())); + connect(GroupPoints->PushButton3, SIGNAL(clicked()), this, SLOT(showOnlySelected())); + connect(GroupPoints->PushButton4, SIGNAL(clicked()), this, SLOT(showOnlySelected())); - return; -} + connect(myGeomGUI->getApp()->selectionMgr(), + SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument())); + updateButtonState(); + resize(100,100); + SelectionIntoArgument(); +} //================================================================================= -// function : ClickOnOk() +// function : enterEvent() // purpose : //================================================================================= -void EntityGUI_SubShapeDlg::ClickOnOk() +void EntityGUI_SubShapeDlg::enterEvent(QEvent*) { - this->ClickOnApply(); - - /* User has aborted or not operation of explode all with many sub shapes */ - if(myAbort == false) - this->ClickOnCancel(); - else - myAbort = false; + if (!mainFrame()->GroupConstructors->isEnabled()) + ActivateThisDialog(); +} - return; +//================================================================================= +// function : ActivateThisDialog() +// purpose : +//================================================================================= +void EntityGUI_SubShapeDlg::ActivateThisDialog() +{ + GEOMBase_Skeleton::ActivateThisDialog(); + connect(myGeomGUI->getApp()->selectionMgr(), + SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument())); + SubShapeToggled(); + updateButtonState(); } +//================================================================================= +//function : closeEvent +//purpose : remove temporary geom object +//================================================================================= +void EntityGUI_SubShapeDlg::closeEvent(QCloseEvent* e) +{ + erasePreview(true); + GEOMBase_Skeleton::closeEvent(e); +} //================================================================================= -// function : ClickOnApply() +// function : ClickOnOk() // purpose : //================================================================================= -void EntityGUI_SubShapeDlg::ClickOnApply() +void EntityGUI_SubShapeDlg::ClickOnOk() { - QAD_Application::getDesktop()->putInfo(tr("")); - bool testResult = false; - myAbort = false; /* Not aborted by default */ - + setIsApplyAndClose(true); + + SUIT_Session::session()->activeApplication()->putInfo(""); + /* Explode all sub shapes */ - if(myOkShape && !myOkSelectSubMode) { + bool isOk = true; + if (isAllSubShapes()) { /* More than 30 subshapes : ask confirmation */ - unsigned int nb = NumberOfSubShapes(myShape, myShapeType); - if(nb > 30) { + unsigned int nb = NumberOfSubShapes(myShape, shapeType()); + if (nb > 30) { const QString caption = tr("GEOM_CONFIRM"); const QString text = tr("GEOM_CONFIRM_INFO").arg(nb); const QString button0 = tr("GEOM_BUT_EXPLODE"); const QString button1 = tr("GEOM_BUT_CANCEL"); - - if(QMessageBox::warning(this, caption, text, button0, button1) == 0) - testResult = myEntityGUI->OnSubShapeGetAll(myShape, myShapeIOR, myShapeType); - else - myAbort = true; /* aborted */ + + if (QMessageBox::warning(this, caption, text, button0, button1) != 0) + isOk = false; /* aborted */ } - else - testResult = myEntityGUI->OnSubShapeGetAll(myShape, myShapeIOR, myShapeType); } - /* explode only selected sub shapes */ - else if(myOkShape && myOkSelectSubMode) - testResult = myEntityGUI->OnSubShapeGetSelected(myShape, myShapeIOR, myShapeType, myLocalContextId, myUseLocalContext); - if(!testResult) { - QAD_Application::getDesktop()->putInfo(tr("GEOM_PRP_ABORT")); - myAbort = true; - } - else - QAD_Application::getDesktop()->putInfo(tr("GEOM_PRP_DONE")); + if (isOk) + isOk = onAccept(); - /* Reset all arguments and local context to allow user a new selection ...*/ - //this->ResetStateOfDialog(); - return; + if (isOk) + ClickOnCancel(); } - //================================================================================= -// function : ClickOnCancel() +// function : ClickOnApply() // purpose : //================================================================================= -void EntityGUI_SubShapeDlg::ClickOnCancel() +bool EntityGUI_SubShapeDlg::ClickOnApply() { - if(QAD_Application::getDesktop()->getActiveStudy()->getActiveStudyFrame()->getTypeView() == VIEW_OCC) { - OCCViewer_Viewer3d* v3d = ((OCCViewer_ViewFrame*)QAD_Application::getDesktop()->getActiveStudy()->getActiveStudyFrame()->getRightFrame()->getViewFrame())->getViewer(); - myIC = v3d->getAISContext(); - if(myUseLocalContext) { - myIC->CloseLocalContext(myLocalContextId); - myUseLocalContext = false; + SUIT_Session::session()->activeApplication()->putInfo(""); + + /* Explode all sub shapes */ + if (isAllSubShapes()) { + /* More than 30 subshapes : ask confirmation */ + unsigned int nb = NumberOfSubShapes(myShape, shapeType()); + if (nb > 30) { + const QString caption = tr("GEOM_CONFIRM"); + const QString text = tr("GEOM_CONFIRM_INFO").arg(nb); + const QString button0 = tr("GEOM_BUT_EXPLODE"); + const QString button1 = tr("GEOM_BUT_CANCEL"); + + if (QMessageBox::warning(this, caption, text, button0, button1) != 0) + return false; /* aborted */ } - DisplayGUI* myDisplayGUI = new DisplayGUI(); - myDisplayGUI->OnDisplayAll(true); } - GEOMBase_Skeleton::ClickOnCancel(); - return; -} + bool isOk = onAccept(); + + // restore selection, corresponding to current selection mode + SubShapeToggled(); + + return isOk; +} //================================================================================= // function : SelectionIntoArgument() -// purpose : Called when selection as changed or other case -// : used only by SelectButtonC1A1 (LineEditC1A1) +// purpose : Called when selection has changed or other case //================================================================================= void EntityGUI_SubShapeDlg::SelectionIntoArgument() { - myEditCurrentArgument->setText(""); - this->ResetStateOfDialog(); + if (!isAllSubShapes()) + return; + + ResetStateOfDialog(); + QString aString = ""; /* name of selection */ - int nbSel = myGeomBase->GetNameOfSelectedIObjects(mySelection, aString); - if(nbSel != 1) { - myOkShape = false; + LightApp_SelectionMgr* aSelMgr = myGeomGUI->getApp()->selectionMgr(); + SALOME_ListIO aSelList; + aSelMgr->selectedObjects(aSelList); + + int nbSel = GEOMBase::GetNameOfSelectedIObjects(aSelList, aString, true); + if (nbSel != 1) + return; + + Handle(SALOME_InteractiveObject) IO = aSelList.First(); + if (!IO->hasEntry()) { + SUIT_Session::session()->activeApplication()->putInfo(tr("GEOM_PRP_SHAPE_IN_STUDY")); + updateButtonState(); return; } - - /* nbSel == 1 */ - TopoDS_Shape S; - Handle(SALOME_InteractiveObject) IO = mySelection->firstIObject(); - if(!myGeomBase->GetTopoFromSelection(mySelection, S)) + + if (myIsHiddenMain) { + GEOM_Displayer* aDisplayer = getDisplayer(); + aDisplayer->Display(myObject); + myIsHiddenMain = false; + } + + TopoDS_Shape S = GEOMBase::GetTopoFromSelection(aSelList); + if (S.IsNull() || S.ShapeType() == TopAbs_VERTEX) { + myObject = GEOM::GEOM_Object::_nil(); + updateButtonState(); return; - - if(!IO->hasEntry()) { - QAD_Application::getDesktop()->putInfo(tr("GEOM_PRP_SHAPE_IN_STUDY")); + } + + myObject = GEOMBase::ConvertIOinGEOMObject(IO); + if (myObject->_is_nil()) { + updateButtonState(); return; } - if(!S.IsNull() && S.ShapeType() != TopAbs_VERTEX) { - if(IO->IsInstance(STANDARD_TYPE(GEOM_InteractiveObject))) { - Handle(GEOM_InteractiveObject) GIObject = Handle(GEOM_InteractiveObject)::DownCast( IO ); - myShapeIOR = GIObject->getIOR(); /* the Geom IOR string of selection */ - myEditCurrentArgument->setText(aString); - myShape = S; - myOkShape = true; - } - else { - SALOMEDS::Study_var aStudy = QAD_Application::getDesktop()->getActiveStudy()->getStudyDocument(); - SALOMEDS::SObject_var obj = aStudy->FindObjectID(IO->getEntry()); - SALOMEDS::GenericAttribute_var anAttr; - SALOMEDS::AttributeIOR_var anIOR; - if(!obj->_is_nil()) { - if(obj->FindAttribute(anAttr, "AttributeIOR")) { - anIOR = SALOMEDS::AttributeIOR::_narrow(anAttr); - myShapeIOR = anIOR->Value(); - myOkShape = true; - myShape = S; - GroupPoints->LineEdit1->setText(aString); - } - } - } - - int SelectedShapeType = GroupPoints->ComboBox1->currentItem(); - int count = GroupPoints->ComboBox1->count(); + myShape = S; + GroupPoints->LineEdit1->setText(aString); + + int SelectedShapeType = GroupPoints->ComboBox1->currentIndex(); + int count = GroupPoints->ComboBox1->count(); - if(myWithShape) - count = count - 1; + if (myWithShape) + count = count - 1; - int i = 0; - while(i <= myShape.ShapeType()) { - GroupPoints->ComboBox1->removeItem(0); + int i = 0; + // Solving PAL5590 + if (myShape.ShapeType() == TopAbs_COMPOUND) { + unsigned int nb = NumberOfSubShapes(myShape, TopAbs_COMPOUND); + if (nb > 0) i++; - } + } + while (i <= myShape.ShapeType()) { + GroupPoints->ComboBox1->removeItem(0); + i++; + } - if(myShape.ShapeType()==TopAbs_COMPOUND) { - if(myWithShape == false) { - GroupPoints->ComboBox1->insertItem("Shape"); - myWithShape = true; - } + if (myShape.ShapeType() == TopAbs_COMPOUND) { + if (myWithShape == false) { + GroupPoints->ComboBox1->insertItem(GroupPoints->ComboBox1->count(), "Shape"); + myWithShape = true; } - else { - if(myWithShape == true) { - GroupPoints->ComboBox1->removeItem(GroupPoints->ComboBox1->count() - 1); - myWithShape = false; - } + } + else { + if (myWithShape == true) { + GroupPoints->ComboBox1->removeItem(GroupPoints->ComboBox1->count() - 1); + myWithShape = false; } - - int count1 = GroupPoints->ComboBox1->count(); - if(myWithShape) - count1 = count1 - 1; - - if(SelectedShapeType > myShape.ShapeType()) { - if(SelectedShapeType == 8) { - if(myShape.ShapeType() != TopAbs_COMPOUND) { - GroupPoints->ComboBox1->setCurrentItem(0); - myShapeType = 8 - count1; - } - } - else { - GroupPoints->ComboBox1->setCurrentItem(count1 - count + SelectedShapeType); - myShapeType = 8 - count1 + GroupPoints->ComboBox1->currentItem(); + } + + int count1 = GroupPoints->ComboBox1->count(); + if (myWithShape) + count1 = count1 - 1; + + if (SelectedShapeType > myShape.ShapeType()) { + if (SelectedShapeType == 8) { + if (myShape.ShapeType() != TopAbs_COMPOUND) { + GroupPoints->ComboBox1->setCurrentIndex(0); + ComboTextChanged(); } - } - else { - GroupPoints->ComboBox1->setCurrentItem(0); - myShapeType = 8 - count1; - } + } + else + GroupPoints->ComboBox1->setCurrentIndex(count1 - count + SelectedShapeType); + } + else { + GroupPoints->ComboBox1->setCurrentIndex(0); + ComboTextChanged(); } - return; -} + updateButtonState(); +} //================================================================================= // function : SetEditCurrentArgument() @@ -332,241 +376,454 @@ void EntityGUI_SubShapeDlg::SelectionIntoArgument() //================================================================================= void EntityGUI_SubShapeDlg::SetEditCurrentArgument() { - QPushButton* send = (QPushButton*)sender(); - - if(send == GroupPoints->PushButton1) { - GroupPoints->LineEdit1->setFocus(); - myEditCurrentArgument = GroupPoints->LineEdit1; - } - this->SelectionIntoArgument(); + GroupPoints->LineEdit1->setFocus(); + myEditCurrentArgument = GroupPoints->LineEdit1; - return; + GroupPoints->CheckButton1->setChecked(false); + SubShapeToggled(); + SelectionIntoArgument(); } - //================================================================================= // function : LineEditReturnPressed() // purpose : //================================================================================= void EntityGUI_SubShapeDlg::LineEditReturnPressed() -{ +{ QLineEdit* send = (QLineEdit*)sender(); - if(send == GroupPoints->LineEdit1) - myEditCurrentArgument = GroupPoints->LineEdit1; + if (send == GroupPoints->LineEdit1) + SetEditCurrentArgument(); else return; GEOMBase_Skeleton::LineEditReturnPressed(); - return; } - //================================================================================= -// function : DeactivateActiveDialog() -// purpose : +// function : ResetStateOfDialog() +// purpose : Completely reset the state of method including local context //================================================================================= -void EntityGUI_SubShapeDlg::DeactivateActiveDialog() +void EntityGUI_SubShapeDlg::ResetStateOfDialog() { - if(GroupConstructors->isEnabled()) { - this->ResetStateOfDialog(); - GEOMBase_Skeleton::DeactivateActiveDialog(); + if (myIsHiddenMain) { + GEOM_Displayer* aDisplayer = getDisplayer(); + aDisplayer->Display(myObject); + myIsHiddenMain = false; } - return; + myObject = GEOM::GEOM_Object::_nil(); + myShape.Nullify(); + myEditCurrentArgument->setText(""); + + int SelectedShapeType = GroupPoints->ComboBox1->currentIndex(); + int count = GroupPoints->ComboBox1->count(); + if (myWithShape) + count = count - 1; + + /* type for sub shape selection */ + GroupPoints->ComboBox1->clear(); + GroupPoints->ComboBox1->insertItem(GroupPoints->ComboBox1->count(), "Compound"); + GroupPoints->ComboBox1->insertItem(GroupPoints->ComboBox1->count(), "Compsolid"); + GroupPoints->ComboBox1->insertItem(GroupPoints->ComboBox1->count(), "Solid"); + GroupPoints->ComboBox1->insertItem(GroupPoints->ComboBox1->count(), "Shell"); + GroupPoints->ComboBox1->insertItem(GroupPoints->ComboBox1->count(), "Face"); + GroupPoints->ComboBox1->insertItem(GroupPoints->ComboBox1->count(), "Wire"); + GroupPoints->ComboBox1->insertItem(GroupPoints->ComboBox1->count(), "Edge"); + GroupPoints->ComboBox1->insertItem(GroupPoints->ComboBox1->count(), "Vertex"); + GroupPoints->ComboBox1->insertItem(GroupPoints->ComboBox1->count(), "Shape"); + + myWithShape = true; + + GroupPoints->ComboBox1->setCurrentIndex(8 - count + SelectedShapeType); + + // to avoid recursion: SelectionIntoArgument->ResetStateOfDialog->ComboTextChanged->SubShapeToggled->activateSelection->(currentSelectionChanged)->SelectionIntoArgument + //ComboTextChanged(); + + updateButtonState(); } +//================================================================================= +// function : SubShapeToggled() +// purpose : Allow user selection of all or only selected sub shapes +// : Called when 'CheckButton1' state change +//================================================================================= +void EntityGUI_SubShapeDlg::SubShapeToggled() +{ + GroupPoints->PushButton2->setEnabled(!isAllSubShapes()); + GroupPoints->PushButton3->setEnabled(!isAllSubShapes()); + GroupPoints->PushButton4->setEnabled(!isAllSubShapes()); + + activateSelection(); +} //================================================================================= -// function : ActivateThisDialog() +// function : ComboTextChanged() // purpose : //================================================================================= -void EntityGUI_SubShapeDlg::ActivateThisDialog() +void EntityGUI_SubShapeDlg::ComboTextChanged() { - GEOMBase_Skeleton::ActivateThisDialog(); - connect(mySelection, SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument())); - if(QAD_Application::getDesktop()->getActiveStudy()->getActiveStudyFrame()->getTypeView() == VIEW_OCC) - GroupPoints->CheckButton1->setEnabled(true); - else - GroupPoints->CheckButton1->setEnabled(false); - return; + /* Select sub shapes mode not checked */ + updateButtonState(); + SubShapeToggled(); } - //================================================================================= -// function : enterEvent() +// function : NumberOfSubShapes() // purpose : //================================================================================= -void EntityGUI_SubShapeDlg::enterEvent(QEvent* e) +unsigned int EntityGUI_SubShapeDlg::NumberOfSubShapes(const TopoDS_Shape& S, + const int shapeType) const { - if(GroupConstructors->isEnabled()) - return; - this->ActivateThisDialog(); - return; -} + if (S.IsNull()) + return 0; + + unsigned int index = 0; + TopTools_MapOfShape M; + + if (S.ShapeType() == TopAbs_COMPOUND && + (TopAbs_ShapeEnum(shapeType) == TopAbs_SHAPE || + TopAbs_ShapeEnum(shapeType) == TopAbs_COMPSOLID || + TopAbs_ShapeEnum(shapeType) == TopAbs_COMPOUND)) { + TopoDS_Iterator It(S, Standard_True, Standard_True); + for (; It.More(); It.Next()) { + if (M.Add(It.Value())) { + if (TopAbs_ShapeEnum(shapeType) == TopAbs_SHAPE || + TopAbs_ShapeEnum(shapeType) == It.Value().ShapeType()) { + index++; + } + } + } + } + else { + TopExp_Explorer Exp (S, TopAbs_ShapeEnum(shapeType)); + for (; Exp.More(); Exp.Next()) { + if (M.Add(Exp.Current())) { + index++; + } + } + } + M.Clear(); + return index; +} //================================================================================= -// function : closeEvent() +// function : updateButtonState // purpose : //================================================================================= -void EntityGUI_SubShapeDlg::closeEvent(QCloseEvent* e) +void EntityGUI_SubShapeDlg::updateButtonState() { - /* same than click on cancel button */ - this->ClickOnCancel(); - return; + if (SUIT_Session::session()->activeApplication()->desktop()->activeWindow()->getViewManager()->getType() != OCCViewer_Viewer::Type() || + myObject->_is_nil() || shapeType() == TopAbs_SHAPE || shapeType() == TopAbs_COMPOUND) { + GroupPoints->CheckButton1->setChecked(false); + GroupPoints->CheckButton1->setEnabled(false); + } + else + GroupPoints->CheckButton1->setEnabled(true); } +//================================================================================= +// function : isAllSubShapes +// purpose : +//================================================================================= +bool EntityGUI_SubShapeDlg::isAllSubShapes() const +{ + return !GroupPoints->CheckButton1->isChecked() || !GroupPoints->CheckButton1->isEnabled(); +} //================================================================================= -// function : ResetStateOfDialog() -// purpose : Completely reset the state of method including local context +// function : shapeType +// purpose : //================================================================================= -void EntityGUI_SubShapeDlg::ResetStateOfDialog() +int EntityGUI_SubShapeDlg::shapeType() const { - if(myAbort == true) { - myOkShape = false; - myEditCurrentArgument->setText(""); - } + int type = GroupPoints->ComboBox1->currentIndex(); - int SelectedShapeType = GroupPoints->ComboBox1->currentItem(); - int count = GroupPoints->ComboBox1->count(); - if(myWithShape) - count = count - 1; + if (myObject->_is_nil()) + return type; - /* type for sub shape selection */ - GroupPoints->ComboBox1->clear(); - GroupPoints->ComboBox1->insertItem("Compound"); - GroupPoints->ComboBox1->insertItem("Compsolid"); - GroupPoints->ComboBox1->insertItem("Solid"); - GroupPoints->ComboBox1->insertItem("Shell"); - GroupPoints->ComboBox1->insertItem("Face"); - GroupPoints->ComboBox1->insertItem("Wire"); - GroupPoints->ComboBox1->insertItem("Edge"); - GroupPoints->ComboBox1->insertItem("Vertex"); - GroupPoints->ComboBox1->insertItem("Shape"); - myWithShape=true; - GroupPoints->ComboBox1->setCurrentItem(8 - count + SelectedShapeType); - myOkSelectSubMode = false; - - /* unpress buttons : due to abort box*/ - buttonApply->setDown(FALSE); - buttonOk->setDown(FALSE); - GroupPoints->CheckButton1->setChecked(FALSE); - - /* Close its local contact if opened */ - if(QAD_Application::getDesktop()->getActiveStudy()->getActiveStudyFrame()->getTypeView() == VIEW_OCC) { - OCCViewer_Viewer3d* v3d = ((OCCViewer_ViewFrame*)QAD_Application::getDesktop()->getActiveStudy()->getActiveStudyFrame()->getRightFrame()->getViewFrame())->getViewer(); - myIC = v3d->getAISContext(); - if(myUseLocalContext) { - myIC->CloseLocalContext(myLocalContextId); - myUseLocalContext = false; - } - DisplayGUI* myDisplayGUI = new DisplayGUI(); - myDisplayGUI->OnDisplayAll(true); + // Solving PAL5590 + type += myShape.ShapeType() + 1; + if (myShape.ShapeType() == TopAbs_COMPOUND && + NumberOfSubShapes(myShape, TopAbs_COMPOUND) > 0) { + type--; } - return; -} + return type; +} //================================================================================= -// function : AllOrNotAll() -// purpose : Allow user selection of all or only selected sub shapes -// : Called when 'CheckButton1' state change +// function : showOnlySelected +// purpose : //================================================================================= -void EntityGUI_SubShapeDlg::AllOrNotAll() +void EntityGUI_SubShapeDlg::showOnlySelected() { - /* No sub shape selection if main shape not selected */ - if(!myOkShape) { - this->ResetStateOfDialog(); - QAD_Application::getDesktop()->putInfo(tr("GEOM_PRP_SELECT_FIRST")); + if (CORBA::is_nil(myObject) || isAllSubShapes()) return; - } - - if(myShapeType ==TopAbs_SHAPE && myShape.ShapeType()==TopAbs_COMPOUND) { - /* Select sub shapes mode not checked */ - myOkSelectSubMode = false; - GroupPoints->CheckButton1->setChecked( FALSE ); - //no meaning to allow user selection for type = shape - //TODO - add another message - //QAD_Application::getDesktop()->putInfo(tr("GEOM_PRP_SELECT_FIRST")) ; + + QPushButton* send = (QPushButton*)sender(); + if (send == GroupPoints->PushButton4) { + activateSelection(); return; } - myOkSelectSubMode = GroupPoints->CheckButton1->isChecked(); + LightApp_SelectionMgr* aSelMgr = myGeomGUI->getApp()->selectionMgr(); + SALOME_ListIO aSelList; + aSelMgr->selectedObjects(aSelList); - if(QAD_Application::getDesktop()->getActiveStudy()->getActiveStudyFrame()->getTypeView() == VIEW_OCC) { - OCCViewer_Viewer3d* v3d = ((OCCViewer_ViewFrame*)QAD_Application::getDesktop()->getActiveStudy()->getActiveStudyFrame()->getRightFrame()->getViewFrame())->getViewer(); - myIC = v3d->getAISContext(); + GEOM_Displayer* aDisplayer = getDisplayer(); - if(myUseLocalContext) { - myIC->CloseLocalContext(myLocalContextId); - myUseLocalContext = false; - } - DisplayGUI* myDisplayGUI = new DisplayGUI(); - myDisplayGUI->OnDisplayAll(true); + if (send == GroupPoints->PushButton3) { + aDisplayer->Erase(aSelList, /*forced=*/false, /*updateViewer=*/true); } else { - QAD_Application::getDesktop()->putInfo(tr("GEOM_PRP_NOT_FOR_VTK_VIEWER")); - return; - } + // Mantis issue 0021421: do not hide main shape, if explode on VERTEX + SALOME_View* view = GEOM_Displayer::GetActiveView(); + if (view) { + CORBA::String_var aMainEntry = myObject->GetStudyEntry(); + Handle(SALOME_InteractiveObject) io = + new SALOME_InteractiveObject (aMainEntry.in(), "GEOM", "TEMP_IO"); + if (view->isVisible(io)) myIsHiddenMain = true; + } - if(myOkShape && myOkSelectSubMode) { - /* local context is defined into the method */ - DisplayGUI* myDisplayGUI = new DisplayGUI(); - myDisplayGUI->PrepareSubShapeSelection(myShapeType, myLocalContextId); - myUseLocalContext = true; - QAD_Application::getDesktop()->putInfo(tr("GEOM_PRP_SELECT_FACE")); + aDisplayer->EraseAll(/*forced = false, updateViewer = true*/); + aDisplayer->Display(aSelList, true); + + // Mantis issue 0021421: do not hide main shape, if explode on VERTEX + if ((TopAbs_ShapeEnum)shapeType() == TopAbs_VERTEX && myIsHiddenMain) { + aDisplayer->Display(myObject); + } } - return; } +//================================================================================= +// function : getSelectedSubshapes +// purpose : +//================================================================================= +int EntityGUI_SubShapeDlg::getSelectedSubshapes (TColStd_IndexedMapOfInteger& theMapIndex) +{ + theMapIndex.Clear(); + + SalomeApp_Application* app = myGeomGUI->getApp(); + if (!app || myObject->_is_nil()) + return 0; + + LightApp_SelectionMgr* aSelMgr = app->selectionMgr(); + SALOME_ListIO aSelList; + aSelMgr->selectedObjects(aSelList); + + // try to find out and process the global selection + // (of not published objects and of published sub-shapes) + { + SALOME_ListIteratorOfListIO anIter (aSelList); + for (int i = 0; anIter.More(); anIter.Next(), i++) + { + Handle(SALOME_InteractiveObject) anIObj = anIter.Value(); + QString anEntry = anIObj->getEntry(); + QString str = "_"; + int index = anEntry.lastIndexOf(str); + if (index > 0) // selection among special preview + { + anEntry.remove(0, index+1); + int anIndex = anEntry.toInt(); + if (anIndex) + theMapIndex.Add(anIndex); + } + else // selection among published shapes + { + SalomeApp_Study* appStudy = dynamic_cast(app->activeStudy()); + if (!appStudy) return 0; + _PTR(Study) aStudy = appStudy->studyDS(); + + _PTR(SObject) aSObj (aStudy->FindObjectID(anEntry.toLatin1().constData())); + GEOM::GEOM_Object_var aGeomObj = + GEOM::GEOM_Object::_narrow(GeometryGUI::ClientSObjectToObject(aSObj)); + TopoDS_Shape aShape; + if (GEOMBase::GetShape(aGeomObj, aShape)) { + if (aGeomObj->GetType() == GEOM_GROUP || aShape.ShapeType() == (TopAbs_ShapeEnum)shapeType()) { + TopTools_IndexedMapOfShape aMainMap; + TopExp::MapShapes(myShape, aMainMap); + + TopExp_Explorer anExp (aShape, (TopAbs_ShapeEnum)shapeType()); + for (; anExp.More(); anExp.Next()) { + TopoDS_Shape aSubShape = anExp.Current(); + int anIndex = aMainMap.FindIndex(aSubShape); + if (anIndex >= 0) { + theMapIndex.Add(anIndex); + } + } + } + } + } + } // for aSelList + } + + return theMapIndex.Extent(); +} //================================================================================= -// function : ComboTextChanged() -// purpose : +// function : activateSelection +// purpose : Activate selection in accordance with myEditCurrentArgument //================================================================================= -void EntityGUI_SubShapeDlg::ComboTextChanged() +void EntityGUI_SubShapeDlg::activateSelection() { - if(myOkShape) - myShapeType = GroupPoints->ComboBox1->currentItem() + myShape.ShapeType() + 1; - else - myShapeType = GroupPoints->ComboBox1->currentItem(); + erasePreview(false); - /* Select sub shapes mode not checked */ - GroupPoints->CheckButton1->setChecked(FALSE); - myOkSelectSubMode = FALSE; + // local selection + if (!myObject->_is_nil() && !isAllSubShapes()) + { + GEOM_Displayer* aDisplayer = getDisplayer(); + + // Mantis issue 0021421: do not hide main shape, if explode on VERTEX + if ((TopAbs_ShapeEnum)shapeType() == TopAbs_VERTEX) { + if (myIsHiddenMain) + aDisplayer->Display(myObject); + } + else { + SALOME_View* view = GEOM_Displayer::GetActiveView(); + if (view) { + CORBA::String_var aMainEntry = myObject->GetStudyEntry(); + Handle(SALOME_InteractiveObject) io = + new SALOME_InteractiveObject (aMainEntry.in(), "GEOM", "TEMP_IO"); + if (view->isVisible(io)) { + aDisplayer->Erase(myObject, false, false); + myIsHiddenMain = true; + } + } + } + + int prevDisplayMode = aDisplayer->SetDisplayMode(0); + + SUIT_ViewWindow* aViewWindow = 0; + SUIT_Study* activeStudy = SUIT_Session::session()->activeApplication()->activeStudy(); + if (activeStudy) + aViewWindow = SUIT_Session::session()->activeApplication()->desktop()->activeWindow(); + if (aViewWindow == 0) return; + + SUIT_ViewManager* aViewManager = aViewWindow->getViewManager(); + if (aViewManager->getType() != OCCViewer_Viewer::Type() && + aViewManager->getType() != SVTK_Viewer::Type()) + return; - if(QAD_Application::getDesktop()->getActiveStudy()->getActiveStudyFrame()->getTypeView() == VIEW_OCC) { - OCCViewer_Viewer3d* v3d = ((OCCViewer_ViewFrame*)QAD_Application::getDesktop()->getActiveStudy()->getActiveStudyFrame()->getRightFrame()->getViewFrame())->getViewer(); - myIC = v3d->getAISContext(); + SUIT_ViewModel* aViewModel = aViewManager->getViewModel(); + SALOME_View* aView = dynamic_cast(aViewModel); + if (aView == 0) return; - if(myUseLocalContext) { - myIC->CloseLocalContext(myLocalContextId); - myUseLocalContext = false; + //TopoDS_Shape aMainShape = GEOM_Client::get_client().GetShape(GeometryGUI::GetGeomGen(), myObject); + + TopTools_IndexedMapOfShape aSubShapesMap; + TopExp::MapShapes(myShape, aSubShapesMap); + CORBA::String_var aMainEntry = myObject->GetStudyEntry(); + QString anEntryBase = aMainEntry.in(); + + TopExp_Explorer anExp (myShape, (TopAbs_ShapeEnum)shapeType()); + for (; anExp.More(); anExp.Next()) + { + TopoDS_Shape aSubShape = anExp.Current(); + int index = aSubShapesMap.FindIndex(aSubShape); + QString anEntry = anEntryBase + QString("_%1").arg(index); + + SALOME_Prs* aPrs = aDisplayer->buildSubshapePresentation(aSubShape, anEntry, aView); + if (aPrs) { + displayPreview(aPrs, true, false); // append, do not update + } } - DisplayGUI* myDisplayGUI = new DisplayGUI(); - myDisplayGUI->OnDisplayAll(true); + aDisplayer->UpdateViewer(); + aDisplayer->SetDisplayMode(prevDisplayMode); } - return; + + globalSelection(GEOM_ALLSHAPES); } +//================================================================================= +// function : createOperation +// purpose : +//================================================================================= +GEOM::GEOM_IOperations_ptr EntityGUI_SubShapeDlg::createOperation() +{ + return getGeomEngine()->GetIShapesOperations(getStudyId()); +} //================================================================================= -// function : NumberOfSubShapes() +// function : isValid // purpose : //================================================================================= -unsigned int EntityGUI_SubShapeDlg::NumberOfSubShapes(const TopoDS_Shape& S, const int shapeType) +bool EntityGUI_SubShapeDlg::isValid (QString& msg) { - if(S.IsNull()) - return 0; - - unsigned int index = 0; - TopExp_Explorer Exp(S, TopAbs_ShapeEnum(shapeType)); - TopTools_MapOfShape M; - while(Exp.More()) { - if(M.Add(Exp.Current())) - index++; - Exp.Next(); + bool isOk = false; + + if (myObject->_is_nil()) { + updateButtonState(); + return isOk; } - M.Clear(); - return index; + + if (isAllSubShapes()) + isOk = true; + else { + TColStd_IndexedMapOfInteger aMapIndex; + int nbSel = getSelectedSubshapes(aMapIndex); + isOk = nbSel > 0; + + if (!isOk) + msg += tr("NO_SUBSHAPES_SELECTED"); + } + + return isOk; +} + +//================================================================================= +// function : execute +// purpose : +//================================================================================= +bool EntityGUI_SubShapeDlg::execute (ObjectList& objects) +{ + GEOM::GEOM_IShapesOperations_var anOper = GEOM::GEOM_IShapesOperations::_narrow(getOperation()); + + if (!isAllSubShapes()) { + // manual selection + TColStd_IndexedMapOfInteger aMapIndex; + int nbSel = getSelectedSubshapes(aMapIndex); + + if (nbSel > 0) { + int i; + + GEOM::ListOfLong_var anArray = new GEOM::ListOfLong; + anArray->length(nbSel); + + for (i = 1; i <= nbSel; i++) + anArray[i - 1] = aMapIndex.FindKey(i); + + GEOM::ListOfGO_var aList = anOper->MakeSubShapes(myObject, anArray); + int n = aList->length(); + for (i = 0; i < n; i++) + objects.push_back(GEOM::GEOM_Object::_duplicate(aList[i])); + } + } + else { + GEOM::ListOfGO_var aList = anOper->ExtractSubShapes(myObject, shapeType(), true); + if (!aList->length()) + return false; + for (int i = 0, n = aList->length(); i < n; i++) + objects.push_back(GEOM::GEOM_Object::_duplicate(aList[i])); + } + + return objects.size(); +} + +//================================================================ +// Function : getFather +// Purpose : Get father object for object to be added in study +// (called with addInStudy method) +//================================================================ +GEOM::GEOM_Object_ptr EntityGUI_SubShapeDlg::getFather(GEOM::GEOM_Object_ptr) +{ + return myObject; +} + +//================================================================ +// Function : getNewObjectName +// Purpose : +//================================================================ +QString EntityGUI_SubShapeDlg::getNewObjectName() const +{ + return QString::null; }