mirror of
https://git.salome-platform.org/gitpub/modules/smesh.git
synced 2024-11-15 01:58:35 +05:00
0020501: EDF 1098 SMESH: Display only groups, edit a group: can't select face from other group
This commit is contained in:
parent
7af78cc3d0
commit
425391ca7c
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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,
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user