]> git.tdb.fi Git - libs/gl.git/blob - blender/io_mspgl/datafile.py
Make resource handling in the Blender exporter more flexible
[libs/gl.git] / blender / io_mspgl / datafile.py
1 class Statement:
2         def __init__(self, keyword, *args):
3                 self.keyword = keyword
4                 self.args = list(args)
5                 self.sub = []
6
7         def append(self, v):
8                 self.args.append(v)
9
10         def write_to_file(self, f, indent=0):
11                 s = self.keyword
12                 for a in self.args:
13                         if type(a)==float:
14                                 s += " {:#.6g}".format(a)
15                         elif type(a)==str:
16                                 s += ' "{}"'.format(a)
17                         elif type(a)==Resource:
18                                 s += ' "{}"'.format(a.name)
19                         else:
20                                 s += " {}".format(a)
21
22                 tabs = '\t'*indent
23                 f.write("{}{}".format(tabs, s))
24                 if self.sub:
25                         f.write("\n{}{{\n".format(tabs))
26                         for s in self.sub:
27                                 s.write_to_file(f, indent+1)
28                         f.write("{}}};\n".format(tabs))
29                 else:
30                         f.write(";\n")
31
32
33 class Token:
34         def __init__(self, text):
35                 self.text = text
36
37         def __str__(self):
38                 return self.text
39
40
41 class Resource:
42         def __init__(self, name):
43                 self.name = name
44                 self.statements = []
45                 self.references = []
46
47         def create_reference_statement(self, keyword, *args):
48                 if len(args)<1:
49                         raise TypeError("create_reference_statement expected at least 2 arguments, got {}".format(1+len(args)))
50
51                 resources = []
52                 for a in args:
53                         if type(a)==Resource:
54                                 resources.append(a)
55
56                 if not resources:
57                         raise TypeError("create_reference_statement expected a Resource argument, found none")
58
59                 self.references += [r for r in resources if r not in self.references]
60                 return Statement(keyword, *args)
61
62         def create_embed_statement(self, keyword, *args):
63                 if len(args)<1:
64                         raise TypeError("create_embed_statement expected at least 2 arguments, got {}".format(1+len(args)))
65                 res = args[-1]
66                 if type(res)!=Resource:
67                         raise TypeError("create_embed_statement expected a Resource as last argument, got {}".format(type(args[-1]).__name__))
68
69                 self.references += [r for r in res.references if r not in self.references]
70                 st = Statement(keyword, *args[:-1])
71                 st.sub = res.statements
72                 return st
73
74         def collect_references(self):
75                 refs = []
76                 for r in self.references:
77                         refs += [e for e in r.collect_references() if e not in refs]
78                 refs += [e for e in self.references if e not in refs]
79                 return refs