]> SALOME platform Git repositories - modules/visu.git/commitdiff
Salome HOME
Debug deletion of objects from study
authorjfa <jfa@opencascade.com>
Thu, 21 Apr 2005 12:36:11 +0000 (12:36 +0000)
committerjfa <jfa@opencascade.com>
Thu, 21 Apr 2005 12:36:11 +0000 (12:36 +0000)
src/VISUGUI/VisuGUI.cxx
src/VISU_I/VISU_Result_i.cc
src/VISU_I/VISU_Result_i.hh
src/VISU_I/VISU_Table_i.cc
src/VISU_I/VISU_ViewManager_i.cc

index 733e68d816fc2cde5028791e61aa2897a54bea33..d742031520a528267ba4722467c23907144738a7 100644 (file)
@@ -870,49 +870,64 @@ bool VisuGUI::SetSettings(QAD_Desktop* parent)
   return true;
 }
 
+//=====================================================================================
+// function : DisplayPrsObject()
+// purpose  : is used by slots DisplayPrs() and DisplayManyPrs()
+//=====================================================================================
+inline void DisplayPrsObject (CORBA::Object_ptr theObject,
+                              Handle(SALOME_InteractiveObject)& theIO)
+{
+  if (CORBA::is_nil(theObject)) return;
+
+  // is it Prs3d object ?
+  VISU::Prs3d_i* aPrsObject =
+    dynamic_cast<VISU::Prs3d_i*>(VISU::GetServant(theObject).in());
+  if (aPrsObject) {
+    if(MYDEBUG) MESSAGE("VisuGUI::DisplayPrs : Prs3d object");
+    VisuGUI::UpdateViewer(aPrsObject);
+    if (VTKViewer_ViewFrame* vf = VisuGUI::GetVtkViewFrame()) {
+      vf->getRenderer()->ResetCameraClippingRange();
+      vf->Repaint();
+      vf->highlight(theIO, 1);
+    }
+    return;
+  }
+  // is it Curve ?
+  VISU::Curve_i* aCurve =
+    dynamic_cast<VISU::Curve_i*>(VISU::GetServant(theObject).in());
+  if (aCurve) {
+    if(MYDEBUG) MESSAGE("VisuGUI::DisplayPrs : Curve object");
+    VisuGUI::PlotCurve(aCurve, VISU::eDisplay);
+    return;
+  }
+  // is it Container ?
+  VISU::Container_i* aContainer =
+    dynamic_cast<VISU::Container_i*>(VISU::GetServant(theObject).in());
+  if (aContainer) {
+    if(MYDEBUG) MESSAGE("VisuGUI::DisplayPrs : Container object");
+    VisuGUI::PlotContainer(aContainer, VISU::eDisplay);
+    return;
+  }
+  // is it Table ?
+  VISU::Table_i* aTable =
+    dynamic_cast<VISU::Table_i*>(VISU::GetServant(theObject).in());
+  if (aTable) {
+    if(MYDEBUG) MESSAGE("VisuGUI::DisplayPrs : Table object");
+    VisuGUI::PlotTable(aTable, VISU::eDisplay);
+    return;
+  }
+}
+
 //=====================================================================================
 // function : DisplayPrs()
 // purpose  :
 //=====================================================================================
-void VisuGUI::DisplayPrs() {
+void VisuGUI::DisplayPrs()
+{
   if(MYDEBUG) MESSAGE("VisuGUI::DisplayPrs");
   Handle(SALOME_InteractiveObject) anIO;
   CORBA::Object_var anObject = GetSelectedObj(&anIO);
-  if ( !CORBA::is_nil( anObject ) ) {
-    // is it Prs3d object ?
-    VISU::Prs3d_i* aPrsObject = dynamic_cast<VISU::Prs3d_i*>(VISU::GetServant(anObject).in());
-    if(aPrsObject){
-      if(MYDEBUG) MESSAGE("VisuGUI::DisplayPrs : Prs3d object");
-      UpdateViewer(aPrsObject);
-      if (VTKViewer_ViewFrame* vf = GetVtkViewFrame()) {
-       vf->getRenderer()->ResetCameraClippingRange();
-       vf->Repaint();
-       vf->highlight(anIO, 1);
-      }
-      return;
-    }
-    // is it Curve ?
-    VISU::Curve_i* aCurve = dynamic_cast<VISU::Curve_i*>(VISU::GetServant(anObject).in());
-    if(aCurve){
-      if(MYDEBUG) MESSAGE("VisuGUI::DisplayPrs : Curve object");
-      PlotCurve(aCurve, VISU::eDisplay );
-      return;
-    }
-    // is it Container ?
-    VISU::Container_i* aContainer = dynamic_cast<VISU::Container_i*>(VISU::GetServant(anObject).in());
-    if(aContainer){
-      if(MYDEBUG) MESSAGE("VisuGUI::DisplayPrs : Container object");
-      PlotContainer(aContainer, VISU::eDisplay );
-      return;
-    }
-    // is it Table ?
-    VISU::Table_i* aTable = dynamic_cast<VISU::Table_i*>(VISU::GetServant(anObject).in());
-    if(aTable){
-      if(MYDEBUG) MESSAGE("VisuGUI::DisplayPrs : Table object");
-      PlotTable(aTable, VISU::eDisplay );
-      return;
-    }
-  }
+  DisplayPrsObject(anObject, anIO);
 }
 
 //=====================================================================================
@@ -994,52 +1009,17 @@ void VisuGUI::ErasePrs() {
 void VisuGUI::DisplayManyPrs()
 {
   if(MYDEBUG) MESSAGE("VisuGUI::DisplayManyPrs");
-  SALOME_Selection* Sel = SALOME_Selection::Selection(QAD_Application::getDesktop()->getActiveStudy()->getSelection());
-  SALOME_ListIteratorOfListIO It( Sel->StoredIObjects() );
+  SALOME_Selection* Sel = SALOME_Selection::Selection
+    (QAD_Application::getDesktop()->getActiveStudy()->getSelection());
+  SALOME_ListIteratorOfListIO It ( Sel->StoredIObjects() );
   for ( ; It.More(); It.Next() ) {
     Handle(SALOME_InteractiveObject)& anIO = It.Value();
     if ( anIO->hasEntry() ) {
       SALOMEDS::Study_var aStudy = QAD_Application::getDesktop()->getActiveStudy()->getStudyDocument();
       SALOMEDS::SObject_var aSObject = aStudy->FindObjectID( anIO->getEntry() );
-      VISU::Storable::TRestoringMap pMap;
-      if( !aSObject->_is_nil() ) {
+      if ( !aSObject->_is_nil() ) {
        CORBA::Object_var aCORBAObject = VISU::SObjectToObject(aSObject);
-       if ( !CORBA::is_nil( aCORBAObject ) ) {
-         // is it Prs3d object ?
-         VISU::Prs3d_i* aPrsObject = dynamic_cast<VISU::Prs3d_i*>(VISU::GetServant(aCORBAObject).in());
-         if(aPrsObject){
-           if(MYDEBUG) MESSAGE("VisuGUI::DisplayManyPrs : Prs3d object");
-           UpdateViewer(aPrsObject);
-           VTKViewer_ViewFrame* vf = GetVtkViewFrame();
-           if (vf) {
-             vf->getRenderer()->ResetCameraClippingRange();
-             vf->Repaint();
-             vf->highlight(anIO, 1);
-           }
-           continue;
-         }
-         // is it Curve ?
-         VISU::Curve_i* aCurve = dynamic_cast<VISU::Curve_i*>(VISU::GetServant(aCORBAObject).in());
-         if(aCurve){
-           if(MYDEBUG) MESSAGE("VisuGUI::DisplayManyPrs: Curve object");
-           PlotCurve(aCurve, VISU::eDisplay );
-           continue;
-         }
-         // is it Container ?
-         VISU::Container_i* aContainer = dynamic_cast<VISU::Container_i*>(VISU::GetServant(aCORBAObject).in());
-         if(aContainer){
-           if(MYDEBUG) MESSAGE("VisuGUI::DisplayManyPrs : Container object");
-           PlotContainer(aContainer, VISU::eDisplay );
-           continue;
-         }
-         // is it Table ?
-         VISU::Table_i* aTable = dynamic_cast<VISU::Table_i*>(VISU::GetServant(aCORBAObject).in());
-         if(aTable){
-           if(MYDEBUG) MESSAGE("VisuGUI::DisplayManyPrs : Table object");
-           PlotTable(aTable, VISU::eDisplay );
-           continue;
-         }
-       }
+        DisplayPrsObject(aCORBAObject, anIO);
       }
     }
   }
@@ -1124,9 +1104,10 @@ void VisuGUI::DisplayOnlyManyPrs() {
 void VisuGUI::EraseManyPrs()
 {
   if(MYDEBUG) MESSAGE("VisuGUI::EraseManyPrs");
-  SALOME_Selection* Sel = SALOME_Selection::Selection(QAD_Application::getDesktop()->getActiveStudy()->getSelection());
+  SALOME_Selection* Sel = SALOME_Selection::Selection
+    (QAD_Application::getDesktop()->getActiveStudy()->getSelection());
   SALOME_ListIO LIO; LIO = Sel->StoredIObjects();
-  SALOME_ListIteratorOfListIO It( LIO );
+  SALOME_ListIteratorOfListIO It ( LIO );
   for ( ; It.More(); It.Next() ) {
     Handle(SALOME_InteractiveObject)& anIO = It.Value();
     if ( anIO->hasEntry() ) {
@@ -1135,40 +1116,7 @@ void VisuGUI::EraseManyPrs()
       VISU::Storable::TRestoringMap pMap;
       if( !aSObject->_is_nil() ) {
        CORBA::Object_var aCORBAObject = VISU::SObjectToObject(aSObject);
-       if ( !CORBA::is_nil( aCORBAObject ) ) {
-         // is it Prs3d object ?
-         VISU::Prs3d_i* aPrsObject = dynamic_cast<VISU::Prs3d_i*>(VISU::GetServant(aCORBAObject).in());
-         if(aPrsObject){
-           if(MYDEBUG) MESSAGE("VisuGUI::EraseManyPrs : Prs3d object");
-           ErasePrs(aPrsObject);
-           VTKViewer_ViewFrame* vf = GetVtkViewFrame();
-           if (vf) {
-             vf->Repaint();
-           }
-           continue;
-         }
-         // is it Curve ?
-         VISU::Curve_i* aCurve = dynamic_cast<VISU::Curve_i*>(VISU::GetServant(aCORBAObject).in());
-         if(aCurve){
-           if(MYDEBUG) MESSAGE("VisuGUI::EraseManyPrs : Curve object");
-           PlotCurve(aCurve, VISU::eErase );
-           continue;
-         }
-         // is it Container ?
-         VISU::Container_i* aContainer = dynamic_cast<VISU::Container_i*>(VISU::GetServant(aCORBAObject).in());
-         if(aContainer){
-           if(MYDEBUG) MESSAGE("VisuGUI::EraseManyPrs : Container object");
-           PlotContainer(aContainer, VISU::eErase );
-           continue;
-         }
-         // is it Table ?
-         VISU::Table_i* aTable = dynamic_cast<VISU::Table_i*>(VISU::GetServant(aCORBAObject).in());
-         if(aTable){
-           if(MYDEBUG) MESSAGE("VisuGUI::EraseManyPrs : Table object");
-           PlotTable(aTable, VISU::eErase );
-           continue;
-         }
-       }
+        ::ErasePrs(aCORBAObject);
       }
     }
   }
@@ -1905,66 +1853,70 @@ void VisuGUI::CreateTable()
   }
 }
 
-
-/*!
- *  Slot : deletes SObject with all subobjects
- */
-void VisuGUI::DeleteObject() {
-  MESSAGE("VisuGUI::DeleteObject()");
-
-  SALOMEDS::Study_var aStudy = GetStudyDocument();
-  if (checkLock(aStudy)) return;
-
-  SALOME_Selection* aSel = SALOME_Selection::Selection( GetActiveStudy()->getSelection() );
-  if (aSel->IObjectCount() != 1) return;
-
-  Handle(SALOME_InteractiveObject) anIO = aSel->firstIObject();
-  if (!anIO->hasEntry()) return;
-
-  SALOMEDS::SObject_var aSObject = aStudy->FindObjectID(anIO->getEntry());
-  if (aSObject->_is_nil()) return;
-
-  SALOMEDS::ChildIterator_var aChildIter = aStudy->NewChildIterator(aSObject);
+//=====================================================================================
+// function : DeleteSObject()
+// purpose  : is used by slots DeleteObject() and DeleteManyObjects()
+//=====================================================================================
+inline void DeleteSObject (SALOMEDS::Study_ptr theStudy,
+                           SALOMEDS::SObject_ptr theSObject)
+{
+  SALOMEDS::ChildIterator_var aChildIter = theStudy->NewChildIterator(theSObject);
   for (aChildIter->InitEx(true); aChildIter->More(); aChildIter->Next()) {
     SALOMEDS::SObject_var aChildSObject = aChildIter->Value();
     CORBA::Object_var aChildObj = VISU::SObjectToObject(aChildSObject);
     ::ErasePrs(aChildObj);
   }
 
-  CORBA::Object_var anObj = VISU::SObjectToObject(aSObject);
-
-  // There is a transaction
-  SALOMEDS::StudyBuilder_var aStudyBuilder = VisuGUI::NewBuilder();
-  aStudyBuilder->NewCommand();
-
+  CORBA::Object_var anObj = VISU::SObjectToObject(theSObject);
   if (!CORBA::is_nil(anObj)) {
-    MESSAGE("VisuGUI::DeleteObject() : !CORBA::is_nil(anObj)");
-
     VISU::RemovableObject_var aRemovableObject = VISU::RemovableObject::_narrow(anObj);
     if (!CORBA::is_nil(aRemovableObject)) {
-      MESSAGE("VisuGUI::DeleteObject() : !CORBA::is_nil(aRemovableObject)");
       aRemovableObject->RemoveFromStudy();
     }
   } else {
-    aStudyBuilder->RemoveObjectWithChildren(aSObject);
+    // Remove aSObject together with all its sub-objects
+    VISU::RemoveFromStudy(theSObject,
+                          false,  // remove not only IOR attribute, but Object With Children
+                          false); // not Destroy() sub-objects
   }
+}
 
-  aStudyBuilder->CommitCommand();
+/*!
+ *  Slot : deletes SObject with all subobjects
+ */
+void VisuGUI::DeleteObject() {
+  SALOMEDS::Study_var aStudy = GetStudyDocument();
+  if (checkLock(aStudy)) return;
 
-  GetActiveStudy()->unHighlightAll();
-  GetActiveStudy()->updateObjBrowser(true);
+  SALOME_Selection* aSel = SALOME_Selection::Selection(GetActiveStudy()->getSelection());
+  if (aSel->IObjectCount() == 1) {
+    Handle(SALOME_InteractiveObject) anIO = aSel->firstIObject();
+    if (anIO->hasEntry()) {
+      SALOMEDS::SObject_var aSObject = aStudy->FindObjectID(anIO->getEntry());
+      if (!aSObject->_is_nil()) {
+        // There is a transaction
+        SALOMEDS::StudyBuilder_var aStudyBuilder = VisuGUI::NewBuilder();
+        aStudyBuilder->NewCommand();
+
+        DeleteSObject(aStudy, aSObject);
+        aStudyBuilder->CommitCommand();
+
+        GetActiveStudy()->unHighlightAll();
+        GetActiveStudy()->updateObjBrowser(true);
+      }
+    }
+  }
 }
 
 /*!
  *  Slot : deletes all selected SObjects with all subobjects
  */
 void VisuGUI::DeleteManyObjects() {
-  MESSAGE("VisuGUI::DeleteManyObjects()");
-
   SALOMEDS::Study_var aStudy = GetStudyDocument();
   if (checkLock(aStudy)) return;
 
-  SALOME_Selection* aSel = SALOME_Selection::Selection( GetActiveStudy()->getSelection() );
+  SALOME_Selection* aSel = SALOME_Selection::Selection(GetActiveStudy()->getSelection());
   int i, nbSelected = aSel->IObjectCount();
   if (nbSelected < 1) return;
 
@@ -1976,6 +1928,7 @@ void VisuGUI::DeleteManyObjects() {
       entries[i++] = anIO->getEntry();
   }
   nbSelected = i;
+  if (nbSelected < 1) return;
 
   // There is a transaction
   SALOMEDS::StudyBuilder_var aStudyBuilder = VisuGUI::NewBuilder();
@@ -1983,26 +1936,8 @@ void VisuGUI::DeleteManyObjects() {
 
   for (i = 0; i < nbSelected; i++) {
     SALOMEDS::SObject_var aSObject = aStudy->FindObjectID(entries[i]);
-    if (aSObject->_is_nil()) continue;
-
-    SALOMEDS::ChildIterator_var aChildIter = aStudy->NewChildIterator(aSObject);
-    for (aChildIter->InitEx(true); aChildIter->More(); aChildIter->Next()) {
-      SALOMEDS::SObject_var aChildSObject = aChildIter->Value();
-      CORBA::Object_var aChildObj = VISU::SObjectToObject(aChildSObject);
-      ::ErasePrs(aChildObj);
-    }
-
-    CORBA::Object_var anObj = VISU::SObjectToObject(aSObject);
-    if (!CORBA::is_nil(anObj)) {
-      MESSAGE("VisuGUI::DeleteManyObjects() : !CORBA::is_nil(anObj)");
-
-      VISU::RemovableObject_var aRemovableObject = VISU::RemovableObject::_narrow(anObj);
-      if (!CORBA::is_nil(aRemovableObject)) {
-        MESSAGE("VisuGUI::DeleteManyObjects() : !CORBA::is_nil(aRemovableObject)");
-        aRemovableObject->RemoveFromStudy();
-      }
-    } else {
-      aStudyBuilder->RemoveObjectWithChildren(aSObject);
+    if (!aSObject->_is_nil()) {
+      DeleteSObject(aStudy, aSObject);
     }
   }
 
index 30c13e228498f73b01f2e61ed5a8094563807f17..5b79dc1d097fa88cd64cb903fd44de1d72683b1b 100644 (file)
@@ -85,16 +85,41 @@ VISU::Result_var VISU::FindResult(SALOMEDS::SObject_ptr theSObject){
   return aResult;
 }
 
-void VISU::RemoveFromStudy (SALOMEDS::SObject_ptr theSObject, int theIsAttrOnly)
+void VISU::RemoveFromStudy (SALOMEDS::SObject_ptr theSObject,
+                           bool theIsAttrOnly, bool theDestroySubObjects)
 {
-  if (!theSObject->_is_nil()) {
-    SALOMEDS::Study_var aStudy = theSObject->GetStudy();
-    SALOMEDS::StudyBuilder_var aStudyBuilder = aStudy->NewBuilder();
-    if (theIsAttrOnly)
-      aStudyBuilder->RemoveAttribute(theSObject,"AttributeIOR");
-    else
-      aStudyBuilder->RemoveObjectWithChildren(theSObject);
+  if (theSObject->_is_nil()) return;
+
+  SALOMEDS::Study_var aStudyDocument = theSObject->GetStudy();
+  SALOMEDS::StudyBuilder_var aStudyBuilder = aStudyDocument->NewBuilder();
+
+  if (theIsAttrOnly) {
+    aStudyBuilder->RemoveAttribute(theSObject,"AttributeIOR");
+    return;
   }
+
+  // Remove possible sub-objects
+  SALOMEDS::ChildIterator_var aChildIter = aStudyDocument->NewChildIterator(theSObject);
+  for (aChildIter->InitEx(true); aChildIter->More(); aChildIter->Next()) {
+    SALOMEDS::SObject_var aChildSObject = aChildIter->Value();
+    CORBA::Object_var aChildObj = VISU::SObjectToObject(aChildSObject);
+    if (CORBA::is_nil(aChildObj)) continue;
+
+    VISU::RemovableObject_var aRemovableObject = VISU::RemovableObject::_narrow(aChildObj);
+    if (CORBA::is_nil(aRemovableObject)) continue;
+
+    aRemovableObject->RemoveFromStudy();
+
+    // Destroy
+    if (theDestroySubObjects) {
+      VISU::Prs3d_var aPrs3d = VISU::Prs3d::_narrow(aRemovableObject);
+      if (CORBA::is_nil(aPrs3d)) continue;
+      aPrs3d->Destroy();
+    }
+  }
+
+  // Remove the SObject itself
+  aStudyBuilder->RemoveObjectWithChildren(theSObject);
 }
 
 QString GenerateName(const char* theName){
@@ -157,22 +182,7 @@ VISU::Result_i::Result_i(SALOMEDS::Study_ptr theStudy, const TSourceId& aSourceI
 
 void VISU::Result_i::RemoveFromStudy()
 {
-  // Remove presentations
-  SALOMEDS::Study_var aStudyDocument = mySObject->GetStudy();
-  SALOMEDS::StudyBuilder_var aStudyBuilder = aStudyDocument->NewBuilder();
-  SALOMEDS::ChildIterator_var aChildIter = aStudyDocument->NewChildIterator(mySObject);
-  for (aChildIter->InitEx(true); aChildIter->More(); aChildIter->Next()) {
-    SALOMEDS::SObject_var aChildSObject = aChildIter->Value();
-    CORBA::Object_var aChildObj = VISU::SObjectToObject(aChildSObject);
-    if (CORBA::is_nil(aChildObj)) continue;
-
-    VISU::Prs3d_var aPrs3d = VISU::Prs3d::_narrow(aChildObj);
-    if (CORBA::is_nil(aPrs3d)) continue;
-
-    aPrs3d->RemoveFromStudy();
-  }
-
-  // Remove the result itself
+  // Remove the result with all presentations and other possible sub-objects
   VISU::RemoveFromStudy(mySObject,false);
 }
 
index da77676f807bda1bdc2ec0563d403b9d502b48ef..f113595164c81a6686aa3c7d6674e1d2563b43d4 100644 (file)
@@ -97,6 +97,8 @@ namespace VISU{
   };
 
   Result_var FindResult(SALOMEDS::SObject_ptr theSObject);
-  void RemoveFromStudy(SALOMEDS::SObject_ptr theSObject, int theIsAttrOnly = true);
+  void RemoveFromStudy(SALOMEDS::SObject_ptr theSObject,
+                      bool theIsAttrOnly = true,
+                      bool theDestroySubObjects = false);
 }
 #endif
index a54fe6dec45839401f4889a4f2f210dbd9cd6313..8496739ab067ffc81b8e55c4b658e207ffe8f1fc 100644 (file)
@@ -253,23 +253,8 @@ const char* VISU::Table_i::GetTableTitle()
 
 void VISU::Table_i::RemoveFromStudy()
 {
-  // Remove presentations
-  SALOMEDS::Study_var aStudyDocument = mySObj->GetStudy();
-  SALOMEDS::StudyBuilder_var aStudyBuilder = aStudyDocument->NewBuilder();
-  SALOMEDS::ChildIterator_var aChildIter = aStudyDocument->NewChildIterator(mySObj);
-  for (aChildIter->InitEx(true); aChildIter->More(); aChildIter->Next()) {
-    SALOMEDS::SObject_var aChildSObject = aChildIter->Value();
-    CORBA::Object_var aChildObj = VISU::SObjectToObject(aChildSObject);
-    if (CORBA::is_nil(aChildObj)) continue;
-
-    VISU::RemovableObject_ptr aCurve = VISU::Curve::_narrow(aChildObj);
-    if (CORBA::is_nil(aCurve)) continue;
-
-    aCurve->RemoveFromStudy();
-  }
-
-  // Remove the table itself
-  VISU::RemoveFromStudy(mySObj,false);
+  // Remove the table with all curves
+  VISU::RemoveFromStudy(mySObj, false);
 }
 
 //----------------------------------------------------------------
index 140c3ff22f81fd4ec26a01dbc5e8352e1f76cb8e..3220ef83bdf39391cd9e35b697b17eca929e317e 100644 (file)
@@ -1696,13 +1696,14 @@ namespace VISU{
       TEvent(Result_ptr theResult): myResult(theResult) {}
       virtual void Execute()
       {
-       myResult->RemoveFromStudy();
-
-       //update Object browser
        if (QAD_Desktop* aDesktop = QAD_Application::getDesktop()) {
          if (Result_i* aResult = dynamic_cast<Result_i*>(GetServant(myResult).in())) {
            SALOMEDS::SObject_var aSObject = aResult->GetSObject();
            SALOMEDS::Study_var aStudyDocument = aSObject->GetStudy();
+           VISU::RemoveFromStudy(aSObject,
+                                 false, // not only attribute
+                                 true); // destroy sub-objects
+
            if (QAD_Study* aStudy = aDesktop->findStudy(aStudyDocument))
              aStudy->updateObjBrowser();
          }