mirror of
https://git.salome-platform.org/gitpub/modules/smesh.git
synced 2025-01-21 22:40:33 +05:00
0021551: EDF 1452 SMESH: referenced object can be deleted
procect from deletion a mesh object referenced from outside
This commit is contained in:
parent
43db13f33a
commit
8662de8ce8
@ -1579,98 +1579,115 @@
|
||||
|
||||
SalomeApp_Application* anApp = dynamic_cast<SalomeApp_Application*>( SUIT_Session::session()->activeApplication() );
|
||||
|
||||
SALOME_ListIteratorOfListIO It(selected);
|
||||
|
||||
aStudyBuilder->NewCommand(); // There is a transaction
|
||||
for( ; It.More(); It.Next()){ // loop on selected IO's
|
||||
Handle(SALOME_InteractiveObject) IObject = It.Value();
|
||||
if(IObject->hasEntry()) {
|
||||
_PTR(SObject) aSO = aStudy->FindObjectID(IObject->getEntry());
|
||||
|
||||
// disable removal of "SMESH" component object
|
||||
if(aSO->FindAttribute(anAttr, "AttributeIOR")){
|
||||
anIOR = anAttr;
|
||||
if ( engineIOR() == anIOR->Value().c_str() )
|
||||
continue;
|
||||
}
|
||||
//Check the referenced object
|
||||
_PTR(SObject) aRefSObject;
|
||||
if ( aSO && aSO->ReferencedObject( aRefSObject ) )
|
||||
aSO = aRefSObject; // Delete main Object instead of reference
|
||||
|
||||
// put the whole hierarchy of sub-objects of the selected SO into a list and
|
||||
// then treat them all starting from the deepest objects (at list back)
|
||||
|
||||
std::list< _PTR(SObject) > listSO;
|
||||
listSO.push_back( aSO );
|
||||
std::list< _PTR(SObject) >::iterator itSO = listSO.begin();
|
||||
for ( ; itSO != listSO.end(); ++itSO ) {
|
||||
_PTR(ChildIterator) it = aStudy->NewChildIterator( *itSO );
|
||||
for (it->InitEx(false); it->More(); it->Next())
|
||||
listSO.push_back( it->Value() );
|
||||
}
|
||||
|
||||
// treat SO's in the list starting from the back
|
||||
|
||||
std::list< _PTR(SObject) >::reverse_iterator ritSO = listSO.rbegin();
|
||||
for ( ; ritSO != listSO.rend(); ++ritSO ) {
|
||||
_PTR(SObject) SO = *ritSO;
|
||||
if ( !SO ) continue;
|
||||
std::string anEntry = SO->GetID();
|
||||
|
||||
/** Erase graphical object **/
|
||||
if(SO->FindAttribute(anAttr, "AttributeIOR")){
|
||||
ViewManagerList aViewMenegers = anApp->viewManagers();
|
||||
ViewManagerList::const_iterator it = aViewMenegers.begin();
|
||||
for( ; it != aViewMenegers.end(); it++) {
|
||||
SUIT_ViewManager* vm = *it;
|
||||
int nbSf = vm ? vm->getViewsCount() : 0;
|
||||
if(vm) {
|
||||
QVector<SUIT_ViewWindow*> aViews = vm->getViews();
|
||||
for(int i = 0; i < nbSf; i++){
|
||||
SUIT_ViewWindow *sf = aViews[i];
|
||||
if(SMESH_Actor* anActor = SMESH::FindActorByEntry(sf,anEntry.c_str())){
|
||||
SMESH::RemoveActor(sf,anActor);
|
||||
}
|
||||
}
|
||||
// Put the whole hierarchy of sub-objects of the selected SO's into a list and
|
||||
// then treat them all starting from the deepest objects (at list back)
|
||||
std::list< _PTR(SObject) > listSO;
|
||||
SALOME_ListIteratorOfListIO It(selected);
|
||||
for( ; It.More(); It.Next()) // loop on selected IO's
|
||||
{
|
||||
Handle(SALOME_InteractiveObject) IObject = It.Value();
|
||||
if(IObject->hasEntry()) {
|
||||
_PTR(SObject) aSO = aStudy->FindObjectID(IObject->getEntry());
|
||||
|
||||
// disable removal of "SMESH" component object
|
||||
if(aSO->FindAttribute(anAttr, "AttributeIOR")){
|
||||
anIOR = anAttr;
|
||||
if ( engineIOR() == anIOR->Value().c_str() )
|
||||
continue;
|
||||
}
|
||||
//Check the referenced object
|
||||
_PTR(SObject) aRefSObject;
|
||||
if ( aSO && aSO->ReferencedObject( aRefSObject ) )
|
||||
aSO = aRefSObject; // Delete main Object instead of reference
|
||||
|
||||
listSO.push_back( aSO );
|
||||
std::list< _PTR(SObject) >::iterator itSO = listSO.begin();
|
||||
for ( ; itSO != listSO.end(); ++itSO ) {
|
||||
_PTR(ChildIterator) it = aStudy->NewChildIterator( *itSO );
|
||||
for (it->InitEx(false); it->More(); it->Next())
|
||||
listSO.push_back( it->Value() );
|
||||
}
|
||||
}
|
||||
}
|
||||
// Check if none of objects to delete is referred from outside
|
||||
std::list< _PTR(SObject) >::reverse_iterator ritSO;
|
||||
for ( ritSO = listSO.rbegin(); ritSO != listSO.rend(); ++ritSO )
|
||||
{
|
||||
_PTR(SObject) SO = *ritSO;
|
||||
if ( !SO ) continue;
|
||||
std::vector<_PTR(SObject)> aReferences = aStudy->FindDependances( *ritSO );
|
||||
for (size_t i = 0; i < aReferences.size(); i++) {
|
||||
_PTR(SComponent) aComponent = aReferences[i]->GetFatherComponent();
|
||||
std::string type = aComponent->ComponentDataType();
|
||||
if ( type != "SMESH" )
|
||||
{
|
||||
SUIT_MessageBox::warning( anApp->desktop(),
|
||||
QObject::tr("WRN_WARNING"),
|
||||
QObject::tr("DEP_OBJECT") );
|
||||
return; // outside SMESH, there is an object depending on a SMESH object
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Treat SO's in the list starting from the back
|
||||
aStudyBuilder->NewCommand(); // There is a transaction
|
||||
for ( ritSO = listSO.rbegin(); ritSO != listSO.rend(); ++ritSO )
|
||||
{
|
||||
_PTR(SObject) SO = *ritSO;
|
||||
if ( !SO ) continue;
|
||||
std::string anEntry = SO->GetID();
|
||||
|
||||
/** Erase graphical object **/
|
||||
if(SO->FindAttribute(anAttr, "AttributeIOR")){
|
||||
ViewManagerList aViewMenegers = anApp->viewManagers();
|
||||
ViewManagerList::const_iterator it = aViewMenegers.begin();
|
||||
for( ; it != aViewMenegers.end(); it++) {
|
||||
SUIT_ViewManager* vm = *it;
|
||||
int nbSf = vm ? vm->getViewsCount() : 0;
|
||||
if(vm) {
|
||||
QVector<SUIT_ViewWindow*> aViews = vm->getViews();
|
||||
for(int i = 0; i < nbSf; i++){
|
||||
SUIT_ViewWindow *sf = aViews[i];
|
||||
if(SMESH_Actor* anActor = SMESH::FindActorByEntry(sf,anEntry.c_str())){
|
||||
SMESH::RemoveActor(sf,anActor);
|
||||
}
|
||||
}
|
||||
}
|
||||
/** Remove an object from data structures **/
|
||||
SMESH::SMESH_GroupBase_var aGroup = SMESH::SMESH_GroupBase::_narrow( SMESH::SObjectToObject( SO ));
|
||||
SMESH::SMESH_subMesh_var aSubMesh = SMESH::SMESH_subMesh::_narrow( SMESH::SObjectToObject( SO ));
|
||||
if ( !aGroup->_is_nil() ) { // DELETE GROUP
|
||||
SMESH::SMESH_Mesh_var aMesh = aGroup->GetMesh();
|
||||
aMesh->RemoveGroup( aGroup );
|
||||
}
|
||||
else if ( !aSubMesh->_is_nil() ) { // DELETE SUBMESH
|
||||
SMESH::SMESH_Mesh_var aMesh = aSubMesh->GetFather();
|
||||
aMesh->RemoveSubMesh( aSubMesh );
|
||||
|
||||
_PTR(SObject) aMeshSO = SMESH::FindSObject(aMesh);
|
||||
if (aMeshSO)
|
||||
SMESH::ModifiedMesh(aMeshSO, false, aMesh->NbNodes()==0);
|
||||
}
|
||||
else {
|
||||
IObject = new SALOME_InteractiveObject
|
||||
( anEntry.c_str(), engineIOR().toLatin1().data(), SO->GetName().c_str() );
|
||||
QString objType = CheckTypeObject(IObject);
|
||||
if ( objType == "Hypothesis" || objType == "Algorithm" ) {// DELETE HYPOTHESIS
|
||||
SMESH::RemoveHypothesisOrAlgorithmOnMesh(IObject);
|
||||
aStudyBuilder->RemoveObjectWithChildren( SO );
|
||||
}
|
||||
else {// default action: remove SObject from the study
|
||||
// san - it's no use opening a transaction here until UNDO/REDO is provided in SMESH
|
||||
//SUIT_Operation *op = new SALOMEGUI_ImportOperation(myActiveStudy);
|
||||
//op->start();
|
||||
aStudyBuilder->RemoveObjectWithChildren( SO );
|
||||
//op->finish();
|
||||
}
|
||||
}
|
||||
} /* listSO back loop */
|
||||
} /* IObject->hasEntry() */
|
||||
} /* more/next */
|
||||
|
||||
}
|
||||
}
|
||||
/** Remove an object from data structures **/
|
||||
SMESH::SMESH_GroupBase_var aGroup = SMESH::SMESH_GroupBase::_narrow( SMESH::SObjectToObject( SO ));
|
||||
SMESH::SMESH_subMesh_var aSubMesh = SMESH::SMESH_subMesh::_narrow( SMESH::SObjectToObject( SO ));
|
||||
if ( !aGroup->_is_nil() ) { // DELETE GROUP
|
||||
SMESH::SMESH_Mesh_var aMesh = aGroup->GetMesh();
|
||||
aMesh->RemoveGroup( aGroup );
|
||||
}
|
||||
else if ( !aSubMesh->_is_nil() ) { // DELETE SUBMESH
|
||||
SMESH::SMESH_Mesh_var aMesh = aSubMesh->GetFather();
|
||||
aMesh->RemoveSubMesh( aSubMesh );
|
||||
|
||||
_PTR(SObject) aMeshSO = SMESH::FindSObject(aMesh);
|
||||
if (aMeshSO)
|
||||
SMESH::ModifiedMesh(aMeshSO, false, aMesh->NbNodes()==0);
|
||||
}
|
||||
else {
|
||||
Handle(SALOME_InteractiveObject) IObject = new SALOME_InteractiveObject
|
||||
( anEntry.c_str(), engineIOR().toLatin1().data(), SO->GetName().c_str() );
|
||||
QString objType = CheckTypeObject(IObject);
|
||||
if ( objType == "Hypothesis" || objType == "Algorithm" ) {// DELETE HYPOTHESIS
|
||||
SMESH::RemoveHypothesisOrAlgorithmOnMesh(IObject);
|
||||
aStudyBuilder->RemoveObjectWithChildren( SO );
|
||||
}
|
||||
else {// default action: remove SObject from the study
|
||||
// san - it's no use opening a transaction here until UNDO/REDO is provided in SMESH
|
||||
//SUIT_Operation *op = new SALOMEGUI_ImportOperation(myActiveStudy);
|
||||
//op->start();
|
||||
aStudyBuilder->RemoveObjectWithChildren( SO );
|
||||
//op->finish();
|
||||
}
|
||||
}
|
||||
} /* listSO back loop */
|
||||
|
||||
aStudyBuilder->CommitCommand();
|
||||
|
||||
/* Clear any previous selection */
|
||||
@ -1679,7 +1696,7 @@
|
||||
|
||||
SMESHGUI::GetSMESHGUI()->updateObjBrowser();
|
||||
}
|
||||
//}
|
||||
//} namespace
|
||||
|
||||
extern "C" {
|
||||
SMESHGUI_EXPORT CAM_Module* createModule()
|
||||
|
@ -3665,6 +3665,11 @@ Input value precision can be adjusted using
|
||||
<source>MESH_LOADING_MSG_FINISHED</source>
|
||||
<translation>Mesh %0 loading done</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>DEP_OBJECT</source>
|
||||
<translation>Selected object has been used to create another one.
|
||||
It can't be deleted </translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>SMESHGUI_GroupDlg</name>
|
||||
|
Loading…
Reference in New Issue
Block a user