Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion packages/tree_clipper/pyproject.toml
Original file line number Diff line number Diff line change
@@ -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" },
Expand Down
16 changes: 15 additions & 1 deletion packages/tree_clipper/src/tree_clipper/common.py
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down Expand Up @@ -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]
Expand Down
14 changes: 10 additions & 4 deletions packages/tree_clipper/src/tree_clipper/import_nodes.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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:
Expand Down
13 changes: 9 additions & 4 deletions packages/tree_clipper/src/tree_clipper/specific_handlers.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@

import bpy

from tree_clipper.common import version_at_least

from .common import (
BL_IDNAME,
DATA,
Expand Down Expand Up @@ -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]
Expand Down
Git LFS file not shown
Git LFS file not shown
Git LFS file not shown
Git LFS file not shown
Git LFS file not shown
Git LFS file not shown
Git LFS file not shown
Git LFS file not shown
Git LFS file not shown
58 changes: 30 additions & 28 deletions packages/tree_clipper/tests/test_panel_states.py
Original file line number Diff line number Diff line change
@@ -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

Expand All @@ -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
Original file line number Diff line number Diff line change
Expand Up @@ -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 <tree.clipper@algebraic.games>"
Expand Down
Loading