mirror of
https://github.com/IfcOpenShell/IfcOpenShell.git
synced 2026-10-02 13:04:49 +00:00
set set/get_description, add view_definitions & tests
This commit is contained in:
committed by
Thomas Krijnen
parent
cbe8fc1ebd
commit
d401e4c948
@@ -471,10 +471,8 @@ class file:
|
|||||||
def mvd(self):
|
def mvd(self):
|
||||||
if not LARK_AVAILABLE:
|
if not LARK_AVAILABLE:
|
||||||
return None
|
return None
|
||||||
file_description = self.wrapped_data.header.file_description
|
|
||||||
return MvdInfo(
|
return MvdInfo(
|
||||||
get_description=lambda: file_description.description,
|
self.header
|
||||||
set_description=lambda d: setattr(file_description, "description", tuple(d))
|
|
||||||
)
|
)
|
||||||
|
|
||||||
def __getattr__(self, attr) -> Union[Any, Callable[..., ifcopenshell.entity_instance]]:
|
def __getattr__(self, attr) -> Union[Any, Callable[..., ifcopenshell.entity_instance]]:
|
||||||
|
|||||||
@@ -131,34 +131,46 @@ else:
|
|||||||
|
|
||||||
|
|
||||||
class MvdInfo:
|
class MvdInfo:
|
||||||
def __init__(self, get_description: Callable[[], list[str]], set_description: Callable[[list[str]], None]):
|
def __init__(self, header):
|
||||||
self._get_description = get_description
|
self._header = header
|
||||||
self._set_description = set_description
|
|
||||||
self._parsed = None
|
self._parsed = None
|
||||||
|
|
||||||
def _ensure_parsed(self):
|
def _ensure_parsed(self):
|
||||||
if not LARK_AVAILABLE:
|
if not LARK_AVAILABLE:
|
||||||
return
|
return
|
||||||
if self._parsed is None:
|
if self._parsed is None:
|
||||||
self._parsed = parse_mvd(self.description)
|
self._parsed = parse_mvd(self._header.file_description.description)
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def description(self) -> list[str]:
|
def description(self) -> list[str]:
|
||||||
return self._get_description()
|
return self._header.file_description.description
|
||||||
|
|
||||||
@description.setter
|
@description.setter
|
||||||
def description(self, new_description: list[str]):
|
def description(self, new_description: list[str]):
|
||||||
self._set_description(new_description)
|
self._header.file_description.description = tuple(new_description)
|
||||||
self._parsed = None
|
self._parsed = None
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def view_definitions(self):
|
def view_definitions(self):
|
||||||
self._ensure_parsed()
|
self._ensure_parsed()
|
||||||
return ', '.join(' '.join(item.split()) for item in self._parsed.view_definitions) if self._parsed else None
|
if not self._parsed or self._parsed.view_definitions is None:
|
||||||
|
return None #
|
||||||
|
|
||||||
|
vd = self._parsed.view_definitions
|
||||||
|
vd_list = vd if isinstance(vd, list) else [vd] if vd else []
|
||||||
|
return AutoCommitList(
|
||||||
|
vd_list,
|
||||||
|
callback=lambda val: (self._update_keyword("ViewDefinition", val), setattr(self, "_parsed", None)),
|
||||||
|
formatter=lambda lst: ",".join(str(i) for i in lst)
|
||||||
|
)
|
||||||
|
|
||||||
@view_definitions.setter
|
@view_definitions.setter
|
||||||
def view_definitions(self, new_value: str):
|
def view_definitions(self, new_value: str | list[str]):
|
||||||
self._update_keyword("ViewDefinition", new_value)
|
if isinstance(new_value, list):
|
||||||
|
value = ", ".join(new_value)
|
||||||
|
else:
|
||||||
|
value = str(new_value)
|
||||||
|
self._update_keyword("ViewDefinition", value)
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def comments(self):
|
def comments(self):
|
||||||
|
|||||||
@@ -16,12 +16,18 @@ def load_fixture():
|
|||||||
class TestViewDefinition:
|
class TestViewDefinition:
|
||||||
def test_single_view(self, load_fixture):
|
def test_single_view(self, load_fixture):
|
||||||
f = load_fixture("passing_header.ifc")
|
f = load_fixture("passing_header.ifc")
|
||||||
assert f.mvd.view_definitions == "Alignment-basedView"
|
assert f.mvd.view_definitions == ["Alignment-basedView"]
|
||||||
|
|
||||||
def test_multiple_views(self, load_fixture):
|
def test_multiple_views(self, load_fixture):
|
||||||
f = load_fixture("two_views.ifc")
|
f = load_fixture("two_views.ifc")
|
||||||
assert f.mvd.view_definitions == 'CoordinationView_V2.0, SpaceBoundaryAddonView'
|
assert f.mvd.view_definitions == ['CoordinationView_V2.0', 'SpaceBoundaryAddonView']
|
||||||
|
|
||||||
|
def test_add_view(self):
|
||||||
|
header = MockHeader(("ViewDefinition [CoordinationView_V2.0]",))
|
||||||
|
mvd = mvd_info.MvdInfo(header)
|
||||||
|
assert mvd.view_definitions == ["CoordinationView_V2.0"]
|
||||||
|
mvd.view_definitions.append("SpaceBoundaryAddonView")
|
||||||
|
assert mvd.view_definitions == ['CoordinationView_V2.0', 'SpaceBoundaryAddonView']
|
||||||
|
|
||||||
class TestExchangeRequirements:
|
class TestExchangeRequirements:
|
||||||
def test_parsing(self, load_fixture):
|
def test_parsing(self, load_fixture):
|
||||||
@@ -36,8 +42,8 @@ class TestExchangeRequirements:
|
|||||||
'ExchangeRequirement [SomethingElse]'
|
'ExchangeRequirement [SomethingElse]'
|
||||||
)
|
)
|
||||||
assert f.mvd.exchange_requirements == 'SomethingElse'
|
assert f.mvd.exchange_requirements == 'SomethingElse'
|
||||||
f.mvd.view_definitions = 'CoordinationView_V2.0'
|
f.mvd.view_definitions = ['CoordinationView_V2.0']
|
||||||
assert f.mvd.view_definitions == 'CoordinationView_V2.0'
|
assert f.mvd.view_definitions == ['CoordinationView_V2.0']
|
||||||
|
|
||||||
|
|
||||||
class TestComments:
|
class TestComments:
|
||||||
@@ -126,9 +132,14 @@ class TestKeywords:
|
|||||||
class TestFallbackBehavior:
|
class TestFallbackBehavior:
|
||||||
def test_parse_mvd_fallback(self, monkeypatch):
|
def test_parse_mvd_fallback(self, monkeypatch):
|
||||||
monkeypatch.setattr(mvd_info, "LARK_AVAILABLE", False)
|
monkeypatch.setattr(mvd_info, "LARK_AVAILABLE", False)
|
||||||
|
header = MockHeader(("ViewDefinition [ShouldNotParse]",))
|
||||||
mvd = mvd_info.MvdInfo(
|
mvd = mvd_info.MvdInfo(
|
||||||
get_description=lambda: ["ViewDefinition [ShouldNotParse]"],
|
header
|
||||||
set_description=lambda d: None
|
|
||||||
)
|
)
|
||||||
assert mvd.view_definitions is None
|
assert mvd.view_definitions is None
|
||||||
assert mvd.keywords == set()
|
assert mvd.keywords == set()
|
||||||
|
|
||||||
|
class MockHeader:
|
||||||
|
def __init__(self, description):
|
||||||
|
self.file_description = type("FileDescription", (), {"description": description})
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user