diff --git a/packages/tree_clipper/pyproject.toml b/packages/tree_clipper/pyproject.toml index 454d630..ba42035 100644 --- a/packages/tree_clipper/pyproject.toml +++ b/packages/tree_clipper/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "tree-clipper" -version = "0.1.10" +version = "0.1.11" dependencies = [] maintainers = [ { name="Algebraic", email="tree.clipper@algebraic.games" }, diff --git a/packages/tree_clipper/src/tree_clipper/common.py b/packages/tree_clipper/src/tree_clipper/common.py index 331fef5..3863728 100644 --- a/packages/tree_clipper/src/tree_clipper/common.py +++ b/packages/tree_clipper/src/tree_clipper/common.py @@ -13,7 +13,7 @@ # these fields are in the top level JSON object BLENDER_VERSION = "blender_version" TREE_CLIPPER_VERSION = "tree_clipper_version" -CURRENT_TREE_CLIPPER_VERSION = "0.1.10" # tested to match pyproject.toml +CURRENT_TREE_CLIPPER_VERSION = "0.1.11" # tested to match pyproject.toml MATERIAL_NAME = "name" TREES = "node_trees" EXTERNAL = "external" @@ -125,6 +125,20 @@ def most_specific_type_handled( ty = ty.__bases__[0] +def version_at_least( + version: list[int] | tuple[int, int, int], at_least: list[int] +) -> bool: + if version[0] > at_least[0]: + return True + if version[0] < at_least[0]: + return False + if version[1] > at_least[1]: + return True + if version[1] < at_least[1]: + return False + return version[2] >= at_least[2] + + GETTER = Callable[[], bpy.types.bpy_struct] SERIALIZER = Callable[["Exporter", bpy.types.bpy_struct, FromRoot], dict[str, Any]] DESERIALIZER = Callable[["Importer", GETTER, dict, FromRoot], None] diff --git a/packages/tree_clipper/src/tree_clipper/import_nodes.py b/packages/tree_clipper/src/tree_clipper/import_nodes.py index 78b0686..e9a2c9d 100644 --- a/packages/tree_clipper/src/tree_clipper/import_nodes.py +++ b/packages/tree_clipper/src/tree_clipper/import_nodes.py @@ -66,11 +66,13 @@ def __init__( self, *, blender_version: list[int], + tree_clipper_version: list[int], specific_handlers: dict[type, DESERIALIZER], getters: dict[int, GETTER], debug_prints: bool, ) -> None: self.blender_version = blender_version + self.tree_clipper_version = tree_clipper_version self.specific_handlers = specific_handlers self.getters = getters @@ -649,17 +651,21 @@ def set_external( assert int(external_id) in self.getters def start_import(self, parameters: ImportParameters) -> None: - version_cycle = self.data[BLENDER_VERSION].split(" ") - blender_version = [int(v) for v in version_cycle[0].split(".")] + blender_version_cycle = self.data[BLENDER_VERSION].split(" ") + blender_version = [int(v) for v in blender_version_cycle[0].split(".")] + tree_clipper_version = [ + int(v) for v in self.data[TREE_CLIPPER_VERSION].split(".") + ] self.importer = Importer( blender_version=blender_version, + tree_clipper_version=tree_clipper_version, specific_handlers=parameters.specific_handlers, getters=self.getters, debug_prints=parameters.debug_prints, ) - if len(version_cycle) > 1 and version_cycle[1] != "LTS": + if len(blender_version_cycle) > 1 and blender_version_cycle[1] != "LTS": self.importer.report.warnings.append( - f"This was exported from a Blender {version_cycle[1]} version." + f"This was exported from a Blender {blender_version_cycle[1]} version." ) def step(self) -> bool: diff --git a/packages/tree_clipper/src/tree_clipper/specific_handlers.py b/packages/tree_clipper/src/tree_clipper/specific_handlers.py index b2c0e98..7b37ba0 100644 --- a/packages/tree_clipper/src/tree_clipper/specific_handlers.py +++ b/packages/tree_clipper/src/tree_clipper/specific_handlers.py @@ -2,6 +2,8 @@ import bpy +from tree_clipper.common import version_at_least + from .common import ( BL_IDNAME, DATA, @@ -116,10 +118,13 @@ def _node_generic_collections(specific_importer: SpecificImporter) -> list[str]: - if ( - specific_importer.importer.blender_version[0] > 5 - or specific_importer.importer.blender_version[1] >= 2 - ): + blender_version_has_panels = version_at_least( + specific_importer.importer.blender_version, [5, 2, 0] + ) + tree_clipper_exported_panels = version_at_least( + specific_importer.importer.tree_clipper_version, [0, 1, 11] + ) + if blender_version_has_panels and tree_clipper_exported_panels: return [INPUTS, OUTPUTS, PANEL_STATES] else: return [INPUTS, OUTPUTS] diff --git a/packages/tree_clipper/tests/backwards_compatibility/blender_5_1_to_5_2/5_2_camera_info.json b/packages/tree_clipper/tests/backwards_compatibility/blender_5_1_to_5_2/5_2_camera_info.json index 895b007..0643ad3 100644 --- a/packages/tree_clipper/tests/backwards_compatibility/blender_5_1_to_5_2/5_2_camera_info.json +++ b/packages/tree_clipper/tests/backwards_compatibility/blender_5_1_to_5_2/5_2_camera_info.json @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:b2a312e95ad7e763a2e3868ee83d03c52823f228cb3cfdb55198b9c7ff70d091 -size 19020 +oid sha256:f6ba9950214fa0a22854d657dbfa4f06f864273be630ae85b689e0197b9ff70d +size 19019 diff --git a/packages/tree_clipper/tests/backwards_compatibility/blender_5_1_to_5_2/5_2_capture_attribute.json b/packages/tree_clipper/tests/backwards_compatibility/blender_5_1_to_5_2/5_2_capture_attribute.json index 74c2b79..b1dc044 100644 --- a/packages/tree_clipper/tests/backwards_compatibility/blender_5_1_to_5_2/5_2_capture_attribute.json +++ b/packages/tree_clipper/tests/backwards_compatibility/blender_5_1_to_5_2/5_2_capture_attribute.json @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:5b8e5d87bcaf6bf15769bc2abbed510c1f52d4f485429bfabfdf5bb60080ad1a -size 14336 +oid sha256:d28cb64639d1dac9da4fb997dc57fe655a41fb6a3360d3ff321fb09d18e5d64e +size 14335 diff --git a/packages/tree_clipper/tests/backwards_compatibility/blender_5_1_to_5_2/5_2_find_in_string.json b/packages/tree_clipper/tests/backwards_compatibility/blender_5_1_to_5_2/5_2_find_in_string.json index e88e4c9..dbe3f17 100644 --- a/packages/tree_clipper/tests/backwards_compatibility/blender_5_1_to_5_2/5_2_find_in_string.json +++ b/packages/tree_clipper/tests/backwards_compatibility/blender_5_1_to_5_2/5_2_find_in_string.json @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:a31bb7c91aec820f659ba9e71643cbea21074767cd266dddf449b226b940b4b5 -size 39851 +oid sha256:65aaad59709aab0ecb6d0dc83a4e6522f490f0916821889ed5c27f29301293fe +size 39850 diff --git a/packages/tree_clipper/tests/backwards_compatibility/blender_5_1_to_5_2/5_2_input_string.json b/packages/tree_clipper/tests/backwards_compatibility/blender_5_1_to_5_2/5_2_input_string.json index 94dceff..386e977 100644 --- a/packages/tree_clipper/tests/backwards_compatibility/blender_5_1_to_5_2/5_2_input_string.json +++ b/packages/tree_clipper/tests/backwards_compatibility/blender_5_1_to_5_2/5_2_input_string.json @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:1375889da24a17cef5a62a22883d5aa7d0a93615b5ea259e574a632695cff25c -size 9023 +oid sha256:7b7a1cb8166b5f58856de28bfb38197d518cabd0de13da04c1dca32c3bbf600c +size 9022 diff --git a/packages/tree_clipper/tests/backwards_compatibility/blender_5_1_to_5_2/5_2_principled_bsdf.json b/packages/tree_clipper/tests/backwards_compatibility/blender_5_1_to_5_2/5_2_principled_bsdf.json index 9f0f788..98ca8fd 100644 --- a/packages/tree_clipper/tests/backwards_compatibility/blender_5_1_to_5_2/5_2_principled_bsdf.json +++ b/packages/tree_clipper/tests/backwards_compatibility/blender_5_1_to_5_2/5_2_principled_bsdf.json @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:4cfb84eb6a8fd2f0ed0287eae00da3a9cfc8e4e6a48b7a269e81936202a28d07 -size 162135 +oid sha256:6dc6426eed2f4338756adcfd998874ef59beb4b71305199712c83c672be8e6d2 +size 162134 diff --git a/packages/tree_clipper/tests/backwards_compatibility/blender_5_1_to_5_2/5_2_raycast.json b/packages/tree_clipper/tests/backwards_compatibility/blender_5_1_to_5_2/5_2_raycast.json index c2182eb..f21950b 100644 --- a/packages/tree_clipper/tests/backwards_compatibility/blender_5_1_to_5_2/5_2_raycast.json +++ b/packages/tree_clipper/tests/backwards_compatibility/blender_5_1_to_5_2/5_2_raycast.json @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:71e47a75b3a79893f1f7b0f4740508277e16da7994155f1aab402413b8bdd3fe -size 51736 +oid sha256:f34f7af4d08a6ad744589f782ae1fe501f89ed98b439e8b1eed651eff309ad39 +size 51735 diff --git a/packages/tree_clipper/tests/backwards_compatibility/blender_5_1_to_5_2/5_2_string_to_value.json b/packages/tree_clipper/tests/backwards_compatibility/blender_5_1_to_5_2/5_2_string_to_value.json index 234bfe1..719d1a9 100644 --- a/packages/tree_clipper/tests/backwards_compatibility/blender_5_1_to_5_2/5_2_string_to_value.json +++ b/packages/tree_clipper/tests/backwards_compatibility/blender_5_1_to_5_2/5_2_string_to_value.json @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:35f4ea535f3b0b13dbbcdc1ed6cf4ec136dab5d35da7b678fca5c9368f75882c -size 12055 +oid sha256:23083edc671999f211aeb38603decd7834abc715b9c861b63a2d51f6d459f121 +size 12054 diff --git a/packages/tree_clipper/tests/backwards_compatibility/blender_5_1_to_5_2/5_2_subdivision_surface.json b/packages/tree_clipper/tests/backwards_compatibility/blender_5_1_to_5_2/5_2_subdivision_surface.json index a452f6b..8d953c5 100644 --- a/packages/tree_clipper/tests/backwards_compatibility/blender_5_1_to_5_2/5_2_subdivision_surface.json +++ b/packages/tree_clipper/tests/backwards_compatibility/blender_5_1_to_5_2/5_2_subdivision_surface.json @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:b2e96dc34f5e5eaa84aea9b8f6f5bcb140b645d9abf16b105c83175cfe9850fc -size 17450 +oid sha256:ef4a400e2022c24f0158dd6b6bad4a74a44ca8d9be4b9572c2c0a0b493d7c941 +size 17449 diff --git a/packages/tree_clipper/tests/backwards_compatibility/blender_5_1_to_5_2/5_2_value_to_string.json b/packages/tree_clipper/tests/backwards_compatibility/blender_5_1_to_5_2/5_2_value_to_string.json index b04fa6f..07335b4 100644 --- a/packages/tree_clipper/tests/backwards_compatibility/blender_5_1_to_5_2/5_2_value_to_string.json +++ b/packages/tree_clipper/tests/backwards_compatibility/blender_5_1_to_5_2/5_2_value_to_string.json @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:f594ee70864549929e7f6f32c8d63dd1b7a5558f8e878cc76f772e463e05264a -size 13166 +oid sha256:498292419b8b24f807a644830f5fe5a7d35f15c3777b170cb256a2667a07b67d +size 13165 diff --git a/packages/tree_clipper/tests/test_panel_states.py b/packages/tree_clipper/tests/test_panel_states.py index 1dcb015..d589755 100644 --- a/packages/tree_clipper/tests/test_panel_states.py +++ b/packages/tree_clipper/tests/test_panel_states.py @@ -1,4 +1,5 @@ import bpy +from tree_clipper.common import version_at_least from tree_clipper.import_nodes import ImportIntermediate, ImportParameters from tree_clipper.specific_handlers import BUILT_IN_IMPORTER @@ -8,41 +9,42 @@ save_failed, ) +if version_at_least(bpy.app.version, [5, 2, 0]): -def test_panel_states(): - try: - tree = make_test_node_tree() + def test_panel_states(): + try: + tree = make_test_node_tree() - node = tree.nodes.new(type="GeometryNodeMeshBevel") + node = tree.nodes.new(type="GeometryNodeMeshBevel") - node.panel_states[0].is_collapsed = False - open = export_to_string(tree.name) + node.panel_states[0].is_collapsed = False + open = export_to_string(tree.name) - node.panel_states[0].is_collapsed = True - closed = export_to_string(tree.name) + node.panel_states[0].is_collapsed = True + closed = export_to_string(tree.name) - def check_state(export: str, state: bool): - import_intermediate = ImportIntermediate(string=export) - import_report = import_intermediate.import_all( - parameters=ImportParameters( - specific_handlers=BUILT_IN_IMPORTER, - debug_prints=True, + def check_state(export: str, state: bool): + import_intermediate = ImportIntermediate(string=export) + import_report = import_intermediate.import_all( + parameters=ImportParameters( + specific_handlers=BUILT_IN_IMPORTER, + debug_prints=True, + ) ) - ) - assert ( - state - == bpy.data.node_groups[import_report.renames_node_group[tree.name]] - .nodes[0] - .panel_states[0] - .is_collapsed - ) + assert ( + state + == bpy.data.node_groups[import_report.renames_node_group[tree.name]] + .nodes[0] + .panel_states[0] + .is_collapsed + ) - check_state(open, False) - check_state(closed, True) + check_state(open, False) + check_state(closed, True) - except: - # store in case of failure for easy debugging - save_failed(f"{test_panel_states.__name__}") + except: + # store in case of failure for easy debugging + save_failed(f"{test_panel_states.__name__}") - raise + raise diff --git a/packages/tree_clipper_addon/src/tree_clipper_addon/blender_manifest.toml b/packages/tree_clipper_addon/src/tree_clipper_addon/blender_manifest.toml index 92cd128..bc682a4 100644 --- a/packages/tree_clipper_addon/src/tree_clipper_addon/blender_manifest.toml +++ b/packages/tree_clipper_addon/src/tree_clipper_addon/blender_manifest.toml @@ -3,7 +3,7 @@ schema_version = "1.0.0" # Example of manifest file for a Blender extension # Change the values according to your extension id = "tree_clipper" -version = "0.1.10" # should match tree_clipper (core logic) +version = "0.1.11" # should match tree_clipper (core logic) name = "Tree Clipper" tagline = "Export and import Blender node trees as JSON" maintainer = "Algebraic "