Skip to content

Commit 6316a12

Browse files
committed
Replace Element.from_guid() with Project#element() method
1 parent c38d1c3 commit 6316a12

4 files changed

Lines changed: 155 additions & 45 deletions

File tree

src/compas_cadwork/elements/element.py

Lines changed: 0 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
from typing import ClassVar
66
from typing import Final
77
from typing import Self
8-
from typing import final
98
from uuid import UUID
109

1110
import attribute_controller as ac
@@ -119,32 +118,6 @@ class Element:
119118
attribute_names: ClassVar[_ElementAttributeNames] = _ElementAttributeNames()
120119
"""User attribute names."""
121120

122-
@final
123-
@classmethod
124-
def from_guid(cls, guid: UUID) -> Element:
125-
"""Get element from Cadwork GUID.
126-
127-
Parameters
128-
----------
129-
guid : UUID
130-
Cadwork element GUID.
131-
132-
Returns
133-
-------
134-
Element
135-
Cadwork element.
136-
137-
Raises
138-
------
139-
ValueError
140-
If the element does not exist.
141-
"""
142-
raw_guid = "{" + str(guid).upper() + "}"
143-
cadwork_id = ec.get_element_from_cadwork_guid(raw_guid)
144-
if ec.get_element_cadwork_guid(cadwork_id) != raw_guid:
145-
raise ValueError(f"Could not find a Cadwork element with GUID {raw_guid}")
146-
return cls(cadwork_id)
147-
148121
def __init__(self, cadwork_id: ElementId) -> None:
149122
"""Create new instance wrapping an existing Cadwork element.
150123

src/compas_cadwork/project.py

Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,28 @@
1+
from __future__ import annotations
2+
13
from datetime import date
24
from datetime import datetime
35
from functools import cached_property
6+
from typing import TYPE_CHECKING
47
from typing import Generator
58
from typing import Iterable
9+
from typing import overload
610
from uuid import UUID
711

12+
import bim_controller as bc
813
import element_controller as ec
914
import utility_controller as uc
1015

1116
from compas_cadwork.elements.element import Element
17+
from compas_cadwork.utils.ifc_uuid import IfcUUID
1218
from compas_cadwork.utils.storage import IterableKeyValueStorage
1319
from compas_cadwork.utils.storage import KeyValueStorage
1420

1521

22+
if TYPE_CHECKING:
23+
from cadwork import ElementId
24+
25+
1626
def _is_empty_value(raw_value: str) -> bool:
1727
"""Is empty value.
1828
@@ -191,6 +201,93 @@ def data(self) -> _ProjectData:
191201
"""Project data."""
192202
return _ProjectData()
193203

204+
@overload
205+
def element(self, *, cadwork_id: ElementId) -> Element:
206+
"""Get element from Cadwork ID.
207+
208+
Parameters
209+
----------
210+
cadwork_id : ElementId
211+
Cadwork element ID.
212+
213+
Returns
214+
-------
215+
Element
216+
Cadwork element.
217+
218+
Raises
219+
------
220+
ValueError
221+
If the element does not exist.
222+
"""
223+
224+
@overload
225+
def element(self, *, guid: UUID) -> Element:
226+
"""Get element from Cadwork GUID.
227+
228+
Parameters
229+
----------
230+
guid : UUID
231+
Cadwork element GUID.
232+
233+
Returns
234+
-------
235+
Element
236+
Cadwork element.
237+
238+
Raises
239+
------
240+
ValueError
241+
If the element does not exist.
242+
"""
243+
244+
@overload
245+
def element(self, *, ifc_guid: IfcUUID) -> Element:
246+
"""Get element from IFC GUID.
247+
248+
Parameters
249+
----------
250+
ifc_guid : IfcUUID
251+
Element IFC GUID.
252+
253+
Returns
254+
-------
255+
Element
256+
Cadwork element.
257+
258+
Raises
259+
------
260+
ValueError
261+
If the element does not exist.
262+
"""
263+
264+
def element(
265+
self,
266+
*,
267+
cadwork_id: ElementId | None = None,
268+
guid: UUID | None = None,
269+
ifc_guid: IfcUUID | None = None,
270+
) -> Element:
271+
# GUID to Cadwork ID
272+
if guid is not None:
273+
raw_guid = "{" + str(guid).upper() + "}"
274+
cadwork_id = ec.get_element_from_cadwork_guid(raw_guid)
275+
if ec.get_element_cadwork_guid(cadwork_id) != raw_guid:
276+
raise ValueError(f"Could not find a Cadwork element with GUID {raw_guid!r}")
277+
278+
# IFC GUID to Cadwork ID
279+
if ifc_guid is not None:
280+
raw_guid = ifc_guid.base64
281+
cadwork_id = bc.get_element_id_from_base64_ifc_guid(raw_guid)
282+
if cadwork_id == 0:
283+
raise ValueError(f"Could not find a Cadwork element with IFC GUID {raw_guid!r}")
284+
285+
# Cadwork ID to element
286+
assert cadwork_id is not None
287+
if not ec.check_element_id(cadwork_id):
288+
raise ValueError(f"Could not find a Cadwork element with ID #{cadwork_id}")
289+
return Element(cadwork_id)
290+
194291
def elements(self) -> Generator[Element, None, None]:
195292
"""Get all elements in the project.
196293

tests/compas_cadwork/elements/test_element.py

Lines changed: 0 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -10,22 +10,6 @@
1010
from compas_cadwork.utils.ifc_uuid import IfcUUID
1111

1212

13-
def test_creates_from_guid(cadwork) -> None:
14-
cadwork.ec.get_element_from_cadwork_guid.return_value = 12345
15-
cadwork.ec.get_element_cadwork_guid.return_value = "{2B21165D-9454-46A0-A992-6B4AA043D58D}"
16-
element = Element.from_guid(UUID("2b21165d-9454-46a0-a992-6b4aa043d58d"))
17-
cadwork.ec.get_element_from_cadwork_guid.assert_called_once_with("{2B21165D-9454-46A0-A992-6B4AA043D58D}")
18-
cadwork.ec.get_element_cadwork_guid.assert_called_once_with(12345)
19-
assert element.guid == UUID("2b21165d-9454-46a0-a992-6b4aa043d58d")
20-
assert element.id == 12345
21-
22-
23-
def test_raises_on_unknown_guid(cadwork) -> None:
24-
cadwork.ec.get_element_from_cadwork_guid.return_value = ""
25-
with pytest.raises(ValueError, match=r"Could not find a Cadwork element with GUID .+"):
26-
Element.from_guid(UUID("deadbeef-0000-0000-0000-000000000000"))
27-
28-
2913
def test_raises_on_deleted_element(cadwork) -> None:
3014
element = Element(123)
3115

tests/compas_cadwork/test_project.py

Lines changed: 58 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import pytest
55

66
from compas_cadwork.project import Project
7+
from compas_cadwork.utils.ifc_uuid import IfcUUID
78

89

910
def test_gets_guid(cadwork) -> None:
@@ -194,7 +195,62 @@ def test_sets_designer(cadwork) -> None:
194195
cadwork.uc.set_project_designer.assert_called_with("Test Value")
195196

196197

197-
def test_get_elements(cadwork) -> None:
198+
def test_gets_element_by_cadwork_id(cadwork) -> None:
199+
project = Project()
200+
201+
# Without value
202+
cadwork.ec.check_element_id.return_value = False
203+
with pytest.raises(ValueError, match=r"Could not find a Cadwork element with ID #1000"):
204+
_ = project.element(cadwork_id=1000)
205+
cadwork.ec.check_element_id.assert_called_once_with(1000)
206+
207+
# With value
208+
cadwork.ec.check_element_id.return_value = True
209+
element = project.element(cadwork_id=12345)
210+
cadwork.ec.check_element_id.assert_called_with(12345)
211+
assert element.id == 12345
212+
213+
214+
def test_gets_element_by_guid(cadwork) -> None:
215+
project = Project()
216+
217+
# Without value
218+
cadwork.ec.get_element_from_cadwork_guid.return_value = 0
219+
with pytest.raises(
220+
ValueError,
221+
match=r"Could not find a Cadwork element with GUID '{DEADBEEF-0000-0000-0000-000000000000}'",
222+
):
223+
_ = project.element(guid=UUID("deadbeef-0000-0000-0000-000000000000"))
224+
225+
# With value
226+
cadwork.ec.get_element_from_cadwork_guid.return_value = 12345
227+
cadwork.ec.get_element_cadwork_guid.return_value = "{2B21165D-9454-46A0-A992-6B4AA043D58D}"
228+
element = project.element(guid=UUID("2b21165d-9454-46a0-a992-6b4aa043d58d"))
229+
cadwork.ec.get_element_from_cadwork_guid.assert_called_with("{2B21165D-9454-46A0-A992-6B4AA043D58D}")
230+
cadwork.ec.get_element_cadwork_guid.assert_called_with(12345)
231+
assert element.id == 12345
232+
assert element.guid == UUID("2b21165d-9454-46a0-a992-6b4aa043d58d")
233+
234+
235+
def test_gets_element_by_ifc_guid(cadwork) -> None:
236+
project = Project()
237+
238+
# Without value
239+
cadwork.bc.get_element_id_from_base64_ifc_guid.return_value = 0
240+
with pytest.raises(ValueError, match=r"Could not find a Cadwork element with IFC GUID '3UhRxl0000000000000000'"):
241+
_ = project.element(ifc_guid=IfcUUID("deadbeef-0000-0000-0000-000000000000"))
242+
243+
# With value
244+
cadwork.bc.get_element_id_from_base64_ifc_guid.return_value = 54321
245+
element = project.element(ifc_guid=IfcUUID("921ab9eb-3b21-46c8-baa4-dfffc33b59be"))
246+
cadwork.bc.get_element_id_from_base64_ifc_guid.assert_called_with("2I6hdhEo56oBgat$$3Erc_")
247+
assert element.id == 54321
248+
cadwork.bc.get_ifc_guid.return_value = "{921AB9EB-3B21-46C8-BAA4-DFFFC33B59BE}"
249+
assert element.ifc_guid == IfcUUID("921ab9eb-3b21-46c8-baa4-dfffc33b59be")
250+
cadwork.bc.get_ifc_guid.assert_called_with(54321)
251+
252+
253+
def test_gets_elements(cadwork) -> None:
198254
project = Project()
199255

200256
# Without elements
@@ -206,7 +262,7 @@ def test_get_elements(cadwork) -> None:
206262
assert [x.id for x in project.elements()] == [505, 404, 303, 202, 101]
207263

208264

209-
def test_get_selected_elements(cadwork) -> None:
265+
def test_gets_selected_elements(cadwork) -> None:
210266
project = Project()
211267

212268
# Without elements

0 commit comments

Comments
 (0)