Hi Frank,

This behaviour does not come from SWIG but from OpenCASCADE itself. Let me
explain you in a few words what happens here.

The BRepPrimAPI_MakeBox class inherits from the BRepBuilderAPI_MakeShape
one. This class provides the Shape() method you can find in
BRepPrimAPI_Make* basic geometry constructors. If you have a look at  the
Shape() method in the file BRepBuilderAPI_MakeShape.cxx, you will read:

"""
//=======================================================================
//function : Shape
//purpose  :
//=======================================================================

const TopoDS_Shape&  BRepBuilderAPI_MakeShape::Shape() const
{
  if (!IsDone()) {
    // the following is const cast away
    ((BRepBuilderAPI_MakeShape*) (void*) this)->Build();
    Check();
  }
  return myShape;
}
"""

The Shape() method then returns a reference to the protected attribute
'myShape' of the class BRepBuilderAPI_MakeBox. In other words, if you delete
the BRepPrimAPI_MakeBox instance, you loose the reference to the shape.

For instance:

>>> from OCC.BRepPrimAPI_MakeBox import *
>>> from OCC.TopoDS import *
>>> box = BRepPrimAPI_MakeBox(10,10,10)
>>> shp  = box.Shape()
>>> print shp.IsNull()
0
>>> del box #object is garbage collected, not deleted yet
>>> print shp.IsNull()
0
>>> GarbageCollector.garbage.smart_purge() # all objects are deleted, loose
the reference to myShape attribute
>>> print shp.IsNull()
1

Then force objects deletion only if you're sure you don't need the shapes
anymore. I don't know what you're trying to do exactly, so it's difficult to
suggest any best practice.

Regards,

Thomas

2010/3/15 Frank Conradie <fr...@qfin.net>

> Hi Thomas
>
> I am getting crash behaviour in the interim 0.5 PythonOCC release,
> related to the new GarbageCollector implementation. The code below
> crashes on my PC:
>
> ----------------------------------------
> from OCC.gp import *
> from OCC.BRepPrimAPI import *
> from OCC.BRepBuilderAPI import *
> from OCC.TopExp import *
> from OCC.TopoDS import *
>
> o = 0.0
> w = 0.1
> fp1 = (o,o,o)
> fp2 = (w,w,w)
>
> mkbox = BRepPrimAPI_MakeBox(gp_Pnt(fp1[0],fp1[1],fp1[2]),
> gp_Pnt(fp2[0],fp2[1],fp2[2]))
> s = mkbox.Shape()
> del mkbox
>
> print s.ShapeType()
> GarbageCollector.garbage.smart_purge()
> # The next line crashes my system
> print s.ShapeType()
> ----------------------------------------
>
> It is almost as if calling _kill_pointed for the mkbox causes shape "s"
> to become "corrupted" in some way. I dug through the SWIG code a bit,
> but cannot see anything obviously wrong, so I was hoping you could shed
> some light on the issue.
>
> By the way, I did get the SVN compiled myself as well, and get the same
> crash with my compiled lib as well as the one you made available on your
> website.
>
> Thanks,
> Frank
>
>
> _______________________________________________
> Pythonocc-users mailing list
> Pythonocc-users@gna.org
> https://mail.gna.org/listinfo/pythonocc-users
>
_______________________________________________
Pythonocc-users mailing list
Pythonocc-users@gna.org
https://mail.gna.org/listinfo/pythonocc-users

Reply via email to