From 70bf2125082d954c3327e4f89fbb90171669b437 Mon Sep 17 00:00:00 2001 From: MatthisCl <76970409+MatthisCl@users.noreply.github.com> Date: Fri, 11 Oct 2024 18:09:49 +0200 Subject: [PATCH 01/11] add test and change hash function --- webknossos/tests/test_skeleton.py | 12 ++++++++++++ webknossos/webknossos/skeleton/group.py | 2 +- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/webknossos/tests/test_skeleton.py b/webknossos/tests/test_skeleton.py index 2e5d13d14..261bec90d 100644 --- a/webknossos/tests/test_skeleton.py +++ b/webknossos/tests/test_skeleton.py @@ -438,3 +438,15 @@ def test_add_tree_with_obj_and_properties(tmp_path: Path) -> None: assert new_tree.color == (1, 2, 3, 1) skeleton_b.save(output_path) + + +def test_add_tree_with_group() -> None: + annotation = wk.Annotation( + name="my_annotation", dataset_name="my_dataset", voxel_size=(11, 11, 24) + ) + group = annotation.skeleton.add_group("a group") + tree = group.add_tree("a tree") + + skeleton_a = create_dummy_skeleton() + + skeleton_a.add_tree(tree) diff --git a/webknossos/webknossos/skeleton/group.py b/webknossos/webknossos/skeleton/group.py index 13b8a1e84..fe5ab5cd6 100644 --- a/webknossos/webknossos/skeleton/group.py +++ b/webknossos/webknossos/skeleton/group.py @@ -243,7 +243,7 @@ def as_nml_group(self) -> wknml.Group: ) def __hash__(self) -> int: - return self._id + return id(self) Group._set_init_docstring() From 473de49cdf9db44d3d78aa52a80c46e888c654f8 Mon Sep 17 00:00:00 2001 From: MatthisCl <76970409+MatthisCl@users.noreply.github.com> Date: Sun, 13 Oct 2024 13:36:31 +0200 Subject: [PATCH 02/11] change hash function --- webknossos/webknossos/skeleton/group.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/webknossos/webknossos/skeleton/group.py b/webknossos/webknossos/skeleton/group.py index fe5ab5cd6..36aaf27cc 100644 --- a/webknossos/webknossos/skeleton/group.py +++ b/webknossos/webknossos/skeleton/group.py @@ -243,7 +243,10 @@ def as_nml_group(self) -> wknml.Group: ) def __hash__(self) -> int: - return id(self) + if hasattr(self, "_id"): + return self._id + else: + return id(self) Group._set_init_docstring() From cd7270df5f484d5d5cd0580f5bf2f967a2977417 Mon Sep 17 00:00:00 2001 From: markbader Date: Tue, 22 Oct 2024 14:14:51 +0200 Subject: [PATCH 03/11] fix typo. --- webknossos/webknossos/skeleton/group.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webknossos/webknossos/skeleton/group.py b/webknossos/webknossos/skeleton/group.py index 36aaf27cc..24e1fdf53 100644 --- a/webknossos/webknossos/skeleton/group.py +++ b/webknossos/webknossos/skeleton/group.py @@ -135,7 +135,7 @@ def children(self) -> Iterator[GroupOrTree]: @property def trees(self) -> Iterator[Tree]: """Returns all (immediate) tree children as an iterator. - Use flattened_trees if you need also need trees within subgroups.""" + Use flattened_trees if you also need trees within subgroups.""" return (child for child in self._child_trees) @property From 60716a8783be34aa170dd736f29f46b80f358dfc Mon Sep 17 00:00:00 2001 From: markbader Date: Tue, 22 Oct 2024 14:37:28 +0200 Subject: [PATCH 04/11] Use always id for hash value of Group. --- webknossos/webknossos/skeleton/group.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/webknossos/webknossos/skeleton/group.py b/webknossos/webknossos/skeleton/group.py index 24e1fdf53..78ed8e8e2 100644 --- a/webknossos/webknossos/skeleton/group.py +++ b/webknossos/webknossos/skeleton/group.py @@ -243,10 +243,7 @@ def as_nml_group(self) -> wknml.Group: ) def __hash__(self) -> int: - if hasattr(self, "_id"): - return self._id - else: - return id(self) + return id(self) Group._set_init_docstring() From 37cee560b3c6c467e672c934f5dd5535143ee721 Mon Sep 17 00:00:00 2001 From: markbader Date: Mon, 28 Oct 2024 11:22:33 +0100 Subject: [PATCH 05/11] Adapt __eq__ method for group and skeleton. --- webknossos/webknossos/skeleton/group.py | 5 ++++- webknossos/webknossos/skeleton/skeleton.py | 5 ++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/webknossos/webknossos/skeleton/group.py b/webknossos/webknossos/skeleton/group.py index 78ed8e8e2..c185d7904 100644 --- a/webknossos/webknossos/skeleton/group.py +++ b/webknossos/webknossos/skeleton/group.py @@ -1,5 +1,5 @@ import copy -from typing import TYPE_CHECKING, Iterator, Optional, Set, Tuple, Union, cast +from typing import TYPE_CHECKING, Any, Iterator, Optional, Set, Tuple, Union, cast import attr from boltons.strutils import unit_len @@ -242,6 +242,9 @@ def as_nml_group(self) -> wknml.Group: children=[g.as_nml_group() for g in self._child_groups], ) + def __eq__(self, other: Any) -> bool: + return isinstance(other, type(self)) and self._id == other._id + def __hash__(self) -> int: return id(self) diff --git a/webknossos/webknossos/skeleton/skeleton.py b/webknossos/webknossos/skeleton/skeleton.py index 445df416f..a89c2a96c 100644 --- a/webknossos/webknossos/skeleton/skeleton.py +++ b/webknossos/webknossos/skeleton/skeleton.py @@ -1,7 +1,7 @@ import itertools from os import PathLike from pathlib import Path -from typing import Dict, Iterator, List, Optional, Tuple, Union +from typing import Any, Dict, Iterator, List, Optional, Tuple, Union import attr import networkx as nx @@ -155,6 +155,9 @@ def write(self, out_path: PathLike) -> None: warn_deprecated("Skeleton.write", "skeleton.save") self.save(out_path) + def __eq__(self, other: Any) -> bool: + return isinstance(other, type(self)) and self._id == other._id + def __hash__(self) -> int: return id(self) From d4393a6fdead6e69fd5a219c58ed74dcf16f7b3f Mon Sep 17 00:00:00 2001 From: markbader Date: Mon, 28 Oct 2024 11:26:44 +0100 Subject: [PATCH 06/11] Update changelog. --- webknossos/Changelog.md | 1 + 1 file changed, 1 insertion(+) diff --git a/webknossos/Changelog.md b/webknossos/Changelog.md index 8ec99d53d..2e5e36ef9 100644 --- a/webknossos/Changelog.md +++ b/webknossos/Changelog.md @@ -19,6 +19,7 @@ For upgrade instructions, please check the respective _Breaking Changes_ section ### Changed ### Fixed +- Fixed an issue where adding existing trees to an annotation fails. [#1201](https://github.com/scalableminds/webknossos-libs/pull/1201) ## [0.15.7](https://github.com/scalableminds/webknossos-libs/releases/tag/v0.15.7) - 2024-10-25 From 95d2e17bb306676404a44cac6d578cd53818ce7a Mon Sep 17 00:00:00 2001 From: markbader Date: Thu, 5 Dec 2024 12:19:31 +0100 Subject: [PATCH 07/11] Adapt equality check. --- webknossos/webknossos/skeleton/group.py | 2 +- webknossos/webknossos/skeleton/skeleton.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/webknossos/webknossos/skeleton/group.py b/webknossos/webknossos/skeleton/group.py index 5b3cdd142..f6d861d55 100644 --- a/webknossos/webknossos/skeleton/group.py +++ b/webknossos/webknossos/skeleton/group.py @@ -431,7 +431,7 @@ def as_nml_group(self) -> wknml.Group: ) def __eq__(self, other: Any) -> bool: - return isinstance(other, type(self)) and self._id == other._id + return type(other) is type(self) and self._id == other._id def __hash__(self) -> int: return id(self) diff --git a/webknossos/webknossos/skeleton/skeleton.py b/webknossos/webknossos/skeleton/skeleton.py index b558bb4ee..355e84736 100644 --- a/webknossos/webknossos/skeleton/skeleton.py +++ b/webknossos/webknossos/skeleton/skeleton.py @@ -283,7 +283,7 @@ def write(self, out_path: PathLike) -> None: self.save(out_path) def __eq__(self, other: Any) -> bool: - return isinstance(other, type(self)) and self._id == other._id + return type(other) is type(self) and self._id == other._id def __hash__(self) -> int: return id(self) From 8bc1896eec8f1b27f0865c685beb934a9f821706 Mon Sep 17 00:00:00 2001 From: markbader Date: Mon, 9 Dec 2024 10:13:53 +0100 Subject: [PATCH 08/11] Remove __eq__ and __hash__ method in Skeleton class. --- webknossos/webknossos/skeleton/skeleton.py | 6 ------ 1 file changed, 6 deletions(-) diff --git a/webknossos/webknossos/skeleton/skeleton.py b/webknossos/webknossos/skeleton/skeleton.py index 355e84736..188830a4b 100644 --- a/webknossos/webknossos/skeleton/skeleton.py +++ b/webknossos/webknossos/skeleton/skeleton.py @@ -281,9 +281,3 @@ def write(self, out_path: PathLike) -> None: """Deprecated. Use Skeleton.save instead.""" warn_deprecated("Skeleton.write", "skeleton.save") self.save(out_path) - - def __eq__(self, other: Any) -> bool: - return type(other) is type(self) and self._id == other._id - - def __hash__(self) -> int: - return id(self) From 0ecee858c05d65e6495c3d74abcde30da49d793b Mon Sep 17 00:00:00 2001 From: markbader Date: Mon, 9 Dec 2024 10:14:58 +0100 Subject: [PATCH 09/11] Remove unused import. --- webknossos/webknossos/skeleton/skeleton.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webknossos/webknossos/skeleton/skeleton.py b/webknossos/webknossos/skeleton/skeleton.py index 188830a4b..d53ba9e40 100644 --- a/webknossos/webknossos/skeleton/skeleton.py +++ b/webknossos/webknossos/skeleton/skeleton.py @@ -1,7 +1,7 @@ import itertools from os import PathLike from pathlib import Path -from typing import Any, Dict, Iterator, List, Optional, Tuple, Union +from typing import Dict, Iterator, List, Optional, Tuple, Union import attr import networkx as nx From 7cf13aee9a3c96bdac6b3b71f4f3478288060d00 Mon Sep 17 00:00:00 2001 From: markbader Date: Mon, 9 Dec 2024 11:03:32 +0100 Subject: [PATCH 10/11] Add eq=False to attr.define to avoid default equal method. --- webknossos/webknossos/skeleton/skeleton.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/webknossos/webknossos/skeleton/skeleton.py b/webknossos/webknossos/skeleton/skeleton.py index d53ba9e40..14944ff19 100644 --- a/webknossos/webknossos/skeleton/skeleton.py +++ b/webknossos/webknossos/skeleton/skeleton.py @@ -1,7 +1,7 @@ import itertools from os import PathLike from pathlib import Path -from typing import Dict, Iterator, List, Optional, Tuple, Union +from typing import Any, Dict, Iterator, List, Optional, Tuple, Union import attr import networkx as nx @@ -12,7 +12,7 @@ Vector3 = Tuple[float, float, float] -@attr.define +@attr.define(eq=False) class Skeleton(Group): """A hierarchical representation of skeleton annotations in WEBKNOSSOS. From 4b935d83e10e6e7207c0eb6226991cd1b87f2566 Mon Sep 17 00:00:00 2001 From: markbader Date: Mon, 9 Dec 2024 11:09:11 +0100 Subject: [PATCH 11/11] Run linter. --- webknossos/webknossos/skeleton/skeleton.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webknossos/webknossos/skeleton/skeleton.py b/webknossos/webknossos/skeleton/skeleton.py index 14944ff19..faf0c3cde 100644 --- a/webknossos/webknossos/skeleton/skeleton.py +++ b/webknossos/webknossos/skeleton/skeleton.py @@ -1,7 +1,7 @@ import itertools from os import PathLike from pathlib import Path -from typing import Any, Dict, Iterator, List, Optional, Tuple, Union +from typing import Dict, Iterator, List, Optional, Tuple, Union import attr import networkx as nx