utils.CheckViewPortSelect bugs

On 16/06/2013 at 05:46, xxxxxxxx wrote:


sorry for the second thread, but I am pretty sure now that this a python specific problem.

1. When you do invoke Init() on a ViewPortSelect instance multiple times with different
objects as the ops parameter list the instance produces memory leaks. This of course
assumes the case where the ViewPortSelect object is a class member.

2. The same goes for a ViewPortSelect instance which is initialized right away for multiple
objects. The method that triggers the whole mess seems to be then the PickObject() method.

3. Freeing the ViewPortSelect  class member by overwriting it with None when freeing the 
tool does not free the associated memory. The crucial part seems to be somehow the
reinitialization of the instance as described in 1.

4. ViewPortSelect.PickObject() does not respect the object list passed to Init() it will select
anything that is near to the cursor. Not sure if that is intended, but it should be at least 
mentioned more clearly.

Why all that mess you might ask, simply do not make it a class member. Well, that is true,
but I think these are still major bugs and also dynamically allocating the ViewPortSelect 
object is quite a performance problem in python, at least for larger objects.

def CheckViewPortSelect(self, doc, bd) :
    Tests if the vpselect object if it is till valid.
    :param doc : The active document.
    :param bd  : The associated BaseDraw.
    :return    : NYI - always True
    if not isinstance(self.vpselect, utils.ViewportSelect) :
        self.vpselect = utils.ViewportSelect()
    if self.aobject is not None:
        if ( bd.GetMg() != self.vpmatrix or 
             bd.GetFrame() != self.vpframe or 
             self.vpobject != self.aobject or
             bd.GetProjection() != self.vpproject ) :
            self.vpselect = utils.ViewportSelect() # without that line the ViewportSelect is producing leaks.
            self.vpmatrix = bd.GetMg()        
            self.vpframe = bd.GetFrame()     
            self.vpproject = bd.GetProjection()
            self.vpobject = self.aobject
            wd = self.vpframe["cr"] - self.vpframe["cl"] + 1
            hg = self.vpframe["cb"] - self.vpframe["ct"] + 1
            self.vpselect.Init( wd, hg, bd, [self.aobject], c4d.Mpolyedgepoint, True, c4d.VIEWPORTSELECTFLAGS_IGNORE_HIDDEN_SEL )
        return True
    return False

Happy rendering,