]> git.tdb.fi Git - libs/gl.git/blobdiff - blender/io_mspgl/datafile.py
Make resource handling in the Blender exporter more flexible
[libs/gl.git] / blender / io_mspgl / datafile.py
index 09fb86c5210e2dcba3349aac31072414bc20ec3e..42ff454b4ccff69ab8d433629d973ddced83e744 100644 (file)
@@ -14,6 +14,8 @@ class Statement:
                                s += " {:#.6g}".format(a)
                        elif type(a)==str:
                                s += ' "{}"'.format(a)
+                       elif type(a)==Resource:
+                               s += ' "{}"'.format(a.name)
                        else:
                                s += " {}".format(a)
 
@@ -27,9 +29,51 @@ class Statement:
                else:
                        f.write(";\n")
 
+
 class Token:
        def __init__(self, text):
                self.text = text
 
        def __str__(self):
                return self.text
+
+
+class Resource:
+       def __init__(self, name):
+               self.name = name
+               self.statements = []
+               self.references = []
+
+       def create_reference_statement(self, keyword, *args):
+               if len(args)<1:
+                       raise TypeError("create_reference_statement expected at least 2 arguments, got {}".format(1+len(args)))
+
+               resources = []
+               for a in args:
+                       if type(a)==Resource:
+                               resources.append(a)
+
+               if not resources:
+                       raise TypeError("create_reference_statement expected a Resource argument, found none")
+
+               self.references += [r for r in resources if r not in self.references]
+               return Statement(keyword, *args)
+
+       def create_embed_statement(self, keyword, *args):
+               if len(args)<1:
+                       raise TypeError("create_embed_statement expected at least 2 arguments, got {}".format(1+len(args)))
+               res = args[-1]
+               if type(res)!=Resource:
+                       raise TypeError("create_embed_statement expected a Resource as last argument, got {}".format(type(args[-1]).__name__))
+
+               self.references += [r for r in res.references if r not in self.references]
+               st = Statement(keyword, *args[:-1])
+               st.sub = res.statements
+               return st
+
+       def collect_references(self):
+               refs = []
+               for r in self.references:
+                       refs += [e for e in r.collect_references() if e not in refs]
+               refs += [e for e in self.references if e not in refs]
+               return refs