Skip to content

Commit 63b6292

Browse files
authored
Merge pull request #475 from gramaziokohler/graph_node
graph node missing workaround
2 parents b8237eb + 80fceb7 commit 63b6292

3 files changed

Lines changed: 35 additions & 1 deletion

File tree

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
5757
* Fixed bug in show_ref_faces GH component.
5858
* `BTLxProcessing.ref_side_index` defaults to `0` if not set, instead of the invalid `None`.
5959
* Fixed several GH Components for Rhino8 compatibility.
60+
* Fixed `graph_node` is `None` after deserializing a `TimberModel`.
6061

6162
### Removed
6263

src/compas_timber/model/model.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,13 @@ class TimberModel(Model):
4949
@classmethod
5050
def __from_data__(cls, data):
5151
model = super(TimberModel, cls).__from_data__(data)
52+
53+
# TODO: this is a workaround to ensure that the graph nodes are not lost during deserialization
54+
# TODO: this was fixed in later compas_model release, remove after migrating
55+
for graphnode in model._graph.nodes():
56+
element = model._graph.node_element(graphnode) # type: ignore
57+
element.graph_node = graphnode # type: ignore
58+
5259
for interaction in model.interactions():
5360
interaction.restore_beams_from_keys(model) # type: ignore
5461
return model

tests/compas_timber/test_model.py

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
from copy import deepcopy
12
from compas.data import json_dumps
23
from compas.data import json_loads
34
from compas.geometry import Frame
@@ -255,7 +256,6 @@ def test_error_deepcopy_fastener():
255256

256257

257258
def test_error_deepcopy_joint():
258-
from copy import deepcopy
259259
from compas_timber.errors import BeamJoiningError
260260

261261
error = BeamJoiningError("mama", "papa", "dog", "cucumber")
@@ -266,3 +266,29 @@ def test_error_deepcopy_joint():
266266
assert error.joint == "papa"
267267
assert error.debug_info == "dog"
268268
assert error.debug_geometries == "cucumber"
269+
270+
271+
def test_beam_graph_node_available_after_serialization():
272+
model = TimberModel()
273+
frame = Frame(Point(0, 0, 0), Vector(1, 0, 0), Vector(0, 1, 0))
274+
beam = Beam(frame, length=1.0, width=0.1, height=0.1)
275+
model.add_element(beam)
276+
277+
graph_node = beam.graph_node
278+
deserialized_model = json_loads(json_dumps(model))
279+
280+
assert graph_node is not None
281+
assert list(deserialized_model.beams)[0].graph_node == graph_node
282+
283+
284+
def test_beam_graph_node_available_after_deepcopying():
285+
model = TimberModel()
286+
frame = Frame(Point(0, 0, 0), Vector(1, 0, 0), Vector(0, 1, 0))
287+
beam = Beam(frame, length=1.0, width=0.1, height=0.1)
288+
model.add_element(beam)
289+
290+
grap_node = beam.graph_node
291+
deserialized_model = deepcopy(model)
292+
293+
assert grap_node is not None
294+
assert list(deserialized_model.beams)[0].graph_node == grap_node

0 commit comments

Comments
 (0)