-
Notifications
You must be signed in to change notification settings - Fork 8
Expand file tree
/
Copy pathpycal3d.py
More file actions
79 lines (67 loc) · 3.22 KB
/
pycal3d.py
File metadata and controls
79 lines (67 loc) · 3.22 KB
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
import os
import tempfile
from imvu import imvuctypes
import cal3d
class Cal3d:
def __init__(self):
self.typeToBinaryExtensionMap_ = { "CoreAnimation" : "caf",
"CoreMaterial" : "crf",
"CoreMorphAnimation" : "cpf",
"CoreMesh" : "cmf",
"CoreSkeleton" : "csf" }
self.typeToXmlExtensionMap_ = { "CoreAnimation" : "xaf",
"CoreMaterial" : "xrf",
"CoreMorphAnimation" : "xpf",
"CoreMesh" : "xmf",
"CoreSkeleton" : "xsf" }
self.xmlExtensionToTypeMap_ = {}
for key, value in self.typeToXmlExtensionMap_.items() + self.typeToBinaryExtensionMap_.items():
self.xmlExtensionToTypeMap_[".%s" % value] = key
def cal3dTypeForPath(self, path):
name, ext = os.path.splitext(path)
try:
return self.xmlExtensionToTypeMap_[ext]
except KeyError:
return None
def convertToBinary(self, calCoreType, data):
extension = self.typeToBinaryExtensionMap_[calCoreType]
return self.__convert(calCoreType=calCoreType, data=data, extension=extension)
def convertToXml(self, calCoreType, data):
extension = self.typeToXmlExtensionMap_[calCoreType]
return self.__convert(calCoreType=calCoreType, data=data, extension=extension)
def getFormat(self, data):
for calCoreType in self.typeToBinaryExtensionMap_.keys():
loaderFunc = getattr(cal3d, "load"+calCoreType+"FromBuffer")
if not loaderFunc:
raise "could not find Loader for calCoreType %s" % calCoreType
obj = loaderFunc(data)
if obj:
if data.startswith('<HEADER'):
binary_flag = 'XML' # not really, two root document elements, but that's another story ;_;
else:
binary_flag = 'Binary'
return '%s,%s' % (calCoreType, binary_flag)
return None
def __convert(self, calCoreType, data, extension):
loaderFunc = getattr(cal3d, "load"+calCoreType+"FromBuffer")
saverFunc = getattr(cal3d, "save"+calCoreType)
if not loaderFunc:
raise Exception("could not find Loader for calCoreType %s" % calCoreType)
if not saverFunc:
raise Exception("could not find Saver for calCoreType %s" % calCoreType)
object = loaderFunc(data)
if not object:
raise Exception("could not load data (len %s) for calCoreType %s" % (len(data), calCoreType))
path = "%s.%s" % (tempfile.mktemp(), extension)
try:
r = saverFunc(object, path)
if not r:
cal3d_dll.CalError_PrintLastError();
raise Exception("could not save object 0x%x (calCoreType=%s) to path %s" % (object, calCoreType, path))
f = open(path, "rb")
ret = f.read()
f.close()
finally:
if os.path.exists(path):
os.remove(path)
return ret