From 666e484b2b3722b7d23fc7a50a6c3400b4d95205 Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Mon, 10 Jan 2022 15:42:24 +1100 Subject: [PATCH] Run black on IfcOpenShell-python. --- .../api/geometry/add_representation.py | 2 +- .../api/unit/add_conversion_based_unit.py | 10 +- src/ifcopenshell-python/ifcopenshell/draw.py | 39 ++--- .../ifcopenshell/entity_instance.py | 27 ++-- .../ifcopenshell/express/header.py | 21 ++- .../ifcopenshell/express/implementation.py | 18 ++- .../ifcopenshell/express/mapping.py | 11 +- .../ifcopenshell/geom/main.py | 22 +-- .../ifcopenshell/util/schema.py | 2 +- .../test/api/context/test_edit_context.py | 36 +++-- .../api/drawing/test_edit_text_literal.py | 15 +- .../geometry/test_remove_representation.py | 6 +- .../test/api/grid/test_create_grid_axis.py | 2 +- .../test/api/library/test_edit_library.py | 19 ++- .../test/api/library/test_edit_reference.py | 19 ++- .../test/api/library/test_remove_library.py | 4 +- .../test/api/owner/test_add_application.py | 5 +- .../api/owner/test_create_owner_history.py | 4 +- .../test/api/owner/test_edit_address.py | 56 ++++--- .../test/api/owner/test_edit_organisation.py | 15 +- .../test/api/owner/test_edit_person.py | 21 ++- .../test/api/owner/test_edit_role.py | 11 +- .../api/owner/test_update_owner_history.py | 12 +- .../resource/test_calculate_resource_work.py | 46 ++++-- .../test_add_structural_analysis_model.py | 1 + .../test_assign_structural_analysis_model.py | 7 +- .../test_edit_structural_analysis_model.py | 6 +- .../test_remove_structural_analysis_model.py | 2 +- ...test_unassign_structural_analysis_model.py | 7 +- .../test/api/unit/test_edit_derived_unit.py | 9 +- .../test/api/unit/test_edit_monetary_unit.py | 4 +- .../test/test_wall_opening.py | 151 ++++++++++++------ 32 files changed, 368 insertions(+), 242 deletions(-) diff --git a/src/ifcopenshell-python/ifcopenshell/api/geometry/add_representation.py b/src/ifcopenshell-python/ifcopenshell/api/geometry/add_representation.py index d9138a3284..1d6abf2295 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/geometry/add_representation.py +++ b/src/ifcopenshell-python/ifcopenshell/api/geometry/add_representation.py @@ -32,7 +32,7 @@ class Usecase: # IfcTextLiteral "ifc_representation_class": None, # Whether to cast a mesh into a particular class "profile_set_usage": None, # The material profile set if the extrusion requires it - "text_literal": None, # The text literal if the representation requires it + "text_literal": None, # The text literal if the representation requires it } self.ifc_vertices = [] for key, value in settings.items(): diff --git a/src/ifcopenshell-python/ifcopenshell/api/unit/add_conversion_based_unit.py b/src/ifcopenshell-python/ifcopenshell/api/unit/add_conversion_based_unit.py index 8636252e26..2d26d58fc2 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/unit/add_conversion_based_unit.py +++ b/src/ifcopenshell-python/ifcopenshell/api/unit/add_conversion_based_unit.py @@ -26,8 +26,10 @@ class Usecase: if conversion_offset: return self.file.createIfcConversionBasedUnitWithOffset( - exponents, unit_type, self.settings["name"], conversion_factor, conversion_offset, + exponents, + unit_type, + self.settings["name"], + conversion_factor, + conversion_offset, ) - return self.file.createIfcConversionBasedUnit( - exponents, unit_type, self.settings["name"], conversion_factor - ) + return self.file.createIfcConversionBasedUnit(exponents, unit_type, self.settings["name"], conversion_factor) diff --git a/src/ifcopenshell-python/ifcopenshell/draw.py b/src/ifcopenshell-python/ifcopenshell/draw.py index 9e19820ffa..b01792b3bd 100644 --- a/src/ifcopenshell-python/ifcopenshell/draw.py +++ b/src/ifcopenshell-python/ifcopenshell/draw.py @@ -62,10 +62,10 @@ def main(settings, files, iterators=None, merge_projection=True, progress_functi geom_settings = ifcopenshell.geom.settings( # this is required for serialization - APPLY_DEFAULT_MATERIALS = True, - DISABLE_TRIANGULATION = True, + APPLY_DEFAULT_MATERIALS=True, + DISABLE_TRIANGULATION=True, # when not doing booleans, proper solids from shells isn't a requirement - SEW_SHELLS = settings.subtract_before_hlr + SEW_SHELLS=settings.subtract_before_hlr, ) if not iterators: @@ -83,7 +83,7 @@ def main(settings, files, iterators=None, merge_projection=True, progress_functi files, ) ) - + if settings.cache: cache = ifcopenshell.geom.serializers.hdf5("cache.h5", geom_settings) for it in iterators: @@ -108,7 +108,7 @@ def main(settings, files, iterators=None, merge_projection=True, progress_functi sr.setElevationRefGuid(settings.drawing_guid) sr.setWithoutStoreys(True) # If you want to filter by IfcAnnotation ObjectType named "DRAWING" - #sr.setElevationRef("DRAWING") + # sr.setElevationRef("DRAWING") # required for svgfill sr.setPolygonal(True) @@ -130,7 +130,7 @@ def main(settings, files, iterators=None, merge_projection=True, progress_functi sr.setSubtractionSettings(W.ALWAYS) try: - sh = ['none', 'full', 'left'].index(settings.storey_heights) + sh = ["none", "full", "left"].index(settings.storey_heights) sr.setDrawStoreyHeights(sh) except: raise ValueError("storey_heights should be one of {'none', 'full', 'left'}") @@ -170,7 +170,7 @@ def main(settings, files, iterators=None, merge_projection=True, progress_functi if not merge_projection: return svg_data_1 - + if not settings.cells: return svg_data_1.encode("ascii", "xmlcharrefreplace") @@ -275,9 +275,7 @@ def main(settings, files, iterators=None, merge_projection=True, progress_functi # the factor determines how much white will be interpolated # into the style diffuse color. clr = numpy.array(style.diffuse) - factor = (math.log(elements[0].distance + 2.0) / 7.0) * ( - 1.0 - 0.5 * abs(elements[0].dot_product) - ) + factor = (math.log(elements[0].distance + 2.0) / 7.0) * (1.0 - 0.5 * abs(elements[0].dot_product)) if style.has_transparency: factor *= 1.0 - style.transparency clr = WHITE * (1.0 - factor) + clr * factor @@ -314,18 +312,18 @@ if __name__ == "__main__": import sys import time import argparse - + times = [] - + def measure(task, fn): t0 = time.time() r = fn() dt = time.time() - t0 times.append((task, dt)) return r - + def print_progress(*args): - print("\r", *args, " "*10, end="", flush=True) + print("\r", *args, " " * 10, end="", flush=True) parser = argparse.ArgumentParser() @@ -333,12 +331,8 @@ if __name__ == "__main__": for field in fields(draw_settings): if field.type == bool: - parser.add_argument( - "--" + field.name.replace("_", "-"), dest=field.name, action="store_true" - ) - parser.add_argument( - "--no-" + field.name.replace("_", "-"), dest=field.name, action="store_false" - ) + parser.add_argument("--" + field.name.replace("_", "-"), dest=field.name, action="store_true") + parser.add_argument("--no-" + field.name.replace("_", "-"), dest=field.name, action="store_false") parser.set_defaults(**{field.name: field.default}) else: parser.add_argument( @@ -355,9 +349,8 @@ if __name__ == "__main__": files = measure("open files", lambda: list(map(ifcopenshell.open, files))) result = measure("processing", lambda: main(settings, files, progress_function=print_progress)) open(output, "wb").write(result) - + print("\r Done!", " " * 20) - + for t, dt in times: print(f"{t}: {dt}") - diff --git a/src/ifcopenshell-python/ifcopenshell/entity_instance.py b/src/ifcopenshell-python/ifcopenshell/entity_instance.py index 9f1434717d..796c72bec9 100644 --- a/src/ifcopenshell-python/ifcopenshell/entity_instance.py +++ b/src/ifcopenshell-python/ifcopenshell/entity_instance.py @@ -42,7 +42,7 @@ def set_derived_atribute(*args): # inherited attributes) to set that particular # attribute by index. # For example. IFC2X3.IfcWall with have a list of -# 9 methods. The first will point at +# 9 methods. The first will point at # ifcopenshell.ifcopenshell_wrapper.entity_instance.setArgumentAsString # because the first attribute GlobalId ultimately # is of type string. @@ -56,25 +56,28 @@ for nm in ifcopenshell_wrapper.schema_names(): for decl in schema.declarations(): if hasattr(decl, "argument_types"): fq_name = ".".join((nm, decl.name())) - + # get type strings as reported by IfcOpenShell C++ type_strs = decl.argument_types() - + # convert case for setter function type_strs = [x.title().replace(" ", "") for x in type_strs] - + # binary and enumeration are passed from python as string as well type_strs = [x.replace("Binary", "String") for x in type_strs] type_strs = [x.replace("Enumeration", "String") for x in type_strs] - + # prefix to get method names fn_names = ["setArgumentAs" + x for x in type_strs] - + # resolve to actual functions in wrapper functions = [ - set_derived_atribute if mname == "setArgumentAsDerived" else getattr(ifcopenshell_wrapper.entity_instance, mname) \ - for mname in fn_names] - + set_derived_atribute + if mname == "setArgumentAsDerived" + else getattr(ifcopenshell_wrapper.entity_instance, mname) + for mname in fn_names + ] + _method_dict[fq_name] = functions @@ -177,13 +180,13 @@ class entity_instance(object): if self.method_list is None: super(entity_instance, self).__setattr__("method_list", _method_dict[self.is_a(True)]) - + method = self.method_list[idx] - + if value is None: if method is not set_derived_atribute: self.wrapped_data.setArgumentAsNull(idx) - else: + else: self.method_list[idx](self.wrapped_data, idx, entity_instance.unwrap_value(value)) return value diff --git a/src/ifcopenshell-python/ifcopenshell/express/header.py b/src/ifcopenshell-python/ifcopenshell/express/header.py index b9961456c1..bfa583b416 100644 --- a/src/ifcopenshell-python/ifcopenshell/express/header.py +++ b/src/ifcopenshell-python/ifcopenshell/express/header.py @@ -26,13 +26,16 @@ import documentation from collections import defaultdict + class Header(codegen.Base): def __init__(self, mapping): declarations = [] case_lookup = lambda nm: [k for k in mapping.schema.keys if k.lower() == nm.lower()][0] case_normalize = lambda nm: nm if nm.startswith("IfcUtil::") else case_lookup(nm) - create_supertype_statement = lambda nms: ", ".join("public %s %s" % ("" if c.startswith("IfcUtil::") else "",c) for c in nms) + create_supertype_statement = lambda nms: ", ".join( + "public %s %s" % ("" if c.startswith("IfcUtil::") else "", c) for c in nms + ) write = lambda str, **kwargs: declarations.append( str @@ -80,18 +83,24 @@ class Header(codegen.Base): else: superclasses.append("IfcUtil::IfcBaseType") superclasses.extend(get_select_super_types(name, bases=all_superclasses)) - - is_emitted = lambda nm: nm == "IfcUtil::IfcBaseType" or nm in mapping.schema.selects or nm.lower() in emitted_simpletypes + + is_emitted = ( + lambda nm: nm == "IfcUtil::IfcBaseType" + or nm in mapping.schema.selects + or nm.lower() in emitted_simpletypes + ) if not all(map(is_emitted, superclasses)): continue - + superclasses = list(map(case_normalize, superclasses)) emitted_simpletypes.add(name.lower()) superclass_statement = create_supertype_statement(superclasses) - write(templates.simpletype, name=name, type=type_str, attr_type=attr_type, superclass=superclass_statement) + write( + templates.simpletype, name=name, type=type_str, attr_type=attr_type, superclass=superclass_statement + ) class_definitions = [] @@ -149,7 +158,7 @@ class Header(codegen.Base): supertypes.extend(get_select_super_types(name, bases=all_supertypes)) supertypes = list(map(case_normalize, supertypes)) superclass = create_supertype_statement(supertypes) - + argument_count = mapping.argument_count(type) argument_start = argument_count - len(type.attributes) diff --git a/src/ifcopenshell-python/ifcopenshell/express/implementation.py b/src/ifcopenshell-python/ifcopenshell/express/implementation.py index 21ee215a8c..3b0ae4a783 100644 --- a/src/ifcopenshell-python/ifcopenshell/express/implementation.py +++ b/src/ifcopenshell-python/ifcopenshell/express/implementation.py @@ -92,14 +92,16 @@ class Implementation(codegen.Base): else: return templates.get_attr_stmt - null_check = '' + null_check = "" if arg["is_optional"]: - attr_check = "if(!data_->getArgument(%d) || data_->getArgument(%d)->isNull()) { return %%s; }" % (arg["index"] - 1, arg["index"] - 1) + attr_check = ( + "if(!data_->getArgument(%d) || data_->getArgument(%d)->isNull()) { return %%s; }" + % (arg["index"] - 1, arg["index"] - 1) + ) if "boost::optional" in arg["full_type"]: null_check = attr_check % "boost::none" else: null_check = attr_check % "nullptr" - tmpl = find_template(arg) write_attr( @@ -115,9 +117,11 @@ class Implementation(codegen.Base): "index": arg["index"] - 1, "type": arg["full_type"].replace("::Value", ""), "non_optional_type": arg["non_optional_type"].replace("::Value", ""), - "non_optional_type_no_pointer": arg["non_optional_type"].replace("::Value", "").replace("*", ""), + "non_optional_type_no_pointer": arg["non_optional_type"] + .replace("::Value", "") + .replace("*", ""), "list_instance_type": arg["list_instance_type"], - "null_check": null_check + "null_check": null_check, }, ) @@ -143,10 +147,10 @@ class Implementation(codegen.Base): schema_name_upper=schema_name_upper, body=tmpl % { - "index": arg["index"] - 1, + "index": arg["index"] - 1, "type": arg["full_type"].replace("::Value", ""), "non_optional_type": arg["non_optional_type"].replace("::Value", ""), - "star_if_optional": "*" if "boost::optional" in arg["full_type"] else "" + "star_if_optional": "*" if "boost::optional" in arg["full_type"] else "", }, ) diff --git a/src/ifcopenshell-python/ifcopenshell/express/mapping.py b/src/ifcopenshell-python/ifcopenshell/express/mapping.py index f3da405dd9..19554ef1ca 100644 --- a/src/ifcopenshell-python/ifcopenshell/express/mapping.py +++ b/src/ifcopenshell-python/ifcopenshell/express/mapping.py @@ -142,10 +142,13 @@ class Mapping: raise ValueError("Unable to map type %r for attribute %r" % (type, attr)) ty = _make_argument_type(attr.type if hasattr(attr, "type") else attr) - if ty == "TRIBOOL": ty = "LOGICAL" - + if ty == "TRIBOOL": + ty = "LOGICAL" + if ty not in self.supported_argument_types: - import pdb; pdb.set_trace() + import pdb + + pdb.set_trace() print("Attribute %r mapped as 'unknown'" % (attr), file=sys.stderr) ty = "UNKNOWN" return "IfcUtil::Argument_%s" % ty @@ -175,7 +178,7 @@ class Mapping: ty = self.get_parameter_type(attr_type.type if is_nested_list else attr_type) # We do not use pointers in aggregate_of. aggregate_of has member vector ty = ty.replace("*", "") - + if self.schema.is_select(attr_type.type): type_str = templates.untyped_list elif self.schema.is_simpletype(ty) or str(ty) in self.express_to_cpp_typemapping.values(): diff --git a/src/ifcopenshell-python/ifcopenshell/geom/main.py b/src/ifcopenshell-python/ifcopenshell/geom/main.py index 2993908c16..bf01611642 100644 --- a/src/ifcopenshell-python/ifcopenshell/geom/main.py +++ b/src/ifcopenshell-python/ifcopenshell/geom/main.py @@ -57,6 +57,7 @@ if has_occ: # nb: we just subclass serializer settings, so in python # we do not differentiate between the two setting types + class settings(ifcopenshell_wrapper.SerializerSettings): if has_occ: USE_PYTHON_OPENCASCADE = -1 @@ -245,32 +246,35 @@ def make_shape_function(fn): serialise = make_shape_function(ifcopenshell_wrapper.serialise) tesselate = make_shape_function(ifcopenshell_wrapper.tesselate) + def wrap_buffer_creation(fn): - """ + """ Python does not have automatic casts. The C++ serializers accept a stream_or_filename which in C++ can be automatically constructed from a filename string. In Python we have to implement this cast/construction explicitly. """ - + def transform_string(v): if isinstance(v, str): return ifcopenshell_wrapper.buffer(v) else: return v + def inner(*args): return fn(*map(transform_string, args)) + return inner serializer_dict = {} -serializer_dict['obj'] = wrap_buffer_creation(ifcopenshell_wrapper.WaveFrontOBJSerializer) -serializer_dict['svg'] = wrap_buffer_creation(ifcopenshell_wrapper.SvgSerializer) -serializer_dict['buffer'] = ifcopenshell_wrapper.buffer +serializer_dict["obj"] = wrap_buffer_creation(ifcopenshell_wrapper.WaveFrontOBJSerializer) +serializer_dict["svg"] = wrap_buffer_creation(ifcopenshell_wrapper.SvgSerializer) +serializer_dict["buffer"] = ifcopenshell_wrapper.buffer try: # HdfSerializer doesn't support writing to a buffer (obviously) only to filename # so no wrap_buffer_creation() - serializer_dict['hdf5'] = ifcopenshell_wrapper.HdfSerializer -except: pass - -serializers = type('serializers', (), serializer_dict) + serializer_dict["hdf5"] = ifcopenshell_wrapper.HdfSerializer +except: + pass +serializers = type("serializers", (), serializer_dict) diff --git a/src/ifcopenshell-python/ifcopenshell/util/schema.py b/src/ifcopenshell-python/ifcopenshell/util/schema.py index ed2c5a0cdb..fe652b8552 100644 --- a/src/ifcopenshell-python/ifcopenshell/util/schema.py +++ b/src/ifcopenshell-python/ifcopenshell/util/schema.py @@ -86,7 +86,7 @@ class Migrator: "TransverseBarSpacing": 1, # Manual additions from experience "InteriorOrExteriorSpace": "NOTDEFINED", - "AssemblyPlace": "NOTDEFINED", # See bug https://github.com/Autodesk/revit-ifc/issues/395 + "AssemblyPlace": "NOTDEFINED", # See bug https://github.com/Autodesk/revit-ifc/issues/395 } self.default_entities = { "CurrentValue": None, diff --git a/src/ifcopenshell-python/test/api/context/test_edit_context.py b/src/ifcopenshell-python/test/api/context/test_edit_context.py index 28f4145b15..d0cb9448b9 100644 --- a/src/ifcopenshell-python/test/api/context/test_edit_context.py +++ b/src/ifcopenshell-python/test/api/context/test_edit_context.py @@ -5,12 +5,17 @@ import ifcopenshell.api class TestEditContext(test.bootstrap.IFC4): def test_editing_a_context(self): context = self.file.createIfcGeometricRepresentationContext() - ifcopenshell.api.run("context.edit_context", self.file, context=context, attributes={ - "ContextIdentifier": "ContextIdentifier", - "ContextType": "ContextType", - "CoordinateSpaceDimension": 1, - "Precision": 1, - }) + ifcopenshell.api.run( + "context.edit_context", + self.file, + context=context, + attributes={ + "ContextIdentifier": "ContextIdentifier", + "ContextType": "ContextType", + "CoordinateSpaceDimension": 1, + "Precision": 1, + }, + ) assert context.ContextIdentifier == "ContextIdentifier" assert context.ContextType == "ContextType" assert context.CoordinateSpaceDimension == 1 @@ -18,13 +23,18 @@ class TestEditContext(test.bootstrap.IFC4): def test_editing_a_subcontext(self): subcontext = self.file.createIfcGeometricRepresentationSubcontext() - ifcopenshell.api.run("context.edit_context", self.file, context=subcontext, attributes={ - "ContextIdentifier": "ContextIdentifier", - "ContextType": "ContextType", - "TargetScale": 0.5, - "TargetView": "MODEL_VIEW", - "UserDefinedTargetView": "UserDefinedTargetView", - }) + ifcopenshell.api.run( + "context.edit_context", + self.file, + context=subcontext, + attributes={ + "ContextIdentifier": "ContextIdentifier", + "ContextType": "ContextType", + "TargetScale": 0.5, + "TargetView": "MODEL_VIEW", + "UserDefinedTargetView": "UserDefinedTargetView", + }, + ) assert subcontext.ContextIdentifier == "ContextIdentifier" assert subcontext.ContextType == "ContextType" assert subcontext.TargetScale == 0.5 diff --git a/src/ifcopenshell-python/test/api/drawing/test_edit_text_literal.py b/src/ifcopenshell-python/test/api/drawing/test_edit_text_literal.py index 967cf1d705..6569ecc2ae 100644 --- a/src/ifcopenshell-python/test/api/drawing/test_edit_text_literal.py +++ b/src/ifcopenshell-python/test/api/drawing/test_edit_text_literal.py @@ -5,11 +5,16 @@ import ifcopenshell.api class TestEditTextLiteral(test.bootstrap.IFC4): def test_run(self): text = self.file.createIfcTextLiteralWithExtent() - ifcopenshell.api.run("drawing.edit_text_literal", self.file, text_literal=text, attributes={ - "Literal": "Literal", - "Path": "RIGHT", - "BoxAlignment": "middle", - }) + ifcopenshell.api.run( + "drawing.edit_text_literal", + self.file, + text_literal=text, + attributes={ + "Literal": "Literal", + "Path": "RIGHT", + "BoxAlignment": "middle", + }, + ) assert text.Literal == "Literal" assert text.Path == "RIGHT" assert text.BoxAlignment == "middle" diff --git a/src/ifcopenshell-python/test/api/geometry/test_remove_representation.py b/src/ifcopenshell-python/test/api/geometry/test_remove_representation.py index 8f5ddecdf7..6476960216 100644 --- a/src/ifcopenshell-python/test/api/geometry/test_remove_representation.py +++ b/src/ifcopenshell-python/test/api/geometry/test_remove_representation.py @@ -36,11 +36,7 @@ class TestRemoveRepresentation(test.bootstrap.IFC4): self.file.createIfcWallType(RepresentationMaps=[representation_map]) representation = self.file.createIfcShapeRepresentation( RepresentationType="MappedRepresentation", - Items=[ - self.file.createIfcMappedItem( - MappingTarget=representation_map - ) - ], + Items=[self.file.createIfcMappedItem(MappingTarget=representation_map)], ) assert len(self.file.by_type("IfcShapeRepresentation")) == 2 ifcopenshell.api.run("geometry.remove_representation", self.file, representation=representation) diff --git a/src/ifcopenshell-python/test/api/grid/test_create_grid_axis.py b/src/ifcopenshell-python/test/api/grid/test_create_grid_axis.py index d6ec2bab62..0fa054e97f 100644 --- a/src/ifcopenshell-python/test/api/grid/test_create_grid_axis.py +++ b/src/ifcopenshell-python/test/api/grid/test_create_grid_axis.py @@ -14,4 +14,4 @@ class TestCreateGridAxis(test.bootstrap.IFC4): axis2 = ifcopenshell.api.run( "grid.create_grid_axis", self.file, axis_tag="axis_tag", same_sense=True, uvw_axes="UAxes", grid=grid ) - assert grid.UAxes == (axis,axis2) + assert grid.UAxes == (axis, axis2) diff --git a/src/ifcopenshell-python/test/api/library/test_edit_library.py b/src/ifcopenshell-python/test/api/library/test_edit_library.py index b49cab7cbf..77dd610a39 100644 --- a/src/ifcopenshell-python/test/api/library/test_edit_library.py +++ b/src/ifcopenshell-python/test/api/library/test_edit_library.py @@ -5,13 +5,18 @@ import ifcopenshell.api class TestEditLibrary(test.bootstrap.IFC4): def test_editing_a_library(self): library = self.file.createIfcLibraryInformation() - ifcopenshell.api.run("library.edit_library", self.file, library=library, attributes={ - "Name": "Name", - "Version": "Version", - "VersionDate": "VersionDate", - "Location": "Location", - "Description": "Description", - }) + ifcopenshell.api.run( + "library.edit_library", + self.file, + library=library, + attributes={ + "Name": "Name", + "Version": "Version", + "VersionDate": "VersionDate", + "Location": "Location", + "Description": "Description", + }, + ) assert library.Name == "Name" assert library.Version == "Version" assert library.VersionDate == "VersionDate" diff --git a/src/ifcopenshell-python/test/api/library/test_edit_reference.py b/src/ifcopenshell-python/test/api/library/test_edit_reference.py index 28d73dd022..1ebc3a4ecd 100644 --- a/src/ifcopenshell-python/test/api/library/test_edit_reference.py +++ b/src/ifcopenshell-python/test/api/library/test_edit_reference.py @@ -5,13 +5,18 @@ import ifcopenshell.api class TestEditReference(test.bootstrap.IFC4): def test_editing_a_reference(self): reference = self.file.createIfcLibraryReference() - ifcopenshell.api.run("library.edit_reference", self.file, reference=reference, attributes={ - "Location": "Location", - "Identification": "Identification", - "Name": "Name", - "Description": "Description", - "Language": "Language", - }) + ifcopenshell.api.run( + "library.edit_reference", + self.file, + reference=reference, + attributes={ + "Location": "Location", + "Identification": "Identification", + "Name": "Name", + "Description": "Description", + "Language": "Language", + }, + ) assert reference.Location == "Location" assert reference.Identification == "Identification" assert reference.Name == "Name" diff --git a/src/ifcopenshell-python/test/api/library/test_remove_library.py b/src/ifcopenshell-python/test/api/library/test_remove_library.py index 2f77dc78ce..3c20f8ac2f 100644 --- a/src/ifcopenshell-python/test/api/library/test_remove_library.py +++ b/src/ifcopenshell-python/test/api/library/test_remove_library.py @@ -12,8 +12,8 @@ class TestRemoveLibrary(test.bootstrap.IFC4): library = self.file.createIfcLibraryInformation() reference1 = self.file.createIfcLibraryReference(ReferencedLibrary=library) reference2 = self.file.createIfcLibraryReference(ReferencedLibrary=library) - self.file.createIfcRelAssociatesLibrary(GlobalId='foo', RelatingLibrary=library) - self.file.createIfcRelAssociatesLibrary(GlobalId='bar', RelatingLibrary=reference1) + self.file.createIfcRelAssociatesLibrary(GlobalId="foo", RelatingLibrary=library) + self.file.createIfcRelAssociatesLibrary(GlobalId="bar", RelatingLibrary=reference1) ifcopenshell.api.run("library.remove_library", self.file, library=library) assert len(self.file.by_type("IfcLibraryReference")) == 0 assert len(self.file.by_type("IfcRelAssociatesLibrary")) == 0 diff --git a/src/ifcopenshell-python/test/api/owner/test_add_application.py b/src/ifcopenshell-python/test/api/owner/test_add_application.py index f712c894be..a10a5ac5ea 100644 --- a/src/ifcopenshell-python/test/api/owner/test_add_application.py +++ b/src/ifcopenshell-python/test/api/owner/test_add_application.py @@ -12,7 +12,10 @@ class TestAddApplication(test.bootstrap.IFC4): assert developer.is_a("IfcOrganization") assert developer.Identification == "IfcOpenShell" assert developer.Name == "IfcOpenShell" - assert developer.Description == "IfcOpenShell is an open source software library that helps users and software developers to work with IFC data." + assert ( + developer.Description + == "IfcOpenShell is an open source software library that helps users and software developers to work with IFC data." + ) assert developer.Roles[0].Role == "USERDEFINED" assert developer.Roles[0].UserDefinedRole == "CONTRIBUTOR" assert developer.Addresses[0].is_a("IfcTelecomAddress") diff --git a/src/ifcopenshell-python/test/api/owner/test_create_owner_history.py b/src/ifcopenshell-python/test/api/owner/test_create_owner_history.py index 1c590b48fb..c2999c37d1 100644 --- a/src/ifcopenshell-python/test/api/owner/test_create_owner_history.py +++ b/src/ifcopenshell-python/test/api/owner/test_create_owner_history.py @@ -13,8 +13,8 @@ class TestCreateOwnerHistory(test.bootstrap.IFC4): old_get_application = ifcopenshell.api.owner.settings.get_application user = self.file.createIfcPersonAndOrganization() application = self.file.createIfcApplication() - ifcopenshell.api.owner.settings.get_user = lambda x : user - ifcopenshell.api.owner.settings.get_application = lambda x : application + ifcopenshell.api.owner.settings.get_user = lambda x: user + ifcopenshell.api.owner.settings.get_application = lambda x: application history = ifcopenshell.api.run("owner.create_owner_history", self.file) ifcopenshell.api.owner.settings.get_user = old_get_user ifcopenshell.api.owner.settings.get_application = old_get_application diff --git a/src/ifcopenshell-python/test/api/owner/test_edit_address.py b/src/ifcopenshell-python/test/api/owner/test_edit_address.py index 6b288f74b2..12fd500b99 100644 --- a/src/ifcopenshell-python/test/api/owner/test_edit_address.py +++ b/src/ifcopenshell-python/test/api/owner/test_edit_address.py @@ -5,18 +5,23 @@ import ifcopenshell.api class TestEditAddress(test.bootstrap.IFC4): def test_editing_a_postal_address(self): address = self.file.createIfcPostalAddress() - ifcopenshell.api.run("owner.edit_address", self.file, address=address, attributes={ - "Purpose": "OFFICE", - "Description": "Description", - "UserDefinedPurpose": "UserDefinedPurpose", - "InternalLocation": "InternalLocation", - "AddressLines": ["Address", "Lines"], - "PostalBox": "PostalBox", - "Town": "Town", - "Region": "Region", - "PostalCode": "PostalCode", - "Country": "Country", - }) + ifcopenshell.api.run( + "owner.edit_address", + self.file, + address=address, + attributes={ + "Purpose": "OFFICE", + "Description": "Description", + "UserDefinedPurpose": "UserDefinedPurpose", + "InternalLocation": "InternalLocation", + "AddressLines": ["Address", "Lines"], + "PostalBox": "PostalBox", + "Town": "Town", + "Region": "Region", + "PostalCode": "PostalCode", + "Country": "Country", + }, + ) assert address.Purpose == "OFFICE" assert address.Description == "Description" assert address.UserDefinedPurpose == "UserDefinedPurpose" @@ -30,17 +35,22 @@ class TestEditAddress(test.bootstrap.IFC4): def test_editing_a_telecom_address(self): address = self.file.createIfcTelecomAddress() - ifcopenshell.api.run("owner.edit_address", self.file, address=address, attributes={ - "Purpose": "OFFICE", - "Description": "Description", - "UserDefinedPurpose": "UserDefinedPurpose", - "TelephoneNumbers": ["Telephone", "Numbers"], - "FacsimileNumbers": ["Facsimile", "Numbers"], - "PagerNumber": "PagerNumber", - "ElectronicMailAddresses": ["Electronic", "Mail", "Addresses"], - "WWWHomePageURL": "WWWHomePageURL", - "MessagingIDs": ["Messaging", "IDs"], - }) + ifcopenshell.api.run( + "owner.edit_address", + self.file, + address=address, + attributes={ + "Purpose": "OFFICE", + "Description": "Description", + "UserDefinedPurpose": "UserDefinedPurpose", + "TelephoneNumbers": ["Telephone", "Numbers"], + "FacsimileNumbers": ["Facsimile", "Numbers"], + "PagerNumber": "PagerNumber", + "ElectronicMailAddresses": ["Electronic", "Mail", "Addresses"], + "WWWHomePageURL": "WWWHomePageURL", + "MessagingIDs": ["Messaging", "IDs"], + }, + ) assert address.Purpose == "OFFICE" assert address.Description == "Description" assert address.UserDefinedPurpose == "UserDefinedPurpose" diff --git a/src/ifcopenshell-python/test/api/owner/test_edit_organisation.py b/src/ifcopenshell-python/test/api/owner/test_edit_organisation.py index 94c6783210..cd35604fac 100644 --- a/src/ifcopenshell-python/test/api/owner/test_edit_organisation.py +++ b/src/ifcopenshell-python/test/api/owner/test_edit_organisation.py @@ -5,11 +5,16 @@ import ifcopenshell.api class TestEditOrganisation(test.bootstrap.IFC4): def test_editing_a_organisation(self): organisation = self.file.createIfcOrganization() - ifcopenshell.api.run("owner.edit_organisation", self.file, organisation=organisation, attributes={ - "Identification": "Identification", - "Name": "Name", - "Description": "Description", - }) + ifcopenshell.api.run( + "owner.edit_organisation", + self.file, + organisation=organisation, + attributes={ + "Identification": "Identification", + "Name": "Name", + "Description": "Description", + }, + ) assert organisation.Identification == "Identification" assert organisation.Name == "Name" assert organisation.Description == "Description" diff --git a/src/ifcopenshell-python/test/api/owner/test_edit_person.py b/src/ifcopenshell-python/test/api/owner/test_edit_person.py index 57ed922f9c..10af296175 100644 --- a/src/ifcopenshell-python/test/api/owner/test_edit_person.py +++ b/src/ifcopenshell-python/test/api/owner/test_edit_person.py @@ -5,14 +5,19 @@ import ifcopenshell.api class TestEditPerson(test.bootstrap.IFC4): def test_editing_a_person(self): person = self.file.createIfcPerson() - ifcopenshell.api.run("owner.edit_person", self.file, person=person, attributes={ - "Identification": "Identification", - "FamilyName": "FamilyName", - "GivenName": "GivenName", - "MiddleNames": ["Middle", "Names"], - "PrefixTitles": ["Prefix", "Titles"], - "SuffixTitles": ["Suffix", "Titles"], - }) + ifcopenshell.api.run( + "owner.edit_person", + self.file, + person=person, + attributes={ + "Identification": "Identification", + "FamilyName": "FamilyName", + "GivenName": "GivenName", + "MiddleNames": ["Middle", "Names"], + "PrefixTitles": ["Prefix", "Titles"], + "SuffixTitles": ["Suffix", "Titles"], + }, + ) assert person.Identification == "Identification" assert person.FamilyName == "FamilyName" assert person.GivenName == "GivenName" diff --git a/src/ifcopenshell-python/test/api/owner/test_edit_role.py b/src/ifcopenshell-python/test/api/owner/test_edit_role.py index 9f2fb675a1..33f16528e4 100644 --- a/src/ifcopenshell-python/test/api/owner/test_edit_role.py +++ b/src/ifcopenshell-python/test/api/owner/test_edit_role.py @@ -5,11 +5,12 @@ import ifcopenshell.api class TestEditRole(test.bootstrap.IFC4): def test_editing_a_role(self): role = self.file.createIfcActorRole() - ifcopenshell.api.run("owner.edit_role", self.file, role=role, attributes={ - "Role": "ARCHITECT", - "UserDefinedRole": "UserDefinedRole", - "Description": "Description" - }) + ifcopenshell.api.run( + "owner.edit_role", + self.file, + role=role, + attributes={"Role": "ARCHITECT", "UserDefinedRole": "UserDefinedRole", "Description": "Description"}, + ) assert role.Role == "ARCHITECT" assert role.UserDefinedRole == "UserDefinedRole" assert role.Description == "Description" diff --git a/src/ifcopenshell-python/test/api/owner/test_update_owner_history.py b/src/ifcopenshell-python/test/api/owner/test_update_owner_history.py index dda8fcabae..15bb1469b7 100644 --- a/src/ifcopenshell-python/test/api/owner/test_update_owner_history.py +++ b/src/ifcopenshell-python/test/api/owner/test_update_owner_history.py @@ -10,8 +10,8 @@ class TestUpdateOwnerHistory(test.bootstrap.IFC4): user = self.file.createIfcPersonAndOrganization() application = self.file.createIfcApplication() - ifcopenshell.api.owner.settings.get_user = lambda x : user - ifcopenshell.api.owner.settings.get_application = lambda x : application + ifcopenshell.api.owner.settings.get_user = lambda x: user + ifcopenshell.api.owner.settings.get_application = lambda x: application element = self.file.createIfcWall() history = ifcopenshell.api.run("owner.update_owner_history", self.file, element=element) @@ -31,8 +31,8 @@ class TestUpdateOwnerHistory(test.bootstrap.IFC4): user = self.file.createIfcPersonAndOrganization() application = self.file.createIfcApplication() - ifcopenshell.api.owner.settings.get_user = lambda x : user - ifcopenshell.api.owner.settings.get_application = lambda x : application + ifcopenshell.api.owner.settings.get_user = lambda x: user + ifcopenshell.api.owner.settings.get_application = lambda x: application element = self.file.createIfcWall() old_history = ifcopenshell.api.run("owner.create_owner_history", self.file) @@ -55,8 +55,8 @@ class TestUpdateOwnerHistory(test.bootstrap.IFC4): user = self.file.createIfcPersonAndOrganization() application = self.file.createIfcApplication() - ifcopenshell.api.owner.settings.get_user = lambda x : user - ifcopenshell.api.owner.settings.get_application = lambda x : application + ifcopenshell.api.owner.settings.get_user = lambda x: user + ifcopenshell.api.owner.settings.get_application = lambda x: application element = self.file.createIfcWall() element2 = self.file.createIfcWall() diff --git a/src/ifcopenshell-python/test/api/resource/test_calculate_resource_work.py b/src/ifcopenshell-python/test/api/resource/test_calculate_resource_work.py index f9a8a59a25..29339e139f 100644 --- a/src/ifcopenshell-python/test/api/resource/test_calculate_resource_work.py +++ b/src/ifcopenshell-python/test/api/resource/test_calculate_resource_work.py @@ -8,11 +8,16 @@ class TestCalculateResourceWork(test.bootstrap.IFC4): resource = ifcopenshell.api.run("resource.add_resource", self.file, ifc_class="IfcLaborResource") pset = ifcopenshell.api.run("pset.add_pset", self.file, product=resource, name="EPset_Productivity") - ifcopenshell.api.run("pset.edit_pset", self.file, pset=pset, properties={ - "BaseQuantityConsumed": "P0.5D", - "BaseQuantityProducedName": "GrossVolume", - "BaseQuantityProducedValue": 5, - }) + ifcopenshell.api.run( + "pset.edit_pset", + self.file, + pset=pset, + properties={ + "BaseQuantityConsumed": "P0.5D", + "BaseQuantityProducedName": "GrossVolume", + "BaseQuantityProducedValue": 5, + }, + ) slab = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcSlab") qto = ifcopenshell.api.run("pset.add_qto", self.file, product=slab, name="Qto_SlabBaseQuantities") @@ -24,17 +29,21 @@ class TestCalculateResourceWork(test.bootstrap.IFC4): ifcopenshell.api.run("resource.calculate_resource_work", self.file, resource=resource) assert resource.Usage.ScheduleWork == "P2.0D" - def test_calculating_resource_work_based_on_an_hourly_productivity_rate(self): ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcProject") resource = ifcopenshell.api.run("resource.add_resource", self.file, ifc_class="IfcLaborResource") pset = ifcopenshell.api.run("pset.add_pset", self.file, product=resource, name="EPset_Productivity") - ifcopenshell.api.run("pset.edit_pset", self.file, pset=pset, properties={ - "BaseQuantityConsumed": "PT1H", - "BaseQuantityProducedName": "GrossVolume", - "BaseQuantityProducedValue": 5, - }) + ifcopenshell.api.run( + "pset.edit_pset", + self.file, + pset=pset, + properties={ + "BaseQuantityConsumed": "PT1H", + "BaseQuantityProducedName": "GrossVolume", + "BaseQuantityProducedValue": 5, + }, + ) slab = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcSlab") qto = ifcopenshell.api.run("pset.add_qto", self.file, product=slab, name="Qto_SlabBaseQuantities") @@ -74,11 +83,16 @@ class TestCalculateResourceWork(test.bootstrap.IFC4): resource = ifcopenshell.api.run("resource.add_resource", self.file, ifc_class="IfcLaborResource") pset = ifcopenshell.api.run("pset.add_pset", self.file, product=resource, name="EPset_Productivity") - ifcopenshell.api.run("pset.edit_pset", self.file, pset=pset, properties={ - "BaseQuantityConsumed": "PT1H", - "BaseQuantityProducedName": "Count", - "BaseQuantityProducedValue": 2, - }) + ifcopenshell.api.run( + "pset.edit_pset", + self.file, + pset=pset, + properties={ + "BaseQuantityConsumed": "PT1H", + "BaseQuantityProducedName": "Count", + "BaseQuantityProducedValue": 2, + }, + ) slab = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcSlab") qto = ifcopenshell.api.run("pset.add_qto", self.file, product=slab, name="Qto_SlabBaseQuantities") diff --git a/src/ifcopenshell-python/test/api/structural/test_add_structural_analysis_model.py b/src/ifcopenshell-python/test/api/structural/test_add_structural_analysis_model.py index d3af416da8..cbff5eee21 100644 --- a/src/ifcopenshell-python/test/api/structural/test_add_structural_analysis_model.py +++ b/src/ifcopenshell-python/test/api/structural/test_add_structural_analysis_model.py @@ -3,6 +3,7 @@ import pytest import test.bootstrap import ifcopenshell.api + class TestAddStructuralAnalysisModel(test.bootstrap.IFC4): def test_adding_a_structural_analysis_model(self): subject = ifcopenshell.api.run("structural.add_structural_analysis_model", self.file) diff --git a/src/ifcopenshell-python/test/api/structural/test_assign_structural_analysis_model.py b/src/ifcopenshell-python/test/api/structural/test_assign_structural_analysis_model.py index 04f1010f73..24127dd234 100644 --- a/src/ifcopenshell-python/test/api/structural/test_assign_structural_analysis_model.py +++ b/src/ifcopenshell-python/test/api/structural/test_assign_structural_analysis_model.py @@ -3,15 +3,12 @@ import pytest import test.bootstrap import ifcopenshell.api + class TestAssignStructuralAnalysisModel(test.bootstrap.IFC4): def test_assigning_a_structural_analysis_model(self): subject = ifcopenshell.api.run("structural.add_structural_analysis_model", self.file) product = ifcopenshell.api.run( - "root.create_entity", - self.file, - ifc_class="IfcStructuralMember", - predefined_type=None, - name=None + "root.create_entity", self.file, ifc_class="IfcStructuralMember", predefined_type=None, name=None ) rel = ifcopenshell.api.run( "structural.assign_structural_analysis_model", diff --git a/src/ifcopenshell-python/test/api/structural/test_edit_structural_analysis_model.py b/src/ifcopenshell-python/test/api/structural/test_edit_structural_analysis_model.py index 1b53b48035..221cab937b 100644 --- a/src/ifcopenshell-python/test/api/structural/test_edit_structural_analysis_model.py +++ b/src/ifcopenshell-python/test/api/structural/test_edit_structural_analysis_model.py @@ -3,6 +3,7 @@ import pytest import test.bootstrap import ifcopenshell.api + class TestEditStructuralAnalysisModel(test.bootstrap.IFC4): def test_editing_a_structural_analysis_model(self): subject = ifcopenshell.api.run("structural.add_structural_analysis_model", self.file) @@ -10,10 +11,7 @@ class TestEditStructuralAnalysisModel(test.bootstrap.IFC4): "structural.edit_structural_analysis_model", self.file, structural_analysis_model=subject, - attributes={ - "Name": "My edited model", - "Description": "Description of my model" - } + attributes={"Name": "My edited model", "Description": "Description of my model"}, ) models = self.file.by_type("IfcStructuralAnalysisModel") assert subject == models[0] diff --git a/src/ifcopenshell-python/test/api/structural/test_remove_structural_analysis_model.py b/src/ifcopenshell-python/test/api/structural/test_remove_structural_analysis_model.py index 00fa44e875..30eca15b66 100644 --- a/src/ifcopenshell-python/test/api/structural/test_remove_structural_analysis_model.py +++ b/src/ifcopenshell-python/test/api/structural/test_remove_structural_analysis_model.py @@ -3,6 +3,7 @@ import pytest import test.bootstrap import ifcopenshell.api + class TestRemoveStructuralAnalysisModel(test.bootstrap.IFC4): def test_removing_a_structural_analysis_model(self): subject = ifcopenshell.api.run("structural.add_structural_analysis_model", self.file) @@ -10,7 +11,6 @@ class TestRemoveStructuralAnalysisModel(test.bootstrap.IFC4): "structural.remove_structural_analysis_model", self.file, structural_analysis_model=subject, - ) models = self.file.by_type("IfcStructuralAnalysisModel") assert len(models) == 0 diff --git a/src/ifcopenshell-python/test/api/structural/test_unassign_structural_analysis_model.py b/src/ifcopenshell-python/test/api/structural/test_unassign_structural_analysis_model.py index d6c0b25540..c9ef100653 100644 --- a/src/ifcopenshell-python/test/api/structural/test_unassign_structural_analysis_model.py +++ b/src/ifcopenshell-python/test/api/structural/test_unassign_structural_analysis_model.py @@ -3,15 +3,12 @@ import pytest import test.bootstrap import ifcopenshell.api + class TestUnassignStructuralAnalysisModel(test.bootstrap.IFC4): def test_unassigning_a_structural_analysis_model(self): subject = ifcopenshell.api.run("structural.add_structural_analysis_model", self.file) product = ifcopenshell.api.run( - "root.create_entity", - self.file, - ifc_class="IfcStructuralMember", - predefined_type=None, - name=None + "root.create_entity", self.file, ifc_class="IfcStructuralMember", predefined_type=None, name=None ) rel = ifcopenshell.api.run( "structural.assign_structural_analysis_model", diff --git a/src/ifcopenshell-python/test/api/unit/test_edit_derived_unit.py b/src/ifcopenshell-python/test/api/unit/test_edit_derived_unit.py index 4e6092b776..b7bdfa265c 100644 --- a/src/ifcopenshell-python/test/api/unit/test_edit_derived_unit.py +++ b/src/ifcopenshell-python/test/api/unit/test_edit_derived_unit.py @@ -5,8 +5,11 @@ import ifcopenshell.api class TestEditDerivedUnit(test.bootstrap.IFC4): def test_run(self): unit = self.file.createIfcDerivedUnit() - ifcopenshell.api.run("unit.edit_derived_unit", self.file, unit=unit, attributes={ - "UnitType": "USERDEFINED", "UserDefinedType": "UserDefinedType" - }) + ifcopenshell.api.run( + "unit.edit_derived_unit", + self.file, + unit=unit, + attributes={"UnitType": "USERDEFINED", "UserDefinedType": "UserDefinedType"}, + ) assert unit.UnitType == "USERDEFINED" assert unit.UserDefinedType == "UserDefinedType" diff --git a/src/ifcopenshell-python/test/api/unit/test_edit_monetary_unit.py b/src/ifcopenshell-python/test/api/unit/test_edit_monetary_unit.py index 3cdbd3a860..b3d258e6ed 100644 --- a/src/ifcopenshell-python/test/api/unit/test_edit_monetary_unit.py +++ b/src/ifcopenshell-python/test/api/unit/test_edit_monetary_unit.py @@ -5,7 +5,5 @@ import ifcopenshell.api class TestEditMonetaryUnit(test.bootstrap.IFC4): def test_run(self): unit = self.file.createIfcMonetaryUnit() - ifcopenshell.api.run("unit.edit_monetary_unit", self.file, unit=unit, attributes={ - "Currency": "FOO" - }) + ifcopenshell.api.run("unit.edit_monetary_unit", self.file, unit=unit, attributes={"Currency": "FOO"}) assert unit.Currency == "FOO" diff --git a/src/ifcopenshell-python/test/test_wall_opening.py b/src/ifcopenshell-python/test/test_wall_opening.py index 267f444fce..ed2752fabb 100644 --- a/src/ifcopenshell-python/test/test_wall_opening.py +++ b/src/ifcopenshell-python/test/test_wall_opening.py @@ -14,33 +14,37 @@ import ifcopenshell.template PERF = False + @dataclass class rect: - width : float - height : float - + width: float + height: float + def build(self, f): return f.createIfcRectangleProfileDef("AREA", None, None, self.width, self.height) - + + @dataclass class circle: - radius : float - + radius: float + def build(self, f): return f.createIfcCircleProfileDef("AREA", None, None, self.radius) + @dataclass class opening: - x : float - z : float - shape : typing.Any - depth : float - direc : tuple = field(default_factory=lambda: (0.0, 0.0, -1.0)) + x: float + z: float + shape: typing.Any + depth: float + direc: tuple = field(default_factory=lambda: (0.0, 0.0, -1.0)) -O = 0., 0., 0. -X = 1., 0., 0. -Y = 0., 1., 0. -Z = 0., 0., 1. + +O = 0.0, 0.0, 0.0 +X = 1.0, 0.0, 0.0 +Y = 0.0, 1.0, 0.0 +Z = 0.0, 0.0, 1.0 # Creates an IfcAxis2Placement3D from Location, Axis and RefDirection specified as Python tuples def create_ifcaxis2placement(f, point=O, dir1=Z, dir2=X): @@ -50,12 +54,14 @@ def create_ifcaxis2placement(f, point=O, dir1=Z, dir2=X): axis2placement = f.createIfcAxis2Placement3D(point, dir1, dir2) return axis2placement + # Creates an IfcLocalPlacement from Location, Axis and RefDirection, specified as Python tuples, and relative placement def create_ifclocalplacement(f, point=O, dir1=Z, dir2=X, relative_to=None): - axis2placement = create_ifcaxis2placement(f,point,dir1,dir2) - ifclocalplacement2 = f.createIfcLocalPlacement(relative_to,axis2placement) + axis2placement = create_ifcaxis2placement(f, point, dir1, dir2) + ifclocalplacement2 = f.createIfcLocalPlacement(relative_to, axis2placement) return ifclocalplacement2 + # Creates an IfcPolyLine from a list of points, specified as Python tuples def create_ifcpolyline(f, point_list): ifcpts = [] @@ -65,6 +71,7 @@ def create_ifcpolyline(f, point_list): polyline = f.createIfcPolyLine(ifcpts) return polyline + # Creates an IfcExtrudedAreaSolid from a list of points, specified as Python tuples def create_ifcextrudedareasolid(f, point_list, ifcaxis2placement, extrude_dir, extrusion): polyline = create_ifcpolyline(f, point_list) @@ -73,6 +80,7 @@ def create_ifcextrudedareasolid(f, point_list, ifcaxis2placement, extrude_dir, e ifcextrudedareasolid = f.createIfcExtrudedAreaSolid(ifcclosedprofile, ifcaxis2placement, ifcdir, extrusion) return ifcextrudedareasolid + def create_case(fn, openings): f = ifcopenshell.template.create() @@ -84,85 +92,131 @@ def create_case(fn, openings): wall_placement = create_ifclocalplacement(f, relative_to=None) extrusion_placement = create_ifcaxis2placement(f, (0.0, 0.0, 0.0), (0.0, 0.0, 1.0), (1.0, 0.0, 0.0)) - point_list_extrusion_area = [(0.0, -0.2, 0.0), (15.0, -0.2, 0.0), (15.0, 0.0, 0.0), (0.0, 0.0, 0.0), (0.0, -0.2, 0.0)] + point_list_extrusion_area = [ + (0.0, -0.2, 0.0), + (15.0, -0.2, 0.0), + (15.0, 0.0, 0.0), + (0.0, 0.0, 0.0), + (0.0, -0.2, 0.0), + ] solid = create_ifcextrudedareasolid(f, point_list_extrusion_area, extrusion_placement, (0.0, 0.0, 1.0), 4.0) body_representation = f.createIfcShapeRepresentation(context, "Body", "SweptSolid", [solid]) product_shape = f.createIfcProductDefinitionShape(None, None, [body_representation]) - wall = f.createIfcWallStandardCase(ifcopenshell.guid.new(), owner_history, "Wall", None, None, wall_placement, product_shape, None) - + wall = f.createIfcWallStandardCase( + ifcopenshell.guid.new(), owner_history, "Wall", None, None, wall_placement, product_shape, None + ) + for opening in openings: - opening_placement = create_ifclocalplacement(f, (opening.x, 0.0, opening.z), (0.0, 1.0, 0.0), (1.0, 0.0, 0.0), wall_placement) - opening_solid = f.createIfcExtrudedAreaSolid(opening.shape.build(f), None, f.createIfcDirection(opening.direc), opening.depth) + opening_placement = create_ifclocalplacement( + f, (opening.x, 0.0, opening.z), (0.0, 1.0, 0.0), (1.0, 0.0, 0.0), wall_placement + ) + opening_solid = f.createIfcExtrudedAreaSolid( + opening.shape.build(f), None, f.createIfcDirection(opening.direc), opening.depth + ) opening_representation = f.createIfcShapeRepresentation(context, "Body", "SweptSolid", [opening_solid]) opening_shape = f.createIfcProductDefinitionShape(None, None, [opening_representation]) - opening_element = f.createIfcOpeningElement(ifcopenshell.guid.new(), owner_history, "Opening", None, None, opening_placement, opening_shape, None) + opening_element = f.createIfcOpeningElement( + ifcopenshell.guid.new(), owner_history, "Opening", None, None, opening_placement, opening_shape, None + ) f.createIfcRelVoidsElement(ifcopenshell.guid.new(), owner_history, None, None, wall, opening_element) f.write(fn) + class TestWallOpenings: def test_all(self): - + cases = [ - ("wall-openings-non-intersecting-rect-circle.ifc", [opening(i * 4.0 + 2.0,2.0,rect(1.0,1.0),0.2) for i in range(3)] + [opening(i * 4.0 + 4.0,2.0,circle(0.5),0.2) for i in range(3)]), - ("wall-openings-intersecting-inner-bounds.ifc", [opening(i * 0.8 + 2.0, i * 0.1 + 1.0,rect(1.0,1.0),0.2) for i in range(15)]), - ("wall-openings-intersecting-with-outer.ifc", [opening(i * 2.0, 4.0,rect(1.0,1.0),0.2) for i in range(15)]), - ("wall-openings-recesses.ifc", [opening(i * 4.0 + 2.0,2.0,rect(1.0,1.0),0.1) for i in range(3)] + [opening(i * 4.0 + 4.0,2.0,circle(0.5),0.1) for i in range(3)]), - ("wall-openings-non-orthogonal.ifc", [opening(i * 4.0 + 2.0,2.0,rect(1.0,1.0),0.3,direc=(1.0, 0.0, -1.0)) for i in range(6)]), - ("wall-openings-contained-in-other.ifc", [opening(2.0,2.0,rect(1.0,1.0),0.2), opening(2.0,2.0,rect(0.5, 0.5),0.2)]), - ("wall-openings-outside-of-outer.ifc", [opening(2.0,2.0,rect(1.0,1.0),0.2), opening(2.0,6.0,rect(1.0,1.0),0.2)]), - ("wall-openings-touching-outer.ifc", [opening(2.0,3.0,rect(2.0,2.0),0.2)]) + ( + "wall-openings-non-intersecting-rect-circle.ifc", + [opening(i * 4.0 + 2.0, 2.0, rect(1.0, 1.0), 0.2) for i in range(3)] + + [opening(i * 4.0 + 4.0, 2.0, circle(0.5), 0.2) for i in range(3)], + ), + ( + "wall-openings-intersecting-inner-bounds.ifc", + [opening(i * 0.8 + 2.0, i * 0.1 + 1.0, rect(1.0, 1.0), 0.2) for i in range(15)], + ), + ( + "wall-openings-intersecting-with-outer.ifc", + [opening(i * 2.0, 4.0, rect(1.0, 1.0), 0.2) for i in range(15)], + ), + ( + "wall-openings-recesses.ifc", + [opening(i * 4.0 + 2.0, 2.0, rect(1.0, 1.0), 0.1) for i in range(3)] + + [opening(i * 4.0 + 4.0, 2.0, circle(0.5), 0.1) for i in range(3)], + ), + ( + "wall-openings-non-orthogonal.ifc", + [opening(i * 4.0 + 2.0, 2.0, rect(1.0, 1.0), 0.3, direc=(1.0, 0.0, -1.0)) for i in range(6)], + ), + ( + "wall-openings-contained-in-other.ifc", + [opening(2.0, 2.0, rect(1.0, 1.0), 0.2), opening(2.0, 2.0, rect(0.5, 0.5), 0.2)], + ), + ( + "wall-openings-outside-of-outer.ifc", + [opening(2.0, 2.0, rect(1.0, 1.0), 0.2), opening(2.0, 6.0, rect(1.0, 1.0), 0.2)], + ), + ("wall-openings-touching-outer.ifc", [opening(2.0, 3.0, rect(2.0, 2.0), 0.2)]), ] checks = [ [(1, "Processed fully in 2D")], [(1, "Intersecting boundaries")], [(1, "Intersecting boundaries")], - [(1, "No second operands can be processed as 2D inner bounds"),(0, "Operand B creates a through hole")], + [(1, "No second operands can be processed as 2D inner bounds"), (0, "Operand B creates a through hole")], [(0, "Operand B 1/6 is an extrusion")], [(1, "Subtraction operand contained in other"), (0, "Subtraction operand outside of outer bound")], - [], #[(1, "Subtraction operand outside of outer bound")], - [(1, "Intersecting boundaries")] + [], # [(1, "Subtraction operand outside of outer bound")], + [(1, "Intersecting boundaries")], ] - for fn in glob.glob("*.log.json"): os.unlink(fn) - pat = re.compile(r'^([\w :]+?)\s*: (\d+\.\d+)') + pat = re.compile(r"^([\w :]+?)\s*: (\d+\.\d+)") result = [] for ci, ((fn, ops), cs) in enumerate(zip(cases, checks), start=1): create_case(fn, ops) - + result.append([fn]) for i in range(2 if PERF else 1): - - args = [shutil.which("IfcConvert") or "IfcConvert", "-qyvvv", fn, fn+".obj", "--log-format", "json", "--log-file", fn+".log.json"] + + args = [ + shutil.which("IfcConvert") or "IfcConvert", + "-qyvvv", + fn, + fn + ".obj", + "--log-format", + "json", + "--log-file", + fn + ".log.json", + ] if i: args.append("--no-2d-boolean") - + ts = [] for j in range(10 if PERF else 1): subprocess.call(args, stdout=subprocess.PIPE) - - log = [json.loads(ln)['message'] for ln in open(fn+".log.json") if ln] + + log = [json.loads(ln)["message"] for ln in open(fn + ".log.json") if ln] perf = dict(x.groups() for x in [re.match(pat, l) for l in log] if x) - + ts.append(float(perf["file geometry conversion"])) - + result[-1].append(sum(ts) / len(ts)) - + if i == 0 and j == 0: for ln, st in cs: assert len([l for l in log if l.startswith(st)]) == ln - + # breakpoint() - + try: import tabulate except: @@ -170,5 +224,6 @@ class TestWallOpenings: print(tabulate.tabulate(result, headers=["file", "", "--no-2d-boolean"], tablefmt="github")) + if __name__ == "__main__": TestWallOpenings().test_all()