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 <[email protected]>
> 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
> [email protected]
> https://mail.gna.org/listinfo/pythonocc-users
>
_______________________________________________
Pythonocc-users mailing list
[email protected]
https://mail.gna.org/listinfo/pythonocc-users