From 028c67c81eab341c6d98b139c3a81b91ac3e9308 Mon Sep 17 00:00:00 2001 From: Joshua Leung Date: Sat, 20 Feb 2016 17:53:32 +1300 Subject: Fix T44453: Exporting Keying Sets referencing node tree properties generates invalid Python code/paths The problem is that node trees (such as the Material, Lamp, and Compositor node trees) are stored as "nested node trees" on the affected datablocks. They are particularly troublesome to deal with, as the are not easily identified, and also cannot be easily mapped back to the ID's which actually own them. As a result, the usual automated methods do not work when dealing with these! --- release/scripts/startup/bl_operators/anim.py | 36 +++++++++++++++++++++++++--- 1 file changed, 33 insertions(+), 3 deletions(-) (limited to 'release') diff --git a/release/scripts/startup/bl_operators/anim.py b/release/scripts/startup/bl_operators/anim.py index f3575f26890..05817216a54 100644 --- a/release/scripts/startup/bl_operators/anim.py +++ b/release/scripts/startup/bl_operators/anim.py @@ -108,10 +108,40 @@ class ANIM_OT_keying_set_export(Operator): - id.bl_rna.name gives a name suitable for UI, with a capitalised first letter, but we need the plural form that's all lower case + - special handling is needed for "nested" ID-blocks + (e.g. nodetree in Material) """ - - idtype_list = ksp.id.bl_rna.name.lower() + "s" - id_bpy_path = "bpy.data.%s[\"%s\"]" % (idtype_list, ksp.id.name) + if ksp.id.bl_rna.identifier.startswith("ShaderNodeTree"): + # Find material or lamp using this node tree... + id_bpy_path = "bpy.data.nodes[\"%s\"]" + found = False + + for mat in bpy.data.materials: + if mat.node_tree == ksp.id: + id_bpy_path = "bpy.data.materials[\"%s\"].node_tree" % (mat.name) + found = True + break; + + if not found: + for lamp in bpy.data.lamps: + if lamp.node_tree == ksp.id: + id_bpy_path = "bpy.data.lamps[\"%s\"].node_tree" % (lamp.name) + found = True + break; + + if not found: + self.report({'WARN'}, "Could not find material or lamp using Shader Node Tree - %s" % (ksp.id)) + elif ksp.id.bl_rna.identifier.startswith("CompositorNodeTree"): + # Find compositor nodetree using this node tree... + for scene in bpy.data.scenes: + if scene.node_tree == ksp.id: + id_bpy_path = "bpy.data.scenes[\"%s\"].node_tree" % (scene.name) + break; + else: + self.report({'WARN'}, "Could not find scene using Compositor Node Tree - %s" % (ksp.id)) + else: + idtype_list = ksp.id.bl_rna.name.lower() + "s" + id_bpy_path = "bpy.data.%s[\"%s\"]" % (idtype_list, ksp.id.name) # shorthand ID for the ID-block (as used in the script) short_id = "id_%d" % len(id_to_paths_cache) -- cgit v1.2.3