Your browser does not seem to support JavaScript. As a result, your viewing experience will be diminished, and you have been placed in read-only mode.
Please download a browser that supports JavaScript, or enable it if it's disabled (i.e. NoScript).
On 16/06/2013 at 05:46, xxxxxxxx wrote:
Hi,
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, Ferdinand