0020501: EDF 1098 SMESH: Display only groups, edit a group: can't select face from other group

This commit is contained in:
dmv 2009-10-02 07:17:29 +00:00
parent 7af78cc3d0
commit 425391ca7c
4 changed files with 143 additions and 95 deletions

View File

@ -1245,6 +1245,16 @@ void SMESHGUI::EmitSignalCloseAllDialogs()
emit SignalCloseAllDialogs();
}
//=============================================================================
/*!
*
*/
//=============================================================================
void SMESHGUI::EmitSignalVisibilityChanged()
{
emit SignalVisibilityChanged();
}
//=============================================================================
/*!
*
@ -1541,8 +1551,10 @@ bool SMESHGUI::OnGUIEvent( int theCommandID )
for ( ; It.More(); It.Next()) {
Handle(SALOME_InteractiveObject) IOS = It.Value();
if (IOS->hasEntry()) {
if (!SMESH::UpdateView(anAction, IOS->getEntry()))
if (!SMESH::UpdateView(anAction, IOS->getEntry())) {
SMESHGUI::GetSMESHGUI()->EmitSignalVisibilityChanged();
break; // PAL16774 (Crash after display of many groups)
}
if (anAction == SMESH::eDisplayOnly)
anAction = SMESH::eDisplay;
}
@ -1550,8 +1562,10 @@ bool SMESHGUI::OnGUIEvent( int theCommandID )
}
// PAL13338 + PAL15161 -->
if ( ( theCommandID==301 || theCommandID==302 ) && !checkLock(aStudy))
if ( ( theCommandID==301 || theCommandID==302 ) && !checkLock(aStudy)) {
SMESH::UpdateView();
SMESHGUI::GetSMESHGUI()->EmitSignalVisibilityChanged();
}
// PAL13338 + PAL15161 <--
}
catch (...) { // PAL16774 (Crash after display of many groups)
@ -1564,7 +1578,7 @@ bool SMESHGUI::OnGUIEvent( int theCommandID )
}
else
aSel->setSelectedObjects( to_process );
break;
}

View File

@ -103,6 +103,7 @@ public :
void EmitSignalDeactivateDialog();
void EmitSignalStudyFrameChanged();
void EmitSignalCloseAllDialogs();
void EmitSignalVisibilityChanged();
virtual void contextMenuPopup( const QString&, QMenu*, QString& );
virtual void createPreferences();
@ -131,6 +132,7 @@ signals:
void SignalDeactivateActiveDialog();
void SignalStudyFrameChanged();
void SignalCloseAllDialogs();
void SignalVisibilityChanged();
protected:
void createSMESHAction( const int,

View File

@ -109,8 +109,7 @@ SMESHGUI_GroupDlg::SMESHGUI_GroupDlg( SMESHGUI* theModule,
mySelectionMgr( SMESH::GetSelectionMgr( theModule ) ),
mySelector( SMESH::GetViewWindow( theModule )->GetSelector() ),
myIsBusy( false ),
myNameChanged( false ),
myActor( 0 )
myNameChanged( false )
{
initDialog( true );
if ( !theMesh->_is_nil() )
@ -413,6 +412,7 @@ void SMESHGUI_GroupDlg::initDialog( bool create)
connect(mySMESHGUI, SIGNAL(SignalDeactivateActiveDialog()), this, SLOT(onDeactivate()));
connect(mySMESHGUI, SIGNAL(SignalCloseAllDialogs()), this, SLOT(onClose()));
connect(mySelectionMgr, SIGNAL(currentSelectionChanged()), this, SLOT(onObjectSelectionChanged()));
connect(mySMESHGUI, SIGNAL(SignalVisibilityChanged()), this, SLOT(onVisibilityChanged()));
rb1->setChecked(true); // VSR !!!
onGrpTypeChanged(0); // VSR!!!
@ -552,11 +552,12 @@ void SMESHGUI_GroupDlg::init (SMESH::SMESH_GroupBase_ptr theGroup,
// actor of theGroup, if it is visible, else try
// any visible actor of group or submesh of myMesh
// commented, because an attempt to set selection on not displayed cells leads to error
//SetAppropriateActor();
myActor = SMESH::FindActorByObject(myMesh);
if ( !myActor )
myActor = SMESH::FindActorByObject(theGroup);
SMESH::SetPickable(myActor);
SetAppropriateActor();
/* SMESH_Actor* anActor = SMESH::FindActorByObject(myMesh);
if ( !anActor )
anActor = SMESH::FindActorByObject(theGroup);
SMESH::SetPickable(anActor);*/
int grpType = (!myGroup->_is_nil() ? 0 : (theIsConvert ? 0 : 1));
myGrpTypeGroup->button(grpType)->setChecked(true);
@ -685,15 +686,21 @@ void SMESHGUI_GroupDlg::setSelectionMode (int theMode)
if (mySelectionMode != theMode) {
// [PAL10408] mySelectionMgr->clearSelected();
mySelectionMgr->clearFilters();
if (myActor)
myActor->SetPointRepresentation(false);
if (myActorsList.count() > 0) {
QListIterator<SMESH_Actor*> it( myActorsList );
while ( it.hasNext() )
it.next()->SetPointRepresentation(false);
}
else
SMESH::SetPointRepresentation(false);
if (theMode < 4) {
switch (theMode) {
case 0:
if (myActor)
myActor->SetPointRepresentation(true);
if (myActorsList.count() > 0) {
QListIterator<SMESH_Actor*> it( myActorsList );
while ( it.hasNext() )
it.next()->SetPointRepresentation(true);
}
else
SMESH::SetPointRepresentation(true);
if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
@ -972,9 +979,9 @@ void SMESHGUI_GroupDlg::onOK()
//=================================================================================
void SMESHGUI_GroupDlg::onListSelectionChanged()
{
// MESSAGE( "SMESHGUI_GroupDlg::onListSelectionChanged(); myActor = " << myActor);
if( myIsBusy || !myActor) return;
myIsBusy = true;
//MESSAGE( "SMESHGUI_GroupDlg::onListSelectionChanged(); myActorsList.count() = " << myActorsList.count());
if( myIsBusy || myActorsList.count() == 0 ) return;
myIsBusy = true;
if (myCurrentLineEdit == 0) {
mySelectionMgr->clearSelected();
@ -982,9 +989,9 @@ void SMESHGUI_GroupDlg::onListSelectionChanged()
QList<QListWidgetItem*> selItems = myElements->selectedItems();
QListWidgetItem* anItem;
foreach(anItem, selItems) aIndexes.Add(anItem->text().toInt());
mySelector->AddOrRemoveIndex(myActor->getIO(), aIndexes, false);
mySelector->AddOrRemoveIndex(myActorsList.first()->getIO(), aIndexes, false);
SALOME_ListIO aList;
aList.Append(myActor->getIO());
aList.Append(myActorsList.first()->getIO());
mySelectionMgr->setSelectedObjects(aList,false);
}
myIsBusy = false;
@ -1218,13 +1225,12 @@ void SMESHGUI_GroupDlg::onObjectSelectionChanged()
}
else // !myCurrentLineEdit: local selection of nodes or elements
{
if (aNbSel == 1 && myActor && myActor->hasIO())
if (aNbSel == 1 && myActorsList.count() > 0 )
{
#ifdef ENABLE_SWITCH_ACTOR_DURING_ELEMENTS_SELECTION
// NPAL19389: create a group with a selection in another group
// Switch myActor to the newly selected one, if the last
// is visible and belongs to group or submesh of myMesh
Handle(SALOME_InteractiveObject) curIO = myActor->getIO();
/* Handle(SALOME_InteractiveObject) curIO = myActor->getIO();
Handle(SALOME_InteractiveObject) selIO = aList.First();
if (curIO->hasEntry() && selIO->hasEntry()) {
const char* selEntry = selIO->getEntry();
@ -1251,16 +1257,25 @@ void SMESHGUI_GroupDlg::onObjectSelectionChanged()
}
}
}
}
}*/
// NPAL19389 END
#endif // ENABLE_SWITCH_ACTOR_DURING_ELEMENTS_SELECTION
QString aListStr = "";
int aNbItems = 0;
if (myTypeId == 0) {
aNbItems = SMESH::GetNameOfSelectedNodes(mySelector, myActor->getIO(), aListStr);
QListIterator<SMESH_Actor*> it( myActorsList );
while ( it.hasNext() ) {
QString tmpStr;
aNbItems += SMESH::GetNameOfSelectedNodes(mySelector, it.next()->getIO(), tmpStr);
aListStr += tmpStr;
}
} else {
aNbItems = SMESH::GetNameOfSelectedElements(mySelector, myActor->getIO(), aListStr);
QListIterator<SMESH_Actor*> it( myActorsList );
while ( it.hasNext() ) {
QString tmpStr;
aNbItems += SMESH::GetNameOfSelectedElements(mySelector, it.next()->getIO(), tmpStr);
aListStr += tmpStr;
}
}
if (aNbItems > 0) {
QListWidgetItem* anItem;
@ -1281,20 +1296,23 @@ void SMESHGUI_GroupDlg::onObjectSelectionChanged()
}
}
}
if (!myActor) {
if (myActorsList.count() == 0) {
if (!myGroup->_is_nil())
myActor = SMESH::FindActorByObject(myGroup);
myActorsList.append( SMESH::FindActorByObject(myGroup) );
else if(!myGroupOnGeom->_is_nil())
myActor = SMESH::FindActorByObject(myGroupOnGeom);
myActorsList.append( SMESH::FindActorByObject(myGroupOnGeom) );
else
myActor = SMESH::FindActorByObject(myMesh);
myActorsList.append( SMESH::FindActorByObject(myMesh) );
}
// somehow, if we display the mesh, while selecting from another actor,
// the mesh becomes pickable, and there is no way to select any element
if (myActor)
SMESH::SetPickable(myActor);
if (myActorsList.count() > 0) {
QListIterator<SMESH_Actor*> it( myActorsList );
while ( it.hasNext() )
it.next()->SetPickable(true);
}
myIsBusy = false;
}
@ -1469,7 +1487,7 @@ void SMESHGUI_GroupDlg::onAdd()
int aNbSel = aList.Extent();
if (aNbSel == 0 || !myActor || myMesh->_is_nil()) return;
if (aNbSel == 0 || myActorsList.count() == 0 || myMesh->_is_nil()) return;
myIsBusy = true;
@ -1503,10 +1521,20 @@ void SMESHGUI_GroupDlg::onAdd()
QString aListStr = "";
int aNbItems = 0;
if (myTypeId == 0) {
aNbItems = SMESH::GetNameOfSelectedNodes(mySelector, myActor->getIO(), aListStr);
QListIterator<SMESH_Actor*> it( myActorsList );
while ( it.hasNext() ) {
QString tmpStr;
aNbItems += SMESH::GetNameOfSelectedNodes(mySelector, it.next()->getIO(), tmpStr);
aListStr += tmpStr;
}
}
else {
aNbItems = SMESH::GetNameOfSelectedElements(mySelector, myActor->getIO(), aListStr);
QListIterator<SMESH_Actor*> it( myActorsList );
while ( it.hasNext() ) {
QString tmpStr;
aNbItems += SMESH::GetNameOfSelectedElements(mySelector, it.next()->getIO(), tmpStr);
aListStr += tmpStr;
}
}
if (aNbItems > 0) {
QStringList anElements = aListStr.split( " ", QString::SkipEmptyParts);
@ -1836,6 +1864,15 @@ void SMESHGUI_GroupDlg::closeEvent (QCloseEvent*)
onClose();
}
//=================================================================================
// function : onVisibilityChanged()
// purpose :
//=================================================================================
void SMESHGUI_GroupDlg::onVisibilityChanged()
{
SetAppropriateActor();
}
//=================================================================================
// function : SMESHGUI_GroupDlg::onClose
// purpose : SLOT called when "Close" button pressed. Close dialog
@ -2158,81 +2195,75 @@ void SMESHGUI_GroupDlg::setDefaultGroupColor()
bool SMESHGUI_GroupDlg::SetAppropriateActor()
{
bool isActor = false;
myActorsList.clear();
if (myMesh->_is_nil()) return false;
SVTK_ViewWindow* aViewWindow = SMESH::GetCurrentVtkView();
// try mesh actor
myActor = SMESH::FindActorByObject(myMesh);
if (myActor && myActor->hasIO())
{
isActor = true;
if (aViewWindow && !aViewWindow->isVisible(myActor->getIO()))
isActor = false;
}
// try current group actor
if (!isActor) {
if (!myGroup->_is_nil()) {
myActor = SMESH::FindActorByObject(myGroup);
if (myActor && myActor->hasIO())
{
isActor = true;
if (aViewWindow && !aViewWindow->isVisible(myActor->getIO()))
isActor = false;
if (myGeomGroupBtn->isChecked()) { // try current group on geometry actor
if (!isActor) {
if (!myGroupOnGeom->_is_nil()) {
SMESH_Actor* anActor = SMESH::FindActorByObject(myGroupOnGeom);
if (anActor && anActor->hasIO())
{
isActor = true;
if (aViewWindow && !aViewWindow->isVisible(anActor->getIO()))
isActor = false;
else
myActorsList.append(anActor);
}
}
}
}
// try current group on geometry actor
if (!isActor) {
if (!myGroupOnGeom->_is_nil()) {
myActor = SMESH::FindActorByObject(myGroupOnGeom);
if (myActor && myActor->hasIO())
} else {
// try mesh actor
SMESH_Actor* anActor = SMESH::FindActorByObject(myMesh);
if (anActor && anActor->hasIO())
{
isActor = true;
if (aViewWindow && !aViewWindow->isVisible(myActor->getIO()))
if (aViewWindow && !aViewWindow->isVisible(anActor->getIO()))
isActor = false;
else
myActorsList.append(anActor);
}
}
}
// try any visible actor of group or submesh of current mesh
if (!isActor && aViewWindow) {
// mesh entry
_PTR(SObject) aSObject = SMESH::FindSObject(myMesh);
if (aSObject) {
CORBA::String_var meshEntry = aSObject->GetID().c_str();
int len = strlen(meshEntry);
// iterate on all actors in current view window, search for
// any visible actor, that belongs to group or submesh of current mesh
VTK::ActorCollectionCopy aCopy(aViewWindow->getRenderer()->GetActors());
vtkActorCollection *aCollection = aCopy.GetActors();
int nbItems = aCollection->GetNumberOfItems();
for (int i=0; i<nbItems && !isActor; i++)
{
SMESH_Actor *anActor = dynamic_cast<SMESH_Actor*>(aCollection->GetItemAsObject(i));
if (anActor && anActor->hasIO()) {
Handle(SALOME_InteractiveObject) anIO = anActor->getIO();
if (aViewWindow->isVisible(anIO)) {
if (anIO->hasEntry() && strncmp(anIO->getEntry(), meshEntry, len) == 0) {
myActor = anActor;
isActor = true;
// try any visible actor of group or submesh of current mesh
if (aViewWindow) {
// mesh entry
_PTR(SObject) aSObject = SMESH::FindSObject(myMesh);
if (aSObject) {
CORBA::String_var meshEntry = aSObject->GetID().c_str();
int len = strlen(meshEntry);
// iterate on all actors in current view window, search for
// any visible actor, that belongs to group or submesh of current mesh
VTK::ActorCollectionCopy aCopy(aViewWindow->getRenderer()->GetActors());
vtkActorCollection *aCollection = aCopy.GetActors();
int nbItems = aCollection->GetNumberOfItems();
for (int i=0; i<nbItems && !isActor; i++)
{
SMESH_Actor *anActor = dynamic_cast<SMESH_Actor*>(aCollection->GetItemAsObject(i));
if (anActor && anActor->hasIO()) {
Handle(SALOME_InteractiveObject) anIO = anActor->getIO();
if (aViewWindow->isVisible(anIO)) {
if (anIO->hasEntry() && strncmp(anIO->getEntry(), meshEntry, len) == 0)
myActorsList.append(anActor);
}
}
}
}
}
}
}
if (isActor)
SMESH::SetPickable(myActor);
return isActor;
if (myActorsList.count() > 0) {
QListIterator<SMESH_Actor*> it( myActorsList );
while ( it.hasNext() )
it.next()->SetPickable(true);
}
return ( isActor || (myActorsList.count() > 0) );
}
//=======================================================================
//function : setShowEntityMode
//purpose : make shown only entity corresponding to my type

View File

@ -90,6 +90,7 @@ private slots:
bool onApply();
void onHelp();
void onDeactivate();
void onVisibilityChanged();
void onListSelectionChanged();
void onObjectSelectionChanged();
@ -137,7 +138,6 @@ private:
SMESHGUI* mySMESHGUI; /* Current SMESHGUI object */
LightApp_SelectionMgr* mySelectionMgr; /* User shape selection */
SMESH_Actor* myActor; /* Current mesh actor */
int myGrpTypeId; /* Current group type id : standalone or group on geometry */
int myTypeId; /* Current type id = radio button id */
int myStoredShownEntity; /* Store ShowEntity mode of myMesh */
@ -180,6 +180,7 @@ private:
SMESHGUI_ShapeByMeshOp* myShapeByMeshOp;
SMESH::SMESH_Mesh_var myMesh;
QList<SMESH_Actor*> myActorsList;
SMESH::SMESH_Group_var myGroup;
SMESH::SMESH_GroupOnGeom_var myGroupOnGeom;
QList<int> myIdList;