update serializer settings literals #4912

This commit is contained in:
Andrej730
2024-06-27 10:58:10 +05:00
parent dee936b2c3
commit 14dbe121f6
2 changed files with 54 additions and 13 deletions
@@ -17,6 +17,7 @@
# along with IfcOpenShell. If not, see <http://www.gnu.org/licenses/>. # along with IfcOpenShell. If not, see <http://www.gnu.org/licenses/>.
from __future__ import annotations
import os import os
import sys import sys
import operator import operator
@@ -27,7 +28,7 @@ from ..entity_instance import entity_instance
from . import has_occ from . import has_occ
from typing import TypeVar, Union, Optional, Generator, Any, Literal from typing import TypeVar, Union, Optional, Generator, Any, Literal, overload
T = TypeVar("T") T = TypeVar("T")
ShapeElementType = Union[ ShapeElementType = Union[
@@ -95,6 +96,16 @@ SETTING = Literal[
"piecewise-step-param", "piecewise-step-param",
"use-python-opencascade", "use-python-opencascade",
] ]
SERIALIZER_SETTING = Literal[
"use-element-names",
"use-element-guids",
"use-element-step-ids",
"use-material-names",
"use-element-types",
"y-up",
"ecef",
"digits",
]
class missing_setting: class missing_setting:
@@ -109,8 +120,6 @@ class settings_mixin:
when available when available
""" """
use_python_opencascade = False
def __init__(self, **kwargs): def __init__(self, **kwargs):
super(settings_mixin, self).__init__() super(settings_mixin, self).__init__()
for k, v in kwargs.items(): for k, v in kwargs.items():
@@ -127,13 +136,17 @@ class settings_mixin:
return "%s(%s)" % (type(self).__name__, ", ".join(map(fmt_pair, self.setting_names()))) return "%s(%s)" % (type(self).__name__, ", ".join(map(fmt_pair, self.setting_names())))
@staticmethod @staticmethod
def name(k: str) -> SETTING: def name(k: str) -> Union[SETTING, SERIALIZER_SETTING]:
return k.lower().replace("_", "-") return k.lower().replace("_", "-")
@staticmethod @staticmethod
def rname(k: SETTING) -> str: def rname(k: Union[SETTING, SERIALIZER_SETTING]) -> str:
return k.upper().replace("-", "_") return k.upper().replace("-", "_")
@overload
def set(self: settings, k: SETTING, v: Any) -> None: ...
@overload
def set(self: serializer_settings, k: SERIALIZER_SETTING, v: Any) -> None: ...
def set(self, k: SETTING, v: Any) -> None: def set(self, k: SETTING, v: Any) -> None:
""" """
Set value of the setting named `k` to `v`. Set value of the setting named `k` to `v`.
@@ -141,7 +154,7 @@ class settings_mixin:
:raises RuntimeError: If there is no setting with name `k`. :raises RuntimeError: If there is no setting with name `k`.
""" """
k = self.name(k) k = self.name(k)
if k == "use-python-opencascade": if isinstance(self, settings) and k == "use-python-opencascade":
if not has_occ: if not has_occ:
raise AttributeError("Python OpenCASCADE is not installed") raise AttributeError("Python OpenCASCADE is not installed")
if v: if v:
@@ -151,21 +164,36 @@ class settings_mixin:
else: else:
self.set_(self.name(k), v) self.set_(self.name(k), v)
def get(self, k: SETTING) -> Any: @overload
def get(self: settings, k: SETTING) -> Any: ...
@overload
def get(self: serializer_settings, k: SERIALIZER_SETTING) -> Any: ...
def get(self, k: str) -> Any:
""" """
Return value of the setting named `k`. Return value of the setting named `k`.
:raises RuntimeError: If there is no setting with name `k`. :raises RuntimeError: If there is no setting with name `k`.
""" """
k = self.name(k) k = self.name(k)
if k == "use-python-opencascade": if isinstance(self, settings) and k == "use-python-opencascade":
return self.use_python_opencascade return self.use_python_opencascade
return self.get_(k) return self.get_(k)
def setting_names(self) -> tuple[SETTING, ...]: @overload
return super().setting_names() + ("use-python-opencascade",) def setting_names(self: settings) -> tuple[SETTING, ...]: ...
@overload
def setting_names(self: serializer_settings) -> tuple[SERIALIZER_SETTING, ...]: ...
def setting_names(self) -> tuple[str, ...]:
setting_names = super().setting_names()
if isinstance(self, settings):
setting_names += ("use-python-opencascade",)
return setting_names
def __getattr__(self, k: str) -> SETTING: @overload
def __getattr__(self: settings, k: str) -> SETTING: ...
@overload
def __getattr__(self: serializer_settings, k: str) -> SERIALIZER_SETTING: ...
def __getattr__(self, k: str) -> str:
# Swig wrapper will try to access "this", # Swig wrapper will try to access "this",
# ensure we won't accidentally call any c-extension methods # ensure we won't accidentally call any c-extension methods
# like .setting_names() until wrapper is not completely initialized. # like .setting_names() until wrapper is not completely initialized.
@@ -183,7 +211,7 @@ class serializer_settings(settings_mixin, ifcopenshell_wrapper.SerializerSetting
class settings(settings_mixin, ifcopenshell_wrapper.Settings): class settings(settings_mixin, ifcopenshell_wrapper.Settings):
pass use_python_opencascade = False
class iterator(ifcopenshell_wrapper.Iterator): class iterator(ifcopenshell_wrapper.Iterator):
@@ -7,10 +7,11 @@ from typing import get_args
class TestGeomSettings: class TestGeomSettings:
def test_run(self): def test_settings(self):
settings = ifcopenshell.geom.settings() settings = ifcopenshell.geom.settings()
assert set(get_args(ifcopenshell.geom.SETTING)) == set(settings.setting_names()) assert set(get_args(ifcopenshell.geom.SETTING)) == set(settings.setting_names())
assert "use-python-opencascade" in settings.setting_names()
assert settings.get(settings.USE_PYTHON_OPENCASCADE) is False assert settings.get(settings.USE_PYTHON_OPENCASCADE) is False
assert settings.get("use-python-opencascade") is False assert settings.get("use-python-opencascade") is False
assert "USE_PYTHON_OPENCASCADE = False" in repr(settings) assert "USE_PYTHON_OPENCASCADE = False" in repr(settings)
@@ -27,6 +28,18 @@ class TestGeomSettings:
settings.set(settings.USE_PYTHON_OPENCASCADE, True) settings.set(settings.USE_PYTHON_OPENCASCADE, True)
assert "USE_PYTHON_OPENCASCADE = False" in repr(settings) assert "USE_PYTHON_OPENCASCADE = False" in repr(settings)
def test_serializer_settings(self):
settings = ifcopenshell.geom.serializer_settings()
assert set(get_args(ifcopenshell.geom.SERIALIZER_SETTING)) == set(settings.setting_names())
# Only for settings.
assert "use-python-opencascade" not in settings.setting_names()
with pytest.raises(AttributeError):
settings.get(settings.USE_PYTHON_OPENCASCADE)
with pytest.raises(RuntimeError):
settings.get("use-python-opencascade")
assert "USE_PYTHON_OPENCASCADE" not in repr(settings)
class TestAssignObject: class TestAssignObject:
def test_no_welding_on_distinct_items(self): def test_no_welding_on_distinct_items(self):