Skip to content

Commit 8580e39

Browse files
committed
Manage maya callback after reload
1 parent 68540f4 commit 8580e39

9 files changed

Lines changed: 30 additions & 46 deletions

mscreen.py

Lines changed: 21 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
logger.addHandler(logging.NullHandler())
3131

3232
try:
33+
import maya
3334
import maya.cmds as mc
3435
import maya.OpenMayaUI as omui
3536
import maya.OpenMayaRender as omr
@@ -457,28 +458,33 @@ def __init__(self):
457458
# `mscreen` works by registering ONE callback in a Maya 3dview, said
458459
# callback calls to `__draw` where all the registered primitives are
459460
# proccessed.
461+
self.callback = omui.MUiMessage.add3dViewPostRenderMsgCallback(
462+
self.getCurrentModelPanel(), lambda *args: self.__draw())
460463
self.primitives = list()
461-
# `_callback` holds Maya's callback ID.
462-
self._callback = None
464+
self.refresh()
463465

464-
def __registerCallback(self):
465-
if self._callback is not None:
466+
# Maya's callback is stored as a singleton in the maya module so it can be
467+
# managed after reloading this module avoiding memory leaks.
468+
@property
469+
def callback(self):
470+
if hasattr(maya, "mscreen_callback"):
471+
return maya.mscreen_callback
472+
473+
@callback.setter
474+
def callback(self, value):
475+
del self.callback
476+
maya.mscreen_callback = value
477+
478+
@callback.deleter
479+
def callback(self):
480+
if not self.callback:
466481
return
467-
self._callback = omui.MUiMessage.add3dViewPostRenderMsgCallback(
468-
self.getCurrentModelPanel(), lambda *args: self.__draw())
469-
470-
def __unregisterCallback(self):
471-
if self._callback is not None and len(self.primitives) == 0:
472-
try:
473-
omui.MUiMessage.removeCallback(self._callback)
474-
except Exception as err:
475-
logger.debug(err)
476-
self._callback = None
482+
omui.MUiMessage.removeCallback(self.callback)
483+
del maya.mscreen_callback
477484

478485
def __draw(self):
479486
for each in self.primitives:
480487
each.draw(self.view, self.renderer)
481-
self.__unregisterCallback()
482488

483489
def refresh(self):
484490
"""
@@ -494,7 +500,6 @@ def clear(self):
494500

495501
def registerPrimitive(self, primitive):
496502
self.primitives.append(primitive)
497-
self.__registerCallback()
498503

499504
def unregisterPrimitive(self, primitive):
500505
if primitive in self.primitives:

tests/test_bezier.py

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,6 @@
11
import random
22
import mscreen
3-
4-
mscreen.clear()
5-
mscreen.refresh()
6-
7-
reload(mscreen)
3+
reload(mscreen) # debugging purposes
84

95

106
NUM_CVS = 6

tests/test_deform.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,7 @@
22
import maya.api.OpenMaya as om2
33

44
import mscreen
5-
mscreen.clear()
6-
reload(mscreen)
5+
reload(mscreen) # debugging purposes
76

87

98
def deformById(curve, mobjects):

tests/test_linearInterpolate.py

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,7 @@
11
import random
22
import mscreen
3+
reload(mscreen) # debugging purposes
34

4-
mscreen.clear()
5-
mscreen.refresh()
6-
7-
reload(mscreen)
85

96
POS_A = (random.randint(-10, 0), random.randint(0, 10), random.randint(-5, 5))
107
POS_B = (random.randint(0, 10), random.randint(0, 10), random.randint(-5, 5))

tests/test_lines.py

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,5 @@
11
import mscreen
2-
3-
mscreen.clear()
4-
mscreen.refresh()
5-
6-
reload(mscreen)
2+
reload(mscreen) # debugging purposes
73

84

95
POINTS = ((2.0, 0.0, 2.0), (2.0, 0.0, -2.0), (-2.0, 0.0, -2.0),

tests/test_parent.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
11
import maya.cmds as cmds
2-
import mscreen
32

4-
mscreen.clear()
5-
reload(mscreen)
3+
import mscreen
4+
reload(mscreen) # debugging purposes
65

76

87
# create a curve

tests/test_points.py

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,7 @@
11
import random
22
import mscreen
3+
reload(mscreen) # debugging purposes
34

4-
mscreen.clear()
5-
mscreen.refresh()
6-
7-
reload(mscreen)
85

96
NUM_POINTS = 50
107
COLORS = (

tests/test_readme.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
import random
22
import mscreen
3-
4-
mscreen.clear()
5-
reload(mscreen)
3+
reload(mscreen) # debugging purposes
64

75
# let's draw a square
86
POINTS = ((2.0, 0.0, 2.0), (2.0, 0.0, -2.0), (-2.0, 0.0, -2.0),

tests/test_transforms.py

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,7 @@
11
import random
22
import mscreen
3+
reload(mscreen) # debugging purposes
34

4-
mscreen.clear()
5-
mscreen.refresh()
6-
7-
reload(mscreen)
85

96
# Lets draw a few matrices...
107
for _ in range(10):

0 commit comments

Comments
 (0)