diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000000..c40c6cf0dd --- /dev/null +++ b/Dockerfile @@ -0,0 +1,37 @@ +# -*- mode: Dockerfile -*- + +FROM ubuntu:focal + +ARG CHANNEL +ENV CHANNEL=${CHANNEL:-latest} +RUN apt-get update \ + && apt-get install -y \ + vim \ + ssh \ + sudo \ + wget \ + software-properties-common ;\ + rm -rf /var/lib/apt/lists/* + +RUN useradd --user-group --create-home --shell /bin/bash IfcOpenShell ;\ + echo "IfcOpenShell ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers + + +ENV DEBIAN_FRONTEND=noninteractive +RUN echo "deb http://archive.ubuntu.com/ubuntu focal-proposed main restricted" | tee -a /etc/apt/sources.list; \ + echo "deb http://archive.ubuntu.com/ubuntu focal-proposed universe" | tee -a /etc/apt/sources.list; \ + echo "deb http://archive.ubuntu.com/ubuntu focal-proposed multiverse" | tee -a /etc/apt/sources.list; \ + apt-get -qq update; \ + apt-get -y install tzdata dos2unix rsync; \ + apt-get -y install python3 libxml2 liboce-foundation11 liboce-modeling11 liboce-ocaf11 liboce-visualization11 \ + liboce-ocaf-lite11 libpython3.8 libboost-system1.67.0 libboost-program-options1.67.0 \ + libboost-regex1.67.0 libboost-thread1.67.0 libboost-date-time1.67.0; \ + rm -rf /var/lib/apt/lists/* ; + +COPY . /home/IfcOpenShell/ +RUN ls -lrtR /home/IfcOpenShell + +RUN dpkg -i /home/IfcOpenShell/*.deb + +USER IfcOpenShell + diff --git a/src/.gitattributes b/src/.gitattributes new file mode 100644 index 0000000000..1f5bf09722 --- /dev/null +++ b/src/.gitattributes @@ -0,0 +1,64 @@ +# **************************************************************************** +# line endings + +# to suppress line ending changes in github, add ?w=1 at link end of a diff + +# for more information see +# FreeCAD source code src/Mod/.gitattributes +# FreeCAD forum topic https://forum.freecadweb.org/viewtopic.php?f=17&t=41117 +# FreeCAD pull request https://github.com/FreeCAD/FreeCAD/pull/2752 + + +# get all used file types + +# in a directory in a bash use +# find . -type f -name '*.*' | sed 's|.*\.||' | sort -u + +# search for a specific file ending +# find . -type f -name '*.ico' + + +# normalize the line endings of the following files +*.cpp text +*.css text +*.csv text +*.feature text +*.gitattributes text +*.gitignore text +*.gitkeep +*.h text +*.html text +*.ifc text +*.json text +*.md text +*.po text +*.pot text +*.py text +*.txt text + + +# files not normalized ATM +# bat +# bnf +# blend +# i +# ico +# mo +# mpass +# png +# pth +# pyc +# rst +# svg +# ttf +# xsd + + +# line endings of all directories will be normalized +# to exclude a directory from being normalized add it here +# example: to exclude dirctory ifcbimtester use the following line without # +# ifcbimtester/** -text + + +# use git to manually correct the file endings +# git add --renormalize . diff --git a/src/ifcblenderexport/Makefile b/src/blenderbim/Makefile similarity index 98% rename from src/ifcblenderexport/Makefile rename to src/blenderbim/Makefile index 857b535525..1548f6b72d 100644 --- a/src/ifcblenderexport/Makefile +++ b/src/blenderbim/Makefile @@ -61,7 +61,7 @@ endif cp -r dist/working/io_import_scene_ifc/ifcopenshell dist/blenderbim/libs/site/packages/ # See bug #812 - cd dist/working && wget https://raw.githubusercontent.com/IfcOpenShell/IfcOpenShell/v0.6.0/src/ifcblenderexport/occ_utils.py + cd dist/working && wget https://raw.githubusercontent.com/IfcOpenShell/IfcOpenShell/v0.6.0/src/blenderbim/occ_utils.py cd dist/working && mv occ_utils.py ../blenderbim/libs/site/packages/ifcopenshell/geom/occ_utils.py rm -rf dist/working @@ -142,6 +142,7 @@ endif cd dist/working && unzip v0.6.0.zip # IfcOpenBot sometimes lags behind, so we hotfix the Python utilities cp -r dist/working/IfcOpenShell-0.6.0/src/ifcopenshell-python/ifcopenshell/util/* dist/blenderbim/libs/site/packages/ifcopenshell/util/ + cp -r dist/working/IfcOpenShell-0.6.0/src/ifcopenshell-python/ifcopenshell/api dist/blenderbim/libs/site/packages/ifcopenshell/api # Provides bcf functionality cp -r dist/working/IfcOpenShell-0.6.0/src/bcf/bcf dist/blenderbim/libs/site/packages/ # Provides IFCClash functionality diff --git a/src/ifcblenderexport/README.md b/src/blenderbim/README.md similarity index 100% rename from src/ifcblenderexport/README.md rename to src/blenderbim/README.md diff --git a/src/ifcblenderexport/RenameObjects.py b/src/blenderbim/RenameObjects.py similarity index 100% rename from src/ifcblenderexport/RenameObjects.py rename to src/blenderbim/RenameObjects.py diff --git a/src/ifcblenderexport/blender-screenshot.png b/src/blenderbim/blender-screenshot.png similarity index 100% rename from src/ifcblenderexport/blender-screenshot.png rename to src/blenderbim/blender-screenshot.png diff --git a/src/ifcblenderexport/blenderbim/__init__.py b/src/blenderbim/blenderbim/__init__.py similarity index 100% rename from src/ifcblenderexport/blenderbim/__init__.py rename to src/blenderbim/blenderbim/__init__.py diff --git a/src/ifcblenderexport/blenderbim/bim/.gitignore b/src/blenderbim/blenderbim/bim/.gitignore similarity index 100% rename from src/ifcblenderexport/blenderbim/bim/.gitignore rename to src/blenderbim/blenderbim/bim/.gitignore diff --git a/src/ifcblenderexport/blenderbim/bim/__init__.py b/src/blenderbim/blenderbim/bim/__init__.py similarity index 100% rename from src/ifcblenderexport/blenderbim/bim/__init__.py rename to src/blenderbim/blenderbim/bim/__init__.py diff --git a/src/ifcblenderexport/blenderbim/bim/annotation.py b/src/blenderbim/blenderbim/bim/annotation.py similarity index 100% rename from src/ifcblenderexport/blenderbim/bim/annotation.py rename to src/blenderbim/blenderbim/bim/annotation.py diff --git a/src/ifcblenderexport/blenderbim/bim/cut_ifc.py b/src/blenderbim/blenderbim/bim/cut_ifc.py similarity index 92% rename from src/ifcblenderexport/blenderbim/bim/cut_ifc.py rename to src/blenderbim/blenderbim/bim/cut_ifc.py index 7c54d2ca4c..2fbe91a29a 100644 --- a/src/ifcblenderexport/blenderbim/bim/cut_ifc.py +++ b/src/blenderbim/blenderbim/bim/cut_ifc.py @@ -6,68 +6,71 @@ import numpy import pickle import multiprocessing -try: - from OCC.Core import ( - gp, - Geom, - Bnd, - BRepBndLib, - BRep, - BRepPrimAPI, - BRepAlgoAPI, - BRepBuilderAPI, - TopOpeBRepTool, - TopOpeBRepBuild, - ShapeExtend, - GProp, - BRepGProp, - GC, - ShapeAnalysis, - TopTools, - TopExp, - TopAbs, - HLRAlgo, - HLRBRep, - TopLoc, - Bnd, - BRepBndLib, - BRepTools, - TopoDS, - GeomLProp, - IntCurvesFace, - ) - from OCC.Core.TopoDS import topods -except ImportError: - from OCC import ( - gp, - Geom, - Bnd, - BRepBndLib, - BRep, - BRepPrimAPI, - BRepAlgoAPI, - BRepBuilderAPI, - TopOpeBRepTool, - TopOpeBRepBuild, - ShapeExtend, - GProp, - BRepGProp, - GC, - ShapeAnalysis, - TopTools, - TopExp, - TopAbs, - HLRAlgo, - HLRBRep, - TopLoc, - Bnd, - BRepBndLib, - BRepTools, - TopoDS, - GeomLProp, - IntCurvesFace, - ) - from OCC.TopoDS import topods + +def load_occ(): + # Don't import until we really need to, as a temporary step before we can purge OCC + try: + from OCC.Core import ( + gp, + Geom, + Bnd, + BRepBndLib, + BRep, + BRepPrimAPI, + BRepAlgoAPI, + BRepBuilderAPI, + TopOpeBRepTool, + TopOpeBRepBuild, + ShapeExtend, + GProp, + BRepGProp, + GC, + ShapeAnalysis, + TopTools, + TopExp, + TopAbs, + HLRAlgo, + HLRBRep, + TopLoc, + Bnd, + BRepBndLib, + BRepTools, + TopoDS, + GeomLProp, + IntCurvesFace, + ) + from OCC.Core.TopoDS import topods + except ImportError: + from OCC import ( + gp, + Geom, + Bnd, + BRepBndLib, + BRep, + BRepPrimAPI, + BRepAlgoAPI, + BRepBuilderAPI, + TopOpeBRepTool, + TopOpeBRepBuild, + ShapeExtend, + GProp, + BRepGProp, + GC, + ShapeAnalysis, + TopTools, + TopExp, + TopAbs, + HLRAlgo, + HLRBRep, + TopLoc, + Bnd, + BRepBndLib, + BRepTools, + TopoDS, + GeomLProp, + IntCurvesFace, + ) + from OCC.TopoDS import topods import ifcopenshell import ifcopenshell.geom @@ -79,6 +82,7 @@ this_file = os.path.join(cwd, "cut_ifc.py") def get_booleaned_edges(shape): + load_occ() edges = [] exp = TopExp.TopExp_Explorer(shape, TopAbs.TopAbs_EDGE) while exp.More(): @@ -88,6 +92,7 @@ def get_booleaned_edges(shape): def connect_edges_into_wires(unconnected_edges): + load_occ() edges = TopTools.TopTools_HSequenceOfShape() edges_handle = TopTools.Handle_TopTools_HSequenceOfShape(edges) wires = TopTools.TopTools_HSequenceOfShape() @@ -101,6 +106,7 @@ def connect_edges_into_wires(unconnected_edges): def do_cut(process_data): + load_occ() global_id, shape, section, trsf_data = process_data axis = gp.gp_Ax2( @@ -320,6 +326,7 @@ class IfcCutter: return False def create_section_box(self): + load_occ() top_left_corner = gp.gp_Pnt( self.section_box["top_left_corner"][0], self.section_box["top_left_corner"][1], @@ -350,6 +357,7 @@ class IfcCutter: self.transformation.SetDisplacement(source, destination) def get_bbox(self, shape): + load_occ() bbox = Bnd.Bnd_Box() BRepBndLib.brepbndlib_Add(shape, bbox) return bbox @@ -361,6 +369,7 @@ class IfcCutter: return zpos, zmax def get_booleaned_edges(self, shape): + load_occ() edges = [] exp = TopExp.TopExp_Explorer(shape, TopAbs.TopAbs_EDGE) while exp.More(): @@ -377,6 +386,7 @@ class IfcCutter: def get_annotation(self): import mathutils + load_occ() self.annotation_objs = [] settings_2d = ifcopenshell.geom.settings() diff --git a/src/ifcblenderexport/blenderbim/bim/decoration.py b/src/blenderbim/blenderbim/bim/decoration.py similarity index 100% rename from src/ifcblenderexport/blenderbim/bim/decoration.py rename to src/blenderbim/blenderbim/bim/decoration.py diff --git a/src/ifcblenderexport/blenderbim/bim/export_ifc.py b/src/blenderbim/blenderbim/bim/export_ifc.py similarity index 89% rename from src/ifcblenderexport/blenderbim/bim/export_ifc.py rename to src/blenderbim/blenderbim/bim/export_ifc.py index 7134b013c5..712fc73cdb 100644 --- a/src/ifcblenderexport/blenderbim/bim/export_ifc.py +++ b/src/blenderbim/blenderbim/bim/export_ifc.py @@ -7,6 +7,7 @@ import zipfile import tempfile import ifcopenshell import ifcopenshell.util.placement +import ifcopenshell.api from blenderbim.bim.ifc import IfcStore import addon_utils @@ -19,7 +20,7 @@ class IfcExporter: self.file = IfcStore.get_file() self.set_header() if bpy.context.scene.BIMProjectProperties.is_authoring: - self.sync_object_placements() + self.sync_object_placements_and_deletions() self.sync_edited_objects() extension = self.ifc_export_settings.output_file.split(".")[-1] if extension == "ifczip": @@ -74,13 +75,22 @@ class IfcExporter: # else: # self.file.wrapped_data.header.file_name.authorization = "Nobody" - def sync_object_placements(self): + def sync_object_placements_and_deletions(self): self.unit_scale = ifcopenshell.util.unit.calculate_unit_scale(self.file) - for obj in bpy.data.objects: + to_delete = [] + + for guid, obj in IfcStore.guid_map.items(): try: self.sync_object_placement(obj) except: pass + if self.should_delete(guid, obj): + to_delete.append(guid) + + for guid in to_delete: + product = self.file.by_id(guid) + IfcStore.unlink_element(product) + ifcopenshell.api.run("remove_product", self.file, **{"product": product}) def sync_edited_objects(self): for obj_name in IfcStore.edited_objs.copy(): @@ -114,6 +124,14 @@ class IfcExporter: if not np.allclose(ifc_matrix, blender_matrix, atol=0.0001): bpy.ops.bim.edit_object_placement(obj=obj.name) + def should_delete(self, guid, obj): + try: + # This will throw an exception if the Blender object no longer exists + foo = obj.name + return False + except: + return True + def get_application_name(self): return "BlenderBIM" diff --git a/src/ifcblenderexport/blenderbim/bim/gizmos.py b/src/blenderbim/blenderbim/bim/gizmos.py similarity index 100% rename from src/ifcblenderexport/blenderbim/bim/gizmos.py rename to src/blenderbim/blenderbim/bim/gizmos.py diff --git a/src/ifcblenderexport/blenderbim/bim/handler.py b/src/blenderbim/blenderbim/bim/handler.py similarity index 68% rename from src/ifcblenderexport/blenderbim/bim/handler.py rename to src/blenderbim/blenderbim/bim/handler.py index a54440a62f..5f462f8a5e 100644 --- a/src/ifcblenderexport/blenderbim/bim/handler.py +++ b/src/blenderbim/blenderbim/bim/handler.py @@ -1,9 +1,11 @@ import bpy import json +import addon_utils import blenderbim.bim.decoration as decoration +import ifcopenshell.api.owner.settings from bpy.app.handlers import persistent from blenderbim.bim.ifc import IfcStore -from blenderbim.bim.module.attribute.data import Data as AttributeData +from ifcopenshell.api.attribute.data import Data as AttributeData def mode_callback(obj, data): @@ -28,7 +30,7 @@ def name_callback(obj, data): if not element.is_a("IfcRoot"): return element.Name = "/".join(obj.name.split("/")[1:]) - AttributeData.load(obj.BIMObjectProperties.ifc_definition_id) + AttributeData.load(IfcStore.get_file(), obj.BIMObjectProperties.ifc_definition_id) def subscribe_to(object, data_path, callback): @@ -46,14 +48,13 @@ def subscribe_to(object, data_path, callback): }, ) + def purge_module_data(): from blenderbim.bim import modules - for module in modules.values(): - if not module: - continue + for name in modules.keys(): try: - getattr(getattr(module, "data"), "Data").purge() + getattr(getattr(getattr(ifcopenshell.api, name), "data"), "Data").purge() except AttributeError: pass @@ -99,8 +100,88 @@ def storeIdMap(scene): bpy.context.scene.BIMProperties.guid_map = json.dumps({k: v.name for k, v in IfcStore.guid_map.items()}) +def get_application(ifc): + version = get_application_version() + for element in ifc.by_type("IfcApplication"): + if element.ApplicationIdentifier == "BlenderBIM" and element.Version == version: + return element + return ifc.create_entity( + "IfcApplication", + **{ + "ApplicationDeveloper": create_application_organisation(ifc), + "Version": get_application_version(), + "ApplicationFullName": "BlenderBIM Add-on", + "ApplicationIdentifier": "BlenderBIM", + }, + ) + + +def get_application_version(): + return ".".join( + [ + str(x) + for x in [ + addon.bl_info.get("version", (-1, -1, -1)) + for addon in addon_utils.modules() + if addon.bl_info["name"] == "BlenderBIM" + ][0] + ] + ) + + +def create_application_organisation(ifc): + return ifc.create_entity( + "IfcOrganization", + **{ + "Name": "IfcOpenShell", + "Description": "IfcOpenShell is an open source (LGPL) software library that helps users and software developers to work with the IFC file format.", + "Roles": [ifc.create_entity("IfcActorRole", **{"Role": "USERDEFINED", "UserDefinedRole": "CONTRIBUTOR"})], + "Addresses": [ + ifc.create_entity( + "IfcTelecomAddress", + **{ + "Purpose": "USERDEFINED", + "UserDefinedPurpose": "WEBPAGE", + "Description": "The main webpage of the software collection.", + "WWWHomePageURL": "https://ifcopenshell.org", + }, + ), + ifc.create_entity( + "IfcTelecomAddress", + **{ + "Purpose": "USERDEFINED", + "UserDefinedPurpose": "WEBPAGE", + "Description": "The BlenderBIM Add-on webpage of the software collection.", + "WWWHomePageURL": "https://blenderbim.org", + }, + ), + ifc.create_entity( + "IfcTelecomAddress", + **{ + "Purpose": "USERDEFINED", + "UserDefinedPurpose": "REPOSITORY", + "Description": "The source code repository of the software collection.", + "WWWHomePageURL": "https://github.com/IfcOpenShell/IfcOpenShell.git", + }, + ), + ], + }, + ) + + @persistent def setDefaultProperties(scene): + ifcopenshell.api.owner.settings.get_person = ( + lambda ifc : ifc.by_id(int(bpy.context.scene.BIMOwnerProperties.user_person)) + if bpy.context.scene.BIMOwnerProperties.user_person + else None + ) + ifcopenshell.api.owner.settings.get_organisation = ( + lambda ifc : ifc.by_id(int(bpy.context.scene.BIMOwnerProperties.user_organisation)) + if bpy.context.scene.BIMOwnerProperties.user_organisation + else None + ) + ifcopenshell.api.owner.settings.get_application = get_application if len(bpy.context.scene.DocProperties.drawing_styles) == 0: drawing_style = bpy.context.scene.DocProperties.drawing_styles.add() drawing_style.name = "Technical" diff --git a/src/ifcblenderexport/blenderbim/bim/helper.py b/src/blenderbim/blenderbim/bim/helper.py similarity index 100% rename from src/ifcblenderexport/blenderbim/bim/helper.py rename to src/blenderbim/blenderbim/bim/helper.py diff --git a/src/ifcblenderexport/blenderbim/bim/ifc.py b/src/blenderbim/blenderbim/bim/ifc.py similarity index 100% rename from src/ifcblenderexport/blenderbim/bim/ifc.py rename to src/blenderbim/blenderbim/bim/ifc.py diff --git a/src/ifcblenderexport/blenderbim/bim/import_ifc.py b/src/blenderbim/blenderbim/bim/import_ifc.py similarity index 96% rename from src/ifcblenderexport/blenderbim/bim/import_ifc.py rename to src/blenderbim/blenderbim/bim/import_ifc.py index b546d9c088..4a3ffa2d75 100644 --- a/src/ifcblenderexport/blenderbim/bim/import_ifc.py +++ b/src/blenderbim/blenderbim/bim/import_ifc.py @@ -21,7 +21,6 @@ import numpy as np from pathlib import Path from itertools import cycle from datetime import datetime -from blenderbim.bim.module.context.data import Data as ContextData from blenderbim.bim.ifc import IfcStore from . import schema @@ -420,7 +419,7 @@ class IfcImporter: representations = self.get_transformed_body_representations(element.Representation.Representations) # Single swept disk solids (e.g. rebar) are better natively represented as beveled curves - if [r for r in representations if self.is_native_swept_disk_solid(r)]: + if self.is_native_swept_disk_solid(representations): self.native_data[element.GlobalId] = { "representations": representations, "representation": self.get_body_representation(element.Representation.Representations), @@ -429,19 +428,26 @@ class IfcImporter: return True # FacetedBreps (without voids) are meshes. See #841. # Commented out as seems currently too slow. - # if [r for r in representations if self.is_native_faceted_brep(r)]: - # self.native_data[element.GlobalId] = { - # "representations": representations, - # "representation": self.get_body_representation(element.Representation.Representations), - # "type": "IfcFacetedBrep", - # } - # return True + # if self.is_native_faceted_brep(representations): + # self.native_data[element.GlobalId] = { + # "representations": representations, + # "representation": self.get_body_representation(element.Representation.Representations), + # "type": "IfcFacetedBrep", + # } + # return True - def is_native_swept_disk_solid(self, representation): - return len(representation["raw"].Items) == 1 and representation["raw"].Items[0].is_a("IfcSweptDiskSolid") + def is_native_swept_disk_solid(self, representations): + for representation in representations: + if len(representation["raw"].Items) > 1 or not representation["raw"].Items[0].is_a("IfcSweptDiskSolid"): + return False + return True - def is_native_faceted_brep(self, representation): - return bool([i for i in representation["raw"].Items if i.is_a() == "IfcFacetedBrep"]) + def is_native_faceted_brep(self, representations): + for representation in representations: + for i in representation["raw"].Items: + if i.is_a() != "IfcFacetedBrep": + return False + return True def get_products_from_shape_representation(self, element): products = [pr.ShapeOfProduct[0] for pr in element.OfProductRepresentation] @@ -634,6 +640,7 @@ class IfcImporter: def create_native_products(self): total = 0 checkpoint = time.time() + bm = bmesh.new() for element in self.native_elements: total += 1 if total % 250 == 0: @@ -641,6 +648,8 @@ class IfcImporter: checkpoint = time.time() native_data = self.native_data[element.GlobalId] representation = native_data["representation"] + if not representation: + continue context_id = representation.ContextOfItems.id() if hasattr(representation, "ContextOfItems") else 0 mesh_name = f"{context_id}/{representation.id()}" mesh = self.meshes.get(mesh_name) @@ -650,16 +659,17 @@ class IfcImporter: elif native_data["type"] == "IfcFacetedBrep": mesh = self.create_native_faceted_brep(element, mesh_name) mesh.BIMMeshProperties.ifc_definition_id = representation.id() + mesh.name = mesh_name self.meshes[mesh_name] = mesh self.create_product(element, mesh=mesh) if native_data["type"] == "IfcFacetedBrep": # The current implementation doesn't reuse vertices, so we weld it after assigning materials. # This welding isn't true to the representation, but is easy and seems inexpensive. - bm = bmesh.new() bm.from_mesh(mesh) bmesh.ops.remove_doubles(bm, verts=bm.verts, dist=0.001) bm.to_mesh(mesh) - bm.free() + bm.clear() + bm.free() print("Done creating geometry") @@ -715,21 +725,27 @@ class IfcImporter: def create_structural_point_connections(self): for product in self.file.by_type("IfcStructuralPointConnection"): + # TODO: make this based off ifcopenshell. See #1409 placement_matrix = ifcopenshell.util.placement.get_local_placement(product.ObjectPlacement) vertex = None - for subelement in self.file.traverse(product): + context = None + representation = None + for subelement in self.file.traverse(product.Representation): if subelement.is_a("IfcVertex") and subelement.VertexGeometry.is_a("IfcCartesianPoint"): vertex = list(subelement.VertexGeometry.Coordinates) - break - if not vertex: + elif subelement.is_a("IfcGeometricRepresentationContext"): + context = subelement + elif subelement.is_a("IfcTopologyRepresentation"): + representation = subelement + if not vertex or not context or not representation: continue # TODO implement non cartesian point vertexes - placement_matrix[0, 3] += vertex[0] * self.unit_scale - placement_matrix[1, 3] += vertex[1] * self.unit_scale - placement_matrix[2, 3] += vertex[2] * self.unit_scale - obj = bpy.data.objects.new("{}/{}".format(product.is_a(), product.Name), None) + + mesh_name = f"{context.id()}/{representation.id()}" + mesh = bpy.data.meshes.new(mesh_name) + mesh.from_pydata([mathutils.Vector(vertex) * self.unit_scale], [], []) + + obj = bpy.data.objects.new("{}/{}".format(product.is_a(), product.Name), mesh) obj.matrix_world = mathutils.Matrix(placement_matrix.tolist()) - obj.empty_display_type = "SPHERE" - obj.empty_display_size = 0.1 self.link_element(product, obj) def create_curve_products(self, products): @@ -843,7 +859,7 @@ class IfcImporter: points = outer_bound[0].copy() [points.extend(p) for p in inner_bounds] tessellated_polygons = mathutils.geometry.tessellate_polygon(outer_bound + inner_bounds) - tessellated_faces = [[{"Coordinates": points[pi]} for pi in t] for t in tessellated_polygons] + tessellated_faces = [({"Coordinates": points[pi]} for pi in t) for t in tessellated_polygons] else: tessellated_faces = [face["Bounds"][0]["Bound"]["Polygon"]] @@ -855,7 +871,7 @@ class IfcImporter: for point in tessellated_face: co.extend( representation["matrix"] - @ mathutils.Vector([c * self.unit_scale for c in point["Coordinates"]]) + @ mathutils.Vector((c * self.unit_scale for c in point["Coordinates"])) ) total_verts += 1 loop_count += 1 diff --git a/src/ifcblenderexport/blenderbim/bim/module/aggregate/__init__.py b/src/blenderbim/blenderbim/bim/module/aggregate/__init__.py similarity index 100% rename from src/ifcblenderexport/blenderbim/bim/module/aggregate/__init__.py rename to src/blenderbim/blenderbim/bim/module/aggregate/__init__.py diff --git a/src/ifcblenderexport/blenderbim/bim/module/aggregate/operator.py b/src/blenderbim/blenderbim/bim/module/aggregate/operator.py similarity index 93% rename from src/ifcblenderexport/blenderbim/bim/module/aggregate/operator.py rename to src/blenderbim/blenderbim/bim/module/aggregate/operator.py index 4c546a61bf..ef943fad44 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/aggregate/operator.py +++ b/src/blenderbim/blenderbim/bim/module/aggregate/operator.py @@ -1,7 +1,7 @@ import bpy -import blenderbim.bim.module.aggregate.assign_object as assign_object +import ifcopenshell.api from blenderbim.bim.ifc import IfcStore -from blenderbim.bim.module.aggregate.data import Data +from ifcopenshell.api.aggregate.data import Data class AssignObject(bpy.types.Operator): @@ -18,15 +18,16 @@ class AssignObject(bpy.types.Operator): if not relating_object or not relating_object.BIMObjectProperties.ifc_definition_id: return {"FINISHED"} product = self.file.by_id(props.ifc_definition_id) - assign_object.Usecase( + ifcopenshell.api.run( + "aggregate.assign_object", self.file, - { + **{ "product": product, "relating_object": self.file.by_id(relating_object.BIMObjectProperties.ifc_definition_id), }, - ).execute() + ) bpy.ops.bim.edit_object_placement(obj=related_object.name) - Data.load(props.ifc_definition_id) + Data.load(IfcStore.get_file(), props.ifc_definition_id) bpy.ops.bim.disable_editing_aggregate(obj=related_object.name) spatial_collection = bpy.data.collections.get(related_object.name) diff --git a/src/ifcblenderexport/blenderbim/bim/module/aggregate/ui.py b/src/blenderbim/blenderbim/bim/module/aggregate/ui.py similarity index 90% rename from src/ifcblenderexport/blenderbim/bim/module/aggregate/ui.py rename to src/blenderbim/blenderbim/bim/module/aggregate/ui.py index 6749a6b567..744e369350 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/aggregate/ui.py +++ b/src/blenderbim/blenderbim/bim/module/aggregate/ui.py @@ -1,5 +1,5 @@ from bpy.types import Panel -from blenderbim.bim.module.aggregate.data import Data +from ifcopenshell.api.aggregate.data import Data from blenderbim.bim.ifc import IfcStore @@ -19,7 +19,7 @@ class BIM_PT_aggregate(Panel): if not IfcStore.get_file().by_id(props.ifc_definition_id).is_a("IfcObjectDefinition"): return False if props.ifc_definition_id not in Data.products: - Data.load(props.ifc_definition_id) + Data.load(IfcStore.get_file(), props.ifc_definition_id) if not Data.products[props.ifc_definition_id]: return False return True @@ -29,7 +29,7 @@ class BIM_PT_aggregate(Panel): if not props.ifc_definition_id: return if props.ifc_definition_id not in Data.products: - Data.load(props.ifc_definition_id) + Data.load(IfcStore.get_file(), props.ifc_definition_id) if props.is_editing_aggregate: row = self.layout.row(align=True) diff --git a/src/ifcblenderexport/blenderbim/bim/module/attribute/__init__.py b/src/blenderbim/blenderbim/bim/module/attribute/__init__.py similarity index 100% rename from src/ifcblenderexport/blenderbim/bim/module/attribute/__init__.py rename to src/blenderbim/blenderbim/bim/module/attribute/__init__.py diff --git a/src/ifcblenderexport/blenderbim/bim/module/attribute/operator.py b/src/blenderbim/blenderbim/bim/module/attribute/operator.py similarity index 93% rename from src/ifcblenderexport/blenderbim/bim/module/attribute/operator.py rename to src/blenderbim/blenderbim/bim/module/attribute/operator.py index 531c5a6797..ae69fa26a6 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/attribute/operator.py +++ b/src/blenderbim/blenderbim/bim/module/attribute/operator.py @@ -1,9 +1,9 @@ import bpy import json import ifcopenshell -import blenderbim.bim.module.attribute.edit_attributes as edit_attributes +import ifcopenshell.api from blenderbim.bim.ifc import IfcStore -from blenderbim.bim.module.attribute.data import Data +from ifcopenshell.api.attribute.data import Data class EnableEditingAttributes(bpy.types.Operator): @@ -33,7 +33,7 @@ class EnableEditingAttributes(bpy.types.Operator): elif attribute["type"] == "integer": new.int_value = attribute["value"] or 0 elif attribute["type"] == "float": - new.float_value = attribute["value"] or 0. + new.float_value = attribute["value"] or 0.0 elif attribute["type"] == "enum": new.enum_items = json.dumps(attribute["enum_items"]) if attribute["value"]: @@ -95,17 +95,16 @@ class EditAttributes(bpy.types.Operator): elif attribute["type"] == "enum": attributes[attribute["name"]] = blender_attribute.enum_value product = self.file.by_id(oprops.ifc_definition_id) - edit_attributes.Usecase(self.file, { - "product": product, - "attributes": attributes - }).execute() + ifcopenshell.api.run( + "attribute.edit_attributes", self.file, **{"product": product, "attributes": attributes} + ) if "Name" in attributes: new_name = "{}/{}".format(product.is_a(), product.Name or "Unnamed") collection = bpy.data.collections.get(obj.name) if collection: collection.name = new_name obj.name = new_name - Data.load(oprops.ifc_definition_id) + Data.load(IfcStore.get_file(), oprops.ifc_definition_id) bpy.ops.bim.disable_editing_attributes(obj=obj.name, obj_type=self.obj_type) return {"FINISHED"} diff --git a/src/ifcblenderexport/blenderbim/bim/module/attribute/prop.py b/src/blenderbim/blenderbim/bim/module/attribute/prop.py similarity index 91% rename from src/ifcblenderexport/blenderbim/bim/module/attribute/prop.py rename to src/blenderbim/blenderbim/bim/module/attribute/prop.py index 8e57d7af72..4b95bf1865 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/attribute/prop.py +++ b/src/blenderbim/blenderbim/bim/module/attribute/prop.py @@ -1,6 +1,5 @@ import bpy import blenderbim.bim.schema # refactor -from blenderbim.bim.module.material.data import Data from blenderbim.bim.ifc import IfcStore from blenderbim.bim.prop import StrProperty, Attribute from bpy.types import PropertyGroup diff --git a/src/ifcblenderexport/blenderbim/bim/module/attribute/ui.py b/src/blenderbim/blenderbim/bim/module/attribute/ui.py similarity index 96% rename from src/ifcblenderexport/blenderbim/bim/module/attribute/ui.py rename to src/blenderbim/blenderbim/bim/module/attribute/ui.py index 0856d8bfdc..1d345d0fa2 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/attribute/ui.py +++ b/src/blenderbim/blenderbim/bim/module/attribute/ui.py @@ -1,5 +1,6 @@ from bpy.types import Panel -from blenderbim.bim.module.attribute.data import Data +from blenderbim.bim.ifc import IfcStore +from ifcopenshell.api.attribute.data import Data def draw_ui(context, layout, obj_type): @@ -7,7 +8,7 @@ def draw_ui(context, layout, obj_type): oprops = obj.BIMObjectProperties props = obj.BIMAttributeProperties if oprops.ifc_definition_id not in Data.products: - Data.load(oprops.ifc_definition_id) + Data.load(IfcStore.get_file(), oprops.ifc_definition_id) if props.is_editing_attributes: row = layout.row(align=True) diff --git a/src/ifcblenderexport/blenderbim/bim/module/augin/__init__.py b/src/blenderbim/blenderbim/bim/module/augin/__init__.py similarity index 100% rename from src/ifcblenderexport/blenderbim/bim/module/augin/__init__.py rename to src/blenderbim/blenderbim/bim/module/augin/__init__.py diff --git a/src/ifcblenderexport/blenderbim/bim/module/augin/operator.py b/src/blenderbim/blenderbim/bim/module/augin/operator.py similarity index 100% rename from src/ifcblenderexport/blenderbim/bim/module/augin/operator.py rename to src/blenderbim/blenderbim/bim/module/augin/operator.py diff --git a/src/ifcblenderexport/blenderbim/bim/module/augin/prop.py b/src/blenderbim/blenderbim/bim/module/augin/prop.py similarity index 100% rename from src/ifcblenderexport/blenderbim/bim/module/augin/prop.py rename to src/blenderbim/blenderbim/bim/module/augin/prop.py diff --git a/src/ifcblenderexport/blenderbim/bim/module/augin/ui.py b/src/blenderbim/blenderbim/bim/module/augin/ui.py similarity index 100% rename from src/ifcblenderexport/blenderbim/bim/module/augin/ui.py rename to src/blenderbim/blenderbim/bim/module/augin/ui.py diff --git a/src/ifcblenderexport/blenderbim/bim/module/bcf/__init__.py b/src/blenderbim/blenderbim/bim/module/bcf/__init__.py similarity index 100% rename from src/ifcblenderexport/blenderbim/bim/module/bcf/__init__.py rename to src/blenderbim/blenderbim/bim/module/bcf/__init__.py diff --git a/src/ifcblenderexport/blenderbim/bim/module/bcf/bcfstore.py b/src/blenderbim/blenderbim/bim/module/bcf/bcfstore.py similarity index 100% rename from src/ifcblenderexport/blenderbim/bim/module/bcf/bcfstore.py rename to src/blenderbim/blenderbim/bim/module/bcf/bcfstore.py diff --git a/src/ifcblenderexport/blenderbim/bim/module/bcf/operator.py b/src/blenderbim/blenderbim/bim/module/bcf/operator.py similarity index 100% rename from src/ifcblenderexport/blenderbim/bim/module/bcf/operator.py rename to src/blenderbim/blenderbim/bim/module/bcf/operator.py diff --git a/src/ifcblenderexport/blenderbim/bim/module/bcf/prop.py b/src/blenderbim/blenderbim/bim/module/bcf/prop.py similarity index 100% rename from src/ifcblenderexport/blenderbim/bim/module/bcf/prop.py rename to src/blenderbim/blenderbim/bim/module/bcf/prop.py diff --git a/src/ifcblenderexport/blenderbim/bim/module/bcf/ui.py b/src/blenderbim/blenderbim/bim/module/bcf/ui.py similarity index 100% rename from src/ifcblenderexport/blenderbim/bim/module/bcf/ui.py rename to src/blenderbim/blenderbim/bim/module/bcf/ui.py diff --git a/src/ifcblenderexport/blenderbim/bim/module/bimtester/__init__.py b/src/blenderbim/blenderbim/bim/module/bimtester/__init__.py similarity index 100% rename from src/ifcblenderexport/blenderbim/bim/module/bimtester/__init__.py rename to src/blenderbim/blenderbim/bim/module/bimtester/__init__.py diff --git a/src/ifcblenderexport/blenderbim/bim/module/bimtester/operator.py b/src/blenderbim/blenderbim/bim/module/bimtester/operator.py similarity index 100% rename from src/ifcblenderexport/blenderbim/bim/module/bimtester/operator.py rename to src/blenderbim/blenderbim/bim/module/bimtester/operator.py diff --git a/src/ifcblenderexport/blenderbim/bim/module/bimtester/prop.py b/src/blenderbim/blenderbim/bim/module/bimtester/prop.py similarity index 100% rename from src/ifcblenderexport/blenderbim/bim/module/bimtester/prop.py rename to src/blenderbim/blenderbim/bim/module/bimtester/prop.py diff --git a/src/ifcblenderexport/blenderbim/bim/module/bimtester/ui.py b/src/blenderbim/blenderbim/bim/module/bimtester/ui.py similarity index 100% rename from src/ifcblenderexport/blenderbim/bim/module/bimtester/ui.py rename to src/blenderbim/blenderbim/bim/module/bimtester/ui.py diff --git a/src/ifcblenderexport/blenderbim/bim/module/clash/__init__.py b/src/blenderbim/blenderbim/bim/module/clash/__init__.py similarity index 100% rename from src/ifcblenderexport/blenderbim/bim/module/clash/__init__.py rename to src/blenderbim/blenderbim/bim/module/clash/__init__.py diff --git a/src/ifcblenderexport/blenderbim/bim/module/clash/operator.py b/src/blenderbim/blenderbim/bim/module/clash/operator.py similarity index 100% rename from src/ifcblenderexport/blenderbim/bim/module/clash/operator.py rename to src/blenderbim/blenderbim/bim/module/clash/operator.py diff --git a/src/ifcblenderexport/blenderbim/bim/module/clash/prop.py b/src/blenderbim/blenderbim/bim/module/clash/prop.py similarity index 97% rename from src/ifcblenderexport/blenderbim/bim/module/clash/prop.py rename to src/blenderbim/blenderbim/bim/module/clash/prop.py index 185e9fe163..ba685b64d3 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/clash/prop.py +++ b/src/blenderbim/blenderbim/bim/module/clash/prop.py @@ -1,6 +1,5 @@ import bpy from blenderbim.bim.prop import StrProperty, Attribute -from blenderbim.bim.module.owner.data import Data from bpy.types import PropertyGroup from bpy.props import ( PointerProperty, diff --git a/src/ifcblenderexport/blenderbim/bim/module/clash/ui.py b/src/blenderbim/blenderbim/bim/module/clash/ui.py similarity index 100% rename from src/ifcblenderexport/blenderbim/bim/module/clash/ui.py rename to src/blenderbim/blenderbim/bim/module/clash/ui.py diff --git a/src/ifcblenderexport/blenderbim/bim/module/classification/__init__.py b/src/blenderbim/blenderbim/bim/module/classification/__init__.py similarity index 100% rename from src/ifcblenderexport/blenderbim/bim/module/classification/__init__.py rename to src/blenderbim/blenderbim/bim/module/classification/__init__.py diff --git a/src/ifcblenderexport/blenderbim/bim/module/classification/operator.py b/src/blenderbim/blenderbim/bim/module/classification/operator.py similarity index 82% rename from src/ifcblenderexport/blenderbim/bim/module/classification/operator.py rename to src/blenderbim/blenderbim/bim/module/classification/operator.py index 1150f138f3..014f6865f9 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/classification/operator.py +++ b/src/blenderbim/blenderbim/bim/module/classification/operator.py @@ -1,13 +1,8 @@ import bpy import json -import blenderbim.bim.module.classification.add_classification as add_classification -import blenderbim.bim.module.classification.remove_classification as remove_classification -import blenderbim.bim.module.classification.edit_classification as edit_classification -import blenderbim.bim.module.classification.add_reference as add_reference -import blenderbim.bim.module.classification.remove_reference as remove_reference -import blenderbim.bim.module.classification.edit_reference as edit_reference +import ifcopenshell.api from blenderbim.bim.ifc import IfcStore -from blenderbim.bim.module.classification.data import Data +from ifcopenshell.api.classification.data import Data from blenderbim.bim.module.classification.prop import getClassifications, getReferences @@ -34,10 +29,12 @@ class AddClassification(bpy.types.Operator): def execute(self, context): props = context.scene.BIMClassificationProperties - add_classification.Usecase( - IfcStore.get_file(), {"classification": Data.library_file.by_id(int(props.available_classifications))} - ).execute() - Data.load() + ifcopenshell.api.run( + "classification.add_classification", + IfcStore.get_file(), + **{"classification": Data.library_file.by_id(int(props.available_classifications))}, + ) + Data.load(IfcStore.get_file()) return {"FINISHED"} @@ -80,8 +77,12 @@ class RemoveClassification(bpy.types.Operator): def execute(self, context): self.file = IfcStore.get_file() - remove_classification.Usecase(self.file, {"classification": self.file.by_id(self.classification)}).execute() - Data.load() + ifcopenshell.api.run( + "classification.remove_classification", + self.file, + **{"classification": self.file.by_id(self.classification)}, + ) + Data.load(IfcStore.get_file()) return {"FINISHED"} @@ -100,10 +101,12 @@ class EditClassification(bpy.types.Operator): else: attributes[attribute.name] = attribute.string_value self.file = IfcStore.get_file() - edit_classification.Usecase( - self.file, {"classification": self.file.by_id(props.active_classification_id), "attributes": attributes} - ).execute() - Data.load() + ifcopenshell.api.run( + "classification.edit_classification", + self.file, + **{"classification": self.file.by_id(props.active_classification_id), "attributes": attributes}, + ) + Data.load(IfcStore.get_file()) bpy.ops.bim.disable_editing_classification() return {"FINISHED"} @@ -152,15 +155,16 @@ class RemoveClassificationReference(bpy.types.Operator): def execute(self, context): obj = bpy.data.objects.get(self.obj) if self.obj else bpy.context.active_object self.file = IfcStore.get_file() - remove_reference.Usecase( + ifcopenshell.api.run( + "classification.remove_reference", self.file, - { + **{ "reference": self.file.by_id(self.reference), "product": self.file.by_id(obj.BIMObjectProperties.ifc_definition_id), }, - ).execute() - Data.load(obj.BIMObjectProperties.ifc_definition_id) - Data.load() + ) + Data.load(IfcStore.get_file(), obj.BIMObjectProperties.ifc_definition_id) + Data.load(IfcStore.get_file()) return {"FINISHED"} @@ -179,10 +183,12 @@ class EditClassificationReference(bpy.types.Operator): else: attributes[attribute.name] = attribute.string_value self.file = IfcStore.get_file() - edit_reference.Usecase( - self.file, {"reference": self.file.by_id(props.active_reference_id), "attributes": attributes} - ).execute() - Data.load() + ifcopenshell.api.run( + "classification.edit_reference", + self.file, + **{"reference": self.file.by_id(props.active_reference_id), "attributes": attributes}, + ) + Data.load(IfcStore.get_file()) bpy.ops.bim.disable_editing_classification_reference() return {"FINISHED"} @@ -206,16 +212,17 @@ class AddClassificationReference(bpy.types.Operator): classification = self.file.by_id(classification_id) break - add_reference.Usecase( + ifcopenshell.api.run( + "classification.add_reference", self.file, - { + **{ "reference": Data.library_file.by_id(self.reference), "product": self.file.by_id(obj.BIMObjectProperties.ifc_definition_id), - "classification": classification + "classification": classification, }, - ).execute() - Data.load(obj.BIMObjectProperties.ifc_definition_id) - Data.load() + ) + Data.load(IfcStore.get_file(), obj.BIMObjectProperties.ifc_definition_id) + Data.load(IfcStore.get_file()) return {"FINISHED"} diff --git a/src/ifcblenderexport/blenderbim/bim/module/classification/prop.py b/src/blenderbim/blenderbim/bim/module/classification/prop.py similarity index 97% rename from src/ifcblenderexport/blenderbim/bim/module/classification/prop.py rename to src/blenderbim/blenderbim/bim/module/classification/prop.py index 3793b29ec3..85ffb7ce8b 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/classification/prop.py +++ b/src/blenderbim/blenderbim/bim/module/classification/prop.py @@ -1,6 +1,6 @@ import bpy from blenderbim.bim.prop import StrProperty, Attribute -from blenderbim.bim.module.classification.data import Data +from ifcopenshell.api.classification.data import Data from bpy.types import PropertyGroup from bpy.props import ( PointerProperty, diff --git a/src/ifcblenderexport/blenderbim/bim/module/classification/ui.py b/src/blenderbim/blenderbim/bim/module/classification/ui.py similarity index 96% rename from src/ifcblenderexport/blenderbim/bim/module/classification/ui.py rename to src/blenderbim/blenderbim/bim/module/classification/ui.py index 122201c8e9..d0b65021a8 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/classification/ui.py +++ b/src/blenderbim/blenderbim/bim/module/classification/ui.py @@ -1,6 +1,6 @@ from bpy.types import Panel, UIList from blenderbim.bim.ifc import IfcStore -from blenderbim.bim.module.classification.data import Data +from ifcopenshell.api.classification.data import Data class BIM_PT_classifications(Panel): @@ -17,7 +17,7 @@ class BIM_PT_classifications(Panel): def draw(self, context): if not Data.is_loaded: - Data.load() + Data.load(IfcStore.get_file()) self.props = context.scene.BIMClassificationProperties @@ -79,9 +79,9 @@ class BIM_PT_classification_references(Panel): self.props = obj.BIMClassificationReferenceProperties self.file = IfcStore.get_file() if not Data.is_loaded: - Data.load() + Data.load(IfcStore.get_file()) if self.oprops.ifc_definition_id not in Data.products: - Data.load(self.oprops.ifc_definition_id) + Data.load(IfcStore.get_file(), self.oprops.ifc_definition_id) self.draw_add_ui() diff --git a/src/ifcblenderexport/blenderbim/bim/module/cobie/__init__.py b/src/blenderbim/blenderbim/bim/module/cobie/__init__.py similarity index 100% rename from src/ifcblenderexport/blenderbim/bim/module/cobie/__init__.py rename to src/blenderbim/blenderbim/bim/module/cobie/__init__.py diff --git a/src/ifcblenderexport/blenderbim/bim/module/cobie/operator.py b/src/blenderbim/blenderbim/bim/module/cobie/operator.py similarity index 100% rename from src/ifcblenderexport/blenderbim/bim/module/cobie/operator.py rename to src/blenderbim/blenderbim/bim/module/cobie/operator.py diff --git a/src/ifcblenderexport/blenderbim/bim/module/cobie/prop.py b/src/blenderbim/blenderbim/bim/module/cobie/prop.py similarity index 100% rename from src/ifcblenderexport/blenderbim/bim/module/cobie/prop.py rename to src/blenderbim/blenderbim/bim/module/cobie/prop.py diff --git a/src/ifcblenderexport/blenderbim/bim/module/cobie/ui.py b/src/blenderbim/blenderbim/bim/module/cobie/ui.py similarity index 100% rename from src/ifcblenderexport/blenderbim/bim/module/cobie/ui.py rename to src/blenderbim/blenderbim/bim/module/cobie/ui.py diff --git a/src/ifcblenderexport/blenderbim/bim/module/constraint/__init__.py b/src/blenderbim/blenderbim/bim/module/constraint/__init__.py similarity index 100% rename from src/ifcblenderexport/blenderbim/bim/module/constraint/__init__.py rename to src/blenderbim/blenderbim/bim/module/constraint/__init__.py diff --git a/src/ifcblenderexport/blenderbim/bim/module/constraint/operator.py b/src/blenderbim/blenderbim/bim/module/constraint/operator.py similarity index 80% rename from src/ifcblenderexport/blenderbim/bim/module/constraint/operator.py rename to src/blenderbim/blenderbim/bim/module/constraint/operator.py index 0bbcdc5f54..6998ed39d2 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/constraint/operator.py +++ b/src/blenderbim/blenderbim/bim/module/constraint/operator.py @@ -1,13 +1,9 @@ import bpy import json +import ifcopenshell.api import ifcopenshell.util.attribute -import blenderbim.bim.module.constraint.add_objective as add_objective -import blenderbim.bim.module.constraint.edit_objective as edit_objective -import blenderbim.bim.module.constraint.remove_constraint as remove_constraint -import blenderbim.bim.module.constraint.assign_constraint as assign_constraint -import blenderbim.bim.module.constraint.unassign_constraint as unassign_constraint from blenderbim.bim.ifc import IfcStore -from blenderbim.bim.module.constraint.data import Data +from ifcopenshell.api.constraint.data import Data class LoadObjectives(bpy.types.Operator): @@ -83,8 +79,8 @@ class AddObjective(bpy.types.Operator): bl_label = "Add Objective" def execute(self, context): - result = add_objective.Usecase(IfcStore.get_file()).execute() - Data.load() + result = ifcopenshell.api.run("constraint.add_objective", IfcStore.get_file()) + Data.load(IfcStore.get_file()) bpy.ops.bim.load_objectives() bpy.ops.bim.enable_editing_constraint(constraint=result.id()) return {"FINISHED"} @@ -105,10 +101,12 @@ class EditObjective(bpy.types.Operator): else: attributes[attribute.name] = attribute.string_value self.file = IfcStore.get_file() - edit_objective.Usecase( - self.file, {"objective": self.file.by_id(props.active_constraint_id), "attributes": attributes} - ).execute() - Data.load() + ifcopenshell.api.run( + "constraint.edit_objective", + self.file, + **{"objective": self.file.by_id(props.active_constraint_id), "attributes": attributes} + ) + Data.load(IfcStore.get_file()) bpy.ops.bim.load_objectives() return {"FINISHED"} @@ -121,8 +119,10 @@ class RemoveConstraint(bpy.types.Operator): def execute(self, context): props = context.scene.BIMConstraintProperties self.file = IfcStore.get_file() - remove_constraint.Usecase(self.file, {"constraint": self.file.by_id(self.constraint)}).execute() - Data.load() + ifcopenshell.api.run( + "constraint.remove_constraint", self.file, **{"constraint": self.file.by_id(self.constraint)} + ) + Data.load(IfcStore.get_file()) if props.is_editing == "IfcObjective": bpy.ops.bim.load_objectives() return {"FINISHED"} @@ -163,11 +163,15 @@ class AssignConstraint(bpy.types.Operator): def execute(self, context): obj = bpy.data.objects.get(self.obj) if self.obj else context.active_object self.file = IfcStore.get_file() - assign_constraint.Usecase(self.file, { - "product": self.file.by_id(obj.BIMObjectProperties.ifc_definition_id), - "constraint": self.file.by_id(self.constraint) - }).execute() - Data.load(obj.BIMObjectProperties.ifc_definition_id) + ifcopenshell.api.run( + "constraint.assign_constraint", + self.file, + **{ + "product": self.file.by_id(obj.BIMObjectProperties.ifc_definition_id), + "constraint": self.file.by_id(self.constraint), + } + ) + Data.load(IfcStore.get_file(), obj.BIMObjectProperties.ifc_definition_id) return {"FINISHED"} @@ -180,9 +184,13 @@ class UnassignConstraint(bpy.types.Operator): def execute(self, context): obj = bpy.data.objects.get(self.obj) if self.obj else context.active_object self.file = IfcStore.get_file() - unassign_constraint.Usecase(self.file, { - "product": self.file.by_id(obj.BIMObjectProperties.ifc_definition_id), - "constraint": self.file.by_id(self.constraint) - }).execute() - Data.load(obj.BIMObjectProperties.ifc_definition_id) + ifcopenshell.api.run( + "constraint.unassign_constraint", + self.file, + **{ + "product": self.file.by_id(obj.BIMObjectProperties.ifc_definition_id), + "constraint": self.file.by_id(self.constraint), + } + ) + Data.load(IfcStore.get_file(), obj.BIMObjectProperties.ifc_definition_id) return {"FINISHED"} diff --git a/src/ifcblenderexport/blenderbim/bim/module/constraint/prop.py b/src/blenderbim/blenderbim/bim/module/constraint/prop.py similarity index 100% rename from src/ifcblenderexport/blenderbim/bim/module/constraint/prop.py rename to src/blenderbim/blenderbim/bim/module/constraint/prop.py diff --git a/src/ifcblenderexport/blenderbim/bim/module/constraint/ui.py b/src/blenderbim/blenderbim/bim/module/constraint/ui.py similarity index 96% rename from src/ifcblenderexport/blenderbim/bim/module/constraint/ui.py rename to src/blenderbim/blenderbim/bim/module/constraint/ui.py index 329a203779..c6132dc43d 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/constraint/ui.py +++ b/src/blenderbim/blenderbim/bim/module/constraint/ui.py @@ -1,6 +1,6 @@ from bpy.types import Panel, UIList from blenderbim.bim.ifc import IfcStore -from blenderbim.bim.module.constraint.data import Data +from ifcopenshell.api.constraint.data import Data class BIM_PT_constraints(Panel): @@ -17,7 +17,7 @@ class BIM_PT_constraints(Panel): def draw(self, context): if not Data.is_loaded: - Data.load() + Data.load(IfcStore.get_file()) self.props = context.scene.BIMConstraintProperties @@ -73,9 +73,9 @@ class BIM_PT_object_constraints(Panel): self.props = obj.BIMObjectConstraintProperties self.file = IfcStore.get_file() if not Data.is_loaded: - Data.load() + Data.load(IfcStore.get_file()) if self.oprops.ifc_definition_id not in Data.products: - Data.load(self.oprops.ifc_definition_id) + Data.load(IfcStore.get_file(), self.oprops.ifc_definition_id) self.draw_add_ui() diff --git a/src/ifcblenderexport/blenderbim/bim/module/context/__init__.py b/src/blenderbim/blenderbim/bim/module/context/__init__.py similarity index 100% rename from src/ifcblenderexport/blenderbim/bim/module/context/__init__.py rename to src/blenderbim/blenderbim/bim/module/context/__init__.py diff --git a/src/ifcblenderexport/blenderbim/bim/module/context/operator.py b/src/blenderbim/blenderbim/bim/module/context/operator.py similarity index 70% rename from src/ifcblenderexport/blenderbim/bim/module/context/operator.py rename to src/blenderbim/blenderbim/bim/module/context/operator.py index 2fbdb94157..27ee39ec74 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/context/operator.py +++ b/src/blenderbim/blenderbim/bim/module/context/operator.py @@ -1,8 +1,7 @@ import bpy -import blenderbim.bim.module.context.add_context as add_context -import blenderbim.bim.module.context.remove_context as remove_context +import ifcopenshell.api from blenderbim.bim.ifc import IfcStore -from blenderbim.bim.module.context.data import Data +from ifcopenshell.api.context.data import Data class AddSubcontext(bpy.types.Operator): @@ -14,15 +13,16 @@ class AddSubcontext(bpy.types.Operator): def execute(self, context): self.file = IfcStore.get_file() - add_context.Usecase( + ifcopenshell.api.run( + "context.add_context", self.file, - { + **{ "context": self.context or bpy.context.scene.BIMProperties.available_contexts, "subcontext": self.subcontext or bpy.context.scene.BIMProperties.available_subcontexts, "target_view": self.target_view or bpy.context.scene.BIMProperties.available_target_views, }, - ).execute() - Data.load() + ) + Data.load(IfcStore.get_file()) return {"FINISHED"} @@ -33,7 +33,8 @@ class RemoveSubcontext(bpy.types.Operator): def execute(self, context): self.file = IfcStore.get_file() - usecase = remove_context.Usecase(self.file, {"context": self.file.by_id(self.ifc_definition_id)}) - usecase.execute() - Data.load() + ifcopenshell.api.run( + "context.remove_context", self.file, **{"context": self.file.by_id(self.ifc_definition_id)} + ) + Data.load(IfcStore.get_file()) return {"FINISHED"} diff --git a/src/ifcblenderexport/blenderbim/bim/module/context/ui.py b/src/blenderbim/blenderbim/bim/module/context/ui.py similarity index 94% rename from src/ifcblenderexport/blenderbim/bim/module/context/ui.py rename to src/blenderbim/blenderbim/bim/module/context/ui.py index 07182ab2ac..2573cfa80f 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/context/ui.py +++ b/src/blenderbim/blenderbim/bim/module/context/ui.py @@ -1,5 +1,5 @@ from bpy.types import Panel -from blenderbim.bim.module.context.data import Data +from ifcopenshell.api.context.data import Data from blenderbim.bim.ifc import IfcStore @@ -17,7 +17,7 @@ class BIM_PT_context(Panel): def draw(self, context): if not Data.is_loaded: - Data.load() + Data.load(IfcStore.get_file()) props = context.scene.BIMProperties diff --git a/src/ifcblenderexport/blenderbim/bim/module/covetool/__init__.py b/src/blenderbim/blenderbim/bim/module/covetool/__init__.py similarity index 100% rename from src/ifcblenderexport/blenderbim/bim/module/covetool/__init__.py rename to src/blenderbim/blenderbim/bim/module/covetool/__init__.py diff --git a/src/ifcblenderexport/blenderbim/bim/module/covetool/api.py b/src/blenderbim/blenderbim/bim/module/covetool/api.py similarity index 100% rename from src/ifcblenderexport/blenderbim/bim/module/covetool/api.py rename to src/blenderbim/blenderbim/bim/module/covetool/api.py diff --git a/src/ifcblenderexport/blenderbim/bim/module/covetool/operator.py b/src/blenderbim/blenderbim/bim/module/covetool/operator.py similarity index 100% rename from src/ifcblenderexport/blenderbim/bim/module/covetool/operator.py rename to src/blenderbim/blenderbim/bim/module/covetool/operator.py diff --git a/src/ifcblenderexport/blenderbim/bim/module/covetool/prop.py b/src/blenderbim/blenderbim/bim/module/covetool/prop.py similarity index 100% rename from src/ifcblenderexport/blenderbim/bim/module/covetool/prop.py rename to src/blenderbim/blenderbim/bim/module/covetool/prop.py diff --git a/src/ifcblenderexport/blenderbim/bim/module/covetool/ui.py b/src/blenderbim/blenderbim/bim/module/covetool/ui.py similarity index 100% rename from src/ifcblenderexport/blenderbim/bim/module/covetool/ui.py rename to src/blenderbim/blenderbim/bim/module/covetool/ui.py diff --git a/src/ifcblenderexport/blenderbim/bim/module/csv/__init__.py b/src/blenderbim/blenderbim/bim/module/csv/__init__.py similarity index 100% rename from src/ifcblenderexport/blenderbim/bim/module/csv/__init__.py rename to src/blenderbim/blenderbim/bim/module/csv/__init__.py diff --git a/src/ifcblenderexport/blenderbim/bim/module/csv/operator.py b/src/blenderbim/blenderbim/bim/module/csv/operator.py similarity index 100% rename from src/ifcblenderexport/blenderbim/bim/module/csv/operator.py rename to src/blenderbim/blenderbim/bim/module/csv/operator.py diff --git a/src/ifcblenderexport/blenderbim/bim/module/csv/prop.py b/src/blenderbim/blenderbim/bim/module/csv/prop.py similarity index 100% rename from src/ifcblenderexport/blenderbim/bim/module/csv/prop.py rename to src/blenderbim/blenderbim/bim/module/csv/prop.py diff --git a/src/ifcblenderexport/blenderbim/bim/module/csv/ui.py b/src/blenderbim/blenderbim/bim/module/csv/ui.py similarity index 100% rename from src/ifcblenderexport/blenderbim/bim/module/csv/ui.py rename to src/blenderbim/blenderbim/bim/module/csv/ui.py diff --git a/src/ifcblenderexport/blenderbim/bim/module/debug/__init__.py b/src/blenderbim/blenderbim/bim/module/debug/__init__.py similarity index 100% rename from src/ifcblenderexport/blenderbim/bim/module/debug/__init__.py rename to src/blenderbim/blenderbim/bim/module/debug/__init__.py diff --git a/src/ifcblenderexport/blenderbim/bim/module/debug/operator.py b/src/blenderbim/blenderbim/bim/module/debug/operator.py similarity index 100% rename from src/ifcblenderexport/blenderbim/bim/module/debug/operator.py rename to src/blenderbim/blenderbim/bim/module/debug/operator.py diff --git a/src/ifcblenderexport/blenderbim/bim/module/debug/prop.py b/src/blenderbim/blenderbim/bim/module/debug/prop.py similarity index 100% rename from src/ifcblenderexport/blenderbim/bim/module/debug/prop.py rename to src/blenderbim/blenderbim/bim/module/debug/prop.py diff --git a/src/ifcblenderexport/blenderbim/bim/module/debug/ui.py b/src/blenderbim/blenderbim/bim/module/debug/ui.py similarity index 93% rename from src/ifcblenderexport/blenderbim/bim/module/debug/ui.py rename to src/blenderbim/blenderbim/bim/module/debug/ui.py index 707a12e34e..8372ae76a0 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/debug/ui.py +++ b/src/blenderbim/blenderbim/bim/module/debug/ui.py @@ -53,6 +53,9 @@ class BIM_PT_debug(Panel): row = layout.row(align=True) row.prop(attribute, "name", text="") row.prop(attribute, "string_value", text="") + if attribute.name == "GlobalId": + op = row.operator("bim.select_global_id", icon="RESTRICT_SELECT_OFF", text="") + op.global_id = attribute.string_value if attribute.int_value: row.operator( "bim.inspect_from_step_id", icon="DISCLOSURE_TRI_RIGHT", text="" diff --git a/src/ifcblenderexport/blenderbim/bim/module/diff/__init__.py b/src/blenderbim/blenderbim/bim/module/diff/__init__.py similarity index 100% rename from src/ifcblenderexport/blenderbim/bim/module/diff/__init__.py rename to src/blenderbim/blenderbim/bim/module/diff/__init__.py diff --git a/src/ifcblenderexport/blenderbim/bim/module/diff/operator.py b/src/blenderbim/blenderbim/bim/module/diff/operator.py similarity index 100% rename from src/ifcblenderexport/blenderbim/bim/module/diff/operator.py rename to src/blenderbim/blenderbim/bim/module/diff/operator.py diff --git a/src/ifcblenderexport/blenderbim/bim/module/diff/prop.py b/src/blenderbim/blenderbim/bim/module/diff/prop.py similarity index 100% rename from src/ifcblenderexport/blenderbim/bim/module/diff/prop.py rename to src/blenderbim/blenderbim/bim/module/diff/prop.py diff --git a/src/ifcblenderexport/blenderbim/bim/module/diff/ui.py b/src/blenderbim/blenderbim/bim/module/diff/ui.py similarity index 100% rename from src/ifcblenderexport/blenderbim/bim/module/diff/ui.py rename to src/blenderbim/blenderbim/bim/module/diff/ui.py diff --git a/src/ifcblenderexport/blenderbim/bim/module/document/__init__.py b/src/blenderbim/blenderbim/bim/module/document/__init__.py similarity index 100% rename from src/ifcblenderexport/blenderbim/bim/module/document/__init__.py rename to src/blenderbim/blenderbim/bim/module/document/__init__.py diff --git a/src/ifcblenderexport/blenderbim/bim/module/document/operator.py b/src/blenderbim/blenderbim/bim/module/document/operator.py similarity index 82% rename from src/ifcblenderexport/blenderbim/bim/module/document/operator.py rename to src/blenderbim/blenderbim/bim/module/document/operator.py index f6e4e46714..d81b68877d 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/document/operator.py +++ b/src/blenderbim/blenderbim/bim/module/document/operator.py @@ -1,15 +1,9 @@ import bpy import json +import ifcopenshell.api import ifcopenshell.util.attribute -import blenderbim.bim.module.document.add_information as add_information -import blenderbim.bim.module.document.add_reference as add_reference -import blenderbim.bim.module.document.edit_information as edit_information -import blenderbim.bim.module.document.edit_reference as edit_reference -import blenderbim.bim.module.document.remove_document as remove_document -import blenderbim.bim.module.document.assign_document as assign_document -import blenderbim.bim.module.document.unassign_document as unassign_document from blenderbim.bim.ifc import IfcStore -from blenderbim.bim.module.document.data import Data +from ifcopenshell.api.document.data import Data class LoadInformation(bpy.types.Operator): @@ -116,8 +110,8 @@ class AddInformation(bpy.types.Operator): bl_label = "Add Information" def execute(self, context): - result = add_information.Usecase(IfcStore.get_file()).execute() - Data.load() + result = ifcopenshell.api.run("document.add_information", IfcStore.get_file()) + Data.load(IfcStore.get_file()) bpy.ops.bim.load_information() bpy.ops.bim.enable_editing_document(document=result.id()) return {"FINISHED"} @@ -128,8 +122,8 @@ class AddDocumentReference(bpy.types.Operator): bl_label = "Add Document Reference" def execute(self, context): - result = add_reference.Usecase(IfcStore.get_file()).execute() - Data.load() + result = ifcopenshell.api.run("document.add_reference", IfcStore.get_file()) + Data.load(IfcStore.get_file()) bpy.ops.bim.load_document_references() bpy.ops.bim.enable_editing_document(document=result.id()) return {"FINISHED"} @@ -150,10 +144,12 @@ class EditInformation(bpy.types.Operator): else: attributes[attribute.name] = attribute.string_value self.file = IfcStore.get_file() - edit_information.Usecase( - self.file, {"information": self.file.by_id(props.active_document_id), "attributes": attributes} - ).execute() - Data.load() + ifcopenshell.api.run( + "document.edit_information", + self.file, + **{"information": self.file.by_id(props.active_document_id), "attributes": attributes} + ) + Data.load(IfcStore.get_file()) bpy.ops.bim.load_information() return {"FINISHED"} @@ -171,10 +167,12 @@ class EditDocumentReference(bpy.types.Operator): else: attributes[attribute.name] = attribute.string_value self.file = IfcStore.get_file() - edit_reference.Usecase( - self.file, {"reference": self.file.by_id(props.active_document_id), "attributes": attributes} - ).execute() - Data.load() + ifcopenshell.api.run( + "document.edit_reference", + self.file, + **{"reference": self.file.by_id(props.active_document_id), "attributes": attributes} + ) + Data.load(IfcStore.get_file()) bpy.ops.bim.load_document_references() return {"FINISHED"} @@ -187,8 +185,8 @@ class RemoveDocument(bpy.types.Operator): def execute(self, context): props = context.scene.BIMDocumentProperties self.file = IfcStore.get_file() - remove_document.Usecase(self.file, {"document": self.file.by_id(self.document)}).execute() - Data.load() + ifcopenshell.api.run("document.remove_document", self.file, **{"document": self.file.by_id(self.document)}) + Data.load(IfcStore.get_file()) if props.is_editing == "information": bpy.ops.bim.load_information() elif props.is_editing == "reference": @@ -233,11 +231,15 @@ class AssignDocument(bpy.types.Operator): def execute(self, context): obj = bpy.data.objects.get(self.obj) if self.obj else context.active_object self.file = IfcStore.get_file() - assign_document.Usecase(self.file, { - "product": self.file.by_id(obj.BIMObjectProperties.ifc_definition_id), - "document": self.file.by_id(self.document) - }).execute() - Data.load(obj.BIMObjectProperties.ifc_definition_id) + ifcopenshell.api.run( + "document.assign_document", + self.file, + **{ + "product": self.file.by_id(obj.BIMObjectProperties.ifc_definition_id), + "document": self.file.by_id(self.document), + } + ) + Data.load(IfcStore.get_file(), obj.BIMObjectProperties.ifc_definition_id) return {"FINISHED"} @@ -250,9 +252,13 @@ class UnassignDocument(bpy.types.Operator): def execute(self, context): obj = bpy.data.objects.get(self.obj) if self.obj else context.active_object self.file = IfcStore.get_file() - unassign_document.Usecase(self.file, { - "product": self.file.by_id(obj.BIMObjectProperties.ifc_definition_id), - "document": self.file.by_id(self.document) - }).execute() - Data.load(obj.BIMObjectProperties.ifc_definition_id) + ifcopenshell.api.run( + "document.unassign_document", + self.file, + **{ + "product": self.file.by_id(obj.BIMObjectProperties.ifc_definition_id), + "document": self.file.by_id(self.document), + } + ) + Data.load(IfcStore.get_file(), obj.BIMObjectProperties.ifc_definition_id) return {"FINISHED"} diff --git a/src/ifcblenderexport/blenderbim/bim/module/document/prop.py b/src/blenderbim/blenderbim/bim/module/document/prop.py similarity index 100% rename from src/ifcblenderexport/blenderbim/bim/module/document/prop.py rename to src/blenderbim/blenderbim/bim/module/document/prop.py diff --git a/src/ifcblenderexport/blenderbim/bim/module/document/ui.py b/src/blenderbim/blenderbim/bim/module/document/ui.py similarity index 97% rename from src/ifcblenderexport/blenderbim/bim/module/document/ui.py rename to src/blenderbim/blenderbim/bim/module/document/ui.py index d1e713902d..1893fb620e 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/document/ui.py +++ b/src/blenderbim/blenderbim/bim/module/document/ui.py @@ -1,6 +1,6 @@ from bpy.types import Panel, UIList from blenderbim.bim.ifc import IfcStore -from blenderbim.bim.module.document.data import Data +from ifcopenshell.api.document.data import Data class BIM_PT_documents(Panel): @@ -17,7 +17,7 @@ class BIM_PT_documents(Panel): def draw(self, context): if not Data.is_loaded: - Data.load() + Data.load(IfcStore.get_file()) self.props = context.scene.BIMDocumentProperties @@ -77,9 +77,9 @@ class BIM_PT_object_documents(Panel): self.props = obj.BIMObjectDocumentProperties self.file = IfcStore.get_file() if not Data.is_loaded: - Data.load() + Data.load(IfcStore.get_file()) if self.oprops.ifc_definition_id not in Data.products: - Data.load(self.oprops.ifc_definition_id) + Data.load(IfcStore.get_file(), self.oprops.ifc_definition_id) self.draw_add_ui() diff --git a/src/ifcblenderexport/blenderbim/bim/module/drawing/__init__.py b/src/blenderbim/blenderbim/bim/module/drawing/__init__.py similarity index 100% rename from src/ifcblenderexport/blenderbim/bim/module/drawing/__init__.py rename to src/blenderbim/blenderbim/bim/module/drawing/__init__.py diff --git a/src/ifcblenderexport/blenderbim/bim/module/drawing/operator.py b/src/blenderbim/blenderbim/bim/module/drawing/operator.py similarity index 96% rename from src/ifcblenderexport/blenderbim/bim/module/drawing/operator.py rename to src/blenderbim/blenderbim/bim/module/drawing/operator.py index 72b3f7ccc8..909f654996 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/drawing/operator.py +++ b/src/blenderbim/blenderbim/bim/module/drawing/operator.py @@ -5,8 +5,8 @@ import subprocess import webbrowser from blenderbim.bim.operator import open_with_user_command from blenderbim.bim.ifc import IfcStore -from blenderbim.bim.module.group.data import Data as GroupData -from blenderbim.bim.module.pset.data import Data as PsetData +from ifcopenshell.api.group.data import Data as GroupData +from ifcopenshell.api.pset.data import Data as PsetData cwd = os.path.dirname(os.path.realpath(__file__)) diff --git a/src/ifcblenderexport/blenderbim/bim/module/drawing/ui.py b/src/blenderbim/blenderbim/bim/module/drawing/ui.py similarity index 100% rename from src/ifcblenderexport/blenderbim/bim/module/drawing/ui.py rename to src/blenderbim/blenderbim/bim/module/drawing/ui.py diff --git a/src/ifcblenderexport/blenderbim/bim/module/geometry/__init__.py b/src/blenderbim/blenderbim/bim/module/geometry/__init__.py similarity index 100% rename from src/ifcblenderexport/blenderbim/bim/module/geometry/__init__.py rename to src/blenderbim/blenderbim/bim/module/geometry/__init__.py diff --git a/src/ifcblenderexport/blenderbim/bim/module/geometry/helper.py b/src/blenderbim/blenderbim/bim/module/geometry/helper.py similarity index 100% rename from src/ifcblenderexport/blenderbim/bim/module/geometry/helper.py rename to src/blenderbim/blenderbim/bim/module/geometry/helper.py diff --git a/src/ifcblenderexport/blenderbim/bim/module/geometry/operator.py b/src/blenderbim/blenderbim/bim/module/geometry/operator.py similarity index 86% rename from src/ifcblenderexport/blenderbim/bim/module/geometry/operator.py rename to src/blenderbim/blenderbim/bim/module/geometry/operator.py index 6119164df7..97c579c005 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/geometry/operator.py +++ b/src/blenderbim/blenderbim/bim/module/geometry/operator.py @@ -4,19 +4,12 @@ import ifcopenshell import ifcopenshell.util.unit import ifcopenshell.util.element import logging -import blenderbim.bim.module.geometry.edit_object_placement as edit_object_placement -import blenderbim.bim.module.geometry.add_representation as add_representation -import blenderbim.bim.module.geometry.map_representation as map_representation -import blenderbim.bim.module.geometry.assign_styles as assign_styles -import blenderbim.bim.module.geometry.assign_representation as assign_representation -import blenderbim.bim.module.geometry.unassign_representation as unassign_representation -import blenderbim.bim.module.geometry.remove_representation as remove_representation -import blenderbim.bim.module.grid.create_axis_curve as create_axis_curve +import ifcopenshell.api from blenderbim.bim.ifc import IfcStore from blenderbim.bim import import_ifc -from blenderbim.bim.module.geometry.data import Data -from blenderbim.bim.module.context.data import Data as ContextData -from blenderbim.bim.module.void.data import Data as VoidData +from ifcopenshell.api.geometry.data import Data +from ifcopenshell.api.context.data import Data as ContextData +from ifcopenshell.api.void.data import Data as VoidData from mathutils import Vector @@ -55,13 +48,14 @@ class EditObjectPlacement(bpy.types.Operator): float(props.blender_x_axis_ordinate), ) ) - edit_object_placement.Usecase( + ifcopenshell.api.run( + "geometry.edit_object_placement", self.file, - { + **{ "product": self.file.by_id(obj.BIMObjectProperties.ifc_definition_id), "matrix": matrix, }, - ).execute() + ) return {"FINISHED"} @@ -103,7 +97,7 @@ class AddRepresentation(bpy.types.Operator): "should_force_triangulation": context.scene.BIMGeometryProperties.should_force_triangulation, } - result = add_representation.Usecase(self.file, representation_data).execute() + result = ifcopenshell.api.run("geometry.add_representation", self.file, **representation_data) if not result: print("Failed to write shape representation") @@ -117,12 +111,15 @@ class AddRepresentation(bpy.types.Operator): and context_of_items.ContextIdentifier == "Body" ): representation_data["context"] = self.file.by_id(box_context_id) - new_box = add_representation.Usecase(self.file, representation_data).execute() - assign_representation.Usecase(self.file, {"product": product, "representation": new_box}).execute() + new_box = ifcopenshell.api.run("geometry.add_representation", self.file, **representation_data) + ifcopenshell.api.run( + "geometry.assign_representation", self.file, **{"product": product, "representation": new_box} + ) - assign_styles.Usecase( + ifcopenshell.api.run( + "geometry.assign_styles", self.file, - { + **{ "shape_representation": result, "styles": [ self.file.by_id(s.material.BIMMaterialProperties.ifc_style_id) @@ -131,15 +128,17 @@ class AddRepresentation(bpy.types.Operator): ], "should_use_presentation_style_assignment": context.scene.BIMGeometryProperties.should_use_presentation_style_assignment, }, - ).execute() - assign_representation.Usecase(self.file, {"product": product, "representation": result}).execute() + ) + ifcopenshell.api.run( + "geometry.assign_representation", self.file, **{"product": product, "representation": result} + ) existing_mesh = obj.data mesh = obj.data.copy() mesh.name = "{}/{}".format(context_id, result.id()) mesh.BIMMeshProperties.ifc_definition_id = int(result.id()) obj.data = mesh - Data.load(obj.BIMObjectProperties.ifc_definition_id) + Data.load(IfcStore.get_file(), obj.BIMObjectProperties.ifc_definition_id) return {"FINISHED"} @@ -190,7 +189,7 @@ class SwitchRepresentation(bpy.types.Operator): if self.disable_opening_subtractions and self.context_of_items.ContextIdentifier == "Body": if self.oprops.ifc_definition_id not in VoidData.products: - VoidData.load(self.oprops.ifc_definition_id) + VoidData.load(IfcStore.get_file(), self.oprops.ifc_definition_id) for opening_id in VoidData.products[self.oprops.ifc_definition_id]: if opening_id in IfcStore.id_map: opening = IfcStore.id_map[opening_id] @@ -213,7 +212,6 @@ class RemoveRepresentation(bpy.types.Operator): self.file = IfcStore.get_file() representation = self.file.by_id(self.representation_id) obj = bpy.data.objects.get(self.obj) if self.obj else bpy.context.active_object - product = self.file.by_id(obj.BIMObjectProperties.ifc_definition_id) is_mapped_representation = representation.RepresentationType == "MappedRepresentation" if is_mapped_representation: mesh_name = "{}/{}".format( @@ -232,9 +230,11 @@ class RemoveRepresentation(bpy.types.Operator): if not is_mapped_representation: bpy.data.meshes.remove(mesh) product = self.file.by_id(obj.BIMObjectProperties.ifc_definition_id) - unassign_representation.Usecase(self.file, {"product": product, "representation": representation}).execute() - remove_representation.Usecase(self.file, {"representation": representation}).execute() - Data.load(product.id()) + ifcopenshell.api.run( + "geometry.unassign_representation", self.file, **{"product": product, "representation": representation} + ) + ifcopenshell.api.run("geometry.remove_representation", self.file, **{"representation": representation}) + Data.load(IfcStore.get_file(), product.id()) return {"FINISHED"} @@ -248,13 +248,13 @@ class MapRepresentations(bpy.types.Operator): related_object = IfcStore.id_map[self.product_id] if self.product_id not in Data.products: - Data.load(self.product_id) + Data.load(IfcStore.get_file(), self.product_id) for representation_id in Data.products[self.product_id]: bpy.ops.bim.remove_representation(obj=related_object.name, representation_id=representation_id) if self.type_product_id not in Data.products: - Data.load(self.type_product_id) + Data.load(IfcStore.get_file(), self.type_product_id) for representation_id in Data.products[self.type_product_id]: bpy.ops.bim.map_representation( @@ -283,11 +283,13 @@ class MapRepresentation(bpy.types.Operator): product = self.file.by_id(obj.BIMObjectProperties.ifc_definition_id) if obj_data: obj.data = obj_data - result = map_representation.Usecase( - self.file, {"representation": self.file.by_id(self.representation_id)} - ).execute() - assign_representation.Usecase(self.file, {"product": product, "representation": result}).execute() - Data.load(obj.BIMObjectProperties.ifc_definition_id) + result = ifcopenshell.api.run( + "geometry.map_representation", self.file, **{"representation": self.file.by_id(self.representation_id)} + ) + ifcopenshell.api.run( + "geometry.assign_representation", self.file, **{"product": product, "representation": result} + ) + Data.load(IfcStore.get_file(), obj.BIMObjectProperties.ifc_definition_id) return {"FINISHED"} @@ -299,7 +301,7 @@ class UpdateMeshRepresentation(bpy.types.Operator): def execute(self, context): if not ContextData.is_loaded: - ContextData.load() + ContextData.load(IfcStore.get_file()) objs = [bpy.data.objects.get(self.obj)] if self.obj else bpy.context.selected_objects self.file = IfcStore.get_file() @@ -313,7 +315,7 @@ class UpdateMeshRepresentation(bpy.types.Operator): product = self.file.by_id(obj.BIMObjectProperties.ifc_definition_id) if product.is_a("IfcGridAxis"): - create_axis_curve.Usecase(self.file, {"AxisCurve": obj, "grid_axis": product}).execute() + ifcopenshell.api.run("grid.create_axis_curve", self.file, **{"AxisCurve": obj, "grid_axis": product}) return bpy.ops.bim.edit_object_placement(obj=obj.name) @@ -340,12 +342,12 @@ class UpdateMeshRepresentation(bpy.types.Operator): "total_items": max(1, len(obj.material_slots)), "should_force_faceted_brep": context.scene.BIMGeometryProperties.should_force_faceted_brep, "should_force_triangulation": context.scene.BIMGeometryProperties.should_force_triangulation, - "ifc_representation_class": self.ifc_representation_class + "ifc_representation_class": self.ifc_representation_class, } - new_representation = add_representation.Usecase(self.file, representation_data).execute() + new_representation = ifcopenshell.api.run("geometry.add_representation", self.file, **representation_data) - #if product.is_a("IfcWall"): + # if product.is_a("IfcWall"): # # Generate axis representation # axis_context_id = get_context_id("Model", "Axis", "MODEL_VIEW") # old_axis = ifcopenshell.util.element.get_representation(product, "Model", "Axis", "MODEL_VIEW") @@ -372,13 +374,14 @@ class UpdateMeshRepresentation(bpy.types.Operator): and context_of_items.ContextIdentifier == "Body" ): representation_data["context"] = self.file.by_id(box_context_id) - new_box = add_representation.Usecase(self.file, representation_data).execute() + new_box = ifcopenshell.api.run("geometry.add_representation", self.file, **representation_data) for inverse in self.file.get_inverse(old_box): ifcopenshell.util.element.replace_attribute(inverse, old_box, new_box) - assign_styles.Usecase( + ifcopenshell.api.run( + "geometry.assign_styles", self.file, - { + **{ "shape_representation": new_representation, "styles": [ self.file.by_id(s.material.BIMMaterialProperties.ifc_style_id) @@ -387,7 +390,7 @@ class UpdateMeshRepresentation(bpy.types.Operator): ], "should_use_presentation_style_assignment": context.scene.BIMGeometryProperties.should_use_presentation_style_assignment, }, - ).execute() + ) # TODO: move this into a replace_representation usecase or something for inverse in self.file.get_inverse(old_representation): @@ -396,7 +399,7 @@ class UpdateMeshRepresentation(bpy.types.Operator): obj.data.BIMMeshProperties.ifc_definition_id = int(new_representation.id()) obj.data.name = f"{old_representation.ContextOfItems.id()}/{new_representation.id()}" bpy.ops.bim.remove_representation(representation_id=old_representation.id()) - Data.load(obj.BIMObjectProperties.ifc_definition_id) + Data.load(IfcStore.get_file(), obj.BIMObjectProperties.ifc_definition_id) class UpdateParametricRepresentation(bpy.types.Operator): diff --git a/src/ifcblenderexport/blenderbim/bim/module/geometry/prop.py b/src/blenderbim/blenderbim/bim/module/geometry/prop.py similarity index 100% rename from src/ifcblenderexport/blenderbim/bim/module/geometry/prop.py rename to src/blenderbim/blenderbim/bim/module/geometry/prop.py diff --git a/src/ifcblenderexport/blenderbim/bim/module/geometry/ui.py b/src/blenderbim/blenderbim/bim/module/geometry/ui.py similarity index 97% rename from src/ifcblenderexport/blenderbim/bim/module/geometry/ui.py rename to src/blenderbim/blenderbim/bim/module/geometry/ui.py index 99e1c482cf..b07a8d1f82 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/geometry/ui.py +++ b/src/blenderbim/blenderbim/bim/module/geometry/ui.py @@ -1,6 +1,6 @@ import bpy from bpy.types import Panel -from blenderbim.bim.module.geometry.data import Data +from ifcopenshell.api.geometry.data import Data from blenderbim.bim.ifc import IfcStore @@ -21,7 +21,7 @@ class BIM_PT_representations(Panel): props = context.active_object.BIMObjectProperties if props.ifc_definition_id not in Data.products: - Data.load(props.ifc_definition_id) + Data.load(IfcStore.get_file(), props.ifc_definition_id) representations = Data.products[props.ifc_definition_id] if not representations: diff --git a/src/ifcblenderexport/blenderbim/bim/module/georeference/__init__.py b/src/blenderbim/blenderbim/bim/module/georeference/__init__.py similarity index 100% rename from src/ifcblenderexport/blenderbim/bim/module/georeference/__init__.py rename to src/blenderbim/blenderbim/bim/module/georeference/__init__.py diff --git a/src/ifcblenderexport/blenderbim/bim/module/georeference/operator.py b/src/blenderbim/blenderbim/bim/module/georeference/operator.py similarity index 94% rename from src/ifcblenderexport/blenderbim/bim/module/georeference/operator.py rename to src/blenderbim/blenderbim/bim/module/georeference/operator.py index 252a08e189..c8ec61e865 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/georeference/operator.py +++ b/src/blenderbim/blenderbim/bim/module/georeference/operator.py @@ -3,11 +3,9 @@ import json import ifcopenshell import ifcopenshell.util.unit import ifcopenshell.util.attribute -import blenderbim.bim.module.georeference.add_georeferencing as add_georeferencing -import blenderbim.bim.module.georeference.edit_georeferencing as edit_georeferencing -import blenderbim.bim.module.georeference.remove_georeferencing as remove_georeferencing +import ifcopenshell.api from blenderbim.bim.ifc import IfcStore -from blenderbim.bim.module.georeference.data import Data +from ifcopenshell.api.georeference.data import Data from math import radians, degrees, atan, tan, cos, sin @@ -131,10 +129,12 @@ class EditGeoreferencing(bpy.types.Operator): if not props.is_map_unit_null: map_unit = props.map_unit_si if props.map_unit_type == "IfcSIUnit" else props.map_unit_imperial - edit_georeferencing.Usecase( - self.file, {"map_conversion": map_conversion, "projected_crs": projected_crs, "map_unit": map_unit} - ).execute() - Data.load() + ifcopenshell.api.run( + "georeference.edit_georeferencing", + self.file, + **{"map_conversion": map_conversion, "projected_crs": projected_crs, "map_unit": map_unit} + ) + Data.load(IfcStore.get_file()) bpy.ops.bim.disable_editing_georeferencing() return {"FINISHED"} @@ -169,8 +169,8 @@ class RemoveGeoreferencing(bpy.types.Operator): bl_label = "Remove Georeferencing" def execute(self, context): - remove_georeferencing.Usecase(IfcStore.get_file()).execute() - Data.load() + ifcopenshell.api.run("georeference.remove_georeferencing", IfcStore.get_file()) + Data.load(IfcStore.get_file()) return {"FINISHED"} @@ -179,8 +179,8 @@ class AddGeoreferencing(bpy.types.Operator): bl_label = "Add Georeferencing" def execute(self, context): - add_georeferencing.Usecase(IfcStore.get_file()).execute() - Data.load() + ifcopenshell.api.run("georeference.add_georeferencing", IfcStore.get_file()) + Data.load(IfcStore.get_file()) return {"FINISHED"} @@ -190,7 +190,7 @@ class ConvertLocalToGlobal(bpy.types.Operator): def execute(self, context): if not Data.is_loaded: - Data.load() + Data.load(IfcStore.get_file()) props = context.scene.BIMGeoreferenceProperties x, y, z = [float(co) for co in props.coordinate_input.split(",")] @@ -240,7 +240,7 @@ class ConvertGlobalToLocal(bpy.types.Operator): def execute(self, context): if not Data.is_loaded: - Data.load() + Data.load(IfcStore.get_file()) props = context.scene.BIMGeoreferenceProperties x, y, z = [float(co) for co in props.coordinate_input.split(",")] diff --git a/src/ifcblenderexport/blenderbim/bim/module/georeference/prop.py b/src/blenderbim/blenderbim/bim/module/georeference/prop.py similarity index 100% rename from src/ifcblenderexport/blenderbim/bim/module/georeference/prop.py rename to src/blenderbim/blenderbim/bim/module/georeference/prop.py diff --git a/src/ifcblenderexport/blenderbim/bim/module/georeference/ui.py b/src/blenderbim/blenderbim/bim/module/georeference/ui.py similarity index 98% rename from src/ifcblenderexport/blenderbim/bim/module/georeference/ui.py rename to src/blenderbim/blenderbim/bim/module/georeference/ui.py index 6c2675d7bd..ddf04c40ff 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/georeference/ui.py +++ b/src/blenderbim/blenderbim/bim/module/georeference/ui.py @@ -1,5 +1,5 @@ from bpy.types import Panel -from blenderbim.bim.module.georeference.data import Data +from ifcopenshell.api.georeference.data import Data from blenderbim.bim.ifc import IfcStore class BIM_PT_gis(Panel): @@ -17,7 +17,7 @@ class BIM_PT_gis(Panel): def draw(self, context): props = context.scene.BIMGeoreferenceProperties if not Data.is_loaded: - Data.load() + Data.load(IfcStore.get_file()) if props.is_editing: return self.draw_editable_ui(context) diff --git a/src/ifcblenderexport/blenderbim/bim/module/group/__init__.py b/src/blenderbim/blenderbim/bim/module/group/__init__.py similarity index 100% rename from src/ifcblenderexport/blenderbim/bim/module/group/__init__.py rename to src/blenderbim/blenderbim/bim/module/group/__init__.py diff --git a/src/ifcblenderexport/blenderbim/bim/module/group/operator.py b/src/blenderbim/blenderbim/bim/module/group/operator.py similarity index 77% rename from src/ifcblenderexport/blenderbim/bim/module/group/operator.py rename to src/blenderbim/blenderbim/bim/module/group/operator.py index 42f91be230..6c4277aa40 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/group/operator.py +++ b/src/blenderbim/blenderbim/bim/module/group/operator.py @@ -1,12 +1,8 @@ import bpy import ifcopenshell.util.attribute -import blenderbim.bim.module.group.add_group as add_group -import blenderbim.bim.module.group.edit_group as edit_group -import blenderbim.bim.module.group.remove_group as remove_group -import blenderbim.bim.module.group.assign_group as assign_group -import blenderbim.bim.module.group.unassign_group as unassign_group +import ifcopenshell.api from blenderbim.bim.ifc import IfcStore -from blenderbim.bim.module.group.data import Data +from ifcopenshell.api.group.data import Data class LoadGroups(bpy.types.Operator): @@ -40,8 +36,8 @@ class AddGroup(bpy.types.Operator): bl_label = "Add Group" def execute(self, context): - result = add_group.Usecase(IfcStore.get_file()).execute() - Data.load() + result = ifcopenshell.api.run("group.add_group", IfcStore.get_file()) + Data.load(IfcStore.get_file()) bpy.ops.bim.load_groups() bpy.ops.bim.enable_editing_group(group=result.id()) return {"FINISHED"} @@ -60,10 +56,10 @@ class EditGroup(bpy.types.Operator): else: attributes[attribute.name] = attribute.string_value self.file = IfcStore.get_file() - edit_group.Usecase( - self.file, {"group": self.file.by_id(props.active_group_id), "attributes": attributes} - ).execute() - Data.load() + ifcopenshell.api.run( + "group.edit_group", self.file, **{"group": self.file.by_id(props.active_group_id), "attributes": attributes} + ) + Data.load(IfcStore.get_file()) bpy.ops.bim.load_groups() return {"FINISHED"} @@ -76,8 +72,8 @@ class RemoveGroup(bpy.types.Operator): def execute(self, context): props = context.scene.BIMGroupProperties self.file = IfcStore.get_file() - remove_group.Usecase(self.file, {"group": self.file.by_id(self.group)}).execute() - Data.load() + ifcopenshell.api.run("group.remove_group", self.file, **{"group": self.file.by_id(self.group)}) + Data.load(IfcStore.get_file()) bpy.ops.bim.load_groups() return {"FINISHED"} @@ -125,11 +121,15 @@ class AssignGroup(bpy.types.Operator): def execute(self, context): product = bpy.data.objects.get(self.product) if self.product else context.active_object self.file = IfcStore.get_file() - assign_group.Usecase(self.file, { - "product": self.file.by_id(product.BIMObjectProperties.ifc_definition_id), - "group": self.file.by_id(self.group) - }).execute() - Data.load() + ifcopenshell.api.run( + "group.assign_group", + self.file, + **{ + "product": self.file.by_id(product.BIMObjectProperties.ifc_definition_id), + "group": self.file.by_id(self.group), + } + ) + Data.load(IfcStore.get_file()) return {"FINISHED"} @@ -142,9 +142,13 @@ class UnassignGroup(bpy.types.Operator): def execute(self, context): product = bpy.data.objects.get(self.product) if self.product else context.active_object self.file = IfcStore.get_file() - unassign_group.Usecase(self.file, { - "product": self.file.by_id(product.BIMObjectProperties.ifc_definition_id), - "group": self.file.by_id(self.group) - }).execute() - Data.load() + ifcopenshell.api.run( + "group.unassign_group", + self.file, + **{ + "product": self.file.by_id(product.BIMObjectProperties.ifc_definition_id), + "group": self.file.by_id(self.group), + } + ) + Data.load(IfcStore.get_file()) return {"FINISHED"} diff --git a/src/ifcblenderexport/blenderbim/bim/module/group/prop.py b/src/blenderbim/blenderbim/bim/module/group/prop.py similarity index 100% rename from src/ifcblenderexport/blenderbim/bim/module/group/prop.py rename to src/blenderbim/blenderbim/bim/module/group/prop.py diff --git a/src/ifcblenderexport/blenderbim/bim/module/group/ui.py b/src/blenderbim/blenderbim/bim/module/group/ui.py similarity index 97% rename from src/ifcblenderexport/blenderbim/bim/module/group/ui.py rename to src/blenderbim/blenderbim/bim/module/group/ui.py index 499f67a8b8..21731dc0d0 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/group/ui.py +++ b/src/blenderbim/blenderbim/bim/module/group/ui.py @@ -1,6 +1,6 @@ from bpy.types import Panel, UIList from blenderbim.bim.ifc import IfcStore -from blenderbim.bim.module.group.data import Data +from ifcopenshell.api.group.data import Data class BIM_PT_groups(Panel): @@ -17,7 +17,7 @@ class BIM_PT_groups(Panel): def draw(self, context): if not Data.is_loaded: - Data.load() + Data.load(IfcStore.get_file()) self.props = context.scene.BIMGroupProperties row = self.layout.row(align=True) diff --git a/src/ifcblenderexport/blenderbim/bim/module/layer/__init__.py b/src/blenderbim/blenderbim/bim/module/layer/__init__.py similarity index 100% rename from src/ifcblenderexport/blenderbim/bim/module/layer/__init__.py rename to src/blenderbim/blenderbim/bim/module/layer/__init__.py diff --git a/src/ifcblenderexport/blenderbim/bim/module/layer/operator.py b/src/blenderbim/blenderbim/bim/module/layer/operator.py similarity index 78% rename from src/ifcblenderexport/blenderbim/bim/module/layer/operator.py rename to src/blenderbim/blenderbim/bim/module/layer/operator.py index 7b4b3e295f..7c930823e9 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/layer/operator.py +++ b/src/blenderbim/blenderbim/bim/module/layer/operator.py @@ -1,13 +1,9 @@ import bpy import json import ifcopenshell.util.attribute -import blenderbim.bim.module.layer.add_layer as add_layer -import blenderbim.bim.module.layer.edit_layer as edit_layer -import blenderbim.bim.module.layer.remove_layer as remove_layer -import blenderbim.bim.module.layer.assign_layer as assign_layer -import blenderbim.bim.module.layer.unassign_layer as unassign_layer +import ifcopenshell.api from blenderbim.bim.ifc import IfcStore -from blenderbim.bim.module.layer.data import Data +from ifcopenshell.api.layer.data import Data class LoadLayers(bpy.types.Operator): @@ -76,8 +72,8 @@ class AddPresentationLayer(bpy.types.Operator): bl_label = "Add Layer" def execute(self, context): - result = add_layer.Usecase(IfcStore.get_file()).execute() - Data.load() + result = ifcopenshell.api.run("layer.add_layer", IfcStore.get_file()) + Data.load(IfcStore.get_file()) bpy.ops.bim.load_layers() bpy.ops.bim.enable_editing_layer(layer=result.id()) return {"FINISHED"} @@ -96,10 +92,10 @@ class EditPresentationLayer(bpy.types.Operator): else: attributes[attribute.name] = attribute.string_value self.file = IfcStore.get_file() - edit_layer.Usecase( - self.file, {"layer": self.file.by_id(props.active_layer_id), "attributes": attributes} - ).execute() - Data.load() + ifcopenshell.api.run( + "layer.edit_layer", self.file, **{"layer": self.file.by_id(props.active_layer_id), "attributes": attributes} + ) + Data.load(IfcStore.get_file()) bpy.ops.bim.load_layers() return {"FINISHED"} @@ -112,8 +108,8 @@ class RemovePresentationLayer(bpy.types.Operator): def execute(self, context): props = context.scene.BIMLayerProperties self.file = IfcStore.get_file() - remove_layer.Usecase(self.file, {"layer": self.file.by_id(self.layer)}).execute() - Data.load() + ifcopenshell.api.run("layer.remove_layer", self.file, **{"layer": self.file.by_id(self.layer)}) + Data.load(IfcStore.get_file()) bpy.ops.bim.load_layers() return {"FINISHED"} @@ -127,11 +123,12 @@ class AssignPresentationLayer(bpy.types.Operator): def execute(self, context): item = bpy.data.meshes.get(self.item) if self.item else context.active_object.data self.file = IfcStore.get_file() - assign_layer.Usecase(self.file, { - "item": self.file.by_id(item.BIMMeshProperties.ifc_definition_id), - "layer": self.file.by_id(self.layer) - }).execute() - Data.load() + ifcopenshell.api.run( + "layer.assign_layer", + self.file, + **{"item": self.file.by_id(item.BIMMeshProperties.ifc_definition_id), "layer": self.file.by_id(self.layer)} + ) + Data.load(IfcStore.get_file()) return {"FINISHED"} @@ -144,9 +141,10 @@ class UnassignPresentationLayer(bpy.types.Operator): def execute(self, context): item = bpy.data.meshes.get(self.item) if self.item else context.active_object.data self.file = IfcStore.get_file() - unassign_layer.Usecase(self.file, { - "item": self.file.by_id(item.BIMMeshProperties.ifc_definition_id), - "layer": self.file.by_id(self.layer) - }).execute() - Data.load() + ifcopenshell.api.run( + "layer.unassign_layer", + self.file, + **{"item": self.file.by_id(item.BIMMeshProperties.ifc_definition_id), "layer": self.file.by_id(self.layer)} + ) + Data.load(IfcStore.get_file()) return {"FINISHED"} diff --git a/src/ifcblenderexport/blenderbim/bim/module/layer/prop.py b/src/blenderbim/blenderbim/bim/module/layer/prop.py similarity index 100% rename from src/ifcblenderexport/blenderbim/bim/module/layer/prop.py rename to src/blenderbim/blenderbim/bim/module/layer/prop.py diff --git a/src/ifcblenderexport/blenderbim/bim/module/layer/ui.py b/src/blenderbim/blenderbim/bim/module/layer/ui.py similarity index 97% rename from src/ifcblenderexport/blenderbim/bim/module/layer/ui.py rename to src/blenderbim/blenderbim/bim/module/layer/ui.py index 3c21e540c5..7ed1cc4da6 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/layer/ui.py +++ b/src/blenderbim/blenderbim/bim/module/layer/ui.py @@ -1,6 +1,6 @@ from bpy.types import Panel, UIList, Mesh from blenderbim.bim.ifc import IfcStore -from blenderbim.bim.module.layer.data import Data +from ifcopenshell.api.layer.data import Data class BIM_PT_layers(Panel): @@ -17,7 +17,7 @@ class BIM_PT_layers(Panel): def draw(self, context): if not Data.is_loaded: - Data.load() + Data.load(IfcStore.get_file()) self.props = context.scene.BIMLayerProperties diff --git a/src/ifcblenderexport/blenderbim/bim/module/material/__init__.py b/src/blenderbim/blenderbim/bim/module/material/__init__.py similarity index 100% rename from src/ifcblenderexport/blenderbim/bim/module/material/__init__.py rename to src/blenderbim/blenderbim/bim/module/material/__init__.py diff --git a/src/ifcblenderexport/blenderbim/bim/module/material/operator.py b/src/blenderbim/blenderbim/bim/module/material/operator.py similarity index 85% rename from src/ifcblenderexport/blenderbim/bim/module/material/operator.py rename to src/blenderbim/blenderbim/bim/module/material/operator.py index b784e7610f..bf7dde4867 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/material/operator.py +++ b/src/blenderbim/blenderbim/bim/module/material/operator.py @@ -1,20 +1,8 @@ import bpy +import ifcopenshell.api import ifcopenshell.util.attribute -import blenderbim.bim.module.material.add_material as add_material -import blenderbim.bim.module.material.remove_material as remove_material -import blenderbim.bim.module.material.assign_material as assign_material -import blenderbim.bim.module.material.unassign_material as unassign_material -import blenderbim.bim.module.material.add_constituent as add_constituent -import blenderbim.bim.module.material.remove_constituent as remove_constituent -import blenderbim.bim.module.material.add_layer as add_layer -import blenderbim.bim.module.material.edit_layer as edit_layer -import blenderbim.bim.module.material.remove_layer as remove_layer -import blenderbim.bim.module.material.reorder_set_item as reorder_set_item -import blenderbim.bim.module.material.add_list_item as add_list_item -import blenderbim.bim.module.material.remove_list_item as remove_list_item -import blenderbim.bim.module.material.edit_assigned_material as edit_assigned_material from blenderbim.bim.ifc import IfcStore -from blenderbim.bim.module.material.data import Data +from ifcopenshell.api.material.data import Data class AddMaterial(bpy.types.Operator): @@ -25,9 +13,9 @@ class AddMaterial(bpy.types.Operator): def execute(self, context): obj = bpy.data.materials.get(self.obj) if self.obj else bpy.context.active_object.active_material self.file = IfcStore.get_file() - result = add_material.Usecase(self.file, {"Name": obj.name}).execute() + result = ifcopenshell.api.run("material.add_material", self.file, **{"Name": obj.name}) obj.BIMObjectProperties.ifc_definition_id = result.id() - Data.load() + Data.load(IfcStore.get_file()) return {"FINISHED"} @@ -39,11 +27,13 @@ class RemoveMaterial(bpy.types.Operator): def execute(self, context): obj = bpy.data.materials.get(self.obj) if self.obj else bpy.context.active_object.active_material self.file = IfcStore.get_file() - result = remove_material.Usecase( - self.file, {"material": self.file.by_id(obj.BIMObjectProperties.ifc_definition_id)} - ).execute() + result = ifcopenshell.api.run( + "material.remove_material", + self.file, + **{"material": self.file.by_id(obj.BIMObjectProperties.ifc_definition_id)}, + ) obj.BIMObjectProperties.ifc_definition_id = 0 - Data.load() + Data.load(IfcStore.get_file()) return {"FINISHED"} @@ -57,16 +47,17 @@ class AssignMaterial(bpy.types.Operator): obj = bpy.data.objects.get(self.obj) if self.obj else bpy.context.active_object material_type = self.material_type or obj.BIMObjectMaterialProperties.material_type self.file = IfcStore.get_file() - assign_material.Usecase( + ifcopenshell.api.run( + "material.assign_material", self.file, - { + **{ "product": self.file.by_id(obj.BIMObjectProperties.ifc_definition_id), "type": material_type, "material": self.file.by_id(int(obj.BIMObjectMaterialProperties.material)), }, - ).execute() - Data.load() - Data.load(obj.BIMObjectProperties.ifc_definition_id) + ) + Data.load(IfcStore.get_file()) + Data.load(IfcStore.get_file(), obj.BIMObjectProperties.ifc_definition_id) return {"FINISHED"} @@ -78,10 +69,12 @@ class UnassignMaterial(bpy.types.Operator): def execute(self, context): obj = bpy.data.objects.get(self.obj) if self.obj else bpy.context.active_object self.file = IfcStore.get_file() - unassign_material.Usecase( - self.file, {"product": self.file.by_id(obj.BIMObjectProperties.ifc_definition_id)} - ).execute() - Data.load(obj.BIMObjectProperties.ifc_definition_id) + ifcopenshell.api.run( + "material.unassign_material", + self.file, + **{"product": self.file.by_id(obj.BIMObjectProperties.ifc_definition_id)}, + ) + Data.load(IfcStore.get_file(), obj.BIMObjectProperties.ifc_definition_id) return {"FINISHED"} @@ -94,13 +87,14 @@ class AddConstituent(bpy.types.Operator): def execute(self, context): obj = bpy.data.objects.get(self.obj) if self.obj else bpy.context.active_object self.file = IfcStore.get_file() - add_constituent.Usecase( + ifcopenshell.api.run( + "material.add_constituent", self.file, - { + **{ "constituent_set": self.file.by_id(self.constituent_set), "material": self.file.by_id(int(obj.BIMObjectMaterialProperties.material)), }, - ).execute() + ) Data.load_constituents() return {"FINISHED"} @@ -114,7 +108,9 @@ class RemoveConstituent(bpy.types.Operator): def execute(self, context): obj = bpy.data.objects.get(self.obj) if self.obj else bpy.context.active_object self.file = IfcStore.get_file() - remove_constituent.Usecase(self.file, {"constituent": self.file.by_id(self.constituent)}).execute() + ifcopenshell.api.run( + "material.remove_constituent", self.file, **{"constituent": self.file.by_id(self.constituent)} + ) Data.load_constituents() return {"FINISHED"} @@ -128,13 +124,14 @@ class AddLayer(bpy.types.Operator): def execute(self, context): obj = bpy.data.objects.get(self.obj) if self.obj else bpy.context.active_object self.file = IfcStore.get_file() - add_layer.Usecase( + ifcopenshell.api.run( + "material.add_layer", self.file, - { + **{ "layer_set": self.file.by_id(self.layer_set), "material": self.file.by_id(int(obj.BIMObjectMaterialProperties.material)), }, - ).execute() + ) Data.load_layers() return {"FINISHED"} @@ -151,14 +148,15 @@ class ReorderMaterialSetItem(bpy.types.Operator): obj = bpy.data.objects.get(self.obj) if self.obj else bpy.context.active_object self.file = IfcStore.get_file() material_set = self.file.by_id(self.material_set) - reorder_set_item.Usecase( + ifcopenshell.api.run( + "material.reorder_set_item", self.file, - { + **{ "material_set": material_set, "old_index": self.old_index, "new_index": self.new_index, }, - ).execute() + ) if material_set.is_a("IfcMaterialConstituentSet"): Data.load_constituents() elif material_set.is_a("IfcMaterialLayerSet"): @@ -179,7 +177,7 @@ class RemoveLayer(bpy.types.Operator): def execute(self, context): obj = bpy.data.objects.get(self.obj) if self.obj else bpy.context.active_object self.file = IfcStore.get_file() - remove_layer.Usecase(self.file, {"layer": self.file.by_id(self.layer)}).execute() + ifcopenshell.api.run("material.remove_layer", self.file, **{"layer": self.file.by_id(self.layer)}) Data.load_layers() return {"FINISHED"} @@ -193,13 +191,14 @@ class AddListItem(bpy.types.Operator): def execute(self, context): obj = bpy.data.objects.get(self.obj) if self.obj else bpy.context.active_object self.file = IfcStore.get_file() - add_list_item.Usecase( + ifcopenshell.api.run( + "material.add_list_item", self.file, - { + **{ "material_list": self.file.by_id(self.list_item_set), "material": self.file.by_id(int(obj.BIMObjectMaterialProperties.material)), }, - ).execute() + ) Data.load_lists() return {"FINISHED"} @@ -214,13 +213,14 @@ class RemoveListItem(bpy.types.Operator): def execute(self, context): obj = bpy.data.objects.get(self.obj) if self.obj else bpy.context.active_object self.file = IfcStore.get_file() - remove_list_item.Usecase( + ifcopenshell.api.run( + "material.remove_list_item", self.file, - { + **{ "material_list": self.file.by_id(self.list_item_set), "material": self.file.by_id(self.list_item), }, - ).execute() + ) Data.load_lists() return {"FINISHED"} @@ -298,21 +298,22 @@ class EditAssignedMaterial(bpy.types.Operator): if product_data["type"] == "IfcMaterial": bpy.ops.bim.unassign_material(obj=obj.name) bpy.ops.bim.assign_material(obj=obj.name, material_type="IfcMaterial") - Data.load(obj.BIMObjectProperties.ifc_definition_id) + Data.load(IfcStore.get_file(), obj.BIMObjectProperties.ifc_definition_id) bpy.ops.bim.disable_editing_assigned_material(obj=obj.name) return {"FINISHED"} attributes = {} for attribute in props.material_set_attributes: attributes[attribute.name] = None if attribute.is_null else attribute.string_value - edit_assigned_material.Usecase( + ifcopenshell.api.run( + "material.edit_assigned_material", self.file, - { + **{ "element": material_set, "attributes": attributes, }, - ).execute() - Data.load(obj.BIMObjectProperties.ifc_definition_id) + ) + Data.load(IfcStore.get_file(), obj.BIMObjectProperties.ifc_definition_id) if material_set.is_a("IfcMaterialConstituentSet"): Data.load_constituents() elif material_set.is_a("IfcMaterialLayerSet"): @@ -408,34 +409,37 @@ class EditMaterialSetItem(bpy.types.Operator): attributes[attribute.name] = None if attribute.is_null else value if product_data["type"] == "IfcMaterialConstituentSet": - edit_constituent.Usecase( + ifcopenshell.api.run( + "material.edit_constituent", self.file, - { + **{ "constituent": self.file.by_id(self.material_set_item), "attributes": attributes, "material": self.file.by_id(int(obj.BIMObjectMaterialProperties.material_set_item_material)), }, - ).execute() + ) Data.load_constituents() elif product_data["type"] == "IfcMaterialLayerSet" or product_data["type"] == "IfcMaterialLayerSetUsage": - edit_layer.Usecase( + ifcopenshell.api.run( + "material.edit_layer", self.file, - { + **{ "layer": self.file.by_id(self.material_set_item), "attributes": attributes, "material": self.file.by_id(int(obj.BIMObjectMaterialProperties.material_set_item_material)), }, - ).execute() + ) Data.load_layers() elif product_data["type"] == "IfcMaterialProfileSet": - edit_profile.Usecase( + ifcopenshell.api.run( + "material.edit_profile", self.file, - { + **{ "profile": self.file.by_id(self.material_set_item), "attributes": attributes, "material": self.file.by_id(int(obj.BIMObjectMaterialProperties.material_set_item_material)), }, - ).execute() + ) Data.load_profiles() else: pass diff --git a/src/ifcblenderexport/blenderbim/bim/module/material/prop.py b/src/blenderbim/blenderbim/bim/module/material/prop.py similarity index 97% rename from src/ifcblenderexport/blenderbim/bim/module/material/prop.py rename to src/blenderbim/blenderbim/bim/module/material/prop.py index 1e0f93a371..4795832bbc 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/material/prop.py +++ b/src/blenderbim/blenderbim/bim/module/material/prop.py @@ -1,6 +1,6 @@ import bpy import blenderbim.bim.schema # refactor -from blenderbim.bim.module.material.data import Data +from ifcopenshell.api.material.data import Data from blenderbim.bim.ifc import IfcStore from blenderbim.bim.prop import StrProperty, Attribute from bpy.types import PropertyGroup diff --git a/src/ifcblenderexport/blenderbim/bim/module/material/ui.py b/src/blenderbim/blenderbim/bim/module/material/ui.py similarity index 98% rename from src/ifcblenderexport/blenderbim/bim/module/material/ui.py rename to src/blenderbim/blenderbim/bim/module/material/ui.py index 60b2cec9da..6d432f673a 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/material/ui.py +++ b/src/blenderbim/blenderbim/bim/module/material/ui.py @@ -1,5 +1,5 @@ from bpy.types import Panel -from blenderbim.bim.module.material.data import Data +from ifcopenshell.api.material.data import Data from blenderbim.bim.ifc import IfcStore @@ -43,9 +43,9 @@ class BIM_PT_object_material(Panel): self.oprops = context.active_object.BIMObjectProperties self.props = context.active_object.BIMObjectMaterialProperties if not Data.is_loaded: - Data.load() + Data.load(IfcStore.get_file()) if self.oprops.ifc_definition_id not in Data.products: - Data.load(self.oprops.ifc_definition_id) + Data.load(IfcStore.get_file(), self.oprops.ifc_definition_id) self.product_data = Data.products[self.oprops.ifc_definition_id] if not Data.materials: diff --git a/src/ifcblenderexport/blenderbim/bim/module/model/__init__.py b/src/blenderbim/blenderbim/bim/module/model/__init__.py similarity index 100% rename from src/ifcblenderexport/blenderbim/bim/module/model/__init__.py rename to src/blenderbim/blenderbim/bim/module/model/__init__.py diff --git a/src/ifcblenderexport/blenderbim/bim/module/model/door.py b/src/blenderbim/blenderbim/bim/module/model/door.py similarity index 100% rename from src/ifcblenderexport/blenderbim/bim/module/model/door.py rename to src/blenderbim/blenderbim/bim/module/model/door.py diff --git a/src/ifcblenderexport/blenderbim/bim/module/model/grid.py b/src/blenderbim/blenderbim/bim/module/model/grid.py similarity index 83% rename from src/ifcblenderexport/blenderbim/bim/module/model/grid.py rename to src/blenderbim/blenderbim/bim/module/model/grid.py index 6f57f76ce3..17ffba617f 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/model/grid.py +++ b/src/blenderbim/blenderbim/bim/module/model/grid.py @@ -1,6 +1,5 @@ import bpy -import blenderbim.bim.module.grid.create_grid_axis as create_grid_axis -import blenderbim.bim.module.grid.create_axis_curve as create_axis_curve +import ifcopenshell.api from bpy.types import Operator from bpy.props import FloatProperty, IntProperty from mathutils import Vector @@ -54,10 +53,12 @@ def add_object(self, context): axes_collection.objects.link(obj) if self.file: - result = create_grid_axis.Usecase( - self.file, {"AxisTag": tag, "AxisCurve": obj, "UVWAxes": "UAxes", "Grid": grid} - ).execute() - create_axis_curve.Usecase(self.file, {"AxisCurve": obj, "grid_axis": result}).execute() + result = ifcopenshell.api.run( + "grid.create_grid_axis", + self.file, + **{"AxisTag": tag, "AxisCurve": obj, "UVWAxes": "UAxes", "Grid": grid}, + ) + ifcopenshell.api.run("grid.create_axis_curve", self.file, **{"AxisCurve": obj, "grid_axis": result}) obj.BIMObjectProperties.ifc_definition_id = result.id() axes_collection = bpy.data.collections.new("VAxes") @@ -77,10 +78,12 @@ def add_object(self, context): axes_collection.objects.link(obj) if IfcStore.get_file(): - result = create_grid_axis.Usecase( - self.file, {"AxisTag": tag, "AxisCurve": obj, "UVWAxes": "VAxes", "Grid": grid} - ).execute() - create_axis_curve.Usecase(self.file, {"AxisCurve": obj, "grid_axis": result}).execute() + result = ifcopenshell.api.run( + "grid.create_grid_axis", + self.file, + **{"AxisTag": tag, "AxisCurve": obj, "UVWAxes": "VAxes", "Grid": grid}, + ) + ifcopenshell.api.run("grid.create_axis_curve", self.file, **{"AxisCurve": obj, "grid_axis": result}) obj.BIMObjectProperties.ifc_definition_id = result.id() diff --git a/src/ifcblenderexport/blenderbim/bim/module/model/opening.py b/src/blenderbim/blenderbim/bim/module/model/opening.py similarity index 100% rename from src/ifcblenderexport/blenderbim/bim/module/model/opening.py rename to src/blenderbim/blenderbim/bim/module/model/opening.py diff --git a/src/ifcblenderexport/blenderbim/bim/module/model/pie.py b/src/blenderbim/blenderbim/bim/module/model/pie.py similarity index 100% rename from src/ifcblenderexport/blenderbim/bim/module/model/pie.py rename to src/blenderbim/blenderbim/bim/module/model/pie.py diff --git a/src/ifcblenderexport/blenderbim/bim/module/model/slab.py b/src/blenderbim/blenderbim/bim/module/model/slab.py similarity index 100% rename from src/ifcblenderexport/blenderbim/bim/module/model/slab.py rename to src/blenderbim/blenderbim/bim/module/model/slab.py diff --git a/src/ifcblenderexport/blenderbim/bim/module/model/stair.py b/src/blenderbim/blenderbim/bim/module/model/stair.py similarity index 100% rename from src/ifcblenderexport/blenderbim/bim/module/model/stair.py rename to src/blenderbim/blenderbim/bim/module/model/stair.py diff --git a/src/ifcblenderexport/blenderbim/bim/module/model/wall.py b/src/blenderbim/blenderbim/bim/module/model/wall.py similarity index 100% rename from src/ifcblenderexport/blenderbim/bim/module/model/wall.py rename to src/blenderbim/blenderbim/bim/module/model/wall.py diff --git a/src/ifcblenderexport/blenderbim/bim/module/model/window.py b/src/blenderbim/blenderbim/bim/module/model/window.py similarity index 100% rename from src/ifcblenderexport/blenderbim/bim/module/model/window.py rename to src/blenderbim/blenderbim/bim/module/model/window.py diff --git a/src/ifcblenderexport/blenderbim/bim/module/owner/__init__.py b/src/blenderbim/blenderbim/bim/module/owner/__init__.py similarity index 100% rename from src/ifcblenderexport/blenderbim/bim/module/owner/__init__.py rename to src/blenderbim/blenderbim/bim/module/owner/__init__.py diff --git a/src/ifcblenderexport/blenderbim/bim/module/owner/operator.py b/src/blenderbim/blenderbim/bim/module/owner/operator.py similarity index 78% rename from src/ifcblenderexport/blenderbim/bim/module/owner/operator.py rename to src/blenderbim/blenderbim/bim/module/owner/operator.py index 9fed15eb7c..8accd17301 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/owner/operator.py +++ b/src/blenderbim/blenderbim/bim/module/owner/operator.py @@ -1,19 +1,8 @@ import bpy import json -import blenderbim.bim.module.owner.add_person as add_person -import blenderbim.bim.module.owner.edit_person as edit_person -import blenderbim.bim.module.owner.remove_person as remove_person -import blenderbim.bim.module.owner.add_organisation as add_organisation -import blenderbim.bim.module.owner.edit_organisation as edit_organisation -import blenderbim.bim.module.owner.remove_organisation as remove_organisation -import blenderbim.bim.module.owner.add_role as add_role -import blenderbim.bim.module.owner.edit_role as edit_role -import blenderbim.bim.module.owner.remove_role as remove_role -import blenderbim.bim.module.owner.add_address as add_address -import blenderbim.bim.module.owner.edit_address as edit_address -import blenderbim.bim.module.owner.remove_address as remove_address +import ifcopenshell.api from blenderbim.bim.ifc import IfcStore -from blenderbim.bim.module.owner.data import Data +from ifcopenshell.api.owner.data import Data class EnableEditingPerson(bpy.types.Operator): @@ -50,8 +39,8 @@ class AddPerson(bpy.types.Operator): bl_label = "Add Person" def execute(self, context): - add_person.Usecase(IfcStore.get_file()).execute() - Data.load() + ifcopenshell.api.run("owner.add_person", IfcStore.get_file()) + Data.load(IfcStore.get_file()) return {"FINISHED"} @@ -73,10 +62,12 @@ class EditPerson(bpy.types.Operator): if self.file.schema == "IFC2X3": attributes["Id"] = attributes["Identification"] del attributes["Identification"] - edit_person.Usecase( - self.file, {"person": self.file.by_id(props.active_person_id), "attributes": attributes} - ).execute() - Data.load() + ifcopenshell.api.run( + "owner.edit_person", + self.file, + **{"person": self.file.by_id(props.active_person_id), "attributes": attributes} + ) + Data.load(IfcStore.get_file()) bpy.ops.bim.disable_editing_person() return {"FINISHED"} @@ -88,8 +79,8 @@ class RemovePerson(bpy.types.Operator): def execute(self, context): self.file = IfcStore.get_file() - remove_person.Usecase(self.file, {"person": self.file.by_id(self.person_id)}).execute() - Data.load() + ifcopenshell.api.run("owner.remove_person", self.file, **{"person": self.file.by_id(self.person_id)}) + Data.load(IfcStore.get_file()) return {"FINISHED"} @@ -125,8 +116,10 @@ class AddRole(bpy.types.Operator): def execute(self, context): self.file = IfcStore.get_file() - add_role.Usecase(self.file, {"assigned_object": self.file.by_id(self.assigned_object_id)}).execute() - Data.load() + ifcopenshell.api.run( + "owner.add_role", self.file, **{"assigned_object": self.file.by_id(self.assigned_object_id)} + ) + Data.load(IfcStore.get_file()) return {"FINISHED"} @@ -142,10 +135,10 @@ class EditRole(bpy.types.Operator): "UserDefinedRole": props.role.user_defined_role if props.role.name == "USERDEFINED" else None, "Description": props.role.description or None, } - edit_role.Usecase( - self.file, {"role": self.file.by_id(props.active_role_id), "attributes": attributes} - ).execute() - Data.load() + ifcopenshell.api.run( + "owner.edit_role", self.file, **{"role": self.file.by_id(props.active_role_id), "attributes": attributes} + ) + Data.load(IfcStore.get_file()) bpy.ops.bim.disable_editing_role() return {"FINISHED"} @@ -157,8 +150,8 @@ class RemoveRole(bpy.types.Operator): def execute(self, context): self.file = IfcStore.get_file() - remove_role.Usecase(self.file, {"role": self.file.by_id(self.role_id)}).execute() - Data.load() + ifcopenshell.api.run("owner.remove_role", self.file, **{"role": self.file.by_id(self.role_id)}) + Data.load(IfcStore.get_file()) return {"FINISHED"} @@ -170,10 +163,12 @@ class AddAddress(bpy.types.Operator): def execute(self, context): self.file = IfcStore.get_file() - add_address.Usecase( - self.file, {"assigned_object": self.file.by_id(self.assigned_object_id), "ifc_class": self.ifc_class} - ).execute() - Data.load() + ifcopenshell.api.run( + "owner.add_address", + self.file, + **{"assigned_object": self.file.by_id(self.assigned_object_id), "ifc_class": self.ifc_class} + ) + Data.load(IfcStore.get_file()) return {"FINISHED"} @@ -257,17 +252,19 @@ class EditAddress(bpy.types.Operator): if self.file.schema == "IFC2X3": del attributes["MessagingIDs"] elif address.is_a("IfcPostalAddress"): - attributes.update({ - "InternalLocation": props.address.internal_location or None, - "AddressLines": json.loads(props.address.address_lines) if props.address.address_lines else None, - "PostalBox": props.address.postal_box or None, - "Town": props.address.town or None, - "Region": props.address.region or None, - "PostalCode": props.address.postal_code or None, - "Country": props.address.country or None, - }) - edit_address.Usecase(self.file, {"address": address, "attributes": attributes}).execute() - Data.load() + attributes.update( + { + "InternalLocation": props.address.internal_location or None, + "AddressLines": json.loads(props.address.address_lines) if props.address.address_lines else None, + "PostalBox": props.address.postal_box or None, + "Town": props.address.town or None, + "Region": props.address.region or None, + "PostalCode": props.address.postal_code or None, + "Country": props.address.country or None, + } + ) + ifcopenshell.api.run("owner.edit_address", self.file, **{"address": address, "attributes": attributes}) + Data.load(IfcStore.get_file()) bpy.ops.bim.disable_editing_address() return {"FINISHED"} @@ -279,8 +276,8 @@ class RemoveAddress(bpy.types.Operator): def execute(self, context): self.file = IfcStore.get_file() - remove_address.Usecase(self.file, {"address": self.file.by_id(self.address_id)}).execute() - Data.load() + ifcopenshell.api.run("owner.remove_address", self.file, **{"address": self.file.by_id(self.address_id)}) + Data.load(IfcStore.get_file()) return {"FINISHED"} @@ -315,8 +312,8 @@ class AddOrganisation(bpy.types.Operator): bl_label = "Add Organisation" def execute(self, context): - add_organisation.Usecase(IfcStore.get_file()).execute() - Data.load() + ifcopenshell.api.run("owner.add_organisation", IfcStore.get_file()) + Data.load(IfcStore.get_file()) return {"FINISHED"} @@ -335,10 +332,12 @@ class EditOrganisation(bpy.types.Operator): if self.file.schema == "IFC2X3": attributes["Id"] = attributes["Identification"] del attributes["Identification"] - edit_organisation.Usecase( - self.file, {"organisation": self.file.by_id(props.active_organisation_id), "attributes": attributes} - ).execute() - Data.load() + ifcopenshell.api.run( + "owner.edit_organisation", + self.file, + **{"organisation": self.file.by_id(props.active_organisation_id), "attributes": attributes} + ) + Data.load(IfcStore.get_file()) bpy.ops.bim.disable_editing_organisation() return {"FINISHED"} @@ -350,6 +349,8 @@ class RemoveOrganisation(bpy.types.Operator): def execute(self, context): self.file = IfcStore.get_file() - remove_organisation.Usecase(self.file, {"organisation": self.file.by_id(self.organisation_id)}).execute() - Data.load() + ifcopenshell.api.run( + "owner.remove_organisation", self.file, **{"organisation": self.file.by_id(self.organisation_id)} + ) + Data.load(IfcStore.get_file()) return {"FINISHED"} diff --git a/src/ifcblenderexport/blenderbim/bim/module/owner/prop.py b/src/blenderbim/blenderbim/bim/module/owner/prop.py similarity index 96% rename from src/ifcblenderexport/blenderbim/bim/module/owner/prop.py rename to src/blenderbim/blenderbim/bim/module/owner/prop.py index da71f4b064..a92a6488fe 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/owner/prop.py +++ b/src/blenderbim/blenderbim/bim/module/owner/prop.py @@ -1,6 +1,7 @@ import bpy from blenderbim.bim.prop import StrProperty, Attribute -from blenderbim.bim.module.owner.data import Data +from blenderbim.bim.ifc import IfcStore +from ifcopenshell.api.owner.data import Data from bpy.types import PropertyGroup from bpy.props import ( PointerProperty, @@ -16,7 +17,7 @@ from bpy.props import ( def getPersons(self, context): if not Data.is_loaded: - Data.load() + Data.load(IfcStore.get_file()) results = [] for ifc_id, person in Data.people.items(): if "Id" in person: @@ -29,7 +30,7 @@ def getPersons(self, context): def getOrganisations(self, context): if not Data.is_loaded: - Data.load() + Data.load(IfcStore.get_file()) results = [] for ifc_id, organisation in Data.organisations.items(): results.append((str(ifc_id), organisation["Name"], "")) diff --git a/src/ifcblenderexport/blenderbim/bim/module/owner/ui.py b/src/blenderbim/blenderbim/bim/module/owner/ui.py similarity index 98% rename from src/ifcblenderexport/blenderbim/bim/module/owner/ui.py rename to src/blenderbim/blenderbim/bim/module/owner/ui.py index d0b82a39c0..d47cc605e5 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/owner/ui.py +++ b/src/blenderbim/blenderbim/bim/module/owner/ui.py @@ -1,6 +1,6 @@ import bpy from bpy.types import Panel -from blenderbim.bim.module.owner.data import Data +from ifcopenshell.api.owner.data import Data from blenderbim.bim.ifc import IfcStore @@ -106,7 +106,7 @@ class BIM_PT_people(Panel): def draw(self, context): if not Data.is_loaded: - Data.load() + Data.load(IfcStore.get_file()) self.file = IfcStore.get_file() self.layout.use_property_split = True @@ -166,7 +166,7 @@ class BIM_PT_organisations(Panel): def draw(self, context): if not Data.is_loaded: - Data.load() + Data.load(IfcStore.get_file()) self.file = IfcStore.get_file() self.layout.use_property_split = True @@ -215,7 +215,7 @@ class BIM_PT_owner(Panel): def draw(self, context): if not Data.is_loaded: - Data.load() + Data.load(IfcStore.get_file()) self.layout.use_property_split = True self.layout.use_property_decorate = False diff --git a/src/ifcblenderexport/blenderbim/bim/module/patch/__init__.py b/src/blenderbim/blenderbim/bim/module/patch/__init__.py similarity index 100% rename from src/ifcblenderexport/blenderbim/bim/module/patch/__init__.py rename to src/blenderbim/blenderbim/bim/module/patch/__init__.py diff --git a/src/ifcblenderexport/blenderbim/bim/module/patch/operator.py b/src/blenderbim/blenderbim/bim/module/patch/operator.py similarity index 100% rename from src/ifcblenderexport/blenderbim/bim/module/patch/operator.py rename to src/blenderbim/blenderbim/bim/module/patch/operator.py diff --git a/src/ifcblenderexport/blenderbim/bim/module/patch/prop.py b/src/blenderbim/blenderbim/bim/module/patch/prop.py similarity index 100% rename from src/ifcblenderexport/blenderbim/bim/module/patch/prop.py rename to src/blenderbim/blenderbim/bim/module/patch/prop.py diff --git a/src/ifcblenderexport/blenderbim/bim/module/patch/ui.py b/src/blenderbim/blenderbim/bim/module/patch/ui.py similarity index 100% rename from src/ifcblenderexport/blenderbim/bim/module/patch/ui.py rename to src/blenderbim/blenderbim/bim/module/patch/ui.py diff --git a/src/ifcblenderexport/blenderbim/bim/module/project/__init__.py b/src/blenderbim/blenderbim/bim/module/project/__init__.py similarity index 100% rename from src/ifcblenderexport/blenderbim/bim/module/project/__init__.py rename to src/blenderbim/blenderbim/bim/module/project/__init__.py diff --git a/src/ifcblenderexport/blenderbim/bim/module/project/operator.py b/src/blenderbim/blenderbim/bim/module/project/operator.py similarity index 91% rename from src/ifcblenderexport/blenderbim/bim/module/project/operator.py rename to src/blenderbim/blenderbim/bim/module/project/operator.py index b6ac9fbafe..6b56cd45cf 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/project/operator.py +++ b/src/blenderbim/blenderbim/bim/module/project/operator.py @@ -1,11 +1,11 @@ import bpy import logging import ifcopenshell -import blenderbim.bim.module.project.create_file as create_file +import ifcopenshell.api import bpy from blenderbim.bim.ifc import IfcStore -# from blenderbim.bim.module.project.data import Data +# from ifcopenshell.api.project.data import Data class CreateProject(bpy.types.Operator): @@ -17,7 +17,9 @@ class CreateProject(bpy.types.Operator): if self.file: return {"FINISHED"} - IfcStore.file = create_file.Usecase({"version": bpy.context.scene.BIMProperties.export_schema}).execute() + IfcStore.file = ifcopenshell.api.run( + "project.create_file", **{"version": bpy.context.scene.BIMProperties.export_schema} + ) self.file = IfcStore.get_file() bpy.ops.bim.add_person() diff --git a/src/ifcblenderexport/blenderbim/bim/module/project/prop.py b/src/blenderbim/blenderbim/bim/module/project/prop.py similarity index 100% rename from src/ifcblenderexport/blenderbim/bim/module/project/prop.py rename to src/blenderbim/blenderbim/bim/module/project/prop.py diff --git a/src/ifcblenderexport/blenderbim/bim/module/project/ui.py b/src/blenderbim/blenderbim/bim/module/project/ui.py similarity index 100% rename from src/ifcblenderexport/blenderbim/bim/module/project/ui.py rename to src/blenderbim/blenderbim/bim/module/project/ui.py diff --git a/src/ifcblenderexport/blenderbim/bim/module/pset/__init__.py b/src/blenderbim/blenderbim/bim/module/pset/__init__.py similarity index 100% rename from src/ifcblenderexport/blenderbim/bim/module/pset/__init__.py rename to src/blenderbim/blenderbim/bim/module/pset/__init__.py diff --git a/src/ifcblenderexport/blenderbim/bim/module/pset/operator.py b/src/blenderbim/blenderbim/bim/module/pset/operator.py similarity index 91% rename from src/ifcblenderexport/blenderbim/bim/module/pset/operator.py rename to src/blenderbim/blenderbim/bim/module/pset/operator.py index 7eaa907c3e..c5e53561fd 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/pset/operator.py +++ b/src/blenderbim/blenderbim/bim/module/pset/operator.py @@ -1,13 +1,9 @@ import bpy import json +import ifcopenshell.api import ifcopenshell.util.unit -import blenderbim.bim.module.pset.add_pset as add_pset -import blenderbim.bim.module.pset.edit_pset as edit_pset -import blenderbim.bim.module.pset.remove_pset as remove_pset -import blenderbim.bim.module.pset.add_qto as add_qto -import blenderbim.bim.module.pset.edit_qto as edit_qto from blenderbim.bim.ifc import IfcStore -from blenderbim.bim.module.pset.data import Data +from ifcopenshell.api.pset.data import Data from blenderbim.bim.module.pset.qto_calculator import QtoCalculator @@ -120,24 +116,26 @@ class EditPset(bpy.types.Operator): properties[prop["Name"]] = blender_prop.enum_value if pset_id in Data.psets: - edit_pset.Usecase( + ifcopenshell.api.run( + "pset.edit_pset", self.file, - { + **{ "pset": self.file.by_id(pset_id), "Name": props.active_pset_name, "Properties": properties, }, - ).execute() + ) else: - edit_qto.Usecase( + ifcopenshell.api.run( + "pset.edit_qto", self.file, - { + **{ "qto": self.file.by_id(pset_id), "Name": props.active_pset_name, "Properties": properties, }, - ).execute() - Data.load(oprops.ifc_definition_id) + ) + Data.load(IfcStore.get_file(), oprops.ifc_definition_id) bpy.ops.bim.disable_pset_editing(obj=self.obj, obj_type=self.obj_type) return {"FINISHED"} @@ -156,14 +154,15 @@ class RemovePset(bpy.types.Operator): elif self.obj_type == "Material": obj = bpy.data.materials.get(self.obj) props = obj.BIMObjectProperties - remove_pset.Usecase( + ifcopenshell.api.run( + "pset.remove_pset", self.file, - { + **{ "product": self.file.by_id(props.ifc_definition_id), "pset": self.file.by_id(self.pset_id), }, - ).execute() - Data.load(props.ifc_definition_id) + ) + Data.load(IfcStore.get_file(), props.ifc_definition_id) return {"FINISHED"} @@ -190,14 +189,15 @@ class AddPset(bpy.types.Operator): elif self.obj_type == "Material": pset_name = props.material_pset_name - add_pset.Usecase( + ifcopenshell.api.run( + "pset.add_pset", self.file, - { + **{ "product": self.file.by_id(oprops.ifc_definition_id), "Name": pset_name, }, - ).execute() - Data.load(oprops.ifc_definition_id) + ) + Data.load(IfcStore.get_file(), oprops.ifc_definition_id) return {"FINISHED"} @@ -210,14 +210,15 @@ class AddQto(bpy.types.Operator): obj = bpy.context.active_object oprops = obj.BIMObjectProperties props = obj.PsetProperties - add_qto.Usecase( + ifcopenshell.api.run( + "pset.add_qto", self.file, - { + **{ "product": self.file.by_id(oprops.ifc_definition_id), "Name": props.qto_name, }, - ).execute() - Data.load(oprops.ifc_definition_id) + ) + Data.load(IfcStore.get_file(), oprops.ifc_definition_id) return {"FINISHED"} diff --git a/src/ifcblenderexport/blenderbim/bim/module/pset/prop.py b/src/blenderbim/blenderbim/bim/module/pset/prop.py similarity index 97% rename from src/ifcblenderexport/blenderbim/bim/module/pset/prop.py rename to src/blenderbim/blenderbim/bim/module/pset/prop.py index 5e78835483..42c2904e8a 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/pset/prop.py +++ b/src/blenderbim/blenderbim/bim/module/pset/prop.py @@ -1,6 +1,6 @@ import bpy from blenderbim.bim.prop import Attribute -from blenderbim.bim.module.pset.data import Data +from ifcopenshell.api.pset.data import Data import blenderbim.bim.schema from bpy.types import PropertyGroup from bpy.props import ( diff --git a/src/ifcblenderexport/blenderbim/bim/module/pset/qto_calculator.py b/src/blenderbim/blenderbim/bim/module/pset/qto_calculator.py similarity index 100% rename from src/ifcblenderexport/blenderbim/bim/module/pset/qto_calculator.py rename to src/blenderbim/blenderbim/bim/module/pset/qto_calculator.py diff --git a/src/ifcblenderexport/blenderbim/bim/module/pset/ui.py b/src/blenderbim/blenderbim/bim/module/pset/ui.py similarity index 94% rename from src/ifcblenderexport/blenderbim/bim/module/pset/ui.py rename to src/blenderbim/blenderbim/bim/module/pset/ui.py index d086b4f22d..d6f5110a74 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/pset/ui.py +++ b/src/blenderbim/blenderbim/bim/module/pset/ui.py @@ -1,5 +1,5 @@ from bpy.types import Panel -from blenderbim.bim.module.pset.data import Data +from ifcopenshell.api.pset.data import Data from blenderbim.bim.ifc import IfcStore @@ -100,7 +100,7 @@ class BIM_PT_object_psets(Panel): if not props.ifc_definition_id: return False if props.ifc_definition_id not in Data.products: - Data.load(props.ifc_definition_id) + Data.load(IfcStore.get_file(), props.ifc_definition_id) if not Data.products[props.ifc_definition_id]: return False return True @@ -111,7 +111,7 @@ class BIM_PT_object_psets(Panel): if not oprops.ifc_definition_id: return if oprops.ifc_definition_id not in Data.products: - Data.load(oprops.ifc_definition_id) + Data.load(IfcStore.get_file(), oprops.ifc_definition_id) row = self.layout.row(align=True) row.prop(props, "pset_name", text="") op = row.operator("bim.add_pset", icon="ADD", text="") @@ -143,7 +143,7 @@ class BIM_PT_object_qtos(Panel): if not props.ifc_definition_id: return False if props.ifc_definition_id not in Data.products: - Data.load(props.ifc_definition_id) + Data.load(IfcStore.get_file(), props.ifc_definition_id) if not Data.products[props.ifc_definition_id]: return False return True @@ -154,7 +154,7 @@ class BIM_PT_object_qtos(Panel): if not oprops.ifc_definition_id: return if oprops.ifc_definition_id not in Data.products: - Data.load(oprops.ifc_definition_id) + Data.load(IfcStore.get_file(), oprops.ifc_definition_id) row = self.layout.row(align=True) row.prop(props, "qto_name", text="") row.operator("bim.add_qto", icon="ADD", text="") @@ -183,7 +183,7 @@ class BIM_PT_material_psets(Panel): if IfcStore.get_file().schema == "IFC2X3": return False # We don't support material psets in IFC2X3 because they suck if props.ifc_definition_id not in Data.products: - Data.load(props.ifc_definition_id) + Data.load(IfcStore.get_file(), props.ifc_definition_id) if not Data.products[props.ifc_definition_id]: return False return True @@ -194,7 +194,7 @@ class BIM_PT_material_psets(Panel): if not oprops.ifc_definition_id: return if oprops.ifc_definition_id not in Data.products: - Data.load(oprops.ifc_definition_id) + Data.load(IfcStore.get_file(), oprops.ifc_definition_id) row = self.layout.row(align=True) row.prop(props, "material_pset_name", text="") op = row.operator("bim.add_pset", icon="ADD", text="") diff --git a/src/ifcblenderexport/blenderbim/bim/module/pset_template/__init__.py b/src/blenderbim/blenderbim/bim/module/pset_template/__init__.py similarity index 100% rename from src/ifcblenderexport/blenderbim/bim/module/pset_template/__init__.py rename to src/blenderbim/blenderbim/bim/module/pset_template/__init__.py diff --git a/src/ifcblenderexport/blenderbim/bim/module/pset_template/operator.py b/src/blenderbim/blenderbim/bim/module/pset_template/operator.py similarity index 82% rename from src/ifcblenderexport/blenderbim/bim/module/pset_template/operator.py rename to src/blenderbim/blenderbim/bim/module/pset_template/operator.py index 6193be7a68..d83737be2e 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/pset_template/operator.py +++ b/src/blenderbim/blenderbim/bim/module/pset_template/operator.py @@ -1,13 +1,8 @@ import bpy import ifcopenshell -import blenderbim.bim.module.pset_template.add_pset_template as add_pset_template -import blenderbim.bim.module.pset_template.edit_pset_template as edit_pset_template -import blenderbim.bim.module.pset_template.remove_pset_template as remove_pset_template -import blenderbim.bim.module.pset_template.add_prop_template as add_prop_template -import blenderbim.bim.module.pset_template.edit_prop_template as edit_prop_template -import blenderbim.bim.module.pset_template.remove_prop_template as remove_prop_template +import ifcopenshell.api from blenderbim.bim.module.pset_template.prop import updatePsetTemplateFiles, updatePsetTemplates -from blenderbim.bim.module.pset_template.data import Data +from ifcopenshell.api.pset_template.data import Data from blenderbim.bim.ifc import IfcStore @@ -17,8 +12,8 @@ class AddPsetTemplate(bpy.types.Operator): def execute(self, context): props = context.scene.BIMPsetTemplateProperties - add_pset_template.Usecase(IfcStore.pset_template_file).execute() - Data.load() + ifcopenshell.api.run("pset_template.add_pset_template", IfcStore.pset_template_file) + Data.load(IfcStore.pset_template_file) updatePsetTemplates(self, context) return {"FINISHED"} @@ -31,10 +26,10 @@ class RemovePsetTemplate(bpy.types.Operator): props = context.scene.BIMPsetTemplateProperties if props.active_pset_template_id == int(props.pset_templates): bpy.ops.bim.disable_editing_pset_template() - remove_pset_template.Usecase(IfcStore.pset_template_file, { + ifcopenshell.api.run("pset_template.remove_pset_template", IfcStore.pset_template_file, **{ "pset_template": IfcStore.pset_template_file.by_id(int(props.pset_templates)) - }).execute() - Data.load() + }) + Data.load(IfcStore.pset_template_file) updatePsetTemplates(self, context) return {"FINISHED"} @@ -96,7 +91,7 @@ class EditPsetTemplate(bpy.types.Operator): def execute(self, context): props = context.scene.BIMPsetTemplateProperties - edit_pset_template.Usecase(IfcStore.pset_template_file, { + ifcopenshell.api.run("pset_template.edit_pset_template", IfcStore.pset_template_file, **{ "pset_template": IfcStore.pset_template_file.by_id(props.active_pset_template_id), "attributes": { "Name": props.active_pset_template.name, @@ -104,8 +99,8 @@ class EditPsetTemplate(bpy.types.Operator): "TemplateType": props.active_pset_template.template_type, "ApplicableEntity": props.active_pset_template.applicable_entity, } - }).execute() - Data.load() + }) + Data.load(IfcStore.pset_template_file) updatePsetTemplates(self, context) bpy.ops.bim.disable_editing_pset_template() return {"FINISHED"} @@ -127,10 +122,10 @@ class AddPropTemplate(bpy.types.Operator): def execute(self, context): props = context.scene.BIMPsetTemplateProperties pset_template_id = props.active_pset_template_id or int(props.pset_templates) - add_prop_template.Usecase(IfcStore.pset_template_file, { + ifcopenshell.api.run("pset_template.add_prop_template", IfcStore.pset_template_file, **{ "pset_template": IfcStore.pset_template_file.by_id(pset_template_id) - }).execute() - Data.load() + }) + Data.load(IfcStore.pset_template_file) return {"FINISHED"} @@ -141,10 +136,10 @@ class RemovePropTemplate(bpy.types.Operator): def execute(self, context): props = context.scene.BIMPsetTemplateProperties - remove_prop_template.Usecase(IfcStore.pset_template_file, { + ifcopenshell.api.run("pset_template.remove_prop_template", IfcStore.pset_template_file, **{ "prop_template": IfcStore.pset_template_file.by_id(self.prop_template) - }).execute() - Data.load() + }) + Data.load(IfcStore.pset_template_file) return {"FINISHED"} @@ -154,14 +149,14 @@ class EditPropTemplate(bpy.types.Operator): def execute(self, context): props = context.scene.BIMPsetTemplateProperties - edit_prop_template.Usecase(IfcStore.pset_template_file, { + ifcopenshell.api.run("pset_template.edit_prop_template", IfcStore.pset_template_file, **{ "prop_template": IfcStore.pset_template_file.by_id(props.active_prop_template_id), "attributes": { "Name": props.active_prop_template.name, "Description": props.active_prop_template.description, "PrimaryMeasureType": props.active_prop_template.primary_measure_type, } - }).execute() - Data.load() + }) + Data.load(IfcStore.pset_template_file) bpy.ops.bim.disable_editing_prop_template() return {"FINISHED"} diff --git a/src/ifcblenderexport/blenderbim/bim/module/pset_template/prop.py b/src/blenderbim/blenderbim/bim/module/pset_template/prop.py similarity index 99% rename from src/ifcblenderexport/blenderbim/bim/module/pset_template/prop.py rename to src/blenderbim/blenderbim/bim/module/pset_template/prop.py index e5f812f6a7..9a570bf5a0 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/pset_template/prop.py +++ b/src/blenderbim/blenderbim/bim/module/pset_template/prop.py @@ -14,7 +14,7 @@ from bpy.props import ( FloatVectorProperty, CollectionProperty, ) -from blenderbim.bim.module.pset_template.data import Data +from ifcopenshell.api.pset_template.data import Data psettemplatefiles_enum = [] @@ -58,7 +58,7 @@ def getPsetTemplates(self, context): IfcStore.pset_template_file = ifcopenshell.open(IfcStore.pset_template_path) templates = IfcStore.pset_template_file.by_type("IfcPropertySetTemplate") psettemplates_enum.extend([(str(t.id()), t.Name, "") for t in templates]) - Data.load() + Data.load(IfcStore.get_file()) return psettemplates_enum diff --git a/src/ifcblenderexport/blenderbim/bim/module/pset_template/ui.py b/src/blenderbim/blenderbim/bim/module/pset_template/ui.py similarity index 96% rename from src/ifcblenderexport/blenderbim/bim/module/pset_template/ui.py rename to src/blenderbim/blenderbim/bim/module/pset_template/ui.py index 609761bab2..49813c0c96 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/pset_template/ui.py +++ b/src/blenderbim/blenderbim/bim/module/pset_template/ui.py @@ -1,6 +1,7 @@ import bpy from bpy.types import Panel -from blenderbim.bim.module.pset_template.data import Data +from blenderbim.bim.ifc import IfcStore +from ifcopenshell.api.pset_template.data import Data class BIM_PT_pset_template(Panel): @@ -37,7 +38,7 @@ class BIM_PT_pset_template(Panel): # row.operator("bim.save_pset_template", text="", icon="EXPORT") if not Data.is_loaded and props.pset_template_files: - Data.load() + Data.load(IfcStore.get_file()) if not Data.pset_templates: return diff --git a/src/ifcblenderexport/blenderbim/bim/module/qto/__init__.py b/src/blenderbim/blenderbim/bim/module/qto/__init__.py similarity index 100% rename from src/ifcblenderexport/blenderbim/bim/module/qto/__init__.py rename to src/blenderbim/blenderbim/bim/module/qto/__init__.py diff --git a/src/ifcblenderexport/blenderbim/bim/module/qto/operator.py b/src/blenderbim/blenderbim/bim/module/qto/operator.py similarity index 100% rename from src/ifcblenderexport/blenderbim/bim/module/qto/operator.py rename to src/blenderbim/blenderbim/bim/module/qto/operator.py diff --git a/src/ifcblenderexport/blenderbim/bim/module/qto/prop.py b/src/blenderbim/blenderbim/bim/module/qto/prop.py similarity index 88% rename from src/ifcblenderexport/blenderbim/bim/module/qto/prop.py rename to src/blenderbim/blenderbim/bim/module/qto/prop.py index ef3b6f0369..205d3e39ef 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/qto/prop.py +++ b/src/blenderbim/blenderbim/bim/module/qto/prop.py @@ -1,6 +1,5 @@ import bpy from blenderbim.bim.prop import StrProperty, Attribute -from blenderbim.bim.module.owner.data import Data from bpy.types import PropertyGroup from bpy.props import ( PointerProperty, diff --git a/src/ifcblenderexport/blenderbim/bim/module/qto/ui.py b/src/blenderbim/blenderbim/bim/module/qto/ui.py similarity index 100% rename from src/ifcblenderexport/blenderbim/bim/module/qto/ui.py rename to src/blenderbim/blenderbim/bim/module/qto/ui.py diff --git a/src/ifcblenderexport/blenderbim/bim/module/root/__init__.py b/src/blenderbim/blenderbim/bim/module/root/__init__.py similarity index 100% rename from src/ifcblenderexport/blenderbim/bim/module/root/__init__.py rename to src/blenderbim/blenderbim/bim/module/root/__init__.py diff --git a/src/ifcblenderexport/blenderbim/bim/module/root/operator.py b/src/blenderbim/blenderbim/bim/module/root/operator.py similarity index 89% rename from src/ifcblenderexport/blenderbim/bim/module/root/operator.py rename to src/blenderbim/blenderbim/bim/module/root/operator.py index 804941a595..0af5b8bddb 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/root/operator.py +++ b/src/blenderbim/blenderbim/bim/module/root/operator.py @@ -1,13 +1,10 @@ import bpy import numpy as np import ifcopenshell +import ifcopenshell.api import ifcopenshell.util.schema import ifcopenshell.util.element -import blenderbim.bim.module.root.create_product as create_product -import blenderbim.bim.module.root.remove_product as remove_product -import blenderbim.bim.module.root.reassign_class as reassign_class -import blenderbim.bim.module.root.copy_class as copy_class -from blenderbim.bim.module.geometry.data import Data as GeometryData +from ifcopenshell.api.geometry.data import Data as GeometryData from blenderbim.bim.ifc import IfcStore @@ -61,14 +58,15 @@ class ReassignClass(bpy.types.Operator): if predefined_type == "USERDEFINED": predefined_type = bpy.context.scene.BIMRootProperties.ifc_userdefined_type for obj in objects: - product = reassign_class.Usecase( + product = ifcopenshell.api.run( + "root.reassign_class", self.file, - { + **{ "product": self.file.by_id(obj.BIMObjectProperties.ifc_definition_id), "ifc_class": bpy.context.scene.BIMRootProperties.ifc_class, "predefined_type": predefined_type, }, - ).execute() + ) obj.name = "{}/{}".format(product.is_a(), "/".join(obj.name.split("/")[1:])) IfcStore.link_element(product, obj) obj.BIMObjectProperties.is_reassigning_class = False @@ -103,14 +101,15 @@ class AssignClass(bpy.types.Operator): def assign_class(self, context, obj): if obj.BIMObjectProperties.ifc_definition_id: return - product = create_product.Usecase( + product = ifcopenshell.api.run( + "root.create_entity", self.file, - { + **{ "ifc_class": self.ifc_class, "predefined_type": self.predefined_type, "name": obj.name, }, - ).execute() + ) obj.name = "{}/{}".format(product.is_a(), obj.name) IfcStore.link_element(product, obj) @@ -184,21 +183,14 @@ class UnassignClass(bpy.types.Operator): if not obj.BIMObjectProperties.ifc_definition_id: continue product = self.file.by_id(obj.BIMObjectProperties.ifc_definition_id) - self.remove_representations(obj, product) IfcStore.unlink_element(product, obj) - remove_product.Usecase(self.file, {"product": product}).execute() - # TODO: remove object placement + ifcopenshell.api.run("root.remove_product", self.file, **{"product": product}) if "/" in obj.name and obj.name[0:3] == "Ifc": obj.name = "/".join(obj.name.split("/")[1:]) if obj.data and obj.data.name == "Void": bpy.data.objects.remove(obj) return {"FINISHED"} - def remove_representations(self, obj, product): - GeometryData.load(product.id()) - for representation_id in GeometryData.products[product.id()]: - bpy.ops.bim.remove_representation(obj=obj.name, representation_id=representation_id) - class UnlinkObject(bpy.types.Operator): bl_idname = "bim.unlink_object" @@ -233,9 +225,9 @@ class CopyClass(bpy.types.Operator): for obj in objects: if not obj.BIMObjectProperties.ifc_definition_id: continue - result = copy_class.Usecase( - self.file, {"product": self.file.by_id(obj.BIMObjectProperties.ifc_definition_id)} - ).execute() + result = ifcopenshell.api.run( + "root.copy_class", self.file, **{"product": self.file.by_id(obj.BIMObjectProperties.ifc_definition_id)} + ) IfcStore.link_element(result, obj) relating_type = ifcopenshell.util.element.get_type(result) if relating_type and relating_type.RepresentationMaps: diff --git a/src/ifcblenderexport/blenderbim/bim/module/root/prop.py b/src/blenderbim/blenderbim/bim/module/root/prop.py similarity index 100% rename from src/ifcblenderexport/blenderbim/bim/module/root/prop.py rename to src/blenderbim/blenderbim/bim/module/root/prop.py diff --git a/src/ifcblenderexport/blenderbim/bim/module/root/ui.py b/src/blenderbim/blenderbim/bim/module/root/ui.py similarity index 96% rename from src/ifcblenderexport/blenderbim/bim/module/root/ui.py rename to src/blenderbim/blenderbim/bim/module/root/ui.py index b973cfa1f0..d30a7ffe40 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/root/ui.py +++ b/src/blenderbim/blenderbim/bim/module/root/ui.py @@ -1,6 +1,6 @@ import bpy from bpy.types import Panel -from blenderbim.bim.module.root.data import Data +from ifcopenshell.api.root.data import Data from blenderbim.bim.ifc import IfcStore @@ -20,7 +20,7 @@ class BIM_PT_class(Panel): if props.ifc_definition_id: if props.ifc_definition_id not in Data.products: try: - Data.load(props.ifc_definition_id) + Data.load(IfcStore.get_file(), props.ifc_definition_id) except: row = self.layout.row(align=True) row.label(text="IFC Element Not Found") diff --git a/src/ifcblenderexport/blenderbim/bim/module/search/__init__.py b/src/blenderbim/blenderbim/bim/module/search/__init__.py similarity index 100% rename from src/ifcblenderexport/blenderbim/bim/module/search/__init__.py rename to src/blenderbim/blenderbim/bim/module/search/__init__.py diff --git a/src/ifcblenderexport/blenderbim/bim/module/search/operator.py b/src/blenderbim/blenderbim/bim/module/search/operator.py similarity index 98% rename from src/ifcblenderexport/blenderbim/bim/module/search/operator.py rename to src/blenderbim/blenderbim/bim/module/search/operator.py index 80788ae87d..500fd42cc3 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/search/operator.py +++ b/src/blenderbim/blenderbim/bim/module/search/operator.py @@ -41,15 +41,17 @@ def does_keyword_exist(pattern, string): class SelectGlobalId(bpy.types.Operator): bl_idname = "bim.select_global_id" bl_label = "Select GlobalId" + global_id: bpy.props.StringProperty() def execute(self, context): self.file = IfcStore.get_file() props = context.scene.BIMSearchProperties + global_id = self.global_id or props.global_id for obj in context.visible_objects: if not obj.BIMObjectProperties.ifc_definition_id: continue element = self.file.by_id(obj.BIMObjectProperties.ifc_definition_id) - if element.GlobalId == props.global_id: + if element.GlobalId == global_id: obj.select_set(True) break return {"FINISHED"} diff --git a/src/ifcblenderexport/blenderbim/bim/module/search/prop.py b/src/blenderbim/blenderbim/bim/module/search/prop.py similarity index 100% rename from src/ifcblenderexport/blenderbim/bim/module/search/prop.py rename to src/blenderbim/blenderbim/bim/module/search/prop.py diff --git a/src/ifcblenderexport/blenderbim/bim/module/search/ui.py b/src/blenderbim/blenderbim/bim/module/search/ui.py similarity index 100% rename from src/ifcblenderexport/blenderbim/bim/module/search/ui.py rename to src/blenderbim/blenderbim/bim/module/search/ui.py diff --git a/src/ifcblenderexport/blenderbim/bim/module/sequence/__init__.py b/src/blenderbim/blenderbim/bim/module/sequence/__init__.py similarity index 82% rename from src/ifcblenderexport/blenderbim/bim/module/sequence/__init__.py rename to src/blenderbim/blenderbim/bim/module/sequence/__init__.py index 15641355a0..26a02991c2 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/sequence/__init__.py +++ b/src/blenderbim/blenderbim/bim/module/sequence/__init__.py @@ -4,8 +4,11 @@ from . import ui, prop, operator classes = ( operator.LoadTasks, operator.DisableTaskEditingUI, + operator.AddWorkPlan, + operator.RemoveWorkPlan, prop.Task, prop.BIMTaskProperties, + ui.BIM_PT_work_plans, ui.BIM_PT_tasks, ui.BIM_UL_tasks, ) diff --git a/src/ifcblenderexport/blenderbim/bim/module/sequence/operator.py b/src/blenderbim/blenderbim/bim/module/sequence/operator.py similarity index 52% rename from src/ifcblenderexport/blenderbim/bim/module/sequence/operator.py rename to src/blenderbim/blenderbim/bim/module/sequence/operator.py index 97cb506169..8fb1570267 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/sequence/operator.py +++ b/src/blenderbim/blenderbim/bim/module/sequence/operator.py @@ -1,6 +1,30 @@ import bpy +import ifcopenshell.api from blenderbim.bim.ifc import IfcStore -from blenderbim.bim.module.sequence.data import Data +from ifcopenshell.api.sequence.data import Data + + +class AddWorkPlan(bpy.types.Operator): + bl_idname = "bim.add_work_plan" + bl_label = "Add Work Plan" + + def execute(self, context): + ifcopenshell.api.run("sequence.add_work_plan", IfcStore.get_file()) + Data.load(IfcStore.get_file()) + return {"FINISHED"} + + +class RemoveWorkPlan(bpy.types.Operator): + bl_idname = "bim.remove_work_plan" + bl_label = "Remove Work Plan" + work_plan: bpy.props.IntProperty() + + def execute(self, context): + ifcopenshell.api.run( + "sequence.remove_work_plan", IfcStore.get_file(), work_plan=IfcStore.get_file().by_id(self.work_plan) + ) + Data.load(IfcStore.get_file()) + return {"FINISHED"} class LoadTasks(bpy.types.Operator): diff --git a/src/ifcblenderexport/blenderbim/bim/module/sequence/prop.py b/src/blenderbim/blenderbim/bim/module/sequence/prop.py similarity index 100% rename from src/ifcblenderexport/blenderbim/bim/module/sequence/prop.py rename to src/blenderbim/blenderbim/bim/module/sequence/prop.py diff --git a/src/ifcblenderexport/blenderbim/bim/module/sequence/ui.py b/src/blenderbim/blenderbim/bim/module/sequence/ui.py similarity index 61% rename from src/ifcblenderexport/blenderbim/bim/module/sequence/ui.py rename to src/blenderbim/blenderbim/bim/module/sequence/ui.py index 7334c7d788..f38abf8161 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/sequence/ui.py +++ b/src/blenderbim/blenderbim/bim/module/sequence/ui.py @@ -1,6 +1,32 @@ from bpy.types import Panel, UIList from blenderbim.bim.ifc import IfcStore -from blenderbim.bim.module.sequence.data import Data +from ifcopenshell.api.sequence.data import Data + + +class BIM_PT_work_plans(Panel): + bl_label = "IFC Work Plans" + bl_idname = "BIM_PT_work_plans" + bl_options = {"DEFAULT_CLOSED"} + bl_space_type = "PROPERTIES" + bl_region_type = "WINDOW" + bl_context = "scene" + + @classmethod + def poll(cls, context): + return IfcStore.get_file() + + def draw(self, context): + if not Data.is_loaded: + Data.load(IfcStore.get_file()) + + row = self.layout.row() + row.operator("bim.add_work_plan", icon="ADD") + + for work_plan_id, work_plan in Data.work_plans.items(): + row = self.layout.row(align=True) + row.label(text=work_plan["Name"] or "Unnamed", icon="TEXT") + row.operator("bim.add_work_plan", text="", icon="GREASEPENCIL") + row.operator("bim.remove_work_plan", text="", icon="X").work_plan = work_plan_id class BIM_PT_tasks(Panel): @@ -17,7 +43,7 @@ class BIM_PT_tasks(Panel): def draw(self, context): if not Data.is_loaded: - Data.load() + Data.load(IfcStore.get_file()) self.props = context.scene.BIMTaskProperties row = self.layout.row(align=True) diff --git a/src/ifcblenderexport/blenderbim/bim/module/spatial/__init__.py b/src/blenderbim/blenderbim/bim/module/spatial/__init__.py similarity index 100% rename from src/ifcblenderexport/blenderbim/bim/module/spatial/__init__.py rename to src/blenderbim/blenderbim/bim/module/spatial/__init__.py diff --git a/src/ifcblenderexport/blenderbim/bim/module/spatial/operator.py b/src/blenderbim/blenderbim/bim/module/spatial/operator.py similarity index 90% rename from src/ifcblenderexport/blenderbim/bim/module/spatial/operator.py rename to src/blenderbim/blenderbim/bim/module/spatial/operator.py index 8a0c83a9bd..a51948d3d9 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/spatial/operator.py +++ b/src/blenderbim/blenderbim/bim/module/spatial/operator.py @@ -1,8 +1,7 @@ import bpy -import blenderbim.bim.module.spatial.assign_container as assign_container -import blenderbim.bim.module.spatial.remove_container as remove_container +import ifcopenshell.api from blenderbim.bim.ifc import IfcStore -from blenderbim.bim.module.spatial.data import Data +from ifcopenshell.api.spatial.data import Data from blenderbim.bim.module.spatial.prop import getSpatialContainers @@ -24,15 +23,16 @@ class AssignContainer(bpy.types.Operator): self.relating_structure or sprops.spatial_elements[sprops.active_spatial_element_index].ifc_definition_id ) - assign_container.Usecase( + ifcopenshell.api.run( + "spatial.assign_container", self.file, - { + **{ "product": self.file.by_id(oprops.ifc_definition_id), "relating_structure": self.file.by_id(relating_structure), }, - ).execute() + ) bpy.ops.bim.edit_object_placement(obj=related_element.name) - Data.load(oprops.ifc_definition_id) + Data.load(IfcStore.get_file(), oprops.ifc_definition_id) bpy.ops.bim.disable_editing_container(obj=related_element.name) aggregate_collection = bpy.data.collections.get(related_element.name) @@ -100,8 +100,10 @@ class RemoveContainer(bpy.types.Operator): obj = bpy.data.objects.get(self.obj) if self.obj else bpy.context.active_object oprops = obj.BIMObjectProperties self.file = IfcStore.get_file() - remove_container.Usecase(self.file, {"product": self.file.by_id(oprops.ifc_definition_id)}).execute() - Data.load(oprops.ifc_definition_id) + ifcopenshell.api.run( + "spatial.remove_container", self.file, **{"product": self.file.by_id(oprops.ifc_definition_id)} + ) + Data.load(IfcStore.get_file(), oprops.ifc_definition_id) aggregate_collection = bpy.data.collections.get(obj.name) if aggregate_collection: diff --git a/src/ifcblenderexport/blenderbim/bim/module/spatial/prop.py b/src/blenderbim/blenderbim/bim/module/spatial/prop.py similarity index 96% rename from src/ifcblenderexport/blenderbim/bim/module/spatial/prop.py rename to src/blenderbim/blenderbim/bim/module/spatial/prop.py index b64228df37..4f14eacf29 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/spatial/prop.py +++ b/src/blenderbim/blenderbim/bim/module/spatial/prop.py @@ -1,6 +1,6 @@ import bpy from blenderbim.bim.prop import StrProperty, Attribute -from blenderbim.bim.module.spatial.data import Data +from ifcopenshell.api.spatial.data import Data from blenderbim.bim.ifc import IfcStore from bpy.types import PropertyGroup from bpy.props import ( @@ -16,7 +16,7 @@ from bpy.props import ( def getSpatialContainers(self, context, parent_id=None): - Data.load() + Data.load(IfcStore.get_file()) self.file = IfcStore.get_file() props = context.scene.BIMSpatialProperties while len(props.spatial_elements) > 0: diff --git a/src/ifcblenderexport/blenderbim/bim/module/spatial/ui.py b/src/blenderbim/blenderbim/bim/module/spatial/ui.py similarity index 91% rename from src/ifcblenderexport/blenderbim/bim/module/spatial/ui.py rename to src/blenderbim/blenderbim/bim/module/spatial/ui.py index be8dab598a..b54ce3606e 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/spatial/ui.py +++ b/src/blenderbim/blenderbim/bim/module/spatial/ui.py @@ -1,5 +1,6 @@ from bpy.types import Panel, UIList -from blenderbim.bim.module.spatial.data import Data +from blenderbim.bim.ifc import IfcStore +from ifcopenshell.api.spatial.data import Data class BIM_PT_spatial(Panel): @@ -17,7 +18,7 @@ class BIM_PT_spatial(Panel): if not oprops.ifc_definition_id: return False if oprops.ifc_definition_id not in Data.products: - Data.load(oprops.ifc_definition_id) + Data.load(IfcStore.get_file(), oprops.ifc_definition_id) if not Data.products[oprops.ifc_definition_id]: return False return True @@ -29,7 +30,7 @@ class BIM_PT_spatial(Panel): if not oprops.ifc_definition_id: return if oprops.ifc_definition_id not in Data.products: - Data.load(oprops.ifc_definition_id) + Data.load(IfcStore.get_file(), oprops.ifc_definition_id) if props.is_editing: row = self.layout.row(align=True) diff --git a/src/ifcblenderexport/blenderbim/bim/module/structural/__init__.py b/src/blenderbim/blenderbim/bim/module/structural/__init__.py similarity index 86% rename from src/ifcblenderexport/blenderbim/bim/module/structural/__init__.py rename to src/blenderbim/blenderbim/bim/module/structural/__init__.py index eaac7afdc2..816b5b374e 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/structural/__init__.py +++ b/src/blenderbim/blenderbim/bim/module/structural/__init__.py @@ -16,6 +16,10 @@ classes = ( operator.RemoveStructuralBoundaryCondition, operator.EnableEditingStructuralBoundaryCondition, operator.DisableEditingStructuralBoundaryCondition, + operator.AddStructuralMemberConnection, + operator.EnableEditingStructuralConnectionCondition, + operator.DisableEditingStructuralConnectionCondition, + operator.RemoveStructuralConnectionCondition, prop.StructuralAnalysisModel, prop.BIMStructuralProperties, prop.BIMObjectStructuralProperties, diff --git a/src/ifcblenderexport/blenderbim/bim/module/structural/operator.py b/src/blenderbim/blenderbim/bim/module/structural/operator.py similarity index 57% rename from src/ifcblenderexport/blenderbim/bim/module/structural/operator.py rename to src/blenderbim/blenderbim/bim/module/structural/operator.py index cf72861d87..a997d2e91f 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/structural/operator.py +++ b/src/blenderbim/blenderbim/bim/module/structural/operator.py @@ -1,55 +1,120 @@ import bpy import json -import blenderbim.bim.module.structural.add_structural_boundary_condition as add_structural_boundary_condition -import blenderbim.bim.module.structural.edit_structural_boundary_condition as edit_structural_boundary_condition -import blenderbim.bim.module.structural.remove_structural_boundary_condition as remove_structural_boundary_condition -import blenderbim.bim.module.structural.add_structural_analysis_model as add_structural_analysis_model -import blenderbim.bim.module.structural.edit_structural_analysis_model as edit_structural_analysis_model -import blenderbim.bim.module.structural.remove_structural_analysis_model as remove_structural_analysis_model -import blenderbim.bim.module.structural.assign_structural_analysis_model as assign_structural_analysis_model -import blenderbim.bim.module.structural.unassign_structural_analysis_model as unassign_structural_analysis_model +import ifcopenshell +import ifcopenshell.api from blenderbim.bim.ifc import IfcStore -from blenderbim.bim.module.structural.data import Data +from ifcopenshell.api.structural.data import Data +from ifcopenshell.api.context.data import Data as ContextData + + +class AddStructuralMemberConnection(bpy.types.Operator): + bl_idname = "bim.add_structural_member_connection" + bl_label = "Add Structural Member Connection" + + def execute(self, context): + obj = bpy.context.active_object + oprops = obj.BIMObjectProperties + props = obj.BIMStructuralProperties + file = IfcStore.get_file() + related_structural_connection = file.by_id(oprops.ifc_definition_id) + relating_structural_member = file.by_id(props.relating_structural_member.BIMObjectProperties.ifc_definition_id) + if not relating_structural_member.is_a("IfcStructuralMember"): + return {"FINISHED"} + ifcopenshell.api.run( + "structural.add_structural_member_connection", + file, + relating_structural_member=relating_structural_member, + related_structural_connection=related_structural_connection, + ) + props.relating_structural_member = None + Data.load(IfcStore.get_file(), related_structural_connection.id()) + return {"FINISHED"} + + +class EnableEditingStructuralConnectionCondition(bpy.types.Operator): + bl_idname = "bim.enable_editing_structural_connection_condition" + bl_label = "Enable Editing Structural Connection Condition" + connects_structural_member: bpy.props.IntProperty() + + def execute(self, context): + obj = bpy.context.active_object + oprops = obj.BIMObjectProperties + props = obj.BIMStructuralProperties + applied_condition_id = Data.connects_structural_members[self.connects_structural_member]["AppliedCondition"] + props.active_connects_structural_member = self.connects_structural_member + return {"FINISHED"} + + +class DisableEditingStructuralConnectionCondition(bpy.types.Operator): + bl_idname = "bim.disable_editing_structural_connection_condition" + bl_label = "Disable Editing Structural Connection Condition" + + def execute(self, context): + obj = bpy.context.active_object + props = obj.BIMStructuralProperties + props.active_connects_structural_member = 0 + return {"FINISHED"} + + +class RemoveStructuralConnectionCondition(bpy.types.Operator): + bl_idname = "bim.remove_structural_connection_condition" + bl_label = "Remove Structural Connection Condition" + connects_structural_member: bpy.props.IntProperty() + + def execute(self, context): + file = IfcStore.get_file() + relation = file.by_id(self.connects_structural_member) + connection = relation.RelatedStructuralConnection + ifcopenshell.api.run("structural.remove_structural_connection_condition", file, **{"relation": relation}) + + Data.load(IfcStore.get_file(), connection.id()) + return {"FINISHED"} class AddStructuralBoundaryCondition(bpy.types.Operator): bl_idname = "bim.add_structural_boundary_condition" bl_label = "Add Structural Boundary Condition" + connection: bpy.props.IntProperty() def execute(self, context): - obj = context.active_object file = IfcStore.get_file() - connection = file.by_id(obj.BIMObjectProperties.ifc_definition_id) - add_structural_boundary_condition.Usecase(file, {"connection": connection}).execute() - Data.load(connection.id()) + connection = file.by_id(self.connection) + ifcopenshell.api.run("structural.add_structural_boundary_condition", file, **{"connection": connection}) + if connection.is_a("IfcRelConnectsStructuralMember"): + Data.load(IfcStore.get_file(), connection.RelatedStructuralConnection.id()) + else: + Data.load(IfcStore.get_file(), connection.id()) return {"FINISHED"} class RemoveStructuralBoundaryCondition(bpy.types.Operator): bl_idname = "bim.remove_structural_boundary_condition" - bl_label = "Enable Editing Structural Boundary Condition" + bl_label = "Remove Structural Boundary Condition" + connection: bpy.props.IntProperty() def execute(self, context): - obj = context.active_object file = IfcStore.get_file() - connection = file.by_id(obj.BIMObjectProperties.ifc_definition_id) - remove_structural_boundary_condition.Usecase(file, {"connection": connection}).execute() - Data.load(connection.id()) + connection = file.by_id(self.connection) + ifcopenshell.api.run("structural.remove_structural_boundary_condition", file, **{"connection": connection}) + if connection.is_a("IfcRelConnectsStructuralMember"): + Data.load(IfcStore.get_file(), connection.RelatedStructuralConnection.id()) + else: + Data.load(IfcStore.get_file(), connection.id()) return {"FINISHED"} class EnableEditingStructuralBoundaryCondition(bpy.types.Operator): bl_idname = "bim.enable_editing_structural_boundary_condition" bl_label = "Enable Editing Structural Boundary Condition" + boundary_condition: bpy.props.IntProperty() def execute(self, context): obj = context.active_object - oprops = obj.BIMObjectProperties props = obj.BIMStructuralProperties while len(props.boundary_condition_attributes) > 0: props.boundary_condition_attributes.remove(0) - data = Data.boundary_conditions[oprops.ifc_definition_id] + data = Data.boundary_conditions[self.boundary_condition] for attribute in IfcStore.get_schema().declaration_by_name(data["type"]).all_attributes(): value = data[attribute.name()] @@ -59,7 +124,7 @@ class EnableEditingStructuralBoundaryCondition(bpy.types.Operator): new.is_null = value is None new.is_optional = attribute.optional() if data_type == "select": - enum_items = [s.name() for s in ifcopenshell.get_select_items(attribute)] + enum_items = [s.name() for s in ifcopenshell.util.attribute.get_select_items(attribute)] new.enum_items = json.dumps(enum_items) if isinstance(value, bool): new.bool_value = False if new.is_null else data[attribute.name()] @@ -71,22 +136,23 @@ class EnableEditingStructuralBoundaryCondition(bpy.types.Operator): new.enum_value = [i for i in enum_items if i != "IfcBoolean"][0] elif data_type == "string": new.string_value = "" if new.is_null else data[attribute.name()] + new.data_type = "string" - props.is_editing_boundary_condition = True + props.active_boundary_condition = self.boundary_condition return {"FINISHED"} class EditStructuralBoundaryCondition(bpy.types.Operator): bl_idname = "bim.edit_structural_boundary_condition" bl_label = "Edit Structural Boundary Condition" + connection: bpy.props.IntProperty() def execute(self, context): obj = context.active_object - oprops = obj.BIMObjectProperties props = obj.BIMStructuralProperties file = IfcStore.get_file() - connection = file.by_id(obj.BIMObjectProperties.ifc_definition_id) + connection = file.by_id(self.connection) condition = connection.AppliedCondition attributes = {} @@ -100,8 +166,13 @@ class EditStructuralBoundaryCondition(bpy.types.Operator): else: attributes[attribute.name] = {"value": attribute.float_value, "type": attribute.enum_value} - edit_structural_boundary_condition.Usecase(file, {"condition": condition, "attributes": attributes}).execute() - Data.load(connection.id()) + ifcopenshell.api.run( + "structural.edit_structural_boundary_condition", file, **{"condition": condition, "attributes": attributes} + ) + if connection.is_a("IfcRelConnectsStructuralMember"): + Data.load(IfcStore.get_file(), connection.RelatedStructuralConnection.id()) + else: + Data.load(IfcStore.get_file(), connection.id()) bpy.ops.bim.disable_editing_structural_boundary_condition() return {"FINISHED"} @@ -111,7 +182,7 @@ class DisableEditingStructuralBoundaryCondition(bpy.types.Operator): bl_label = "Disable Editing Structural Boundary Condition" def execute(self, context): - context.active_object.BIMStructuralProperties.is_editing_boundary_condition = False + context.active_object.BIMStructuralProperties.active_boundary_condition = 0 return {"FINISHED"} @@ -126,7 +197,7 @@ class LoadStructuralAnalysisModels(bpy.types.Operator): for ifc_definition_id, structural_analysis_model in Data.structural_analysis_models.items(): new = props.structural_analysis_models.add() new.ifc_definition_id = ifc_definition_id - new.name = structural_analysis_model["Name"] + new.name = structural_analysis_model["Name"] or "Unnamed" props.is_editing = True bpy.ops.bim.disable_editing_structural_analysis_model() return {"FINISHED"} @@ -146,8 +217,19 @@ class AddStructuralAnalysisModel(bpy.types.Operator): bl_label = "Add Structural Analysis Model" def execute(self, context): - result = add_structural_analysis_model.Usecase(IfcStore.get_file()).execute() - Data.load() + result = ifcopenshell.api.run("structural.add_structural_analysis_model", IfcStore.get_file()) + + has_context = False + ContextData.load(IfcStore.get_file()) + for context in ContextData.contexts.values(): + if context["ContextType"] == "Model": + for subcontext in context["HasSubContexts"].values(): + if subcontext["ContextIdentifier"] == "Reference" and subcontext["TargetView"] == "GRAPH_VIEW": + has_context = True + if not has_context: + bpy.ops.bim.add_subcontext(context="Model", subcontext="Reference", target_view="GRAPH_VIEW") + + Data.load(IfcStore.get_file()) bpy.ops.bim.load_structural_analysis_models() bpy.ops.bim.enable_editing_structural_analysis_model(structural_analysis_model=result.id()) return {"FINISHED"} @@ -169,10 +251,15 @@ class EditStructuralAnalysisModel(bpy.types.Operator): elif attribute.data_type == "enum": attributes[attribute.name] = attribute.enum_value self.file = IfcStore.get_file() - edit_structural_analysis_model.Usecase( - self.file, {"structural_analysis_model": self.file.by_id(props.active_structural_analysis_model_id), "attributes": attributes} - ).execute() - Data.load() + ifcopenshell.api.run( + "structural.edit_structural_analysis_model", + self.file, + **{ + "structural_analysis_model": self.file.by_id(props.active_structural_analysis_model_id), + "attributes": attributes, + } + ) + Data.load(IfcStore.get_file()) bpy.ops.bim.load_structural_analysis_models() return {"FINISHED"} @@ -185,8 +272,12 @@ class RemoveStructuralAnalysisModel(bpy.types.Operator): def execute(self, context): props = context.scene.BIMStructuralProperties self.file = IfcStore.get_file() - remove_structural_analysis_model.Usecase(self.file, {"structural_analysis_model": self.file.by_id(self.structural_analysis_model)}).execute() - Data.load() + ifcopenshell.api.run( + "structural.remove_structural_analysis_model", + self.file, + **{"structural_analysis_model": self.file.by_id(self.structural_analysis_model)} + ) + Data.load(IfcStore.get_file()) bpy.ops.bim.load_structural_analysis_models() return {"FINISHED"} @@ -241,11 +332,15 @@ class AssignStructuralAnalysisModel(bpy.types.Operator): def execute(self, context): product = bpy.data.objects.get(self.product) if self.product else context.active_object self.file = IfcStore.get_file() - assign_structural_analysis_model.Usecase(self.file, { - "product": self.file.by_id(product.BIMObjectProperties.ifc_definition_id), - "structural_analysis_model": self.file.by_id(self.structural_analysis_model) - }).execute() - Data.load() + ifcopenshell.api.run( + "structural.assign_structural_analysis_model", + self.file, + **{ + "product": self.file.by_id(product.BIMObjectProperties.ifc_definition_id), + "structural_analysis_model": self.file.by_id(self.structural_analysis_model), + } + ) + Data.load(IfcStore.get_file()) return {"FINISHED"} @@ -258,9 +353,13 @@ class UnassignStructuralAnalysisModel(bpy.types.Operator): def execute(self, context): product = bpy.data.objects.get(self.product) if self.product else context.active_object self.file = IfcStore.get_file() - unassign_structural_analysis_model.Usecase(self.file, { - "product": self.file.by_id(product.BIMObjectProperties.ifc_definition_id), - "structural_analysis_model": self.file.by_id(self.structural_analysis_model) - }).execute() - Data.load() + ifcopenshell.api.run( + "structural.unassign_structural_analysis_model", + self.file, + **{ + "product": self.file.by_id(product.BIMObjectProperties.ifc_definition_id), + "structural_analysis_model": self.file.by_id(self.structural_analysis_model), + } + ) + Data.load(IfcStore.get_file()) return {"FINISHED"} diff --git a/src/ifcblenderexport/blenderbim/bim/module/structural/prop.py b/src/blenderbim/blenderbim/bim/module/structural/prop.py similarity index 80% rename from src/ifcblenderexport/blenderbim/bim/module/structural/prop.py rename to src/blenderbim/blenderbim/bim/module/structural/prop.py index ebd8199615..f8cc972b87 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/structural/prop.py +++ b/src/blenderbim/blenderbim/bim/module/structural/prop.py @@ -30,5 +30,6 @@ class BIMStructuralProperties(PropertyGroup): class BIMObjectStructuralProperties(PropertyGroup): boundary_condition_attributes: CollectionProperty(name="Boundary Condition Attributes", type=Attribute) - is_editing_boundary_condition: BoolProperty(name="Is Editing Boundary Condition", default=False) - connected_structural_members: CollectionProperty(name="Connected Structural Members", type=Attribute) + active_boundary_condition: IntProperty(name="Active Boundary Condition") + active_connects_structural_member: IntProperty(name="Active Connects Structural Member") + relating_structural_member: PointerProperty(name="Relating Structural Member", type=bpy.types.Object) diff --git a/src/ifcblenderexport/blenderbim/bim/module/structural/ui.py b/src/blenderbim/blenderbim/bim/module/structural/ui.py similarity index 53% rename from src/ifcblenderexport/blenderbim/bim/module/structural/ui.py rename to src/blenderbim/blenderbim/bim/module/structural/ui.py index e5cead4f98..87aff9b060 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/structural/ui.py +++ b/src/blenderbim/blenderbim/bim/module/structural/ui.py @@ -1,6 +1,61 @@ from bpy.types import Panel, UIList from blenderbim.bim.ifc import IfcStore -from blenderbim.bim.module.structural.data import Data +from ifcopenshell.api.structural.data import Data + + +def draw_boundary_condition_ui(layout, boundary_condition_id, connection_id, props): + data = Data.boundary_conditions[boundary_condition_id] if boundary_condition_id else {} + row = layout.row(align=True) + if not data: + row.label(text="No Boundary Condition Found", icon="CON_TRACKTO") + row.operator("bim.add_structural_boundary_condition", text="", icon="ADD").connection = connection_id + return + + if props.active_boundary_condition and props.active_boundary_condition == boundary_condition_id: + row.label(text=data["type"], icon="CON_TRACKTO") + row.operator("bim.edit_structural_boundary_condition", text="", icon="CHECKMARK").connection = connection_id + row.operator("bim.disable_editing_structural_boundary_condition", text="", icon="X") + elif props.active_boundary_condition and props.active_boundary_condition != boundary_condition_id: + row.label(text=data["type"], icon="CON_TRACKTO") + row.operator("bim.remove_structural_boundary_condition", text="", icon="X").connection = connection_id + else: + row.label(text=data["type"], icon="CON_TRACKTO") + op = row.operator("bim.enable_editing_structural_boundary_condition", text="", icon="GREASEPENCIL") + op.boundary_condition = data["id"] + row.operator("bim.remove_structural_boundary_condition", text="", icon="X").connection = connection_id + + if props.active_boundary_condition and props.active_boundary_condition == boundary_condition_id: + draw_boundary_condition_editable_ui(layout, props) + else: + draw_boundary_condition_read_only_ui(layout, data) + + +def draw_boundary_condition_editable_ui(layout, props): + for attribute in props.boundary_condition_attributes: + if attribute.data_type == "string": + row = layout.row() + row.prop(attribute, "string_value", text=attribute["name"]) + else: + row = layout.row(align=True) + row.prop(attribute, "enum_value", text=attribute["name"]) + if attribute.enum_value == "IfcBoolean": + row.prop(attribute, "bool_value", text="") + else: + row.prop(attribute, "float_value", text="") + if attribute.is_optional: + row.prop(attribute, "is_null", icon="RADIOBUT_OFF" if attribute.is_null else "RADIOBUT_ON", text="") + +def draw_boundary_condition_read_only_ui(layout, boundary_condition_data): + for key, value in boundary_condition_data.items(): + if key == "id" or key == "type" or value == None: + continue + row = layout.row(align=True) + row.label(text=key) + if isinstance(value, bool): + row.label(text="", icon="CHECKBOX_HLT" if value else "CHECKBOX_DEHLT") + else: + row.label(text=str(value)) + class BIM_PT_structural_boundary_conditions(Panel): @@ -25,54 +80,11 @@ class BIM_PT_structural_boundary_conditions(Panel): def draw(self, context): self.oprops = context.active_object.BIMObjectProperties self.props = context.active_object.BIMStructuralProperties - if self.oprops.ifc_definition_id not in Data.boundary_conditions: - Data.load(self.oprops.ifc_definition_id) + if self.oprops.ifc_definition_id not in Data.connections: + Data.load(IfcStore.get_file(), self.oprops.ifc_definition_id) - self.data = Data.boundary_conditions[self.oprops.ifc_definition_id] - - row = self.layout.row(align=True) - if self.data and self.props.is_editing_boundary_condition: - row.label(text=self.data["type"], icon="CON_TRACKTO") - row.operator("bim.edit_structural_boundary_condition", text="", icon="CHECKMARK") - row.operator("bim.disable_editing_structural_boundary_condition", text="", icon="X") - elif self.data and not self.props.is_editing_boundary_condition: - row.label(text=self.data["type"], icon="CON_TRACKTO") - row.operator("bim.enable_editing_structural_boundary_condition", text="", icon="GREASEPENCIL") - row.operator("bim.remove_structural_boundary_condition", text="", icon="X") - else: - row.label(text="No Boundary Condition Found", icon="CON_TRACKTO") - row.operator("bim.add_structural_boundary_condition", text="", icon="ADD") - - if self.props.is_editing_boundary_condition: - self.draw_editable_ui(context) - else: - self.draw_read_only_ui(context) - - def draw_editable_ui(self, context): - for attribute in self.props.connection_attributes: - if attribute.data_type == "string": - row = self.layout.row() - row.prop(attribute, "string_value", text=attribute["name"]) - else: - row = self.layout.row(align=True) - row.prop(attribute, "enum_value", text=attribute["name"]) - if attribute.enum_value == "IfcBoolean": - row.prop(attribute, "bool_value", text="") - else: - row.prop(attribute, "float_value", text="") - if attribute.is_optional: - row.prop(attribute, "is_null", icon="RADIOBUT_OFF" if attribute.is_null else "RADIOBUT_ON", text="") - - def draw_read_only_ui(self, context): - for key, value in self.data.items(): - if key == "id" or key == "type" or value == None: - continue - row = self.layout.row(align=True) - row.label(text=key) - if isinstance(value, bool): - row.label(text="", icon="CHECKBOX_HLT" if value else "CHECKBOX_DEHLT") - else: - row.label(text=str(value)) + applied_condition_id = Data.connections[self.oprops.ifc_definition_id]["AppliedCondition"] + draw_boundary_condition_ui(self.layout, applied_condition_id, self.oprops.ifc_definition_id, self.props) class BIM_PT_connected_structural_members(Panel): @@ -97,32 +109,36 @@ class BIM_PT_connected_structural_members(Panel): def draw(self, context): self.oprops = context.active_object.BIMObjectProperties self.props = context.active_object.BIMStructuralProperties - if self.oprops.ifc_definition_id not in Data.connected_structural_members: - Data.load(self.oprops.ifc_definition_id) + if self.oprops.ifc_definition_id not in Data.connections: + Data.load(IfcStore.get_file(), self.oprops.ifc_definition_id) - self.data = Data.connected_structural_members[self.oprops.ifc_definition_id] + rel_ids = Data.connections[self.oprops.ifc_definition_id]["ConnectsStructuralMembers"] - for member in self.data: + row = self.layout.row(align=True) + row.prop(self.props, "relating_structural_member", text="", icon="CON_TRACKTO") + row.operator("bim.add_structural_member_connection", text="", icon="ADD") + + for rel_id in rel_ids: + rel = Data.connects_structural_members[rel_id] row = self.layout.row(align=True) - row.label(text=str(member)) + row.label(text=f"To Member #{IfcStore.get_file().by_id(rel['RelatingStructuralMember']).Name}") + if self.props.active_connects_structural_member and self.props.active_connects_structural_member == rel_id: + row.operator("bim.disable_editing_structural_connection_condition", text="", icon="CHECKMARK") + row.enabled = self.props.active_boundary_condition != rel["AppliedCondition"] + self.draw_editable_ui(context, self.layout, rel) + elif self.props.active_connects_structural_member: + op = row.operator("bim.remove_structural_connection_condition", text="", icon="X") + op.connects_structural_member = rel_id + else: + op = row.operator("bim.enable_editing_structural_connection_condition", text="", icon="GREASEPENCIL") + op.connects_structural_member = rel_id + op = row.operator("bim.remove_structural_connection_condition", text="", icon="X") + op.connects_structural_member = rel_id - # row = self.layout.row(align=True) - # if self.data and self.props.is_editing_boundary_condition: - # row.label(text=self.data["type"], icon="CON_TRACKTO") - # row.operator("bim.edit_structural_boundary_condition", text="", icon="CHECKMARK") - # row.operator("bim.disable_editing_structural_boundary_condition", text="", icon="X") - # elif self.data and not self.props.is_editing_boundary_condition: - # row.label(text=self.data["type"], icon="CON_TRACKTO") - # row.operator("bim.enable_editing_structural_boundary_condition", text="", icon="GREASEPENCIL") - # row.operator("bim.remove_structural_boundary_condition", text="", icon="X") - # else: - # row.label(text="No Boundary Condition Found", icon="CON_TRACKTO") - # row.operator("bim.add_structural_boundary_condition", text="", icon="ADD") - - # if self.props.is_editing_boundary_condition: - # self.draw_editable_ui(context) - # else: - # self.draw_read_only_ui(context) + def draw_editable_ui(self, context, layout, data): + box = layout.box() + row = box.row(align=True) + draw_boundary_condition_ui(box, data["AppliedCondition"], data["id"], self.props) class BIM_PT_structural_analysis_models(Panel): @@ -139,7 +155,7 @@ class BIM_PT_structural_analysis_models(Panel): def draw(self, context): if not Data.is_loaded: - Data.load() + Data.load(IfcStore.get_file()) self.props = context.scene.BIMStructuralProperties row = self.layout.row(align=True) diff --git a/src/ifcblenderexport/blenderbim/bim/module/style/__init__.py b/src/blenderbim/blenderbim/bim/module/style/__init__.py similarity index 100% rename from src/ifcblenderexport/blenderbim/bim/module/style/__init__.py rename to src/blenderbim/blenderbim/bim/module/style/__init__.py diff --git a/src/ifcblenderexport/blenderbim/bim/module/style/operator.py b/src/blenderbim/blenderbim/bim/module/style/operator.py similarity index 90% rename from src/ifcblenderexport/blenderbim/bim/module/style/operator.py rename to src/blenderbim/blenderbim/bim/module/style/operator.py index 62cce46f0b..c60bd09a9f 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/style/operator.py +++ b/src/blenderbim/blenderbim/bim/module/style/operator.py @@ -1,6 +1,5 @@ import bpy -import blenderbim.bim.module.style.add_style as add_style -import blenderbim.bim.module.style.edit_style as edit_style +import ifcopenshell.api from blenderbim.bim.ifc import IfcStore @@ -28,7 +27,7 @@ class EditStyle(bpy.types.Operator): material = bpy.data.objects.get(self.material) if self.material else bpy.context.active_object.active_material settings = get_colour_settings(material) settings["style"] = self.file.by_id(material.BIMMaterialProperties.ifc_style_id) - edit_style.Usecase(self.file, settings).execute() + ifcopenshell.api.run("style.edit_style", self.file, **settings) return {"FINISHED"} @@ -43,7 +42,7 @@ class AddStyle(bpy.types.Operator): settings = get_colour_settings(material) settings["Name"] = material.name settings["external_definition"] = None # TODO: Implement. See #1222 - style = add_style.Usecase(self.file, settings).execute() + style = ifcopenshell.api.run("style.add_style", self.file, **settings) material.BIMMaterialProperties.ifc_style_id = int(style.id()) return {"FINISHED"} diff --git a/src/ifcblenderexport/blenderbim/bim/module/style/ui.py b/src/blenderbim/blenderbim/bim/module/style/ui.py similarity index 100% rename from src/ifcblenderexport/blenderbim/bim/module/style/ui.py rename to src/blenderbim/blenderbim/bim/module/style/ui.py diff --git a/src/ifcblenderexport/blenderbim/bim/module/type/__init__.py b/src/blenderbim/blenderbim/bim/module/type/__init__.py similarity index 100% rename from src/ifcblenderexport/blenderbim/bim/module/type/__init__.py rename to src/blenderbim/blenderbim/bim/module/type/__init__.py diff --git a/src/ifcblenderexport/blenderbim/bim/module/type/operator.py b/src/blenderbim/blenderbim/bim/module/type/operator.py similarity index 85% rename from src/ifcblenderexport/blenderbim/bim/module/type/operator.py rename to src/blenderbim/blenderbim/bim/module/type/operator.py index 343d13ee35..fdfd43fa6e 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/type/operator.py +++ b/src/blenderbim/blenderbim/bim/module/type/operator.py @@ -1,11 +1,9 @@ import bpy import ifcopenshell.util.schema import ifcopenshell.util.type -import blenderbim.bim.module.type.assign_type as assign_type -import blenderbim.bim.module.type.unassign_type as unassign_type -import blenderbim.bim.module.type.get_related_objects as get_related_objects +import ifcopenshell.api from blenderbim.bim.ifc import IfcStore -from blenderbim.bim.module.type.data import Data +from ifcopenshell.api.type.data import Data from blenderbim.bim.module.type.prop import getIfcTypes, getAvailableTypes, updateTypeInstanceIfcClass from mathutils import Vector @@ -24,14 +22,15 @@ class AssignType(bpy.types.Operator): ) for related_object in related_objects: oprops = related_object.BIMObjectProperties - assign_type.Usecase( + ifcopenshell.api.run( + "type.assign_type", self.file, - { + **{ "related_object": self.file.by_id(oprops.ifc_definition_id), "relating_type": self.file.by_id(relating_type), }, - ).execute() - Data.load(oprops.ifc_definition_id) + ) + Data.load(IfcStore.get_file(), oprops.ifc_definition_id) if self.file.by_id(relating_type).RepresentationMaps: bpy.ops.bim.map_representations(product_id=oprops.ifc_definition_id, type_product_id=relating_type) @@ -51,13 +50,14 @@ class UnassignType(bpy.types.Operator): ) for related_object in related_objects: oprops = related_object.BIMObjectProperties - unassign_type.Usecase( + ifcopenshell.api.run( + "type.unassign_type", self.file, - { + **{ "related_object": self.file.by_id(oprops.ifc_definition_id), }, - ).execute() - Data.load(oprops.ifc_definition_id) + ) + Data.load(IfcStore.get_file(), oprops.ifc_definition_id) return {"FINISHED"} @@ -93,13 +93,13 @@ class SelectSimilarType(bpy.types.Operator): product = self.file.by_id(oprops.ifc_definition_id) declaration = IfcStore.get_schema().declaration_by_name(product.is_a()) if ifcopenshell.util.schema.is_a(declaration, "IfcElementType"): - related_objects = get_related_objects.Usecase( - self.file, {"relating_type": self.file.by_id(oprops.ifc_definition_id)} - ).execute() + related_objects = ifcopenshell.api.run( + "type.get_related_objects", self.file, **{"relating_type": self.file.by_id(oprops.ifc_definition_id)} + ) else: - related_objects = get_related_objects.Usecase( - self.file, {"related_object": self.file.by_id(oprops.ifc_definition_id)} - ).execute() + related_objects = ifcopenshell.api.run( + "type.get_related_objects", self.file, **{"related_object": self.file.by_id(oprops.ifc_definition_id)} + ) for obj in bpy.context.visible_objects: if obj.BIMObjectProperties.ifc_definition_id in related_objects: obj.select_set(True) diff --git a/src/ifcblenderexport/blenderbim/bim/module/type/prop.py b/src/blenderbim/blenderbim/bim/module/type/prop.py similarity index 100% rename from src/ifcblenderexport/blenderbim/bim/module/type/prop.py rename to src/blenderbim/blenderbim/bim/module/type/prop.py diff --git a/src/ifcblenderexport/blenderbim/bim/module/type/ui.py b/src/blenderbim/blenderbim/bim/module/type/ui.py similarity index 90% rename from src/ifcblenderexport/blenderbim/bim/module/type/ui.py rename to src/blenderbim/blenderbim/bim/module/type/ui.py index 3a4a88215f..bdee759124 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/type/ui.py +++ b/src/blenderbim/blenderbim/bim/module/type/ui.py @@ -1,5 +1,6 @@ from bpy.types import Panel -from blenderbim.bim.module.type.data import Data +from blenderbim.bim.ifc import IfcStore +from ifcopenshell.api.type.data import Data class BIM_PT_type(Panel): @@ -15,7 +16,7 @@ class BIM_PT_type(Panel): if not props.ifc_definition_id: return False if props.ifc_definition_id not in Data.products: - Data.load(props.ifc_definition_id) + Data.load(IfcStore.get_file(), props.ifc_definition_id) if not Data.products[props.ifc_definition_id]: return False return True @@ -27,7 +28,7 @@ class BIM_PT_type(Panel): if not oprops.ifc_definition_id: return if oprops.ifc_definition_id not in Data.products: - Data.load(oprops.ifc_definition_id) + Data.load(IfcStore.get_file(), oprops.ifc_definition_id) if props.is_editing_type: row = self.layout.row(align=True) diff --git a/src/ifcblenderexport/blenderbim/bim/module/unit/__init__.py b/src/blenderbim/blenderbim/bim/module/unit/__init__.py similarity index 100% rename from src/ifcblenderexport/blenderbim/bim/module/unit/__init__.py rename to src/blenderbim/blenderbim/bim/module/unit/__init__.py diff --git a/src/ifcblenderexport/blenderbim/bim/module/unit/operator.py b/src/blenderbim/blenderbim/bim/module/unit/operator.py similarity index 84% rename from src/ifcblenderexport/blenderbim/bim/module/unit/operator.py rename to src/blenderbim/blenderbim/bim/module/unit/operator.py index 5ec9155c8e..debf4b2e9a 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/unit/operator.py +++ b/src/blenderbim/blenderbim/bim/module/unit/operator.py @@ -1,7 +1,7 @@ import bpy -import blenderbim.bim.module.unit.assign_unit as assign_unit +import ifcopenshell.api from blenderbim.bim.ifc import IfcStore -from blenderbim.bim.module.unit.data import Data +from ifcopenshell.api.unit.data import Data class AssignUnit(bpy.types.Operator): @@ -9,8 +9,8 @@ class AssignUnit(bpy.types.Operator): bl_label = "Assign Unit" def execute(self, context): - assign_unit.Usecase(IfcStore.get_file(), self.get_units()).execute() - Data.load() + ifcopenshell.api.run("unit.assign_unit", IfcStore.get_file(), **self.get_units()) + Data.load(IfcStore.get_file()) return {"FINISHED"} def get_units(self): diff --git a/src/ifcblenderexport/blenderbim/bim/module/unit/ui.py b/src/blenderbim/blenderbim/bim/module/unit/ui.py similarity index 100% rename from src/ifcblenderexport/blenderbim/bim/module/unit/ui.py rename to src/blenderbim/blenderbim/bim/module/unit/ui.py diff --git a/src/ifcblenderexport/blenderbim/bim/module/void/__init__.py b/src/blenderbim/blenderbim/bim/module/void/__init__.py similarity index 100% rename from src/ifcblenderexport/blenderbim/bim/module/void/__init__.py rename to src/blenderbim/blenderbim/bim/module/void/__init__.py diff --git a/src/ifcblenderexport/blenderbim/bim/module/void/operator.py b/src/blenderbim/blenderbim/bim/module/void/operator.py similarity index 79% rename from src/ifcblenderexport/blenderbim/bim/module/void/operator.py rename to src/blenderbim/blenderbim/bim/module/void/operator.py index cd1f9956e5..31785ad2dc 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/void/operator.py +++ b/src/blenderbim/blenderbim/bim/module/void/operator.py @@ -1,11 +1,8 @@ import bpy -import blenderbim.bim.module.void.add_opening as add_opening -import blenderbim.bim.module.void.remove_opening as remove_opening -import blenderbim.bim.module.void.add_filling as add_filling -import blenderbim.bim.module.void.remove_filling as remove_filling +import ifcopenshell.api from blenderbim.bim.ifc import IfcStore -from blenderbim.bim.module.void.data import Data -from blenderbim.bim.module.context.data import Data as ContextData +from ifcopenshell.api.void.data import Data +from ifcopenshell.api.context.data import Data as ContextData class AddOpening(bpy.types.Operator): @@ -21,7 +18,7 @@ class AddOpening(bpy.types.Operator): if not opening.BIMObjectProperties.ifc_definition_id: body_context_id = None if not ContextData.is_loaded: - ContextData.load() + ContextData.load(IfcStore.get_file()) for context in ContextData.contexts.values(): for subcontext_id, subcontext in context["HasSubContexts"].items(): if subcontext["ContextType"] == "Model" and subcontext["ContextIdentifier"] == "Body": @@ -33,14 +30,15 @@ class AddOpening(bpy.types.Operator): self.file = IfcStore.get_file() element_id = obj.BIMObjectProperties.ifc_definition_id - add_opening.Usecase( + ifcopenshell.api.run( + "void.add_opening", self.file, - { + **{ "opening": self.file.by_id(opening.BIMObjectProperties.ifc_definition_id), "element": self.file.by_id(element_id), }, - ).execute() - Data.load(element_id) + ) + Data.load(IfcStore.get_file(), element_id) has_modifier = False @@ -75,8 +73,8 @@ class RemoveOpening(bpy.types.Operator): obj.modifiers.remove(modifier) break - remove_opening.Usecase(self.file, {"opening": self.file.by_id(self.opening_id)}).execute() - Data.load(obj.BIMObjectProperties.ifc_definition_id) + ifcopenshell.api.run("void.remove_opening", self.file, **{"opening": self.file.by_id(self.opening_id)}) + Data.load(IfcStore.get_file(), obj.BIMObjectProperties.ifc_definition_id) return {"FINISHED"} @@ -91,14 +89,15 @@ class AddFilling(bpy.types.Operator): opening = bpy.data.objects.get(self.opening) if self.opening else context.scene.VoidProperties.desired_opening self.file = IfcStore.get_file() element_id = obj.BIMObjectProperties.ifc_definition_id - add_filling.Usecase( + ifcopenshell.api.run( + "void.add_filling", self.file, - { + **{ "opening": self.file.by_id(opening.BIMObjectProperties.ifc_definition_id), "element": self.file.by_id(element_id), }, - ).execute() - Data.load(element_id) + ) + Data.load(IfcStore.get_file(), element_id) return {"FINISHED"} @@ -110,8 +109,8 @@ class RemoveFilling(bpy.types.Operator): def execute(self, context): obj = bpy.data.objects.get(self.obj) if self.obj else bpy.context.active_object self.file = IfcStore.get_file() - remove_filling.Usecase( - self.file, {"element": self.file.by_id(obj.BIMObjectProperties.ifc_definition_id)} - ).execute() - Data.load(obj.BIMObjectProperties.ifc_definition_id) + ifcopenshell.api.run( + "void.remove_filling", self.file, **{"element": self.file.by_id(obj.BIMObjectProperties.ifc_definition_id)} + ) + Data.load(IfcStore.get_file(), obj.BIMObjectProperties.ifc_definition_id) return {"FINISHED"} diff --git a/src/ifcblenderexport/blenderbim/bim/module/void/prop.py b/src/blenderbim/blenderbim/bim/module/void/prop.py similarity index 100% rename from src/ifcblenderexport/blenderbim/bim/module/void/prop.py rename to src/blenderbim/blenderbim/bim/module/void/prop.py diff --git a/src/ifcblenderexport/blenderbim/bim/module/void/ui.py b/src/blenderbim/blenderbim/bim/module/void/ui.py similarity index 96% rename from src/ifcblenderexport/blenderbim/bim/module/void/ui.py rename to src/blenderbim/blenderbim/bim/module/void/ui.py index c878d8ccea..548ff2f096 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/void/ui.py +++ b/src/blenderbim/blenderbim/bim/module/void/ui.py @@ -1,6 +1,6 @@ import bpy from bpy.types import Panel -from blenderbim.bim.module.void.data import Data +from ifcopenshell.api.void.data import Data from blenderbim.bim.ifc import IfcStore @@ -19,7 +19,7 @@ class BIM_PT_voids(Panel): def draw(self, context): props = context.active_object.BIMObjectProperties if props.ifc_definition_id not in Data.products: - Data.load(props.ifc_definition_id) + Data.load(IfcStore.get_file(), props.ifc_definition_id) row = self.layout.row(align=True) if len(context.selected_objects) == 2: diff --git a/src/ifcblenderexport/blenderbim/bim/operator.py b/src/blenderbim/blenderbim/bim/operator.py similarity index 100% rename from src/ifcblenderexport/blenderbim/bim/operator.py rename to src/blenderbim/blenderbim/bim/operator.py diff --git a/src/ifcblenderexport/blenderbim/bim/prop.py b/src/blenderbim/blenderbim/bim/prop.py similarity index 98% rename from src/ifcblenderexport/blenderbim/bim/prop.py rename to src/blenderbim/blenderbim/bim/prop.py index 4ee0227dea..4c5b493919 100644 --- a/src/ifcblenderexport/blenderbim/bim/prop.py +++ b/src/blenderbim/blenderbim/bim/prop.py @@ -9,6 +9,7 @@ from . import ifc from . import annotation from . import decoration import bpy +from blenderbim.bim.handler import purge_module_data from blenderbim.bim.ifc import IfcStore from bpy.types import PropertyGroup from bpy.props import ( @@ -38,16 +39,7 @@ def updateIfcFile(self, context): if context.scene.BIMProperties.ifc_file: IfcStore.file = None IfcStore.schema = None - # Purge data cache - from blenderbim.bim import modules - - for module in modules.values(): - if not module: - continue - try: - getattr(getattr(module, "data"), "Data").purge() - except AttributeError: - pass + purge_module_data() def getDiagramScales(self, context): @@ -163,10 +155,10 @@ def getMaterialPsetNames(self, context): def getContexts(self, context): - from blenderbim.bim.module.context.data import Data + from ifcopenshell.api.context.data import Data if not Data.is_loaded: - Data.load() + Data.load(IfcStore.get_file()) results = [] for ifc_id, context in Data.contexts.items(): results.append((str(ifc_id), context["ContextType"], "")) diff --git a/src/ifcblenderexport/blenderbim/bim/scheduler.py b/src/blenderbim/blenderbim/bim/scheduler.py similarity index 100% rename from src/ifcblenderexport/blenderbim/bim/scheduler.py rename to src/blenderbim/blenderbim/bim/scheduler.py diff --git a/src/ifcblenderexport/blenderbim/bim/schema.py b/src/blenderbim/blenderbim/bim/schema.py similarity index 100% rename from src/ifcblenderexport/blenderbim/bim/schema.py rename to src/blenderbim/blenderbim/bim/schema.py diff --git a/src/ifcblenderexport/blenderbim/bim/schema/IfcAnnotation_IFC4.json b/src/blenderbim/blenderbim/bim/schema/IfcAnnotation_IFC4.json similarity index 100% rename from src/ifcblenderexport/blenderbim/bim/schema/IfcAnnotation_IFC4.json rename to src/blenderbim/blenderbim/bim/schema/IfcAnnotation_IFC4.json diff --git a/src/ifcblenderexport/blenderbim/bim/schema/IfcBoundaryCondition_IFC4.json b/src/blenderbim/blenderbim/bim/schema/IfcBoundaryCondition_IFC4.json similarity index 100% rename from src/ifcblenderexport/blenderbim/bim/schema/IfcBoundaryCondition_IFC4.json rename to src/blenderbim/blenderbim/bim/schema/IfcBoundaryCondition_IFC4.json diff --git a/src/ifcblenderexport/blenderbim/bim/schema/IfcElementType_IFC4.json b/src/blenderbim/blenderbim/bim/schema/IfcElementType_IFC4.json similarity index 100% rename from src/ifcblenderexport/blenderbim/bim/schema/IfcElementType_IFC4.json rename to src/blenderbim/blenderbim/bim/schema/IfcElementType_IFC4.json diff --git a/src/ifcblenderexport/blenderbim/bim/schema/IfcElement_IFC4.json b/src/blenderbim/blenderbim/bim/schema/IfcElement_IFC4.json similarity index 100% rename from src/ifcblenderexport/blenderbim/bim/schema/IfcElement_IFC4.json rename to src/blenderbim/blenderbim/bim/schema/IfcElement_IFC4.json diff --git a/src/ifcblenderexport/blenderbim/bim/schema/IfcGroup_IFC4.json b/src/blenderbim/blenderbim/bim/schema/IfcGroup_IFC4.json similarity index 100% rename from src/ifcblenderexport/blenderbim/bim/schema/IfcGroup_IFC4.json rename to src/blenderbim/blenderbim/bim/schema/IfcGroup_IFC4.json diff --git a/src/ifcblenderexport/blenderbim/bim/schema/IfcMaterialDefinition_IFC4.json b/src/blenderbim/blenderbim/bim/schema/IfcMaterialDefinition_IFC4.json similarity index 100% rename from src/ifcblenderexport/blenderbim/bim/schema/IfcMaterialDefinition_IFC4.json rename to src/blenderbim/blenderbim/bim/schema/IfcMaterialDefinition_IFC4.json diff --git a/src/ifcblenderexport/blenderbim/bim/schema/IfcParameterizedProfileDef_IFC4.json b/src/blenderbim/blenderbim/bim/schema/IfcParameterizedProfileDef_IFC4.json similarity index 100% rename from src/ifcblenderexport/blenderbim/bim/schema/IfcParameterizedProfileDef_IFC4.json rename to src/blenderbim/blenderbim/bim/schema/IfcParameterizedProfileDef_IFC4.json diff --git a/src/ifcblenderexport/blenderbim/bim/schema/IfcPositioningElement_IFC4.json b/src/blenderbim/blenderbim/bim/schema/IfcPositioningElement_IFC4.json similarity index 100% rename from src/ifcblenderexport/blenderbim/bim/schema/IfcPositioningElement_IFC4.json rename to src/blenderbim/blenderbim/bim/schema/IfcPositioningElement_IFC4.json diff --git a/src/ifcblenderexport/blenderbim/bim/schema/IfcSpatialElement_IFC4.json b/src/blenderbim/blenderbim/bim/schema/IfcSpatialElement_IFC4.json similarity index 100% rename from src/ifcblenderexport/blenderbim/bim/schema/IfcSpatialElement_IFC4.json rename to src/blenderbim/blenderbim/bim/schema/IfcSpatialElement_IFC4.json diff --git a/src/ifcblenderexport/blenderbim/bim/schema/IfcStructural_IFC4.json b/src/blenderbim/blenderbim/bim/schema/IfcStructural_IFC4.json similarity index 100% rename from src/ifcblenderexport/blenderbim/bim/schema/IfcStructural_IFC4.json rename to src/blenderbim/blenderbim/bim/schema/IfcStructural_IFC4.json diff --git a/src/ifcblenderexport/blenderbim/bim/schema/classifications/Omniclass_OCCS.ifc b/src/blenderbim/blenderbim/bim/schema/classifications/Omniclass_OCCS.ifc similarity index 100% rename from src/ifcblenderexport/blenderbim/bim/schema/classifications/Omniclass_OCCS.ifc rename to src/blenderbim/blenderbim/bim/schema/classifications/Omniclass_OCCS.ifc diff --git a/src/ifcblenderexport/blenderbim/bim/schema/classifications/Uniclass2015_Jan2020.ifc b/src/blenderbim/blenderbim/bim/schema/classifications/Uniclass2015_Jan2020.ifc similarity index 100% rename from src/ifcblenderexport/blenderbim/bim/schema/classifications/Uniclass2015_Jan2020.ifc rename to src/blenderbim/blenderbim/bim/schema/classifications/Uniclass2015_Jan2020.ifc diff --git a/src/ifcblenderexport/blenderbim/bim/schema/entity_descriptions.json b/src/blenderbim/blenderbim/bim/schema/entity_descriptions.json similarity index 100% rename from src/ifcblenderexport/blenderbim/bim/schema/entity_descriptions.json rename to src/blenderbim/blenderbim/bim/schema/entity_descriptions.json diff --git a/src/ifcblenderexport/blenderbim/bim/schema/enum_descriptions.json b/src/blenderbim/blenderbim/bim/schema/enum_descriptions.json similarity index 100% rename from src/ifcblenderexport/blenderbim/bim/schema/enum_descriptions.json rename to src/blenderbim/blenderbim/bim/schema/enum_descriptions.json diff --git a/src/ifcblenderexport/blenderbim/bim/schema/ifc_types_IFC4.json b/src/blenderbim/blenderbim/bim/schema/ifc_types_IFC4.json similarity index 100% rename from src/ifcblenderexport/blenderbim/bim/schema/ifc_types_IFC4.json rename to src/blenderbim/blenderbim/bim/schema/ifc_types_IFC4.json diff --git a/src/ifcblenderexport/blenderbim/bim/shaders.py b/src/blenderbim/blenderbim/bim/shaders.py similarity index 100% rename from src/ifcblenderexport/blenderbim/bim/shaders.py rename to src/blenderbim/blenderbim/bim/shaders.py diff --git a/src/ifcblenderexport/blenderbim/bim/sheeter.py b/src/blenderbim/blenderbim/bim/sheeter.py similarity index 100% rename from src/ifcblenderexport/blenderbim/bim/sheeter.py rename to src/blenderbim/blenderbim/bim/sheeter.py diff --git a/src/ifcblenderexport/blenderbim/bim/svgwriter.py b/src/blenderbim/blenderbim/bim/svgwriter.py similarity index 98% rename from src/ifcblenderexport/blenderbim/bim/svgwriter.py rename to src/blenderbim/blenderbim/bim/svgwriter.py index 7c8b58873b..8275c6439f 100644 --- a/src/ifcblenderexport/blenderbim/bim/svgwriter.py +++ b/src/blenderbim/blenderbim/bim/svgwriter.py @@ -12,10 +12,13 @@ from mathutils import Vector from mathutils import geometry from blenderbim.bim.ifc import IfcStore -try: - from OCC.Core import BRep, BRepTools, TopExp, TopAbs -except ImportError: - from OCC import BRep, BRepTools, TopExp, TopAbs + +def load_occ(): + # Don't import until we really need to, as a temporary step before we can purge OCC + try: + from OCC.Core import BRep, BRepTools, TopExp, TopAbs + except ImportError: + from OCC import BRep, BRepTools, TopExp, TopAbs class External(svgwrite.container.Group): @@ -599,6 +602,7 @@ class SvgWriter: self.draw_polygon(polygon, "cut") def draw_polyline(self, element, position): + load_occ() classes = self.get_classes(element["raw"], position) exp = BRepTools.BRepTools_WireExplorer(element["geometry"]) points = [] @@ -609,6 +613,7 @@ class SvgWriter: self.svg.add(self.svg.polyline(points=points, class_=" ".join(classes))) def draw_line(self, element, position): + load_occ() classes = self.get_classes(element["raw"], position) exp = TopExp.TopExp_Explorer(element["geometry"], TopAbs.TopAbs_VERTEX) points = [] diff --git a/src/ifcblenderexport/blenderbim/bim/ui.py b/src/blenderbim/blenderbim/bim/ui.py similarity index 100% rename from src/ifcblenderexport/blenderbim/bim/ui.py rename to src/blenderbim/blenderbim/bim/ui.py diff --git a/src/ifcblenderexport/blenderbim/libs/site/packages/OCC.pth b/src/blenderbim/blenderbim/libs/site/packages/OCC.pth similarity index 100% rename from src/ifcblenderexport/blenderbim/libs/site/packages/OCC.pth rename to src/blenderbim/blenderbim/libs/site/packages/OCC.pth diff --git a/src/ifcblenderexport/blenderbim/libs/site/packages/ifcopenshell.pth b/src/blenderbim/blenderbim/libs/site/packages/ifcopenshell.pth similarity index 100% rename from src/ifcblenderexport/blenderbim/libs/site/packages/ifcopenshell.pth rename to src/blenderbim/blenderbim/libs/site/packages/ifcopenshell.pth diff --git a/src/ifcblenderexport/blenderbim/libs/site/packages/svgwrite.pth b/src/blenderbim/blenderbim/libs/site/packages/svgwrite.pth similarity index 100% rename from src/ifcblenderexport/blenderbim/libs/site/packages/svgwrite.pth rename to src/blenderbim/blenderbim/libs/site/packages/svgwrite.pth diff --git a/src/ifcblenderexport/docs/Makefile b/src/blenderbim/docs/Makefile similarity index 100% rename from src/ifcblenderexport/docs/Makefile rename to src/blenderbim/docs/Makefile diff --git a/src/ifcblenderexport/docs/bimserver-plugin.rst b/src/blenderbim/docs/bimserver-plugin.rst similarity index 100% rename from src/ifcblenderexport/docs/bimserver-plugin.rst rename to src/blenderbim/docs/bimserver-plugin.rst diff --git a/src/ifcblenderexport/docs/bimtester.rst b/src/blenderbim/docs/bimtester.rst similarity index 100% rename from src/ifcblenderexport/docs/bimtester.rst rename to src/blenderbim/docs/bimtester.rst diff --git a/src/ifcblenderexport/docs/blenderbim.rst b/src/blenderbim/docs/blenderbim.rst similarity index 100% rename from src/ifcblenderexport/docs/blenderbim.rst rename to src/blenderbim/docs/blenderbim.rst diff --git a/src/ifcblenderexport/docs/blenderbim/installation.rst b/src/blenderbim/docs/blenderbim/installation.rst similarity index 97% rename from src/ifcblenderexport/docs/blenderbim/installation.rst rename to src/blenderbim/docs/blenderbim/installation.rst index 7c4df4ff3c..f1d8e5101e 100644 --- a/src/ifcblenderexport/docs/blenderbim/installation.rst +++ b/src/blenderbim/docs/blenderbim/installation.rst @@ -73,7 +73,7 @@ how to use Git, you can also stay up to date like so: $ git checkout v0.6.0 Then, just copy the files from the source code's -``src/ifcblenderexport/blenderbim/`` folder and replace the files in your +``src/blenderbim/blenderbim/`` folder and replace the files in your Blender add-on's ``blenderbim/`` folder. Restart Blender for the changes to take effect. In ``Edit > Preferences > diff --git a/src/ifcblenderexport/docs/blenderbim/scene.rst b/src/blenderbim/docs/blenderbim/scene.rst similarity index 100% rename from src/ifcblenderexport/docs/blenderbim/scene.rst rename to src/blenderbim/docs/blenderbim/scene.rst diff --git a/src/ifcblenderexport/docs/conf.py b/src/blenderbim/docs/conf.py similarity index 100% rename from src/ifcblenderexport/docs/conf.py rename to src/blenderbim/docs/conf.py diff --git a/src/ifcblenderexport/docs/ifcclash.rst b/src/blenderbim/docs/ifcclash.rst similarity index 100% rename from src/ifcblenderexport/docs/ifcclash.rst rename to src/blenderbim/docs/ifcclash.rst diff --git a/src/ifcblenderexport/docs/ifccobie.rst b/src/blenderbim/docs/ifccobie.rst similarity index 100% rename from src/ifcblenderexport/docs/ifccobie.rst rename to src/blenderbim/docs/ifccobie.rst diff --git a/src/ifcblenderexport/docs/ifcconvert.rst b/src/blenderbim/docs/ifcconvert.rst similarity index 100% rename from src/ifcblenderexport/docs/ifcconvert.rst rename to src/blenderbim/docs/ifcconvert.rst diff --git a/src/ifcblenderexport/docs/ifcdiff.rst b/src/blenderbim/docs/ifcdiff.rst similarity index 100% rename from src/ifcblenderexport/docs/ifcdiff.rst rename to src/blenderbim/docs/ifcdiff.rst diff --git a/src/ifcblenderexport/docs/ifcmax.rst b/src/blenderbim/docs/ifcmax.rst similarity index 100% rename from src/ifcblenderexport/docs/ifcmax.rst rename to src/blenderbim/docs/ifcmax.rst diff --git a/src/ifcblenderexport/docs/ifcopenshell-python.rst b/src/blenderbim/docs/ifcopenshell-python.rst similarity index 100% rename from src/ifcblenderexport/docs/ifcopenshell-python.rst rename to src/blenderbim/docs/ifcopenshell-python.rst diff --git a/src/ifcblenderexport/docs/ifcopenshell-python/api-documentation.rst b/src/blenderbim/docs/ifcopenshell-python/api-documentation.rst similarity index 100% rename from src/ifcblenderexport/docs/ifcopenshell-python/api-documentation.rst rename to src/blenderbim/docs/ifcopenshell-python/api-documentation.rst diff --git a/src/ifcblenderexport/docs/ifcopenshell-python/quickstart.rst b/src/blenderbim/docs/ifcopenshell-python/quickstart.rst similarity index 100% rename from src/ifcblenderexport/docs/ifcopenshell-python/quickstart.rst rename to src/blenderbim/docs/ifcopenshell-python/quickstart.rst diff --git a/src/ifcblenderexport/docs/ifcopenshell.rst b/src/blenderbim/docs/ifcopenshell.rst similarity index 100% rename from src/ifcblenderexport/docs/ifcopenshell.rst rename to src/blenderbim/docs/ifcopenshell.rst diff --git a/src/ifcblenderexport/docs/index.rst b/src/blenderbim/docs/index.rst similarity index 100% rename from src/ifcblenderexport/docs/index.rst rename to src/blenderbim/docs/index.rst diff --git a/src/ifcblenderexport/docs/make.bat b/src/blenderbim/docs/make.bat similarity index 100% rename from src/ifcblenderexport/docs/make.bat rename to src/blenderbim/docs/make.bat diff --git a/src/ifcblenderexport/dxf2ifc.py b/src/blenderbim/dxf2ifc.py similarity index 100% rename from src/ifcblenderexport/dxf2ifc.py rename to src/blenderbim/dxf2ifc.py diff --git a/src/ifcblenderexport/extract.py b/src/blenderbim/extract.py similarity index 100% rename from src/ifcblenderexport/extract.py rename to src/blenderbim/extract.py diff --git a/src/ifcblenderexport/gbxml.py b/src/blenderbim/gbxml.py similarity index 100% rename from src/ifcblenderexport/gbxml.py rename to src/blenderbim/gbxml.py diff --git a/src/ifcblenderexport/generate_util_type_json.py b/src/blenderbim/generate_util_type_json.py similarity index 94% rename from src/ifcblenderexport/generate_util_type_json.py rename to src/blenderbim/generate_util_type_json.py index 35a0cba617..bd5313b9dc 100644 --- a/src/ifcblenderexport/generate_util_type_json.py +++ b/src/blenderbim/generate_util_type_json.py @@ -24,6 +24,10 @@ with open(filepath) as fp: is_in_where_rule = True elif entity and is_in_where_rule and "IN TYPEOF" in line and "RelatingType" in line: type_class = line.split("'")[1].split(".")[1] + if type_class == "IFCTRANFORMERTYPE": + # Fix typo in schema + type_class = "IFCTRANSFORMERTYPE" + type_class = schema4.declaration_by_name(type_class).name() entity_to_type_map.setdefault(entity, []).append(type_class) line = fp.readline() diff --git a/src/ifcblenderexport/getIfcElements.py b/src/blenderbim/getIfcElements.py similarity index 100% rename from src/ifcblenderexport/getIfcElements.py rename to src/blenderbim/getIfcElements.py diff --git a/src/ifcblenderexport/get_description.py b/src/blenderbim/get_description.py similarity index 96% rename from src/ifcblenderexport/get_description.py rename to src/blenderbim/get_description.py index 2c60f47468..09846d8fae 100644 --- a/src/ifcblenderexport/get_description.py +++ b/src/blenderbim/get_description.py @@ -37,7 +37,7 @@ class Describer: f.write(json.dumps(self.enum_descriptions, indent=4)) def get_html_sources(self): - html_dir = "/home/dion/Projects/IfcOpenShell/src/ifcblenderexport/descriptions/IFC4_3/RC1/HTML" + html_dir = "/home/dion/Projects/IfcOpenShell/src/blenderbim/descriptions/IFC4_3/RC1/HTML" for filename in Path(html_dir).rglob("*.htm"): if "lexical" not in str(filename): continue diff --git a/src/ifcblenderexport/get_volume_by_material.py b/src/blenderbim/get_volume_by_material.py similarity index 100% rename from src/ifcblenderexport/get_volume_by_material.py rename to src/blenderbim/get_volume_by_material.py diff --git a/src/ifcblenderexport/ifc_to_gantt.py b/src/blenderbim/ifc_to_gantt.py similarity index 100% rename from src/ifcblenderexport/ifc_to_gantt.py rename to src/blenderbim/ifc_to_gantt.py diff --git a/src/ifcblenderexport/ifcopenshell-screenshot.png b/src/blenderbim/ifcopenshell-screenshot.png similarity index 100% rename from src/ifcblenderexport/ifcopenshell-screenshot.png rename to src/blenderbim/ifcopenshell-screenshot.png diff --git a/src/ifcblenderexport/occ_utils.py b/src/blenderbim/occ_utils.py old mode 100755 new mode 100644 similarity index 100% rename from src/ifcblenderexport/occ_utils.py rename to src/blenderbim/occ_utils.py diff --git a/src/ifcblenderexport/p6_to_ifc.py b/src/blenderbim/p6_to_ifc.py similarity index 100% rename from src/ifcblenderexport/p6_to_ifc.py rename to src/blenderbim/p6_to_ifc.py diff --git a/src/ifcblenderexport/runpytest.py b/src/blenderbim/runpytest.py similarity index 100% rename from src/ifcblenderexport/runpytest.py rename to src/blenderbim/runpytest.py diff --git a/src/ifcblenderexport/tests/test_segment_clipping.py b/src/blenderbim/tests/test_segment_clipping.py similarity index 100% rename from src/ifcblenderexport/tests/test_segment_clipping.py rename to src/blenderbim/tests/test_segment_clipping.py diff --git a/src/ifcbimtester/patch/model_core.patch b/src/ifcbimtester/patch/model_core.patch index 9452fd4985..77f0badc9a 100644 --- a/src/ifcbimtester/patch/model_core.patch +++ b/src/ifcbimtester/patch/model_core.patch @@ -1,5 +1,5 @@ --- behave/model_core.py 2018-02-26 02:53:03.000000000 +1100 -+++ /home/dion/Projects/IfcOpenShell/src/ifcblenderexport/patch-behave-model_core.py 2021-03-21 11:57:27.625195794 +1100 ++++ /home/dion/Projects/IfcOpenShell/src/blenderbim/patch-behave-model_core.py 2021-03-21 11:57:27.625195794 +1100 @@ -269,7 +269,10 @@ class BasicStatement(object): def __init__(self, filename, line, keyword, name): diff --git a/src/ifcbimtester/patch/runner_util.patch b/src/ifcbimtester/patch/runner_util.patch index d6a5ba7729..2362da317c 100644 --- a/src/ifcbimtester/patch/runner_util.patch +++ b/src/ifcbimtester/patch/runner_util.patch @@ -1,5 +1,5 @@ --- behave/runner_util.py 2018-02-26 02:53:03.000000000 +1100 -+++ /home/dion/Projects/IfcOpenShell/src/ifcblenderexport/patch-behave-runner_util.py 2021-03-21 11:58:29.777638958 +1100 ++++ /home/dion/Projects/IfcOpenShell/src/blenderbim/patch-behave-runner_util.py 2021-03-21 11:58:29.777638958 +1100 @@ -381,7 +381,10 @@ locals_["__file__"] = filename with open(filename, "rb") as f: diff --git a/src/ifcblenderexport/blenderbim/bim/data/cache/shapes/.gitignore b/src/ifcblenderexport/blenderbim/bim/data/cache/shapes/.gitignore deleted file mode 100644 index d6b7ef32c8..0000000000 --- a/src/ifcblenderexport/blenderbim/bim/data/cache/shapes/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -* -!.gitignore diff --git a/src/ifcblenderexport/blenderbim/bim/data/diagrams/.gitkeep b/src/ifcblenderexport/blenderbim/bim/data/diagrams/.gitkeep deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/src/ifcblenderexport/blenderbim/bim/data/fonts/OpenGost Type B TT.ttf b/src/ifcblenderexport/blenderbim/bim/data/fonts/OpenGost Type B TT.ttf deleted file mode 100644 index f4d86985cf..0000000000 Binary files a/src/ifcblenderexport/blenderbim/bim/data/fonts/OpenGost Type B TT.ttf and /dev/null differ diff --git a/src/ifcblenderexport/blenderbim/bim/data/mpass/Material.mpass b/src/ifcblenderexport/blenderbim/bim/data/mpass/Material.mpass deleted file mode 100644 index dce28bad6b..0000000000 --- a/src/ifcblenderexport/blenderbim/bim/data/mpass/Material.mpass +++ /dev/null @@ -1,8 +0,0 @@ -{ - "eevee": { - "uri": "mpass/shader.blend" - }, - "cycles": { - "uri": "mpass/shader.blend" - } -} diff --git a/src/ifcblenderexport/blenderbim/bim/data/mpass/shader.blend b/src/ifcblenderexport/blenderbim/bim/data/mpass/shader.blend deleted file mode 100644 index 35ebd98cf2..0000000000 Binary files a/src/ifcblenderexport/blenderbim/bim/data/mpass/shader.blend and /dev/null differ diff --git a/src/ifcblenderexport/blenderbim/bim/data/schedules/.gitkeep b/src/ifcblenderexport/blenderbim/bim/data/schedules/.gitkeep deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/src/ifcblenderexport/blenderbim/bim/data/sheets/.gitkeep b/src/ifcblenderexport/blenderbim/bim/data/sheets/.gitkeep deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/src/ifcblenderexport/blenderbim/bim/data/styles/default.css b/src/ifcblenderexport/blenderbim/bim/data/styles/default.css deleted file mode 100644 index bc41585365..0000000000 --- a/src/ifcblenderexport/blenderbim/bim/data/styles/default.css +++ /dev/null @@ -1,27 +0,0 @@ -* { stroke-linecap: round; } -.cut { fill: black; stroke: black; stroke-linecap: 'round'; stroke-width: 0.35; } -.background { fill: white; stroke: black; stroke-linecap: 'round'; stroke-width: 0.25; } -.annotation { fill: none; stroke: black; stroke-linecap: 'round'; stroke-width: 0.25; } -.hidden { stroke-dasharray: 3, 2; } -.solid {} -.leader { marker-end: url(#leader-marker); } -.stair { marker-start: url(#stair-marker-start); marker-end: url(#stair-marker-end); } -.break { fill: white; } -.breakline { fill: none; stroke: black; stroke-linecap: 'round'; stroke-width: 0.25; marker-mid: url(#breakline-marker); } -.material-blank { fill: white; } -.material-diagonal1 { fill: url(#diagonal1); } -.material-diagonal2 { fill: url(#diagonal2); } -.material-diagonal3 { fill: url(#diagonal3); } -.material-crosshatch1 { fill: url(#crosshatch1); } -.material-crosshatch2 { fill: url(#crosshatch2); } -.material-crosshatch3 { fill: url(#crosshatch3); } -.material-brick { fill: url(#brick); } -.material-earth { fill: url(#earth); } -.material-glass { fill: url(#glass); } -.material-liquid { fill: url(#liquid); } -.material-grass { fill: url(#grass); } -.material-honeycomb { fill: url(#honeycomb); } -.material-sand { fill: url(#sand); } -.material-concrete { fill: url(#concrete); stroke-width: 0.5; } -.material-boundary { fill: none; stroke: red; stroke-width: 1; stroke-dasharray: 12,4,3,4,3,4; } -.IfcSpace { fill: none; stroke: none; } diff --git a/src/ifcblenderexport/blenderbim/bim/data/styles/sample.css b/src/ifcblenderexport/blenderbim/bim/data/styles/sample.css deleted file mode 100644 index a265db20a6..0000000000 --- a/src/ifcblenderexport/blenderbim/bim/data/styles/sample.css +++ /dev/null @@ -1,10 +0,0 @@ -.cut { fill: white; stroke: black; stroke-linecap: 'round'; stroke-width: 0.35; } -.background { fill: white; stroke: black; stroke-linecap: 'round'; stroke-width: 0.25; } -.annotation { fill: none; stroke: black; stroke-linecap: 'round'; stroke-width: 0.25; } -.hidden { stroke-dasharray: 3, 2; } -.solid {} -.leader { marker-end: url(#leader-marker); } -.stair { marker-start: url(#stair-marker-start); marker-end: url(#stair-marker-end); } -.break { fill: white; } -.breakline { fill: none; stroke: black; stroke-linecap: 'round'; stroke-width: 0.25; marker-mid: url(#breakline-marker); } -.IfcSpace { fill: none; stroke: none; } diff --git a/src/ifcblenderexport/blenderbim/bim/data/templates/markers.svg b/src/ifcblenderexport/blenderbim/bim/data/templates/markers.svg deleted file mode 100644 index 3ba0be893a..0000000000 --- a/src/ifcblenderexport/blenderbim/bim/data/templates/markers.svg +++ /dev/null @@ -1,62 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/ifcblenderexport/blenderbim/bim/data/templates/patterns.svg b/src/ifcblenderexport/blenderbim/bim/data/templates/patterns.svg deleted file mode 100644 index 3a9ea5c53c..0000000000 --- a/src/ifcblenderexport/blenderbim/bim/data/templates/patterns.svg +++ /dev/null @@ -1,93 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/ifcblenderexport/blenderbim/bim/data/templates/symbols.svg b/src/ifcblenderexport/blenderbim/bim/data/templates/symbols.svg deleted file mode 100644 index b3209968e5..0000000000 --- a/src/ifcblenderexport/blenderbim/bim/data/templates/symbols.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/src/ifcblenderexport/blenderbim/bim/data/templates/titleblocks/A1.svg b/src/ifcblenderexport/blenderbim/bim/data/templates/titleblocks/A1.svg deleted file mode 100644 index 9b8b8be18b..0000000000 --- a/src/ifcblenderexport/blenderbim/bim/data/templates/titleblocks/A1.svg +++ /dev/null @@ -1,208 +0,0 @@ - - - - - - - image/svg+xml - - - - - - /home/dion/Projects/IfcOpenShell/src/ifcblenderexport/titleblock.dxf - scale = 1.000000, origin = (0.000000, 0.000000), method = manual - - - - REV. NO. - - - - - - - - - - - - - - - - DESCRIPTION - AUTHOR - DATE - DRAWING NUMBER - REV - {{revision}} - {{number}} - - - - - - - diff --git a/src/ifcblenderexport/blenderbim/bim/data/templates/titleblocks/A2.svg b/src/ifcblenderexport/blenderbim/bim/data/templates/titleblocks/A2.svg deleted file mode 100644 index f450a15cfb..0000000000 --- a/src/ifcblenderexport/blenderbim/bim/data/templates/titleblocks/A2.svg +++ /dev/null @@ -1,203 +0,0 @@ - - - - - - - image/svg+xml - - - - - - /home/dion/Projects/IfcOpenShell/src/ifcblenderexport/titleblock.dxf - scale = 1.000000, origin = (0.000000, 0.000000), method = manual - - - REV. NO. - - - - - - - - - - - - - DESCRIPTION - AUTHOR - DATE - - - - DRAWING NUMBER - REV - {{revision}} - {{number}} - - - - - - diff --git a/src/ifcblenderexport/blenderbim/bim/data/templates/titleblocks/A3.svg b/src/ifcblenderexport/blenderbim/bim/data/templates/titleblocks/A3.svg deleted file mode 100644 index 0f570cc865..0000000000 --- a/src/ifcblenderexport/blenderbim/bim/data/templates/titleblocks/A3.svg +++ /dev/null @@ -1,207 +0,0 @@ - - - - - - - image/svg+xml - - - - - - /home/dion/Projects/IfcOpenShell/src/ifcblenderexport/titleblock.dxf - scale = 1.000000, origin = (0.000000, 0.000000), method = manual - - - REV. NO. - - - - - - - - - - - - - DESCRIPTION - AUTHOR - DATE - - - - - DRAWING NUMBER - REV - {{revision}} - {{number}} - - - - - - - diff --git a/src/ifcblenderexport/blenderbim/bim/data/templates/view-title.svg b/src/ifcblenderexport/blenderbim/bim/data/templates/view-title.svg deleted file mode 100644 index 302826ec61..0000000000 --- a/src/ifcblenderexport/blenderbim/bim/data/templates/view-title.svg +++ /dev/null @@ -1,95 +0,0 @@ - - - - - - - - image/svg+xml - - - - - - - - - {{no}} - {{name}} - {{scale}} - - diff --git a/src/ifcblenderexport/blenderbim/bim/data/window/typical/IfcWindowLiningProperties.csv b/src/ifcblenderexport/blenderbim/bim/data/window/typical/IfcWindowLiningProperties.csv deleted file mode 100644 index 2c7207fe62..0000000000 --- a/src/ifcblenderexport/blenderbim/bim/data/window/typical/IfcWindowLiningProperties.csv +++ /dev/null @@ -1,2 +0,0 @@ -Name,foo -TransomThickness,500 diff --git a/src/ifcblenderexport/blenderbim/bim/module/owner/add_organisation.py b/src/ifcblenderexport/blenderbim/bim/module/owner/add_organisation.py deleted file mode 100644 index d9c8cd2a65..0000000000 --- a/src/ifcblenderexport/blenderbim/bim/module/owner/add_organisation.py +++ /dev/null @@ -1,6 +0,0 @@ -class Usecase: - def __init__(self, file): - self.file = file - - def execute(self): - self.file.createIfcOrganization("APTR", "Aperture Science") diff --git a/src/ifcblenderexport/blenderbim/bim/module/owner/add_person.py b/src/ifcblenderexport/blenderbim/bim/module/owner/add_person.py deleted file mode 100644 index 0772105757..0000000000 --- a/src/ifcblenderexport/blenderbim/bim/module/owner/add_person.py +++ /dev/null @@ -1,6 +0,0 @@ -class Usecase: - def __init__(self, file): - self.file = file - - def execute(self): - self.file.createIfcPerson("HSeldon", "Seldon", "Hari") diff --git a/src/ifcblenderexport/blenderbim/bim/module/owner/api.py b/src/ifcblenderexport/blenderbim/bim/module/owner/api.py deleted file mode 100644 index b95d928b46..0000000000 --- a/src/ifcblenderexport/blenderbim/bim/module/owner/api.py +++ /dev/null @@ -1,62 +0,0 @@ -import bpy -import time -import addon_utils -import blenderbim.bim.module.owner.create_owner_history as create_owner_history_usecase -import blenderbim.bim.module.owner.update_owner_history as update_owner_history_usecase -from blenderbim.bim.ifc import IfcStore - - -def update_owner_history(element, change_action=None): - if not element.OwnerHistory: - element.OwnerHistory = create_owner_history() - return - file = IfcStore.get_file() - return update_owner_history_usecase.Usecase( - file, - { - "element": element, - "person": file.by_id(int(bpy.context.scene.BIMOwnerProperties.user_person)), - "organisation": file.by_id(int(bpy.context.scene.BIMOwnerProperties.user_organisation)), - "ApplicationIdentifier": "BlenderBIM", - "ApplicationFullName": "BlenderBIM Add-on", - "Version": get_application_version(), - "ChangeAction": change_action or "MODIFIED", - }, - ).execute() - - -def create_owner_history(change_action=None): - file = IfcStore.get_file() - - if ( - not bpy.context.scene.BIMOwnerProperties.user_person - or not bpy.context.scene.BIMOwnerProperties.user_organisation - ): - if file.schema == "IFC2X3": - assert False, "A person and organisation is required in IFC2X3." - return None - - return create_owner_history_usecase.Usecase( - file, - { - "person": file.by_id(int(bpy.context.scene.BIMOwnerProperties.user_person)), - "organisation": file.by_id(int(bpy.context.scene.BIMOwnerProperties.user_organisation)), - "ApplicationIdentifier": "BlenderBIM", - "ApplicationFullName": "BlenderBIM Add-on", - "Version": get_application_version(), - "ChangeAction": change_action or "ADDED", - }, - ).execute() - - -def get_application_version(): - return ".".join( - [ - str(x) - for x in [ - addon.bl_info.get("version", (-1, -1, -1)) - for addon in addon_utils.modules() - if addon.bl_info["name"] == "BlenderBIM" - ][0] - ] - ) diff --git a/src/ifcblenderexport/blenderbim/bim/module/owner/create_owner_history.py b/src/ifcblenderexport/blenderbim/bim/module/owner/create_owner_history.py deleted file mode 100644 index f91b275375..0000000000 --- a/src/ifcblenderexport/blenderbim/bim/module/owner/create_owner_history.py +++ /dev/null @@ -1,101 +0,0 @@ -import time -import ifcopenshell - - -class Usecase: - def __init__(self, file, settings=None): - self.file = file - self.settings = { - "person": None, - "organisation": None, - "ApplicationIdentifier": "", - "ApplicationFullName": "", - "Version": "", - "ChangeAction": "NOTDEFINED", - } - for key, value in settings.items(): - self.settings[key] = value - - def execute(self): - user = self.get_user() - application = self.get_application() - return self.file.create_entity( - "IfcOwnerHistory", - **{ - "OwningUser": user, - "OwningApplication": application, - "State": "READWRITE", - "ChangeAction": self.settings["ChangeAction"], - "LastModifiedDate": int(time.time()), - "LastModifyingUser": user, - "LastModifyingApplication": application, - "CreationDate": int(time.time()), - }, - ) - - def get_user(self): - for element in self.file.by_type("IfcPersonAndOrganization"): - if ( - element.ThePerson == self.settings["person"] - and element.TheOrganization == self.settings["organisation"] - ): - return element - return self.file.create_entity( - "IfcPersonAndOrganization", - **{"ThePerson": self.settings["person"], "TheOrganization": self.settings["organisation"]}, - ) - - def get_application(self): - for element in self.file.by_type("IfcApplication"): - if element.ApplicationIdentifier == self.settings["ApplicationIdentifier"]: - return element - return self.file.create_entity( - "IfcApplication", - **{ - "ApplicationDeveloper": self.get_application_organisation(), - "Version": self.settings["Version"], - "ApplicationFullName": self.settings["ApplicationFullName"], - "ApplicationIdentifier": self.settings["ApplicationIdentifier"], - }, - ) - - def get_application_organisation(self): - return self.file.create_entity( - "IfcOrganization", - **{ - "Name": "IfcOpenShell", - "Description": "IfcOpenShell is an open source (LGPL) software library that helps users and software developers to work with the IFC file format.", - "Roles": [ - self.file.create_entity("IfcActorRole", **{"Role": "USERDEFINED", "UserDefinedRole": "CONTRIBUTOR"}) - ], - "Addresses": [ - self.file.create_entity( - "IfcTelecomAddress", - **{ - "Purpose": "USERDEFINED", - "UserDefinedPurpose": "WEBPAGE", - "Description": "The main webpage of the software collection.", - "WWWHomePageURL": "https://ifcopenshell.org", - }, - ), - self.file.create_entity( - "IfcTelecomAddress", - **{ - "Purpose": "USERDEFINED", - "UserDefinedPurpose": "WEBPAGE", - "Description": "The BlenderBIM Add-on webpage of the software collection.", - "WWWHomePageURL": "https://blenderbim.org", - }, - ), - self.file.create_entity( - "IfcTelecomAddress", - **{ - "Purpose": "USERDEFINED", - "UserDefinedPurpose": "REPOSITORY", - "Description": "The source code repository of the software collection.", - "WWWHomePageURL": "https://github.com/IfcOpenShell/IfcOpenShell.git", - }, - ), - ], - }, - ) diff --git a/src/ifcblenderexport/blenderbim/bim/module/owner/update_owner_history.py b/src/ifcblenderexport/blenderbim/bim/module/owner/update_owner_history.py deleted file mode 100644 index 7456e4c19b..0000000000 --- a/src/ifcblenderexport/blenderbim/bim/module/owner/update_owner_history.py +++ /dev/null @@ -1,99 +0,0 @@ -import time -import ifcopenshell - - -class Usecase: - def __init__(self, file, settings=None): - self.file = file - self.settings = { - "OwnerHistory": None, - "person": None, - "organisation": None, - "ApplicationIdentifier": "", - "ApplicationFullName": "", - "Version": "", - "ChangeAction": "NOTDEFINED", - } - for key, value in settings.items(): - self.settings[key] = value - - def execute(self): - if len(self.file.get_inverse(self.settings["element"].OwnerHistory)) > 1: - old_history = self.settings["element"].OwnerHistory - self.settings["element"].OwnerHistory = self.file.create_entity("IfcOwnerHistory") - for i, attribute in enumerate(old_history): - self.settings["element"].OwnerHistory[i] = attribute - user = self.get_user() - application = self.get_application() - self.settings["element"].OwnerHistory.ChangeAction = self.settings["ChangeAction"] - self.settings["element"].OwnerHistory.LastModifiedDate = int(time.time()) - self.settings["element"].OwnerHistory.LastModifyingUser = user - self.settings["element"].OwnerHistory.LastModifyingApplication = application - return self.settings["OwnerHistory"] - - def get_user(self): - for element in self.file.by_type("IfcPersonAndOrganization"): - if ( - element.ThePerson == self.settings["person"] - and element.TheOrganization == self.settings["organisation"] - ): - return element - return self.file.create_entity( - "IfcPersonAndOrganization", - **{"ThePerson": self.settings["person"], "TheOrganization": self.settings["organisation"]}, - ) - - def get_application(self): - for element in self.file.by_type("IfcApplication"): - if element.ApplicationIdentifier == self.settings["ApplicationIdentifier"]: - return element - return self.file.create_entity( - "IfcApplication", - **{ - "ApplicationDeveloper": self.get_application_organisation(), - "Version": self.settings["Version"], - "ApplicationFullName": self.settings["ApplicationFullName"], - "ApplicationIdentifier": self.settings["ApplicationIdentifier"], - }, - ) - - def get_application_organisation(self): - return self.file.create_entity( - "IfcOrganization", - **{ - "Name": "IfcOpenShell", - "Description": "IfcOpenShell is an open source (LGPL) software library that helps users and software developers to work with the IFC file format.", - "Roles": [ - self.file.create_entity("IfcActorRole", **{"Role": "USERDEFINED", "UserDefinedRole": "CONTRIBUTOR"}) - ], - "Addresses": [ - self.file.create_entity( - "IfcTelecomAddress", - **{ - "Purpose": "USERDEFINED", - "UserDefinedPurpose": "WEBPAGE", - "Description": "The main webpage of the software collection.", - "WWWHomePageURL": "https://ifcopenshell.org", - }, - ), - self.file.create_entity( - "IfcTelecomAddress", - **{ - "Purpose": "USERDEFINED", - "UserDefinedPurpose": "WEBPAGE", - "Description": "The BlenderBIM Add-on webpage of the software collection.", - "WWWHomePageURL": "https://blenderbim.org", - }, - ), - self.file.create_entity( - "IfcTelecomAddress", - **{ - "Purpose": "USERDEFINED", - "UserDefinedPurpose": "REPOSITORY", - "Description": "The source code repository of the software collection.", - "WWWHomePageURL": "https://github.com/IfcOpenShell/IfcOpenShell.git", - }, - ), - ], - }, - ) diff --git a/src/ifcblenderexport/blenderbim/bim/module/root/remove_product.py b/src/ifcblenderexport/blenderbim/bim/module/root/remove_product.py deleted file mode 100644 index 31ca4be404..0000000000 --- a/src/ifcblenderexport/blenderbim/bim/module/root/remove_product.py +++ /dev/null @@ -1,11 +0,0 @@ -class Usecase: - def __init__(self, file, settings=None): - self.file = file - self.settings = { - "product": None - } - for key, value in settings.items(): - self.settings[key] = value - - def execute(self): - self.file.remove(self.settings["product"]) diff --git a/src/ifcblenderexport/blenderbim/bim/module/sequence/data.py b/src/ifcblenderexport/blenderbim/bim/module/sequence/data.py deleted file mode 100644 index dd7dc98e98..0000000000 --- a/src/ifcblenderexport/blenderbim/bim/module/sequence/data.py +++ /dev/null @@ -1,18 +0,0 @@ -from blenderbim.bim.ifc import IfcStore - - -class Data: - is_loaded = False - tasks = {} - - @classmethod - def purge(cls): - cls.is_loaded = False - cls.tasks = {} - - @classmethod - def load(cls): - cls.tasks = {} - for task in IfcStore.get_file().by_type("IfcTask"): - cls.tasks[task.id()] = {"Name": task.Name, "Identification": task.Identification or ""} - cls.is_loaded=True diff --git a/src/ifcblenderexport/blenderbim/bim/module/structural/add_structural_analysis_model.py b/src/ifcblenderexport/blenderbim/bim/module/structural/add_structural_analysis_model.py deleted file mode 100644 index f7539c02ed..0000000000 --- a/src/ifcblenderexport/blenderbim/bim/module/structural/add_structural_analysis_model.py +++ /dev/null @@ -1,18 +0,0 @@ -import ifcopenshell -from blenderbim.bim.module.owner.api import create_owner_history - - -class Usecase: - def __init__(self, file, settings={}): - self.file = file - self.settings = {} - for key, value in settings.items(): - self.settings[key] = value - - def execute(self): - return self.file.create_entity("IfcStructuralAnalysisModel", **{ - "GlobalId": ifcopenshell.guid.new(), - "OwnerHistory": create_owner_history(), - "Name": "Unnamed", - "PredefinedType": "LOADING_3D" - }) diff --git a/src/ifcblenderexport/blenderbim/bim/module/structural/add_structural_boundary_condition.py b/src/ifcblenderexport/blenderbim/bim/module/structural/add_structural_boundary_condition.py deleted file mode 100644 index 4a3e8412c1..0000000000 --- a/src/ifcblenderexport/blenderbim/bim/module/structural/add_structural_boundary_condition.py +++ /dev/null @@ -1,15 +0,0 @@ -class Usecase: - def __init__(self, file, settings={}): - self.file = file - self.settings = {"connection": None} - for key, value in settings.items(): - self.settings[key] = value - - def execute(self): - if self.settings["connection"].is_a("IfcStructuralPointConnection"): - boundary_class = "IfcBoundaryNodeCondition" - elif self.settings["connection"].is_a("IfcStructuralCurveConnection"): - boundary_class = "IfcBoundaryEdgeCondition" - elif self.settings["connection"].is_a("IfcStructuralSurfaceConnection"): - boundary_class = "IfcBoundaryFaceCondition" - self.settings["connection"].AppliedCondition = self.file.create_entity(boundary_class) diff --git a/src/ifcblenderexport/blenderbim/bim/module/structural/data.py b/src/ifcblenderexport/blenderbim/bim/module/structural/data.py deleted file mode 100644 index dfe1265db4..0000000000 --- a/src/ifcblenderexport/blenderbim/bim/module/structural/data.py +++ /dev/null @@ -1,68 +0,0 @@ -from blenderbim.bim.ifc import IfcStore - - -class Data: - is_loaded = False - products = {} - boundary_conditions = {} - structural_analysis_models = {} - - @classmethod - def purge(cls): - cls.is_loaded = False - cls.products = {} - cls.boundary_conditions = {} - cls.connected_structural_members = {} - cls.structural_analysis_models = {} - - @classmethod - def load(cls, product_id=None): - if product_id: - cls.boundary_conditions = {} - return cls.load_structural_connection(product_id) - cls.products = {} - cls.structural_analysis_models = {} - cls.load_structural_analysis_models() - cls.is_loaded = True - - @classmethod - def load_structural_analysis_models(cls): - for model in IfcStore.get_file().by_type("IfcStructuralAnalysisModel"): - if model.IsGroupedBy: - for rel in model.IsGroupedBy: - for product in rel.RelatedObjects: - cls.products.setdefault(product.id(), []).append(model.id()) - data = model.get_info() - del data["OwnerHistory"] - del data["OrientationOf2DPlane"] - - loaded_by = [] - for load_group in model.LoadedBy or []: - loaded_by.append(load_group.id()) - data["LoadedBy"] = loaded_by - - has_results = [] - for result_group in model.HasResults or []: - has_results.append(result_group.id()) - data["HasResults"] = has_results - - cls.structural_analysis_models[model.id()] = data - - @classmethod - def load_structural_connection(cls, product_id): - connection = IfcStore.get_file().by_id(product_id) - if connection.AppliedCondition: - data = connection.AppliedCondition.get_info() - for key, value in data.items(): - if not value or key in ["Name", "type", "id"]: - continue - data[key] = value.wrappedValue - else: - data = {} - cls.boundary_conditions[connection.id()] = data - - cls.connected_structural_members[connection.id()] = [ - rel.RelatingStructuralMember.id() - for rel in connection.ConnectsStructuralMembers or [] - ] - diff --git a/src/ifccobie/get_maintainable_assets.py b/src/ifccobie/get_maintainable_assets.py index b4a599e0cd..1e71ac50d5 100644 --- a/src/ifccobie/get_maintainable_assets.py +++ b/src/ifccobie/get_maintainable_assets.py @@ -2,9 +2,9 @@ import json import ifcopenshell import ifcopenshell.util.selector -with open("../ifcblenderexport/blenderbim/bim/schema/entity_descriptions.json") as f: +with open("../blenderbim/blenderbim/bim/schema/entity_descriptions.json") as f: entity_descriptions = json.load(f) -with open("../ifcblenderexport/blenderbim/bim/schema/enum_descriptions.json") as f: +with open("../blenderbim/blenderbim/bim/schema/enum_descriptions.json") as f: enum_descriptions = json.load(f) print('{|class="wikitable"') diff --git a/src/ifcconvert/IfcConvert.cpp b/src/ifcconvert/IfcConvert.cpp index 977b418cdf..3359ce5052 100644 --- a/src/ifcconvert/IfcConvert.cpp +++ b/src/ifcconvert/IfcConvert.cpp @@ -386,6 +386,8 @@ int main(int argc, char** argv) { ("draw-storey-heights", po::value(&storey_height_display)->default_value("none")->implicit_value("full"), "Draws a horizontal line at the height of building storeys in vertical drawings") + ("storey-height-line-length", po::value(), + "Length of the line when --draw-storey-heights=left") ("svg-xmlns", "Stores name and guid in a separate namespace as opposed to data-name, data-guid") ("svg-poly", @@ -426,6 +428,8 @@ int main(int argc, char** argv) { " and any other value means that 6 or 7 decimals are used.") ("print-space-names", "Prints IfcSpace LongName and Name in the geometry output. Applicable for SVG output") ("print-space-areas", "Prints calculated IfcSpace areas in square meters. Applicable for SVG output") + ("space-name-transform", po::value(), + "Additional transform to the space labels in SVG") ("edge-arrows", "Adds arrow heads to edge segments to signify edge direction") ; @@ -1010,6 +1014,16 @@ int main(int argc, char** argv) { if (relative_center_x && relative_center_y) { static_cast(serializer.get())->setDrawingCenter(*relative_center_x, *relative_center_y); } + if (vmap.count("storey-height-line-length")) { + static_cast(serializer.get())->setStoreyHeightLineLength( + vmap["storey-height-line-length"].as() + ); + } + if (vmap.count("space-name-transform")) { + static_cast(serializer.get())->setSpaceNameTransform( + vmap["space-name-transform"].as() + ); + } } if (convert_back_units) { diff --git a/src/ifcopenshell-python/ifcopenshell/api/__init__.py b/src/ifcopenshell-python/ifcopenshell/api/__init__.py new file mode 100644 index 0000000000..0468132d86 --- /dev/null +++ b/src/ifcopenshell-python/ifcopenshell/api/__init__.py @@ -0,0 +1,11 @@ +import importlib +import ifcopenshell.api + + +def run(usecase_path, ifc_file=None, **settings): + importlib.import_module(f"ifcopenshell.api.{usecase_path}") + module, usecase = usecase_path.split(".") + usecase_class = getattr(getattr(getattr(ifcopenshell.api, module), usecase), "Usecase") + if ifc_file: + return usecase_class(ifc_file, **settings).execute() + return usecase_class(**settings).execute() diff --git a/src/ifcblenderexport/blenderbim/bim/module/aggregate/assign_object.py b/src/ifcopenshell-python/ifcopenshell/api/aggregate/assign_object.py similarity index 80% rename from src/ifcblenderexport/blenderbim/bim/module/aggregate/assign_object.py rename to src/ifcopenshell-python/ifcopenshell/api/aggregate/assign_object.py index 6a3dd1b946..805de997cc 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/aggregate/assign_object.py +++ b/src/ifcopenshell-python/ifcopenshell/api/aggregate/assign_object.py @@ -1,10 +1,9 @@ import ifcopenshell -from blenderbim.bim.module.owner.api import create_owner_history -from blenderbim.bim.module.owner.api import update_owner_history +import ifcopenshell.api class Usecase: - def __init__(self, file, settings=None): + def __init__(self, file, **settings): self.file = file self.settings = { "product": None, @@ -32,7 +31,7 @@ class Usecase: related_objects.remove(self.settings["product"]) if related_objects: decomposes.RelatedObjects = related_objects - update_owner_history(decomposes) + ifcopenshell.api.run("owner.update_owner_history", self.file, **{"element": decomposes}) else: self.file.remove(decomposes) @@ -40,13 +39,13 @@ class Usecase: related_objects = list(is_decomposed_by.RelatedObjects) related_objects.append(self.settings["product"]) is_decomposed_by.RelatedObjects = related_objects - update_owner_history(is_decomposed_by) + ifcopenshell.api.run("owner.update_owner_history", self.file, **{"element": is_decomposed_by}) else: is_decomposed_by = self.file.create_entity( "IfcRelAggregates", **{ "GlobalId": ifcopenshell.guid.new(), - "OwnerHistory": create_owner_history(), + "OwnerHistory": ifcopenshell.api.run("owner.create_owner_history", self.file), "RelatedObjects": [self.settings["product"]], "RelatingObject": self.settings["relating_object"], } diff --git a/src/ifcblenderexport/blenderbim/bim/module/aggregate/data.py b/src/ifcopenshell-python/ifcopenshell/api/aggregate/data.py similarity index 82% rename from src/ifcblenderexport/blenderbim/bim/module/aggregate/data.py rename to src/ifcopenshell-python/ifcopenshell/api/aggregate/data.py index 67ff085df2..88d783f1f6 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/aggregate/data.py +++ b/src/ifcopenshell-python/ifcopenshell/api/aggregate/data.py @@ -1,6 +1,3 @@ -from blenderbim.bim.ifc import IfcStore - - class Data: products = {} @@ -9,8 +6,7 @@ class Data: cls.products = {} @classmethod - def load(cls, product_id): - file = IfcStore.get_file() + def load(cls, file, product_id): if not file: return product = file.by_id(product_id) diff --git a/src/ifcblenderexport/blenderbim/bim/module/attribute/data.py b/src/ifcopenshell-python/ifcopenshell/api/attribute/data.py similarity index 88% rename from src/ifcblenderexport/blenderbim/bim/module/attribute/data.py rename to src/ifcopenshell-python/ifcopenshell/api/attribute/data.py index 2458759c89..a6750c18fd 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/attribute/data.py +++ b/src/ifcopenshell-python/ifcopenshell/api/attribute/data.py @@ -1,6 +1,5 @@ import ifcopenshell import ifcopenshell.util.attribute -from blenderbim.bim.ifc import IfcStore class Data: @@ -11,13 +10,13 @@ class Data: cls.products = {} @classmethod - def load(cls, product_id): - file = IfcStore.get_file() + def load(cls, file, product_id): if not file: return product = file.by_id(product_id) + schema = ifcopenshell.ifcopenshell_wrapper.schema_by_name(file.schema) cls.products[product_id] = [] - declaration = IfcStore.get_schema().declaration_by_name(product.is_a()) + declaration = schema.declaration_by_name(product.is_a()) for attribute in declaration.all_attributes(): data_type = ifcopenshell.util.attribute.get_primitive_type(attribute) value = getattr(product, attribute.name()) diff --git a/src/ifcblenderexport/blenderbim/bim/module/attribute/edit_attributes.py b/src/ifcopenshell-python/ifcopenshell/api/attribute/edit_attributes.py similarity index 53% rename from src/ifcblenderexport/blenderbim/bim/module/attribute/edit_attributes.py rename to src/ifcopenshell-python/ifcopenshell/api/attribute/edit_attributes.py index 4e45c6b61b..9a68bd8f09 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/attribute/edit_attributes.py +++ b/src/ifcopenshell-python/ifcopenshell/api/attribute/edit_attributes.py @@ -1,13 +1,10 @@ -from blenderbim.bim.module.owner.api import update_owner_history +import ifcopenshell.api -class Usecase(): - def __init__(self, file, settings=None): +class Usecase: + def __init__(self, file, **settings): self.file = file - self.settings = { - "product": None, - "attributes": {} - } + self.settings = {"product": None, "attributes": {}} for key, value in settings.items(): self.settings[key] = value @@ -15,4 +12,4 @@ class Usecase(): for name, value in self.settings["attributes"].items(): setattr(self.settings["product"], name, value) if hasattr(self.settings["product"], "OwnerHistory"): - update_owner_history(self.settings["product"]) + ifcopenshell.api.run("owner.update_owner_history", self.file, **{"element": self.settings["product"]}) diff --git a/src/ifcblenderexport/blenderbim/bim/module/classification/add_classification.py b/src/ifcopenshell-python/ifcopenshell/api/classification/add_classification.py similarity index 97% rename from src/ifcblenderexport/blenderbim/bim/module/classification/add_classification.py rename to src/ifcopenshell-python/ifcopenshell/api/classification/add_classification.py index 7c16292e9f..f66135c23d 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/classification/add_classification.py +++ b/src/ifcopenshell-python/ifcopenshell/api/classification/add_classification.py @@ -3,7 +3,7 @@ import ifcopenshell.util.schema import ifcopenshell.util.date class Usecase: - def __init__(self, file, settings=None): + def __init__(self, file, **settings): self.file = file self.settings = { "classification": None, diff --git a/src/ifcblenderexport/blenderbim/bim/module/classification/add_reference.py b/src/ifcopenshell-python/ifcopenshell/api/classification/add_reference.py similarity index 98% rename from src/ifcblenderexport/blenderbim/bim/module/classification/add_reference.py rename to src/ifcopenshell-python/ifcopenshell/api/classification/add_reference.py index 5c880510eb..921ad3d79f 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/classification/add_reference.py +++ b/src/ifcopenshell-python/ifcopenshell/api/classification/add_reference.py @@ -3,7 +3,7 @@ import ifcopenshell.util.schema class Usecase: - def __init__(self, file, settings=None): + def __init__(self, file, **settings): self.file = file self.settings = { "product": None, diff --git a/src/ifcblenderexport/blenderbim/bim/module/classification/data.py b/src/ifcopenshell-python/ifcopenshell/api/classification/data.py similarity index 95% rename from src/ifcblenderexport/blenderbim/bim/module/classification/data.py rename to src/ifcopenshell-python/ifcopenshell/api/classification/data.py index 0a5f8c367a..00b39ab610 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/classification/data.py +++ b/src/ifcopenshell-python/ifcopenshell/api/classification/data.py @@ -1,6 +1,5 @@ import ifcopenshell import ifcopenshell.util.date -from blenderbim.bim.ifc import IfcStore class Data: @@ -23,8 +22,8 @@ class Data: cls.library_references = {} @classmethod - def load(cls, product_id=None): - cls._file = IfcStore.get_file() + def load(cls, file, product_id=None): + cls._file = file if not cls._file: return if product_id: diff --git a/src/ifcblenderexport/blenderbim/bim/module/classification/edit_classification.py b/src/ifcopenshell-python/ifcopenshell/api/classification/edit_classification.py similarity index 89% rename from src/ifcblenderexport/blenderbim/bim/module/classification/edit_classification.py rename to src/ifcopenshell-python/ifcopenshell/api/classification/edit_classification.py index 58fd59ea9a..12c60626f7 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/classification/edit_classification.py +++ b/src/ifcopenshell-python/ifcopenshell/api/classification/edit_classification.py @@ -1,5 +1,5 @@ class Usecase: - def __init__(self, file, settings=None): + def __init__(self, file, **settings): self.file = file self.settings = { "classification": None, diff --git a/src/ifcblenderexport/blenderbim/bim/module/document/edit_reference.py b/src/ifcopenshell-python/ifcopenshell/api/classification/edit_reference.py similarity index 89% rename from src/ifcblenderexport/blenderbim/bim/module/document/edit_reference.py rename to src/ifcopenshell-python/ifcopenshell/api/classification/edit_reference.py index b538bafb46..a37391d11b 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/document/edit_reference.py +++ b/src/ifcopenshell-python/ifcopenshell/api/classification/edit_reference.py @@ -1,5 +1,5 @@ class Usecase: - def __init__(self, file, settings=None): + def __init__(self, file, **settings): self.file = file self.settings = { "reference": None, diff --git a/src/ifcblenderexport/blenderbim/bim/module/classification/remove_classification.py b/src/ifcopenshell-python/ifcopenshell/api/classification/remove_classification.py similarity index 95% rename from src/ifcblenderexport/blenderbim/bim/module/classification/remove_classification.py rename to src/ifcopenshell-python/ifcopenshell/api/classification/remove_classification.py index a6708c871c..cae293c6ae 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/classification/remove_classification.py +++ b/src/ifcopenshell-python/ifcopenshell/api/classification/remove_classification.py @@ -1,5 +1,5 @@ class Usecase: - def __init__(self, file, settings=None): + def __init__(self, file, **settings): self.file = file self.settings = {"classification": None} for key, value in settings.items(): diff --git a/src/ifcblenderexport/blenderbim/bim/module/classification/remove_reference.py b/src/ifcopenshell-python/ifcopenshell/api/classification/remove_reference.py similarity index 96% rename from src/ifcblenderexport/blenderbim/bim/module/classification/remove_reference.py rename to src/ifcopenshell-python/ifcopenshell/api/classification/remove_reference.py index 5ca45a19cf..d9172b675e 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/classification/remove_reference.py +++ b/src/ifcopenshell-python/ifcopenshell/api/classification/remove_reference.py @@ -2,7 +2,7 @@ import ifcopenshell.util.schema class Usecase: - def __init__(self, file, settings=None): + def __init__(self, file, **settings): self.file = file self.settings = {"reference": None, "product": None} for key, value in settings.items(): diff --git a/src/ifcblenderexport/blenderbim/bim/module/constraint/add_objective.py b/src/ifcopenshell-python/ifcopenshell/api/constraint/add_objective.py similarity index 90% rename from src/ifcblenderexport/blenderbim/bim/module/constraint/add_objective.py rename to src/ifcopenshell-python/ifcopenshell/api/constraint/add_objective.py index 5891bfb49d..a6dc8e2108 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/constraint/add_objective.py +++ b/src/ifcopenshell-python/ifcopenshell/api/constraint/add_objective.py @@ -1,7 +1,7 @@ import ifcopenshell class Usecase: - def __init__(self, file, settings={}): + def __init__(self, file, **settings): self.file = file self.settings = {} for key, value in settings.items(): diff --git a/src/ifcblenderexport/blenderbim/bim/module/constraint/assign_constraint.py b/src/ifcopenshell-python/ifcopenshell/api/constraint/assign_constraint.py similarity index 95% rename from src/ifcblenderexport/blenderbim/bim/module/constraint/assign_constraint.py rename to src/ifcopenshell-python/ifcopenshell/api/constraint/assign_constraint.py index 6a8a8755ae..7dc946e911 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/constraint/assign_constraint.py +++ b/src/ifcopenshell-python/ifcopenshell/api/constraint/assign_constraint.py @@ -2,7 +2,7 @@ import ifcopenshell class Usecase: - def __init__(self, file, settings=None): + def __init__(self, file, **settings): self.file = file self.settings = { "product": None, diff --git a/src/ifcblenderexport/blenderbim/bim/module/constraint/data.py b/src/ifcopenshell-python/ifcopenshell/api/constraint/data.py similarity index 92% rename from src/ifcblenderexport/blenderbim/bim/module/constraint/data.py rename to src/ifcopenshell-python/ifcopenshell/api/constraint/data.py index 165a40902d..aaae145eaf 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/constraint/data.py +++ b/src/ifcopenshell-python/ifcopenshell/api/constraint/data.py @@ -1,6 +1,5 @@ import ifcopenshell import ifcopenshell.util.date -from blenderbim.bim.ifc import IfcStore from datetime import datetime @@ -16,8 +15,8 @@ class Data: cls.objectives = {} @classmethod - def load(cls, product_id=None): - cls._file = IfcStore.get_file() + def load(cls, file, product_id=None): + cls._file = file if not cls._file: return if product_id: diff --git a/src/ifcblenderexport/blenderbim/bim/module/constraint/edit_objective.py b/src/ifcopenshell-python/ifcopenshell/api/constraint/edit_objective.py similarity index 89% rename from src/ifcblenderexport/blenderbim/bim/module/constraint/edit_objective.py rename to src/ifcopenshell-python/ifcopenshell/api/constraint/edit_objective.py index 9a1003ba70..4b569581ee 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/constraint/edit_objective.py +++ b/src/ifcopenshell-python/ifcopenshell/api/constraint/edit_objective.py @@ -1,5 +1,5 @@ class Usecase: - def __init__(self, file, settings=None): + def __init__(self, file, **settings): self.file = file self.settings = { "objective": None, diff --git a/src/ifcblenderexport/blenderbim/bim/module/constraint/remove_constraint.py b/src/ifcopenshell-python/ifcopenshell/api/constraint/remove_constraint.py similarity index 89% rename from src/ifcblenderexport/blenderbim/bim/module/constraint/remove_constraint.py rename to src/ifcopenshell-python/ifcopenshell/api/constraint/remove_constraint.py index 27b0938322..09476c0b3f 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/constraint/remove_constraint.py +++ b/src/ifcopenshell-python/ifcopenshell/api/constraint/remove_constraint.py @@ -1,5 +1,5 @@ class Usecase: - def __init__(self, file, settings=None): + def __init__(self, file, **settings): self.file = file self.settings = {"constraint": None} for key, value in settings.items(): diff --git a/src/ifcblenderexport/blenderbim/bim/module/constraint/unassign_constraint.py b/src/ifcopenshell-python/ifcopenshell/api/constraint/unassign_constraint.py similarity index 91% rename from src/ifcblenderexport/blenderbim/bim/module/constraint/unassign_constraint.py rename to src/ifcopenshell-python/ifcopenshell/api/constraint/unassign_constraint.py index 0c47723a59..63b7d17a2b 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/constraint/unassign_constraint.py +++ b/src/ifcopenshell-python/ifcopenshell/api/constraint/unassign_constraint.py @@ -2,7 +2,7 @@ import ifcopenshell class Usecase: - def __init__(self, file, settings=None): + def __init__(self, file, **settings): self.file = file self.settings = { "product": None, diff --git a/src/ifcblenderexport/blenderbim/bim/module/context/add_context.py b/src/ifcopenshell-python/ifcopenshell/api/context/add_context.py similarity index 97% rename from src/ifcblenderexport/blenderbim/bim/module/context/add_context.py rename to src/ifcopenshell-python/ifcopenshell/api/context/add_context.py index 2d478b6173..4c4d310834 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/context/add_context.py +++ b/src/ifcopenshell-python/ifcopenshell/api/context/add_context.py @@ -1,5 +1,5 @@ class Usecase: - def __init__(self, file, settings=None): + def __init__(self, file, **settings): self.file = file self.settings = { "context": None, diff --git a/src/ifcblenderexport/blenderbim/bim/module/context/data.py b/src/ifcopenshell-python/ifcopenshell/api/context/data.py similarity index 89% rename from src/ifcblenderexport/blenderbim/bim/module/context/data.py rename to src/ifcopenshell-python/ifcopenshell/api/context/data.py index 08fe2c1fe9..cd2380bbcf 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/context/data.py +++ b/src/ifcopenshell-python/ifcopenshell/api/context/data.py @@ -1,6 +1,3 @@ -from blenderbim.bim.ifc import IfcStore - - class Data: is_loaded = False contexts = {} @@ -11,8 +8,7 @@ class Data: cls.contexts = {} @classmethod - def load(cls): - file = IfcStore.get_file() + def load(cls, file): if not file: return cls.contexts = {} diff --git a/src/ifcblenderexport/blenderbim/bim/module/context/remove_context.py b/src/ifcopenshell-python/ifcopenshell/api/context/remove_context.py similarity index 89% rename from src/ifcblenderexport/blenderbim/bim/module/context/remove_context.py rename to src/ifcopenshell-python/ifcopenshell/api/context/remove_context.py index ce17b0ef2d..1315d0b01a 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/context/remove_context.py +++ b/src/ifcopenshell-python/ifcopenshell/api/context/remove_context.py @@ -1,5 +1,5 @@ class Usecase: - def __init__(self, file, settings=None): + def __init__(self, file, **settings): self.file = file self.settings = {"context": None} for key, value in settings.items(): diff --git a/src/ifcblenderexport/blenderbim/bim/module/document/add_information.py b/src/ifcopenshell-python/ifcopenshell/api/document/add_information.py similarity index 91% rename from src/ifcblenderexport/blenderbim/bim/module/document/add_information.py rename to src/ifcopenshell-python/ifcopenshell/api/document/add_information.py index fc1b639695..bb3013e0b9 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/document/add_information.py +++ b/src/ifcopenshell-python/ifcopenshell/api/document/add_information.py @@ -1,7 +1,7 @@ import ifcopenshell class Usecase: - def __init__(self, file, settings={}): + def __init__(self, file, **settings): self.file = file self.settings = {} for key, value in settings.items(): diff --git a/src/ifcblenderexport/blenderbim/bim/module/document/add_reference.py b/src/ifcopenshell-python/ifcopenshell/api/document/add_reference.py similarity index 90% rename from src/ifcblenderexport/blenderbim/bim/module/document/add_reference.py rename to src/ifcopenshell-python/ifcopenshell/api/document/add_reference.py index 7030f4fc32..0e631fefa9 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/document/add_reference.py +++ b/src/ifcopenshell-python/ifcopenshell/api/document/add_reference.py @@ -1,7 +1,7 @@ import ifcopenshell class Usecase: - def __init__(self, file, settings={}): + def __init__(self, file, **settings): self.file = file self.settings = {} for key, value in settings.items(): diff --git a/src/ifcblenderexport/blenderbim/bim/module/document/assign_document.py b/src/ifcopenshell-python/ifcopenshell/api/document/assign_document.py similarity index 97% rename from src/ifcblenderexport/blenderbim/bim/module/document/assign_document.py rename to src/ifcopenshell-python/ifcopenshell/api/document/assign_document.py index b7295a3905..c056b988b0 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/document/assign_document.py +++ b/src/ifcopenshell-python/ifcopenshell/api/document/assign_document.py @@ -2,7 +2,7 @@ import ifcopenshell class Usecase: - def __init__(self, file, settings=None): + def __init__(self, file, **settings): self.file = file self.settings = { "product": None, diff --git a/src/ifcblenderexport/blenderbim/bim/module/document/data.py b/src/ifcopenshell-python/ifcopenshell/api/document/data.py similarity index 95% rename from src/ifcblenderexport/blenderbim/bim/module/document/data.py rename to src/ifcopenshell-python/ifcopenshell/api/document/data.py index 1e3eb3184c..ec67429ecd 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/document/data.py +++ b/src/ifcopenshell-python/ifcopenshell/api/document/data.py @@ -1,6 +1,5 @@ import ifcopenshell import ifcopenshell.util.date -from blenderbim.bim.ifc import IfcStore from datetime import datetime @@ -18,8 +17,8 @@ class Data: cls.information = {} @classmethod - def load(cls, product_id=None): - cls._file = IfcStore.get_file() + def load(cls, file, product_id=None): + cls._file = file if not cls._file: return if product_id: diff --git a/src/ifcblenderexport/blenderbim/bim/module/document/edit_information.py b/src/ifcopenshell-python/ifcopenshell/api/document/edit_information.py similarity index 89% rename from src/ifcblenderexport/blenderbim/bim/module/document/edit_information.py rename to src/ifcopenshell-python/ifcopenshell/api/document/edit_information.py index 6071bf5d95..1a86df4186 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/document/edit_information.py +++ b/src/ifcopenshell-python/ifcopenshell/api/document/edit_information.py @@ -1,5 +1,5 @@ class Usecase: - def __init__(self, file, settings=None): + def __init__(self, file, **settings): self.file = file self.settings = { "information": None, diff --git a/src/ifcblenderexport/blenderbim/bim/module/classification/edit_reference.py b/src/ifcopenshell-python/ifcopenshell/api/document/edit_reference.py similarity index 89% rename from src/ifcblenderexport/blenderbim/bim/module/classification/edit_reference.py rename to src/ifcopenshell-python/ifcopenshell/api/document/edit_reference.py index b538bafb46..a37391d11b 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/classification/edit_reference.py +++ b/src/ifcopenshell-python/ifcopenshell/api/document/edit_reference.py @@ -1,5 +1,5 @@ class Usecase: - def __init__(self, file, settings=None): + def __init__(self, file, **settings): self.file = file self.settings = { "reference": None, diff --git a/src/ifcblenderexport/blenderbim/bim/module/document/remove_document.py b/src/ifcopenshell-python/ifcopenshell/api/document/remove_document.py similarity index 89% rename from src/ifcblenderexport/blenderbim/bim/module/document/remove_document.py rename to src/ifcopenshell-python/ifcopenshell/api/document/remove_document.py index 4f3137bf9d..0ebc89e101 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/document/remove_document.py +++ b/src/ifcopenshell-python/ifcopenshell/api/document/remove_document.py @@ -1,5 +1,5 @@ class Usecase: - def __init__(self, file, settings=None): + def __init__(self, file, **settings): self.file = file self.settings = {"document": None} for key, value in settings.items(): diff --git a/src/ifcblenderexport/blenderbim/bim/module/document/unassign_document.py b/src/ifcopenshell-python/ifcopenshell/api/document/unassign_document.py similarity index 91% rename from src/ifcblenderexport/blenderbim/bim/module/document/unassign_document.py rename to src/ifcopenshell-python/ifcopenshell/api/document/unassign_document.py index a1bdf6c158..ef90f03c67 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/document/unassign_document.py +++ b/src/ifcopenshell-python/ifcopenshell/api/document/unassign_document.py @@ -2,7 +2,7 @@ import ifcopenshell class Usecase: - def __init__(self, file, settings=None): + def __init__(self, file, **settings): self.file = file self.settings = { "product": None, diff --git a/src/ifcblenderexport/blenderbim/bim/module/geometry/add_representation.py b/src/ifcopenshell-python/ifcopenshell/api/geometry/add_representation.py similarity index 99% rename from src/ifcblenderexport/blenderbim/bim/module/geometry/add_representation.py rename to src/ifcopenshell-python/ifcopenshell/api/geometry/add_representation.py index ad0e32225c..6868b91fe2 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/geometry/add_representation.py +++ b/src/ifcopenshell-python/ifcopenshell/api/geometry/add_representation.py @@ -6,7 +6,7 @@ from blenderbim.bim.module.geometry.helper import Helper class Usecase: - def __init__(self, file, settings=None): + def __init__(self, file, **settings): # TODO: This usecase currently depends on Blender's data model self.file = file self.settings = { @@ -424,12 +424,12 @@ class Usecase: ) def create_structural_reference_representation(self): - if self.settings["blender_object"].type == "EMPTY": + if len(self.settings["geometry"].vertices) == 1: return self.file.createIfcTopologyRepresentation( self.settings["context"], self.settings["context"].ContextIdentifier, "Vertex", - [self.create_vertex_point(Vector((0, 0, 0)))], + [self.create_vertex_point(self.settings["geometry"].vertices[0].co)], ) return self.file.createIfcTopologyRepresentation( self.settings["context"], diff --git a/src/ifcblenderexport/blenderbim/bim/module/geometry/assign_representation.py b/src/ifcopenshell-python/ifcopenshell/api/geometry/assign_representation.py similarity index 90% rename from src/ifcblenderexport/blenderbim/bim/module/geometry/assign_representation.py rename to src/ifcopenshell-python/ifcopenshell/api/geometry/assign_representation.py index 482fce9451..1835bfbe39 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/geometry/assign_representation.py +++ b/src/ifcopenshell-python/ifcopenshell/api/geometry/assign_representation.py @@ -1,5 +1,8 @@ +import ifcopenshell.api + + class Usecase: - def __init__(self, file, settings=None): + def __init__(self, file, **settings): self.file = file self.settings = {"product": None, "representation": None} for key, value in settings.items(): @@ -32,3 +35,4 @@ class Usecase: ) ) self.settings["product"].RepresentationMaps = maps + ifcopenshell.api.run("owner.update_owner_history", self.file, **{"element": self.settings["product"]}) diff --git a/src/ifcblenderexport/blenderbim/bim/module/geometry/assign_styles.py b/src/ifcopenshell-python/ifcopenshell/api/geometry/assign_styles.py similarity index 96% rename from src/ifcblenderexport/blenderbim/bim/module/geometry/assign_styles.py rename to src/ifcopenshell-python/ifcopenshell/api/geometry/assign_styles.py index e4ad0a1e36..2fbc699a6c 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/geometry/assign_styles.py +++ b/src/ifcopenshell-python/ifcopenshell/api/geometry/assign_styles.py @@ -1,5 +1,5 @@ class Usecase: - def __init__(self, file, settings=None): + def __init__(self, file, **settings): self.file = file self.settings = { "shape_representation": None, diff --git a/src/ifcblenderexport/blenderbim/bim/module/geometry/data.py b/src/ifcopenshell-python/ifcopenshell/api/geometry/data.py similarity index 92% rename from src/ifcblenderexport/blenderbim/bim/module/geometry/data.py rename to src/ifcopenshell-python/ifcopenshell/api/geometry/data.py index 63fd96fbdf..c72cc104cf 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/geometry/data.py +++ b/src/ifcopenshell-python/ifcopenshell/api/geometry/data.py @@ -1,6 +1,3 @@ -from blenderbim.bim.ifc import IfcStore - - class Data: products = {} representations = {} @@ -11,8 +8,7 @@ class Data: cls.representations = {} @classmethod - def load(cls, product_id): - file = IfcStore.get_file() + def load(cls, file, product_id): if not file: return cls.products[product_id] = [] diff --git a/src/ifcblenderexport/blenderbim/bim/module/geometry/edit_object_placement.py b/src/ifcopenshell-python/ifcopenshell/api/geometry/edit_object_placement.py similarity index 95% rename from src/ifcblenderexport/blenderbim/bim/module/geometry/edit_object_placement.py rename to src/ifcopenshell-python/ifcopenshell/api/geometry/edit_object_placement.py index 97070ec8ad..1a5f205956 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/geometry/edit_object_placement.py +++ b/src/ifcopenshell-python/ifcopenshell/api/geometry/edit_object_placement.py @@ -1,10 +1,11 @@ import numpy as np +import ifcopenshell.api import ifcopenshell.util.element import ifcopenshell.util.placement class Usecase: - def __init__(self, file, settings=None): + def __init__(self, file, **settings): self.file = file self.settings = {"product": None, "matrix": np.eye(4)} for key, value in settings.items(): @@ -46,6 +47,8 @@ class Usecase: ifcopenshell.util.element.remove_deep(self.file, old) self.settings["product"].ObjectPlacement = placement + ifcopenshell.api.run("owner.update_owner_history", self.file, **{"element": self.settings["product"]}) + for settings in dependent_objects: self.settings = settings self.execute() diff --git a/src/ifcblenderexport/blenderbim/bim/module/geometry/map_representation.py b/src/ifcopenshell-python/ifcopenshell/api/geometry/map_representation.py similarity index 96% rename from src/ifcblenderexport/blenderbim/bim/module/geometry/map_representation.py rename to src/ifcopenshell-python/ifcopenshell/api/geometry/map_representation.py index 58b3218c99..933f0f1ee4 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/geometry/map_representation.py +++ b/src/ifcopenshell-python/ifcopenshell/api/geometry/map_representation.py @@ -1,5 +1,5 @@ class Usecase: - def __init__(self, file, settings=None): + def __init__(self, file, **settings): self.file = file self.settings = {"representation": None} self.ifc_vertices = [] diff --git a/src/ifcblenderexport/blenderbim/bim/module/geometry/remove_representation.py b/src/ifcopenshell-python/ifcopenshell/api/geometry/remove_representation.py similarity index 97% rename from src/ifcblenderexport/blenderbim/bim/module/geometry/remove_representation.py rename to src/ifcopenshell-python/ifcopenshell/api/geometry/remove_representation.py index 2d8e95ef33..cad9044db3 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/geometry/remove_representation.py +++ b/src/ifcopenshell-python/ifcopenshell/api/geometry/remove_representation.py @@ -2,7 +2,7 @@ import ifcopenshell.util.element class Usecase: - def __init__(self, file, settings=None): + def __init__(self, file, **settings): self.file = file self.settings = {"representation": None} for key, value in settings.items(): diff --git a/src/ifcblenderexport/blenderbim/bim/module/geometry/unassign_representation.py b/src/ifcopenshell-python/ifcopenshell/api/geometry/unassign_representation.py similarity index 92% rename from src/ifcblenderexport/blenderbim/bim/module/geometry/unassign_representation.py rename to src/ifcopenshell-python/ifcopenshell/api/geometry/unassign_representation.py index ec99e71772..579b0c0a7c 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/geometry/unassign_representation.py +++ b/src/ifcopenshell-python/ifcopenshell/api/geometry/unassign_representation.py @@ -1,9 +1,9 @@ -import blenderbim.bim.module.geometry.remove_representation as remove_representation +import ifcopenshell.api import ifcopenshell.util.element class Usecase: - def __init__(self, file, settings=None): + def __init__(self, file, **settings): self.file = file self.settings = {"product": None, "representation": None} for key, value in settings.items(): @@ -53,4 +53,4 @@ class Usecase: for item in mapped_representations: self.unassign_product_representation(item["product"], item["representation"]) for representation in just_representations: - remove_representation.Usecase(self.file, {"representation": representation}).execute() + ifcopenshell.api.run("owner.remove_representation", self.file, **{"representation": representation}) diff --git a/src/ifcblenderexport/blenderbim/bim/module/georeference/add_georeferencing.py b/src/ifcopenshell-python/ifcopenshell/api/georeference/add_georeferencing.py similarity index 93% rename from src/ifcblenderexport/blenderbim/bim/module/georeference/add_georeferencing.py rename to src/ifcopenshell-python/ifcopenshell/api/georeference/add_georeferencing.py index 6979fdca09..4d31164426 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/georeference/add_georeferencing.py +++ b/src/ifcopenshell-python/ifcopenshell/api/georeference/add_georeferencing.py @@ -1,5 +1,5 @@ class Usecase: - def __init__(self, file, settings=None): + def __init__(self, file, **settings): self.file = file def execute(self): diff --git a/src/ifcblenderexport/blenderbim/bim/module/georeference/data.py b/src/ifcopenshell-python/ifcopenshell/api/georeference/data.py similarity index 91% rename from src/ifcblenderexport/blenderbim/bim/module/georeference/data.py rename to src/ifcopenshell-python/ifcopenshell/api/georeference/data.py index b6efe005db..b8d029b2be 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/georeference/data.py +++ b/src/ifcopenshell-python/ifcopenshell/api/georeference/data.py @@ -1,6 +1,3 @@ -from blenderbim.bim.ifc import IfcStore - - class Data: is_loaded = False map_conversion = {} @@ -13,8 +10,7 @@ class Data: cls.projected_crs = {} @classmethod - def load(cls): - file = IfcStore.get_file() + def load(cls, file): if not file: return cls.map_conversion = {} diff --git a/src/ifcblenderexport/blenderbim/bim/module/georeference/edit_georeferencing.py b/src/ifcopenshell-python/ifcopenshell/api/georeference/edit_georeferencing.py similarity index 97% rename from src/ifcblenderexport/blenderbim/bim/module/georeference/edit_georeferencing.py rename to src/ifcopenshell-python/ifcopenshell/api/georeference/edit_georeferencing.py index 8e21d061f5..aafe61dd83 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/georeference/edit_georeferencing.py +++ b/src/ifcopenshell-python/ifcopenshell/api/georeference/edit_georeferencing.py @@ -2,7 +2,7 @@ import ifcopenshell.util.unit class Usecase: - def __init__(self, file, settings=None): + def __init__(self, file, **settings): self.file = file self.settings = { "map_conversion": {}, diff --git a/src/ifcblenderexport/blenderbim/bim/module/georeference/remove_georeferencing.py b/src/ifcopenshell-python/ifcopenshell/api/georeference/remove_georeferencing.py similarity index 91% rename from src/ifcblenderexport/blenderbim/bim/module/georeference/remove_georeferencing.py rename to src/ifcopenshell-python/ifcopenshell/api/georeference/remove_georeferencing.py index 4b57823afb..d06df550db 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/georeference/remove_georeferencing.py +++ b/src/ifcopenshell-python/ifcopenshell/api/georeference/remove_georeferencing.py @@ -1,5 +1,5 @@ class Usecase: - def __init__(self, file, settings=None): + def __init__(self, file, **settings): self.file = file def execute(self): diff --git a/src/ifcblenderexport/blenderbim/bim/module/grid/create_axis_curve.py b/src/ifcopenshell-python/ifcopenshell/api/grid/create_axis_curve.py similarity index 97% rename from src/ifcblenderexport/blenderbim/bim/module/grid/create_axis_curve.py rename to src/ifcopenshell-python/ifcopenshell/api/grid/create_axis_curve.py index 009e405f6e..9de1815b3e 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/grid/create_axis_curve.py +++ b/src/ifcopenshell-python/ifcopenshell/api/grid/create_axis_curve.py @@ -5,7 +5,7 @@ from mathutils import Matrix # For now, we depend on Blender class Usecase: - def __init__(self, file, settings=None): + def __init__(self, file, **settings): self.file = file self.settings = { "AxisCurve": None, # A Blender object diff --git a/src/ifcblenderexport/blenderbim/bim/module/grid/create_grid_axis.py b/src/ifcopenshell-python/ifcopenshell/api/grid/create_grid_axis.py similarity index 93% rename from src/ifcblenderexport/blenderbim/bim/module/grid/create_grid_axis.py rename to src/ifcopenshell-python/ifcopenshell/api/grid/create_grid_axis.py index 979ededc75..6a98a6fc59 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/grid/create_grid_axis.py +++ b/src/ifcopenshell-python/ifcopenshell/api/grid/create_grid_axis.py @@ -1,5 +1,5 @@ class Usecase: - def __init__(self, file, settings=None): + def __init__(self, file, **settings): self.file = file self.settings = { "AxisTag": "A", diff --git a/src/ifcblenderexport/blenderbim/bim/module/group/add_group.py b/src/ifcopenshell-python/ifcopenshell/api/group/add_group.py similarity index 68% rename from src/ifcblenderexport/blenderbim/bim/module/group/add_group.py rename to src/ifcopenshell-python/ifcopenshell/api/group/add_group.py index 7a7559bd91..1a35093ff0 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/group/add_group.py +++ b/src/ifcopenshell-python/ifcopenshell/api/group/add_group.py @@ -1,9 +1,9 @@ import ifcopenshell -from blenderbim.bim.module.owner.api import create_owner_history +import ifcopenshell.api class Usecase: - def __init__(self, file, settings={}): + def __init__(self, file, **settings): self.file = file self.settings = {} for key, value in settings.items(): @@ -12,6 +12,6 @@ class Usecase: def execute(self): return self.file.create_entity("IfcGroup", **{ "GlobalId": ifcopenshell.guid.new(), - "OwnerHistory": create_owner_history(), + "OwnerHistory": ifcopenshell.api.run("owner.create_owner_history", self.file), "Name": "Unnamed" }) diff --git a/src/ifcblenderexport/blenderbim/bim/module/group/assign_group.py b/src/ifcopenshell-python/ifcopenshell/api/group/assign_group.py similarity index 74% rename from src/ifcblenderexport/blenderbim/bim/module/group/assign_group.py rename to src/ifcopenshell-python/ifcopenshell/api/group/assign_group.py index 99b4e8308a..34bf010531 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/group/assign_group.py +++ b/src/ifcopenshell-python/ifcopenshell/api/group/assign_group.py @@ -1,10 +1,9 @@ import ifcopenshell -from blenderbim.bim.module.owner.api import create_owner_history -from blenderbim.bim.module.owner.api import update_owner_history +import ifcopenshell.api class Usecase: - def __init__(self, file, settings=None): + def __init__(self, file, **settings): self.file = file self.settings = { "product": None, @@ -17,7 +16,7 @@ class Usecase: if not self.settings["group"].IsGroupedBy: return self.file.create_entity("IfcRelAssignsToGroup", **{ "GlobalId": ifcopenshell.guid.new(), - "OwnerHistory": create_owner_history(), + "OwnerHistory": ifcopenshell.api.run("owner.create_owner_history", self.file), "RelatedObjects": [self.settings["product"]], "RelatingGroup": self.settings["group"] }) @@ -25,4 +24,4 @@ class Usecase: related_objects = set(rel.RelatedObjects) or set() related_objects.add(self.settings["product"]) rel.RelatedObjects = list(related_objects) - update_owner_history(rel) + ifcopenshell.api.run("owner.update_owner_history", self.file, **{"element": rel}) diff --git a/src/ifcblenderexport/blenderbim/bim/module/group/data.py b/src/ifcopenshell-python/ifcopenshell/api/group/data.py similarity index 80% rename from src/ifcblenderexport/blenderbim/bim/module/group/data.py rename to src/ifcopenshell-python/ifcopenshell/api/group/data.py index 0524bb3501..bcfffbe5b2 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/group/data.py +++ b/src/ifcopenshell-python/ifcopenshell/api/group/data.py @@ -1,6 +1,3 @@ -from blenderbim.bim.ifc import IfcStore - - class Data: is_loaded = False products = {} @@ -13,10 +10,10 @@ class Data: cls.groups = {} @classmethod - def load(cls): + def load(cls, file): cls.products = {} cls.groups = {} - for group in IfcStore.get_file().by_type("IfcGroup", include_subtypes=False): + for group in file.by_type("IfcGroup", include_subtypes=False): if group.IsGroupedBy: for rel in group.IsGroupedBy: for product in rel.RelatedObjects: diff --git a/src/ifcblenderexport/blenderbim/bim/module/group/edit_group.py b/src/ifcopenshell-python/ifcopenshell/api/group/edit_group.py similarity index 88% rename from src/ifcblenderexport/blenderbim/bim/module/group/edit_group.py rename to src/ifcopenshell-python/ifcopenshell/api/group/edit_group.py index 584fb7f091..1111ce7f35 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/group/edit_group.py +++ b/src/ifcopenshell-python/ifcopenshell/api/group/edit_group.py @@ -1,5 +1,5 @@ class Usecase: - def __init__(self, file, settings=None): + def __init__(self, file, **settings): self.file = file self.settings = { "group": None, diff --git a/src/ifcblenderexport/blenderbim/bim/module/group/remove_group.py b/src/ifcopenshell-python/ifcopenshell/api/group/remove_group.py similarity index 88% rename from src/ifcblenderexport/blenderbim/bim/module/group/remove_group.py rename to src/ifcopenshell-python/ifcopenshell/api/group/remove_group.py index 6acddf7b10..9ead307c68 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/group/remove_group.py +++ b/src/ifcopenshell-python/ifcopenshell/api/group/remove_group.py @@ -1,5 +1,5 @@ class Usecase: - def __init__(self, file, settings=None): + def __init__(self, file, **settings): self.file = file self.settings = {"group": None} for key, value in settings.items(): diff --git a/src/ifcblenderexport/blenderbim/bim/module/group/unassign_group.py b/src/ifcopenshell-python/ifcopenshell/api/group/unassign_group.py similarity index 79% rename from src/ifcblenderexport/blenderbim/bim/module/group/unassign_group.py rename to src/ifcopenshell-python/ifcopenshell/api/group/unassign_group.py index 84ffbcec39..7ec1b74c41 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/group/unassign_group.py +++ b/src/ifcopenshell-python/ifcopenshell/api/group/unassign_group.py @@ -1,9 +1,9 @@ import ifcopenshell -from blenderbim.bim.module.owner.api import update_owner_history +import ifcopenshell.api class Usecase: - def __init__(self, file, settings=None): + def __init__(self, file, **settings): self.file = file self.settings = { "product": None, @@ -20,6 +20,6 @@ class Usecase: related_objects.remove(self.settings["product"]) if len(related_objects): rel.RelatedObjects = list(related_objects) - update_owner_history(rel) + ifcopenshell.api.run("owner.update_owner_history", self.file, **{"element": rel}) else: self.file.remove(rel) diff --git a/src/ifcblenderexport/blenderbim/bim/module/layer/add_layer.py b/src/ifcopenshell-python/ifcopenshell/api/layer/add_layer.py similarity index 87% rename from src/ifcblenderexport/blenderbim/bim/module/layer/add_layer.py rename to src/ifcopenshell-python/ifcopenshell/api/layer/add_layer.py index 03a16945ee..edfe94275a 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/layer/add_layer.py +++ b/src/ifcopenshell-python/ifcopenshell/api/layer/add_layer.py @@ -1,5 +1,5 @@ class Usecase: - def __init__(self, file, settings={}): + def __init__(self, file, **settings): self.file = file self.settings = {} for key, value in settings.items(): diff --git a/src/ifcblenderexport/blenderbim/bim/module/layer/assign_layer.py b/src/ifcopenshell-python/ifcopenshell/api/layer/assign_layer.py similarity index 90% rename from src/ifcblenderexport/blenderbim/bim/module/layer/assign_layer.py rename to src/ifcopenshell-python/ifcopenshell/api/layer/assign_layer.py index e433de6715..66fb65a748 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/layer/assign_layer.py +++ b/src/ifcopenshell-python/ifcopenshell/api/layer/assign_layer.py @@ -2,7 +2,7 @@ import ifcopenshell class Usecase: - def __init__(self, file, settings=None): + def __init__(self, file, **settings): self.file = file self.settings = { "item": None, diff --git a/src/ifcblenderexport/blenderbim/bim/module/layer/data.py b/src/ifcopenshell-python/ifcopenshell/api/layer/data.py similarity index 89% rename from src/ifcblenderexport/blenderbim/bim/module/layer/data.py rename to src/ifcopenshell-python/ifcopenshell/api/layer/data.py index c77a91dcad..6bb53498e2 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/layer/data.py +++ b/src/ifcopenshell-python/ifcopenshell/api/layer/data.py @@ -1,6 +1,5 @@ import ifcopenshell import ifcopenshell.util.date -from blenderbim.bim.ifc import IfcStore from datetime import datetime @@ -16,8 +15,8 @@ class Data: cls.layers = {} @classmethod - def load(cls): - cls._file = IfcStore.get_file() + def load(cls, file): + cls._file = file if not cls._file: return cls.load_layers() diff --git a/src/ifcblenderexport/blenderbim/bim/module/layer/edit_layer.py b/src/ifcopenshell-python/ifcopenshell/api/layer/edit_layer.py similarity index 88% rename from src/ifcblenderexport/blenderbim/bim/module/layer/edit_layer.py rename to src/ifcopenshell-python/ifcopenshell/api/layer/edit_layer.py index a07d90cd0f..0c2da2e637 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/layer/edit_layer.py +++ b/src/ifcopenshell-python/ifcopenshell/api/layer/edit_layer.py @@ -1,5 +1,5 @@ class Usecase: - def __init__(self, file, settings=None): + def __init__(self, file, **settings): self.file = file self.settings = { "layer": None, diff --git a/src/ifcblenderexport/blenderbim/bim/module/layer/remove_layer.py b/src/ifcopenshell-python/ifcopenshell/api/layer/remove_layer.py similarity index 83% rename from src/ifcblenderexport/blenderbim/bim/module/layer/remove_layer.py rename to src/ifcopenshell-python/ifcopenshell/api/layer/remove_layer.py index 005ff1fec6..88bd925292 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/layer/remove_layer.py +++ b/src/ifcopenshell-python/ifcopenshell/api/layer/remove_layer.py @@ -1,5 +1,5 @@ class Usecase: - def __init__(self, file, settings=None): + def __init__(self, file, **settings): self.file = file self.settings = {"layer": None} for key, value in settings.items(): diff --git a/src/ifcblenderexport/blenderbim/bim/module/layer/unassign_layer.py b/src/ifcopenshell-python/ifcopenshell/api/layer/unassign_layer.py similarity index 91% rename from src/ifcblenderexport/blenderbim/bim/module/layer/unassign_layer.py rename to src/ifcopenshell-python/ifcopenshell/api/layer/unassign_layer.py index 33584f7ccc..9803ea2a13 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/layer/unassign_layer.py +++ b/src/ifcopenshell-python/ifcopenshell/api/layer/unassign_layer.py @@ -2,7 +2,7 @@ import ifcopenshell class Usecase: - def __init__(self, file, settings=None): + def __init__(self, file, **settings): self.file = file self.settings = { "item": None, diff --git a/src/ifcblenderexport/blenderbim/bim/module/material/add_constituent.py b/src/ifcopenshell-python/ifcopenshell/api/material/add_constituent.py similarity index 92% rename from src/ifcblenderexport/blenderbim/bim/module/material/add_constituent.py rename to src/ifcopenshell-python/ifcopenshell/api/material/add_constituent.py index e22431aa63..f91dda0980 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/material/add_constituent.py +++ b/src/ifcopenshell-python/ifcopenshell/api/material/add_constituent.py @@ -2,7 +2,7 @@ import ifcopenshell class Usecase: - def __init__(self, file, settings=None): + def __init__(self, file, **settings): self.file = file self.settings = {"constituent_set": None, "material": None} for key, value in settings.items(): diff --git a/src/ifcblenderexport/blenderbim/bim/module/material/add_layer.py b/src/ifcopenshell-python/ifcopenshell/api/material/add_layer.py similarity index 92% rename from src/ifcblenderexport/blenderbim/bim/module/material/add_layer.py rename to src/ifcopenshell-python/ifcopenshell/api/material/add_layer.py index 19b0da8ee2..b5cb426eb9 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/material/add_layer.py +++ b/src/ifcopenshell-python/ifcopenshell/api/material/add_layer.py @@ -2,7 +2,7 @@ import ifcopenshell class Usecase: - def __init__(self, file, settings=None): + def __init__(self, file, **settings): self.file = file self.settings = {"layer_set": None, "material": None} for key, value in settings.items(): diff --git a/src/ifcblenderexport/blenderbim/bim/module/material/add_list_item.py b/src/ifcopenshell-python/ifcopenshell/api/material/add_list_item.py similarity index 90% rename from src/ifcblenderexport/blenderbim/bim/module/material/add_list_item.py rename to src/ifcopenshell-python/ifcopenshell/api/material/add_list_item.py index db020647c9..9c52d74fc7 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/material/add_list_item.py +++ b/src/ifcopenshell-python/ifcopenshell/api/material/add_list_item.py @@ -2,7 +2,7 @@ import ifcopenshell class Usecase: - def __init__(self, file, settings=None): + def __init__(self, file, **settings): self.file = file self.settings = {"material_list": None, "material": None} for key, value in settings.items(): diff --git a/src/ifcblenderexport/blenderbim/bim/module/material/add_material.py b/src/ifcopenshell-python/ifcopenshell/api/material/add_material.py similarity index 87% rename from src/ifcblenderexport/blenderbim/bim/module/material/add_material.py rename to src/ifcopenshell-python/ifcopenshell/api/material/add_material.py index 94184b3d8e..48ee7b4511 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/material/add_material.py +++ b/src/ifcopenshell-python/ifcopenshell/api/material/add_material.py @@ -2,7 +2,7 @@ import ifcopenshell class Usecase: - def __init__(self, file, settings=None): + def __init__(self, file, **settings): self.file = file self.settings = {"Name": "Unnamed"} for key, value in settings.items(): diff --git a/src/ifcblenderexport/blenderbim/bim/module/material/assign_material.py b/src/ifcopenshell-python/ifcopenshell/api/material/assign_material.py similarity index 98% rename from src/ifcblenderexport/blenderbim/bim/module/material/assign_material.py rename to src/ifcopenshell-python/ifcopenshell/api/material/assign_material.py index 766f690774..f7fc4be564 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/material/assign_material.py +++ b/src/ifcopenshell-python/ifcopenshell/api/material/assign_material.py @@ -2,7 +2,7 @@ import ifcopenshell class Usecase: - def __init__(self, file, settings=None): + def __init__(self, file, **settings): self.file = file self.settings = {"product": None, "type": "IfcMaterial", "material": None} for key, value in settings.items(): diff --git a/src/ifcblenderexport/blenderbim/bim/module/material/data.py b/src/ifcopenshell-python/ifcopenshell/api/material/data.py similarity index 96% rename from src/ifcblenderexport/blenderbim/bim/module/material/data.py rename to src/ifcopenshell-python/ifcopenshell/api/material/data.py index 26321ee2a3..1c39d5b20f 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/material/data.py +++ b/src/ifcopenshell-python/ifcopenshell/api/material/data.py @@ -1,5 +1,4 @@ import ifcopenshell -from blenderbim.bim.ifc import IfcStore class Data: @@ -31,8 +30,8 @@ class Data: cls._file = None @classmethod - def load(cls, product_id=None): - cls._file = IfcStore.get_file() + def load(cls, file, product_id=None): + cls._file = file if not cls._file: return if product_id: diff --git a/src/ifcblenderexport/blenderbim/bim/module/material/edit_assigned_material.py b/src/ifcopenshell-python/ifcopenshell/api/material/edit_assigned_material.py similarity index 89% rename from src/ifcblenderexport/blenderbim/bim/module/material/edit_assigned_material.py rename to src/ifcopenshell-python/ifcopenshell/api/material/edit_assigned_material.py index f74956736d..f8dca15b0e 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/material/edit_assigned_material.py +++ b/src/ifcopenshell-python/ifcopenshell/api/material/edit_assigned_material.py @@ -1,5 +1,5 @@ class Usecase(): - def __init__(self, file, settings=None): + def __init__(self, file, **settings): self.file = file self.settings = { "element": None, diff --git a/src/ifcblenderexport/blenderbim/bim/module/material/edit_constituent.py b/src/ifcopenshell-python/ifcopenshell/api/material/edit_constituent.py similarity index 91% rename from src/ifcblenderexport/blenderbim/bim/module/material/edit_constituent.py rename to src/ifcopenshell-python/ifcopenshell/api/material/edit_constituent.py index c6c2d24749..3ba02305d1 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/material/edit_constituent.py +++ b/src/ifcopenshell-python/ifcopenshell/api/material/edit_constituent.py @@ -1,5 +1,5 @@ class Usecase(): - def __init__(self, file, settings=None): + def __init__(self, file, **settings): self.file = file self.settings = { "constituent": None, diff --git a/src/ifcblenderexport/blenderbim/bim/module/material/edit_layer.py b/src/ifcopenshell-python/ifcopenshell/api/material/edit_layer.py similarity index 91% rename from src/ifcblenderexport/blenderbim/bim/module/material/edit_layer.py rename to src/ifcopenshell-python/ifcopenshell/api/material/edit_layer.py index 440e5e9fa4..fa4fdffca2 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/material/edit_layer.py +++ b/src/ifcopenshell-python/ifcopenshell/api/material/edit_layer.py @@ -1,5 +1,5 @@ class Usecase(): - def __init__(self, file, settings=None): + def __init__(self, file, **settings): self.file = file self.settings = { "layer": None, diff --git a/src/ifcblenderexport/blenderbim/bim/module/material/edit_profile.py b/src/ifcopenshell-python/ifcopenshell/api/material/edit_profile.py similarity index 91% rename from src/ifcblenderexport/blenderbim/bim/module/material/edit_profile.py rename to src/ifcopenshell-python/ifcopenshell/api/material/edit_profile.py index c41a5152f7..f833922d30 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/material/edit_profile.py +++ b/src/ifcopenshell-python/ifcopenshell/api/material/edit_profile.py @@ -1,5 +1,5 @@ class Usecase(): - def __init__(self, file, settings=None): + def __init__(self, file, **settings): self.file = file self.settings = { "profile": None, diff --git a/src/ifcblenderexport/blenderbim/bim/module/material/remove_constituent.py b/src/ifcopenshell-python/ifcopenshell/api/material/remove_constituent.py similarity index 85% rename from src/ifcblenderexport/blenderbim/bim/module/material/remove_constituent.py rename to src/ifcopenshell-python/ifcopenshell/api/material/remove_constituent.py index 84d930bb52..9c66ae6afc 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/material/remove_constituent.py +++ b/src/ifcopenshell-python/ifcopenshell/api/material/remove_constituent.py @@ -2,7 +2,7 @@ import ifcopenshell class Usecase: - def __init__(self, file, settings=None): + def __init__(self, file, **settings): self.file = file self.settings = {"constituent": None} for key, value in settings.items(): diff --git a/src/ifcblenderexport/blenderbim/bim/module/material/remove_layer.py b/src/ifcopenshell-python/ifcopenshell/api/material/remove_layer.py similarity index 85% rename from src/ifcblenderexport/blenderbim/bim/module/material/remove_layer.py rename to src/ifcopenshell-python/ifcopenshell/api/material/remove_layer.py index 09740f8eb8..d953c56a25 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/material/remove_layer.py +++ b/src/ifcopenshell-python/ifcopenshell/api/material/remove_layer.py @@ -2,7 +2,7 @@ import ifcopenshell class Usecase: - def __init__(self, file, settings=None): + def __init__(self, file, **settings): self.file = file self.settings = {"layer": None} for key, value in settings.items(): diff --git a/src/ifcblenderexport/blenderbim/bim/module/material/remove_list_item.py b/src/ifcopenshell-python/ifcopenshell/api/material/remove_list_item.py similarity index 89% rename from src/ifcblenderexport/blenderbim/bim/module/material/remove_list_item.py rename to src/ifcopenshell-python/ifcopenshell/api/material/remove_list_item.py index 741cf44149..6cafec8420 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/material/remove_list_item.py +++ b/src/ifcopenshell-python/ifcopenshell/api/material/remove_list_item.py @@ -2,7 +2,7 @@ import ifcopenshell class Usecase: - def __init__(self, file, settings=None): + def __init__(self, file, **settings): self.file = file self.settings = {"material_list": None, "material": None} for key, value in settings.items(): diff --git a/src/ifcblenderexport/blenderbim/bim/module/material/remove_material.py b/src/ifcopenshell-python/ifcopenshell/api/material/remove_material.py similarity index 94% rename from src/ifcblenderexport/blenderbim/bim/module/material/remove_material.py rename to src/ifcopenshell-python/ifcopenshell/api/material/remove_material.py index 0cbcf804e8..39ed5c0a68 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/material/remove_material.py +++ b/src/ifcopenshell-python/ifcopenshell/api/material/remove_material.py @@ -2,7 +2,7 @@ import ifcopenshell class Usecase: - def __init__(self, file, settings=None): + def __init__(self, file, **settings): self.file = file self.settings = {"material": None} for key, value in settings.items(): diff --git a/src/ifcblenderexport/blenderbim/bim/module/material/reorder_set_item.py b/src/ifcopenshell-python/ifcopenshell/api/material/reorder_set_item.py similarity index 95% rename from src/ifcblenderexport/blenderbim/bim/module/material/reorder_set_item.py rename to src/ifcopenshell-python/ifcopenshell/api/material/reorder_set_item.py index c4f15373fc..a4b722c6a5 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/material/reorder_set_item.py +++ b/src/ifcopenshell-python/ifcopenshell/api/material/reorder_set_item.py @@ -1,5 +1,5 @@ class Usecase: - def __init__(self, file, settings=None): + def __init__(self, file, **settings): self.file = file self.settings = {"material_set": None, "old_index": 0, "new_index": 0} for key, value in settings.items(): diff --git a/src/ifcblenderexport/blenderbim/bim/module/material/unassign_material.py b/src/ifcopenshell-python/ifcopenshell/api/material/unassign_material.py similarity index 89% rename from src/ifcblenderexport/blenderbim/bim/module/material/unassign_material.py rename to src/ifcopenshell-python/ifcopenshell/api/material/unassign_material.py index a02c548502..8a6fad3b53 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/material/unassign_material.py +++ b/src/ifcopenshell-python/ifcopenshell/api/material/unassign_material.py @@ -2,7 +2,7 @@ import ifcopenshell class Usecase: - def __init__(self, file, settings=None): + def __init__(self, file, **settings): self.file = file self.settings = {"product": None} for key, value in settings.items(): diff --git a/src/ifcblenderexport/blenderbim/bim/module/owner/add_address.py b/src/ifcopenshell-python/ifcopenshell/api/owner/add_address.py similarity index 91% rename from src/ifcblenderexport/blenderbim/bim/module/owner/add_address.py rename to src/ifcopenshell-python/ifcopenshell/api/owner/add_address.py index 26beaeb9cb..14d2a48fac 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/owner/add_address.py +++ b/src/ifcopenshell-python/ifcopenshell/api/owner/add_address.py @@ -1,5 +1,5 @@ class Usecase: - def __init__(self, file, settings=None): + def __init__(self, file, **settings): self.file = file self.settings = {"assigned_object": None, "ifc_class": "IfcPostalAddress"} for key, value in settings.items(): diff --git a/src/ifcopenshell-python/ifcopenshell/api/owner/add_organisation.py b/src/ifcopenshell-python/ifcopenshell/api/owner/add_organisation.py new file mode 100644 index 0000000000..6635fdcb8a --- /dev/null +++ b/src/ifcopenshell-python/ifcopenshell/api/owner/add_organisation.py @@ -0,0 +1,12 @@ +class Usecase: + def __init__(self, file, **settings): + self.file = file + self.settings = { + "Identification": "APTR", + "Name": "Aperture Science", + } + for key, value in settings.items(): + self.settings[key] = value + + def execute(self): + return self.file.create_entity("IfcOrganization", **self.settings) diff --git a/src/ifcopenshell-python/ifcopenshell/api/owner/add_person.py b/src/ifcopenshell-python/ifcopenshell/api/owner/add_person.py new file mode 100644 index 0000000000..f136af8d16 --- /dev/null +++ b/src/ifcopenshell-python/ifcopenshell/api/owner/add_person.py @@ -0,0 +1,13 @@ +class Usecase: + def __init__(self, file, **settings): + self.file = file + self.settings = { + "Identification": "HSeldon", + "FamilyName": "Seldon", + "GivenName": "Hari", + } + for key, value in settings.items(): + self.settings[key] = value + + def execute(self): + return self.file.create_entity("IfcPerson", **self.settings) diff --git a/src/ifcblenderexport/blenderbim/bim/module/owner/add_role.py b/src/ifcopenshell-python/ifcopenshell/api/owner/add_role.py similarity index 90% rename from src/ifcblenderexport/blenderbim/bim/module/owner/add_role.py rename to src/ifcopenshell-python/ifcopenshell/api/owner/add_role.py index dfbe523db9..a934f927bb 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/owner/add_role.py +++ b/src/ifcopenshell-python/ifcopenshell/api/owner/add_role.py @@ -1,5 +1,5 @@ class Usecase: - def __init__(self, file, settings=None): + def __init__(self, file, **settings): self.file = file self.settings = {"assigned_object": None} for key, value in settings.items(): diff --git a/src/ifcopenshell-python/ifcopenshell/api/owner/create_owner_history.py b/src/ifcopenshell-python/ifcopenshell/api/owner/create_owner_history.py new file mode 100644 index 0000000000..fb5561390a --- /dev/null +++ b/src/ifcopenshell-python/ifcopenshell/api/owner/create_owner_history.py @@ -0,0 +1,45 @@ +import time +import ifcopenshell +import ifcopenshell.api.owner.settings + + +class Usecase: + def __init__(self, file, **settings): + self.file = file + self.settings = {} + for key, value in settings.items(): + self.settings[key] = value + + def execute(self): + self.settings["person"] = ifcopenshell.api.owner.settings.get_person(self.file) + self.settings["organisation"] = ifcopenshell.api.owner.settings.get_organisation(self.file) + if self.file.schema != "IFC2X3": + if not self.settings["person"] or not self.settings["organisation"]: + return + user = self.get_user() + application = ifcopenshell.api.owner.settings.get_application(self.file) + return self.file.create_entity( + "IfcOwnerHistory", + **{ + "OwningUser": user, + "OwningApplication": application, + "State": "READWRITE", + "ChangeAction": "ADDED", + "LastModifiedDate": int(time.time()), + "LastModifyingUser": user, + "LastModifyingApplication": application, + "CreationDate": int(time.time()), + }, + ) + + def get_user(self): + for element in self.file.by_type("IfcPersonAndOrganization"): + if ( + element.ThePerson == self.settings["person"] + and element.TheOrganization == self.settings["organisation"] + ): + return element + return self.file.create_entity( + "IfcPersonAndOrganization", + **{"ThePerson": self.settings["person"], "TheOrganization": self.settings["organisation"]}, + ) diff --git a/src/ifcblenderexport/blenderbim/bim/module/owner/data.py b/src/ifcopenshell-python/ifcopenshell/api/owner/data.py similarity index 95% rename from src/ifcblenderexport/blenderbim/bim/module/owner/data.py rename to src/ifcopenshell-python/ifcopenshell/api/owner/data.py index 290becd1dd..d4aa5a3b4d 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/owner/data.py +++ b/src/ifcopenshell-python/ifcopenshell/api/owner/data.py @@ -1,6 +1,3 @@ -from blenderbim.bim.ifc import IfcStore - - class Data: is_loaded = False people = {} @@ -17,8 +14,7 @@ class Data: cls.roles = {} @classmethod - def load(cls): - file = IfcStore.get_file() + def load(cls, file): if not file: return cls.people = {} diff --git a/src/ifcblenderexport/blenderbim/bim/module/owner/edit_address.py b/src/ifcopenshell-python/ifcopenshell/api/owner/edit_address.py similarity index 88% rename from src/ifcblenderexport/blenderbim/bim/module/owner/edit_address.py rename to src/ifcopenshell-python/ifcopenshell/api/owner/edit_address.py index fcc14d455f..4abb9d5542 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/owner/edit_address.py +++ b/src/ifcopenshell-python/ifcopenshell/api/owner/edit_address.py @@ -1,5 +1,5 @@ class Usecase: - def __init__(self, file, settings=None): + def __init__(self, file, **settings): self.file = file self.settings = { "address": None, diff --git a/src/ifcblenderexport/blenderbim/bim/module/owner/edit_organisation.py b/src/ifcopenshell-python/ifcopenshell/api/owner/edit_organisation.py similarity index 89% rename from src/ifcblenderexport/blenderbim/bim/module/owner/edit_organisation.py rename to src/ifcopenshell-python/ifcopenshell/api/owner/edit_organisation.py index 661c29c022..c9705ac7cb 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/owner/edit_organisation.py +++ b/src/ifcopenshell-python/ifcopenshell/api/owner/edit_organisation.py @@ -1,5 +1,5 @@ class Usecase: - def __init__(self, file, settings=None): + def __init__(self, file, **settings): self.file = file self.settings = { "organisation": None, diff --git a/src/ifcblenderexport/blenderbim/bim/module/owner/edit_person.py b/src/ifcopenshell-python/ifcopenshell/api/owner/edit_person.py similarity index 88% rename from src/ifcblenderexport/blenderbim/bim/module/owner/edit_person.py rename to src/ifcopenshell-python/ifcopenshell/api/owner/edit_person.py index afeaa9b429..f8f96afe94 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/owner/edit_person.py +++ b/src/ifcopenshell-python/ifcopenshell/api/owner/edit_person.py @@ -1,5 +1,5 @@ class Usecase: - def __init__(self, file, settings=None): + def __init__(self, file, **settings): self.file = file self.settings = { "person": None, diff --git a/src/ifcblenderexport/blenderbim/bim/module/owner/edit_role.py b/src/ifcopenshell-python/ifcopenshell/api/owner/edit_role.py similarity index 88% rename from src/ifcblenderexport/blenderbim/bim/module/owner/edit_role.py rename to src/ifcopenshell-python/ifcopenshell/api/owner/edit_role.py index f081a850f7..fda91bee32 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/owner/edit_role.py +++ b/src/ifcopenshell-python/ifcopenshell/api/owner/edit_role.py @@ -1,5 +1,5 @@ class Usecase: - def __init__(self, file, settings=None): + def __init__(self, file, **settings): self.file = file self.settings = { "role": None, diff --git a/src/ifcblenderexport/blenderbim/bim/module/owner/remove_address.py b/src/ifcopenshell-python/ifcopenshell/api/owner/remove_address.py similarity index 84% rename from src/ifcblenderexport/blenderbim/bim/module/owner/remove_address.py rename to src/ifcopenshell-python/ifcopenshell/api/owner/remove_address.py index 9891d04062..2362f4a24d 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/owner/remove_address.py +++ b/src/ifcopenshell-python/ifcopenshell/api/owner/remove_address.py @@ -1,5 +1,5 @@ class Usecase: - def __init__(self, file, settings=None): + def __init__(self, file, **settings): self.file = file self.settings = {"address": None} for key, value in settings.items(): diff --git a/src/ifcblenderexport/blenderbim/bim/module/owner/remove_organisation.py b/src/ifcopenshell-python/ifcopenshell/api/owner/remove_organisation.py similarity index 84% rename from src/ifcblenderexport/blenderbim/bim/module/owner/remove_organisation.py rename to src/ifcopenshell-python/ifcopenshell/api/owner/remove_organisation.py index 567ea52d99..0287a9c5e5 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/owner/remove_organisation.py +++ b/src/ifcopenshell-python/ifcopenshell/api/owner/remove_organisation.py @@ -1,5 +1,5 @@ class Usecase: - def __init__(self, file, settings=None): + def __init__(self, file, **settings): self.file = file self.settings = {"organisation": None} for key, value in settings.items(): diff --git a/src/ifcblenderexport/blenderbim/bim/module/owner/remove_person.py b/src/ifcopenshell-python/ifcopenshell/api/owner/remove_person.py similarity index 84% rename from src/ifcblenderexport/blenderbim/bim/module/owner/remove_person.py rename to src/ifcopenshell-python/ifcopenshell/api/owner/remove_person.py index f9e4a6e9fe..66a88d783f 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/owner/remove_person.py +++ b/src/ifcopenshell-python/ifcopenshell/api/owner/remove_person.py @@ -1,5 +1,5 @@ class Usecase: - def __init__(self, file, settings=None): + def __init__(self, file, **settings): self.file = file self.settings = {"person": None} for key, value in settings.items(): diff --git a/src/ifcblenderexport/blenderbim/bim/module/owner/remove_role.py b/src/ifcopenshell-python/ifcopenshell/api/owner/remove_role.py similarity index 83% rename from src/ifcblenderexport/blenderbim/bim/module/owner/remove_role.py rename to src/ifcopenshell-python/ifcopenshell/api/owner/remove_role.py index 446d0e7a39..2218616a44 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/owner/remove_role.py +++ b/src/ifcopenshell-python/ifcopenshell/api/owner/remove_role.py @@ -1,5 +1,5 @@ class Usecase: - def __init__(self, file, settings=None): + def __init__(self, file, **settings): self.file = file self.settings = {"role": None} for key, value in settings.items(): diff --git a/src/ifcopenshell-python/ifcopenshell/api/owner/settings.py b/src/ifcopenshell-python/ifcopenshell/api/owner/settings.py new file mode 100644 index 0000000000..f87f34a3aa --- /dev/null +++ b/src/ifcopenshell-python/ifcopenshell/api/owner/settings.py @@ -0,0 +1,10 @@ +def get_person(ifc): + pass + + +def get_organisation(ifc): + pass + + +def get_application(ifc): + pass diff --git a/src/ifcopenshell-python/ifcopenshell/api/owner/update_owner_history.py b/src/ifcopenshell-python/ifcopenshell/api/owner/update_owner_history.py new file mode 100644 index 0000000000..79e9283947 --- /dev/null +++ b/src/ifcopenshell-python/ifcopenshell/api/owner/update_owner_history.py @@ -0,0 +1,44 @@ +import time +import ifcopenshell +import ifcopenshell.api + + +class Usecase: + def __init__(self, file, **settings): + self.file = file + self.settings = {} + for key, value in settings.items(): + self.settings[key] = value + + def execute(self): + self.settings["person"] = ifcopenshell.api.owner.settings.get_person(self.file) + self.settings["organisation"] = ifcopenshell.api.owner.settings.get_organisation(self.file) + if not self.settings["element"].OwnerHistory: + self.settings["element"].OwnerHistory = ifcopenshell.api.run( + "owner.create_owner_history", self.file, **self.settings + ) + return self.settings["element"].OwnerHistory + if len(self.file.get_inverse(self.settings["element"].OwnerHistory)) > 1: + old_history = self.settings["element"].OwnerHistory + self.settings["element"].OwnerHistory = self.file.create_entity("IfcOwnerHistory") + for i, attribute in enumerate(old_history): + self.settings["element"].OwnerHistory[i] = attribute + user = self.get_user() + application = ifcopenshell.api.owner.settings.get_application(self.file) + self.settings["element"].OwnerHistory.ChangeAction = "MODIFIED" + self.settings["element"].OwnerHistory.LastModifiedDate = int(time.time()) + self.settings["element"].OwnerHistory.LastModifyingUser = user + self.settings["element"].OwnerHistory.LastModifyingApplication = application + return self.settings["element"].OwnerHistory + + def get_user(self): + for element in self.file.by_type("IfcPersonAndOrganization"): + if ( + element.ThePerson == self.settings["person"] + and element.TheOrganization == self.settings["organisation"] + ): + return element + return self.file.create_entity( + "IfcPersonAndOrganization", + **{"ThePerson": self.settings["person"], "TheOrganization": self.settings["organisation"]}, + ) diff --git a/src/ifcblenderexport/blenderbim/bim/module/project/create_file.py b/src/ifcopenshell-python/ifcopenshell/api/project/create_file.py similarity index 96% rename from src/ifcblenderexport/blenderbim/bim/module/project/create_file.py rename to src/ifcopenshell-python/ifcopenshell/api/project/create_file.py index e4e442f75c..9e4fd31796 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/project/create_file.py +++ b/src/ifcopenshell-python/ifcopenshell/api/project/create_file.py @@ -3,7 +3,7 @@ import ifcopenshell class Usecase: - def __init__(self, settings=None): + def __init__(self, **settings): self.settings = {"version": "IFC4"} for key, value in settings.items(): self.settings[key] = value diff --git a/src/ifcblenderexport/blenderbim/bim/module/pset/add_pset.py b/src/ifcopenshell-python/ifcopenshell/api/pset/add_pset.py similarity index 97% rename from src/ifcblenderexport/blenderbim/bim/module/pset/add_pset.py rename to src/ifcopenshell-python/ifcopenshell/api/pset/add_pset.py index 17d2612ddf..37062d3845 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/pset/add_pset.py +++ b/src/ifcopenshell-python/ifcopenshell/api/pset/add_pset.py @@ -3,7 +3,7 @@ import blenderbim.bim.schema # TODO: refactor class Usecase: - def __init__(self, file, settings=None): + def __init__(self, file, **settings): self.file = file self.settings = {"product": None, "Name": None} for key, value in settings.items(): diff --git a/src/ifcblenderexport/blenderbim/bim/module/pset/add_qto.py b/src/ifcopenshell-python/ifcopenshell/api/pset/add_qto.py similarity index 94% rename from src/ifcblenderexport/blenderbim/bim/module/pset/add_qto.py rename to src/ifcopenshell-python/ifcopenshell/api/pset/add_qto.py index 5df089d98e..b55522da08 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/pset/add_qto.py +++ b/src/ifcopenshell-python/ifcopenshell/api/pset/add_qto.py @@ -3,7 +3,7 @@ import blenderbim.bim.schema # TODO: refactor class Usecase: - def __init__(self, file, settings=None): + def __init__(self, file, **settings): self.file = file self.settings = {"product": None, "Name": None} for key, value in settings.items(): diff --git a/src/ifcblenderexport/blenderbim/bim/module/pset/data.py b/src/ifcopenshell-python/ifcopenshell/api/pset/data.py similarity index 96% rename from src/ifcblenderexport/blenderbim/bim/module/pset/data.py rename to src/ifcopenshell-python/ifcopenshell/api/pset/data.py index 4632a085be..9b1410fe77 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/pset/data.py +++ b/src/ifcopenshell-python/ifcopenshell/api/pset/data.py @@ -1,7 +1,6 @@ import ifcopenshell import ifcopenshell.util.attribute import blenderbim.bim.schema # TODO: refactor elsewhere -from blenderbim.bim.ifc import IfcStore class Data: @@ -16,8 +15,9 @@ class Data: cls.qtos = {} @classmethod - def load(cls, product_id): - file = IfcStore.get_file() + def load(cls, file, product_id): + cls._file = file + cls._schema = ifcopenshell.ifcopenshell_wrapper.schema_by_name(file.schema) if not file: return product = file.by_id(product_id) @@ -162,7 +162,7 @@ class Data: if prop_template.TemplateType == "P_SINGLEVALUE": try: data_type = ifcopenshell.util.attribute.get_primitive_type( - IfcStore.get_schema().declaration_by_name(prop_template.PrimaryMeasureType or "IfcLabel") + cls._schema.declaration_by_name(prop_template.PrimaryMeasureType or "IfcLabel") ) except: # TODO: Occurs if the data type is something that exists in IFC4 and not in IFC2X3. To fully fix diff --git a/src/ifcblenderexport/blenderbim/bim/module/pset/edit_pset.py b/src/ifcopenshell-python/ifcopenshell/api/pset/edit_pset.py similarity index 98% rename from src/ifcblenderexport/blenderbim/bim/module/pset/edit_pset.py rename to src/ifcopenshell-python/ifcopenshell/api/pset/edit_pset.py index 0fc34751b1..dd76185234 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/pset/edit_pset.py +++ b/src/ifcopenshell-python/ifcopenshell/api/pset/edit_pset.py @@ -2,7 +2,7 @@ import blenderbim.bim.schema # TODO: refactor class Usecase: - def __init__(self, file, settings=None): + def __init__(self, file, **settings): self.file = file self.settings = {"pset": None, "Name": None, "Properties": {}} for key, value in settings.items(): diff --git a/src/ifcblenderexport/blenderbim/bim/module/pset/edit_qto.py b/src/ifcopenshell-python/ifcopenshell/api/pset/edit_qto.py similarity index 98% rename from src/ifcblenderexport/blenderbim/bim/module/pset/edit_qto.py rename to src/ifcopenshell-python/ifcopenshell/api/pset/edit_qto.py index 95a672b850..bd43f646af 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/pset/edit_qto.py +++ b/src/ifcopenshell-python/ifcopenshell/api/pset/edit_qto.py @@ -2,7 +2,7 @@ import blenderbim.bim.schema # TODO: refactor class Usecase: - def __init__(self, file, settings=None): + def __init__(self, file, **settings): self.file = file self.settings = {"qto": None, "Name": None, "Properties": {}} for key, value in settings.items(): diff --git a/src/ifcblenderexport/blenderbim/bim/module/pset/remove_pset.py b/src/ifcopenshell-python/ifcopenshell/api/pset/remove_pset.py similarity index 95% rename from src/ifcblenderexport/blenderbim/bim/module/pset/remove_pset.py rename to src/ifcopenshell-python/ifcopenshell/api/pset/remove_pset.py index 3ccdf6d0ef..2c742a65cb 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/pset/remove_pset.py +++ b/src/ifcopenshell-python/ifcopenshell/api/pset/remove_pset.py @@ -2,7 +2,7 @@ import blenderbim.bim.schema # TODO: refactor class Usecase: - def __init__(self, file, settings=None): + def __init__(self, file, **settings): self.file = file self.settings = {"product": None, "pset": None} for key, value in settings.items(): diff --git a/src/ifcblenderexport/blenderbim/bim/module/pset_template/add_prop_template.py b/src/ifcopenshell-python/ifcopenshell/api/pset_template/add_prop_template.py similarity index 94% rename from src/ifcblenderexport/blenderbim/bim/module/pset_template/add_prop_template.py rename to src/ifcopenshell-python/ifcopenshell/api/pset_template/add_prop_template.py index 7093d3fbd8..b57b36cf82 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/pset_template/add_prop_template.py +++ b/src/ifcopenshell-python/ifcopenshell/api/pset_template/add_prop_template.py @@ -2,7 +2,7 @@ import ifcopenshell class Usecase: - def __init__(self, file, settings={}): + def __init__(self, file, **settings): self.file = file self.settings = {"pset_template": None} for key, value in settings.items(): diff --git a/src/ifcblenderexport/blenderbim/bim/module/pset_template/add_pset_template.py b/src/ifcopenshell-python/ifcopenshell/api/pset_template/add_pset_template.py similarity index 91% rename from src/ifcblenderexport/blenderbim/bim/module/pset_template/add_pset_template.py rename to src/ifcopenshell-python/ifcopenshell/api/pset_template/add_pset_template.py index 613298aa96..341790790b 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/pset_template/add_pset_template.py +++ b/src/ifcopenshell-python/ifcopenshell/api/pset_template/add_pset_template.py @@ -2,7 +2,7 @@ import ifcopenshell class Usecase: - def __init__(self, file, settings={}): + def __init__(self, file, **settings): self.file = file self.settings = {} for key, value in settings.items(): diff --git a/src/ifcblenderexport/blenderbim/bim/module/pset_template/data.py b/src/ifcopenshell-python/ifcopenshell/api/pset_template/data.py similarity index 90% rename from src/ifcblenderexport/blenderbim/bim/module/pset_template/data.py rename to src/ifcopenshell-python/ifcopenshell/api/pset_template/data.py index 6ff8bd6ba1..d3c9ccb040 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/pset_template/data.py +++ b/src/ifcopenshell-python/ifcopenshell/api/pset_template/data.py @@ -1,6 +1,3 @@ -from blenderbim.bim.ifc import IfcStore - - class Data: is_loaded = False pset_templates = {} @@ -13,8 +10,8 @@ class Data: cls.prop_templates = {} @classmethod - def load(cls): - cls._file = IfcStore.pset_template_file + def load(cls, file): + cls._file = file cls.pset_templates = {} cls.prop_templates = {} diff --git a/src/ifcblenderexport/blenderbim/bim/module/pset_template/edit_prop_template.py b/src/ifcopenshell-python/ifcopenshell/api/pset_template/edit_prop_template.py similarity index 88% rename from src/ifcblenderexport/blenderbim/bim/module/pset_template/edit_prop_template.py rename to src/ifcopenshell-python/ifcopenshell/api/pset_template/edit_prop_template.py index 5e7ed302ae..5ad617f698 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/pset_template/edit_prop_template.py +++ b/src/ifcopenshell-python/ifcopenshell/api/pset_template/edit_prop_template.py @@ -1,5 +1,5 @@ class Usecase: - def __init__(self, file, settings=None): + def __init__(self, file, **settings): self.file = file self.settings = {"prop_template": None, "attributes": {}} for key, value in settings.items(): diff --git a/src/ifcblenderexport/blenderbim/bim/module/pset_template/edit_pset_template.py b/src/ifcopenshell-python/ifcopenshell/api/pset_template/edit_pset_template.py similarity index 88% rename from src/ifcblenderexport/blenderbim/bim/module/pset_template/edit_pset_template.py rename to src/ifcopenshell-python/ifcopenshell/api/pset_template/edit_pset_template.py index 3d5f1caa8b..8d039b9e32 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/pset_template/edit_pset_template.py +++ b/src/ifcopenshell-python/ifcopenshell/api/pset_template/edit_pset_template.py @@ -1,5 +1,5 @@ class Usecase: - def __init__(self, file, settings=None): + def __init__(self, file, **settings): self.file = file self.settings = {"pset_template": None, "attributes": {}} for key, value in settings.items(): diff --git a/src/ifcblenderexport/blenderbim/bim/module/pset_template/remove_prop_template.py b/src/ifcopenshell-python/ifcopenshell/api/pset_template/remove_prop_template.py similarity index 94% rename from src/ifcblenderexport/blenderbim/bim/module/pset_template/remove_prop_template.py rename to src/ifcopenshell-python/ifcopenshell/api/pset_template/remove_prop_template.py index 68e20e6135..0221852eea 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/pset_template/remove_prop_template.py +++ b/src/ifcopenshell-python/ifcopenshell/api/pset_template/remove_prop_template.py @@ -2,7 +2,7 @@ import ifcopenshell.util.element class Usecase: - def __init__(self, file, settings=None): + def __init__(self, file, **settings): self.file = file self.settings = { "prop_template": None diff --git a/src/ifcblenderexport/blenderbim/bim/module/pset_template/remove_pset_template.py b/src/ifcopenshell-python/ifcopenshell/api/pset_template/remove_pset_template.py similarity index 88% rename from src/ifcblenderexport/blenderbim/bim/module/pset_template/remove_pset_template.py rename to src/ifcopenshell-python/ifcopenshell/api/pset_template/remove_pset_template.py index b58e21284f..16f0246782 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/pset_template/remove_pset_template.py +++ b/src/ifcopenshell-python/ifcopenshell/api/pset_template/remove_pset_template.py @@ -2,7 +2,7 @@ import ifcopenshell.util.element class Usecase: - def __init__(self, file, settings=None): + def __init__(self, file, **settings): self.file = file self.settings = { "pset_template": None diff --git a/src/ifcblenderexport/blenderbim/bim/module/root/copy_class.py b/src/ifcopenshell-python/ifcopenshell/api/root/copy_class.py similarity index 97% rename from src/ifcblenderexport/blenderbim/bim/module/root/copy_class.py rename to src/ifcopenshell-python/ifcopenshell/api/root/copy_class.py index 04ba418578..9300ebd0e6 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/root/copy_class.py +++ b/src/ifcopenshell-python/ifcopenshell/api/root/copy_class.py @@ -2,7 +2,7 @@ import ifcopenshell class Usecase: - def __init__(self, file, settings=None): + def __init__(self, file, **settings): self.file = file self.settings = {"product": None} for key, value in settings.items(): diff --git a/src/ifcblenderexport/blenderbim/bim/module/root/create_product.py b/src/ifcopenshell-python/ifcopenshell/api/root/create_entity.py similarity index 86% rename from src/ifcblenderexport/blenderbim/bim/module/root/create_product.py rename to src/ifcopenshell-python/ifcopenshell/api/root/create_entity.py index 2a460df11b..1f40d77108 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/root/create_product.py +++ b/src/ifcopenshell-python/ifcopenshell/api/root/create_entity.py @@ -1,9 +1,9 @@ import ifcopenshell -from blenderbim.bim.module.owner.api import create_owner_history +import ifcopenshell.api class Usecase: - def __init__(self, file, settings=None): + def __init__(self, file, **settings): self.file = file self.settings = { "ifc_class": "IfcBuildingElementProxy", @@ -16,7 +16,7 @@ class Usecase: def execute(self): element = self.file.create_entity(self.settings["ifc_class"], **{ "GlobalId": ifcopenshell.guid.new(), - "OwnerHistory": create_owner_history() + "OwnerHistory": ifcopenshell.api.run("owner.create_owner_history", self.file) }) element.Name = self.settings["name"] or None if self.settings["predefined_type"]: diff --git a/src/ifcblenderexport/blenderbim/bim/module/root/data.py b/src/ifcopenshell-python/ifcopenshell/api/root/data.py similarity index 81% rename from src/ifcblenderexport/blenderbim/bim/module/root/data.py rename to src/ifcopenshell-python/ifcopenshell/api/root/data.py index 445ece8e37..2fe987f5dc 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/root/data.py +++ b/src/ifcopenshell-python/ifcopenshell/api/root/data.py @@ -1,6 +1,3 @@ -from blenderbim.bim.ifc import IfcStore - - class Data: products = {} @@ -9,8 +6,7 @@ class Data: cls.products = {} @classmethod - def load(cls, product_id): - file = IfcStore.get_file() + def load(cls, file, product_id): if not file: return product = file.by_id(product_id) diff --git a/src/ifcblenderexport/blenderbim/bim/module/root/reassign_class.py b/src/ifcopenshell-python/ifcopenshell/api/root/reassign_class.py similarity index 94% rename from src/ifcblenderexport/blenderbim/bim/module/root/reassign_class.py rename to src/ifcopenshell-python/ifcopenshell/api/root/reassign_class.py index 2179e3f0fa..bebb563e76 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/root/reassign_class.py +++ b/src/ifcopenshell-python/ifcopenshell/api/root/reassign_class.py @@ -3,7 +3,7 @@ import ifcopenshell.util.schema class Usecase: - def __init__(self, file, settings=None): + def __init__(self, file, **settings): self.file = file self.settings = { "product": None, diff --git a/src/ifcopenshell-python/ifcopenshell/api/root/remove_product.py b/src/ifcopenshell-python/ifcopenshell/api/root/remove_product.py new file mode 100644 index 0000000000..80c9e16004 --- /dev/null +++ b/src/ifcopenshell-python/ifcopenshell/api/root/remove_product.py @@ -0,0 +1,26 @@ +import ifcopenshell.api + + +class Usecase: + def __init__(self, file, **settings): + self.file = file + self.settings = {"product": None} + for key, value in settings.items(): + self.settings[key] = value + + def execute(self): + representations = [] + if self.settings["product"].is_a("IfcProduct"): + if self.settings["product"].Representation: + representations = self.settings["product"].Representation.Representations or [] + else: + representations = [] + elif self.settings["product"].is_a("IfcTypeProduct"): + representations = [rm.MappedRepresentation for rm in self.settings["product"].RepresentationMaps or []] + for representation in representations: + ifcopenshell.api.run("owner.unassign_representation", + self.file, **{"product": self.settings["product"], "representation": representation} + ) + ifcopenshell.api.run("owner.remove_representation", self.file, **{"representation": representation}) + # TODO: remove object placement and other relationships + self.file.remove(self.settings["product"]) diff --git a/src/ifcopenshell-python/ifcopenshell/api/sequence/add_work_plan.py b/src/ifcopenshell-python/ifcopenshell/api/sequence/add_work_plan.py new file mode 100644 index 0000000000..f885077333 --- /dev/null +++ b/src/ifcopenshell-python/ifcopenshell/api/sequence/add_work_plan.py @@ -0,0 +1,42 @@ +import ifcopenshell.api +import ifcopenshell.util.date +from datetime import datetime + + +class Usecase: + def __init__(self, file, **settings): + self.file = file + self.settings = {"name": None, "predefined_type": "NOTDEFINED", "start_time": datetime.now()} + for key, value in settings.items(): + self.settings[key] = value + + def execute(self): + work_plan = ifcopenshell.api.run( + "root.create_entity", + self.file, + ifc_class="IfcWorkPlan", + predefined_type=self.settings["predefined_type"], + name=self.settings["name"], + ) + work_plan.CreationDate = ifcopenshell.util.date.datetime2ifc(datetime.now(), "IfcDateTime") + person = ifcopenshell.api.owner.settings.get_person(self.file) + if person: + work_plan.Creators = [person] + work_plan.StartTime = ifcopenshell.util.date.datetime2ifc(self.settings["start_time"], "IfcDateTime") + + context = self.file.by_type("IfcContext")[0] + if context.Declares: + rel_declares = context.Declares[0] + ifcopenshell.api.run("owner.update_owner_history", self.file, element=rel_declares) + else: + rel_declares = self.file.create_entity("IfcRelDeclares", **{ + "GlobalId": ifcopenshell.guid.new(), + "OwnerHistory": ifcopenshell.api.run("owner.create_owner_history", self.file), + "RelatingContext": context + }) + + related_definitions = list(rel_declares.RelatedDefinitions or []) + related_definitions.append(work_plan) + rel_declares.RelatedDefinitions = related_definitions + + return work_plan diff --git a/src/ifcopenshell-python/ifcopenshell/api/sequence/data.py b/src/ifcopenshell-python/ifcopenshell/api/sequence/data.py new file mode 100644 index 0000000000..894a942a40 --- /dev/null +++ b/src/ifcopenshell-python/ifcopenshell/api/sequence/data.py @@ -0,0 +1,31 @@ +import ifcopenshell.util.date + + +class Data: + is_loaded = False + work_plans = {} + tasks = {} + + @classmethod + def purge(cls): + cls.is_loaded = False + cls.work_plans = {} + cls.tasks = {} + + @classmethod + def load(cls, file): + cls.work_plans = {} + cls.tasks = {} + for work_plan in file.by_type("IfcWorkPlan"): + data = work_plan.get_info() + del data["OwnerHistory"] + if data["Creators"]: + data["Creators"] = [p.id() for p in data["Creators"]] + data["CreationDate"] = ifcopenshell.util.date.ifc2datetime(data["CreationDate"]) + data["StartTime"] = ifcopenshell.util.date.ifc2datetime(data["StartTime"]) + if data["FinishTime"]: + data["FinishTime"] = ifcopenshell.util.date.ifc2datetime(data["FinishTime"]) + cls.work_plans[work_plan.id()] = data + for task in file.by_type("IfcTask"): + cls.tasks[task.id()] = {"Name": task.Name, "Identification": task.Identification or ""} + cls.is_loaded=True diff --git a/src/ifcopenshell-python/ifcopenshell/api/sequence/remove_work_plan.py b/src/ifcopenshell-python/ifcopenshell/api/sequence/remove_work_plan.py new file mode 100644 index 0000000000..941000f7ff --- /dev/null +++ b/src/ifcopenshell-python/ifcopenshell/api/sequence/remove_work_plan.py @@ -0,0 +1,14 @@ +class Usecase: + def __init__(self, file, **settings): + self.file = file + self.settings = {"work_plan": None} + for key, value in settings.items(): + self.settings[key] = value + + def execute(self): + # TODO: do a deep purge + if self.settings["work_plan"].HasContext: + rel_declares = self.settings["work_plan"].HasContext[0] + if len(rel_declares.RelatedDefinitions) == 1: + self.file.remove(rel_declares) + self.file.remove(self.settings["work_plan"]) diff --git a/src/ifcblenderexport/blenderbim/bim/module/spatial/assign_container.py b/src/ifcopenshell-python/ifcopenshell/api/spatial/assign_container.py similarity index 79% rename from src/ifcblenderexport/blenderbim/bim/module/spatial/assign_container.py rename to src/ifcopenshell-python/ifcopenshell/api/spatial/assign_container.py index afbe536700..0312748c45 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/spatial/assign_container.py +++ b/src/ifcopenshell-python/ifcopenshell/api/spatial/assign_container.py @@ -1,8 +1,9 @@ import ifcopenshell +import ifcopenshell.api class Usecase: - def __init__(self, file, settings=None): + def __init__(self, file, **settings): self.file = file self.settings = { "product": None, @@ -23,6 +24,7 @@ class Usecase: related_elements.remove(self.settings["product"]) if related_elements: contained_in_structure[0].RelatedElements = related_elements + ifcopenshell.api.run("owner.update_owner_history", self.file, **{"element": contained_in_structure[0]}) else: self.file.remove(contained_in_structure[0]) @@ -30,12 +32,13 @@ class Usecase: related_elements = list(contains_elements[0].RelatedElements) related_elements.append(self.settings["product"]) contains_elements[0].RelatedElements = related_elements + ifcopenshell.api.run("owner.update_owner_history", self.file, **{"element": contains_elements[0]}) else: contains_elements = self.file.create_entity( "IfcRelContainedInSpatialStructure", **{ "GlobalId": ifcopenshell.guid.new(), - # TODO "OwnerHistory": None + "OwnerHistory": ifcopenshell.api.run("owner.create_owner_history", self.file), "RelatedElements": [self.settings["product"]], "RelatingStructure": self.settings["relating_structure"], } diff --git a/src/ifcblenderexport/blenderbim/bim/module/spatial/data.py b/src/ifcopenshell-python/ifcopenshell/api/spatial/data.py similarity index 83% rename from src/ifcblenderexport/blenderbim/bim/module/spatial/data.py rename to src/ifcopenshell-python/ifcopenshell/api/spatial/data.py index 027edea27f..03118e0ab0 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/spatial/data.py +++ b/src/ifcopenshell-python/ifcopenshell/api/spatial/data.py @@ -1,6 +1,3 @@ -from blenderbim.bim.ifc import IfcStore - - class Data: products = {} spatial_elements = {} @@ -11,14 +8,13 @@ class Data: cls.spatial_elements = {} @classmethod - def load(cls, product_id=None): + def load(cls, file, product_id=None): if product_id: - return cls.load_product(product_id) - cls.load_spatial_elements() + return cls.load_product(file, product_id) + cls.load_spatial_elements(file) @classmethod - def load_product(cls, product_id): - file = IfcStore.get_file() + def load_product(cls, file, product_id): if not file: return product = file.by_id(product_id) @@ -31,8 +27,7 @@ class Data: cls.products[product_id] = {"type": None, "Name": None, "id": None} @classmethod - def load_spatial_elements(cls): - file = IfcStore.get_file() + def load_spatial_elements(cls, file): if not file: return cls.spatial_elements = {} diff --git a/src/ifcblenderexport/blenderbim/bim/module/spatial/remove_container.py b/src/ifcopenshell-python/ifcopenshell/api/spatial/remove_container.py similarity index 77% rename from src/ifcblenderexport/blenderbim/bim/module/spatial/remove_container.py rename to src/ifcopenshell-python/ifcopenshell/api/spatial/remove_container.py index 57b9a75af3..57a5399980 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/spatial/remove_container.py +++ b/src/ifcopenshell-python/ifcopenshell/api/spatial/remove_container.py @@ -1,8 +1,9 @@ import ifcopenshell +import ifcopenshell.api class Usecase: - def __init__(self, file, settings=None): + def __init__(self, file, **settings): self.file = file self.settings = {"product": None} for key, value in settings.items(): @@ -16,5 +17,6 @@ class Usecase: related_elements.remove(self.settings["product"]) if related_elements: contained_in_structure[0].RelatedElements = related_elements + ifcopenshell.api.run("owner.update_owner_history", self.file, **{"element": contained_in_structure[0]}) else: self.file.remove(contained_in_structure) diff --git a/src/ifcopenshell-python/ifcopenshell/api/structural/add_structural_analysis_model.py b/src/ifcopenshell-python/ifcopenshell/api/structural/add_structural_analysis_model.py new file mode 100644 index 0000000000..1e58a3a87c --- /dev/null +++ b/src/ifcopenshell-python/ifcopenshell/api/structural/add_structural_analysis_model.py @@ -0,0 +1,15 @@ +import ifcopenshell +import ifcopenshell.api + + +class Usecase: + def __init__(self, file, **settings): + self.file = file + self.settings = {} + for key, value in settings.items(): + self.settings[key] = value + + def execute(self): + return ifcopenshell.api.run( + "root.create_entity", self.file, ifc_class="IfcStructuralAnalysisModel", predefined_type="LOADING_3D" + ) diff --git a/src/ifcopenshell-python/ifcopenshell/api/structural/add_structural_boundary_condition.py b/src/ifcopenshell-python/ifcopenshell/api/structural/add_structural_boundary_condition.py new file mode 100644 index 0000000000..9cb49ec47a --- /dev/null +++ b/src/ifcopenshell-python/ifcopenshell/api/structural/add_structural_boundary_condition.py @@ -0,0 +1,21 @@ +class Usecase: + def __init__(self, file, **settings): + self.file = file + self.settings = {"connection": None} + for key, value in settings.items(): + self.settings[key] = value + + def execute(self): + if self.settings["connection"].is_a("IfcRelConnectsStructuralMember"): + related_connection = self.settings["connection"].RelatedStructuralConnection + else: + related_connection = self.settings["connection"] + + if related_connection.is_a("IfcStructuralPointConnection"): + boundary_class = "IfcBoundaryNodeCondition" + elif related_connection.is_a("IfcStructuralCurveConnection"): + boundary_class = "IfcBoundaryEdgeCondition" + elif related_connection.is_a("IfcStructuralSurfaceConnection"): + boundary_class = "IfcBoundaryFaceCondition" + + self.settings["connection"].AppliedCondition = self.file.create_entity(boundary_class) diff --git a/src/ifcopenshell-python/ifcopenshell/api/structural/add_structural_member_connection.py b/src/ifcopenshell-python/ifcopenshell/api/structural/add_structural_member_connection.py new file mode 100644 index 0000000000..e184725bb6 --- /dev/null +++ b/src/ifcopenshell-python/ifcopenshell/api/structural/add_structural_member_connection.py @@ -0,0 +1,19 @@ +import ifcopenshell +import ifcopenshell.api + + +class Usecase: + def __init__(self, file, **settings): + self.file = file + self.settings = {"relating_structural_member": None, "related_structural_connection": None} + for key, value in settings.items(): + self.settings[key] = value + + def execute(self): + for connection in self.settings["related_structural_connection"].ConnectsStructuralMembers or []: + if connection.RelatingStructuralMember == self.settings["relating_structural_member"]: + return + rel = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcRelConnectsStructuralMember") + rel.RelatingStructuralMember = self.settings["relating_structural_member"] + rel.RelatedStructuralConnection = self.settings["related_structural_connection"] + return rel diff --git a/src/ifcblenderexport/blenderbim/bim/module/structural/assign_structural_analysis_model.py b/src/ifcopenshell-python/ifcopenshell/api/structural/assign_structural_analysis_model.py similarity index 76% rename from src/ifcblenderexport/blenderbim/bim/module/structural/assign_structural_analysis_model.py rename to src/ifcopenshell-python/ifcopenshell/api/structural/assign_structural_analysis_model.py index ff486b3fbf..a2925e7981 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/structural/assign_structural_analysis_model.py +++ b/src/ifcopenshell-python/ifcopenshell/api/structural/assign_structural_analysis_model.py @@ -1,10 +1,9 @@ import ifcopenshell -from blenderbim.bim.module.owner.api import create_owner_history -from blenderbim.bim.module.owner.api import update_owner_history +import ifcopenshell.api class Usecase: - def __init__(self, file, settings={}): + def __init__(self, file, **settings): self.file = file self.settings = { "product": None, @@ -17,7 +16,7 @@ class Usecase: if not self.settings["structural_analysis_model"].IsGroupedBy: return self.file.create_entity("IfcRelAssignsToGroup", **{ "GlobalId": ifcopenshell.guid.new(), - "OwnerHistory": create_owner_history(), + "OwnerHistory": ifcopenshell.api.run("owner.create_owner_history", self.file), "RelatedObjects": [self.settings["product"]], "RelatingGroup": self.settings["structural_analysis_model"] }) @@ -25,4 +24,4 @@ class Usecase: related_objects = set(rel.RelatedObjects) or set() related_objects.add(self.settings["product"]) rel.RelatedObjects = list(related_objects) - update_owner_history(rel) + ifcopenshell.api.run("owner.update_owner_history", self.file, **{"element": rel}) diff --git a/src/ifcopenshell-python/ifcopenshell/api/structural/data.py b/src/ifcopenshell-python/ifcopenshell/api/structural/data.py new file mode 100644 index 0000000000..0165ab64f9 --- /dev/null +++ b/src/ifcopenshell-python/ifcopenshell/api/structural/data.py @@ -0,0 +1,99 @@ +class Data: + is_loaded = False + products = {} + structural_analysis_models = {} + connections = {} + boundary_conditions = {} + connects_structural_members = {} + + @classmethod + def purge(cls): + cls.is_loaded = False + cls.products = {} + cls.structural_analysis_models = {} + cls.connections = {} + cls.boundary_conditions = {} + cls.connects_structural_members = {} + + @classmethod + def load(cls, file, product_id=None): + cls._file = file + if not cls._file: + return + if product_id: + return cls.load_structural_connection(product_id) + cls.load_structural_analysis_models() + cls.is_loaded = True + + @classmethod + def load_structural_analysis_models(cls): + cls.products = {} + cls.structural_analysis_models = {} + + for model in cls._file.by_type("IfcStructuralAnalysisModel"): + if model.IsGroupedBy: + for rel in model.IsGroupedBy: + for product in rel.RelatedObjects: + cls.products.setdefault(product.id(), []).append(model.id()) + data = model.get_info() + del data["OwnerHistory"] + del data["OrientationOf2DPlane"] + + loaded_by = [] + for load_group in model.LoadedBy or []: + loaded_by.append(load_group.id()) + data["LoadedBy"] = loaded_by + + has_results = [] + for result_group in model.HasResults or []: + has_results.append(result_group.id()) + data["HasResults"] = has_results + + data["SharedPlacement"] = model.SharedPlacement.id() if model.SharedPlacement else None + + cls.structural_analysis_models[model.id()] = data + + @classmethod + def load_structural_connection(cls, product_id): + cls.connections = {} + cls.boundary_conditions = {} + cls.connects_structural_members = {} + + connection = cls._file.by_id(product_id) + connection_data = {"AppliedCondition": None, "ConnectsStructuralMembers": []} + + if connection.AppliedCondition: + cls.load_boundary_condition(connection.AppliedCondition) + connection_data["AppliedCondition"] = connection.AppliedCondition.id() + + for rel in connection.ConnectsStructuralMembers or []: + cls.load_connects_structural_member(rel) + connection_data["ConnectsStructuralMembers"].append(rel.id()) + + cls.connections[connection.id()] = connection_data + + @classmethod + def load_boundary_condition(cls, boundary_condition): + data = boundary_condition.get_info() + for key, value in data.items(): + if not value or key in ["Name", "type", "id"]: + continue + data[key] = value.wrappedValue + cls.boundary_conditions[boundary_condition.id()] = data + + @classmethod + def load_connects_structural_member(cls, rel): + rel_data = rel.get_info() + del rel_data["OwnerHistory"] + rel_data["RelatingStructuralMember"] = rel.RelatingStructuralMember.id() + rel_data["RelatedStructuralConnection"] = rel.RelatedStructuralConnection.id() + del rel_data["ConditionCoordinateSystem"] # TODO: consider orientation + + if rel.is_a("IfcRelConnectsWithEccentricity"): + rel_data["ConnectionConstraint"] = rel.ConnectionConstraint # TODO + + if rel.AppliedCondition: + cls.load_boundary_condition(rel.AppliedCondition) + rel_data["AppliedCondition"] = rel.AppliedCondition.id() + + cls.connects_structural_members[rel.id()] = rel_data diff --git a/src/ifcblenderexport/blenderbim/bim/module/structural/edit_structural_analysis_model.py b/src/ifcopenshell-python/ifcopenshell/api/structural/edit_structural_analysis_model.py similarity index 90% rename from src/ifcblenderexport/blenderbim/bim/module/structural/edit_structural_analysis_model.py rename to src/ifcopenshell-python/ifcopenshell/api/structural/edit_structural_analysis_model.py index 3e003870b9..9fe0dfd108 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/structural/edit_structural_analysis_model.py +++ b/src/ifcopenshell-python/ifcopenshell/api/structural/edit_structural_analysis_model.py @@ -1,5 +1,5 @@ class Usecase: - def __init__(self, file, settings={}): + def __init__(self, file, **settings): self.file = file self.settings = { "structural_analysis_model": None, diff --git a/src/ifcblenderexport/blenderbim/bim/module/structural/edit_structural_boundary_condition.py b/src/ifcopenshell-python/ifcopenshell/api/structural/edit_structural_boundary_condition.py similarity index 94% rename from src/ifcblenderexport/blenderbim/bim/module/structural/edit_structural_boundary_condition.py rename to src/ifcopenshell-python/ifcopenshell/api/structural/edit_structural_boundary_condition.py index 5b1e3d75e3..0862310e6f 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/structural/edit_structural_boundary_condition.py +++ b/src/ifcopenshell-python/ifcopenshell/api/structural/edit_structural_boundary_condition.py @@ -1,5 +1,5 @@ class Usecase: - def __init__(self, file, settings={}): + def __init__(self, file, **settings): self.file = file self.settings = { "condition": None, diff --git a/src/ifcblenderexport/blenderbim/bim/module/structural/remove_structural_analysis_model.py b/src/ifcopenshell-python/ifcopenshell/api/structural/remove_structural_analysis_model.py similarity index 90% rename from src/ifcblenderexport/blenderbim/bim/module/structural/remove_structural_analysis_model.py rename to src/ifcopenshell-python/ifcopenshell/api/structural/remove_structural_analysis_model.py index b191fb588c..89c214ed3d 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/structural/remove_structural_analysis_model.py +++ b/src/ifcopenshell-python/ifcopenshell/api/structural/remove_structural_analysis_model.py @@ -1,5 +1,5 @@ class Usecase: - def __init__(self, file, settings={}): + def __init__(self, file, **settings): self.file = file self.settings = {"structural_analysis_model": None} for key, value in settings.items(): diff --git a/src/ifcblenderexport/blenderbim/bim/module/structural/remove_structural_boundary_condition.py b/src/ifcopenshell-python/ifcopenshell/api/structural/remove_structural_boundary_condition.py similarity index 73% rename from src/ifcblenderexport/blenderbim/bim/module/structural/remove_structural_boundary_condition.py rename to src/ifcopenshell-python/ifcopenshell/api/structural/remove_structural_boundary_condition.py index 67626af084..48ca3354df 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/structural/remove_structural_boundary_condition.py +++ b/src/ifcopenshell-python/ifcopenshell/api/structural/remove_structural_boundary_condition.py @@ -1,5 +1,5 @@ class Usecase: - def __init__(self, file, settings={}): + def __init__(self, file, **settings): self.file = file self.settings = {"connection": None} for key, value in settings.items(): @@ -8,7 +8,6 @@ class Usecase: def execute(self): if not self.settings["connection"].AppliedCondition: return - if len(self.file.get_inverse(self.settings["connection"].AppliedCondition)) > 1: - self.settings["connection"].AppliedCondition = None - else: + if len(self.file.get_inverse(self.settings["connection"].AppliedCondition)) == 1: self.file.remove(self.settings["connection"].AppliedCondition) + self.settings["connection"].AppliedCondition = None diff --git a/src/ifcopenshell-python/ifcopenshell/api/structural/remove_structural_connection_condition.py b/src/ifcopenshell-python/ifcopenshell/api/structural/remove_structural_connection_condition.py new file mode 100644 index 0000000000..0b376f9895 --- /dev/null +++ b/src/ifcopenshell-python/ifcopenshell/api/structural/remove_structural_connection_condition.py @@ -0,0 +1,19 @@ +import ifcopenshell.api + + +class Usecase: + def __init__(self, file, **settings): + self.file = file + self.settings = {"relation": None} + for key, value in settings.items(): + self.settings[key] = value + + def execute(self): + if self.settings["relation"].AppliedCondition: + ifcopenshell.api.run( + "structural.remove_structural_boundary_condition", + self.file, + **{"connection": self.settings["relation"].RelatedStructuralConnection} + ) + self.file.remove(self.settings["relation"]) + diff --git a/src/ifcblenderexport/blenderbim/bim/module/structural/unassign_structural_analysis_model.py b/src/ifcopenshell-python/ifcopenshell/api/structural/unassign_structural_analysis_model.py similarity index 81% rename from src/ifcblenderexport/blenderbim/bim/module/structural/unassign_structural_analysis_model.py rename to src/ifcopenshell-python/ifcopenshell/api/structural/unassign_structural_analysis_model.py index 0f1b49290e..8c8a18d57b 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/structural/unassign_structural_analysis_model.py +++ b/src/ifcopenshell-python/ifcopenshell/api/structural/unassign_structural_analysis_model.py @@ -1,9 +1,9 @@ import ifcopenshell -from blenderbim.bim.module.owner.api import update_owner_history +import ifcopenshell.api class Usecase: - def __init__(self, file, settings={}): + def __init__(self, file, **settings): self.file = file self.settings = { "product": None, @@ -20,6 +20,6 @@ class Usecase: related_objects.remove(self.settings["product"]) if len(related_objects): rel.RelatedObjects = list(related_objects) - update_owner_history(rel) + ifcopenshell.api.run("owner.update_owner_history", self.file, **{"element": rel}) else: self.file.remove(rel) diff --git a/src/ifcblenderexport/blenderbim/bim/module/style/add_style.py b/src/ifcopenshell-python/ifcopenshell/api/style/add_style.py similarity index 97% rename from src/ifcblenderexport/blenderbim/bim/module/style/add_style.py rename to src/ifcopenshell-python/ifcopenshell/api/style/add_style.py index f4cef0abe7..6221a33674 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/style/add_style.py +++ b/src/ifcopenshell-python/ifcopenshell/api/style/add_style.py @@ -1,5 +1,5 @@ class Usecase: - def __init__(self, file, settings=None): + def __init__(self, file, **settings): self.file = file self.settings = { "Name": "Name", diff --git a/src/ifcblenderexport/blenderbim/bim/module/style/edit_style.py b/src/ifcopenshell-python/ifcopenshell/api/style/edit_style.py similarity index 98% rename from src/ifcblenderexport/blenderbim/bim/module/style/edit_style.py rename to src/ifcopenshell-python/ifcopenshell/api/style/edit_style.py index e83397eece..61cd9311d0 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/style/edit_style.py +++ b/src/ifcopenshell-python/ifcopenshell/api/style/edit_style.py @@ -1,5 +1,5 @@ class Usecase: - def __init__(self, file, settings=None): + def __init__(self, file, **settings): self.file = file self.settings = { "style": None, diff --git a/src/ifcblenderexport/blenderbim/bim/module/type/assign_type.py b/src/ifcopenshell-python/ifcopenshell/api/type/assign_type.py similarity index 82% rename from src/ifcblenderexport/blenderbim/bim/module/type/assign_type.py rename to src/ifcopenshell-python/ifcopenshell/api/type/assign_type.py index fe936f02d2..a162a373de 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/type/assign_type.py +++ b/src/ifcopenshell-python/ifcopenshell/api/type/assign_type.py @@ -1,8 +1,9 @@ import ifcopenshell +import ifcopenshell.api class Usecase: - def __init__(self, file, settings=None): + def __init__(self, file, **settings): self.file = file self.settings = { "related_object": None, @@ -32,6 +33,7 @@ class Usecase: related_objects.remove(self.settings["related_object"]) if related_objects: is_typed_by[0].RelatedObjects = related_objects + ifcopenshell.api.run("owner.update_owner_history", self.file, **{"element": is_typed_by[0]}) else: self.file.remove(is_typed_by[0]) @@ -39,12 +41,13 @@ class Usecase: related_objects = list(types[0].RelatedObjects) related_objects.append(self.settings["related_object"]) types[0].RelatedObjects = related_objects + ifcopenshell.api.run("owner.update_owner_history", self.file, **{"element": types[0]}) else: types = self.file.create_entity( "IfcRelDefinesByType", **{ "GlobalId": ifcopenshell.guid.new(), - # TODO "OwnerHistory": None + "OwnerHistory": ifcopenshell.api.run("owner.create_owner_history", self.file), "RelatedObjects": [self.settings["related_object"]], "RelatingType": self.settings["relating_type"], } diff --git a/src/ifcblenderexport/blenderbim/bim/module/type/data.py b/src/ifcopenshell-python/ifcopenshell/api/type/data.py similarity index 91% rename from src/ifcblenderexport/blenderbim/bim/module/type/data.py rename to src/ifcopenshell-python/ifcopenshell/api/type/data.py index 696db35582..ac8cd509aa 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/type/data.py +++ b/src/ifcopenshell-python/ifcopenshell/api/type/data.py @@ -1,6 +1,3 @@ -from blenderbim.bim.ifc import IfcStore - - class Data: products = {} @@ -9,8 +6,7 @@ class Data: cls.products = {} @classmethod - def load(cls, product_id): - file = IfcStore.get_file() + def load(cls, file, product_id): if not file: return product = file.by_id(product_id) diff --git a/src/ifcblenderexport/blenderbim/bim/module/type/get_related_objects.py b/src/ifcopenshell-python/ifcopenshell/api/type/get_related_objects.py similarity index 96% rename from src/ifcblenderexport/blenderbim/bim/module/type/get_related_objects.py rename to src/ifcopenshell-python/ifcopenshell/api/type/get_related_objects.py index 9226799575..63380a8412 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/type/get_related_objects.py +++ b/src/ifcopenshell-python/ifcopenshell/api/type/get_related_objects.py @@ -2,7 +2,7 @@ import ifcopenshell class Usecase: - def __init__(self, file, settings=None): + def __init__(self, file, **settings): self.file = file self.settings = { "related_object": None, diff --git a/src/ifcblenderexport/blenderbim/bim/module/type/unassign_type.py b/src/ifcopenshell-python/ifcopenshell/api/type/unassign_type.py similarity index 85% rename from src/ifcblenderexport/blenderbim/bim/module/type/unassign_type.py rename to src/ifcopenshell-python/ifcopenshell/api/type/unassign_type.py index e20ba75a2d..3bb7d06d7f 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/type/unassign_type.py +++ b/src/ifcopenshell-python/ifcopenshell/api/type/unassign_type.py @@ -1,8 +1,9 @@ import ifcopenshell +import ifcopenshell.api class Usecase: - def __init__(self, file, settings=None): + def __init__(self, file, **settings): self.file = file self.settings = { "related_object": None @@ -27,5 +28,6 @@ class Usecase: related_objects.remove(self.settings["related_object"]) if related_objects: is_typed_by.RelatedObjects = related_objects + ifcopenshell.api.run("owner.update_owner_history", self.file, **{"element": is_typed_by}) else: self.file.remove(is_typed_by) diff --git a/src/ifcblenderexport/blenderbim/bim/module/unit/assign_unit.py b/src/ifcopenshell-python/ifcopenshell/api/unit/assign_unit.py similarity index 98% rename from src/ifcblenderexport/blenderbim/bim/module/unit/assign_unit.py rename to src/ifcopenshell-python/ifcopenshell/api/unit/assign_unit.py index 3872a50829..f99e41220b 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/unit/assign_unit.py +++ b/src/ifcopenshell-python/ifcopenshell/api/unit/assign_unit.py @@ -2,7 +2,7 @@ import ifcopenshell.util.unit class Usecase(): - def __init__(self, file, settings=None): + def __init__(self, file, **settings): self.file = file self.settings = { "length": { diff --git a/src/ifcblenderexport/blenderbim/bim/module/unit/data.py b/src/ifcopenshell-python/ifcopenshell/api/unit/data.py similarity index 82% rename from src/ifcblenderexport/blenderbim/bim/module/unit/data.py rename to src/ifcopenshell-python/ifcopenshell/api/unit/data.py index 08e1198d55..8b71dad1b4 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/unit/data.py +++ b/src/ifcopenshell-python/ifcopenshell/api/unit/data.py @@ -1,6 +1,3 @@ -from blenderbim.bim.ifc import IfcStore - - class Data: is_loaded = False units = {} @@ -11,8 +8,7 @@ class Data: cls.units = {} @classmethod - def load(cls): - file = IfcStore.get_file() + def load(cls, file): if not file: return unit_assignment = file.by_type("IfcUnitAssignment") diff --git a/src/ifcblenderexport/blenderbim/bim/module/void/add_filling.py b/src/ifcopenshell-python/ifcopenshell/api/void/add_filling.py similarity index 91% rename from src/ifcblenderexport/blenderbim/bim/module/void/add_filling.py rename to src/ifcopenshell-python/ifcopenshell/api/void/add_filling.py index 0acb8b6c48..48393d1874 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/void/add_filling.py +++ b/src/ifcopenshell-python/ifcopenshell/api/void/add_filling.py @@ -2,7 +2,7 @@ import ifcopenshell class Usecase: - def __init__(self, file, settings=None): + def __init__(self, file, **settings): self.file = file self.settings = {"opening": None, "element": None} for key, value in settings.items(): diff --git a/src/ifcblenderexport/blenderbim/bim/module/void/add_opening.py b/src/ifcopenshell-python/ifcopenshell/api/void/add_opening.py similarity index 75% rename from src/ifcblenderexport/blenderbim/bim/module/void/add_opening.py rename to src/ifcopenshell-python/ifcopenshell/api/void/add_opening.py index 5e813b405c..541a35d1f3 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/void/add_opening.py +++ b/src/ifcopenshell-python/ifcopenshell/api/void/add_opening.py @@ -1,8 +1,9 @@ import ifcopenshell +import ifcopenshell.api class Usecase: - def __init__(self, file, settings=None): + def __init__(self, file, **settings): self.file = file self.settings = {"opening": None, "element": None} for key, value in settings.items(): @@ -11,6 +12,7 @@ class Usecase: def execute(self): self.file.create_entity("IfcRelVoidsElement", **{ "GlobalId": ifcopenshell.guid.new(), + "OwnerHistory": ifcopenshell.api.run("owner.create_owner_history", self.file), "RelatingBuildingElement": self.settings["element"], "RelatedOpeningElement": self.settings["opening"] }) diff --git a/src/ifcblenderexport/blenderbim/bim/module/void/data.py b/src/ifcopenshell-python/ifcopenshell/api/void/data.py similarity index 95% rename from src/ifcblenderexport/blenderbim/bim/module/void/data.py rename to src/ifcopenshell-python/ifcopenshell/api/void/data.py index 84c80f3fb0..1f8da638ee 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/void/data.py +++ b/src/ifcopenshell-python/ifcopenshell/api/void/data.py @@ -1,6 +1,3 @@ -from blenderbim.bim.ifc import IfcStore - - class Data: products = {} openings = {} @@ -13,8 +10,7 @@ class Data: cls.fillings = {} @classmethod - def load(cls, product_id): - file = IfcStore.get_file() + def load(cls, file, product_id): if not file: return cls.products[product_id] = set() diff --git a/src/ifcblenderexport/blenderbim/bim/module/void/remove_filling.py b/src/ifcopenshell-python/ifcopenshell/api/void/remove_filling.py similarity index 89% rename from src/ifcblenderexport/blenderbim/bim/module/void/remove_filling.py rename to src/ifcopenshell-python/ifcopenshell/api/void/remove_filling.py index 105acb9160..a805d44b41 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/void/remove_filling.py +++ b/src/ifcopenshell-python/ifcopenshell/api/void/remove_filling.py @@ -1,5 +1,5 @@ class Usecase: - def __init__(self, file, settings=None): + def __init__(self, file, **settings): self.file = file self.settings = {"element": None} for key, value in settings.items(): diff --git a/src/ifcblenderexport/blenderbim/bim/module/void/remove_opening.py b/src/ifcopenshell-python/ifcopenshell/api/void/remove_opening.py similarity index 94% rename from src/ifcblenderexport/blenderbim/bim/module/void/remove_opening.py rename to src/ifcopenshell-python/ifcopenshell/api/void/remove_opening.py index cc84466790..d89d44c2e0 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/void/remove_opening.py +++ b/src/ifcopenshell-python/ifcopenshell/api/void/remove_opening.py @@ -1,5 +1,5 @@ class Usecase: - def __init__(self, file, settings=None): + def __init__(self, file, **settings): self.file = file self.settings = {"opening": None} for key, value in settings.items(): diff --git a/src/ifcopenshell-python/ifcopenshell/util/attribute.py b/src/ifcopenshell-python/ifcopenshell/util/attribute.py index 35d61c7b0a..5e56c62f2f 100644 --- a/src/ifcopenshell-python/ifcopenshell/util/attribute.py +++ b/src/ifcopenshell-python/ifcopenshell/util/attribute.py @@ -3,7 +3,9 @@ def get_primitive_type(attribute_or_data_type): data_type = str(attribute_or_data_type.type_of_attribute()) else: data_type = str(attribute_or_data_type) - if " +#include #include "SvgSerializer.h" @@ -88,7 +89,7 @@ bool SvgSerializer::ready() { return true; } -void SvgSerializer::write(path_object& p, const TopoDS_Wire& wire) { +void SvgSerializer::write(path_object& p, const TopoDS_Wire& wire, boost::optional> dash_array) { /* ShapeFix_Wire fix; Handle(ShapeExtend_WireData) data = new ShapeExtend_WireData; for (TopExp_Explorer edges(result, TopAbs_EDGE); edges.More(); edges.Next()) { @@ -301,7 +302,22 @@ void SvgSerializer::write(path_object& p, const TopoDS_Wire& wire) { first = false; } - path.add("\"/>\n"); + path.add("\""); + + if (dash_array) { + path.add(" stroke-dasharray=\""); + bool first = true; + for (auto& d : *dash_array) { + if (!first) { + path.add(" "); + } + first = false; + radii.push_back(path.add(d)); + } + path.add("\""); + } + + path.add("/>\n"); p.second.push_back(path); } @@ -422,6 +438,68 @@ namespace { return box_t{ {{x0, y0, z0}}, {{x1, y1, z1}} }; } + + struct string_property { + std::string pset_name, prop_name, value; + }; + + template + void enumerate_string_properties(IfcUtil::IfcBaseEntity* product, It output_it) { + auto rels = product->get_inverse("IsDefinedBy"); + for (auto& rel : *rels) { + if (rel->declaration().is("IfcRelDefinesByProperties")) { + auto pset = (IfcUtil::IfcBaseEntity*) (IfcUtil::IfcBaseClass*) *((IfcUtil::IfcBaseEntity*) rel)->get("RelatingPropertyDefinition"); + std::string pset_name; + if (!pset->get("Name")->isNull()) { + pset_name = (std::string) *pset->get("Name"); + } + IfcEntityList::ptr props = *pset->get("HasProperties"); + for (auto& prop : *props) { + if (prop->declaration().is("IfcPropertySingleValue")) { + std::string name = *((IfcUtil::IfcBaseEntity*) prop)->get("Name"); + IfcUtil::IfcBaseClass* v = *((IfcUtil::IfcBaseEntity*) prop)->get("NominalValue"); + auto value = v->data().getArgument(0); + if (value->type() == IfcUtil::Argument_STRING) { + std::string v_str = *value; + *output_it++ = string_property{ pset_name, name, v_str }; + } + } + } + } + } + } +} + +namespace { + boost::optional get_curve_style_name(IfcUtil::IfcBaseEntity* item) { + auto refs = item->get_inverse("StyledByItem"); + for (auto& ref : *refs) { + if (ref->declaration().is("IfcStyledItem")) { + IfcEntityList::ptr styles = *((IfcUtil::IfcBaseEntity*)ref)->get("Styles"); + for (auto& s_ : *styles) { + auto s = (IfcUtil::IfcBaseEntity*) s_; + std::vector pss; + if (s->declaration().is("IfcPresentationStyleAssignment")) { + IfcEntityList::ptr pstyles = *s->get("Styles"); + for (auto& ssss : *pstyles) { + pss.push_back((IfcUtil::IfcBaseEntity*) ssss); + } + } else { + pss.push_back(s); + } + for (auto& ps : pss) { + if (ps->declaration().is("IfcCurveStyle")) { + auto arg = ps->get("Name"); + if (!arg->isNull()) { + return (std::string) *arg; + } + } + } + } + } + } + return boost::none; + } } void SvgSerializer::write(const IfcGeom::BRepElement* brep_obj) { @@ -431,7 +509,36 @@ void SvgSerializer::write(const IfcGeom::BRepElement* brep_obj) { object_type = static_cast(*brep_obj->product()->get("ObjectType")); } + std::vector>> dash_arrays; + TopoDS_Shape compound_local = brep_obj->geometry().as_compound(); + for (auto& x : brep_obj->geometry()) { + dash_arrays.emplace_back(); + + auto item = (IfcUtil::IfcBaseEntity*) this->file->instance_by_id(x.ItemId()); + auto curve_style_name = get_curve_style_name(item); + + if (curve_style_name && + (boost::starts_with(*curve_style_name, "LINE_") || + boost::starts_with(*curve_style_name, "DASH_"))) + { + std::vector tokens; + boost::split(tokens, *curve_style_name, boost::is_any_of("_")); + if (tokens.size() > 1) { + dash_arrays.back().emplace(); + for (auto& tok : tokens) { + double d; + try { + d = boost::lexical_cast(tok); + } catch (boost::bad_lexical_cast&) { + continue; + } + dash_arrays.back()->push_back(d / 1000.); + } + } + } + } + const gp_Trsf& trsf = brep_obj->transformation().data(); const bool is_section = (section_ref_ && object_type && *section_ref_ == *object_type); @@ -443,6 +550,9 @@ void SvgSerializer::write(const IfcGeom::BRepElement* brep_obj) { // (When determinant < 0, copy is implied and the input is not mutated.) auto compound_unmirrored = make_transform_global.Shape(); + boost::optional scale; + boost::optional> size; + auto e = edge_from_compound(compound_unmirrored); boost::optional pln; if (e) { @@ -457,8 +567,39 @@ void SvgSerializer::write(const IfcGeom::BRepElement* brep_obj) { pln = gp_Pln(gp_Ax3(P, N, V)); } } - else if (box_from_compound(compound_local)) { + else if (boost::optional b = box_from_compound(compound_local)) { pln = gp_Pln().Transformed(trsf); + size = std::make_pair( + b->second[0] - b->first[0], + b->second[1] - b->first[1] + ); + } + + std::vector props; + enumerate_string_properties(brep_obj->product(), std::back_inserter(props)); + std::map prop_map; + for (auto& p : props) { + prop_map[p.pset_name + "." + p.prop_name] = p.value; + } + auto pit = prop_map.find("EPset_Drawing.Scale"); + if (pit != prop_map.end()) { + typedef boost::tokenizer> tokenizer; + tokenizer tok{ pit->second }; + auto tokit = tok.begin(); + std::string num, denum; + if (tokit != tok.end()) { + num = *tokit++; + } + tokit++; + if (tokit != tok.end()) { + denum = *tokit++; + } + if (num.size() && denum.size()) { + try { + scale = (float) boost::lexical_cast(num) / boost::lexical_cast(denum); + } + catch (boost::bad_lexical_cast&) {} + } } if (pln) { @@ -477,10 +618,10 @@ void SvgSerializer::write(const IfcGeom::BRepElement* brep_obj) { name = boost::lexical_cast(brep_obj->id()); } if (is_section) { - deferred_section_data_->push_back(vertical_section{ *pln , "Section " + name, false }); + deferred_section_data_->push_back(vertical_section{ *pln , "Section " + name, false, scale, size }); } if (is_elevation) { - deferred_section_data_->push_back(vertical_section{ *pln , "Elevation " + name, true }); + deferred_section_data_->push_back(vertical_section{ *pln , "Elevation " + name, true, scale, size }); } } @@ -491,7 +632,7 @@ void SvgSerializer::write(const IfcGeom::BRepElement* brep_obj) { IfcUtil::IfcBaseEntity* storey = p ? p->first : nullptr; double elev = p ? p->second : std::numeric_limits::quiet_NaN(); // @todo is it correct to call nameElement() here with a single storey (what if this element spans multiple?) - geometry_data data{ compound_local, trsf, brep_obj->product(), storey, elev, brep_obj->name(), nameElement(storey, brep_obj) }; + geometry_data data{ compound_local, dash_arrays, trsf, brep_obj->product(), storey, elev, brep_obj->name(), nameElement(storey, brep_obj) }; if (auto_section_ || auto_elevation_ || section_ref_ || elevation_ref_) { element_buffer_.push_back(data); @@ -819,13 +960,14 @@ void SvgSerializer::write(const geometry_data& data) { } TopoDS_Iterator it(compound_to_use); + auto dash_it = data.dash_arrays.begin(); TopoDS_Face largest_closed_wire_face; double largest_closed_wire_area = 0.; path_object* po = nullptr; // Iterate over components of compound to have better chance of matching section edges to closed wires - for (; it.More(); it.Next()) { + for (; it.More(); it.Next(), ++dash_it) { const TopoDS_Shape& subshape = it.Value(); @@ -965,7 +1107,7 @@ void SvgSerializer::write(const geometry_data& data) { TopExp_Explorer exp(subshape, TopAbs_WIRE, TopAbs_FACE); for (; exp.More(); exp.Next()) { const auto& W = TopoDS::Wire(exp.Current()); - write(*po, W); + write(*po, W, *dash_it); } } @@ -1094,7 +1236,8 @@ void SvgSerializer::write(const geometry_data& data) { auto d = (p1.XYZ() - p0.XYZ()); d.Normalize(); - d *= 3; + const double shll = storey_height_line_length_.get_value_or(2.); + d *= shll; gp_Pnt p1x(p0.XYZ() + d); wire = BRepBuilderAPI_MakePolygon(p0, p1x).Wire(); @@ -1202,7 +1345,11 @@ void SvgSerializer::write(const geometry_data& data) { xcoords.push_back(path.add(center_point->X())); path.add("\" y=\""); ycoords.push_back(path.add(center_point->Y())); - path.add("\">"); + path.add("\""); + if (space_name_transform_) { + path.add(" transform=\"" + *space_name_transform_ + "\""); + } + path.add(">"); for (auto lit = labels.begin(); lit != labels.end(); ++lit) { const auto& l = *lit; double dy = labels.begin() == lit @@ -1233,16 +1380,14 @@ void SvgSerializer::write(const geometry_data& data) { } void SvgSerializer::setBoundingRectangle(double width, double height) { - this->width = width; - this->height = height; - this->rescale = true; + size_ = std::make_pair(width, height); } std::array, 3> SvgSerializer::resize() { // identity matrix; std::array, 3> m = {{ {{1,0,0}},{{0,1,0}},{{0,0,1}} }}; - if (rescale) { + if (size_) { // Scale the resulting image to a bounding rectangle specified by command line arguments const double dx = xmax - xmin; const double dy = ymax - ymin; @@ -1250,19 +1395,19 @@ std::array, 3> SvgSerializer::resize() { double sc, cx, cy; if (scale_) { sc = (*scale_) * 1000; - cx = (xmax + xmin) / 2. * sc - width * center_x_.get_value_or(0.5); - cy = (ymax + ymin) / 2. * sc - height * center_y_.get_value_or(0.5); + cx = (xmax + xmin) / 2. * sc - size_->first * center_x_.get_value_or(0.5); + cy = (ymax + ymin) / 2. * sc - size_->second * center_y_.get_value_or(0.5); } else { if (calculated_scale_) { sc = *calculated_scale_; } else { - if (dx / width > dy / height) { - sc = width / dx; + if (dx / size_->first > dy / size_->second) { + sc = size_->first / dx; } else { - sc = height / dy; + sc = size_->second / dy; } calculated_scale_ = sc; } @@ -1541,7 +1686,9 @@ void SvgSerializer::finalize() { double x0, y0, z0, x1, y1, z1; bnd_.Get(x0, y0, z0, x1, y1, z1); - BRepBuilderAPI_MakeFace mf(elev_pln, x0 - 1., x1 + 1., y0 - 1., y1 + 1.); + const double shll = storey_height_line_length_.get_value_or(2.); + + BRepBuilderAPI_MakeFace mf(elev_pln, x0 - shll, x1 + shll, y0 - shll, y1 + shll); gp_Trsf trsf; TopoDS_Compound C; BRep_Builder B; @@ -1553,7 +1700,7 @@ void SvgSerializer::finalize() { name = (std::string) *a2; } write(geometry_data{ - C,trsf,storey,storey,elev,name,nameElement(storey) + C,{boost::none},trsf,storey,storey,elev,name,nameElement(storey) }); } } @@ -1609,11 +1756,11 @@ void SvgSerializer::writeHeader() { if (use_namespace_) { svg_file << " xmlns:ifc=\"http://www.ifcopenshell.org/ns\""; } - if (scale_) { + if (scale_ && size_) { svg_file << - " width=\"" << width << "mm\"" - " height=\"" << height << "mm\"" << - " viewBox=\"0 0 " << width << " " << height << "\""; + " width=\"" << size_->first << "mm\"" + " height=\"" << size_->second << "mm\"" << + " viewBox=\"0 0 " << size_->first << " " << size_->second << "\""; } svg_file << ">\n" diff --git a/src/serializers/SvgSerializer.h b/src/serializers/SvgSerializer.h index 7b19e0434e..0772e03bdb 100644 --- a/src/serializers/SvgSerializer.h +++ b/src/serializers/SvgSerializer.h @@ -97,12 +97,15 @@ struct vertical_section { gp_Pln plane; std::string name; bool with_projection; + boost::optional scale; + boost::optional> size; }; typedef boost::variant section_data; struct geometry_data { TopoDS_Shape compound_local; + std::vector>> dash_arrays; gp_Trsf trsf; IfcUtil::IfcBaseEntity* product; IfcUtil::IfcBaseEntity* storey; @@ -130,12 +133,15 @@ public: }; protected: std::ofstream svg_file; - double xmin, ymin, xmax, ymax, width, height; + double xmin, ymin, xmax, ymax; boost::optional> section_data_; boost::optional> deferred_section_data_; - boost::optional scale_, calculated_scale_, center_x_, center_y_; + boost::optional scale_, calculated_scale_, center_x_, center_y_, scale_backup_; + boost::optional storey_height_line_length_; + boost::optional> size_, size_backup_; + boost::optional space_name_transform_; - bool with_section_heights_from_storey_, rescale, print_space_names_, print_space_areas_; + bool with_section_heights_from_storey_, print_space_names_, print_space_areas_; storey_height_display_types storey_height_display_; bool draw_door_arcs_, is_floor_plan_; bool auto_section_, auto_elevation_; @@ -173,7 +179,6 @@ public: , xmax(-std::numeric_limits::infinity()) , ymax(-std::numeric_limits::infinity()) , with_section_heights_from_storey_(false) - , rescale(false) , print_space_names_(false) , print_space_areas_(false) , draw_door_arcs_(false) @@ -198,7 +203,7 @@ public: bool ready(); void write(const IfcGeom::TriangulationElement* /*o*/) {} void write(const IfcGeom::BRepElement* o); - void write(path_object& p, const TopoDS_Wire& wire); + void write(path_object& p, const TopoDS_Wire& wire, boost::optional> dash_array=boost::none); void write(const geometry_data& data); path_object& start_path(const gp_Pln& p, IfcUtil::IfcBaseEntity* storey, const std::string& id); path_object& start_path(const gp_Pln& p, const std::string& drawing_name, const std::string& id); @@ -213,6 +218,8 @@ public: void setPrintSpaceAreas(bool b) { print_space_areas_ = b; } void setDrawStoreyHeights(storey_height_display_types sh) { storey_height_display_ = sh; } void setDrawDoorArcs(bool b) { draw_door_arcs_ = b; } + void setStoreyHeightLineLength(double d) { storey_height_line_length_ = d; } + void setSpaceNameTransform(const std::string& v) { space_name_transform_ = v; } std::array, 3> resize(); void resetScale();