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 @@
-
-
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 @@
-
-
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 @@
-
-
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 @@
-
-
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();