|
| 1 | +from __future__ import annotations |
| 2 | + |
1 | 3 | from datetime import date |
2 | 4 | from datetime import datetime |
3 | 5 | from functools import cached_property |
| 6 | +from typing import TYPE_CHECKING |
4 | 7 | from typing import Generator |
5 | 8 | from typing import Iterable |
| 9 | +from typing import overload |
6 | 10 | from uuid import UUID |
7 | 11 |
|
| 12 | +import bim_controller as bc |
8 | 13 | import element_controller as ec |
9 | 14 | import utility_controller as uc |
10 | 15 |
|
11 | 16 | from compas_cadwork.elements.element import Element |
| 17 | +from compas_cadwork.utils.ifc_uuid import IfcUUID |
12 | 18 | from compas_cadwork.utils.storage import IterableKeyValueStorage |
13 | 19 | from compas_cadwork.utils.storage import KeyValueStorage |
14 | 20 |
|
15 | 21 |
|
| 22 | +if TYPE_CHECKING: |
| 23 | + from cadwork import ElementId |
| 24 | + |
| 25 | + |
16 | 26 | def _is_empty_value(raw_value: str) -> bool: |
17 | 27 | """Is empty value. |
18 | 28 |
|
@@ -191,6 +201,93 @@ def data(self) -> _ProjectData: |
191 | 201 | """Project data.""" |
192 | 202 | return _ProjectData() |
193 | 203 |
|
| 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 | + |
194 | 291 | def elements(self) -> Generator[Element, None, None]: |
195 | 292 | """Get all elements in the project. |
196 | 293 |
|
|
0 commit comments