Back to index

salome-geom  6.5.0
Public Types | Public Member Functions | Protected Member Functions | Private Slots | Private Member Functions | Private Attributes
GroupGUI_GroupDlg Class Reference

#include <GroupGUI_GroupDlg.h>

List of all members.

Public Types

enum  Mode { CreateGroup, EditGroup }

Public Member Functions

 GroupGUI_GroupDlg (Mode mode, GeometryGUI *, QWidget *parent=0)
 ~GroupGUI_GroupDlg ()

Protected Member Functions

virtual GEOM::GEOM_IOperations_ptr createOperation ()
virtual bool isValid (QString &)
virtual bool execute (ObjectList &)
virtual GEOM::GEOM_Object_ptr getFather (GEOM::GEOM_Object_ptr)
void closeEvent (QCloseEvent *)

Private Slots

void ClickOnOk ()
bool ClickOnApply ()
void ActivateThisDialog ()
void SelectionIntoArgument ()
void SetEditCurrentArgument ()
void ConstructorsClicked (int)
void selectAllSubShapes ()
void add ()
void remove ()
void showOnlySelected ()
void selectionChanged ()

Private Member Functions

void Init ()
void enterEvent (QEvent *)
int subSelectionWay () const
TopAbs_ShapeEnum getShapeType () const
void setShapeType (const TopAbs_ShapeEnum)
void activateSelection ()
void updateState (bool isAdd=false)
void highlightSubShapes ()
void onGetInPlace ()
void setInPlaceObj (GEOM::GEOM_Object_var, const bool isVisible=1)
int getSelectedSubshapes (TColStd_IndexedMapOfInteger &theMapIndex)

Private Attributes

Mode myMode
bool myBusy
bool myIsShapeType
bool myIsHiddenMain
GEOM::GEOM_Object_var myMainObj
GEOM::GEOM_Object_var myGroup
GEOM::GEOM_Object_var myInPlaceObj
int myInPlaceObjSelectState
TColStd_DataMapOfIntegerInteger myMain2InPlaceIndices
QPushButton * mySelBtn
QLineEdit * myMainName
QPushButton * mySelBtn2
QLineEdit * myShape2Name
QGroupBox * myRestrictGroupBox
QButtonGroup * myRestrictGroup
QPushButton * mySelAllBtn
QPushButton * myAddBtn
QPushButton * myRemBtn
QPushButton * myShowOnlyBtn
QPushButton * myHideSelBtn
QPushButton * myShowAllBtn
QListWidget * myIdList

Detailed Description

Definition at line 45 of file GroupGUI_GroupDlg.h.


Member Enumeration Documentation

Enumerator:
CreateGroup 
EditGroup 

Definition at line 50 of file GroupGUI_GroupDlg.h.


Constructor & Destructor Documentation

GroupGUI_GroupDlg::GroupGUI_GroupDlg ( Mode  mode,
GeometryGUI *  theGeometryGUI,
QWidget *  parent = 0 
)

Definition at line 71 of file GroupGUI_GroupDlg.cxx.

  : GEOMBase_Skeleton(theGeometryGUI, parent, false),
    myMode(mode),
    myBusy(false),
    myIsShapeType(false),
    myIsHiddenMain(false)
{
  SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr();

  QPixmap image0     (resMgr->loadPixmap("GEOM", tr("ICON_OBJBROWSER_VERTEX")));
  QPixmap image1     (resMgr->loadPixmap("GEOM", tr("ICON_OBJBROWSER_EDGE")));
  QPixmap image2     (resMgr->loadPixmap("GEOM", tr("ICON_OBJBROWSER_FACE")));
  QPixmap image3     (resMgr->loadPixmap("GEOM", tr("ICON_OBJBROWSER_SOLID")));
  QPixmap iconSelect (resMgr->loadPixmap("GEOM", tr("ICON_SELECT")));

  setWindowTitle(myMode == CreateGroup ? tr("CREATE_GROUP_TITLE") : tr("EDIT_GROUP_TITLE"));

  // Shape type button group
  mainFrame()->GroupConstructors->setEnabled(myMode == CreateGroup);
  mainFrame()->GroupConstructors->setTitle(tr("SHAPE_TYPE"));
  mainFrame()->RadioButton1->setIcon(image0);
  mainFrame()->RadioButton2->setIcon(image1);
  mainFrame()->RadioButton3->setIcon(image2);
  mainFrame()->RadioButton4->setIcon(image3);
  mainFrame()->RadioButton4->show();

  // Group name
  mainFrame()->GroupBoxName->setTitle(tr("GROUP_NAME"));

  // Main shape and sub-shapes
  QGroupBox* GroupMedium = new QGroupBox(tr("MAIN_SUB_SHAPES"), centralWidget());
  QGridLayout* aMedLayout = new QGridLayout(GroupMedium);
  aMedLayout->setMargin(9);
  aMedLayout->setSpacing(6);

  QLabel* aMainLabel = new QLabel(tr("MAIN_SHAPE"), GroupMedium);

  mySelBtn = new QPushButton(GroupMedium);
  mySelBtn->setIcon(iconSelect);
  mySelBtn->setEnabled(myMode == CreateGroup);

  myMainName = new QLineEdit(GroupMedium);
  myMainName->setReadOnly(true);
  myMainName->setEnabled(myMode == CreateGroup);

  myRestrictGroupBox = new QGroupBox(tr("SHAPE_SEL_RESTR"), GroupMedium);
  myRestrictGroup = new QButtonGroup(myRestrictGroupBox);
  QRadioButton* allSubs     = new QRadioButton(tr("NO_RESTR")            , myRestrictGroupBox);
  QRadioButton* inPlaceSubs = new QRadioButton(tr("GEOM_PARTS_OF_SHAPE2"), myRestrictGroupBox);
  QRadioButton* shape2Subs  = new QRadioButton(tr("SUBSHAPES_OF_SHAPE2") , myRestrictGroupBox);
  QGridLayout* aRestrictLayout = new QGridLayout(myRestrictGroupBox);

  QLabel* aSecondLabel = new QLabel(tr("SECOND_SHAPE"), myRestrictGroupBox);
  mySelBtn2 = new QPushButton(myRestrictGroupBox);
  mySelBtn2->setIcon(iconSelect);
  mySelBtn2->setEnabled(false);
  myShape2Name = new QLineEdit(myRestrictGroupBox);
  myShape2Name->setReadOnly(true);
  myShape2Name->setEnabled(false);

  aRestrictLayout->setMargin(9);
  aRestrictLayout->setSpacing(6);
  aRestrictLayout->addWidget(allSubs,      0, 0, 1, 3);
  aRestrictLayout->addWidget(inPlaceSubs,  1, 0, 1, 3);
  aRestrictLayout->addWidget(shape2Subs,   2, 0, 1, 3);
  aRestrictLayout->addWidget(aSecondLabel, 3, 0);
  aRestrictLayout->addWidget(mySelBtn2,    3, 1);
  aRestrictLayout->addWidget(myShape2Name, 3, 2);
  myRestrictGroup->addButton(allSubs,      ALL_SUBSHAPES);
  myRestrictGroup->addButton(inPlaceSubs,  GET_IN_PLACE);
  myRestrictGroup->addButton(shape2Subs,   SUBSHAPES_OF_SHAPE2);
  myRestrictGroupBox->setEnabled(!CORBA::is_nil(myMainObj));
  allSubs->setChecked(true);

  myShowOnlyBtn = new QPushButton(tr("SHOW_ONLY_SELECTED"), GroupMedium);
  myHideSelBtn  = new QPushButton(tr("HIDE_SELECTED"), GroupMedium);
  myShowAllBtn  = new QPushButton(tr("SHOW_ALL_SUB_SHAPES"), GroupMedium);

  mySelAllBtn   = new QPushButton(tr("SELECT_ALL"), GroupMedium);
  myAddBtn      = new QPushButton(tr("ADD"), GroupMedium);
  myRemBtn      = new QPushButton(tr("REMOVE"), GroupMedium);

  myIdList    = new QListWidget(GroupMedium);

  myIdList->setSelectionMode(QAbstractItemView::ExtendedSelection);
  myIdList->setFlow(QListView::TopToBottom);
  myIdList->setWrapping(true);

  aMedLayout->addWidget(aMainLabel,         0, 0);
  aMedLayout->addWidget(mySelBtn,           0, 1);
  aMedLayout->addWidget(myMainName,         0, 2, 1, 2);
  aMedLayout->addWidget(myRestrictGroupBox, 1, 0, 4, 3);

  aMedLayout->addWidget(myShowOnlyBtn,      1, 3);
  aMedLayout->addWidget(myHideSelBtn,       2, 3);
  aMedLayout->addWidget(myShowAllBtn,       3, 3);

  aMedLayout->addWidget(myIdList,           5, 0, 4, 3);
  aMedLayout->addWidget(mySelAllBtn,        5, 3);
  aMedLayout->addWidget(myAddBtn,           6, 3);
  aMedLayout->addWidget(myRemBtn,           7, 3);

  aMedLayout->setColumnStretch(2, 5);
  aMedLayout->setRowStretch(5, 5);
  aMedLayout->setRowStretch(8, 5);

  QVBoxLayout* layout = new QVBoxLayout(centralWidget());
  layout->setMargin(0); layout->setSpacing(6);
  layout->addWidget(GroupMedium);

  setHelpFileName("work_with_groups_page.html");

  Init();
  updateState();
}

Here is the call graph for this function:

Definition at line 187 of file GroupGUI_GroupDlg.cxx.

{
  if (myIsHiddenMain) {
    GEOM_Displayer* aDisplayer = getDisplayer();
    aDisplayer->Display(myMainObj);
    myIsHiddenMain = false;
  }
}

Member Function Documentation

Definition at line 828 of file GroupGUI_GroupDlg.cxx.

{
  erasePreview(false);

  // local selection
  if (!myMainObj->_is_nil() &&
      !myEditCurrentArgument &&
      myIsShapeType) // check if shape type is already choosen by user
  {
    GEOM_Displayer* aDisplayer = getDisplayer();

    // Mantis issue 0021421: do not hide main shape, if explode on VERTEX
    if (getShapeType() == TopAbs_VERTEX) {
      if (myIsHiddenMain)
        aDisplayer->Display(myMainObj);
    }
    else {
      SALOME_View* view = GEOM_Displayer::GetActiveView();
      if (view) {
        CORBA::String_var aMainEntry = myMainObj->GetStudyEntry();
        Handle(SALOME_InteractiveObject) io =
          new SALOME_InteractiveObject (aMainEntry.in(), "GEOM", "TEMP_IO");
        if (view->isVisible(io)) {
          aDisplayer->Erase(myMainObj, 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;

    SUIT_ViewModel* aViewModel = aViewManager->getViewModel();
    SALOME_View* aView = dynamic_cast<SALOME_View*>(aViewModel);
    if (aView == 0) return;

    TopoDS_Shape aMainShape = GEOM_Client::get_client().GetShape(GeometryGUI::GetGeomGen(), myMainObj);
    TopoDS_Shape aRestrictionShape;

    if (subSelectionWay() == ALL_SUBSHAPES) {
      aRestrictionShape = aMainShape;

      TopTools_IndexedMapOfShape aSubShapesMap;
      TopExp::MapShapes(aMainShape, aSubShapesMap);
      CORBA::String_var aMainEntry = myMainObj->GetStudyEntry();
      QString anEntryBase = aMainEntry.in();

      TopExp_Explorer anExp (aRestrictionShape, getShapeType());
      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
          // TODO: map or delete Prs
        }
      }
    }
    else if (!myInPlaceObj->_is_nil()) {
      TopTools_IndexedMapOfShape aSubShapesMap;
      TopExp::MapShapes(aMainShape, aSubShapesMap);
      CORBA::String_var aMainEntry = myMainObj->GetStudyEntry();
      QString anEntryBase = aMainEntry.in();

      TColStd_DataMapIteratorOfDataMapOfIntegerInteger aM2IPit (myMain2InPlaceIndices);
      for (; aM2IPit.More(); aM2IPit.Next()) {
        int index = aM2IPit.Key();
        TopoDS_Shape aSubShape = aSubShapesMap.FindKey(index);
        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
        }
      }
    }
    else ;

    aDisplayer->UpdateViewer();
    aDisplayer->SetDisplayMode(prevDisplayMode);
  }

  globalSelection(GEOM_ALLSHAPES);

  SelectionIntoArgument();
}

Here is the call graph for this function:

Here is the caller graph for this function:

void GroupGUI_GroupDlg::ActivateThisDialog ( ) [private, slot]

Definition at line 327 of file GroupGUI_GroupDlg.cxx.

{
  GEOMBase_Skeleton::ActivateThisDialog();

  connect(myGeomGUI->getApp()->selectionMgr(), SIGNAL(currentSelectionChanged()),
          this, SLOT(SelectionIntoArgument()));

  activateSelection();
}

Here is the call graph for this function:

Here is the caller graph for this function:

void GroupGUI_GroupDlg::add ( ) [private, slot]

Definition at line 732 of file GroupGUI_GroupDlg.cxx.

{
  TColStd_IndexedMapOfInteger aMapIndex;
  int nbSel = getSelectedSubshapes(aMapIndex);

  TColStd_MapOfInteger aMap;
  for (int i = 0, n = myIdList->count(); i < n; i++)
    aMap.Add(myIdList->item(i)->text().toInt());

  if (nbSel > 0) {
    bool isBlocked = myIdList->signalsBlocked();
    myIdList->blockSignals(true);

    for (int i = 1, n = aMapIndex.Extent(); i <= n; i++) {
      if (aMap.Contains(aMapIndex(i)))
        continue;

      QListWidgetItem* anItem = new QListWidgetItem(QString("%1").arg(aMapIndex(i)));
      myIdList->addItem(anItem);
      anItem->setSelected(true);
    }

    myIdList->blockSignals(isBlocked);
  }

  updateState();
}

Here is the call graph for this function:

Here is the caller graph for this function:

bool GroupGUI_GroupDlg::ClickOnApply ( ) [private, slot]

Definition at line 306 of file GroupGUI_GroupDlg.cxx.

{
  if (!onAccept(myMode == CreateGroup, true))
    return false;

  if (myMode == CreateGroup)
  {
    initName();
    myIdList->clear();
    ConstructorsClicked(getConstructorId());
  }
  else
    activateSelection();

  return true;
}

Here is the call graph for this function:

Here is the caller graph for this function:

void GroupGUI_GroupDlg::ClickOnOk ( ) [private, slot]

Definition at line 295 of file GroupGUI_GroupDlg.cxx.

{
  setIsApplyAndClose(true);
  if (ClickOnApply())
    ClickOnCancel();
}

Here is the call graph for this function:

Here is the caller graph for this function:

void GroupGUI_GroupDlg::closeEvent ( QCloseEvent *  e) [protected]

Definition at line 283 of file GroupGUI_GroupDlg.cxx.

{
  setInPlaceObj(GEOM::GEOM_Object::_nil());
  erasePreview(true);

  GEOMBase_Skeleton::closeEvent(e);
}

Here is the call graph for this function:

void GroupGUI_GroupDlg::ConstructorsClicked ( int  constructorId) [private, slot]

Definition at line 543 of file GroupGUI_GroupDlg.cxx.

{
  if (getConstructorId() != constructorId)
    setConstructorId(constructorId);

  myIsShapeType = true;
  myIdList->clear();
  myEditCurrentArgument = 0;

  setInPlaceObj(myInPlaceObj); // to rebuild myMain2InPlaceIndices
  activateSelection();
  updateState();
}

Here is the call graph for this function:

Here is the caller graph for this function:

GEOM::GEOM_IOperations_ptr GroupGUI_GroupDlg::createOperation ( ) [protected, virtual]

Definition at line 1071 of file GroupGUI_GroupDlg.cxx.

{
  return getGeomEngine()->GetIGroupOperations(getStudyId());
}
void GroupGUI_GroupDlg::enterEvent ( QEvent *  e) [private]

Definition at line 273 of file GroupGUI_GroupDlg.cxx.

{
  if (!buttonCancel()->isEnabled())
    ActivateThisDialog();
}

Here is the call graph for this function:

bool GroupGUI_GroupDlg::execute ( ObjectList objects) [protected, virtual]

Definition at line 1110 of file GroupGUI_GroupDlg.cxx.

{
  GEOM::GEOM_IGroupOperations_var anOper = GEOM::GEOM_IGroupOperations::_narrow(getOperation());

  GEOM::GEOM_Object_var aGroup;
  if (myMode == CreateGroup)
    aGroup = anOper->CreateGroup(myMainObj, getShapeType());
  else if (myMode == EditGroup)
    aGroup = myGroup;

  if (CORBA::is_nil(aGroup) || (myMode == CreateGroup && !anOper->IsDone()))
    return false;

  GEOM::ListOfLong_var aCurrList = anOper->GetObjects(aGroup);
  if (!anOper->IsDone())
    return false;

  if (aCurrList->length() > 0)
  {
    anOper->DifferenceIDs(aGroup, aCurrList);
    if (!anOper->IsDone())
      return false;
  }

  int ii, nn = myIdList->count();
  if (nn > 0)
  {
    GEOM::ListOfLong_var aNewList = new GEOM::ListOfLong;
    aNewList->length(nn);
    for (ii = 0; ii < nn; ii++) {
      aNewList[ii] = myIdList->item(ii)->text().toInt();
    }
    anOper->UnionIDs(aGroup, aNewList);
    if (!anOper->IsDone())
      return false;
  }

  SalomeApp_Study* study = getStudy();
  if (study) {
    QString objIOR = GEOMBase::GetIORFromObject(aGroup);
    if (objIOR != "") {
      _PTR(SObject) SO (study->studyDS()->FindObjectIOR(objIOR.toLatin1().constData()));
      if (SO) {
        _PTR(StudyBuilder) aBuilder (study->studyDS()->NewBuilder());
        aBuilder->SetName(SO, getNewObjectName().toLatin1().constData());
      }
    }
  }

  objects.push_back(aGroup._retn());

  return true;
}

Here is the call graph for this function:

GEOM::GEOM_Object_ptr GroupGUI_GroupDlg::getFather ( GEOM::GEOM_Object_ptr  theObj) [protected, virtual]

Definition at line 1169 of file GroupGUI_GroupDlg.cxx.

{
  GEOM::GEOM_Object_var aFatherObj;
  if (theObj->GetType() == GEOM_GROUP) {
    GEOM::GEOM_IGroupOperations_var anOper = GEOM::GEOM_IGroupOperations::_narrow(getOperation());
    aFatherObj = anOper->GetMainShape(theObj);
  }
  return aFatherObj._retn();
}
int GroupGUI_GroupDlg::getSelectedSubshapes ( TColStd_IndexedMapOfInteger &  theMapIndex) [private]

Definition at line 663 of file GroupGUI_GroupDlg.cxx.

{
  theMapIndex.Clear();

  SalomeApp_Application* app = myGeomGUI->getApp();
  if (!app || myMainObj->_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<SalomeApp_Study*>(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() == getShapeType()) {
            TopTools_IndexedMapOfShape aMainMap;
            TopoDS_Shape aMainShape = GEOM_Client::get_client().GetShape(GeometryGUI::GetGeomGen(), myMainObj);
            TopExp::MapShapes(aMainShape, aMainMap);

            TopExp_Explorer anExp (aShape, getShapeType());
            for (; anExp.More(); anExp.Next()) {
              TopoDS_Shape aSubShape = anExp.Current();
              int anIndex = aMainMap.FindIndex(aSubShape);
              if (anIndex >= 0) {
                if (subSelectionWay() != ALL_SUBSHAPES &&
                    !myMain2InPlaceIndices.IsBound(anIndex))
                  continue;
                theMapIndex.Add(anIndex);
              }
            }
          }
        }
      }
    } // for aSelList
  }

  return theMapIndex.Extent();
}

Here is the call graph for this function:

Here is the caller graph for this function:

TopAbs_ShapeEnum GroupGUI_GroupDlg::getShapeType ( ) const [private]

Definition at line 791 of file GroupGUI_GroupDlg.cxx.

{
  switch (getConstructorId()) {
  case 0:  return TopAbs_VERTEX;
  case 1:  return TopAbs_EDGE;
  case 2:  return TopAbs_FACE;
  case 3:  return TopAbs_SOLID;
  default: return TopAbs_SHAPE;
  }
}

Here is the caller graph for this function:

Definition at line 961 of file GroupGUI_GroupDlg.cxx.

{
  if (CORBA::is_nil(myMainObj))
    return;

  TColStd_MapOfInteger anIds;

  myBusy = true;

  int ii = 0, nn = myIdList->count();
  for (; ii < nn; ii++)
  {
    if (myIdList->item(ii)->isSelected()) {
      int id = myIdList->item(ii)->text().toInt();
      if (subSelectionWay() != ALL_SUBSHAPES &&
          !myMain2InPlaceIndices.IsBound(id)) {
        //myIdList->item(ii)->setSelected(false);
      }
      else {
        anIds.Add(id);
      }
    }
  }
  SalomeApp_Application* app = myGeomGUI->getApp();
  LightApp_SelectionMgr* aSelMgr = app->selectionMgr();
  aSelMgr->clearSelected();

  SUIT_ViewWindow* aViewWindow = 0;
  SUIT_Study* activeStudy = app->activeStudy();
  if (activeStudy)
    aViewWindow = app->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<SALOME_View*>(aViewModel);
  if (aView == 0) return;

  // TODO??: use here GEOMBase_Helper::myPreview instead of ic->DisplayedObjects()

  OCCViewer_Viewer* v3d = ((OCCViewer_ViewManager*)aViewManager)->getOCCViewer();
  Handle(AIS_InteractiveContext) ic = v3d->getAISContext();
  AIS_ListOfInteractive List;
  //ic->DisplayedObjects(List);
  ic->ObjectsInside(List); // Mantis issue 0021367

  SALOME_ListIO aSelList;

  // To highlight the selected sub-shape in Object Browser, if it's already published under the main shape
  GEOM::GEOM_ILocalOperations_var aLocOp = getGeomEngine()->GetILocalOperations(getStudyId());
  QMap<int, QString> childsMap;
  SalomeApp_Study* appStudy = dynamic_cast<SalomeApp_Study*>(app->activeStudy());
  if (appStudy) {
    _PTR(Study) aStudy = appStudy->studyDS();
    CORBA::String_var aMainEntry = myMainObj->GetStudyEntry();
    QString anEntry = aMainEntry.in();
    _PTR(SObject) aSObj (aStudy->FindObjectID(anEntry.toLatin1().constData()));
    _PTR(ChildIterator) anIt (aStudy->NewChildIterator(aSObj));
    for (anIt->InitEx(true); anIt->More(); anIt->Next()) {
      GEOM::GEOM_Object_var aChild = GEOM::GEOM_Object::_narrow(GeometryGUI::ClientSObjectToObject(anIt->Value()));
      if (!CORBA::is_nil(aChild)) {
        int index = aLocOp->GetSubShapeIndex(myMainObj, aChild);
        CORBA::String_var aChildEntry = aChild->GetStudyEntry();
        QString anEntry = aChildEntry.in();
        childsMap.insert(index, anEntry);
      }
    }
  }

  AIS_ListIteratorOfListOfInteractive ite (List);
  for (; ite.More(); ite.Next()) {
    if (ite.Value()->IsInstance(STANDARD_TYPE(GEOM_AISShape))) {
      Handle(GEOM_AISShape) aSh = Handle(GEOM_AISShape)::DownCast(ite.Value());
      if (aSh->hasIO()) {
        Handle(SALOME_InteractiveObject) anIO = aSh->getIO();
        QString anEntry = anIO->getEntry();
        int index = anEntry.lastIndexOf("_");
        anEntry.remove(0, index+1);
        int anIndex = anEntry.toInt();
        if (anIds.Contains(anIndex)) {
          aSelList.Append(anIO);
          if (childsMap.contains (anIndex)) {
            Handle(SALOME_InteractiveObject) tmpIO = new SALOME_InteractiveObject(childsMap.value(anIndex).toLatin1().constData(), "GEOM", "TEMP_IO");
            aSelList.Append(tmpIO);
          }
        }
      }
    }
  }
  aSelMgr->setSelectedObjects(aSelList);

  myBusy = false;

  if (nn < 3000)
    updateState(aSelList.Extent() > 0);
  else {
    myAddBtn->setEnabled(true);
    myAddBtn->setEnabled(true);
    myRemBtn->setEnabled(true);
  }
}

Here is the call graph for this function:

Here is the caller graph for this function:

void GroupGUI_GroupDlg::Init ( ) [private]

Definition at line 200 of file GroupGUI_GroupDlg.cxx.

{
  LightApp_SelectionMgr* aSelMgr = myGeomGUI->getApp()->selectionMgr();

  //unset shape type to avoid preparation of selection before exact user shape type selection
  unsetConstructorId();
  myIsShapeType = false;

  if (myMode == CreateGroup) {
    initName(tr("GROUP_PREFIX"));

    // Get ready for main shape selection
    myEditCurrentArgument = myMainName;

    connect(this, SIGNAL(constructorsClicked(int)), this, SLOT(ConstructorsClicked(int)));
    connect(mySelBtn,         SIGNAL(clicked()),    this, SLOT(SetEditCurrentArgument()));
    connect(mySelBtn2,        SIGNAL(clicked()),    this, SLOT(SetEditCurrentArgument()));
  }
  else if (myMode == EditGroup) {
    SALOME_ListIO aSelList;
    aSelMgr->selectedObjects(aSelList);

    if (aSelList.Extent()) {
      GEOM::GEOM_Object_var anObj =
        GEOMBase::ConvertIOinGEOMObject(aSelList.First());

      if (!CORBA::is_nil(anObj) && anObj->GetType() == GEOM_GROUP) {
        myGroup = anObj;

        mainFrame()->ResultName->setText(GEOMBase::GetName(myGroup));

        GEOM::GEOM_IGroupOperations_var anOper = GEOM::GEOM_IGroupOperations::_narrow(getOperation());
        myMainObj = anOper->GetMainShape(myGroup);
        if (!CORBA::is_nil(myMainObj))
          myMainName->setText(GEOMBase::GetName(myMainObj));

        setShapeType((TopAbs_ShapeEnum)anOper->GetType(myGroup));

        GEOM::ListOfLong_var aCurrList = anOper->GetObjects(myGroup);
        for (int i = 0, n = aCurrList->length(); i < n; i++)
          myIdList->addItem(new QListWidgetItem(QString("%1").arg(aCurrList[i])));

        myEditCurrentArgument = 0;
      }
      connect(mySelBtn2, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument()));
    }
  }

  connect(aSelMgr, SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument()));

  connect(buttonOk(),    SIGNAL(clicked()), this, SLOT(ClickOnOk()));
  connect(buttonApply(), SIGNAL(clicked()), this, SLOT(ClickOnApply()));

  connect(myRestrictGroup, SIGNAL(buttonClicked(int)),     this, SLOT(SetEditCurrentArgument()));
  connect(mySelAllBtn,     SIGNAL(clicked()),              this, SLOT(selectAllSubShapes()));
  connect(myAddBtn,        SIGNAL(clicked()),              this, SLOT(add()));
  connect(myRemBtn,        SIGNAL(clicked()),              this, SLOT(remove()));
  connect(myShowOnlyBtn,   SIGNAL(clicked()),              this, SLOT(showOnlySelected()));
  connect(myHideSelBtn,    SIGNAL(clicked()),              this, SLOT(showOnlySelected()));
  connect(myShowAllBtn,    SIGNAL(clicked()),              this, SLOT(showOnlySelected()));
  connect(myIdList,        SIGNAL(itemSelectionChanged()), this, SLOT(selectionChanged()));

  setInPlaceObj(GEOM::GEOM_Object::_nil());

  myBusy = true; // just activate but do not select in the list
  activateSelection();
  myBusy = false;
}

Here is the call graph for this function:

Here is the caller graph for this function:

bool GroupGUI_GroupDlg::isValid ( QString &  theMessage) [protected, virtual]

Definition at line 1086 of file GroupGUI_GroupDlg.cxx.

{
  SalomeApp_Study* study = getStudy();
  ASSERT(study);
  RETURN_WITH_MSG  (!study->studyDS()->GetProperties()->IsLocked(), tr("GEOM_STUDY_LOCKED"))

  if (myMode == CreateGroup) {
    RETURN_WITH_MSG(!CORBA::is_nil(myMainObj), tr("NO_MAIN_OBJ"))
  }
  else {
    RETURN_WITH_MSG(!CORBA::is_nil(myMainObj), tr("NO_GROUP"))
  }

  QString aName (getNewObjectName());
  RETURN_WITH_MSG  (!aName.trimmed().isEmpty(), tr("EMPTY_NAME"))

  RETURN_WITH_MSG  (myIdList->count(), tr("EMPTY_LIST"))
  return true;
}
void GroupGUI_GroupDlg::onGetInPlace ( ) [private]

Definition at line 369 of file GroupGUI_GroupDlg.cxx.

{
  setInPlaceObj(GEOM::GEOM_Object::_nil());
  myEditCurrentArgument->setText("");

  bool isBlocked = myIdList->signalsBlocked();
  myIdList->blockSignals(true);
  myIdList->clearSelection();
  myIdList->blockSignals(isBlocked);

  LightApp_SelectionMgr* aSelMgr = myGeomGUI->getApp()->selectionMgr();
  SALOME_ListIO aSelList;
  aSelMgr->selectedObjects(aSelList);

  if (aSelList.Extent() != 1)
    return;

  GEOM::GEOM_Object_var anObj =
    GEOMBase::ConvertIOinGEOMObject(aSelList.First());
  if (GEOMBase::IsShape(anObj)) {
    if (!anObj->_is_equivalent(myMainObj) && !anObj->_is_equivalent(myGroup)) {
      SUIT_OverrideCursor wc;
      myEditCurrentArgument->setText(GEOMBase::GetName(anObj));
      GEOM::GEOM_IShapesOperations_var aShapesOp =
        getGeomEngine()->GetIShapesOperations(getStudyId());
      if (subSelectionWay() == GET_IN_PLACE) {
        GEOM::GEOM_Object_var aGetInPlaceObj = aShapesOp->GetInPlace(myMainObj, anObj);
        setInPlaceObj(aGetInPlaceObj);
      }
      else {
        bool isVisible = true;
        if (SALOME_View* view = GEOM_Displayer::GetActiveView())
          isVisible = view->isVisible(aSelList.First());
        setInPlaceObj(anObj, isVisible);
      }
      myEditCurrentArgument = 0;
      //myBusy = true; // just activate but do not select in the list
      activateSelection();
      //myBusy = false;
    }
  }
}

Here is the call graph for this function:

Here is the caller graph for this function:

void GroupGUI_GroupDlg::remove ( ) [private, slot]

Definition at line 764 of file GroupGUI_GroupDlg.cxx.

{
  bool isBlocked = myIdList->signalsBlocked();
  myIdList->blockSignals(true);

  QListIterator<QListWidgetItem*> it (myIdList->selectedItems());
  while (it.hasNext())
    delete it.next();

  myIdList->blockSignals(isBlocked);

  highlightSubShapes();
}

Here is the call graph for this function:

void GroupGUI_GroupDlg::selectAllSubShapes ( ) [private, slot]

Definition at line 561 of file GroupGUI_GroupDlg.cxx.

{
  if (CORBA::is_nil(myMainObj) || !myIsShapeType)
    return;

  GEOM::ListOfLong_var aSubShapes;
  GEOM::GEOM_IShapesOperations_var aShOp = getGeomEngine()->GetIShapesOperations(getStudyId());
  aSubShapes = aShOp->SubShapeAllIDs(myMainObj, getShapeType(), false);
  if (aSubShapes->length() > 0) {
    if (subSelectionWay() == ALL_SUBSHAPES)
    {
      myIdList->clear(); // for sorted final list?

      if (!aShOp->IsDone())
        return;
    }
    else
    {
      aSubShapes = new GEOM::ListOfLong();
      aSubShapes->length(myMain2InPlaceIndices.Extent());
      TColStd_DataMapIteratorOfDataMapOfIntegerInteger m2ip (myMain2InPlaceIndices);
      for (int i = 0; m2ip.More(); i++, m2ip.Next())
        aSubShapes[i] = m2ip.Key();
    }

    bool isBlocked = myIdList->signalsBlocked();
    myIdList->blockSignals(true);

    for (int i = 0, n = aSubShapes->length(); i < n; i++) {
      CORBA::Long anIndex = aSubShapes[i];
      if (anIndex < 0)
        continue;

      QListWidgetItem* anItem = 0;
      QString text = QString("%1").arg(anIndex);
      if (!myInPlaceObj->_is_nil()) {
        QList<QListWidgetItem*> found = myIdList->findItems(text, Qt::MatchExactly);
        if (found.count()) anItem = found[0];
      }
      if (!anItem) {
        anItem = new QListWidgetItem(text);
        myIdList->addItem(anItem);
      }
      anItem->setSelected(true);
    }

    myIdList->blockSignals(isBlocked);
    highlightSubShapes();
  }
}

Here is the call graph for this function:

Here is the caller graph for this function:

void GroupGUI_GroupDlg::selectionChanged ( ) [private, slot]

Definition at line 952 of file GroupGUI_GroupDlg.cxx.

Here is the call graph for this function:

Here is the caller graph for this function:

void GroupGUI_GroupDlg::SelectionIntoArgument ( ) [private, slot]

Definition at line 463 of file GroupGUI_GroupDlg.cxx.

{
  if (subSelectionWay() != ALL_SUBSHAPES && myEditCurrentArgument == myShape2Name) {
    onGetInPlace();
    return;
  }

  if (myEditCurrentArgument == myMainName) {  // Selection of a main shape is active
    myEditCurrentArgument->setText("");
    myIdList->clear();

    LightApp_SelectionMgr* aSelMgr = myGeomGUI->getApp()->selectionMgr();
    SALOME_ListIO aSelList;
    aSelMgr->selectedObjects(aSelList);
    int nbSel = aSelList.Extent();

    if (nbSel == 1) {
      GEOM::GEOM_Object_var anObj =
        GEOMBase::ConvertIOinGEOMObject(aSelList.First());

      if (GEOMBase::IsShape(anObj)) {
        if (myIsHiddenMain) {
          GEOM_Displayer* aDisplayer = getDisplayer();
          aDisplayer->Display(myMainObj);
          myIsHiddenMain = false;
        }
        myMainObj = anObj;
        myEditCurrentArgument->setText(GEOMBase::GetName(anObj));
        // activate sub-shapes selection by default
        myEditCurrentArgument = 0;
        activateSelection();
        updateState();
      }
    }
    else {
      if (myIsHiddenMain) {
        GEOM_Displayer* aDisplayer = getDisplayer();
        aDisplayer->Display(myMainObj);
        myIsHiddenMain = false;
      }
      myMainObj = GEOM::GEOM_Object::_nil();
    }
  }
  else { // an attempt to synchronize list box selection with 3d viewer
    if (myBusy || myMainObj->_is_nil()) {
      return;
    }

    bool isBlocked = myIdList->signalsBlocked();
    myIdList->blockSignals(true);
    myIdList->clearSelection();

    TColStd_IndexedMapOfInteger aMapIndex;
    int nbSel = getSelectedSubshapes(aMapIndex);

    if (nbSel) {
      QMap<int, int> aMap;
      for (int i = 0, n = myIdList->count(); i < n; i++)
        aMap.insert(myIdList->item(i)->text().toInt(), i);

      bool highlight = false;
      for (int ii = 1, nn = aMapIndex.Extent(); ii <= nn; ii++) {
        if (aMap.contains(aMapIndex(ii))) {
          myIdList->item(aMap[aMapIndex(ii)])->setSelected(true);
          highlight = true;
        }
      }
      if (highlight)
        highlightSubShapes();
    }
    myIdList->blockSignals(isBlocked);

    updateState(nbSel);
  }
}

Here is the call graph for this function:

Here is the caller graph for this function:

Definition at line 341 of file GroupGUI_GroupDlg.cxx.

{
  QPushButton* send = (QPushButton*)sender();

  if (send == mySelBtn) {
    myEditCurrentArgument = myMainName;
    myShape2Name->setText("");
  }
  else if (send == mySelBtn2 || sender() == myRestrictGroup) {
    setInPlaceObj(GEOM::GEOM_Object::_nil());
    myShape2Name->setText("");
    if (subSelectionWay() != ALL_SUBSHAPES) {
      myEditCurrentArgument = myShape2Name;
    }
    else {
      myEditCurrentArgument = 0;
    }
  }

  activateSelection();

  updateState();
}

Here is the call graph for this function:

Here is the caller graph for this function:

void GroupGUI_GroupDlg::setInPlaceObj ( GEOM::GEOM_Object_var  theObj,
const bool  isVisible = 1 
) [private]

Definition at line 416 of file GroupGUI_GroupDlg.cxx.

{
  if (!myInPlaceObj->_is_equivalent(theObj))
  {
    myInPlaceObj = theObj;
  }

  // build map of indices
  myMain2InPlaceIndices.Clear();
  if (!myInPlaceObj->_is_nil()) {
    GEOM::GEOM_IShapesOperations_var aShapesOp = getGeomEngine()->GetIShapesOperations(getStudyId());
    GEOM::GEOM_ILocalOperations_var aLocOp = getGeomEngine()->GetILocalOperations(getStudyId());

    GEOM::ListOfGO_var aSubObjects = aShapesOp->MakeExplode(myInPlaceObj, getShapeType(), false);
    for ( int i = 0; i < aSubObjects->length(); i++ )
    {
      GEOM::ListOfLong_var aCurrList = aShapesOp->GetSameIDs( myMainObj, aSubObjects[i] );
      if( aCurrList->length() > 1 ) {
        //rnv : To Fix the 21561: EDF 2184 GEOM: Group with second shape restriction.
        //      In case if GetSameIDs(...) method return more then one ID use 
        //      GetSharedShapes(...) method to get sub-shapes of the second shape.
        GEOM::ListOfGO_var aSubObjects2 = aShapesOp->GetSharedShapes( myMainObj, aSubObjects[i], getShapeType() );
        for( int j = 0; j < aSubObjects2->length(); j++ ) {
          CORBA::Long aMainIndex =  aLocOp->GetSubShapeIndex( myMainObj, aSubObjects2[j] );
          CORBA::Long aPlaceIndex = aLocOp->GetSubShapeIndex( myInPlaceObj, aSubObjects[i]);
          if ( aMainIndex >= 0 && aPlaceIndex > 0 ) {
            myMain2InPlaceIndices.Bind( aMainIndex, aPlaceIndex );
          }
        }
      } else if(aCurrList->length() > 0 ) {
        CORBA::Long aMainIndex = aCurrList[0];
        CORBA::Long aPlaceIndex = aLocOp->GetSubShapeIndex( myInPlaceObj, aSubObjects[i] );
        if ( aMainIndex >= 0 && aPlaceIndex > 0) {
          myMain2InPlaceIndices.Bind( aMainIndex, aPlaceIndex );
        }
      }
    }
  }
  myInPlaceObjSelectState = subSelectionWay();
  if (myInPlaceObjSelectState == SUBSHAPES_OF_SHAPE2 && !isVisible)
    myInPlaceObjSelectState = SUBSHAPES_OF_INVISIBLE_SHAPE2;
}

Here is the call graph for this function:

Here is the caller graph for this function:

void GroupGUI_GroupDlg::setShapeType ( const TopAbs_ShapeEnum  theType) [private]

Definition at line 806 of file GroupGUI_GroupDlg.cxx.

{
  int anId = 0;
  switch (theType) {
  case TopAbs_VERTEX: anId = 0; break;
  case TopAbs_EDGE:   anId = 1; break;
  case TopAbs_FACE:   anId = 2; break;
  case TopAbs_SOLID:  anId = 3; break;
  }
  setConstructorId(anId);
  if (!myIsShapeType)
  {
    myIsShapeType = true;
    // workaround to avoid set checked button 0
    setConstructorId(anId);
  }
}

Here is the caller graph for this function:

void GroupGUI_GroupDlg::showOnlySelected ( ) [private, slot]

Definition at line 616 of file GroupGUI_GroupDlg.cxx.

{
  if (CORBA::is_nil(myMainObj) || !myIsShapeType)
    return;

  QPushButton* send = (QPushButton*)sender();
  if (send == myShowAllBtn) {
    activateSelection();
    return;
  }

  LightApp_SelectionMgr* aSelMgr = myGeomGUI->getApp()->selectionMgr();
  SALOME_ListIO aSelList;
  aSelMgr->selectedObjects(aSelList);

  GEOM_Displayer* aDisplayer = getDisplayer();

  if (send == myHideSelBtn) {
    aDisplayer->Erase(aSelList, /*forced=*/false, /*updateViewer=*/true);
  }
  else {
    // Mantis issue 0021421: do not hide main shape, if explode on VERTEX
    SALOME_View* view = GEOM_Displayer::GetActiveView();
    if (view) {
      CORBA::String_var aMainEntry = myMainObj->GetStudyEntry();
      Handle(SALOME_InteractiveObject) io =
        new SALOME_InteractiveObject (aMainEntry.in(), "GEOM", "TEMP_IO");
      if (view->isVisible(io)) myIsHiddenMain = true;
    }

    aDisplayer->EraseAll(/*forced = false, updateViewer = true*/);
    aDisplayer->Display(aSelList, true);

    // Mantis issue 0021421: do not hide main shape, if explode on VERTEX
    if (getShapeType() == TopAbs_VERTEX && myIsHiddenMain) {
      aDisplayer->Display(myMainObj);
    }

    // for the case when selected ids were not displayed in the viewer: Mantis issue 0021367
    highlightSubShapes();
  }
}

Here is the call graph for this function:

Here is the caller graph for this function:

int GroupGUI_GroupDlg::subSelectionWay ( ) const [private]

Definition at line 782 of file GroupGUI_GroupDlg.cxx.

{
  return myRestrictGroup->checkedId();
}

Here is the caller graph for this function:

void GroupGUI_GroupDlg::updateState ( bool  isAdd = false) [private]

Definition at line 931 of file GroupGUI_GroupDlg.cxx.

{
  myAddBtn->setEnabled(!myEditCurrentArgument && !CORBA::is_nil(myMainObj) && isAdd);
  //myShowOnlyBtn->setEnabled(!myEditCurrentArgument && !CORBA::is_nil(myMainObj) && isAdd);

  bool hasSel = myIdList->selectedItems().count() > 0;

  myRemBtn->setEnabled(hasSel);
  myRestrictGroupBox->setEnabled(!CORBA::is_nil(myMainObj));
  mySelAllBtn->setEnabled(!CORBA::is_nil(myMainObj));

  mySelBtn2->setEnabled(subSelectionWay() != ALL_SUBSHAPES);
  myShape2Name->setEnabled(subSelectionWay() != ALL_SUBSHAPES);
  if (subSelectionWay() == ALL_SUBSHAPES)
    setInPlaceObj(GEOM::GEOM_Object::_nil());
}

Here is the call graph for this function:

Here is the caller graph for this function:


Member Data Documentation

QPushButton* GroupGUI_GroupDlg::myAddBtn [private]

Definition at line 113 of file GroupGUI_GroupDlg.h.

bool GroupGUI_GroupDlg::myBusy [private]

Definition at line 97 of file GroupGUI_GroupDlg.h.

GEOM::GEOM_Object_var GroupGUI_GroupDlg::myGroup [private]

Definition at line 101 of file GroupGUI_GroupDlg.h.

QPushButton* GroupGUI_GroupDlg::myHideSelBtn [private]

Definition at line 116 of file GroupGUI_GroupDlg.h.

QListWidget* GroupGUI_GroupDlg::myIdList [private]

Definition at line 118 of file GroupGUI_GroupDlg.h.

GEOM::GEOM_Object_var GroupGUI_GroupDlg::myInPlaceObj [private]

Definition at line 102 of file GroupGUI_GroupDlg.h.

Definition at line 103 of file GroupGUI_GroupDlg.h.

Definition at line 99 of file GroupGUI_GroupDlg.h.

Definition at line 98 of file GroupGUI_GroupDlg.h.

TColStd_DataMapOfIntegerInteger GroupGUI_GroupDlg::myMain2InPlaceIndices [private]

Definition at line 104 of file GroupGUI_GroupDlg.h.

QLineEdit* GroupGUI_GroupDlg::myMainName [private]

Definition at line 107 of file GroupGUI_GroupDlg.h.

GEOM::GEOM_Object_var GroupGUI_GroupDlg::myMainObj [private]

Definition at line 100 of file GroupGUI_GroupDlg.h.

Definition at line 96 of file GroupGUI_GroupDlg.h.

QPushButton* GroupGUI_GroupDlg::myRemBtn [private]

Definition at line 114 of file GroupGUI_GroupDlg.h.

QButtonGroup* GroupGUI_GroupDlg::myRestrictGroup [private]

Definition at line 111 of file GroupGUI_GroupDlg.h.

Definition at line 110 of file GroupGUI_GroupDlg.h.

QPushButton* GroupGUI_GroupDlg::mySelAllBtn [private]

Definition at line 112 of file GroupGUI_GroupDlg.h.

QPushButton* GroupGUI_GroupDlg::mySelBtn [private]

Definition at line 106 of file GroupGUI_GroupDlg.h.

QPushButton* GroupGUI_GroupDlg::mySelBtn2 [private]

Definition at line 108 of file GroupGUI_GroupDlg.h.

QLineEdit* GroupGUI_GroupDlg::myShape2Name [private]

Definition at line 109 of file GroupGUI_GroupDlg.h.

QPushButton* GroupGUI_GroupDlg::myShowAllBtn [private]

Definition at line 117 of file GroupGUI_GroupDlg.h.

QPushButton* GroupGUI_GroupDlg::myShowOnlyBtn [private]

Definition at line 115 of file GroupGUI_GroupDlg.h.


The documentation for this class was generated from the following files: