def path_menu(self, searchpaths, operator, props_default={}): layout = self.layout # hard coded to set the operators 'filepath' to the filename. import os import bpy.utils layout = self.layout if not searchpaths: layout.label("* Missing Paths *") # collect paths files = [] for directory in searchpaths: files.extend([(f, os.path.join(directory, f)) for f in os.listdir(directory)]) files.sort() for f, filepath in files: if f.startswith("."): continue preset_name = display_name(f) props = layout.operator(operator, text=preset_name) for attr, value in props_default.items(): setattr(props, attr, value) props.filepath = filepath if operator == "script.execute_preset": props.menu_idname = self.bl_idname
def yaf_preset_find(name, preset_path, disp_name=False): if not name: return None if display_name: filename = "" for fn in os.listdir(preset_path): if fn.endswith(".py") and name == display_name(fn): filename = fn break else: filename = name + ".py" if filename: filepath = os.path.join(preset_path, filename) if os.path.exists(filepath): return filepath
def execute(self, context): if hasattr(self, "pre_cb"): self.pre_cb(context) preset_menu_class = getattr(bpy.types, self.preset_menu) if not self.remove_active: if not self.name: return {'FINISHED'} filename = clean_name(self.name) target_path = os.path.join(sys.path[0], "yafaray", "presets", self.preset_subdir) if not target_path: self.report({'WARNING'}, "Failed to create presets path") return {'CANCELLED'} filepath = os.path.join(target_path, filename) + ".py" if hasattr(self, "add"): self.add(context, filepath) else: file_preset = open(filepath, 'w') file_preset.write("import bpy\n") if hasattr(self, "preset_defines"): for rna_path in self.preset_defines: exec(rna_path) file_preset.write("%s\n" % rna_path) file_preset.write("\n") for rna_path in self.preset_values: value = eval(rna_path) if type(value) == float: # formatting of the floating point values value = round(value, 4) if str(value).startswith('Color'): # formatting of the Color Vectors (r,g,b) r, g, b = round(value.r, 3), round(value.g, 3), round(value.b, 3) file_preset.write("%s = %r, %r, %r\n" % (rna_path, r, g, b)) else: try: # convert thin wrapped sequences to simple lists to repr() value = value[:] except: pass file_preset.write("%s = %r\n" % (rna_path, value)) file_preset.close() preset_menu_class.bl_label = display_name(filename) else: preset_active = preset_menu_class.bl_label target_path = os.path.join(sys.path[0], "yafaray", "presets", self.preset_subdir) filepath = yaf_preset_find(preset_active, target_path) if not filepath: filepath = yaf_preset_find(preset_active, target_path, disp_name=True) if not filepath: return {'CANCELLED'} if hasattr(self, "remove"): self.remove(context, filepath) else: try: os.remove(filepath) except: import traceback print("No Preset there to remove...") # XXX stupid: Print bl_label on menu selector... preset_menu_class.bl_label = self.bl_label if hasattr(self, "post_cb"): self.post_cb(context) return {'FINISHED'}
def execute(self, context): if hasattr(self, "pre_cb"): self.pre_cb(context) preset_menu_class = getattr(bpy.types, self.preset_menu) if not self.remove_active: if not self.name: return {'FINISHED'} filename = clean_name(self.name) home_dir = os.path.expanduser("~") target_path = os.path.join(home_dir, "yafaray_userdata", "presets", self.preset_subdir) if not os.path.exists(target_path): os.makedirs(target_path) if not target_path: self.report({'WARNING'}, "Failed to create presets path") return {'CANCELLED'} filepath = os.path.join(target_path, filename) + ".py" if hasattr(self, "add"): self.add(context, filepath) else: file_preset = open(filepath, 'w') file_preset.write("import bpy\n") if hasattr(self, "preset_defines"): for rna_path in self.preset_defines: exec(rna_path) file_preset.write("%s\n" % rna_path) file_preset.write("\n") for rna_path in self.preset_values: value = eval(rna_path) if type(value) == float: # formatting of the floating point values value = round(value, 4) if str(value).startswith('Color'): # formatting of the Color Vectors (r,g,b) r, g, b = round(value.r, 3), round(value.g, 3), round(value.b, 3) file_preset.write("%s = %r, %r, %r\n" % (rna_path, r, g, b)) else: try: # convert thin wrapped sequences to simple lists to repr() value = value[:] except: pass file_preset.write("%s = %r\n" % (rna_path, value)) file_preset.close() preset_menu_class.bl_label = display_name(filename) else: preset_active = preset_menu_class.bl_label home_dir = os.path.expanduser("~") target_path = os.path.join(home_dir, "yafaray_userdata", "presets", self.preset_subdir) if not os.path.exists(target_path): os.makedirs(target_path) filepath = yaf_preset_find(preset_active, target_path) if not filepath: filepath = yaf_preset_find(preset_active, target_path, disp_name=True) if not filepath: return {'CANCELLED'} if hasattr(self, "remove"): self.remove(context, filepath) else: try: os.remove(filepath) except: import traceback print("No Preset there to remove...") # XXX stupid: Print bl_label on menu selector... preset_menu_class.bl_label = self.bl_label if hasattr(self, "post_cb"): self.post_cb(context) return {'FINISHED'}