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

138

139

140

141

142

143

144

145

146

147

148

149

150

import os 

 

from PythonQt import QtCore, QtGui 

 

import director.applogic as app 

import director.objectmodel as om 

import director.ioUtils as io 

import director.visualization as vis 

from director import roboturdf 

from director import otdfmodel 

 

_lastDir = None 

 

def getDefaultDirectory(): 

    return _lastDir or os.getcwd() 

 

 

def storeDefaultDirectory(filename): 

 

    global _lastDir 

    if os.path.isfile(filename): 

        filename = os.path.dirname(filename) 

    if os.path.isdir(filename): 

        _lastDir = filename 

 

 

def onFileOpenDialog(): 

 

    mainWindow = app.getMainWindow() 

 

    fileFilters = "Data Files (*.obj *.pcd *.ply *.stl *.vtk *.vtp *.wrl *.urdf *.otdf)"; 

    filename = QtGui.QFileDialog.getOpenFileName(mainWindow, "Open...", getDefaultDirectory(), fileFilters) 

    if not filename: 

        return 

 

    storeDefaultDirectory(filename) 

    onOpenFile(filename) 

 

 

def onOpenFile(filename): 

 

    if filename.lower().endswith('urdf'): 

        onOpenUrdf(filename) 

    elif filename.lower().endswith('otdf'): 

        onOpenOtdf(filename) 

    else: 

        onOpenGeometry(filename) 

 

 

def onOpenGeometry(filename): 

 

    if filename.lower().endswith('wrl'): 

        onOpenVrml(filename) 

        return 

 

    polyData = io.readPolyData(filename) 

 

    if not polyData or not polyData.GetNumberOfPoints(): 

        app.showErrorMessage('Failed to read any data from file: %s' % filename, title='Reader error') 

        return 

 

    vis.showPolyData(polyData, os.path.basename(filename), parent='files') 

 

 

def onOpenVrml(filename): 

    meshes, color = io.readVrml(filename) 

    folder = om.getOrCreateContainer(os.path.basename(filename), parentObj=om.getOrCreateContainer('files')) 

    for i, pair in enumerate(zip(meshes, color)): 

        mesh, color = pair 

        vis.showPolyData(mesh, 'mesh %d' % i, color=color, parent=folder) 

 

 

def onOpenUrdf(filename): 

 

    model = roboturdf.openUrdf(filename, app.getCurrentRenderView()) 

    if not model: 

        app.showErrorMessage('Failed to read urdf file: %s' % filename, title='Read urdf error') 

 

 

def onOpenOtdf(filename): 

    model = otdfmodel.openOtdf(filename, app.getCurrentRenderView()) 

 

 

def onFileExportUrdf(): 

    obj = om.getActiveObject() 

    if not obj or not isinstance(obj, otdfmodel.OtdfModelItem): 

        app.showErrorMessage('Please select an OTDF object', title='OTDF object not selected') 

        return 

 

    mainWindow = app.getMainWindow() 

    filename = QtGui.QFileDialog.getSaveFileName(mainWindow, "Save Data...", getDefaultDirectory(), 'URDF (*.urdf)', 'URDF (*.urdf)') 

 

    if not os.path.splitext(filename)[1]: 

        filename += '.urdf' 

 

    storeDefaultDirectory(filename) 

    urdfString = obj.parser.getUrdfFromOtdf() 

    urdfFile = open(filename, 'w') 

    urdfFile.write(urdfString) 

    urdfFile.close() 

 

def onFileSaveData(): 

 

    obj = om.getActiveObject() 

    if not obj: 

        app.showErrorMessage('Please select an object', title='No object selected') 

        return 

    if isinstance(obj, otdfmodel.OtdfModelItem): 

        mainWindow = app.getMainWindow() 

        filename = QtGui.QFileDialog.getSaveFileName(mainWindow, "Save Data...", getDefaultDirectory(), 'OTDF (*.otdf)', 'OTDF (*.otdf)') 

 

        if not os.path.splitext(filename)[1]: 

            filename += '.otdf' 

 

        storeDefaultDirectory(filename) 

        otdfString = obj.parser.getUpdatedOtdf() 

        otdfFile = open(filename, 'w') 

        otdfFile.write(otdfString) 

        otdfFile.close() 

    elif hasattr(obj, 'polyData'): 

        mainWindow = app.getMainWindow() 

        fileFilters = "PLY (*.ply);;STL (*.stl);;VTP (*.vtp);;VTK (*.vtk)"; 

        defaultFilter = 'VTP (*.vtp)'; 

        filename = QtGui.QFileDialog.getSaveFileName(mainWindow, "Save Data...", getDefaultDirectory(), fileFilters, defaultFilter) 

 

        if not filename: 

            return 

 

        if not os.path.splitext(filename)[1]: 

            filename += '.vtp' 

 

        polyData = io.writePolyData(obj.polyData, filename) 

    else: 

        app.showErrorMessage('Please select an object that contains geometry data or an OTDF object', title='Invalid object selected') 

        return 

 

    storeDefaultDirectory(filename) 

 

def onOpenOnlineHelp(): 

 

    QtGui.QDesktopServices.openUrl(QtCore.QUrl('https://openhumanoids.github.io/director/')) 

 

 

def init(): 

    mainWindow = app.getMainWindow() 

 

    mainWindow.connect('fileOpen()', onFileOpenDialog) 

    mainWindow.connect('fileSaveData()', onFileSaveData) 

    mainWindow.connect('fileExportUrdf()', onFileExportUrdf) 

    mainWindow.connect('openOnlineHelp()', onOpenOnlineHelp)