X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FEntityGUI%2FEntityGUI_SubShapeDlg.cxx;h=d46c3635311e5383347b11fa5f7333671d568c76;hb=f0a071156a96bbae014d319b433d62e8b93d1f24;hp=ff6304c63a84399dbd0d83d30173c58c8ea31701;hpb=d3dd282390888d7dc091ba2c2ffe7923bd7458e6;p=modules%2Fgeom.git diff --git a/src/EntityGUI/EntityGUI_SubShapeDlg.cxx b/src/EntityGUI/EntityGUI_SubShapeDlg.cxx index ff6304c63..d46c36353 100644 --- a/src/EntityGUI/EntityGUI_SubShapeDlg.cxx +++ b/src/EntityGUI/EntityGUI_SubShapeDlg.cxx @@ -1,44 +1,59 @@ -// 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. +// +// 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 // -// File : EntityGUI_SubShapeDlg.cxx -// Author : Lucien PIGNOLONI -// Module : GEOM -// $Header$ + +// GEOM GEOMGUI : GUI for Geometry component +// File : EntityGUI_SubShapeDlg.cxx +// Author : Lucien PIGNOLONI, Open CASCADE S.A.S. #include "EntityGUI_SubShapeDlg.h" -#include "GEOM_Displayer.h" -#include "QAD_RightFrame.h" -#include "QAD_Desktop.h" -#include "SALOME_ListIteratorOfListIO.hxx" +#include +#include +#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 @@ -47,35 +62,49 @@ // 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, SALOME_Selection* Sel, bool modal, WFlags fl) - :GEOMBase_Skeleton(parent, name, Sel, modal, fl) +EntityGUI_SubShapeDlg::EntityGUI_SubShapeDlg(GeometryGUI* theGeometryGUI, QWidget* parent, + bool modal, Qt::WindowFlags fl) + : GEOMBase_Skeleton(theGeometryGUI, parent, modal, fl) { - 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); - GroupPoints->LineEdit1->setReadOnly( true ); - - 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); /***************************************************************/ + setIsOptimizedBrowsing(true); + + setHelpFileName("create_explode_page.html"); + + mainFrame()->GroupBoxName->hide(); + Init(); } - //================================================================================= // function : ~EntityGUI_SubShapeDlg() // purpose : Destroys the object and frees any allocated resources @@ -84,7 +113,6 @@ EntityGUI_SubShapeDlg::~EntityGUI_SubShapeDlg() { } - //================================================================================= // function : Init() // purpose : @@ -98,40 +126,76 @@ void EntityGUI_SubShapeDlg::Init() myWithShape = true; /* 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"); - - 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->ComboBox1, SIGNAL(activated(int)), this, SLOT(ComboTextChanged())); connect(GroupPoints->CheckButton1, SIGNAL(stateChanged(int)), this, SLOT(SubShapeToggled())); - - connect(mySelection, SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument())); - updateButtonState(); + connect(GroupPoints->PushButton2, SIGNAL(clicked()), this, SLOT(showOnlySelected())); + connect(GroupPoints->PushButton3, SIGNAL(clicked()), this, SLOT(showOnlySelected())); + connect(GroupPoints->PushButton4, SIGNAL(clicked()), this, SLOT(showOnlySelected())); + connect(myGeomGUI->getApp()->selectionMgr(), + SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument())); + + updateButtonState(); + resize(100,100); SelectionIntoArgument(); } +//================================================================================= +// function : enterEvent() +// purpose : +//================================================================================= +void EntityGUI_SubShapeDlg::enterEvent(QEvent*) +{ + if (!mainFrame()->GroupConstructors->isEnabled()) + ActivateThisDialog(); +} + +//================================================================================= +// 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 : ClickOnOk() @@ -139,149 +203,161 @@ void EntityGUI_SubShapeDlg::Init() //================================================================================= void EntityGUI_SubShapeDlg::ClickOnOk() { - if ( ClickOnApply() ) + setIsApplyAndClose(true); + + SUIT_Session::session()->activeApplication()->putInfo(""); + + /* Explode all sub shapes */ + bool isOk = true; + 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) + isOk = false; /* aborted */ + } + } + + if (isOk) + isOk = onAccept(); + + if (isOk) ClickOnCancel(); } - //================================================================================= // function : ClickOnApply() // purpose : //================================================================================= bool EntityGUI_SubShapeDlg::ClickOnApply() { - QAD_Application::getDesktop()->putInfo(tr("")); - + SUIT_Session::session()->activeApplication()->putInfo(""); + /* Explode all sub shapes */ - if( isAllSubShapes() ) { + if (isAllSubShapes()) { /* More than 30 subshapes : ask confirmation */ unsigned int nb = NumberOfSubShapes(myShape, shapeType()); - if(nb > 30) { + 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) + if (QMessageBox::warning(this, caption, text, button0, button1) != 0) return false; /* aborted */ } } - return onAccept(); -} + 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() { - if ( !isAllSubShapes() ) + if (!isAllSubShapes()) return; ResetStateOfDialog(); QString aString = ""; /* name of selection */ - int nbSel = GEOMBase::GetNameOfSelectedIObjects( mySelection, aString, true ); - if( nbSel != 1 ) + LightApp_SelectionMgr* aSelMgr = myGeomGUI->getApp()->selectionMgr(); + SALOME_ListIO aSelList; + aSelMgr->selectedObjects(aSelList); + + int nbSel = GEOMBase::GetNameOfSelectedIObjects(aSelList, aString, true); + if (nbSel != 1) return; - TopoDS_Shape S; - Handle(SALOME_InteractiveObject) IO = mySelection->firstIObject(); - if ( !IO->hasEntry() ) - { - QAD_Application::getDesktop()->putInfo( tr( "GEOM_PRP_SHAPE_IN_STUDY" ) ); + Handle(SALOME_InteractiveObject) IO = aSelList.First(); + if (!IO->hasEntry()) { + SUIT_Session::session()->activeApplication()->putInfo(tr("GEOM_PRP_SHAPE_IN_STUDY")); updateButtonState(); return; } - if ( !myGeomBase->GetTopoFromSelection( mySelection, S ) || - S.IsNull() || - S.ShapeType() == TopAbs_VERTEX ) - { + TopoDS_Shape S = GEOMBase::GetTopoFromSelection(aSelList); + if (S.IsNull() || S.ShapeType() == TopAbs_VERTEX) { + myObject = GEOM::GEOM_Object::_nil(); updateButtonState(); return; } - - Standard_Boolean testResult; - myObject = GEOMBase::ConvertIOinGEOMObject( IO, testResult ); - if ( !testResult || myObject->_is_nil() ) - { + myObject = GEOMBase::ConvertIOinGEOMObject(IO); + if (myObject->_is_nil()) { updateButtonState(); return; } myShape = S; - GroupPoints->LineEdit1->setText( aString ); + GroupPoints->LineEdit1->setText(aString); - - int SelectedShapeType = GroupPoints->ComboBox1->currentItem(); + int SelectedShapeType = GroupPoints->ComboBox1->currentIndex(); int count = GroupPoints->ComboBox1->count(); - if ( myWithShape ) + if (myWithShape) count = count - 1; int i = 0; // Solving PAL5590 - if ( myShape.ShapeType() == TopAbs_COMPOUND ) { + if (myShape.ShapeType() == TopAbs_COMPOUND) { unsigned int nb = NumberOfSubShapes(myShape, TopAbs_COMPOUND); if (nb > 0) i++; } - while ( i <= myShape.ShapeType()) - { - GroupPoints->ComboBox1->removeItem( 0 ); + while (i <= myShape.ShapeType()) { + GroupPoints->ComboBox1->removeItem(0); i++; } - if ( myShape.ShapeType() == TopAbs_COMPOUND ) - { - if ( myWithShape == false ) - { - GroupPoints->ComboBox1->insertItem( "Shape" ); + 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 ); + else { + if (myWithShape == true) { + GroupPoints->ComboBox1->removeItem(GroupPoints->ComboBox1->count() - 1); myWithShape = false; } } int count1 = GroupPoints->ComboBox1->count(); - if ( myWithShape ) + if (myWithShape) count1 = count1 - 1; - if ( SelectedShapeType > myShape.ShapeType() ) - { - if ( SelectedShapeType == 8 ) - { - if ( myShape.ShapeType() != TopAbs_COMPOUND ) - { - GroupPoints->ComboBox1->setCurrentItem( 0 ); + if (SelectedShapeType > myShape.ShapeType()) { + if (SelectedShapeType == 8) { + if (myShape.ShapeType() != TopAbs_COMPOUND) { + GroupPoints->ComboBox1->setCurrentIndex(0); ComboTextChanged(); } } else - GroupPoints->ComboBox1->setCurrentItem(count1 - count + SelectedShapeType); + GroupPoints->ComboBox1->setCurrentIndex(count1 - count + SelectedShapeType); } - else - { - GroupPoints->ComboBox1->setCurrentItem( 0 ); + else { + GroupPoints->ComboBox1->setCurrentIndex(0); ComboTextChanged(); } updateButtonState(); } - //================================================================================= // function : SetEditCurrentArgument() // purpose : @@ -290,21 +366,20 @@ void EntityGUI_SubShapeDlg::SetEditCurrentArgument() { GroupPoints->LineEdit1->setFocus(); myEditCurrentArgument = GroupPoints->LineEdit1; - - GroupPoints->CheckButton1->setChecked( FALSE ); + + GroupPoints->CheckButton1->setChecked(false); SubShapeToggled(); SelectionIntoArgument(); } - //================================================================================= // function : LineEditReturnPressed() // purpose : //================================================================================= void EntityGUI_SubShapeDlg::LineEditReturnPressed() -{ +{ QLineEdit* send = (QLineEdit*)sender(); - if(send == GroupPoints->LineEdit1) + if (send == GroupPoints->LineEdit1) SetEditCurrentArgument(); else return; @@ -312,43 +387,6 @@ void EntityGUI_SubShapeDlg::LineEditReturnPressed() GEOMBase_Skeleton::LineEditReturnPressed(); } - -//================================================================================= -// function : DeactivateActiveDialog() -// purpose : -//================================================================================= -void EntityGUI_SubShapeDlg::DeactivateActiveDialog() -{ - if(GroupConstructors->isEnabled()) { - GEOMBase_Skeleton::DeactivateActiveDialog(); - } -} - - -//================================================================================= -// function : ActivateThisDialog() -// purpose : -//================================================================================= -void EntityGUI_SubShapeDlg::ActivateThisDialog() -{ - GEOMBase_Skeleton::ActivateThisDialog(); - connect(mySelection, SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument())); - SubShapeToggled(); - updateButtonState(); -} - - -//================================================================================= -// function : enterEvent() -// purpose : -//================================================================================= -void EntityGUI_SubShapeDlg::enterEvent(QEvent* e) -{ - if(GroupConstructors->isEnabled()) - return; - ActivateThisDialog(); -} - //================================================================================= // function : ResetStateOfDialog() // purpose : Completely reset the state of method including local context @@ -359,32 +397,33 @@ void EntityGUI_SubShapeDlg::ResetStateOfDialog() myShape.Nullify(); myEditCurrentArgument->setText(""); - int SelectedShapeType = GroupPoints->ComboBox1->currentItem(); + int SelectedShapeType = GroupPoints->ComboBox1->currentIndex(); int count = GroupPoints->ComboBox1->count(); - if ( myWithShape ) + if (myWithShape) count = count - 1; /* 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"); - + 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->setCurrentItem( 8 - count + SelectedShapeType ); - ComboTextChanged(); + + 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 @@ -392,31 +431,30 @@ void EntityGUI_SubShapeDlg::ResetStateOfDialog() //================================================================================= void EntityGUI_SubShapeDlg::SubShapeToggled() { - if ( isAllSubShapes() ) - globalSelection( GEOM_ALLSHAPES ); - else - localSelection( myObject, shapeType() ); -} + GroupPoints->PushButton2->setEnabled(!isAllSubShapes()); + GroupPoints->PushButton3->setEnabled(!isAllSubShapes()); + GroupPoints->PushButton4->setEnabled(!isAllSubShapes()); + activateSelection(); +} //================================================================================= // function : ComboTextChanged() -// purpose : +// purpose : //================================================================================= void EntityGUI_SubShapeDlg::ComboTextChanged() { /* Select sub shapes mode not checked */ updateButtonState(); - SubShapeToggled(); + SubShapeToggled(); } - //================================================================================= // function : NumberOfSubShapes() // purpose : //================================================================================= -unsigned int EntityGUI_SubShapeDlg::NumberOfSubShapes (const TopoDS_Shape& S, - const int shapeType) const +unsigned int EntityGUI_SubShapeDlg::NumberOfSubShapes(const TopoDS_Shape& S, + const int shapeType) const { if (S.IsNull()) return 0; @@ -425,19 +463,20 @@ unsigned int EntityGUI_SubShapeDlg::NumberOfSubShapes (const TopoDS_Shape& S, 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); + (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()) { + TopAbs_ShapeEnum(shapeType) == It.Value().ShapeType()) { index++; } } } - } else { + } + else { TopExp_Explorer Exp (S, TopAbs_ShapeEnum(shapeType)); for (; Exp.More(); Exp.Next()) { if (M.Add(Exp.Current())) { @@ -456,13 +495,13 @@ unsigned int EntityGUI_SubShapeDlg::NumberOfSubShapes (const TopoDS_Shape& S, //================================================================================= void EntityGUI_SubShapeDlg::updateButtonState() { - if ( QAD_Application::getDesktop()->getActiveStudy()->getActiveStudyFrame()->getTypeView() != VIEW_OCC || - myObject->_is_nil() || shapeType() == TopAbs_SHAPE || shapeType() == TopAbs_COMPOUND ) { - GroupPoints->CheckButton1->setChecked( FALSE ); - GroupPoints->CheckButton1->setEnabled( FALSE ); + 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 ); + GroupPoints->CheckButton1->setEnabled(true); } //================================================================================= @@ -480,7 +519,7 @@ bool EntityGUI_SubShapeDlg::isAllSubShapes() const //================================================================================= int EntityGUI_SubShapeDlg::shapeType() const { - int type = GroupPoints->ComboBox1->currentItem(); + int type = GroupPoints->ComboBox1->currentIndex(); if (myObject->_is_nil()) return type; @@ -488,46 +527,198 @@ int EntityGUI_SubShapeDlg::shapeType() const // Solving PAL5590 type += myShape.ShapeType() + 1; if (myShape.ShapeType() == TopAbs_COMPOUND && - NumberOfSubShapes(myShape, TopAbs_COMPOUND) > 0) { + NumberOfSubShapes(myShape, TopAbs_COMPOUND) > 0) { type--; } return type; } +//================================================================================= +// function : showOnlySelected +// purpose : +//================================================================================= +void EntityGUI_SubShapeDlg::showOnlySelected() +{ + if (CORBA::is_nil(myObject) || isAllSubShapes()) + return; + + QPushButton* send = (QPushButton*)sender(); + if (send == GroupPoints->PushButton4) { + activateSelection(); + return; + } + + LightApp_SelectionMgr* aSelMgr = myGeomGUI->getApp()->selectionMgr(); + SALOME_ListIO aSelList; + aSelMgr->selectedObjects(aSelList); + + GEOM_Displayer* aDisplayer = getDisplayer(); + + if (send == GroupPoints->PushButton3) { + aDisplayer->Erase(aSelList, false, true); + } + else { + aDisplayer->EraseAll(); + aDisplayer->Display(aSelList, true); + } +} + +//================================================================================= +// 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 : activateSelection +// purpose : Activate selection in accordance with myEditCurrentArgument +//================================================================================= +void EntityGUI_SubShapeDlg::activateSelection() +{ + erasePreview(false); + + // local selection + if (!myObject->_is_nil() && !isAllSubShapes()) + { + GEOM_Displayer* aDisplayer = getDisplayer(); + aDisplayer->Erase(myObject, false, false); + + 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; + + SUIT_ViewModel* aViewModel = aViewManager->getViewModel(); + SALOME_View* aView = dynamic_cast(aViewModel); + if (aView == 0) return; + + //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 + } + } + aDisplayer->UpdateViewer(); + aDisplayer->SetDisplayMode(prevDisplayMode); + } + + globalSelection(GEOM_ALLSHAPES); +} + //================================================================================= // function : createOperation // purpose : //================================================================================= GEOM::GEOM_IOperations_ptr EntityGUI_SubShapeDlg::createOperation() { - return getGeomEngine()->GetIShapesOperations( getStudyId() ); + return getGeomEngine()->GetIShapesOperations(getStudyId()); } //================================================================================= // function : isValid // purpose : //================================================================================= -bool EntityGUI_SubShapeDlg::isValid( QString& msg ) +bool EntityGUI_SubShapeDlg::isValid (QString& msg) { bool isOk = false; - if ( !myObject->_is_nil() ) { - if ( isAllSubShapes() ) - isOk = true; - else if ( mySelection->IObjectCount() == 1 ) { - Standard_Boolean aResult = Standard_False; - GEOM::GEOM_Object_var anObj = - GEOMBase::ConvertIOinGEOMObject( mySelection->firstIObject(), aResult ); - - if ( aResult && !anObj->_is_nil() ) { - TColStd_IndexedMapOfInteger aMapIndex; - mySelection->GetIndex( mySelection->firstIObject(), aMapIndex ); - isOk = aMapIndex.Extent() > 0; - if ( !isOk ) - msg += tr( "NO_SUBSHAPES_SELECTED" ); - } - } + + if (myObject->_is_nil()) { + updateButtonState(); + return isOk; + } + + if (isAllSubShapes()) + isOk = true; + else { + TColStd_IndexedMapOfInteger aMapIndex; + int nbSel = getSelectedSubshapes(aMapIndex); + isOk = nbSel > 0; + + if (!isOk) + msg += tr("NO_SUBSHAPES_SELECTED"); } + return isOk; } @@ -535,50 +726,56 @@ bool EntityGUI_SubShapeDlg::isValid( QString& msg ) // function : execute // purpose : //================================================================================= -bool EntityGUI_SubShapeDlg::execute( ObjectList& objects ) +bool EntityGUI_SubShapeDlg::execute (ObjectList& objects) { - GEOM::ListOfGO_var aList = GEOM::GEOM_IShapesOperations::_narrow( - getOperation() )->MakeExplode( myObject, shapeType(), false ); - - if ( !aList->length() ) - return false; - - // Throw away sub-shapes not selected by user if not in preview mode - // and manual selection is active - if ( !isAllSubShapes() ) - { - if ( mySelection->IObjectCount() == 1 ) { - Standard_Boolean aResult = Standard_False; - GEOM::GEOM_Object_var anObj = - GEOMBase::ConvertIOinGEOMObject( mySelection->firstIObject(), aResult ); + GEOM::GEOM_IShapesOperations_var anOper = GEOM::GEOM_IShapesOperations::_narrow(getOperation()); - if ( aResult && !anObj->_is_nil() ) { - TColStd_IndexedMapOfInteger aMapIndex; - mySelection->GetIndex( mySelection->firstIObject(), aMapIndex ); + if (!isAllSubShapes()) { + // manual selection + TColStd_IndexedMapOfInteger aMapIndex; + int nbSel = getSelectedSubshapes(aMapIndex); - GEOM::GEOM_ILocalOperations_var aLocOp = - getGeomEngine()->GetILocalOperations( getStudyId() ); + if (nbSel > 0) { + int i; - for ( int i = 0, n = aList->length(); i < n; i++ ) - if ( aMapIndex.Contains( aLocOp->GetSubShapeIndex( myObject, aList[i] ) ) ) - objects.push_back( GEOM::GEOM_Object::_duplicate( aList[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 - for ( int i = 0, n = aList->length(); 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 ) +// (called with addInStudy method) //================================================================ -GEOM::GEOM_Object_ptr EntityGUI_SubShapeDlg::getFather( GEOM::GEOM_Object_ptr ) +GEOM::GEOM_Object_ptr EntityGUI_SubShapeDlg::getFather(GEOM::GEOM_Object_ptr) { return myObject; } +//================================================================ +// Function : getNewObjectName +// Purpose : +//================================================================ +QString EntityGUI_SubShapeDlg::getNewObjectName() const +{ + return QString::null; +}