Last minute refactoring

This commit is contained in:
Thomas Krijnen
2026-08-08 07:42:45 +02:00
parent 8870ffb018
commit af58eaf79f
300 changed files with 5230 additions and 5150 deletions
@@ -307,8 +307,8 @@ Here is a typical example to serialising to glTF / glb. Example settings to
serialise to other formats are shown commented out. Different serialisations
may require different settings.
In addition to geometry settings, serialisation has its own set of
:doc:`../ifcopenshell/serialiser_settings`.
The same settings object also exposes the
:doc:`serialisation options <../ifcopenshell/serialiser_settings>`.
.. code-block:: python
@@ -331,15 +331,14 @@ In addition to geometry settings, serialisation has its own set of
# settings.set("apply-default-materials", True)
# settings.set("use-world-coords", True)
serialiser_settings = ifcopenshell.geom.serializer_settings()
# Setting element GUIDs is optional, but useful to uniquely identify objects in non-semantic formats.
serialiser_settings.set("use-element-guids", True)
settings.set("use-element-guids", True)
# Serialise to glTF / glb
serialiser = ifcopenshell.geom.serializers.gltf("output.glb", settings, serialiser_settings)
serialiser = ifcopenshell.geom.serializers.gltf("output.glb", settings)
# Serialise to obj
# serialiser = ifcopenshell.geom.serializers.obj('output.obj', 'output.mtl', settings, serialiser_settings)
# serialiser = ifcopenshell.geom.serializers.obj('output.obj', 'output.mtl', settings)
serialiser.setFile(ifc_file)
serialiser.setUnitNameAndMagnitude("METER", 1.0)
@@ -10,8 +10,8 @@ Here's an example of changing settings in C++:
.. code-block:: c++
SerializerSettings settings;
settings.set(IfcGeom::IteratorSettings::APPLY_DEFAULT_MATERIALS, true);
ifcopenshell::geom::settings settings;
settings.get<ifcopenshell::geom::settings::ApplyDefaultMaterials>().value = true;
Here's an example of changing settings in Python:
@@ -78,7 +78,7 @@ In C++, this is set when the iterator is constructed:
.. code-block:: c++
IfcGeom::Iterator geom_iterator(settings, ifc_file, filter_funcs, num_threads);
ifcopenshell::geom::iterator geom_iterator(settings, ifc_file, filter_funcs, num_threads);
In Python, this is set when the iterator is constructed, and requires a list of
IFC entity instances:
@@ -102,7 +102,7 @@ In C++, this is set when the iterator is constructed:
.. code-block:: c++
IfcGeom::Iterator geom_iterator(settings, ifc_file, filter_funcs, num_threads);
ifcopenshell::geom::iterator geom_iterator(settings, ifc_file, filter_funcs, num_threads);
In Python, this is set when the iterator is constructed:
@@ -272,10 +272,10 @@ Here is an example in C++:
.. code-block:: c++
SerializerSettings settings;
std::vector<int> context_ids;
ifcopenshell::geom::settings settings;
std::set<int> context_ids;
// ...
settings.set_context_ids(context_ids);
settings.get<ifcopenshell::geom::settings::ContextIds>().value = context_ids;
Here is an example in Python:
@@ -582,10 +582,10 @@ Here is an example in C++:
.. code-block:: c++
SerializerSettings settings;
ifcopenshell::geom::settings settings;
double tolerance;
// ...
settings.set_angular_tolerance(tolerance);
settings.get<ifcopenshell::geom::settings::MesherAngularDeflection>().value = tolerance;
Here is an example in Python:
@@ -609,10 +609,10 @@ Here is an example in C++:
.. code-block:: c++
SerializerSettings settings;
ifcopenshell::geom::settings settings;
double tolerance;
// ...
settings.set_deflection_tolerance(tolerance);
settings.get<ifcopenshell::geom::settings::MesherLinearDeflection>().value = tolerance;
Here is an example in Python:
@@ -1,15 +1,15 @@
Serialiser settings
===================
The geometry serialiser has a variety of settings which can impact its output.
This is set during the construction of the serialiser.
Geometry serialisers use the same settings object as geometry conversion. These
options affect serialised output and are set before constructing a serialiser.
Here's an example of changing settings in Python:
.. code-block:: python
serialiser_settings = ifcopenshell.geom.serializer_settings()
serialiser_settings.set("use-element-guids", True)
settings = ifcopenshell.geom.settings()
settings.set("use-element-guids", True)
base-uri
^^^^^^^^
+24 -25
View File
@@ -161,9 +161,8 @@ def main(
# Initialize serializer
buffer = ifcopenshell.geom.serializers.buffer()
serialiser_settings = ifcopenshell.geom.serializer_settings()
if settings.auto_floorplan:
serialiser_settings.set("section-height-from-storeys", True)
geom_settings.set("section-height-from-storeys", True)
# elevation-ref-guid and elevation-ref are also mutually exclusive in C-code.
# Note that guid or object type are not checked anywhere to be valid,
@@ -172,38 +171,38 @@ def main(
if settings.drawing_guid:
if not by_guid(settings.drawing_guid):
raise ValueError(f"Unable to find guid {settings.drawing_guid!r}")
serialiser_settings.set("elevation-ref-guid", settings.drawing_guid)
geom_settings.set("elevation-ref-guid", settings.drawing_guid)
elif settings.drawing_object_type:
serialiser_settings.set("elevation-ref", settings.drawing_object_type)
serialiser_settings.set("svg-without-storeys", True)
geom_settings.set("elevation-ref", settings.drawing_object_type)
geom_settings.set("svg-without-storeys", True)
# required for svgfill
serialiser_settings.set("svg-write-poly", True)
serialiser_settings.set("svg-xmlns", True)
geom_settings.set("svg-write-poly", True)
geom_settings.set("svg-xmlns", True)
serialiser_settings.set("svg-project", settings.include_projection)
serialiser_settings.set("profile-threshold", settings.profile_threshold)
serialiser_settings.set("bounds", f"{settings.width}x{settings.height}")
serialiser_settings.set("scale", str(settings.scale))
serialiser_settings.set("auto-elevation", settings.auto_elevation)
serialiser_settings.set("auto-section", settings.auto_section)
serialiser_settings.set("print-space-names", settings.space_names)
serialiser_settings.set("print-space-areas", settings.space_areas)
serialiser_settings.set("door-arcs", settings.door_arcs)
serialiser_settings.set("svg-no-css", bool(settings.css))
geom_settings.set("svg-project", settings.include_projection)
geom_settings.set("profile-threshold", settings.profile_threshold)
geom_settings.set("bounds", f"{settings.width}x{settings.height}")
geom_settings.set("scale", str(settings.scale))
geom_settings.set("auto-elevation", settings.auto_elevation)
geom_settings.set("auto-section", settings.auto_section)
geom_settings.set("print-space-names", settings.space_names)
geom_settings.set("print-space-areas", settings.space_areas)
geom_settings.set("door-arcs", settings.door_arcs)
geom_settings.set("svg-no-css", bool(settings.css))
if settings.subtract_before_hlr:
serialiser_settings.set("svg-subtract-before", "always")
geom_settings.set("svg-subtract-before", "always")
serialiser_settings.set("svg-poly", settings.hlr_poly)
serialiser_settings.set("svg-prefilter", settings.prefilter)
serialiser_settings.set("svg-unify-inputs", settings.unify_inputs)
serialiser_settings.set("svg-mirror-y", settings.mirror_y)
geom_settings.set("svg-poly", settings.hlr_poly)
geom_settings.set("svg-prefilter", settings.prefilter)
geom_settings.set("svg-unify-inputs", settings.unify_inputs)
geom_settings.set("svg-mirror-y", settings.mirror_y)
if settings.storey_heights not in {"none", "full", "left"}:
raise ValueError("storey_heights should be one of {'none', 'full', 'left'}")
serialiser_settings.set("draw-storey-heights", settings.storey_heights)
geom_settings.set("draw-storey-heights", settings.storey_heights)
sr = ifcopenshell.geom.serializers.svg(buffer, geom_settings, serialiser_settings)
sr = ifcopenshell.geom.serializers.svg(buffer, geom_settings)
sr.setFile(files[0])
"""
@@ -378,7 +377,7 @@ def main(
# Put the IFC element entity type on the path for CSS-based styling
p.setAttribute("class", elements[0].instance.is_a())
# Obtain style (IfcOpenShell IfcGeom::Material)
# Obtain style (IfcOpenShell ifcopenshell::geom::Material)
style = tree.styles()[elements[0].style_index]
# This is just a demonstration. We compose a factor of using:
@@ -102,7 +102,7 @@ class Header(codegen.Base):
all_superclasses.append(superclass)
superclass = mapping.simple_type_parent(superclass)
else:
superclasses.append("express::DeclaredType")
superclasses.append("express::declared_type")
# This is no longer used, previously virtual inheritance was used, now
# a variant-like approach is used instead, so the definition of selects
@@ -110,7 +110,7 @@ class Header(codegen.Base):
# superclasses.extend(get_select_super_types(name, bases=all_superclasses))
is_emitted = (
lambda nm: nm == "express::DeclaredType"
lambda nm: nm == "express::declared_type"
or nm in mapping.schema.selects
or nm.lower() in emitted_simpletypes
)
@@ -191,7 +191,7 @@ class Header(codegen.Base):
all_supertypes.append(tt.supertypes[0])
tt = mapping.schema.entities[tt.supertypes[0]]
supertypes = list(type.supertypes) if len(type.supertypes) else ["express::Entity"]
supertypes = list(type.supertypes) if len(type.supertypes) else ["express::entity"]
# supertypes.extend(get_select_super_types(name, bases=all_supertypes))
supertypes = list(map(case_normalize, supertypes))
assert len(supertypes) == 1
@@ -239,12 +239,12 @@ class Implementation(codegen.Base):
for i in type.inverse
]
superclass = "%s(e)" % type.supertypes[0] if len(type.supertypes) == 1 else "express::Entity(e)"
superclass = "%s(e)" % type.supertypes[0] if len(type.supertypes) == 1 else "express::entity(e)"
superclass_num_attrs = (
"%s(const std::weak_ptr<instance_data>&(in_memory_attribute_storage(%%d)))" % type.supertypes[0]
if len(type.supertypes) == 1
else "express::Entity(const std::weak_ptr<instance_data>&(in_memory_attribute_storage(%d)))"
else "express::entity(const std::weak_ptr<instance_data>&(in_memory_attribute_storage(%d)))"
) % len(constructor_arguments)
write(
@@ -309,7 +309,7 @@ class Implementation(codegen.Base):
for class_name, type in mapping.schema.simpletypes.items():
type_str = mapping.make_type_string(mapping.flatten_type_string(type))
attr_type = mapping.make_argument_type(type)
superclass = mapping.simple_type_parent(class_name) or "express::DeclaredType"
superclass = mapping.simple_type_parent(class_name) or "express::declared_type"
simpletype_impl_is = (
templates.simpletype_impl_is_with_supertype
@@ -378,7 +378,7 @@ class Implementation(codegen.Base):
("%s v" % type_str,),
(
"set_attribute_value(0, %s(v));"
% ("cast_vector<express::Base>" if mapping.is_templated_list(type) else "")
% ("cast_vector<express::base>" if mapping.is_templated_list(type) else "")
),
),
# ("v", "", constructor, "", ("%s v" % type_str,), ""),
@@ -130,10 +130,10 @@ simpletype_impl_type = "return *((ifcopenshell::type_declaration*)%(schema_name_
simpletype_impl_class = "return *((ifcopenshell::type_declaration*)%(schema_name_upper)s_types[%(index_in_schema)d]);"
simpletype_impl_explicit_constructor = "data_ = e;"
simpletype_impl_constructor = "data_ = new const std::weak_ptr<instance_data>&(%(schema_name_upper)s_types[%(index_in_schema)d]); set_attribute_value(0, v);"
simpletype_impl_constructor_templated = "data_ = new const std::weak_ptr<instance_data>&(%(schema_name_upper)s_types[%(index_in_schema)d]); set_attribute_value(0, cast_vector<express::Base>(v));"
simpletype_impl_constructor_templated = "data_ = new const std::weak_ptr<instance_data>&(%(schema_name_upper)s_types[%(index_in_schema)d]); set_attribute_value(0, cast_vector<express::base>(v));"
simpletype_impl_cast = "return get_attribute_value(0);"
simpletype_impl_cast_templated = (
"std::vector<express::Base> es = get_attribute_value(0); return cast_vector<%(underlying_type)s>(es);"
"std::vector<express::base> es = get_attribute_value(0); return cast_vector<%(underlying_type)s>(es);"
)
simpletype_impl_declaration = (
@@ -141,9 +141,9 @@ simpletype_impl_declaration = (
)
select = """%(documentation)s
class IFC_SCHEMA_API %(name)s : public express::Select {
class IFC_SCHEMA_API %(name)s : public express::select {
public:
using express::Select::Select;
using express::select::select;
static const ifcopenshell::select_type& Class();
%(template_items)s
@@ -153,16 +153,16 @@ public:
select_list_item = """ // let's just use the as<>() from Base instead directly...
// template<class T, std::enable_if_t<std::is_same_v<T, %(item_name)s>, int> = 0>
// %(item_name)s as() const { return express::Base::as<%(item_name)s>(); }
// %(item_name)s as() const { return express::base::as<%(item_name)s>(); }
"""
select_cast_function = """ %(name)s(const %(item_name)s& c) : express::Select(c) {};
select_cast_function = """ %(name)s(const %(item_name)s& c) : express::select(c) {};
"""
enumeration = """%(documentation)s
class IFC_SCHEMA_API %(name)s : public express::DeclaredType {
class IFC_SCHEMA_API %(name)s : public express::declared_type {
public:
using express::DeclaredType::DeclaredType;
using express::declared_type::declared_type;
typedef enum {%(values)s} Value;
static const char* ToString(Value v);
@@ -196,7 +196,7 @@ const ifcopenshell::enumeration_type& %(schema_name)s::%(name)s::Class() { retur
/*
%(schema_name)s::%(name)s::%(name)s(const std::weak_ptr<instance_data>& e)
: express::DeclaredType(e)
: express::declared_type(e)
{}
%(schema_name)s::%(name)s::%(name)s(Value v) {
@@ -259,22 +259,22 @@ optional_attr_stmt = "return !get_attribute_value(%(index)d).isNull();"
get_attr_stmt = "%(null_check)s %(non_optional_type)s v = get_attribute_value(%(index)d); return v;"
get_attr_stmt_enum = "%(null_check)s return %(non_optional_type)s::FromString(get_attribute_value(%(index)d));"
get_attr_stmt_entity = (
"%(null_check)s return ((express::Base)(get_attribute_value(%(index)d))).as<%(non_optional_type_no_pointer)s>();"
"%(null_check)s return ((express::base)(get_attribute_value(%(index)d))).as<%(non_optional_type_no_pointer)s>();"
)
get_attr_stmt_array = "%(null_check)s std::vector<express::Base> es = get_attribute_value(%(index)d); return cast_vector<%(list_instance_type)s>(es);"
get_attr_stmt_nested_array = "%(null_check)s std::vector<std::vector<express::Base>> es = get_attribute_value(%(index)d); return cast_vector<%(list_instance_type)s>(es);"
get_attr_stmt_array = "%(null_check)s std::vector<express::base> es = get_attribute_value(%(index)d); return cast_vector<%(list_instance_type)s>(es);"
get_attr_stmt_nested_array = "%(null_check)s std::vector<std::vector<express::base>> es = get_attribute_value(%(index)d); return cast_vector<%(list_instance_type)s>(es);"
get_inverse = "return cast_vector<%(type)s>(file()->get_inverse(data()->id(), %(schema_name_upper)s_types[%(type_index)d], %(index)d));"
set_attr_stmt = "%(check_optional_set_begin)sset_attribute_value(%(index)d, %(star_if_optional)sv);%(check_optional_set_else)sunset_attribute_value(%(index)d);%(check_optional_set_end)s"
set_attr_instance = "%(check_optional_set_begin)sset_attribute_value(%(index)d, v);%(check_optional_set_else)sunset_attribute_value(%(index)d);%(check_optional_set_end)s"
set_attr_stmt_enum = "%(check_optional_set_begin)sset_attribute_value(%(index)d, enumeration_reference(&%(non_optional_type)s::Class(), (size_t) %(star_if_optional)sv));%(check_optional_set_else)sunset_attribute_value(%(index)d);%(check_optional_set_end)s"
set_attr_stmt_array = "%(check_optional_set_begin)sset_attribute_value(%(index)d, cast_vector<express::Base>(%(star_if_optional)sv));%(check_optional_set_else)sunset_attribute_value(%(index)d);%(check_optional_set_end)s"
set_attr_stmt_nested_array = "%(check_optional_set_begin)sset_attribute_value(%(index)d, cast_vector<express::Base>(%(star_if_optional)sv));%(check_optional_set_else)sunset_attribute_value(%(index)d);%(check_optional_set_end)s"
set_attr_stmt_array = "%(check_optional_set_begin)sset_attribute_value(%(index)d, cast_vector<express::base>(%(star_if_optional)sv));%(check_optional_set_else)sunset_attribute_value(%(index)d);%(check_optional_set_end)s"
set_attr_stmt_nested_array = "%(check_optional_set_begin)sset_attribute_value(%(index)d, cast_vector<express::base>(%(star_if_optional)sv));%(check_optional_set_else)sunset_attribute_value(%(index)d);%(check_optional_set_end)s"
constructor_stmt = "set_attribute_value(%(index)d, (%(name)s));"
constructor_stmt_enum = "set_attribute_value(%(index)d, (enumeration_reference(&%(type)s::Class(),(size_t)%(name)s)));"
constructor_stmt_array = "set_attribute_value(%(index)d, cast_vector<express::Base>(%(name)s));"
constructor_stmt_array = "set_attribute_value(%(index)d, cast_vector<express::base>(%(name)s));"
constructor_stmt_derived = ""
constructor_stmt_instance = "set_attribute_value(%(index)d, %(name)s);"
@@ -65,8 +65,12 @@ SETTING = Literal[
"angle-unit",
"apply-default-materials",
"apply-offset",
"auto-elevation",
"auto-section",
"base-uri",
"boolean-attempt-2d",
"building-local-placement",
"bounds",
"cache-shapes",
"cgal-original-edges",
"cgal-smooth-angle-degrees",
@@ -80,9 +84,13 @@ SETTING = Literal[
"debug",
"defer-processing-first-element",
"dimensionality",
"digits",
"disable-boolean-result",
"disable-opening-subtractions",
"edge-arrows",
"ecef",
"elevation-ref",
"elevation-ref-guid",
"element-hierarchy",
"enable-layerset-slicing",
"force-space-transparency",
@@ -107,65 +115,55 @@ SETTING = Literal[
"no-wire-intersection-check",
"no-wire-intersection-tolerance",
"permissive-shape-reuse",
"print-space-areas",
"print-space-names",
"precision-factor",
"precision",
"profile-threshold",
"reorient-shells",
"site-local-placement",
"scale",
"section-height",
"section-height-from-storeys",
"section-ref",
"separate-z-up-node",
"space-name-transform",
"storey-height-line-length",
"surface-colour",
"svg-emit-flush-edges",
"svg-mirror-x",
"svg-mirror-y",
"svg-no-css",
"svg-poly",
"svg-prefilter",
"svg-project",
"svg-render-crease-edges",
"svg-render-sharp-edges",
"svg-ridge-angle-min-degrees",
"svg-segment-projection",
"svg-subtract-before",
"svg-unify-inputs",
"svg-use-edge-classification",
"svg-valley-angle-min-degrees",
"svg-without-storeys",
"svg-write-poly",
"svg-xmlns",
"triangulation-type",
"unify-shapes",
"use-material-names",
"use-element-guids",
"use-element-names",
"use-element-step-ids",
"use-element-types",
"use-python-opencascade",
"use-world-coords",
"validate",
"weld-vertices",
]
SERIALIZER_SETTING = Literal[
"base-uri",
"use-element-names",
"use-element-guids",
"use-element-step-ids",
"use-element-types",
"y-up",
"ecef",
"digits",
"wkt-use-section",
"separate-z-up-node",
"bounds",
"scale",
"center",
"section-ref",
"elevation-ref",
"elevation-ref-guid",
"auto-section",
"auto-elevation",
"draw-storey-heights",
"profile-threshold",
"storey-height-line-length",
"svg-xmlns",
"svg-poly",
"svg-prefilter",
"svg-unify-inputs",
"svg-segment-projection",
"svg-subtract-before",
"svg-write-poly",
"svg-project",
"svg-without-storeys",
"svg-no-css",
"svg-mirror-y",
"svg-mirror-x",
"door-arcs",
"section-height",
"section-height-from-storeys",
"print-space-names",
"print-space-areas",
"space-name-transform",
]
# NOTE: hybrid-cgal-simple-opencascade is added just as an example
@@ -203,18 +201,14 @@ class settings_mixin:
return "%s(%s)" % (type(self).__name__, ", ".join(map(fmt_pair, self.setting_names())))
@staticmethod
def name(k: str) -> Union[SETTING, SERIALIZER_SETTING]:
def name(k: str) -> SETTING:
return k.lower().replace("_", "-")
@staticmethod
def rname(k: Union[SETTING, SERIALIZER_SETTING]) -> str:
def rname(k: SETTING) -> str:
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: Union[SETTING, SERIALIZER_SETTING], v: Any) -> None:
def set(self, k: SETTING, v: Any) -> None:
"""
Set value of the setting named `k` to `v`.
@@ -231,10 +225,6 @@ class settings_mixin:
else:
self.set_(self.name(k), v)
@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`.
@@ -246,20 +236,12 @@ class settings_mixin:
return self.use_python_opencascade
return self.get_(k)
@overload
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
@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",
# ensure we won't accidentally call any c-extension methods
@@ -322,10 +304,6 @@ class settings_mixin:
self.set(k.replace("_", "-"), v)
class serializer_settings(settings_mixin, ifcopenshell_wrapper.SerializerSettings):
pass
class settings(settings_mixin, ifcopenshell_wrapper.Settings):
use_python_opencascade = False
@@ -687,18 +665,18 @@ class _serializer_factory:
self.__name__ = name
def __call__(self, out_filename: Union[str, PathLike[str]], *args: Any) -> ifcopenshell_wrapper.GeometrySerializer:
if self.name == "obj" and len(args) == 3:
if self.name == "obj" and len(args) == 2:
output_filename = args[0]
output_temp_filename = out_filename
geometry_settings, serializer_settings = args[1], args[2]
elif len(args) == 2:
settings = args[1]
elif len(args) == 1:
output_filename = out_filename
output_temp_filename = out_filename
geometry_settings, serializer_settings = args
settings = args[0]
else:
obj_signature = " or (out_filename, mtl_filename, geometry_settings, serializer_settings)"
obj_signature = " or (out_filename, mtl_filename, settings)"
raise TypeError(
f"serializers.{self.name}() expects (out_filename, geometry_settings, serializer_settings)"
f"serializers.{self.name}() expects (out_filename, settings)"
+ (obj_signature if self.name == "obj" else "")
)
@@ -711,9 +689,7 @@ class _serializer_factory:
output_filename = self._path(output_filename)
output_temp_filename = self._path(output_temp_filename)
return ifcopenshell_wrapper.create_geometry_serializer(
self.extension, output_filename, output_temp_filename, geometry_settings, serializer_settings
)
return ifcopenshell_wrapper.create_geometry_serializer(self.extension, output_filename, output_temp_filename, settings)
def _is_buffer(self, value: Any) -> bool:
return isinstance(value, ifcopenshell_wrapper.buffer)
@@ -257,7 +257,6 @@ class GeometrySerializer:
READ_TRIANGULATION: Any
def __init__(self, *args, **kwargs): ...
def finalize(self): ...
def geometry_settings(self, *args): ...
def isTesselated(self): ...
def is_streaming(self) -> bool: ...
def object_id(self, o): ...
@@ -265,7 +264,7 @@ class GeometrySerializer:
def ready(self): ...
def setFile(self, file: file) -> None: ...
def setUnitNameAndMagnitude(self, name, magnitude): ...
def settings(self, *args): ...
def settings(self, *args) -> "Settings": ...
def write(self, *args): ...
def writeHeader(self): ...
@@ -370,7 +369,7 @@ class Representation:
- 2468 - IfcRelVoidsElement
"""
def settings(self): ...
def settings(self) -> "Settings": ...
class RocksDBPrefixIterator:
def __init__(self, storage, prefix): ...
@@ -401,12 +400,6 @@ class SerializedElement(Element):
@property
def geometry(self) -> Serialization: ...
class SerializerSettings:
def get_(self, name): ...
def get_type(self, name): ...
def set_(self, *args): ...
def setting_names(self): ...
class Settings:
def get_(self, name): ...
def get_type(self, name): ...
@@ -47,21 +47,8 @@ class TestGeomSettings:
settings.set(settings.USE_PYTHON_OPENCASCADE, True)
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()
), "Also need to update IfcPython.i, if new settings were added/removed."
# 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")
with pytest.raises(RuntimeError):
settings.set("use-python-opencascade", True)
assert "USE_PYTHON_OPENCASCADE" not in repr(settings)
settings.set("base-uri", "https://example.test/")
assert settings.get("base-uri") == "https://example.test/"
class TestTriangulationAttributes(test.bootstrap.IFC4):