import json import os class CodeGenerator: def __init__(self): self.import_str = 'from manimlib.imports import *' self.class_declare_template = 'class {0}(Scene):' self.construct_str = 'def construct(self):' self.indent = ' ' self.code_list = [] self.wait_str = 'self.wait()' def assemble_code(self, codes): self.code_list.append(self.import_str) class_declare = self.class_declare_template.format(codes['scene_name']) self.code_list.append(class_declare) self.code_list.append(self.indent + self.construct_str) indent_cur = 2 for item in codes['codes']: param_list = [] for param in item['params']: if param == 'varargs': vararg_list = [] for sub_param in item['params'][param]: if sub_param['type'] == 'string': vararg_list.append('\"' + sub_param['content'] + '\"') elif sub_param['type'] == 'instance': vararg_list.append(sub_param['content']) param_list.extend(vararg_list) else: if item['params'][param]['type'] == 'string': param_display = '\'' + item['params'][param]['content'] + '\'' elif item['params'][param]['type'] == 'constant': param_display = item['params'][param]['content'] else: param_display = str(item['params'][param]['content']) param_item = param + '=' + param_display param_list.append(param_item) param_str = ', '.join(param_list) if item['type'] == 'create_instance': construct_str = item['class'] + '(' + param_str + ')' line = self.indent * indent_cur + item['name'] + ' = ' + construct_str self.code_list.append(line) elif item['type'] == 'call_function': function_str = item['function'] + '(' + param_str + ')' line = self.indent * indent_cur + item['instance'] + '.' + function_str self.code_list.append(line) self.code_list.append(self.indent * indent_cur + self.wait_str) def to_file(self, directory_path, file_path): if not os.path.exists(directory_path): os.mkdir(directory_path) with open(file_path, 'w') as file: for code in self.code_list: file.write(code + '\n') def py_to_file(self, code_str, directory_path, file_path): if not os.path.exists(directory_path): os.mkdir(directory_path) with open(file_path, 'w') as file: file.write(code_str)