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