From 8dff4827896001f7fed841058b9e1794ce8f3df6 Mon Sep 17 00:00:00 2001 From: Adam Johnson Date: Fri, 11 Jan 2019 15:06:48 -0500 Subject: [PATCH] LOGICWIZ: don't leave junk node trees behind --- korman/properties/modifiers/avatar.py | 10 +++------- korman/properties/modifiers/base.py | 19 ++++++++++++------- korman/properties/modifiers/gui.py | 10 +++------- korman/properties/modifiers/region.py | 11 +++-------- 4 files changed, 21 insertions(+), 29 deletions(-) diff --git a/korman/properties/modifiers/avatar.py b/korman/properties/modifiers/avatar.py index 17bee7a..bb0110f 100644 --- a/korman/properties/modifiers/avatar.py +++ b/korman/properties/modifiers/avatar.py @@ -127,20 +127,16 @@ class PlasmaSittingBehavior(idprops.IDPropObjectMixin, PlasmaModifierProperties, raise ExportError("'{}': Sitting Behavior's clickable object is invalid".format(self.key_name)) # Generate the logic nodes now - self.logicwiz(bo) - - # Now, export the node tree - self.node_tree.export(exporter, bo, so) + with self.generate_logic(bo) as tree: + tree.export(exporter, bo, so) def harvest_actors(self): if self.facing_enabled: return (self.clickable_object.name,) return () - def logicwiz(self, bo): - tree = self.node_tree + def logicwiz(self, bo, tree): nodes = tree.nodes - nodes.clear() # Sitting Modifier sittingmod = nodes.new("PlasmaSittingBehaviorNode") diff --git a/korman/properties/modifiers/base.py b/korman/properties/modifiers/base.py index ecab637..987e1de 100644 --- a/korman/properties/modifiers/base.py +++ b/korman/properties/modifiers/base.py @@ -16,6 +16,7 @@ import abc import bpy from bpy.props import * +from contextlib import contextmanager class PlasmaModifierProperties(bpy.types.PropertyGroup): def created(self): @@ -70,16 +71,20 @@ class PlasmaModifierProperties(bpy.types.PropertyGroup): class PlasmaModifierLogicWiz: - @property - def node_tree(self): - name = self.key_name + @contextmanager + def generate_logic(self, bo, **kwargs): + name = kwargs.pop("name", self.key_name) + assert not "tree" in kwargs + tree = bpy.data.node_groups.new(name, "PlasmaNodeTree") + kwargs["tree"] = tree try: - return bpy.data.node_groups[name] - except LookupError: - return bpy.data.node_groups.new(name, "PlasmaNodeTree") + self.logicwiz(bo, **kwargs) + yield tree + finally: + bpy.data.node_groups.remove(tree) @abc.abstractmethod - def logicwiz(self, bo): + def logicwiz(self, bo, tree): pass diff --git a/korman/properties/modifiers/gui.py b/korman/properties/modifiers/gui.py index 2c42f9d..cc3adf7 100644 --- a/korman/properties/modifiers/gui.py +++ b/korman/properties/modifiers/gui.py @@ -163,19 +163,15 @@ class PlasmaJournalBookModifier(PlasmaModifierProperties, PlasmaModifierLogicWiz self.temp_rgn = self.clickable_region # Generate the logic nodes - self.logicwiz(bo, version) - - # Export the node tree - self.node_tree.export(exporter, bo, so) + with self.generate_logic(bo, version=version) as tree: + tree.export(exporter, bo, so) # Get rid of our temporary clickable region if self.clickable_region is None: bpy.context.scene.objects.unlink(self.temp_rgn) - def logicwiz(self, bo, version): - tree = self.node_tree + def logicwiz(self, bo, tree, version): nodes = tree.nodes - nodes.clear() # Assign journal script based on target version journal_pfm = journal_pfms[version] diff --git a/korman/properties/modifiers/region.py b/korman/properties/modifiers/region.py index 5db0098..7af59e6 100644 --- a/korman/properties/modifiers/region.py +++ b/korman/properties/modifiers/region.py @@ -140,16 +140,11 @@ class PlasmaFootstepRegion(PlasmaModifierProperties, PlasmaModifierLogicWiz): default="hull") def export(self, exporter, bo, so): - # Generate the logic nodes now - self.logicwiz(bo) - - # Now, export the node tree - self.node_tree.export(exporter, bo, so) + with self.generate_logic(bo) as tree: + tree.export(exporter, bo, so) - def logicwiz(self, bo): - tree = self.node_tree + def logicwiz(self, bo, tree): nodes = tree.nodes - nodes.clear() # Region Sensor volsens = nodes.new("PlasmaVolumeSensorNode")