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

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

from director import applogic as app 

from director.debugVis import DebugData 

from director import transformUtils 

from director import objectmodel as om 

from director import affordanceitems 

from director import affordanceurdf 

from director.uuidutil import newUUID 

import director.vtkAll as vtk 

import numpy as np 

 

import PythonQt 

from PythonQt import QtCore, QtGui, QtUiTools 

 

 

 

def addWidgetsToDict(widgets, d): 

 

    for widget in widgets: 

        if widget.objectName: 

            d[str(widget.objectName)] = widget 

        addWidgetsToDict(widget.children(), d) 

 

 

class WidgetDict(object): 

 

    def __init__(self, widgets): 

        addWidgetsToDict(widgets, self.__dict__) 

 

 

class AffordancePanel(object): 

 

    def __init__(self, view, affordanceManager, jointController=None, raycastDriver=None): 

 

        self.view = view 

        self.affordanceManager = affordanceManager 

        self.jointController = jointController 

        self.raycastDriver = raycastDriver 

 

        loader = QtUiTools.QUiLoader() 

        uifile = QtCore.QFile(':/ui/ddAffordancePanel.ui') 

        assert uifile.open(uifile.ReadOnly) 

 

        self.widget = loader.load(uifile) 

        self.ui = WidgetDict(self.widget.children()) 

 

        self.ui.affordanceListWidget.hide() 

 

        self.ui.spawnBoxButton.connect('clicked()', self.onSpawnBox) 

        self.ui.spawnSphereButton.connect('clicked()', self.onSpawnSphere) 

        self.ui.spawnCylinderButton.connect('clicked()', self.onSpawnCylinder) 

        self.ui.spawnCapsuleButton.connect('clicked()', self.onSpawnCapsule) 

        self.ui.spawnRingButton.connect('clicked()', self.onSpawnRing) 

        self.ui.spawnMeshButton.connect('clicked()', self.onSpawnMesh) 

        self.ui.getRaycastTerrainButton.connect('clicked()', self.onGetRaycastTerrain) 

 

        if not self.raycastDriver: 

            self.ui.getRaycastTerrainButton.hide() 

 

        self.eventFilter = PythonQt.dd.ddPythonEventFilter() 

        self.ui.scrollArea.installEventFilter(self.eventFilter) 

        self.eventFilter.addFilteredEventType(QtCore.QEvent.Resize) 

        self.eventFilter.connect('handleEvent(QObject*, QEvent*)', self.onEvent) 

 

    def onEvent(self, obj, event): 

        minSize = self.ui.scrollArea.widget().minimumSizeHint.width() + self.ui.scrollArea.verticalScrollBar().width 

        self.ui.scrollArea.setMinimumWidth(minSize) 

 

    def getSpawnFrame(self): 

 

        if self.jointController: 

            # get spawn frame in front of robot 

            pos = self.jointController.q[:3] 

            rpy = np.degrees(self.jointController.q[3:6]) 

            frame = transformUtils.frameFromPositionAndRPY(pos, rpy) 

            frame.PreMultiply() 

            frame.Translate(0.5, 0.0, 0.3) 

        else: 

            frame = vtk.vtkTransform() 

 

        return frame 

 

    def onGetRaycastTerrain(self): 

        affs = self.affordanceManager.getCollisionAffordances() 

        xy = self.jointController.q[:2] 

        self.raycastDriver.requestRaycast(affs, xy-2, xy+2) 

 

    def onSpawnBox(self): 

        pose = transformUtils.poseFromTransform(self.getSpawnFrame()) 

        desc = dict(classname='BoxAffordanceItem', Name='box', uuid=newUUID(), pose=pose) 

        return self.affordanceManager.newAffordanceFromDescription(desc) 

 

    def onSpawnSphere(self): 

        pose = transformUtils.poseFromTransform(self.getSpawnFrame()) 

        desc = dict(classname='SphereAffordanceItem', Name='sphere', uuid=newUUID(), pose=pose) 

        return self.affordanceManager.newAffordanceFromDescription(desc) 

 

    def onSpawnCylinder(self): 

        pose = transformUtils.poseFromTransform(self.getSpawnFrame()) 

        desc = dict(classname='CylinderAffordanceItem', Name='cylinder', uuid=newUUID(), pose=pose) 

        return self.affordanceManager.newAffordanceFromDescription(desc) 

 

    def onSpawnCapsule(self): 

        pose = transformUtils.poseFromTransform(self.getSpawnFrame()) 

        desc = dict(classname='CapsuleAffordanceItem', Name='capsule', uuid=newUUID(), pose=pose) 

        return self.affordanceManager.newAffordanceFromDescription(desc) 

 

    def onSpawnRing(self): 

        pose = transformUtils.poseFromTransform(self.getSpawnFrame()) 

        desc = dict(classname='CapsuleRingAffordanceItem', Name='ring', uuid=newUUID(), pose=pose) 

        return self.affordanceManager.newAffordanceFromDescription(desc) 

 

    def onSpawnMesh(self): 

 

        d = DebugData() 

        d.addArrow((0,0,0), (0,0,0.3)) 

        pd = d.getPolyData() 

        meshId = affordanceitems.MeshAffordanceItem.getMeshManager().add(pd) 

 

        pose = transformUtils.poseFromTransform(self.getSpawnFrame()) 

        desc = dict(classname='MeshAffordanceItem', Name='mesh', Filename=meshId, uuid=newUUID(), pose=pose) 

        return self.affordanceManager.newAffordanceFromDescription(desc) 

 

 

def _getAction(): 

    return None 

 

 

def init(view, affordanceManager, jointController, raycastDriver): 

 

    global panel 

    global dock 

 

    panel = AffordancePanel(view, affordanceManager, jointController, raycastDriver) 

    dock = app.addWidgetToDock(panel.widget, action=_getAction()) 

    dock.hide() 

 

    return panel