diff --git a/korman/properties/modifiers/base.py b/korman/properties/modifiers/base.py index ed2b76e..2a984a2 100644 --- a/korman/properties/modifiers/base.py +++ b/korman/properties/modifiers/base.py @@ -13,12 +13,17 @@ # You should have received a copy of the GNU General Public License # along with Korman. If not, see . +from __future__ import annotations + import bpy from bpy.props import * import abc import itertools -from typing import Any, Dict, FrozenSet, Optional +from typing import * + +if TYPE_CHECKING: + from ...nodes.node_python import * from ... import helpers @@ -202,24 +207,23 @@ class PlasmaModifierLogicWiz: pfm_node.update() return pfm_node - def _create_python_attribute(self, pfm_node, attribute_name: str, attribute_type: Optional[str] = None, **kwargs): + def _create_python_attribute(self, pfm_node: PlasmaPythonFileNode, attribute_name: str, **kwargs): """Creates and links a Python Attribute Node to the Python File Node given by `pfm_node`. - This will automatically handle simple attribute types such as numbers and strings, however, - for object linkage, you should specify the optional `attribute_type` to ensure the proper - attribute type is found. For attribute nodes that require multiple values, the `value` may - be set to None and handled in your code.""" - from ...nodes.node_python import PlasmaAttribute, PlasmaAttribNodeBase - if attribute_type is None: - assert len(kwargs) == 1 and "value" in kwargs, \ - "In order to deduce the attribute_type, exactly one attribute value must be passed as a kw named `value`" - attribute_type = PlasmaAttribute.type_LUT.get(kwargs["value"].__class__) + For attribute nodes that require multiple values, the `value` may be set to None and + handled in your code.""" + attribute_defn = next((i for i in pfm_node.attributes if i.attribute_name == attribute_name), None) + if attribute_defn is None: + raise KeyError(attribute_name) + + from ...nodes.node_python import PlasmaAttribNodeBase + attribute_type = attribute_defn.attribute_type node_cls = next((i for i in PlasmaAttribNodeBase.__subclasses__() if attribute_type in i.pl_attrib), None) - assert node_cls is not None, "'{}': Unable to find attribute node type for '{}' ('{}')".format( - self.id_data.name, attribute_name, attribute_type - ) + assert node_cls is not None, \ + f"'{self.id_data.name}': Unable to find attribute node type for '{attribute_name}' ('{attribute_type}')" node = pfm_node.id_data.nodes.new(node_cls.bl_idname) node.link_output(pfm_node, "pfm", attribute_name) + assert kwargs for i, j in kwargs.items(): setattr(node, i, j) return node