0024047: Exception in TPrsStd_AISPresentation during destruction of TDocStd_Document
authorgka <gka@opencascade.com>
Thu, 18 Jul 2013 09:16:35 +0000 (13:16 +0400)
committergka <gka@opencascade.com>
Thu, 18 Jul 2013 09:16:35 +0000 (13:16 +0400)
Adding test case for this fix
Modification in order to avoid exception during destruction of AIS_InteractiveContext
Small modification for trihedron
Small modifications to avoid regressions
Cosmetic modification

src/AIS/AIS_InteractiveContext.cxx
src/AIS/AIS_InteractiveObject.cxx
src/AIS/AIS_Trihedron.cxx
src/OpenGl/OpenGl_View.cxx
src/TPrsStd/TPrsStd_AISPresentation.cxx
src/XDEDRAW/XDEDRAW.cxx
tests/bugs/caf/bug24047 [new file with mode: 0755]

index bd1620a..591be7d 100755 (executable)
@@ -199,6 +199,16 @@ void AIS_InteractiveContext::Delete() const
   // be performed when mgrSelector will be destroyed but anyway...
   mgrSelector->Remove( myMainSel );
 #endif
+  AIS_ListOfInteractive aList;
+  
+  AIS_DataMapIteratorOfDataMapOfIOStatus anIt(myObjects);
+  Handle(AIS_InteractiveContext) aNullContext;
+  for(; anIt.More() ; anIt.Next())
+  {
+    Handle(AIS_InteractiveObject) anObj = anIt.Key();
+    anObj->SetContext(aNullContext);
+    
+  }
   MMgt_TShared::Delete();
 }
 
index e2b914b..d6289ae 100755 (executable)
@@ -155,6 +155,8 @@ Handle(AIS_InteractiveContext) AIS_InteractiveObject::GetContext() const
 void AIS_InteractiveObject::SetContext(const Handle(AIS_InteractiveContext)& aCtx)
 {
   myCTXPtr = aCtx.operator->();
+  if( aCtx.IsNull())
+    return;
   if (myDrawer.IsNull()) {
     myDrawer = new AIS_Drawer;
 #ifdef DEB
index 52b1eb4..421830c 100755 (executable)
@@ -638,9 +638,20 @@ void AIS_Trihedron::LoadSubObjects()
 void AIS_Trihedron::SetContext(const Handle(AIS_InteractiveContext)& Ctx)
 {
 //  Standard_Boolean same_DA = myDrawer->Link() == Ctx->DefaultDrawer();
-
+   
+   if( Ctx.IsNull())
+   {
+      Standard_Integer anIdx;
+      for (anIdx = 0; anIdx < 7; anIdx++)
+      {
+        myShapes[anIdx]->SetContext(Ctx);
+      }
+     AIS_InteractiveObject::SetContext (Ctx);
+     return;
+   }
   // Remove subobjects from current context
   Handle(AIS_InteractiveContext) anAISContext = GetContext();
+  
   Standard_Boolean hasContext = (anAISContext.IsNull() == Standard_False);
   Standard_Integer anIdx;
   for (anIdx = 0; anIdx < 7; anIdx++)
@@ -655,9 +666,8 @@ void AIS_Trihedron::SetContext(const Handle(AIS_InteractiveContext)& Ctx)
        }
       myShapes[anIdx].Nullify();
     }
-
   AIS_InteractiveObject::SetContext (Ctx);
-  
   LoadSubObjects();
   for(Standard_Integer i= 0;i<=6;i++)
     myShapes[i]->SetContext (Ctx);
index 93607bc..d7ccb54 100644 (file)
@@ -101,7 +101,9 @@ OpenGl_View::OpenGl_View (const CALL_DEF_VIEWCONTEXT &AContext)
   myIntShadingMethod(TEL_SM_GOURAUD),
   myAntiAliasing(Standard_False),
   myTransPers(&myDefaultTransPers),
-  myIsTransPers(Standard_False)
+  myIsTransPers(Standard_False),
+  myTrihedron(NULL),
+  myGraduatedTrihedron(NULL)
 {
   // Initialize matrices
   memcpy(myOrientationMatrix,myDefaultMatrix,sizeof(Tmatrix3));
@@ -131,6 +133,7 @@ void OpenGl_View::ReleaseGlResources (const Handle(OpenGl_Context)& theCtx)
 {
   OpenGl_Element::Destroy (theCtx, myTrihedron);
   OpenGl_Element::Destroy (theCtx, myGraduatedTrihedron);
+   
   if (!myTextureEnv.IsNull())
   {
     theCtx->DelayedRelease (myTextureEnv);
@@ -159,7 +162,8 @@ void OpenGl_View::SetTextureEnv (const Handle(OpenGl_Context)&       theCtx,
 
   myTextureEnv = new OpenGl_Texture (theTexture->GetParams());
   Handle(Image_PixMap) anImage = theTexture->GetImage();
-  myTextureEnv->Init (theCtx, *anImage.operator->(), theTexture->Type());
+  if( !anImage.IsNull())
+    myTextureEnv->Init (theCtx, *anImage.operator->(), theTexture->Type());
 }
 
 /*----------------------------------------------------------------------*/
index 560bdba..2d9ab49 100755 (executable)
@@ -1032,10 +1032,11 @@ void TPrsStd_AISPresentation::AISErase (const Standard_Boolean remove)
   Handle(AIS_InteractiveContext) ctx, ownctx;
 
   if ( !myAIS.IsNull() ) {   
-    ownctx = myAIS->GetContext();
+    
     if ( !Label().IsNull()) {  
       Handle(TPrsStd_AISViewer) viewer;
-      if( !TPrsStd_AISViewer::Find(Label(), viewer) ) return;   
+      if( !TPrsStd_AISViewer::Find(Label(), viewer) ) return;  
+      ownctx = myAIS->GetContext();
       ctx = viewer->GetInteractiveContext();
       if( remove ) {
        if( !ctx.IsNull() ) ctx->Remove (myAIS,Standard_False); 
index 54b9510..7e59d3e 100755 (executable)
@@ -98,6 +98,9 @@
 #include <AIS_Drawer.hxx>
 #include <Aspect_TypeOfLine.hxx>
 #include <Prs3d_LineAspect.hxx>
+#include <TDocStd_Owner.hxx>
+#include <Geom_Axis2Placement.hxx>
+#include <AIS_Trihedron.hxx>
 
 #define ZVIEW_SIZE 1000000.0
 // avoid warnings on 'extern "C"' functions returning C++ classes
@@ -1009,6 +1012,65 @@ static Standard_Integer XShowFaceBoundary (Draw_Interpretor& di,
 }
 
 //=======================================================================
+//function : testDoc
+//purpose  : Method to test destruction of document
+//=======================================================================
+static Standard_Integer testDoc (Draw_Interpretor& di,
+                                 Standard_Integer argc,
+                                 const char ** argv)
+{
+  if( argc < 2 )
+  {
+    cout<<"Invalid numbers of arguments should be: XTestDoc shape"<<endl;
+    return 1;
+  }
+  TopoDS_Shape shape = DBRep::Get(argv[1]);
+  if( shape.IsNull())
+    return 1;
+  Handle(XCAFApp_Application) A = XCAFApp_Application::GetApplication();
+  Handle(TDocStd_Document) aD1 = new TDocStd_Document("MDTV-XCAF");
+  aD1->Open(A);
+  
+  Handle(V3d_Viewer) vw = ViewerTest_Tool::MakeViewer ("Test viwer"); 
+  Handle(AIS_InteractiveContext) aContext = new AIS_InteractiveContext(vw);
+  TPrsStd_AISViewer::New (aD1->Main(),aContext);
+  // get shape tool for shape verification
+  Handle(XCAFDoc_ShapeTool) aShapes =
+    XCAFDoc_DocumentTool::ShapeTool (aD1->Main());
+  TDF_Label aLab = aShapes->AddShape(shape);
+
+  Handle(Geom_Axis2Placement) aPlacement = 
+    new Geom_Axis2Placement (gp::Origin(), gp::DZ(),gp::DX());
+  Handle(AIS_Trihedron) aTriShape = new AIS_Trihedron (aPlacement);
+  
+  Handle(TNaming_NamedShape) NS;
+  Handle(TPrsStd_AISPresentation) prs;
+  if( aLab.FindAttribute( TNaming_NamedShape::GetID(), NS) ) {
+    prs = TPrsStd_AISPresentation::Set( NS );
+  }
+   
+  if( aLab.FindAttribute(TPrsStd_AISPresentation::GetID(), prs) ) 
+    prs->Display();
+  
+
+  TPrsStd_AISViewer::Update(aLab);
+  aContext->Display(aTriShape, Standard_True);
+  Handle(TDocStd_Owner) owner;
+  if (aD1->Main().Root().FindAttribute(TDocStd_Owner::GetID(), owner))
+  {
+    Handle_TDocStd_Document empty;
+    owner->SetDocument(empty);
+  }
+  aContext.Nullify();
+  aD1->Close();
+  aD1.Nullify();
+  return 0;
+}
+
+
+//=======================================================================
 //function : Init
 //purpose  :
 //=======================================================================
@@ -1082,6 +1144,7 @@ void XDEDRAW::Init(Draw_Interpretor& di)
           "Doc Label IsOn [R G B [LineWidth [LineStyle]]]:"
           "- turns on/off drawing of face boundaries and defines boundary line style",
           __FILE__, XShowFaceBoundary, g);
+   di.Add ("XTestDoc", "XTestDoc shape", __FILE__, testDoc, g);
 
   // Specialized commands
   XDEDRAW_Shapes::InitCommands ( di );
diff --git a/tests/bugs/caf/bug24047 b/tests/bugs/caf/bug24047
new file mode 100755 (executable)
index 0000000..fa3ab31
--- /dev/null
@@ -0,0 +1,12 @@
+puts "============"
+puts "OCC24047"
+puts "============"
+puts ""
+#######################################################################
+# Exception in TPrsStd_AISPresentation during destruction of TDocStd_Document
+#######################################################################
+
+pload XDEDRAW
+
+box a 0 0 0 10 10 10
+XTestDoc a