1 // Copyright (C) 2014-2024 CEA, EDF, OPEN CASCADE
3 // This library is free software; you can redistribute it and/or
4 // modify it under the terms of the GNU Lesser General Public
5 // License as published by the Free Software Foundation; either
6 // version 2.1 of the License, or (at your option) any later version.
8 // This library is distributed in the hope that it will be useful,
9 // but WITHOUT ANY WARRANTY; without even the implied warranty of
10 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11 // Lesser General Public License for more details.
13 // You should have received a copy of the GNU Lesser General Public
14 // License along with this library; if not, write to the Free Software
15 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
21 #include "RepairGUI_InspectObjectDlg.h"
25 #include <GEOM_Constants.h>
26 #include <GeometryGUI.h>
27 #include <GEOMUtils.hxx>
30 #include <SUIT_Session.h>
31 #include <SUIT_ResourceMgr.h>
32 #include <SUIT_Desktop.h>
33 #include <SUIT_ViewManager.h>
34 #include <SUIT_ViewWindow.h>
36 #include <LightApp_SelectionMgr.h>
38 #include <SalomeApp_Application.h>
39 #include <SalomeApp_DoubleSpinBox.h>
40 #include <SalomeApp_Study.h>
42 #include <OCCViewer_ViewModel.h>
43 #include <SVTK_ViewModel.h>
46 #include <BRep_Tool.hxx>
48 #include <TopExp_Explorer.hxx>
50 #include <TopoDS_Iterator.hxx>
51 #include <TopTools_IndexedMapOfShape.hxx>
52 #include <TopTools_MapOfShape.hxx>
55 #include <QButtonGroup>
57 #include <QGridLayout>
59 #include <QPushButton>
60 #include <QHeaderView>
61 #include <QItemDelegate>
63 #include <QRadioButton>
64 #include <QStackedLayout>
65 #include <QTreeWidgetItem>
67 // Shape type definitions (values are equal to corresponding types of TopAbs_ShapeEnum).
72 // Comparison type definitions
78 // Default tolerance values
79 #define DEFAULT_TOLERANCE_VALUE 1.e-07
81 //=================================================================================
82 // class : RepairGUI_InspectObjectDlg::TreeWidgetItem
83 // purpose : class for "Inspect Object" tree item creation
84 //=================================================================================
85 class RepairGUI_InspectObjectDlg::TreeWidgetItem : public QTreeWidgetItem
88 TreeWidgetItem(QTreeWidget*,
91 const Handle(SALOME_InteractiveObject)&,
92 double = DEFAULT_TOLERANCE_VALUE,
95 TreeWidgetItem(QTreeWidgetItem*,
99 double = DEFAULT_TOLERANCE_VALUE,
105 void setVisible( bool, QIcon& );
107 TopoDS_Shape getShape() const;
108 Handle(SALOME_InteractiveObject) getIO() const;
110 double getTolerance() const;
111 void setTolerance(double theTolerance);
115 TopoDS_Shape myShape;
116 Handle(SALOME_InteractiveObject) myIO;
121 RepairGUI_InspectObjectDlg::TreeWidgetItem::TreeWidgetItem
123 const QStringList &strings,
124 const TopoDS_Shape &shape,
125 const Handle(SALOME_InteractiveObject) &io,
128 : QTreeWidgetItem( view, strings, type ),
129 myIsVisible( false ),
132 myTolerance (theTolerance)
136 RepairGUI_InspectObjectDlg::TreeWidgetItem::TreeWidgetItem
137 (QTreeWidgetItem *parent,
138 const QStringList &strings,
139 const TopoDS_Shape &shape,
140 const QString &entry,
143 : QTreeWidgetItem( parent, strings, type ),
144 myIsVisible( false ),
146 myTolerance (theTolerance)
148 myIO = new SALOME_InteractiveObject( entry.toUtf8(), "GEOM", "TEMP_IO" );
149 setFlags( flags() | Qt::ItemIsEditable );
152 RepairGUI_InspectObjectDlg::TreeWidgetItem::~TreeWidgetItem()
156 bool RepairGUI_InspectObjectDlg::TreeWidgetItem::isVisible()
161 void RepairGUI_InspectObjectDlg::TreeWidgetItem::setVisible( bool isVisible, QIcon& icon )
163 myIsVisible = isVisible;
167 TopoDS_Shape RepairGUI_InspectObjectDlg::TreeWidgetItem::getShape() const
172 Handle(SALOME_InteractiveObject) RepairGUI_InspectObjectDlg::TreeWidgetItem::getIO() const
177 double RepairGUI_InspectObjectDlg::TreeWidgetItem::getTolerance() const
182 void RepairGUI_InspectObjectDlg::TreeWidgetItem::setTolerance(double theTolerance)
184 myTolerance = theTolerance;
187 //=================================================================================
188 // class : RepairGUI_InspectObjectDlg::Delegate
189 // purpose : class for "Inspect Object" tree item editing
190 //=================================================================================
191 class RepairGUI_InspectObjectDlg::Delegate : public QItemDelegate
194 Delegate( QObject* = 0 );
197 void setEditorData( QWidget*, const QModelIndex& ) const;
198 void setModelData( QWidget*, QAbstractItemModel*, const QModelIndex& ) const;
199 QWidget* createEditor( QWidget*, const QStyleOptionViewItem&, const QModelIndex& ) const;
202 RepairGUI_InspectObjectDlg::Delegate::Delegate( QObject* parent )
203 : QItemDelegate( parent )
207 RepairGUI_InspectObjectDlg::Delegate::~Delegate()
211 void RepairGUI_InspectObjectDlg::Delegate::setEditorData( QWidget* editor,
212 const QModelIndex& index ) const
214 QItemDelegate::setEditorData( editor, index );
215 editor->setProperty( "___name___", editor->property( "text" ) );
218 void RepairGUI_InspectObjectDlg::Delegate::setModelData( QWidget* editor,
219 QAbstractItemModel* model,
220 const QModelIndex& index ) const
222 QString aNewName = editor->property( "text" ).toString();
223 if ( aNewName.trimmed().isEmpty() )
224 editor->setProperty( "text", editor->property( "___name___" ) );
225 QItemDelegate::setModelData( editor, model, index );
228 QWidget* RepairGUI_InspectObjectDlg::Delegate::createEditor( QWidget* parent,
229 const QStyleOptionViewItem& option,
230 const QModelIndex& index ) const
232 return index.column() == 1 ? 0 : QItemDelegate::createEditor( parent, option, index );
235 //=================================================================================
236 // class : RepairGUI_InspectObjectDlg()
237 // purpose : Constructs a RepairGUI_InspectObjectDlg which is a child of 'parent'.
238 //=================================================================================
239 RepairGUI_InspectObjectDlg::RepairGUI_InspectObjectDlg(GeometryGUI *theGeomGUI, SUIT_Desktop* parent )
241 GEOMBase_Helper (parent),
242 myGeomGUI (theGeomGUI),
244 myFilteredTreeObjects (0),
245 myCurrentTreeObjects (0),
248 myShapeTypeBtnGrp (0),
249 myComparisonCompo (0),
251 myMinTolValLabel (0),
252 myMaxTolValLabel (0),
256 myIsSelectAll (false),
259 SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr();
260 QIcon iconSelect( resMgr->loadPixmap( "GEOM", tr( "ICON_SELECT" ) ) );
261 myVisible = QIcon( resMgr->loadPixmap( "SUIT", tr( "ICON_DATAOBJ_VISIBLE" ) ) );
262 myInvisible = QIcon( resMgr->loadPixmap( "SUIT", tr( "ICON_DATAOBJ_INVISIBLE" ) ) );
264 QPixmap anImageVtx(resMgr->loadPixmap("GEOM", tr("ICON_OBJBROWSER_VERTEX")));
265 QPixmap anImageEdge(resMgr->loadPixmap("GEOM", tr("ICON_OBJBROWSER_EDGE")));
266 QPixmap anImageFace(resMgr->loadPixmap("GEOM", tr("ICON_OBJBROWSER_FACE")));
268 setWindowTitle( tr( "GEOM_INSPECT_OBJECT_TITLE" ) );
269 setAttribute( Qt::WA_DeleteOnClose );
271 myViewWindow = myGeomGUI->getApp()->desktop()->activeWindow();
273 QGridLayout* topLayout = new QGridLayout( this );
274 topLayout->setMargin( 11 ); topLayout->setSpacing( 6 );
276 /********************** Inspected Object **********************/
278 QHBoxLayout* mainShapeLayout = new QHBoxLayout(this);
280 QLabel* label = new QLabel( tr( "GEOM_INSPECT_OBJECT_MAIN_SHAPE" ), this );
281 QPushButton* selBtn = new QPushButton(this);
282 selBtn->setIcon( iconSelect );
283 myEditMainShape = new QLineEdit(this);
284 myEditMainShape->setReadOnly(true);
286 mainShapeLayout->addWidget( label );
287 mainShapeLayout->addWidget( selBtn );
288 mainShapeLayout->addWidget( myEditMainShape );
290 /********************** Tolerance filter **********************/
292 myTolFilterGrp = new QGroupBox (tr("GEOM_INSPECT_TOLERANCE_FILTER"), this);
293 myShapeTypeBtnGrp = new QButtonGroup(myTolFilterGrp);
295 // Filter on shape type
296 QRadioButton *aVtx = new QRadioButton(tr("GEOM_VERTEX"), myTolFilterGrp);
297 QRadioButton *anEdge = new QRadioButton(tr("GEOM_EDGE"), myTolFilterGrp);
298 QRadioButton *aFace = new QRadioButton(tr("GEOM_FACE"), myTolFilterGrp);
300 aVtx->setIcon(anImageVtx);
301 anEdge->setIcon(anImageEdge);
302 aFace->setIcon(anImageFace);
303 myShapeTypeBtnGrp->addButton(aVtx, TYPE_VERTEX);
304 myShapeTypeBtnGrp->addButton(anEdge, TYPE_EDGE);
305 myShapeTypeBtnGrp->addButton(aFace, TYPE_FACE);
307 // Filter on sub-shape tolerance
308 QLabel *aTolLabel = new QLabel(tr("GEOM_TOLERANCE"), myTolFilterGrp);
309 QLabel *aMinTolLabel = new QLabel(tr("GEOM_MIN"), myTolFilterGrp);
310 QLabel *aMaxTolLabel = new QLabel(tr("GEOM_MAX"), myTolFilterGrp);
311 QGridLayout *aFilterLayout = new QGridLayout(myTolFilterGrp);
313 myMinTolValLabel = new QLabel(myTolFilterGrp);
314 myMaxTolValLabel = new QLabel(myTolFilterGrp);
315 myMinTolResetBtn = new QPushButton(tr("GEOM_INSPECT_RESET_MIN"), myTolFilterGrp);
316 myMaxTolResetBtn = new QPushButton(tr("GEOM_INSPECT_RESET_MAX"), myTolFilterGrp);
317 myComparisonCompo = new QComboBox(myTolFilterGrp);
318 myTolEdit = new SalomeApp_DoubleSpinBox(myTolFilterGrp);
319 myTolEdit->setMinimumWidth(120);
320 aFilterLayout->addWidget(aVtx, 0, 0);
321 aFilterLayout->addWidget(anEdge, 0, 1);
322 aFilterLayout->addWidget(aFace, 0, 2);
323 aFilterLayout->addWidget(aMaxTolLabel, 1, 0, Qt::AlignRight);
324 aFilterLayout->addWidget(aTolLabel, 2, 0);
325 aFilterLayout->addWidget(aMinTolLabel, 3, 0, Qt::AlignRight);
326 aFilterLayout->addWidget(myMaxTolValLabel, 1, 1);
327 aFilterLayout->addWidget(myComparisonCompo, 2, 1);
328 aFilterLayout->addWidget(myMinTolValLabel, 3, 1);
329 aFilterLayout->addWidget(myMaxTolResetBtn, 1, 2);
330 aFilterLayout->addWidget(myTolEdit, 2, 2);
331 aFilterLayout->addWidget(myMinTolResetBtn, 3, 2);
332 aFilterLayout->setRowMinimumHeight(0, 30);
334 myTolFilterGrp->setCheckable(true);
336 /********************** Sub-objects trees **********************/
337 createTreeWidget(myTreeObjects);
338 createTreeWidget(myFilteredTreeObjects);
340 myTreesLayout = new QStackedLayout(this);
341 myTreesLayout->addWidget(myTreeObjects);
342 myTreesLayout->addWidget(myFilteredTreeObjects);
344 /********************** Buttons **********************/
346 QVBoxLayout* buttonsLayout1 = new QVBoxLayout(this);
348 QPushButton* buttonShow = new QPushButton( tr( "GEOM_INSPECT_OBJECT_SHOW" ), this );
349 QPushButton* buttonShowOnly = new QPushButton( tr( "GEOM_INSPECT_OBJECT_SHOW_ONLY" ), this );
350 QPushButton* buttonHide = new QPushButton( tr( "GEOM_INSPECT_OBJECT_HIDE" ), this );
351 QPushButton* buttonPublish = new QPushButton( tr( "GEOM_INSPECT_OBJECT_PUBLISH" ), this );
352 QPushButton* aShowAllBtn = new QPushButton(tr("SHOW_ALL_BTN"), this);
353 QPushButton* aHideAllBtn = new QPushButton(tr("HIDE_ALL_BTN"), this);
356 buttonsLayout1->addWidget( buttonShow );
357 buttonsLayout1->addWidget( buttonShowOnly );
358 buttonsLayout1->addWidget( buttonHide );
359 buttonsLayout1->addWidget( aShowAllBtn );
360 buttonsLayout1->addWidget( aHideAllBtn );
361 buttonsLayout1->addWidget( buttonPublish );
362 buttonsLayout1->addStretch();
364 QHBoxLayout* buttonsLayout2 = new QHBoxLayout(this);
366 QPushButton* buttonClose = new QPushButton( tr( "GEOM_BUT_CLOSE" ), this );
367 QPushButton* buttonHelp = new QPushButton( tr( "GEOM_BUT_HELP" ), this );
369 buttonsLayout2->addWidget( buttonClose );
370 buttonsLayout2->addStretch();
371 buttonsLayout2->addWidget( buttonHelp );
373 topLayout->addLayout( mainShapeLayout, 0, 0 );
374 topLayout->addWidget( myTolFilterGrp, 1, 0);
375 topLayout->addLayout( myTreesLayout, 2, 0 );
376 topLayout->addLayout( buttonsLayout1, 0, 1, 3, 1 );
377 topLayout->addLayout( buttonsLayout2, 3, 0, 1, 2 );
379 connect( selBtn, SIGNAL( clicked() ), this, SLOT( onEditMainShape() ) );
381 connect( buttonShow, SIGNAL( clicked() ), this, SLOT( clickOnShow() ) );
382 connect( buttonShowOnly, SIGNAL( clicked() ), this, SLOT( clickOnShowOnly() ) );
383 connect( buttonHide, SIGNAL( clicked() ), this, SLOT( clickOnHide() ) );
384 connect( buttonPublish, SIGNAL( clicked() ), this, SLOT( clickOnPublish() ) );
385 connect( buttonClose, SIGNAL( clicked() ), this, SLOT( reject() ) );
386 connect( buttonHelp, SIGNAL( clicked() ), this, SLOT( clickOnHelp() ) );
387 connect( aShowAllBtn, SIGNAL( clicked() ), this, SLOT( clickOnShowAll() ) );
388 connect( aHideAllBtn, SIGNAL( clicked() ), this, SLOT( clickOnHideAll() ) );
393 RepairGUI_InspectObjectDlg::~RepairGUI_InspectObjectDlg()
397 // restore initial parameters for viewer
398 getDisplayer()->UnsetColor();
399 getDisplayer()->UnsetWidth();
400 // no need to delete child widgets, Qt does it all for us
403 //=================================================================================
404 // function : createTreeWidget()
406 //=================================================================================
407 void RepairGUI_InspectObjectDlg::createTreeWidget(QTreeWidget *&theTreeObjects)
409 theTreeObjects = new QTreeWidget(this);
410 theTreeObjects->setColumnCount(2);
411 QStringList columnNames;
412 columnNames.append(tr("GEOM_INSPECT_OBJECT_NAME"));
413 columnNames.append("");
414 theTreeObjects->setHeaderLabels(columnNames);
415 QTreeWidgetItem* headerItem = new QTreeWidgetItem(columnNames);
417 headerItem->setIcon(1, myInvisible);
418 theTreeObjects->setHeaderItem(headerItem);
419 theTreeObjects->header()->moveSection(1, 0);
420 theTreeObjects->header()->setSectionsClickable(true);
421 theTreeObjects->header()->setSectionsMovable(false);
422 theTreeObjects->header()->setSectionResizeMode( 1, QHeaderView::ResizeToContents);
424 theTreeObjects->setSelectionMode(QAbstractItemView::ExtendedSelection);
425 theTreeObjects->setEditTriggers(QAbstractItemView::DoubleClicked | QAbstractItemView::EditKeyPressed);
426 // set custom item delegate
427 theTreeObjects->setItemDelegate(new Delegate(theTreeObjects));
430 //=================================================================================
432 // purpose : initialize dialog data
433 //=================================================================================
434 void RepairGUI_InspectObjectDlg::init()
436 myTolFilterGrp->setChecked(false);
437 myComparisonCompo->addItem(">", GEOMUtils::CC_GT);
438 myComparisonCompo->addItem(">=", GEOMUtils::CC_GE);
439 myComparisonCompo->addItem("<", GEOMUtils::CC_LT);
440 myComparisonCompo->addItem("<=", GEOMUtils::CC_LE);
442 initSpinBox(myTolEdit, 0., 100., DEFAULT_TOLERANCE_VALUE, "len_tol_precision");
443 myTolEdit->setValue(DEFAULT_TOLERANCE_VALUE);
445 // Signals and slots connections
446 initTreeWidget(myTreeObjects);
447 initTreeWidget(myFilteredTreeObjects);
448 myCurrentTreeObjects = myTreeObjects;
449 myMaxTolResetBtn->setEnabled(false);
450 myMinTolResetBtn->setEnabled(false);
452 connect(myMinTolResetBtn, SIGNAL(clicked()), this, SLOT(clickOnResetToMin()));
453 connect(myMaxTolResetBtn, SIGNAL(clicked()), this, SLOT(clickOnResetToMax()));
454 connect(myShapeTypeBtnGrp, SIGNAL(buttonClicked(int)), this, SLOT(onInitFilteredData()));
455 connect(myGeomGUI, SIGNAL(SignalDeactivateActiveDialog()), this, SLOT(DeactivateActiveDialog()));
456 connect(myGeomGUI, SIGNAL(SignalCloseAllDialogs()), this, SLOT(reject()));
458 connect( myGeomGUI->getApp()->selectionMgr(), SIGNAL( currentSelectionChanged() ),
459 this, SLOT( onViewSelectionChanged() ) );
461 connect( myGeomGUI->getApp()->desktop(), SIGNAL( windowActivated( SUIT_ViewWindow* ) ),
462 this, SLOT( onWindowActivated( SUIT_ViewWindow* ) ) );
464 // Connect signals and slots for filter group box elements.
465 connect(myTolFilterGrp, SIGNAL(toggled(bool)),
466 this, SLOT(onFilterToggled(bool)));
467 connect(myComparisonCompo, SIGNAL(currentIndexChanged(int)),
468 this, SLOT(onFilterData()));
469 connect(myTolEdit, SIGNAL(valueChanged(double)),
470 this, SLOT(onFilterData()));
473 connect( myViewWindow->getViewManager(), SIGNAL( deleteView( SUIT_ViewWindow* ) ),
474 this, SLOT( onCloseView( SUIT_ViewWindow* ) ), Qt::UniqueConnection );
476 // Initialize the dialog with current selection.
477 onViewSelectionChanged();
480 //=================================================================================
481 // function : initSpinBox()
483 //=================================================================================
484 void RepairGUI_InspectObjectDlg::initSpinBox(SalomeApp_DoubleSpinBox* spinBox,
485 double min, double max,
486 double step, const char* quantity)
488 // Obtain precision from preferences
489 SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr();
490 int aPrecision = resMgr->integerValue( "Geometry", quantity, 6 );
492 spinBox->setPrecision( aPrecision );
493 spinBox->setDecimals( qAbs( aPrecision ) ); // it's necessary to set decimals before the range setting,
494 // by default Qt rounds boundaries to 2 decimals at setRange
495 spinBox->setRange( min, max );
496 spinBox->setSingleStep( step );
498 // Add a hint for the user saying how to tune precision
499 QString userPropName = QObject::tr( QString( "GEOM_PREF_%1" ).arg( quantity ).toLatin1().constData() );
500 spinBox->setProperty( "validity_tune_hint",
501 QVariant( QObject::tr( "GEOM_PRECISION_HINT" ).arg( userPropName ) ) );
504 //=================================================================================
505 // function : initTreeWidget()
507 //=================================================================================
508 void RepairGUI_InspectObjectDlg::initTreeWidget(QTreeWidget *theTreeObjects)
510 connect(theTreeObjects, SIGNAL(itemClicked (QTreeWidgetItem *, int)),
511 this, SLOT(onItemClicked(QTreeWidgetItem *, int)));
512 connect(theTreeObjects, SIGNAL(itemChanged (QTreeWidgetItem *, int)),
513 this, SLOT(onItemChanged(QTreeWidgetItem *, int)));
514 connect(theTreeObjects, SIGNAL(itemExpanded (QTreeWidgetItem *)),
515 this, SLOT(onItemExpanded(QTreeWidgetItem *)));
516 connect(theTreeObjects, SIGNAL(itemSelectionChanged()),
517 this, SLOT(onItemSelectionChanged()));
519 connect(theTreeObjects->header(), SIGNAL(sectionClicked(int)),
520 this, SLOT(onHeaderClicked(int)));
523 //=================================================================================
524 // function : enterEvent()
526 //=================================================================================
527 void RepairGUI_InspectObjectDlg::enterEvent (QEvent*)
529 if (!myTolFilterGrp->isEnabled())
530 ActivateThisDialog();
533 //=================================================================================
534 // function : checkVisibleIcon()
535 // purpose : set visible or invisible icon in the header of tree
536 //=================================================================================
537 void RepairGUI_InspectObjectDlg::checkVisibleIcon()
539 bool isInvisible = false;
540 QTreeWidgetItemIterator it( myCurrentTreeObjects );
542 TreeWidgetItem* anItem = dynamic_cast<TreeWidgetItem*>(*it);
543 if ( !anItem->isHidden() && !anItem->isVisible() ) {
551 myCurrentTreeObjects->headerItem()->setIcon( 1, myInvisible );
552 myIsSelectAll = false;
555 myCurrentTreeObjects->headerItem()->setIcon( 1, myVisible );
556 myIsSelectAll = true;
560 //=================================================================================
561 // function : addSubObjects()
562 // purpose : add sub-objects to parent object in the tree
563 //=================================================================================
564 void RepairGUI_InspectObjectDlg::addSubObjects
565 (TreeWidgetItem *theParentItem,
566 const TopTools_IndexedMapOfShape &theIndices)
568 TreeWidgetItem* aMainItem = dynamic_cast<TreeWidgetItem*>( myTreeObjects->topLevelItem(0) );
569 TopoDS_Iterator it( theParentItem->getShape() );
570 for ( ; it.More(); it.Next() ) {
571 TopoDS_Shape aSubShape = it.Value();
572 int anIndex = theIndices.FindIndex(aSubShape);
573 QString anEntry = QString( "TEMP_" ) + aMainItem->getIO()->getEntry() + QString("_%1").arg( anIndex );
574 TreeWidgetItem* anItem = new TreeWidgetItem( theParentItem, QStringList(), aSubShape, anEntry);
575 anItem->setVisible( false, myInvisible );
576 addSubObjects(anItem, theIndices);
580 //=================================================================================
581 // function : onInitFilteredData()
582 // purpose : add sub-objects to parent object in the filtered tree
583 //=================================================================================
584 void RepairGUI_InspectObjectDlg::onInitFilteredData()
586 TreeWidgetItem *aMainItem =
587 dynamic_cast<TreeWidgetItem*>(myFilteredTreeObjects->topLevelItem(0));
593 // Remove the children.
594 SALOME_ListIO aListOfIO;
595 QTreeWidgetItemIterator it(aMainItem);
598 TreeWidgetItem* anItem = dynamic_cast<TreeWidgetItem*>(*it);
599 if (aMainItem != anItem && (anItem->flags() & Qt::ItemIsSelectable) &&
600 anItem->isVisible() && !anItem->isHidden()) {
601 aListOfIO.Append(anItem->getIO());
607 myFilteredTreeObjects->clearSelection();
608 myFilteredTreeObjects->headerItem()->setIcon(1, myInvisible);
609 getDisplayer()->Erase(aListOfIO);
610 getDisplayer()->UpdateViewer();
612 // Delete child items.
613 QList<QTreeWidgetItem *> aListItems = aMainItem->takeChildren();
615 foreach (QTreeWidgetItem *anItem, aListItems) {
619 // Initialize the tree with a new list.
620 TopoDS_Shape aShape = aMainItem->getShape();
621 TopAbs_ShapeEnum aShapeType = aShape.ShapeType();
623 myShapeTypeBtnGrp->button(TYPE_FACE)->setVisible(aShapeType < TYPE_FACE);
624 myShapeTypeBtnGrp->button(TYPE_EDGE)->setVisible(aShapeType < TYPE_EDGE);
625 myShapeTypeBtnGrp->button(TYPE_VERTEX)->setVisible(aShapeType < TYPE_VERTEX);
627 int anId = myShapeTypeBtnGrp->checkedId();
629 myMaxTol = -RealLast();
630 myMinTol = RealLast();
632 if (anId != -1 && myShapeTypeBtnGrp->checkedButton()->isVisible()) {
634 TopTools_MapOfShape aMapFence;
635 TopExp_Explorer anExp(aShape, (TopAbs_ShapeEnum)anId);
636 TopTools_IndexedMapOfShape anIndices;
638 TopExp::MapShapes(aShape, anIndices);
640 for (; anExp.More(); anExp.Next()) {
641 const TopoDS_Shape &aSubShape = anExp.Current();
643 if (aMapFence.Add(aSubShape)) {
645 Standard_Real aTolerance = -1.;
647 switch (aSubShape.ShapeType()) {
649 aTolerance = BRep_Tool::Tolerance(TopoDS::Face(aSubShape));
652 aTolerance = BRep_Tool::Tolerance(TopoDS::Edge(aSubShape));
655 aTolerance = BRep_Tool::Tolerance(TopoDS::Vertex(aSubShape));
661 if (aTolerance < 0.) {
665 if (aTolerance > myMaxTol) {
666 myMaxTol = aTolerance;
669 if (aTolerance < myMinTol) {
670 myMinTol = aTolerance;
673 int anIndex = anIndices.FindIndex(aSubShape);
674 QString anEntry = QString( "TEMP_" ) +
675 aMainItem->getIO()->getEntry() +
676 QString::number(anIndex);
677 TreeWidgetItem* anItem =
678 new TreeWidgetItem(aMainItem, QStringList(),
679 aSubShape, anEntry, aTolerance);
680 anItem->setVisible( false, myInvisible );
685 // Compose names of sub-items if the main item is expanded.
686 if (aMainItem->isExpanded()) {
687 onItemExpanded(aMainItem);
690 myMaxTolResetBtn->setEnabled(myMaxTol >= myMinTol);
691 myMinTolResetBtn->setEnabled(myMaxTol >= myMinTol);
693 if (myMaxTol < myMinTol) {
694 myMinTol = DEFAULT_TOLERANCE_VALUE;
695 myMaxTol = DEFAULT_TOLERANCE_VALUE;
696 myMinTolValLabel->setText(QString::number(DEFAULT_TOLERANCE_VALUE));
697 myMaxTolValLabel->setText(QString::number(DEFAULT_TOLERANCE_VALUE));
698 myTolEdit->setValue(DEFAULT_TOLERANCE_VALUE);
700 myMinTolValLabel->setText(QString::number(myMinTol));
701 myMaxTolValLabel->setText(QString::number(myMaxTol));
703 if (GEOMUtils::CompareToleranceValues(myMinTol, myTolEdit->value()) == 1) {
705 } else if (GEOMUtils::CompareToleranceValues
706 (myMaxTol, myTolEdit->value()) == -1) {
714 //=================================================================================
715 // function : onFilterData()
716 // purpose : filter objects in the filtered tree
717 //=================================================================================
718 void RepairGUI_InspectObjectDlg::onFilterData()
720 TreeWidgetItem *aMainItem =
721 dynamic_cast<TreeWidgetItem*>(myFilteredTreeObjects->topLevelItem(0));
727 SALOME_ListIO aListOfIOToHide;
728 QTreeWidgetItemIterator anIt(aMainItem);
729 const int aCompValue =
730 myComparisonCompo->itemData(myComparisonCompo->currentIndex()).toInt();
731 const double aTolValue = myTolEdit->value();
734 TreeWidgetItem* anItem = dynamic_cast<TreeWidgetItem*>(*anIt);
736 if (aMainItem != anItem) {
737 const bool isToFilter = !GEOMUtils::IsFitCondition
738 ((GEOMUtils::ComparisonCondition) aCompValue,
739 anItem->getTolerance(), aTolValue);
741 if (isToFilter && !anItem->isHidden()) {
742 if (anItem->isVisible()) {
743 aListOfIOToHide.Append(anItem->getIO());
746 anItem->setVisible(false, myInvisible);
749 anItem->setHidden(isToFilter);
755 if (!aListOfIOToHide.IsEmpty()) {
756 getDisplayer()->Erase(aListOfIOToHide);
757 getDisplayer()->UpdateViewer();
763 //=================================================================================
764 // function : displayItem()
765 // purpose : display sub-object of inspected object according its tree item
766 //=================================================================================
767 void RepairGUI_InspectObjectDlg::displayItem( TreeWidgetItem* theItem )
769 GEOM_Displayer* aDisplayer = getDisplayer();
770 if ( theItem == myCurrentTreeObjects->topLevelItem(0) ) {
771 aDisplayer->UnsetColor();
772 aDisplayer->UnsetWidth();
774 else if ( aDisplayer->GetColor() != Quantity_NOC_VIOLET && aDisplayer->GetWidth() != 2.0 ) {
775 aDisplayer->SetColor( Quantity_NOC_VIOLET );
776 aDisplayer->SetWidth( 2.0 );
779 SALOME_Prs* aPrs = aDisplayer->buildSubshapePresentation( theItem->getShape(), theItem->getIO()->getEntry(),
780 GEOM_Displayer::GetActiveView() );
782 displayPreview( aPrs, true, false );
785 //=================================================================================
786 // function : setItemDisplayStatus()
787 // purpose : set visible or invisible status for the same items in the tree
788 //=================================================================================
789 void RepairGUI_InspectObjectDlg::setItemDisplayStatus( TreeWidgetItem* theItem, bool theIsVisible )
791 QTreeWidgetItemIterator it( myCurrentTreeObjects );
793 TreeWidgetItem* anItem = dynamic_cast<TreeWidgetItem*>(*it);
794 if ( anItem->getShape().IsSame( theItem->getShape() ) )
795 anItem->setVisible( theIsVisible, theIsVisible ? myVisible : myInvisible );
800 //=================================================================================
801 // function : setMainObjectTransparency()
802 // purpose : set transparency for the inspected object
803 //=================================================================================
804 void RepairGUI_InspectObjectDlg::setMainObjectTransparency( double theTransparency )
806 SUIT_ViewManager* aViewMan = myViewWindow->getViewManager();
807 SALOME_View* aView = dynamic_cast<SALOME_View*>( aViewMan->getViewModel() );
808 SalomeApp_Study* aStudy = dynamic_cast<SalomeApp_Study*>( myGeomGUI->getApp()->activeStudy() );
810 TreeWidgetItem* aMainItem = dynamic_cast<TreeWidgetItem*>( myCurrentTreeObjects->topLevelItem(0) );
816 aStudy->setObjectProperty( myViewWindow->getViewManager()->getGlobalId(),
817 QString( aMainItem->getIO()->getEntry() ),
818 GEOM::propertyName( GEOM::Transparency ), theTransparency );
820 if ( aView->isVisible( aMainItem->getIO() ) )
821 getDisplayer()->Redisplay( aMainItem->getIO(), true, aView );
824 //=================================================================================
825 // function : restoreParam()
826 // purpose : restore initial parameters of the dialog and the viewer
827 //=================================================================================
828 void RepairGUI_InspectObjectDlg::restoreParam()
830 SUIT_ViewManager* aViewMan = myViewWindow->getViewManager();
831 SALOME_View* aView = dynamic_cast<SALOME_View*>( aViewMan->getViewModel() );
832 GEOM_Displayer* aDisplayer = getDisplayer();
833 // restore initial parameters for viewer
834 aDisplayer->UnsetColor();
835 aDisplayer->UnsetWidth();
837 // restore transparency of main object
838 setMainObjectTransparency( myTransparency );
841 TreeWidgetItem* aMainItem = dynamic_cast<TreeWidgetItem*>( myCurrentTreeObjects->topLevelItem(0) );
842 QTreeWidgetItemIterator it( myCurrentTreeObjects );
844 if ( *it != aMainItem ) {
845 TreeWidgetItem* anItem = dynamic_cast<TreeWidgetItem*>(*it);
846 aDisplayer->Erase( anItem->getIO(), false, false, aView );
847 anItem->setVisible( false, myInvisible );
853 //=================================================================================
854 // function : onEditMainShape()
855 // purpose : called when selection button was clicked
856 //=================================================================================
857 void RepairGUI_InspectObjectDlg::onEditMainShape()
859 if ( myEditMainShape->text().isEmpty() || !myViewWindow )
864 // restore initial parameters for dialog box
865 myEditMainShape->setEnabled( true );
866 myEditMainShape->setText("");
867 myEditMainShape->setFocus();
868 myTreeObjects->clear();
869 myFilteredTreeObjects->clear();
872 //=================================================================================
873 // function : onItemClicked()
874 // purpose : called when tree item was clicked
875 //=================================================================================
876 void RepairGUI_InspectObjectDlg::onItemClicked( QTreeWidgetItem* theItem, int theColumn )
878 if ( theColumn!= 1 || !( theItem->flags() & Qt::ItemIsSelectable ) || !myViewWindow )
881 GEOM_Displayer* aDisplayer = getDisplayer();
883 TreeWidgetItem* anItem = dynamic_cast<TreeWidgetItem*>( theItem );
885 if ( anItem->isVisible() ) {
886 aDisplayer->Erase( anItem->getIO(), false, true );
887 setItemDisplayStatus( anItem, false );
890 displayItem( anItem );
891 setItemDisplayStatus( anItem, true );
893 aDisplayer->UpdateViewer();
897 //=================================================================================
898 // function : onItemChanged()
899 // purpose : called when tree item was changed
900 //=================================================================================
901 void RepairGUI_InspectObjectDlg::onItemChanged( QTreeWidgetItem* theItem, int theColumn )
903 if ( theColumn!= 0 || !( theItem->flags() & Qt::ItemIsEditable ) )
906 // rename the same items in the tree
907 QTreeWidgetItemIterator it( myCurrentTreeObjects );
909 TreeWidgetItem* anItem = dynamic_cast<TreeWidgetItem*>(*it);
910 if ( anItem->getShape().IsSame( dynamic_cast<TreeWidgetItem*>( theItem )->getShape() ) )
911 anItem->setText( 0, theItem->text(0) );
916 //=================================================================================
917 // function : onItemExpanded()
918 // purpose : called when tree item was expanded
919 //=================================================================================
920 void RepairGUI_InspectObjectDlg::onItemExpanded( QTreeWidgetItem* theItem )
922 TreeWidgetItem* aMainItem = dynamic_cast<TreeWidgetItem*>( myCurrentTreeObjects->topLevelItem(0) );
923 GEOM::GEOM_Object_var aMainObject = GEOMBase::ConvertIOinGEOMObject( aMainItem->getIO() );
925 for ( int i = 0; i < theItem->childCount(); i++ ) {
926 TreeWidgetItem* aSubItem = dynamic_cast<TreeWidgetItem*>( theItem->child(i) );
927 int anIndex = GEOMBase::GetIndex( aSubItem->getShape(), aMainItem->getShape() );
928 if ( aSubItem->text(0).isEmpty() ) {
929 char* aName = aMainObject->GetSubShapeName( anIndex );
930 if ( !QString( aName ).isEmpty() )
931 aSubItem->setText( 0, QString( aName ) );
933 aSubItem->setText( 0, QString("%1_%2").arg( GEOMBase::TypeName( aSubItem->getShape().ShapeType(), true ) ).arg( anIndex ) );
938 //=================================================================================
939 // function : onItemSelectionChanged()
940 // purpose : called when tree item was selected
941 //=================================================================================
942 void RepairGUI_InspectObjectDlg::onItemSelectionChanged()
947 QList<QTreeWidgetItem*> listItem = myCurrentTreeObjects->selectedItems();
948 SALOME_ListIO aSelected;
949 for ( int i = 0; i < listItem.size(); i++ ) {
950 TreeWidgetItem* anItem = dynamic_cast<TreeWidgetItem*>( listItem.at(i) );
951 aSelected.Append( anItem->getIO() );
953 myGeomGUI->getApp()->selectionMgr()->setSelectedObjects( aSelected );
956 //=================================================================================
957 // function : onHeaderClicked()
958 // purpose : called when header item of tree was clicked
959 //=================================================================================
960 void RepairGUI_InspectObjectDlg::onHeaderClicked( int theColumn )
962 if ( theColumn != 1 || !myViewWindow )
965 GEOM_Displayer* aDisplayer = getDisplayer();
967 if ( myIsSelectAll ) {
968 myIsSelectAll = false;
969 myCurrentTreeObjects->headerItem()->setIcon( 1, myInvisible );
970 SALOME_ListIO aListOfIO;
971 QTreeWidgetItemIterator it( myCurrentTreeObjects );
973 TreeWidgetItem* anItem = dynamic_cast<TreeWidgetItem*>(*it);
974 if ( !anItem->isHidden() && ( anItem->flags() & Qt::ItemIsSelectable ) &&
975 anItem->isVisible() ) {
976 aListOfIO.Append( anItem->getIO() );
977 anItem->setVisible( false, myInvisible );
981 aDisplayer->Erase( aListOfIO );
984 myIsSelectAll = true;
985 myCurrentTreeObjects->headerItem()->setIcon( 1, myVisible );
986 QTreeWidgetItemIterator it( myCurrentTreeObjects );
988 TreeWidgetItem* anItem = dynamic_cast<TreeWidgetItem*>(*it);
989 if ( !anItem->isHidden() && ( anItem->flags() & Qt::ItemIsSelectable ) &&
990 !anItem->isVisible() ) {
991 displayItem( anItem );
992 anItem->setVisible( true, myVisible );
998 aDisplayer->UpdateViewer();
1001 //=================================================================================
1002 // function : onViewSelectionChanged()
1003 // purpose : called when selection of object browser was changed
1004 //=================================================================================
1005 void RepairGUI_InspectObjectDlg::onViewSelectionChanged()
1007 if (!myEditMainShape->isEnabled())
1010 //get shape from selection
1011 SALOME_ListIO selected;
1012 myGeomGUI->getApp()->selectionMgr()->selectedObjects(selected);
1014 if ( selected.Extent() != 1 )
1017 if ( !myViewWindow ) {
1018 SUIT_ViewManager* occVm = myGeomGUI->getApp()->getViewManager( OCCViewer_Viewer::Type(), true );
1019 myViewWindow = occVm->getActiveView();
1020 connect( occVm, SIGNAL( deleteView( SUIT_ViewWindow* ) ),
1021 this, SLOT( onCloseView( SUIT_ViewWindow* ) ), Qt::UniqueConnection );
1024 TopoDS_Shape aShape = GEOMBase::GetTopoFromSelection( selected );
1025 if ( aShape.IsNull() )
1028 Handle(SALOME_InteractiveObject) anIO = selected.First();
1029 GEOM::GEOM_Object_var anObject = GEOMBase::ConvertIOinGEOMObject( anIO );
1030 QString aName = anObject->GetName();
1031 CORBA::String_var anEntry = anObject->GetStudyEntry();
1033 myEditMainShape->setText( aName );
1034 myEditMainShape->setEnabled( false );
1036 // remember initial transparency value
1037 SalomeApp_Study* aStudy = dynamic_cast<SalomeApp_Study*>( myGeomGUI->getApp()->activeStudy() );
1038 QVariant v = aStudy->getObjectProperty( myViewWindow->getViewManager()->getGlobalId(),
1039 QString( anEntry.in() ),
1040 GEOM::propertyName( GEOM::Transparency ), myTransparency );
1041 if ( v.canConvert( QVariant::Double ) )
1042 myTransparency = v.toDouble();
1044 TreeWidgetItem* anItem = new TreeWidgetItem
1045 (myTreeObjects, QStringList() << aName, aShape, anIO);
1046 TreeWidgetItem* anItemFiltered = new TreeWidgetItem
1047 (myFilteredTreeObjects, QStringList() << aName, aShape, anIO);
1049 if ( getDisplayer()->IsDisplayed( anEntry.in() ) ) {
1050 anItem->setVisible( true, myVisible );
1051 anItemFiltered->setVisible( true, myVisible );
1053 anItem->setVisible( false, myInvisible );
1054 anItemFiltered->setVisible( false, myInvisible );
1057 setMainObjectTransparency( 0.5 );
1059 // add sub-objects in the tree
1060 TopTools_IndexedMapOfShape anIndices;
1062 TopExp::MapShapes(aShape, anIndices);
1063 addSubObjects(anItem, anIndices);
1064 onInitFilteredData();
1065 updateViewer(false);
1067 // check icon for tree header
1071 //=================================================================================
1072 // function : onWindowActivated()
1073 // purpose : called when other window was activated
1074 //=================================================================================
1075 void RepairGUI_InspectObjectDlg::onWindowActivated( SUIT_ViewWindow* theViewWindow )
1080 connect( theViewWindow->getViewManager(), SIGNAL( deleteView( SUIT_ViewWindow* ) ),
1081 this, SLOT( onCloseView( SUIT_ViewWindow* ) ), Qt::UniqueConnection );
1083 if ( theViewWindow->getViewManager()->getType() != OCCViewer_Viewer::Type() &&
1084 theViewWindow->getViewManager()->getType() != SVTK_Viewer::Type() ) {
1088 myViewWindow = theViewWindow;
1090 if ( myCurrentTreeObjects->topLevelItemCount() > 0 ) {
1091 setMainObjectTransparency( 0.5 );
1092 TreeWidgetItem* aMainItem = dynamic_cast<TreeWidgetItem*>( myCurrentTreeObjects->topLevelItem(0) );
1093 if ( getDisplayer()->IsDisplayed( aMainItem->getIO()->getEntry() ) )
1094 aMainItem->setVisible( true, myVisible );
1096 aMainItem->setVisible( false, myInvisible );
1101 //=================================================================================
1102 // function : onCloseView()
1103 // purpose : called when last view was closed
1104 //=================================================================================
1105 void RepairGUI_InspectObjectDlg::onCloseView( SUIT_ViewWindow* )
1107 if ( myGeomGUI->getApp()->desktop()->windows().size() == 0 ) {
1113 //=================================================================================
1114 // function : clickOnShow()
1115 // purpose : called when "Show selected" button was clicked
1116 //=================================================================================
1117 void RepairGUI_InspectObjectDlg::clickOnShow()
1119 if ( !myViewWindow )
1122 QList<QTreeWidgetItem*> listItem = myCurrentTreeObjects->selectedItems();
1123 for ( int i = 0; i < listItem.size(); i++ ) {
1124 TreeWidgetItem* anItem = dynamic_cast<TreeWidgetItem*>( listItem.at(i) );
1125 if ( !anItem->isVisible() ) {
1126 displayItem( anItem );
1127 setItemDisplayStatus( anItem, true );
1130 getDisplayer()->UpdateViewer();
1134 //=================================================================================
1135 // function : clickOnShowOnly()
1136 // purpose : called when "Show only selected" button was clicked
1137 //=================================================================================
1138 void RepairGUI_InspectObjectDlg::clickOnShowOnly()
1140 if ( !myViewWindow )
1143 SALOME_ListIO aListOfIO;
1144 QTreeWidgetItemIterator it( myCurrentTreeObjects );
1146 TreeWidgetItem* anItem = dynamic_cast<TreeWidgetItem*>(*it);
1147 if ( !anItem->isHidden() && ( anItem->flags() & Qt::ItemIsSelectable ) &&
1148 anItem->isVisible() ) {
1149 aListOfIO.Append( anItem->getIO() );
1150 anItem->setVisible( false, myInvisible );
1154 getDisplayer()->Erase( aListOfIO );
1159 //=================================================================================
1160 // function : clickOnHide()
1161 // purpose : called when "Hide selected" button was clicked
1162 //=================================================================================
1163 void RepairGUI_InspectObjectDlg::clickOnHide()
1165 if ( !myViewWindow )
1168 QList<QTreeWidgetItem*> listItem = myCurrentTreeObjects->selectedItems();
1169 for ( int i = 0; i < listItem.size(); i++ ) {
1170 TreeWidgetItem* anItem = dynamic_cast<TreeWidgetItem*>( listItem.at(i) );
1171 if ( anItem->isVisible() ) {
1172 getDisplayer()->Erase( anItem->getIO(), false, false );
1173 setItemDisplayStatus( anItem, false );
1176 getDisplayer()->UpdateViewer();
1180 //=================================================================================
1181 // function : clickOnPublish()
1182 // purpose : called when "Publish selected" button was clicked
1183 //=================================================================================
1184 void RepairGUI_InspectObjectDlg::clickOnPublish()
1187 TreeWidgetItem* aMainItem = dynamic_cast<TreeWidgetItem*>( myCurrentTreeObjects->topLevelItem(0) );
1193 GEOM::GEOM_Object_var aMainObject = GEOMBase::ConvertIOinGEOMObject( aMainItem->getIO() );
1195 // find unique indices of selected objects
1196 QList<QTreeWidgetItem*> selectedItems = myCurrentTreeObjects->selectedItems();
1197 QMap< int, QString > anIndices;
1198 GEOM::ListOfLong_var anArray = new GEOM::ListOfLong;
1199 anArray->length( selectedItems.size() );
1201 for ( int i = 0; i < selectedItems.size(); i++ ) {
1202 TreeWidgetItem* anItem = dynamic_cast<TreeWidgetItem*>( selectedItems.at(i) );
1203 int anIndex = GEOMBase::GetIndex( anItem->getShape(), aMainItem->getShape() );
1204 if ( anIndices.find( anIndex ) == anIndices.end() &&
1205 anItem != aMainItem ) {
1206 anIndices[ anIndex ] = anItem->text(0);
1207 anArray[j++] = anIndex;
1212 // get selected sub-shapes
1213 GEOM::GEOM_IShapesOperations_var anOper = getGeomEngine()->GetIShapesOperations();
1214 GEOM::ListOfGO_var aList = anOper->MakeSubShapes( aMainObject, anArray );
1216 // publish sub-shapes
1217 for ( int i = 0; i < (int)aList->length(); i++ )
1218 GeometryGUI::GetGeomGen()->AddInStudy( aList[i],
1219 anIndices.values().at(i).toStdString().c_str(), aMainObject );
1224 //=================================================================================
1225 // function : clickOnHelp()
1226 // purpose : called when Help button was clicked to open a help page
1227 //=================================================================================
1228 void RepairGUI_InspectObjectDlg::clickOnHelp()
1230 myGeomGUI->getApp()->onHelpContextModule( "GEOM", "inspect_object_operation_page.html" );
1233 //=================================================================================
1234 // function : clickOnResetToMin()
1235 // purpose : called when Reset button was clicked to reset tolerance filter to minimal value.
1236 //=================================================================================
1237 void RepairGUI_InspectObjectDlg::clickOnResetToMin()
1239 if (myMinTol >= myTolEdit->minimum() && myMinTol <= myTolEdit->maximum()) {
1240 myTolEdit->setValue(myMinTol);
1244 //=================================================================================
1245 // function : clickOnResetToMax()
1246 // purpose : called when Reset button was clicked to reset tolerance filter to maximal value.
1247 //=================================================================================
1248 void RepairGUI_InspectObjectDlg::clickOnResetToMax()
1250 if (myMaxTol >= myTolEdit->minimum() && myMaxTol <= myTolEdit->maximum()) {
1251 myTolEdit->setValue(myMaxTol);
1255 //=================================================================================
1256 // function : clickOnShowAll()
1257 // purpose : called when Help button was clicked to show all shapes
1258 //=================================================================================
1259 void RepairGUI_InspectObjectDlg::clickOnShowAll()
1261 myIsSelectAll = false;
1265 //=================================================================================
1266 // function : clickOnHideAll()
1267 // purpose : called when Help button was clicked to hide all shapes
1268 //=================================================================================
1269 void RepairGUI_InspectObjectDlg::clickOnHideAll()
1271 myIsSelectAll = true;
1275 //=================================================================================
1276 // function : DeactivateActiveDialog()
1278 //=================================================================================
1279 void RepairGUI_InspectObjectDlg::DeactivateActiveDialog()
1282 disconnect(myGeomGUI->getApp()->selectionMgr(), 0, this, 0);
1283 myGeomGUI->SetActiveDialogBox(0);
1288 //=================================================================================
1289 // function : ActivateThisDialog()
1291 //=================================================================================
1292 void RepairGUI_InspectObjectDlg::ActivateThisDialog()
1294 /* Emit a signal to deactivate the active dialog */
1295 myGeomGUI->EmitSignalDeactivateDialog();
1297 myGeomGUI->SetActiveDialogBox( (QDialog*)this );
1299 connect(myGeomGUI->getApp()->selectionMgr(), SIGNAL(currentSelectionChanged()),
1300 this, SLOT(onViewSelectionChanged()));
1302 updateViewer(false);
1305 //=================================================================================
1306 // function : onFilterToggled()
1308 //=================================================================================
1309 void RepairGUI_InspectObjectDlg::onFilterToggled(bool isOn)
1312 myCurrentTreeObjects = myFilteredTreeObjects;
1313 myTreesLayout->setCurrentIndex(1);
1315 myCurrentTreeObjects = myTreeObjects;
1316 myTreesLayout->setCurrentIndex(0);
1322 //=================================================================================
1323 // function : updateViewer()
1325 //=================================================================================
1326 void RepairGUI_InspectObjectDlg::updateViewer(const bool theIsHideOtherTree)
1328 GEOM_Displayer *aDisplayer = getDisplayer();
1330 if (theIsHideOtherTree) {
1331 QTreeWidget *aTreeToHide = myCurrentTreeObjects == myTreeObjects ?
1332 myFilteredTreeObjects: myTreeObjects;
1334 // Hide the objects of disappeared tree, do not switch off flags.
1335 SALOME_ListIO aListOfIO;
1336 QTreeWidgetItemIterator it(aTreeToHide);
1339 TreeWidgetItem* anItem = dynamic_cast<TreeWidgetItem*>(*it);
1340 if ((anItem->flags() & Qt::ItemIsSelectable) &&
1341 anItem->isVisible() && !anItem->isHidden()) {
1342 aListOfIO.Append(anItem->getIO());
1348 aDisplayer->Erase(aListOfIO);
1351 // Show the objects that are marked as shown in the appeared tree.
1352 QTreeWidgetItemIterator it2(myCurrentTreeObjects);
1355 TreeWidgetItem* anItem = dynamic_cast<TreeWidgetItem*>(*it2);
1356 if ((anItem->flags() & Qt::ItemIsSelectable) &&
1357 anItem->isVisible() && !anItem->isHidden()) {
1358 displayItem(anItem);
1364 aDisplayer->UpdateViewer();