Hot-keys on this page

r m x p   toggle line displays

j k   next/prev highlighted chunk

0   (zero) top of page

1   (one) first highlighted chunk

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

import director.vtkAll as vtk 

import director.objectmodel as om 

from director import lcmUtils 

 

# if bot_lcmgl cannot be important than this module will not be able to 

# support lcmgl, but it can still be imported in a disabled state 

try: 

    import bot_lcmgl 

    LCMGL_AVAILABLE = True 

except ImportError: 

    LCMGL_AVAILABLE = False 

 

 

class LCMGLObject(om.ObjectModelItem): 

 

    def __init__(self, name, actor): 

 

        om.ObjectModelItem.__init__(self, name, om.Icons.Robot) 

 

        self.actor = actor 

        self.actor.SetUseBounds(False) 

        self.addProperty('Visible', actor.GetVisibility()) 

        self.views = [] 

 

    def _onPropertyChanged(self, propertySet, propertyName): 

        om.ObjectModelItem._onPropertyChanged(self, propertySet, propertyName) 

 

        if propertyName == 'Visible': 

            self.actor.SetVisibility(self.getProperty(propertyName)) 

            self.renderAllViews() 

 

    def addToView(self, view): 

        if view in self.views: 

            return 

        self.views.append(view) 

        view.renderer().AddActor(self.actor) 

        view.render() 

 

    def renderAllViews(self): 

        for view in self.views: 

            view.render() 

 

    def onRemoveFromObjectModel(self): 

        self.removeFromAllViews() 

 

    def removeFromAllViews(self): 

        for view in list(self.views): 

            self.removeFromView(view) 

        assert len(self.views) == 0 

 

    def removeFromView(self, view): 

        assert view in self.views 

        self.views.remove(view) 

        view.renderer().RemoveActor(self.actor) 

        view.render() 

 

    def onMessage(self, msgBytes): 

        self.actor.UpdateGLData(msgBytes.data()) 

        self.renderAllViews() 

 

 

managerInstance = None 

 

class LCMGLManager(object): 

 

    def __init__(self, view): 

        assert LCMGL_AVAILABLE 

        self.view = view 

        self.subscriber = None 

        self.enable() 

 

    def isEnabled(self): 

        return self.subscriber is not None 

 

    def setEnabled(self, enabled): 

        if enabled and not self.subscriber: 

            self.subscriber = lcmUtils.addSubscriber('LCMGL.*', callback=self.onMessage) 

        elif not enabled and self.subscriber: 

            lcmUtils.removeSubscriber(self.subscriber) 

            self.subscriber = None 

 

    def enable(self): 

        self.setEnabled(True) 

 

    def disable(self): 

        self.setEnabled(False) 

 

    def onMessage(self, msgBytes, channel): 

 

        msg = bot_lcmgl.data_t.decode(msgBytes.data()) 

        drawObject = self.getDrawObject(msg.name) 

        if not drawObject: 

            drawObject = self.addDrawObject(msg.name, msgBytes) 

        drawObject.onMessage(msgBytes) 

 

    def getDrawObject(self, name): 

        parent = om.getOrCreateContainer('LCM GL') 

        return parent.findChild(name) 

 

    def addDrawObject(self, name, msgBytes): 

        actor = vtk.vtkLCMGLProp() 

        obj = LCMGLObject(name, actor) 

        om.addToObjectModel(obj, om.getOrCreateContainer('LCM GL')) 

        obj.addToView(self.view) 

        return obj 

 

 

def init(view): 

    if not hasattr(vtk, 'vtkLCMGLProp'): 

        return None 

 

    global managerInstance 

    managerInstance = LCMGLManager(view) 

    return managerInstance