Skip to content

Commit fa49860

Browse files
authored
Merge pull request #1400 from compas-dev/fix-attributeview-serialisation
Fix bug in serialisation of AttributeView
2 parents 3d91705 + 86d5c96 commit fa49860

File tree

3 files changed

+34
-7
lines changed

3 files changed

+34
-7
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
1717
* Fixed bug in `Box.scaled` causing a `TypeError` due to incorrect parameter forwarding.
1818
* Changed argument names of `Box.scale()` to `x`, `y`, `z`, instead of `factor` and made `y` and `z` optional to keep positional arguments backwards compatible.
1919
* Fixed import errors in `compas_rhino.conduits` for Rhino 8.
20+
* Fixed bug in serialization when `compas.datastructures.attributes.AttributeView` is used.
2021

2122
### Removed
2223

src/compas/data/encoders.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,7 @@ def default(self, o):
115115
The serialized object.
116116
117117
"""
118+
from compas.datastructures.attributes import AttributeView
118119

119120
if hasattr(o, "__jsondump__"):
120121
return o.__jsondump__(minimal=DataEncoder.minimal)
@@ -153,6 +154,9 @@ def default(self, o):
153154
if isinstance(o, (System.Decimal, System.Double, System.Single)):
154155
return float(o)
155156

157+
if isinstance(o, AttributeView):
158+
return dict(o)
159+
156160
return super(DataEncoder, self).default(o)
157161

158162

tests/compas/data/test_json.py

Lines changed: 29 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -20,23 +20,23 @@ def test_json_native():
2020

2121
def test_json_primitive():
2222
before = Point(0, 0, 0)
23-
after = compas.json_loads(compas.json_dumps(before))
23+
after = compas.json_loads(compas.json_dumps(before)) # type: Point
2424
assert before.__dtype__ == after.__dtype__
2525
assert all(a == b for a, b in zip(before, after))
2626
assert before.guid == after.guid
2727

2828

2929
def test_json_shape():
3030
before = Box(frame=Frame(Point(0, 0, 0), Vector(1, 0, 0), Vector(0, 1, 0)), xsize=1, ysize=1, zsize=1)
31-
after = compas.json_loads(compas.json_dumps(before))
31+
after = compas.json_loads(compas.json_dumps(before)) # type: Box
3232
assert before.__dtype__ == after.__dtype__
3333
assert all(a == b for a, b in zip(before.to_vertices_and_faces()[0], after.to_vertices_and_faces()[0]))
3434
assert before.guid == after.guid
3535

3636

3737
def test_json_xform():
3838
before = Transformation.from_frame_to_frame(Frame.worldXY(), Frame.worldXY())
39-
after = compas.json_loads(compas.json_dumps(before))
39+
after = compas.json_loads(compas.json_dumps(before)) # type: Transformation
4040
assert before.__dtype__ == after.__dtype__
4141
assert all(a == b for a, b in zip(before, after))
4242
assert before.guid == after.guid
@@ -47,7 +47,7 @@ def test_json_graph():
4747
a = before.add_node()
4848
b = before.add_node()
4949
before.add_edge(a, b)
50-
after = compas.json_loads(compas.json_dumps(before))
50+
after = compas.json_loads(compas.json_dumps(before)) # type: Graph
5151
assert before.__dtype__ == after.__dtype__
5252
# assert before.attributes == after.attributes
5353
assert all(before.has_node(node) for node in after.nodes())
@@ -59,7 +59,7 @@ def test_json_graph():
5959

6060
def test_json_mesh():
6161
before = Mesh.from_vertices_and_faces([[0, 0, 0], [1, 0, 0], [1, 1, 0], [0, 1, 0]], [[0, 1, 2, 3]])
62-
after = compas.json_loads(compas.json_dumps(before))
62+
after = compas.json_loads(compas.json_dumps(before)) # type: Mesh
6363
assert before.__dtype__ == after.__dtype__
6464
# assert before.attributes == after.attributes
6565
assert all(before.has_vertex(vertex) for vertex in after.vertices())
@@ -95,7 +95,7 @@ def test_json_volmesh():
9595
]
9696
],
9797
)
98-
after = compas.json_loads(compas.json_dumps(before))
98+
after = compas.json_loads(compas.json_dumps(before)) # type: VolMesh
9999
assert before.__dtype__ == after.__dtype__
100100
# assert before.attributes == after.attributes
101101
assert all(before.has_vertex(vertex) for vertex in after.vertices())
@@ -121,12 +121,34 @@ def test_json_zip():
121121

122122
before = Box(frame=Frame(Point(0, 0, 0), Vector(1, 0, 0), Vector(0, 1, 0)), xsize=2, ysize=5, zsize=3)
123123
compas.json_dumpz(before, zipfile_name)
124-
after = compas.json_loadz(zipfile_name)
124+
after = compas.json_loadz(zipfile_name) # type: Box
125125
assert before.__dtype__ == after.__dtype__
126126
assert all(a == b for a, b in zip(before.to_vertices_and_faces()[0], after.to_vertices_and_faces()[0]))
127127
assert before.guid == after.guid
128128

129129

130+
def test_json_attributeview():
131+
mesh = Mesh.from_meshgrid(10, 10)
132+
before = Mesh()
133+
for vertex in mesh.vertices():
134+
attr = mesh.vertex_attributes(vertex)
135+
before.add_vertex(key=vertex, attr_dict=attr)
136+
for face in mesh.faces():
137+
attr = mesh.face_attributes(face)
138+
before.add_face(vertices=mesh.face_vertices(face), fkey=face, attr_dict=attr)
139+
after = compas.json_loads(compas.json_dumps(before)) # type: Mesh
140+
141+
assert before.__dtype__ == after.__dtype__
142+
assert all(before.has_vertex(vertex) for vertex in after.vertices())
143+
assert all(after.has_vertex(vertex) for vertex in before.vertices())
144+
assert all(before.has_face(face) for face in after.faces())
145+
assert all(after.has_face(face) for face in before.faces())
146+
assert all(before.has_edge(edge) for edge in after.edges())
147+
assert all(after.has_edge(edge) for edge in before.edges())
148+
assert all(before.face_vertices(a) == after.face_vertices(b) for a, b in zip(before.faces(), after.faces()))
149+
assert before.guid == after.guid
150+
151+
130152
# temporarily commented because folder does not exist yet on main
131153
# def test_json_url():
132154
# data = compas.json_load('https://raw.githubusercontent.com/compas-dev/compas/main/src/compas/data/schemas/graph.json')

0 commit comments

Comments
 (0)