Hi Thomas

Well, I'm glad it's not a bug then! I can think of a few ways to handle this situation in my algorithm, so it should not be a problem. I'm just wondering how many other classes behave in this "unexpected" way :O

Cheers,
Frank

On 15/03/2010 10:26 PM, Thomas Paviot wrote:
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 <mailto: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 <mailto: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
_______________________________________________
Pythonocc-users mailing list
Pythonocc-users@gna.org
https://mail.gna.org/listinfo/pythonocc-users

Reply via email to