mirror of
https://github.com/IfcOpenShell/IfcOpenShell.git
synced 2026-08-09 17:31:45 +00:00
update serializer settings literals #4912
This commit is contained in:
@@ -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):
|
||||||
|
|||||||
Reference in New Issue
Block a user