diff --git a/.github/workflows/ci-bonsai-daily.yml b/.github/workflows/ci-bonsai-daily.yml
index eea09da5a7..8beddfe668 100644
--- a/.github/workflows/ci-bonsai-daily.yml
+++ b/.github/workflows/ci-bonsai-daily.yml
@@ -35,7 +35,7 @@ jobs:
strategy:
fail-fast: false
matrix:
- pyver: [py311, py312]
+ pyver: [py311, py312, py313]
config:
- {
name: "Windows Build",
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index d2392ecb2e..6a2fe8ce5d 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -209,17 +209,36 @@ jobs:
- name: Build standalone examples to test cmake package
run: |
+ set -x
cd src/examples
mkdir build && cd build
cmake .. -DCMAKE_BUILD_TYPE=Release \
-DCMAKE_C_COMPILER_LAUNCHER=ccache \
-DCMAKE_CXX_COMPILER_LAUNCHER=ccache
cmake --build .
+ ./arbitrary_open_profile_def && test -f arbitrary_open_profile_def.ifc
+ ./composite_profile_def && test -f composite_profile_def.ifc
+ ./csg_primitive && test -f csg_primitive.ifc
+ ./ellipse_pies && test -f ellipse_pies.ifc
+ ./faces && test -f faces.ifc
+ ./ifc_curve_rebar && test -f ifc_curve_rebar.ifc
+ ./profiles
+ test -f IfcUShapeProfileDef.ifc
+ test -f IfcTShapeProfileDef.ifc
+ test -f IfcZShapeProfileDef.ifc
+ test -f IfcEllipseProfileDef.ifc
+ test -f IfcIShapeProfileDef.ifc
+ test -f IfcLShapeProfileDef.ifc
+ test -f IfcCShapeProfileDef.ifc
+ test -f IfcCircleProfileDef.ifc
+ test -f IfcRectangleProfileDef.ifc
+ test -f IfcTrapeziumProfileDef.ifc
./IfcParseExamples "../IfcParseExamples_test.ifc"
- ./IfcOpenHouse
- ./IfcAdvancedHouse
- ./IfcAlignment
- ./IfcSimplifiedAlignment
+ ./IfcOpenHouse && test -f IfcOpenHouse.ifc
+ ./IfcAdvancedHouse && test -f IfcAdvancedHouse.ifc
+ ./IfcAlignment && test -f IfcAlignment.ifc
+ ./IfcSimplifiedAlignment && test -f IfcSimplifiedAlignment.ifc
+ ./triangulated_faceset && test -f triangulated_faceset.ifc
- name: Test ifcopenshell-python
run: |
diff --git a/cmake/IfcOpenShellConfig.cmake.in b/cmake/IfcOpenShellConfig.cmake.in
index 95df6180f9..e5e5d350b8 100644
--- a/cmake/IfcOpenShellConfig.cmake.in
+++ b/cmake/IfcOpenShellConfig.cmake.in
@@ -13,7 +13,14 @@ include(CMakeFindDependencyMacro)
set(Boost_USE_STATIC_LIBS ON)
set(Boost_USE_STATIC_RUNTIME OFF)
set(Boost_USE_MULTITHREADED ON)
-set(Boost_COMPONENTS system program_options regex thread date_time iostreams)
+set(Boost_COMPONENTS
+ system
+ program_options
+ regex
+ thread
+ date_time
+ iostreams
+)
find_dependency(Boost CONFIG COMPONENTS ${Boost_COMPONENTS})
find_dependency(Eigen3 CONFIG)
@@ -39,7 +46,6 @@ if(IFCOPENSHELL_IFCXML)
find_dependency(LibXml2 CONFIG)
endif()
-
if(IFCOPENSHELL_WITH_CGAL)
find_dependency(CGAL CONFIG)
endif()
@@ -48,9 +54,7 @@ if(IFCOPENSHELL_WITH_OPENCASCADE)
find_dependency(OpenCASCADE CONFIG)
if(OpenCASCADE_VERSION VERSION_LESS "7.7.0")
# cmake configs < 7.7.0 were not adding include directories to targets automatically.
- set_target_properties(TKernel PROPERTIES
- INTERFACE_INCLUDE_DIRECTORIES "${OpenCASCADE_INCLUDE_DIR}"
- )
+ set_target_properties(TKernel PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${OpenCASCADE_INCLUDE_DIR}")
endif()
endif()
diff --git a/cmake/cmake_uninstall.cmake.in b/cmake/cmake_uninstall.cmake.in
index 04da07edd6..aa91cd810d 100644
--- a/cmake/cmake_uninstall.cmake.in
+++ b/cmake/cmake_uninstall.cmake.in
@@ -25,19 +25,12 @@ file(READ "@CMAKE_BINARY_DIR@/install_manifest.txt" files)
string(REGEX REPLACE "\n" ";" files "${files}")
foreach(file ${files})
- message(STATUS "Uninstalling $ENV{DESTDIR}${file}")
+ set(filepath "$ENV{DESTDIR}${file}")
+ message(STATUS "Uninstalling ${filepath}")
- if(IS_SYMLINK "$ENV{DESTDIR}${file}" OR EXISTS "$ENV{DESTDIR}${file}")
- exec_program(
- "@CMAKE_COMMAND@" ARGS "-E remove \"$ENV{DESTDIR}${file}\""
- OUTPUT_VARIABLE rm_out
- RETURN_VALUE rm_retval
- )
-
- if(NOT "${rm_retval}" STREQUAL 0)
- message(FATAL_ERROR "Problem when removing $ENV{DESTDIR}${file}")
- endif()
- else(IS_SYMLINK "$ENV{DESTDIR}${file}" OR EXISTS "$ENV{DESTDIR}${file}")
- message(STATUS "File $ENV{DESTDIR}${file} does not exist.")
+ if(IS_SYMLINK "${filepath}" OR EXISTS "${filepath}")
+ file(REMOVE "${filepath}")
+ else(NOT EXISTS "${filepath}")
+ message(STATUS "File ${filepath} does not exist.")
endif()
endforeach()
diff --git a/docs/cpp-api/CMakeLists.txt b/docs/cpp-api/CMakeLists.txt
index 0b729355e5..80593dd220 100644
--- a/docs/cpp-api/CMakeLists.txt
+++ b/docs/cpp-api/CMakeLists.txt
@@ -1,14 +1,10 @@
#Look for an executable called sphinx-build
-find_program(SPHINX_EXECUTABLE
- NAMES sphinx-build
- DOC "Path to sphinx-build executable")
+find_program(SPHINX_EXECUTABLE NAMES sphinx-build DOC "Path to sphinx-build executable")
include(FindPackageHandleStandardArgs)
#Handle standard arguments to find_package like REQUIRED and QUIET
-find_package_handle_standard_args(Sphinx
- "Failed to find sphinx-build executable"
- SPHINX_EXECUTABLE)
+find_package_handle_standard_args(Sphinx "Failed to find sphinx-build executable" SPHINX_EXECUTABLE)
find_package(Doxygen REQUIRED)
#find_package(Sphinx REQUIRED)
@@ -16,25 +12,24 @@ find_package(Doxygen REQUIRED)
set(SPHINX_SOURCE ${CMAKE_CURRENT_SOURCE_DIR})
set(SPHINX_BUILD ${CMAKE_CURRENT_BINARY_DIR}/docs/sphinx)
-MESSAGE(STATUS "SPHINX BUILD ${CMAKE_CURRENT_BINARY_DIR}")
+message(STATUS "SPHINX BUILD ${CMAKE_CURRENT_BINARY_DIR}")
file(MAKE_DIRECTORY ./output/doxygen)
-if (DOXYGEN_FOUND)
+if(DOXYGEN_FOUND)
+ add_custom_target(
+ Sphinx
+ ALL
+ COMMAND ${SPHINX_EXECUTABLE} -v -T -b html ${SPHINX_SOURCE} ${CMAKE_CURRENT_SOURCE_DIR}/output
+ WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/output
+ COMMENT "Generating documentation with Sphinx"
+ )
-add_custom_target(Sphinx ALL
- COMMAND
- ${SPHINX_EXECUTABLE} -v -T -b html
- ${SPHINX_SOURCE} ${CMAKE_CURRENT_SOURCE_DIR}/output
- WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/output
- COMMENT "Generating documentation with Sphinx")
-
-# add_custom_target(ifcopenshell_python_docs ALL
- # COMMAND make html
- # WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/../src/ifcblenderexport/docs
- # OUTPUT ${CMAKE_CURRENT_SOURCE_DIR}/../src/ifcblenderexport/docs
- # COMMENT "Generating documentation with Sphinx")
-
-else (DOXYGEN_FOUND)
- message("Doxygen need to be installed to generate the doxygen documentation")
-endif (DOXYGEN_FOUND)
+ # add_custom_target(ifcopenshell_python_docs ALL
+ # COMMAND make html
+ # WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/../src/ifcblenderexport/docs
+ # OUTPUT ${CMAKE_CURRENT_SOURCE_DIR}/../src/ifcblenderexport/docs
+ # COMMENT "Generating documentation with Sphinx")
+else(DOXYGEN_FOUND)
+ message("Doxygen need to be installed to generate the doxygen documentation")
+endif(DOXYGEN_FOUND)
diff --git a/nix/build-all.py b/nix/build-all.py
index b60ab1adbd..2a4318dc35 100644
--- a/nix/build-all.py
+++ b/nix/build-all.py
@@ -1178,7 +1178,7 @@ if "cgal" in targets:
gmp_args.extend(("--disable-assembly", "--enable-cxx"))
mpfr_args.extend(("--host", "none"))
elif "x86" in arch:
- gmp_args.append("--enable-fat") # See issues #7458 #7556
+ gmp_args.append("--enable-fat") # See issues #7458 #7556
OLD_CC = None
if MAC_CROSS_COMPILE_INTEL:
diff --git a/pyproject.toml b/pyproject.toml
index b932db42a1..13f3b15ba6 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -82,4 +82,4 @@ black = "black ."
format.sequence = ["black", "ruff-main", "ruff-old"]
-cmake-format = "gersemi cmake src --in-place"
+cmake-format = "gersemi . --in-place"
diff --git a/src/bcf/bcf/agnostic/topic.py b/src/bcf/bcf/agnostic/topic.py
index 1e77f40e97..a25f4af482 100644
--- a/src/bcf/bcf/agnostic/topic.py
+++ b/src/bcf/bcf/agnostic/topic.py
@@ -2,6 +2,8 @@ import tempfile
from pathlib import Path
from typing import Optional, Union
+from typing_extensions import assert_never
+
import bcf.agnostic.model as mdl
import bcf.v2.bcfxml
import bcf.v2.model
@@ -9,7 +11,6 @@ import bcf.v2.topic
import bcf.v3.bcfxml
import bcf.v3.model
import bcf.v3.topic
-from typing_extensions import assert_never
TopicHandler = Union[bcf.v2.topic.TopicHandler, bcf.v3.topic.TopicHandler]
diff --git a/src/bcf/bcf/v2/model/extensions.py b/src/bcf/bcf/v2/model/extensions.py
index e50277570e..695027bc6c 100644
--- a/src/bcf/bcf/v2/model/extensions.py
+++ b/src/bcf/bcf/v2/model/extensions.py
@@ -14,7 +14,7 @@
# Currently extensions support for v2 is only read-only.
-from dataclasses import dataclass, field, fields
+from dataclasses import dataclass, field
from typing import Optional
diff --git a/src/bcf/bcf/v2/topic.py b/src/bcf/bcf/v2/topic.py
index 30506d734d..2f69a0c18a 100644
--- a/src/bcf/bcf/v2/topic.py
+++ b/src/bcf/bcf/v2/topic.py
@@ -3,11 +3,10 @@
from __future__ import annotations
import datetime
-import tempfile
import uuid
import zipfile
from pathlib import Path
-from typing import Any, NoReturn, Optional, Union
+from typing import Any, NoReturn, Optional
import numpy as np
from ifcopenshell import entity_instance
diff --git a/src/bcf/bcf/v2/visinfo.py b/src/bcf/bcf/v2/visinfo.py
index 1d081ae782..7081bf2052 100644
--- a/src/bcf/bcf/v2/visinfo.py
+++ b/src/bcf/bcf/v2/visinfo.py
@@ -1,7 +1,7 @@
import uuid
import zipfile
from collections.abc import Iterable
-from typing import Any, Literal, Optional, Union
+from typing import Literal, Optional, Union
import ifcopenshell.util.placement
import ifcopenshell.util.unit
diff --git a/src/bcf/bcf/v3/bcfapi.py b/src/bcf/bcf/v3/bcfapi.py
index 5c66cee067..127d9e3732 100644
--- a/src/bcf/bcf/v3/bcfapi.py
+++ b/src/bcf/bcf/v3/bcfapi.py
@@ -24,7 +24,6 @@ import time
import urllib.parse
import uuid
import webbrowser
-from re import A
from typing import Any, Optional
import requests
diff --git a/src/bcf/bcf/v3/document.py b/src/bcf/bcf/v3/document.py
index afc6be50b9..d906b96d26 100644
--- a/src/bcf/bcf/v3/document.py
+++ b/src/bcf/bcf/v3/document.py
@@ -1,7 +1,7 @@
"""BCF XML V3 Documents handler."""
import zipfile
-from typing import Any, Optional
+from typing import Optional
import bcf.v3.model as mdl
from bcf.inmemory_zipfile import ZipFileInterface
diff --git a/src/bcf/bcf/v3/visinfo.py b/src/bcf/bcf/v3/visinfo.py
index 050641ed23..b3b99d7890 100644
--- a/src/bcf/bcf/v3/visinfo.py
+++ b/src/bcf/bcf/v3/visinfo.py
@@ -1,7 +1,7 @@
import uuid
import zipfile
from collections.abc import Iterable
-from typing import Any, Literal, Optional, Union
+from typing import Literal, Optional, Union
import ifcopenshell.util.placement
import ifcopenshell.util.unit
diff --git a/src/bcf/pyproject.toml b/src/bcf/pyproject.toml
index 7047595ce1..b4e990f39c 100644
--- a/src/bcf/pyproject.toml
+++ b/src/bcf/pyproject.toml
@@ -140,3 +140,9 @@ max-attributes = 10
[tool.pylint.format]
expected-line-ending-format = "LF"
max-line-length = 120
+
+[tool.ruff]
+extend = "../../pyproject.toml"
+lint.select = [
+ "F401", # unused imports
+]
diff --git a/src/bcf/tests/conftest.py b/src/bcf/tests/conftest.py
index f19792122a..ea1b2aee8b 100644
--- a/src/bcf/tests/conftest.py
+++ b/src/bcf/tests/conftest.py
@@ -1,4 +1,5 @@
import pytest
+
from bcf.xml_parser import XmlParserSerializer
diff --git a/src/bcf/tests/v2/test_bcf_xml.py b/src/bcf/tests/v2/test_bcf_xml.py
index 1b5128e96f..fed1428e73 100644
--- a/src/bcf/tests/v2/test_bcf_xml.py
+++ b/src/bcf/tests/v2/test_bcf_xml.py
@@ -4,8 +4,9 @@ import uuid
from pathlib import Path
from tempfile import TemporaryDirectory
-import bcf.v2.model as mdl
import pytest
+
+import bcf.v2.model as mdl
from bcf.v2.bcfxml import BcfXml
from bcf.v2.topic import TopicHandler
from bcf.v2.visinfo import (
diff --git a/src/bcf/tests/v2/test_example_files.py b/src/bcf/tests/v2/test_example_files.py
index 6d964bd0e9..3821569c28 100644
--- a/src/bcf/tests/v2/test_example_files.py
+++ b/src/bcf/tests/v2/test_example_files.py
@@ -3,10 +3,11 @@ import os
import zipfile
from pathlib import Path
+from xsdata.models.datatype import XmlDateTime
+
import bcf.v2.model as mdl
from bcf.v2.bcfxml import BcfXml
from bcf.v2.topic import TopicHandler
-from xsdata.models.datatype import XmlDateTime
def test_maximum_information() -> None:
diff --git a/src/bcf/tests/v2/test_ifcclash_api.py b/src/bcf/tests/v2/test_ifcclash_api.py
index 34c3a493e4..14945e8392 100644
--- a/src/bcf/tests/v2/test_ifcclash_api.py
+++ b/src/bcf/tests/v2/test_ifcclash_api.py
@@ -1,5 +1,6 @@
import numpy as np
import pytest
+
from bcf.v2.bcfxml import BcfXml
diff --git a/src/bcf/tests/v3/test_bcf_xml.py b/src/bcf/tests/v3/test_bcf_xml.py
index ae658ca55f..50664b98c7 100644
--- a/src/bcf/tests/v3/test_bcf_xml.py
+++ b/src/bcf/tests/v3/test_bcf_xml.py
@@ -4,8 +4,9 @@ import uuid
from pathlib import Path
from tempfile import TemporaryDirectory
-import bcf.v3.model as mdl
import pytest
+
+import bcf.v3.model as mdl
from bcf.v3.bcfxml import BcfXml
from bcf.v3.topic import TopicHandler
from bcf.v3.visinfo import (
diff --git a/src/bcf/tests/v3/test_example_files.py b/src/bcf/tests/v3/test_example_files.py
index 6774c49982..3f141afda6 100644
--- a/src/bcf/tests/v3/test_example_files.py
+++ b/src/bcf/tests/v3/test_example_files.py
@@ -1,12 +1,11 @@
-import json
import os
import zipfile
from pathlib import Path
+from xsdata.models.datatype import XmlDateTime
+
import bcf.v3.model as mdl
from bcf.v3.bcfxml import BcfXml
-from bcf.v3.topic import TopicHandler
-from xsdata.models.datatype import XmlDateTime
def test_doc_ref_internal() -> None:
diff --git a/src/bcf/tests/v3/test_ifcclash_api.py b/src/bcf/tests/v3/test_ifcclash_api.py
index faea9b6a1a..d470f1ffb8 100644
--- a/src/bcf/tests/v3/test_ifcclash_api.py
+++ b/src/bcf/tests/v3/test_ifcclash_api.py
@@ -1,5 +1,6 @@
import numpy as np
import pytest
+
from bcf.v3.bcfxml import BcfXml
diff --git a/src/bonsai/bonsai/__init__.py b/src/bonsai/bonsai/__init__.py
index ab5d46607b..b4083b0eef 100644
--- a/src/bonsai/bonsai/__init__.py
+++ b/src/bonsai/bonsai/__init__.py
@@ -32,17 +32,16 @@ if IN_BLENDER:
# and then as a bonsai-package.
IN_PACKAGE = __package__ == "bonsai"
-import re
import platform
-import traceback
-import webbrowser
-import uuid
+import re
import shutil
+import traceback
+import uuid
+import webbrowser
from collections import deque
-from pathlib import Path
-from typing import Union, Any
from collections.abc import Generator
-
+from pathlib import Path
+from typing import Any, Union
last_commit_hash = "8888888"
last_commit_date = "9999999"
diff --git a/src/bonsai/bonsai/bim/__init__.py b/src/bonsai/bonsai/bim/__init__.py
index a7dc729881..4302739aab 100644
--- a/src/bonsai/bonsai/bim/__init__.py
+++ b/src/bonsai/bonsai/bim/__init__.py
@@ -16,14 +16,16 @@
# You should have received a copy of the GNU General Public License
# along with Bonsai. If not, see .
+import importlib
import os
+from collections.abc import Callable
+from typing import Union
+
import bpy
import bpy.utils.previews
-import importlib
-from bpy_extras.io_utils import ImportHelper, ExportHelper
-from . import handler, ui, prop, operator
-from typing import Union
-from collections.abc import Callable
+from bpy_extras.io_utils import ExportHelper, ImportHelper
+
+from . import handler, operator, prop, ui
try:
from bonsai.translations import translations_dict
diff --git a/src/bonsai/bonsai/bim/data/webui/sioserver.py b/src/bonsai/bonsai/bim/data/webui/sioserver.py
index 4701268232..91c3c4e8eb 100644
--- a/src/bonsai/bonsai/bim/data/webui/sioserver.py
+++ b/src/bonsai/bonsai/bim/data/webui/sioserver.py
@@ -1,6 +1,5 @@
-import sys
import os
-
+import sys
bonsai_lib_path = os.environ.get("BONSAI_LIB_PATH")
bonsai_version = os.environ.get("BONSAI_VERSION")
@@ -9,13 +8,14 @@ if bonsai_lib_path:
sys.path.insert(0, bonsai_lib_path)
import argparse
-from aiohttp import web
-import socketio
-import pystache
-import json
import base64
+import json
import xml.etree.ElementTree as ET
+import pystache
+import socketio
+from aiohttp import web
+
sio_port = 8080 # default port
sio = socketio.AsyncServer(cors_allowed_origins="*", async_mode="aiohttp", max_http_buffer_size=10000000)
diff --git a/src/bonsai/bonsai/bim/export_ifc.py b/src/bonsai/bonsai/bim/export_ifc.py
index 6134786124..7295c72e34 100644
--- a/src/bonsai/bonsai/bim/export_ifc.py
+++ b/src/bonsai/bonsai/bim/export_ifc.py
@@ -17,27 +17,30 @@
# along with Bonsai. If not, see .
from __future__ import annotations
-import os
-import bpy
-import json
+
import datetime
-import zipfile
+import json
+import os
import tempfile
+import zipfile
+from logging import Logger
+from math import radians
+from typing import Union
+
+import bpy
import ifcopenshell
import ifcopenshell.api
import ifcopenshell.util.element
import ifcopenshell.util.placement
import ifcopenshell.util.unit
-import bonsai.tool as tool
-import bonsai.core.geometry
+from mathutils import Vector
+
import bonsai.core.aggregate
+import bonsai.core.geometry
import bonsai.core.spatial
import bonsai.core.style
+import bonsai.tool as tool
from bonsai.bim.ifc import IfcStore
-from mathutils import Vector
-from typing import Union
-from logging import Logger
-from math import radians
class IfcExporter:
diff --git a/src/bonsai/bonsai/bim/handler.py b/src/bonsai/bonsai/bim/handler.py
index c7cb10cdde..231b44c671 100644
--- a/src/bonsai/bonsai/bim/handler.py
+++ b/src/bonsai/bonsai/bim/handler.py
@@ -17,26 +17,31 @@
# along with Bonsai. If not, see .
import os
+import weakref
+from collections.abc import Callable
+from math import cos
+from typing import Union
+
import bpy
+import ifcopenshell.api.owner.settings
import ifcopenshell.util.element
import ifcopenshell.util.representation
import ifcopenshell.util.unit
-import ifcopenshell.api.owner.settings
+from bpy.app.handlers import persistent
+from mathutils import Vector
+
import bonsai.bim
import bonsai.tool as tool
-import weakref
-from bpy.app.handlers import persistent
from bonsai.bim.ifc import IfcStore
-from bonsai.bim.module.model.data import AuthoringData
from bonsai.bim.module.aggregate.decorator import AggregateDecorator
from bonsai.bim.module.georeference.decorator import GeoreferenceDecorator
-from bonsai.bim.module.model.decorator import WallAxisDecorator, SlabDirectionDecorator, BoundingBoxDecorator
+from bonsai.bim.module.model.data import AuthoringData
+from bonsai.bim.module.model.decorator import (
+ BoundingBoxDecorator,
+ SlabDirectionDecorator,
+ WallAxisDecorator,
+)
from bonsai.bim.module.nest.decorator import NestDecorator
-from mathutils import Vector
-from math import cos
-from typing import Union
-from collections.abc import Callable
-
cwd = os.path.dirname(os.path.realpath(__file__))
global_subscription_owner = object()
@@ -202,8 +207,8 @@ def refresh_ui_data():
Note that calling non-ifc-operators by itself doesn't refresh the UI data
and it need to be refreshed manually if needed.
"""
- from bonsai.bim import modules
import bonsai.bim.ui
+ from bonsai.bim import modules
bonsai.bim.ui.refresh()
diff --git a/src/bonsai/bonsai/bim/helper.py b/src/bonsai/bonsai/bim/helper.py
index e81c483216..9267134988 100644
--- a/src/bonsai/bonsai/bim/helper.py
+++ b/src/bonsai/bonsai/bim/helper.py
@@ -17,24 +17,31 @@
# along with Bonsai. If not, see .
from __future__ import annotations
+
import importlib
-import bpy
import json
+from collections.abc import Callable, Iterable, Sequence
+from types import EllipsisType
+from typing import TYPE_CHECKING, Any, Optional, Union
+
+import bpy
import ifcopenshell
import ifcopenshell.ifcopenshell_wrapper as W
import ifcopenshell.util.attribute
import ifcopenshell.util.element
import ifcopenshell.util.unit
-from ifcopenshell.util.doc import get_attribute_doc, get_predefined_type_doc, get_property_doc
+from ifcopenshell.util.doc import (
+ get_attribute_doc,
+ get_predefined_type_doc,
+ get_property_doc,
+)
+
import bonsai.tool as tool
-from types import EllipsisType
-from typing import Optional, Any, Union, TYPE_CHECKING
-from collections.abc import Callable, Iterable, Sequence
if TYPE_CHECKING:
import bonsai.bim.prop
- from bonsai.bim.prop import Attribute
from bonsai.bim.module.search.prop import BIMFilterGroup
+ from bonsai.bim.prop import Attribute
# ImportCallback return values:
# - None - property should be imported by default workflow
diff --git a/src/bonsai/bonsai/bim/ifc.py b/src/bonsai/bonsai/bim/ifc.py
index 881de8adf9..f7d23e1dbe 100644
--- a/src/bonsai/bonsai/bim/ifc.py
+++ b/src/bonsai/bonsai/bim/ifc.py
@@ -17,26 +17,28 @@
# along with Bonsai. If not, see .
from __future__ import annotations
-import os
-import bpy
-import uuid
-import shutil
+
import hashlib
-import zipfile
+import os
+import shutil
import tempfile
import traceback
+import uuid
+import zipfile
+from collections.abc import Callable
+from pathlib import Path
+from typing import Literal, NotRequired, Optional, TypedDict, Union
+
+import bpy
import ifcopenshell
import ifcopenshell.geom
import ifcopenshell.ifcopenshell_wrapper
+from ifcopenshell.file import UndoSystemError
+
import bonsai
import bonsai.bim.handler
import bonsai.tool as tool
-from ifcopenshell.file import UndoSystemError
-from pathlib import Path
from bonsai.tool.brick import BrickStore
-from typing import Union, Optional, TypedDict, NotRequired, Literal
-from collections.abc import Callable
-
IFC_CONNECTED_TYPE = Union[bpy.types.Material, bpy.types.Object]
diff --git a/src/bonsai/bonsai/bim/import_ifc.py b/src/bonsai/bonsai/bim/import_ifc.py
index d8ecfd6894..6e04800dd4 100644
--- a/src/bonsai/bonsai/bim/import_ifc.py
+++ b/src/bonsai/bonsai/bim/import_ifc.py
@@ -17,33 +17,36 @@
# along with Bonsai. If not, see .
from __future__ import annotations
-import bpy
-import time
+
import json
-import ifcpatch
import logging
-import traceback
-import mathutils
-import numpy as np
-import numpy.typing as npt
import multiprocessing
+import time
+import traceback
+from collections.abc import Iterable
+from typing import Any, Literal, Optional, Union
+
+import bpy
import ifcopenshell
import ifcopenshell.api.pset
import ifcopenshell.geom
import ifcopenshell.ifcopenshell_wrapper as W
-import ifcopenshell.util.unit
import ifcopenshell.util.element
import ifcopenshell.util.geolocation
import ifcopenshell.util.placement
import ifcopenshell.util.representation
import ifcopenshell.util.shape
-import bonsai.tool as tool
-from bonsai.bim.ifc import IfcStore, IFC_CONNECTED_TYPE
-from bonsai.tool.loader import OBJECT_DATA_TYPE
-from typing import Union, Optional, Any, Literal
-from collections.abc import Iterable
+import ifcopenshell.util.unit
+import ifcpatch
+import mathutils
+import numpy as np
+import numpy.typing as npt
from ifcopenshell.util.shape import MatrixType
+import bonsai.tool as tool
+from bonsai.bim.ifc import IFC_CONNECTED_TYPE, IfcStore
+from bonsai.tool.loader import OBJECT_DATA_TYPE
+
class MaterialCreator:
mesh: bpy.types.Mesh
diff --git a/src/bonsai/bonsai/bim/module/aggregate/__init__.py b/src/bonsai/bonsai/bim/module/aggregate/__init__.py
index daafdf201c..9f081ecaec 100644
--- a/src/bonsai/bonsai/bim/module/aggregate/__init__.py
+++ b/src/bonsai/bonsai/bim/module/aggregate/__init__.py
@@ -17,7 +17,8 @@
# along with Bonsai. If not, see .
import bpy
-from . import ui, prop, operator
+
+from . import operator, prop, ui
classes = (
operator.BIM_OT_add_aggregate,
diff --git a/src/bonsai/bonsai/bim/module/aggregate/data.py b/src/bonsai/bonsai/bim/module/aggregate/data.py
index ad58f6defb..22c7505bf3 100644
--- a/src/bonsai/bonsai/bim/module/aggregate/data.py
+++ b/src/bonsai/bonsai/bim/module/aggregate/data.py
@@ -16,11 +16,13 @@
# You should have received a copy of the GNU General Public License
# along with Bonsai. If not, see .
-import bpy
-import bonsai.tool as tool
-import ifcopenshell.util.element
from typing import Union
+import bpy
+import ifcopenshell.util.element
+
+import bonsai.tool as tool
+
def refresh():
AggregateData.is_loaded = False
diff --git a/src/bonsai/bonsai/bim/module/aggregate/decorator.py b/src/bonsai/bonsai/bim/module/aggregate/decorator.py
index 877e7f41e0..080f965bf8 100644
--- a/src/bonsai/bonsai/bim/module/aggregate/decorator.py
+++ b/src/bonsai/bonsai/bim/module/aggregate/decorator.py
@@ -21,11 +21,12 @@ import bpy
import gpu
import ifcopenshell
import ifcopenshell.util.element
-import bonsai.tool as tool
from bpy.types import SpaceView3D
from bpy_extras import view3d_utils
from gpu_extras.batch import batch_for_shader
from mathutils import Vector
+
+import bonsai.tool as tool
from bonsai.bim.module.geometry.decorator import ItemDecorator
diff --git a/src/bonsai/bonsai/bim/module/aggregate/operator.py b/src/bonsai/bonsai/bim/module/aggregate/operator.py
index 32d06dd94e..be6272c3ab 100644
--- a/src/bonsai/bonsai/bim/module/aggregate/operator.py
+++ b/src/bonsai/bonsai/bim/module/aggregate/operator.py
@@ -16,6 +16,8 @@
# You should have received a copy of the GNU General Public License
# along with Bonsai. If not, see .
+from typing import TYPE_CHECKING
+
import bpy
import ifcopenshell
import ifcopenshell.api
@@ -23,10 +25,10 @@ import ifcopenshell.api.group
import ifcopenshell.api.pset
import ifcopenshell.api.root
import ifcopenshell.util.element
-import bonsai.tool as tool
+
import bonsai.core.aggregate as core
import bonsai.core.spatial
-from typing import TYPE_CHECKING
+import bonsai.tool as tool
class BIM_OT_aggregate_assign_object(bpy.types.Operator, tool.Ifc.Operator):
diff --git a/src/bonsai/bonsai/bim/module/aggregate/prop.py b/src/bonsai/bonsai/bim/module/aggregate/prop.py
index 03a3d0f533..241663882f 100644
--- a/src/bonsai/bonsai/bim/module/aggregate/prop.py
+++ b/src/bonsai/bonsai/bim/module/aggregate/prop.py
@@ -16,24 +16,29 @@
# You should have received a copy of the GNU General Public License
# along with Bonsai. If not, see .
+from typing import TYPE_CHECKING, Union
+
import bpy
import ifcopenshell.util.element
-import bonsai.tool as tool
-from bonsai.bim.prop import StrProperty, Attribute
-from bonsai.bim.module.spatial.data import SpatialData
-from bpy.types import PropertyGroup
from bpy.props import (
- PointerProperty,
- StringProperty,
- EnumProperty,
BoolProperty,
- IntProperty,
+ CollectionProperty,
+ EnumProperty,
FloatProperty,
FloatVectorProperty,
- CollectionProperty,
+ IntProperty,
+ PointerProperty,
+ StringProperty,
)
-from bonsai.bim.module.aggregate.decorator import AggregateDecorator, AggregateModeDecorator
-from typing import TYPE_CHECKING, Union
+from bpy.types import PropertyGroup
+
+import bonsai.tool as tool
+from bonsai.bim.module.aggregate.decorator import (
+ AggregateDecorator,
+ AggregateModeDecorator,
+)
+from bonsai.bim.module.spatial.data import SpatialData
+from bonsai.bim.prop import Attribute, StrProperty
def can_aggregate(relating_obj: bpy.types.Object, related_obj: bpy.types.Object) -> bool:
diff --git a/src/bonsai/bonsai/bim/module/aggregate/ui.py b/src/bonsai/bonsai/bim/module/aggregate/ui.py
index e9c596f9ac..d693843401 100644
--- a/src/bonsai/bonsai/bim/module/aggregate/ui.py
+++ b/src/bonsai/bonsai/bim/module/aggregate/ui.py
@@ -17,10 +17,11 @@
# along with Bonsai. If not, see .
from bpy.types import Panel
+
+import bonsai.tool as tool
+from bonsai.bim.ifc import IfcStore
from bonsai.bim.module.aggregate.data import AggregateData
from bonsai.bim.module.group.data import GroupsData, ObjectGroupsData
-from bonsai.bim.ifc import IfcStore
-import bonsai.tool as tool
class BIM_PT_aggregate(Panel):
diff --git a/src/bonsai/bonsai/bim/module/alignment/operator.py b/src/bonsai/bonsai/bim/module/alignment/operator.py
index 58c139b639..0705dcb1b9 100644
--- a/src/bonsai/bonsai/bim/module/alignment/operator.py
+++ b/src/bonsai/bonsai/bim/module/alignment/operator.py
@@ -18,25 +18,25 @@
# pyright: reportUnnecessaryTypeIgnoreComment=error
+import calendar
+import json
import os
-
-import ifcopenshell.api.alignment
+import time
+from datetime import datetime
import bpy
-import json
-import time
-import calendar
-import isodate
-import bonsai.core.sequence as core
-import bonsai.tool as tool
-import bonsai.bim.module.sequence.helper as helper
+import ifcopenshell.api.alignment
import ifcopenshell.api.spatial
import ifcopenshell.geom
-import ifcopenshell.util.sequence
import ifcopenshell.util.selector
-from datetime import datetime
-from dateutil import parser, relativedelta
+import ifcopenshell.util.sequence
+import isodate
from bpy_extras.io_utils import ImportHelper
+from dateutil import parser, relativedelta
+
+import bonsai.bim.module.sequence.helper as helper
+import bonsai.core.sequence as core
+import bonsai.tool as tool
class ImportAlignmentCSV(bpy.types.Operator, tool.Ifc.Operator, ImportHelper):
diff --git a/src/bonsai/bonsai/bim/module/attribute/__init__.py b/src/bonsai/bonsai/bim/module/attribute/__init__.py
index 7348a2cffb..1e1402d6f5 100644
--- a/src/bonsai/bonsai/bim/module/attribute/__init__.py
+++ b/src/bonsai/bonsai/bim/module/attribute/__init__.py
@@ -17,7 +17,8 @@
# along with Bonsai. If not, see .
import bpy
-from . import ui, prop, operator
+
+from . import operator, prop, ui
classes = (
operator.EnableEditingAttributes,
diff --git a/src/bonsai/bonsai/bim/module/attribute/data.py b/src/bonsai/bonsai/bim/module/attribute/data.py
index 8c5000a128..32f6f895ce 100644
--- a/src/bonsai/bonsai/bim/module/attribute/data.py
+++ b/src/bonsai/bonsai/bim/module/attribute/data.py
@@ -18,6 +18,7 @@
import bpy
import ifcopenshell
+
import bonsai.tool as tool
diff --git a/src/bonsai/bonsai/bim/module/attribute/operator.py b/src/bonsai/bonsai/bim/module/attribute/operator.py
index fb39efe91e..13901c0f81 100644
--- a/src/bonsai/bonsai/bim/module/attribute/operator.py
+++ b/src/bonsai/bonsai/bim/module/attribute/operator.py
@@ -16,22 +16,25 @@
# You should have received a copy of the GNU General Public License
# along with Bonsai. If not, see .
-import bpy
import json
+from typing import TYPE_CHECKING, Any, Literal, Union
+
+import bpy
import ifcopenshell
import ifcopenshell.api.attribute
import ifcopenshell.guid
import ifcopenshell.util.element
+
import bonsai.bim.helper
-import bonsai.tool as tool
import bonsai.core.attribute as core
import bonsai.core.spatial
-from typing import TYPE_CHECKING, Any, Union, Literal
+import bonsai.tool as tool
if TYPE_CHECKING:
- from bonsai.bim.prop import Attribute
import bpy.stub_internal.rna_enums as rna_enums
+ from bonsai.bim.prop import Attribute
+
def get_objs_for_operation(
operator_properties: "AttributesOperator", context: bpy.types.Context
diff --git a/src/bonsai/bonsai/bim/module/attribute/prop.py b/src/bonsai/bonsai/bim/module/attribute/prop.py
index 97246cf7ce..98ffb00c5c 100644
--- a/src/bonsai/bonsai/bim/module/attribute/prop.py
+++ b/src/bonsai/bonsai/bim/module/attribute/prop.py
@@ -16,21 +16,23 @@
# You should have received a copy of the GNU General Public License
# along with Bonsai. If not, see .
+from typing import TYPE_CHECKING, Union
+
import bpy
-import bonsai.tool as tool
-from bonsai.bim.prop import StrProperty, Attribute
-from bpy.types import PropertyGroup
from bpy.props import (
- PointerProperty,
- StringProperty,
- EnumProperty,
BoolProperty,
- IntProperty,
+ CollectionProperty,
+ EnumProperty,
FloatProperty,
FloatVectorProperty,
- CollectionProperty,
+ IntProperty,
+ PointerProperty,
+ StringProperty,
)
-from typing import TYPE_CHECKING, Union
+from bpy.types import PropertyGroup
+
+import bonsai.tool as tool
+from bonsai.bim.prop import Attribute, StrProperty
class BIMAttributeProperties(PropertyGroup):
diff --git a/src/bonsai/bonsai/bim/module/attribute/ui.py b/src/bonsai/bonsai/bim/module/attribute/ui.py
index 0665c84dd5..84813e8d1e 100644
--- a/src/bonsai/bonsai/bim/module/attribute/ui.py
+++ b/src/bonsai/bonsai/bim/module/attribute/ui.py
@@ -17,12 +17,15 @@
# along with Bonsai. If not, see .
from __future__ import annotations
-import bonsai.bim.helper
+
+from typing import TYPE_CHECKING
+
import bpy.types
from bpy.types import Panel
-from bonsai.bim.module.attribute.data import AttributesData
+
+import bonsai.bim.helper
import bonsai.tool as tool
-from typing import TYPE_CHECKING
+from bonsai.bim.module.attribute.data import AttributesData
if TYPE_CHECKING:
from bonsai.bim.module.attribute.prop import BIMExplorerProperties, ExplorerEntity
diff --git a/src/bonsai/bonsai/bim/module/augin/__init__.py b/src/bonsai/bonsai/bim/module/augin/__init__.py
index 8b8009c4e6..bff5e9449d 100644
--- a/src/bonsai/bonsai/bim/module/augin/__init__.py
+++ b/src/bonsai/bonsai/bim/module/augin/__init__.py
@@ -17,7 +17,8 @@
# along with Bonsai. If not, see .
import bpy
-from . import ui, prop, operator
+
+from . import operator, prop, ui
classes = (
prop.AuginProperties,
diff --git a/src/bonsai/bonsai/bim/module/augin/operator.py b/src/bonsai/bonsai/bim/module/augin/operator.py
index b578beb554..10d802569a 100644
--- a/src/bonsai/bonsai/bim/module/augin/operator.py
+++ b/src/bonsai/bonsai/bim/module/augin/operator.py
@@ -16,14 +16,16 @@
# You should have received a copy of the GNU General Public License
# along with Bonsai. If not, see .
+import datetime
import os
-import bpy
-import string
import random
import shutil
-import requests
+import string
import tempfile
-import datetime
+
+import bpy
+import requests
+
import bonsai.tool as tool
diff --git a/src/bonsai/bonsai/bim/module/augin/ui.py b/src/bonsai/bonsai/bim/module/augin/ui.py
index 65ca3ac7f9..dfd6e49730 100644
--- a/src/bonsai/bonsai/bim/module/augin/ui.py
+++ b/src/bonsai/bonsai/bim/module/augin/ui.py
@@ -17,6 +17,7 @@
# along with Bonsai. If not, see .
import bpy.types
+
import bonsai.tool as tool
diff --git a/src/bonsai/bonsai/bim/module/bcf/__init__.py b/src/bonsai/bonsai/bim/module/bcf/__init__.py
index e7153974f4..000f343727 100644
--- a/src/bonsai/bonsai/bim/module/bcf/__init__.py
+++ b/src/bonsai/bonsai/bim/module/bcf/__init__.py
@@ -17,7 +17,8 @@
# along with Bonsai. If not, see .
import bpy
-from . import ui, prop, operator
+
+from . import operator, prop, ui
classes = (
operator.ActivateBcfViewpoint,
diff --git a/src/bonsai/bonsai/bim/module/bcf/bcfstore.py b/src/bonsai/bonsai/bim/module/bcf/bcfstore.py
index 13be3faf1d..a1fec8aa6e 100644
--- a/src/bonsai/bonsai/bim/module/bcf/bcfstore.py
+++ b/src/bonsai/bonsai/bim/module/bcf/bcfstore.py
@@ -17,12 +17,14 @@
# along with Bonsai. If not, see .
import os
-import bpy
+from typing import Union
+
import bcf
import bcf.bcfxml
import bcf.v2.bcfxml
+import bpy
+
import bonsai.tool as tool
-from typing import Union
class BcfStore:
diff --git a/src/bonsai/bonsai/bim/module/bcf/operator.py b/src/bonsai/bonsai/bim/module/bcf/operator.py
index 1c6137e93b..b0a6f1f699 100644
--- a/src/bonsai/bonsai/bim/module/bcf/operator.py
+++ b/src/bonsai/bonsai/bim/module/bcf/operator.py
@@ -17,6 +17,20 @@
# along with Bonsai. If not, see .
import os
+import tempfile
+import uuid
+import webbrowser
+from math import atan, cos, degrees, radians, sin, tan
+from pathlib import Path
+
+import bcf
+import bcf.agnostic.topic
+import bcf.agnostic.visinfo
+import bcf.bcfxml
+import bcf.v2.bcfxml
+import bcf.v2.model
+import bcf.v2.topic
+import bcf.v2.visinfo
import bcf.v3
import bcf.v3.bcfxml
import bcf.v3.document
@@ -24,30 +38,18 @@ import bcf.v3.model
import bcf.v3.topic
import bcf.v3.visinfo
import bpy
-import bcf
-import bcf.bcfxml
-import bcf.v2.bcfxml
-import bcf.v2.model
-import bcf.v2.topic
-import bcf.v2.visinfo
-import bcf.agnostic.topic
-import bcf.agnostic.visinfo
-import uuid
-import numpy as np
-import tempfile
-import webbrowser
import ifcopenshell
import ifcopenshell.util.geolocation
import ifcopenshell.util.unit
-import bonsai.tool as tool
-import bonsai.bim.module.bcf.prop as bcf_prop
-import bonsai.bim.module.bcf.bcfstore as bcfstore
-from bpy_extras.io_utils import ImportHelper, ExportHelper
-from pathlib import Path
-from math import radians, degrees, atan, tan, cos, sin
-from mathutils import Vector, Matrix, Euler, geometry
+import numpy as np
+from bpy_extras.io_utils import ExportHelper, ImportHelper
+from mathutils import Euler, Matrix, Vector, geometry
from xsdata.models.datatype import XmlDateTime
+import bonsai.bim.module.bcf.bcfstore as bcfstore
+import bonsai.bim.module.bcf.prop as bcf_prop
+import bonsai.tool as tool
+
class NewBcfProject(bpy.types.Operator):
bl_idname = "bim.new_bcf_project"
diff --git a/src/bonsai/bonsai/bim/module/bcf/prop.py b/src/bonsai/bonsai/bim/module/bcf/prop.py
index 6a01115821..b720a2ff74 100644
--- a/src/bonsai/bonsai/bim/module/bcf/prop.py
+++ b/src/bonsai/bonsai/bim/module/bcf/prop.py
@@ -16,24 +16,26 @@
# You should have received a copy of the GNU General Public License
# along with Bonsai. If not, see .
-import bpy
-import bonsai.tool as tool
-from . import bcfstore
-from bonsai.bim.prop import StrProperty
-from bpy.types import PropertyGroup
-from bpy.props import (
- PointerProperty,
- StringProperty,
- EnumProperty,
- BoolProperty,
- IntProperty,
- FloatProperty,
- FloatVectorProperty,
- CollectionProperty,
-)
-from bcf.agnostic.extensions import get_extensions_attributes
from typing import TYPE_CHECKING, Union
+import bpy
+from bcf.agnostic.extensions import get_extensions_attributes
+from bpy.props import (
+ BoolProperty,
+ CollectionProperty,
+ EnumProperty,
+ FloatProperty,
+ FloatVectorProperty,
+ IntProperty,
+ PointerProperty,
+ StringProperty,
+)
+from bpy.types import PropertyGroup
+
+import bonsai.tool as tool
+from bonsai.bim.prop import StrProperty
+
+from . import bcfstore
bcfviewpoints_enum = None
diff --git a/src/bonsai/bonsai/bim/module/bcf/ui.py b/src/bonsai/bonsai/bim/module/bcf/ui.py
index d0d25ecd10..e3478f63cf 100644
--- a/src/bonsai/bonsai/bim/module/bcf/ui.py
+++ b/src/bonsai/bonsai/bim/module/bcf/ui.py
@@ -17,15 +17,19 @@
# along with Bonsai. If not, see .
from __future__ import annotations
+
import os
-import bpy
-import bonsai.tool as tool
-from . import bcfstore
-from bpy.types import Panel
from typing import TYPE_CHECKING
+import bpy
+from bpy.types import Panel
+
+import bonsai.tool as tool
+
+from . import bcfstore
+
if TYPE_CHECKING:
- from bonsai.bim.module.bcf.prop import BcfTopic, BCFProperties
+ from bonsai.bim.module.bcf.prop import BCFProperties, BcfTopic
class BIM_PT_bcf(Panel):
diff --git a/src/bonsai/bonsai/bim/module/boundary/__init__.py b/src/bonsai/bonsai/bim/module/boundary/__init__.py
index cf2f78a7da..fe11440adc 100644
--- a/src/bonsai/bonsai/bim/module/boundary/__init__.py
+++ b/src/bonsai/bonsai/bim/module/boundary/__init__.py
@@ -17,7 +17,8 @@
# along with Bonsai. If not, see .
import bpy
-from . import ui, operator, prop
+
+from . import operator, prop, ui
classes = (
operator.AddBoundary,
diff --git a/src/bonsai/bonsai/bim/module/boundary/data.py b/src/bonsai/bonsai/bim/module/boundary/data.py
index e7f82caf4c..58ccadc713 100644
--- a/src/bonsai/bonsai/bim/module/boundary/data.py
+++ b/src/bonsai/bonsai/bim/module/boundary/data.py
@@ -17,6 +17,7 @@
# along with Bonsai. If not, see .
import bpy
+
import bonsai.tool as tool
diff --git a/src/bonsai/bonsai/bim/module/boundary/decorator.py b/src/bonsai/bonsai/bim/module/boundary/decorator.py
index c7875c94bf..1f5859824e 100644
--- a/src/bonsai/bonsai/bim/module/boundary/decorator.py
+++ b/src/bonsai/bonsai/bim/module/boundary/decorator.py
@@ -16,12 +16,13 @@
# You should have received a copy of the GNU General Public License
# along with Bonsai. If not, see .
-import gpu
import bmesh
-import bonsai.tool as tool
+import gpu
from bpy.types import SpaceView3D
-from mathutils import Vector
from gpu_extras.batch import batch_for_shader
+from mathutils import Vector
+
+import bonsai.tool as tool
class BoundaryDecorator:
diff --git a/src/bonsai/bonsai/bim/module/boundary/operator.py b/src/bonsai/bonsai/bim/module/boundary/operator.py
index 89b4bf6e72..4b26a0a4d9 100644
--- a/src/bonsai/bonsai/bim/module/boundary/operator.py
+++ b/src/bonsai/bonsai/bim/module/boundary/operator.py
@@ -16,34 +16,36 @@
# You should have received a copy of the GNU General Public License
# along with Bonsai. If not, see .
-import bpy
-import bmesh
import logging
-import shapely
-import shapely.ops
-import mathutils
-import numpy as np
import multiprocessing
+from math import acos, degrees, inf, pi, radians
+from typing import Optional, Union
+
+import bmesh
+import bpy
import ifcopenshell.api
import ifcopenshell.api.boundary
import ifcopenshell.api.root
import ifcopenshell.geom
-import ifcopenshell.util.unit
-import ifcopenshell.util.shape
import ifcopenshell.util.element
import ifcopenshell.util.placement
import ifcopenshell.util.representation
-import bonsai.tool as tool
-import bonsai.bim.import_ifc as import_ifc
-from math import pi, inf, degrees, acos, radians
-from mathutils import Vector, Matrix
-from bonsai.bim.ifc import IfcStore
-from bonsai.bim.module.model.decorator import ProfileDecorator
-from bonsai.bim.module.boundary.decorator import BoundaryDecorator
+import ifcopenshell.util.shape
+import ifcopenshell.util.unit
+import mathutils
+import numpy as np
+import shapely
+import shapely.ops
from ifcopenshell.util.shape_builder import ShapeBuilder
+from mathutils import Matrix, Vector
+
+import bonsai.bim.import_ifc as import_ifc
import bonsai.core
import bonsai.core.geometry
-from typing import Union, Optional
+import bonsai.tool as tool
+from bonsai.bim.ifc import IfcStore
+from bonsai.bim.module.boundary.decorator import BoundaryDecorator
+from bonsai.bim.module.model.decorator import ProfileDecorator
def disable_editing_boundary_geometry(context):
diff --git a/src/bonsai/bonsai/bim/module/boundary/prop.py b/src/bonsai/bonsai/bim/module/boundary/prop.py
index dc76de0e00..cd7e0b9de3 100644
--- a/src/bonsai/bonsai/bim/module/boundary/prop.py
+++ b/src/bonsai/bonsai/bim/module/boundary/prop.py
@@ -16,21 +16,23 @@
# You should have received a copy of the GNU General Public License
# along with Bonsai. If not, see .
+from typing import TYPE_CHECKING, Union
+
import bpy
-from bpy.types import PropertyGroup
-from bonsai.bim.prop import ObjProperty
from bpy.props import (
- PointerProperty,
- StringProperty,
- EnumProperty,
BoolProperty,
- IntProperty,
+ CollectionProperty,
+ EnumProperty,
FloatProperty,
FloatVectorProperty,
- CollectionProperty,
+ IntProperty,
+ PointerProperty,
+ StringProperty,
)
+from bpy.types import PropertyGroup
+
import bonsai.tool as tool
-from typing import TYPE_CHECKING, Union
+from bonsai.bim.prop import ObjProperty
def space_filter(self: "BIMObjectBoundaryProperties", object: bpy.types.Object) -> bool:
diff --git a/src/bonsai/bonsai/bim/module/boundary/ui.py b/src/bonsai/bonsai/bim/module/boundary/ui.py
index ba7592b34c..54694d752c 100644
--- a/src/bonsai/bonsai/bim/module/boundary/ui.py
+++ b/src/bonsai/bonsai/bim/module/boundary/ui.py
@@ -18,6 +18,7 @@
import bpy
from bpy.types import Panel, UIList
+
import bonsai.tool as tool
from bonsai.bim.module.boundary.data import SpaceBoundariesData
diff --git a/src/bonsai/bonsai/bim/module/brick/__init__.py b/src/bonsai/bonsai/bim/module/brick/__init__.py
index 6f5077f767..64d1bd3156 100644
--- a/src/bonsai/bonsai/bim/module/brick/__init__.py
+++ b/src/bonsai/bonsai/bim/module/brick/__init__.py
@@ -17,7 +17,8 @@
# along with Bonsai. If not, see .
import bpy
-from . import ui, prop, operator
+
+from . import operator, prop, ui
classes = (
operator.AddBrick,
diff --git a/src/bonsai/bonsai/bim/module/brick/data.py b/src/bonsai/bonsai/bim/module/brick/data.py
index b7ac6f61e1..bae294d713 100644
--- a/src/bonsai/bonsai/bim/module/brick/data.py
+++ b/src/bonsai/bonsai/bim/module/brick/data.py
@@ -17,11 +17,12 @@
# along with Bonsai. If not, see .
import bpy
+
import bonsai.tool as tool
from bonsai.tool.brick import BrickStore
try:
- from rdflib import URIRef, BNode
+ from rdflib import BNode, URIRef
except:
# See #1860
print("Warning: brickschema not available.")
diff --git a/src/bonsai/bonsai/bim/module/brick/operator.py b/src/bonsai/bonsai/bim/module/brick/operator.py
index 94a9f9fe54..cb0a5f675f 100644
--- a/src/bonsai/bonsai/bim/module/brick/operator.py
+++ b/src/bonsai/bonsai/bim/module/brick/operator.py
@@ -17,12 +17,14 @@
# along with Bonsai. If not, see .
import os
+
import bpy
import ifcopenshell.api
-import bonsai.tool as tool
-import bonsai.core.brick as core
+from bpy_extras.io_utils import ExportHelper, ImportHelper
+
import bonsai.bim.handler
-from bpy_extras.io_utils import ImportHelper, ExportHelper
+import bonsai.core.brick as core
+import bonsai.tool as tool
from bonsai.bim.ifc import IfcStore
from bonsai.tool.brick import BrickStore
diff --git a/src/bonsai/bonsai/bim/module/brick/prop.py b/src/bonsai/bonsai/bim/module/brick/prop.py
index 4b738a0c77..9fe6d78407 100644
--- a/src/bonsai/bonsai/bim/module/brick/prop.py
+++ b/src/bonsai/bonsai/bim/module/brick/prop.py
@@ -16,24 +16,26 @@
# You should have received a copy of the GNU General Public License
# along with Bonsai. If not, see .
+from typing import TYPE_CHECKING
+
import bpy
-from bonsai.bim.module.brick.data import BrickschemaData, BrickschemaReferencesData
-from bonsai.bim.prop import StrProperty, Attribute
-from bpy.types import PropertyGroup
from bpy.props import (
- PointerProperty,
- StringProperty,
- EnumProperty,
BoolProperty,
- IntProperty,
+ CollectionProperty,
+ EnumProperty,
FloatProperty,
FloatVectorProperty,
- CollectionProperty,
+ IntProperty,
+ PointerProperty,
+ StringProperty,
)
+from bpy.types import PropertyGroup
+
import bonsai.core.brick as core
import bonsai.tool.brick as tool
+from bonsai.bim.module.brick.data import BrickschemaData, BrickschemaReferencesData
+from bonsai.bim.prop import Attribute, StrProperty
from bonsai.tool.brick import BrickStore
-from typing import TYPE_CHECKING
def update_active_brick_index(self, context):
diff --git a/src/bonsai/bonsai/bim/module/brick/ui.py b/src/bonsai/bonsai/bim/module/brick/ui.py
index a845b12e8e..aa910c272f 100644
--- a/src/bonsai/bonsai/bim/module/brick/ui.py
+++ b/src/bonsai/bonsai/bim/module/brick/ui.py
@@ -16,8 +16,9 @@
# You should have received a copy of the GNU General Public License
# along with Bonsai. If not, see .
-import bonsai.tool as tool
from bpy.types import Panel, UIList
+
+import bonsai.tool as tool
from bonsai.bim.helper import prop_with_search
from bonsai.bim.module.brick.data import BrickschemaData, BrickschemaReferencesData
from bonsai.tool.brick import BrickStore
diff --git a/src/bonsai/bonsai/bim/module/bsdd/__init__.py b/src/bonsai/bonsai/bim/module/bsdd/__init__.py
index 607e2754c2..25d6f501f0 100644
--- a/src/bonsai/bonsai/bim/module/bsdd/__init__.py
+++ b/src/bonsai/bonsai/bim/module/bsdd/__init__.py
@@ -17,7 +17,8 @@
# along with Bonsai. If not, see .
import bpy
-from . import ui, prop, operator
+
+from . import operator, prop, ui
classes = (
operator.AddBSDDProperties,
diff --git a/src/bonsai/bonsai/bim/module/bsdd/data.py b/src/bonsai/bonsai/bim/module/bsdd/data.py
index 7905ca75c1..6e916d3355 100644
--- a/src/bonsai/bonsai/bim/module/bsdd/data.py
+++ b/src/bonsai/bonsai/bim/module/bsdd/data.py
@@ -18,8 +18,9 @@
import bpy
import ifcopenshell
-import ifcopenshell.util.date
import ifcopenshell.util.classification
+import ifcopenshell.util.date
+
import bonsai.tool as tool
from bonsai.bim.ifc import IfcStore
diff --git a/src/bonsai/bonsai/bim/module/bsdd/operator.py b/src/bonsai/bonsai/bim/module/bsdd/operator.py
index 3a6d46d1fa..d3f5533c1a 100644
--- a/src/bonsai/bonsai/bim/module/bsdd/operator.py
+++ b/src/bonsai/bonsai/bim/module/bsdd/operator.py
@@ -16,13 +16,15 @@
# You should have received a copy of the GNU General Public License
# along with Bonsai. If not, see .
import textwrap
+from typing import Any
+
import bpy
import bsdd
-import bonsai.tool as tool
import ifcopenshell.api.pset
import ifcopenshell.util.element
+
+import bonsai.tool as tool
from bonsai.core import bsdd as core
-from typing import Any
class LoadBSDDDictionaries(bpy.types.Operator):
diff --git a/src/bonsai/bonsai/bim/module/bsdd/prop.py b/src/bonsai/bonsai/bim/module/bsdd/prop.py
index 3b427ba626..347cdab1b2 100644
--- a/src/bonsai/bonsai/bim/module/bsdd/prop.py
+++ b/src/bonsai/bonsai/bim/module/bsdd/prop.py
@@ -16,23 +16,25 @@
# You should have received a copy of the GNU General Public License
# along with Bonsai. If not, see .
+from typing import TYPE_CHECKING, Literal, Union
+
import bpy
-import bonsai.tool as tool
+from bpy.props import (
+ BoolProperty,
+ CollectionProperty,
+ EnumProperty,
+ FloatProperty,
+ FloatVectorProperty,
+ IntProperty,
+ PointerProperty,
+ StringProperty,
+)
from bpy.types import PropertyGroup
+
+import bonsai.tool as tool
from bonsai.bim.module.bsdd.data import BSDDData
from bonsai.bim.module.classification.data import ClassificationsData
from bonsai.bim.prop import Attribute, StrProperty
-from bpy.props import (
- PointerProperty,
- StringProperty,
- EnumProperty,
- BoolProperty,
- IntProperty,
- FloatProperty,
- FloatVectorProperty,
- CollectionProperty,
-)
-from typing import Union, TYPE_CHECKING, Literal
def get_active_dictionary(self: "BIMBSDDProperties", context: object) -> tool.Blender.BLENDER_ENUM_ITEMS:
diff --git a/src/bonsai/bonsai/bim/module/bsdd/ui.py b/src/bonsai/bonsai/bim/module/bsdd/ui.py
index 39b2f9140e..c6966c01d8 100644
--- a/src/bonsai/bonsai/bim/module/bsdd/ui.py
+++ b/src/bonsai/bonsai/bim/module/bsdd/ui.py
@@ -17,14 +17,22 @@
# along with Bonsai. If not, see .
from __future__ import annotations
-import bpy
-import bonsai.tool as tool
-from bonsai.bim.module.bsdd.data import BSDDData
-from bpy.types import Panel, UIList
+
from typing import TYPE_CHECKING
+import bpy
+from bpy.types import Panel, UIList
+
+import bonsai.tool as tool
+from bonsai.bim.module.bsdd.data import BSDDData
+
if TYPE_CHECKING:
- from bonsai.bim.module.bsdd.prop import BIMBSDDProperties, BSDDDictionary, BSDDClassification, BSDDProperty
+ from bonsai.bim.module.bsdd.prop import (
+ BIMBSDDProperties,
+ BSDDClassification,
+ BSDDDictionary,
+ BSDDProperty,
+ )
class BIM_PT_bsdd(Panel):
diff --git a/src/bonsai/bonsai/bim/module/cad/__init__.py b/src/bonsai/bonsai/bim/module/cad/__init__.py
index 601c4da1c3..6ddca2dd96 100644
--- a/src/bonsai/bonsai/bim/module/cad/__init__.py
+++ b/src/bonsai/bonsai/bim/module/cad/__init__.py
@@ -17,6 +17,7 @@
# along with Bonsai. If not, see .
import bpy
+
from . import operator, prop, workspace
classes = (
diff --git a/src/bonsai/bonsai/bim/module/cad/operator.py b/src/bonsai/bonsai/bim/module/cad/operator.py
index 06f026a577..857d757ca1 100644
--- a/src/bonsai/bonsai/bim/module/cad/operator.py
+++ b/src/bonsai/bonsai/bim/module/cad/operator.py
@@ -16,17 +16,18 @@
# You should have received a copy of the GNU General Public License
# along with Bonsai. If not, see .
-import bpy
import math
-import bmesh
-import mathutils
-import bpy_extras
-import bonsai.tool as tool
-from mathutils import Vector, Matrix
-from math import pi, radians, sin, cos, sqrt
-import ifcopenshell.util.unit
+from math import cos, pi, radians, sin, sqrt
from typing import Union
+import bmesh
+import bpy
+import bpy_extras
+import ifcopenshell.util.unit
+import mathutils
+from mathutils import Matrix, Vector
+
+import bonsai.tool as tool
messages = {
"SHARED_VERTEX": "Shared Vertex, no intersection possible",
diff --git a/src/bonsai/bonsai/bim/module/cad/prop.py b/src/bonsai/bonsai/bim/module/cad/prop.py
index 7247408f00..db737b51dc 100644
--- a/src/bonsai/bonsai/bim/module/cad/prop.py
+++ b/src/bonsai/bonsai/bim/module/cad/prop.py
@@ -16,12 +16,14 @@
# You should have received a copy of the GNU General Public License
# along with Bonsai. If not, see .
-import bpy
-from bonsai.bim.module.model.data import AuthoringData
-from bpy.types import PropertyGroup
from math import pi
from typing import TYPE_CHECKING
+import bpy
+from bpy.types import PropertyGroup
+
+from bonsai.bim.module.model.data import AuthoringData
+
class BIMCadProperties(PropertyGroup):
resolution: bpy.props.IntProperty(name="Arc Resolution", min=1, default=1)
diff --git a/src/bonsai/bonsai/bim/module/cad/workspace.py b/src/bonsai/bonsai/bim/module/cad/workspace.py
index 017f493682..b384463ac2 100644
--- a/src/bonsai/bonsai/bim/module/cad/workspace.py
+++ b/src/bonsai/bonsai/bim/module/cad/workspace.py
@@ -17,13 +17,15 @@
# along with Bonsai. If not, see .
import os
+from functools import partial
+
import bpy
-import bonsai.tool as tool
-import bonsai.bim.module.type.prop as type_prop
import ifcopenshell.util.unit
from bpy.types import WorkSpaceTool
+
+import bonsai.bim.module.type.prop as type_prop
+import bonsai.tool as tool
from bonsai.bim.module.model.data import AuthoringData, RailingData, RoofData
-from functools import partial
def load_custom_icons():
diff --git a/src/bonsai/bonsai/bim/module/clash/__init__.py b/src/bonsai/bonsai/bim/module/clash/__init__.py
index a3ada1bc72..6bfabacfab 100644
--- a/src/bonsai/bonsai/bim/module/clash/__init__.py
+++ b/src/bonsai/bonsai/bim/module/clash/__init__.py
@@ -17,7 +17,8 @@
# along with Bonsai. If not, see .
import bpy
-from . import ui, prop, operator
+
+from . import operator, prop, ui
classes = (
operator.AddClashSet,
diff --git a/src/bonsai/bonsai/bim/module/clash/data.py b/src/bonsai/bonsai/bim/module/clash/data.py
index b994a1b750..4ecbb229a4 100644
--- a/src/bonsai/bonsai/bim/module/clash/data.py
+++ b/src/bonsai/bonsai/bim/module/clash/data.py
@@ -16,9 +16,11 @@
# You should have received a copy of the GNU General Public License
# along with Bonsai. If not, see .
-import bpy
import json
+
+import bpy
import ifcopenshell.util.element
+
import bonsai.tool as tool
diff --git a/src/bonsai/bonsai/bim/module/clash/decorator.py b/src/bonsai/bonsai/bim/module/clash/decorator.py
index 91ecc1fc16..d1d0daf095 100644
--- a/src/bonsai/bonsai/bim/module/clash/decorator.py
+++ b/src/bonsai/bonsai/bim/module/clash/decorator.py
@@ -17,13 +17,14 @@
# along with Bonsai. If not, see .
import blf
-import gpu
import bmesh
-import bonsai.tool as tool
+import gpu
from bpy.types import SpaceView3D
-from mathutils import Vector
-from gpu_extras.batch import batch_for_shader
from bpy_extras.view3d_utils import location_3d_to_region_2d
+from gpu_extras.batch import batch_for_shader
+from mathutils import Vector
+
+import bonsai.tool as tool
class ClashDecorator:
diff --git a/src/bonsai/bonsai/bim/module/clash/operator.py b/src/bonsai/bonsai/bim/module/clash/operator.py
index 3463b8fc10..688568270f 100644
--- a/src/bonsai/bonsai/bim/module/clash/operator.py
+++ b/src/bonsai/bonsai/bim/module/clash/operator.py
@@ -16,22 +16,24 @@
# You should have received a copy of the GNU General Public License
# along with Bonsai. If not, see .
-import os
-import bpy
import json
-import tempfile
-import bmesh
import logging
-import numpy as np
-import ifcopenshell
-import bonsai.tool as tool
-from pathlib import Path
-from bpy_extras.io_utils import ExportHelper, ImportHelper
+import os
+import tempfile
from math import radians
+from pathlib import Path
+from typing import TYPE_CHECKING
+
+import bmesh
+import bpy
+import ifcopenshell
+import numpy as np
+from bpy_extras.io_utils import ExportHelper, ImportHelper
from mathutils import Matrix, Vector
+
+import bonsai.tool as tool
from bonsai.bim.ifc import IfcStore
from bonsai.bim.module.clash.decorator import ClashDecorator
-from typing import TYPE_CHECKING
class ExportClashSets(bpy.types.Operator, ExportHelper):
diff --git a/src/bonsai/bonsai/bim/module/clash/prop.py b/src/bonsai/bonsai/bim/module/clash/prop.py
index a7c6101b73..5f42a400e7 100644
--- a/src/bonsai/bonsai/bim/module/clash/prop.py
+++ b/src/bonsai/bonsai/bim/module/clash/prop.py
@@ -16,23 +16,25 @@
# You should have received a copy of the GNU General Public License
# along with Bonsai. If not, see .
+from typing import TYPE_CHECKING, Literal, Union
+
import bpy
-import bonsai.tool as tool
-from bonsai.bim.prop import StrProperty, Attribute, BIMFilterGroup
-from bpy.types import PropertyGroup
from bpy.props import (
- PointerProperty,
- StringProperty,
- EnumProperty,
BoolProperty,
- IntProperty,
+ CollectionProperty,
+ EnumProperty,
FloatProperty,
FloatVectorProperty,
- CollectionProperty,
+ IntProperty,
+ PointerProperty,
+ StringProperty,
)
-from ifcopenshell.geom.main import ClashType, CLASH_TYPE_ITEMS
+from bpy.types import PropertyGroup
+from ifcopenshell.geom.main import CLASH_TYPE_ITEMS, ClashType
from mathutils import Vector
-from typing import TYPE_CHECKING, Literal, Union
+
+import bonsai.tool as tool
+from bonsai.bim.prop import Attribute, BIMFilterGroup, StrProperty
class ClashSource(PropertyGroup):
diff --git a/src/bonsai/bonsai/bim/module/clash/ui.py b/src/bonsai/bonsai/bim/module/clash/ui.py
index 5e3711efe0..a6ef267d84 100644
--- a/src/bonsai/bonsai/bim/module/clash/ui.py
+++ b/src/bonsai/bonsai/bim/module/clash/ui.py
@@ -17,15 +17,23 @@
# along with Bonsai. If not, see .
from __future__ import annotations
-import bpy
-import bonsai.tool as tool
-import bonsai.bim.helper
-from bpy.types import Panel
-from bonsai.bim.module.clash.data import ClashData
+
from typing import TYPE_CHECKING, assert_never
+import bpy
+from bpy.types import Panel
+
+import bonsai.bim.helper
+import bonsai.tool as tool
+from bonsai.bim.module.clash.data import ClashData
+
if TYPE_CHECKING:
- from bonsai.bim.module.clash.prop import BIMClashProperties, ClashSet, SmartClashGroup, Clash
+ from bonsai.bim.module.clash.prop import (
+ BIMClashProperties,
+ Clash,
+ ClashSet,
+ SmartClashGroup,
+ )
class BIM_PT_ifcclash(Panel):
diff --git a/src/bonsai/bonsai/bim/module/classification/__init__.py b/src/bonsai/bonsai/bim/module/classification/__init__.py
index 6d33b50ee6..155bbdd6ee 100644
--- a/src/bonsai/bonsai/bim/module/classification/__init__.py
+++ b/src/bonsai/bonsai/bim/module/classification/__init__.py
@@ -17,7 +17,8 @@
# along with Bonsai. If not, see .
import bpy
-from . import ui, prop, operator
+
+from . import operator, prop, ui
classes = (
operator.AddClassification,
diff --git a/src/bonsai/bonsai/bim/module/classification/data.py b/src/bonsai/bonsai/bim/module/classification/data.py
index a1fa3a6d58..9685e8faa9 100644
--- a/src/bonsai/bonsai/bim/module/classification/data.py
+++ b/src/bonsai/bonsai/bim/module/classification/data.py
@@ -16,12 +16,14 @@
# You should have received a copy of the GNU General Public License
# along with Bonsai. If not, see .
+from typing import Any, Literal, Union
+
import bpy
import ifcopenshell
-import ifcopenshell.util.date
import ifcopenshell.util.classification
+import ifcopenshell.util.date
+
import bonsai.tool as tool
-from typing import Any, Literal, Union
from bonsai.bim.ifc import IfcStore
diff --git a/src/bonsai/bonsai/bim/module/classification/operator.py b/src/bonsai/bonsai/bim/module/classification/operator.py
index a6fd0c6df5..7bf699cc31 100644
--- a/src/bonsai/bonsai/bim/module/classification/operator.py
+++ b/src/bonsai/bonsai/bim/module/classification/operator.py
@@ -19,13 +19,14 @@
import bpy
import ifcopenshell
import ifcopenshell.api
-import ifcopenshell.api.pset
import ifcopenshell.api.classification
+import ifcopenshell.api.pset
import ifcopenshell.util.classification
import ifcopenshell.util.element
-import bonsai.tool as tool
-import bonsai.bim.helper
from bpy_extras.io_utils import ImportHelper
+
+import bonsai.bim.helper
+import bonsai.tool as tool
from bonsai.bim.ifc import IfcStore
diff --git a/src/bonsai/bonsai/bim/module/classification/prop.py b/src/bonsai/bonsai/bim/module/classification/prop.py
index 4e2de0119d..454f861f07 100644
--- a/src/bonsai/bonsai/bim/module/classification/prop.py
+++ b/src/bonsai/bonsai/bim/module/classification/prop.py
@@ -16,22 +16,27 @@
# You should have received a copy of the GNU General Public License
# along with Bonsai. If not, see .
+from typing import TYPE_CHECKING
+
import bpy
-import bonsai.tool as tool
-from bonsai.bim.prop import Attribute
-from bonsai.bim.module.classification.data import ClassificationsData, ObjectClassificationsData
-from bpy.types import PropertyGroup
from bpy.props import (
- PointerProperty,
- StringProperty,
- EnumProperty,
BoolProperty,
- IntProperty,
+ CollectionProperty,
+ EnumProperty,
FloatProperty,
FloatVectorProperty,
- CollectionProperty,
+ IntProperty,
+ PointerProperty,
+ StringProperty,
)
-from typing import TYPE_CHECKING
+from bpy.types import PropertyGroup
+
+import bonsai.tool as tool
+from bonsai.bim.module.classification.data import (
+ ClassificationsData,
+ ObjectClassificationsData,
+)
+from bonsai.bim.prop import Attribute
def get_available_classifications(
diff --git a/src/bonsai/bonsai/bim/module/classification/ui.py b/src/bonsai/bonsai/bim/module/classification/ui.py
index 077f97553f..77310be49a 100644
--- a/src/bonsai/bonsai/bim/module/classification/ui.py
+++ b/src/bonsai/bonsai/bim/module/classification/ui.py
@@ -17,24 +17,29 @@
# along with Bonsai. If not, see .
from __future__ import annotations
-import bpy
-import bonsai.bim.helper
-import bonsai.tool as tool
-import bonsai.bim.module.classification.prop as classification_prop
-import ifcopenshell.util.classification
-from bpy.types import Panel, UIList
-from bonsai.bim.module.classification.data import (
- ClassificationsData,
- ObjectClassificationsData,
- MaterialClassificationsData,
- CostClassificationsData,
- ZoneClassificationsData,
-)
from typing import TYPE_CHECKING, Any, Union
+import bpy
+import ifcopenshell.util.classification
+from bpy.types import Panel, UIList
+
+import bonsai.bim.helper
+import bonsai.bim.module.classification.prop as classification_prop
+import bonsai.tool as tool
+from bonsai.bim.module.classification.data import (
+ ClassificationsData,
+ CostClassificationsData,
+ MaterialClassificationsData,
+ ObjectClassificationsData,
+ ZoneClassificationsData,
+)
+
if TYPE_CHECKING:
- from bonsai.bim.module.classification.prop import BIMClassificationProperties, ClassificationReference
+ from bonsai.bim.module.classification.prop import (
+ BIMClassificationProperties,
+ ClassificationReference,
+ )
class BIM_PT_classifications(Panel):
diff --git a/src/bonsai/bonsai/bim/module/constraint/__init__.py b/src/bonsai/bonsai/bim/module/constraint/__init__.py
index 54b5183023..858c1da130 100644
--- a/src/bonsai/bonsai/bim/module/constraint/__init__.py
+++ b/src/bonsai/bonsai/bim/module/constraint/__init__.py
@@ -17,7 +17,8 @@
# along with Bonsai. If not, see .
import bpy
-from . import ui, prop, operator
+
+from . import operator, prop, ui
classes = (
operator.LoadObjectives,
diff --git a/src/bonsai/bonsai/bim/module/constraint/data.py b/src/bonsai/bonsai/bim/module/constraint/data.py
index 8a92de2c71..d44a7d2a55 100644
--- a/src/bonsai/bonsai/bim/module/constraint/data.py
+++ b/src/bonsai/bonsai/bim/module/constraint/data.py
@@ -17,9 +17,10 @@
# along with Bonsai. If not, see .
import bpy
-import bonsai.tool as tool
from ifcopenshell.util.doc import get_entity_doc
+import bonsai.tool as tool
+
def refresh():
ConstraintsData.is_loaded = False
diff --git a/src/bonsai/bonsai/bim/module/constraint/operator.py b/src/bonsai/bonsai/bim/module/constraint/operator.py
index 4297642c3b..976f4ff6a3 100644
--- a/src/bonsai/bonsai/bim/module/constraint/operator.py
+++ b/src/bonsai/bonsai/bim/module/constraint/operator.py
@@ -16,12 +16,14 @@
# You should have received a copy of the GNU General Public License
# along with Bonsai. If not, see .
+from typing import TYPE_CHECKING
+
import bpy
import ifcopenshell.api
import ifcopenshell.api.constraint
+
import bonsai.bim.helper
import bonsai.tool as tool
-from typing import TYPE_CHECKING
def get_active_object(context: bpy.types.Context, obj_name: str) -> bpy.types.Object:
diff --git a/src/bonsai/bonsai/bim/module/constraint/prop.py b/src/bonsai/bonsai/bim/module/constraint/prop.py
index ec66f78211..c76d48e8a6 100644
--- a/src/bonsai/bonsai/bim/module/constraint/prop.py
+++ b/src/bonsai/bonsai/bim/module/constraint/prop.py
@@ -16,23 +16,25 @@
# You should have received a copy of the GNU General Public License
# along with Bonsai. If not, see .
+from typing import TYPE_CHECKING, Literal
+
import bpy
-from ifcopenshell.util.doc import get_entity_doc
-import bonsai.tool as tool
-from bonsai.bim.prop import Attribute
-from bonsai.bim.module.constraint.data import ConstraintsData
-from bpy.types import PropertyGroup
from bpy.props import (
- PointerProperty,
- StringProperty,
- EnumProperty,
BoolProperty,
- IntProperty,
+ CollectionProperty,
+ EnumProperty,
FloatProperty,
FloatVectorProperty,
- CollectionProperty,
+ IntProperty,
+ PointerProperty,
+ StringProperty,
)
-from typing import TYPE_CHECKING, Literal
+from bpy.types import PropertyGroup
+from ifcopenshell.util.doc import get_entity_doc
+
+import bonsai.tool as tool
+from bonsai.bim.module.constraint.data import ConstraintsData
+from bonsai.bim.prop import Attribute
def get_available_constraint_types(self, context):
diff --git a/src/bonsai/bonsai/bim/module/constraint/ui.py b/src/bonsai/bonsai/bim/module/constraint/ui.py
index 61b335d782..5ab3d7c93c 100644
--- a/src/bonsai/bonsai/bim/module/constraint/ui.py
+++ b/src/bonsai/bonsai/bim/module/constraint/ui.py
@@ -17,14 +17,21 @@
# along with Bonsai. If not, see .
from __future__ import annotations
-import bonsai.tool as tool
-from bpy.types import Panel, UIList
-from bonsai.bim.helper import draw_attributes
-from bonsai.bim.module.constraint.data import ConstraintsData, ObjectConstraintsData
+
from typing import TYPE_CHECKING
+from bpy.types import Panel, UIList
+
+import bonsai.tool as tool
+from bonsai.bim.helper import draw_attributes
+from bonsai.bim.module.constraint.data import ConstraintsData, ObjectConstraintsData
+
if TYPE_CHECKING:
- from bonsai.bim.module.constraint.prop import BIMConstraintProperties, BIMObjectConstraintProperties, Constraint
+ from bonsai.bim.module.constraint.prop import (
+ BIMConstraintProperties,
+ BIMObjectConstraintProperties,
+ Constraint,
+ )
class BIM_PT_constraints(Panel):
diff --git a/src/bonsai/bonsai/bim/module/context/__init__.py b/src/bonsai/bonsai/bim/module/context/__init__.py
index 65665ae290..da24e53f55 100644
--- a/src/bonsai/bonsai/bim/module/context/__init__.py
+++ b/src/bonsai/bonsai/bim/module/context/__init__.py
@@ -17,7 +17,8 @@
# along with Bonsai. If not, see .
import bpy
-from . import ui, prop, operator
+
+from . import operator, prop, ui
classes = (
operator.AddContext,
diff --git a/src/bonsai/bonsai/bim/module/context/data.py b/src/bonsai/bonsai/bim/module/context/data.py
index c0b2143801..ade8061a4b 100644
--- a/src/bonsai/bonsai/bim/module/context/data.py
+++ b/src/bonsai/bonsai/bim/module/context/data.py
@@ -16,11 +16,13 @@
# You should have received a copy of the GNU General Public License
# along with Bonsai. If not, see .
-import bpy
-import bonsai.tool as tool
-import ifcopenshell
from typing import Any
+import bpy
+import ifcopenshell
+
+import bonsai.tool as tool
+
def refresh():
ContextData.is_loaded = False
diff --git a/src/bonsai/bonsai/bim/module/context/operator.py b/src/bonsai/bonsai/bim/module/context/operator.py
index fbf1f17963..88483dfc0c 100644
--- a/src/bonsai/bonsai/bim/module/context/operator.py
+++ b/src/bonsai/bonsai/bim/module/context/operator.py
@@ -17,8 +17,9 @@
# along with Bonsai. If not, see .
import bpy
-import bonsai.tool as tool
+
import bonsai.core.context as core
+import bonsai.tool as tool
class AddContext(bpy.types.Operator, tool.Ifc.Operator):
diff --git a/src/bonsai/bonsai/bim/module/context/prop.py b/src/bonsai/bonsai/bim/module/context/prop.py
index 3a6f3c226f..ff73c53a5a 100644
--- a/src/bonsai/bonsai/bim/module/context/prop.py
+++ b/src/bonsai/bonsai/bim/module/context/prop.py
@@ -16,21 +16,23 @@
# You should have received a copy of the GNU General Public License
# along with Bonsai. If not, see .
+from typing import TYPE_CHECKING
+
import bpy
-from bonsai.bim.prop import StrProperty, Attribute
-from bonsai.bim.module.context.data import ContextData
-from bpy.types import PropertyGroup
from bpy.props import (
- PointerProperty,
- StringProperty,
- EnumProperty,
BoolProperty,
- IntProperty,
+ CollectionProperty,
+ EnumProperty,
FloatProperty,
FloatVectorProperty,
- CollectionProperty,
+ IntProperty,
+ PointerProperty,
+ StringProperty,
)
-from typing import TYPE_CHECKING
+from bpy.types import PropertyGroup
+
+from bonsai.bim.module.context.data import ContextData
+from bonsai.bim.prop import Attribute, StrProperty
class BIMContextProperties(PropertyGroup):
diff --git a/src/bonsai/bonsai/bim/module/context/ui.py b/src/bonsai/bonsai/bim/module/context/ui.py
index e8d0d337b4..3090da38fc 100644
--- a/src/bonsai/bonsai/bim/module/context/ui.py
+++ b/src/bonsai/bonsai/bim/module/context/ui.py
@@ -17,6 +17,7 @@
# along with Bonsai. If not, see .
import bpy
+
import bonsai.bim.helper
import bonsai.tool as tool
from bonsai.bim.module.context.data import ContextData
diff --git a/src/bonsai/bonsai/bim/module/cost/__init__.py b/src/bonsai/bonsai/bim/module/cost/__init__.py
index 6f42a71bf9..9378a68ee1 100644
--- a/src/bonsai/bonsai/bim/module/cost/__init__.py
+++ b/src/bonsai/bonsai/bim/module/cost/__init__.py
@@ -17,7 +17,8 @@
# along with Bonsai. If not, see .
import bpy
-from . import ui, prop, operator
+
+from . import operator, prop, ui
classes = (
operator.AddCostColumn,
diff --git a/src/bonsai/bonsai/bim/module/cost/data.py b/src/bonsai/bonsai/bim/module/cost/data.py
index 4b5198bb03..aab9ea9231 100644
--- a/src/bonsai/bonsai/bim/module/cost/data.py
+++ b/src/bonsai/bonsai/bim/module/cost/data.py
@@ -16,15 +16,17 @@
# You should have received a copy of the GNU General Public License
# along with Bonsai. If not, see .
+from typing import Any, Union
+
import bpy
import ifcopenshell
import ifcopenshell.util.cost
import ifcopenshell.util.date
import ifcopenshell.util.element
import ifcopenshell.util.unit
-import bonsai.tool as tool
from ifcopenshell.util.doc import get_entity_doc, get_predefined_type_doc
-from typing import Any, Union
+
+import bonsai.tool as tool
def refresh():
diff --git a/src/bonsai/bonsai/bim/module/cost/operator.py b/src/bonsai/bonsai/bim/module/cost/operator.py
index 644871488c..48b672a2c2 100644
--- a/src/bonsai/bonsai/bim/module/cost/operator.py
+++ b/src/bonsai/bonsai/bim/module/cost/operator.py
@@ -18,16 +18,16 @@
# pyright: reportUnnecessaryTypeIgnoreComment=error
-import bpy
import textwrap
-import ifcopenshell.api.nest
-import bonsai.tool as tool
-from bpy_extras.io_utils import ImportHelper, ExportHelper
-import bonsai.tool as tool
-import bonsai.core.cost as core
from pathlib import Path
+from typing import TYPE_CHECKING, Literal, get_args
-from typing import get_args, TYPE_CHECKING, Literal
+import bpy
+import ifcopenshell.api.nest
+from bpy_extras.io_utils import ExportHelper, ImportHelper
+
+import bonsai.core.cost as core
+import bonsai.tool as tool
class AddCostSchedule(bpy.types.Operator, tool.Ifc.Operator):
diff --git a/src/bonsai/bonsai/bim/module/cost/prop.py b/src/bonsai/bonsai/bim/module/cost/prop.py
index 3ce30e665e..121ca617e7 100644
--- a/src/bonsai/bonsai/bim/module/cost/prop.py
+++ b/src/bonsai/bonsai/bim/module/cost/prop.py
@@ -16,25 +16,31 @@
# You should have received a copy of the GNU General Public License
# along with Bonsai. If not, see .
+from typing import TYPE_CHECKING, Literal, Union
+
import bpy
import ifcopenshell.api
import ifcopenshell.api.cost
-import bonsai.tool as tool
-from bonsai.bim.module.classification.data import CostClassificationsData
-from bonsai.bim.module.cost.data import CostSchedulesData, CostItemRatesData, CostItemQuantitiesData
-from bonsai.bim.prop import StrProperty, Attribute
-from bpy.types import PropertyGroup
from bpy.props import (
- PointerProperty,
- StringProperty,
- EnumProperty,
BoolProperty,
- IntProperty,
+ CollectionProperty,
+ EnumProperty,
FloatProperty,
FloatVectorProperty,
- CollectionProperty,
+ IntProperty,
+ PointerProperty,
+ StringProperty,
)
-from typing import TYPE_CHECKING, Literal, Union
+from bpy.types import PropertyGroup
+
+import bonsai.tool as tool
+from bonsai.bim.module.classification.data import CostClassificationsData
+from bonsai.bim.module.cost.data import (
+ CostItemQuantitiesData,
+ CostItemRatesData,
+ CostSchedulesData,
+)
+from bonsai.bim.prop import Attribute, StrProperty
def get_schedule_of_rates(self: "BIMCostProperties", context: bpy.types.Context) -> tool.Blender.BLENDER_ENUM_ITEMS:
diff --git a/src/bonsai/bonsai/bim/module/cost/ui.py b/src/bonsai/bonsai/bim/module/cost/ui.py
index e8eb58a855..73a578171f 100644
--- a/src/bonsai/bonsai/bim/module/cost/ui.py
+++ b/src/bonsai/bonsai/bim/module/cost/ui.py
@@ -17,13 +17,16 @@
# along with Bonsai. If not, see .
from __future__ import annotations
+
+from typing import TYPE_CHECKING, Any
+
import bpy
+from bpy.types import Panel, UIList
+
import bonsai.bim.helper
import bonsai.bim.module.cost.prop as CostProp
import bonsai.tool as tool
-from bpy.types import Panel, UIList
from bonsai.bim.module.cost.data import CostSchedulesData
-from typing import Any, TYPE_CHECKING
if TYPE_CHECKING:
from bonsai.bim.module.cost.prop import BIMCostProperties, CostItemQuantity
diff --git a/src/bonsai/bonsai/bim/module/covering/__init__.py b/src/bonsai/bonsai/bim/module/covering/__init__.py
index 5e00a6dfbe..3cec5084c4 100644
--- a/src/bonsai/bonsai/bim/module/covering/__init__.py
+++ b/src/bonsai/bonsai/bim/module/covering/__init__.py
@@ -17,6 +17,7 @@
# along with Bonsai. If not, see .
import bpy
+
from . import prop, workspace
classes = (
diff --git a/src/bonsai/bonsai/bim/module/covering/prop.py b/src/bonsai/bonsai/bim/module/covering/prop.py
index 3dc65903aa..3655d50c9f 100644
--- a/src/bonsai/bonsai/bim/module/covering/prop.py
+++ b/src/bonsai/bonsai/bim/module/covering/prop.py
@@ -16,9 +16,10 @@
# You should have received a copy of the GNU General Public License
# along with Bonsai. If not, see .
+from typing import TYPE_CHECKING
+
import bpy
from bpy.types import PropertyGroup
-from typing import TYPE_CHECKING
class BIMCoveringProperties(PropertyGroup):
diff --git a/src/bonsai/bonsai/bim/module/covering/workspace.py b/src/bonsai/bonsai/bim/module/covering/workspace.py
index 3e44b0476d..68b2704166 100644
--- a/src/bonsai/bonsai/bim/module/covering/workspace.py
+++ b/src/bonsai/bonsai/bim/module/covering/workspace.py
@@ -18,13 +18,15 @@
import os
+from functools import partial
+
import bpy
import ifcopenshell
+from bpy.types import WorkSpaceTool
+
import bonsai.tool as tool
from bonsai.bim.helper import prop_with_search
from bonsai.bim.module.model.data import AuthoringData
-from bpy.types import WorkSpaceTool
-from functools import partial
class CoveringTool(WorkSpaceTool):
diff --git a/src/bonsai/bonsai/bim/module/covetool/__init__.py b/src/bonsai/bonsai/bim/module/covetool/__init__.py
index 6697f24301..beb75bb7af 100644
--- a/src/bonsai/bonsai/bim/module/covetool/__init__.py
+++ b/src/bonsai/bonsai/bim/module/covetool/__init__.py
@@ -17,7 +17,8 @@
# along with Bonsai. If not, see .
import bpy
-from . import ui, prop, operator
+
+from . import operator, prop, ui
classes = (
prop.CoveToolProject,
diff --git a/src/bonsai/bonsai/bim/module/covetool/operator.py b/src/bonsai/bonsai/bim/module/covetool/operator.py
index cccb164611..fa298ada9c 100644
--- a/src/bonsai/bonsai/bim/module/covetool/operator.py
+++ b/src/bonsai/bonsai/bim/module/covetool/operator.py
@@ -16,12 +16,14 @@
# You should have received a copy of the GNU General Public License
# along with Bonsai. If not, see .
-import bpy
import json
+from math import atan2, degrees
+
+import bpy
import ifcopenshell
import ifcopenshell.util.element
+
import bonsai.tool as tool
-from math import degrees, atan2
from .api import Api
diff --git a/src/bonsai/bonsai/bim/module/covetool/prop.py b/src/bonsai/bonsai/bim/module/covetool/prop.py
index 06444de29f..42e59466d9 100644
--- a/src/bonsai/bonsai/bim/module/covetool/prop.py
+++ b/src/bonsai/bonsai/bim/module/covetool/prop.py
@@ -16,9 +16,10 @@
# You should have received a copy of the GNU General Public License
# along with Bonsai. If not, see .
-import bpy
from typing import TYPE_CHECKING
+import bpy
+
class CoveToolProject(bpy.types.PropertyGroup):
run_set: bpy.props.StringProperty(name="Run Set")
diff --git a/src/bonsai/bonsai/bim/module/covetool/ui.py b/src/bonsai/bonsai/bim/module/covetool/ui.py
index e26ac1338a..1a7015b139 100644
--- a/src/bonsai/bonsai/bim/module/covetool/ui.py
+++ b/src/bonsai/bonsai/bim/module/covetool/ui.py
@@ -17,12 +17,15 @@
# along with Bonsai. If not, see .
from __future__ import annotations
-import bpy.types
-import bonsai.tool as tool
+
from typing import TYPE_CHECKING
+import bpy.types
+
+import bonsai.tool as tool
+
if TYPE_CHECKING:
- from bonsai.bim.module.covetool.prop import CoveToolProperties, CoveToolProject
+ from bonsai.bim.module.covetool.prop import CoveToolProject, CoveToolProperties
class BIM_PT_covetool(bpy.types.Panel):
diff --git a/src/bonsai/bonsai/bim/module/csv/__init__.py b/src/bonsai/bonsai/bim/module/csv/__init__.py
index 7a6b99906e..f544445b20 100644
--- a/src/bonsai/bonsai/bim/module/csv/__init__.py
+++ b/src/bonsai/bonsai/bim/module/csv/__init__.py
@@ -17,7 +17,8 @@
# along with Bonsai. If not, see .
import bpy
-from . import ui, prop, operator
+
+from . import operator, prop, ui
classes = (
operator.AddCsvAttribute,
diff --git a/src/bonsai/bonsai/bim/module/csv/operator.py b/src/bonsai/bonsai/bim/module/csv/operator.py
index 34e20f6d9c..d42e8d3852 100644
--- a/src/bonsai/bonsai/bim/module/csv/operator.py
+++ b/src/bonsai/bonsai/bim/module/csv/operator.py
@@ -17,20 +17,23 @@
# along with Bonsai. If not, see .
from __future__ import annotations
-import os
-import bpy
+
import json
-import ifccsv
import logging
+import os
import tempfile
+from collections import Counter
+from typing import TYPE_CHECKING
+
+import bpy
+import ifccsv
import ifcopenshell
import ifcopenshell.util.selector
-import bonsai.tool as tool
-import bonsai.bim.module.drawing.scheduler as scheduler
from bpy_extras.io_utils import ExportHelper, ImportHelper
+
+import bonsai.bim.module.drawing.scheduler as scheduler
+import bonsai.tool as tool
from bonsai.bim.handler import refresh_ui_data
-from typing import TYPE_CHECKING
-from collections import Counter
if TYPE_CHECKING:
import pandas as pd
diff --git a/src/bonsai/bonsai/bim/module/csv/prop.py b/src/bonsai/bonsai/bim/module/csv/prop.py
index 371776bef2..a698f89b76 100644
--- a/src/bonsai/bonsai/bim/module/csv/prop.py
+++ b/src/bonsai/bonsai/bim/module/csv/prop.py
@@ -16,20 +16,22 @@
# You should have received a copy of the GNU General Public License
# along with Bonsai. If not, see .
+from typing import TYPE_CHECKING, Literal
+
import bpy
-from bonsai.bim.prop import StrProperty, BIMFilterGroup
-from bpy.types import PropertyGroup
from bpy.props import (
- PointerProperty,
- StringProperty,
- EnumProperty,
BoolProperty,
- IntProperty,
+ CollectionProperty,
+ EnumProperty,
FloatProperty,
FloatVectorProperty,
- CollectionProperty,
+ IntProperty,
+ PointerProperty,
+ StringProperty,
)
-from typing import TYPE_CHECKING, Literal
+from bpy.types import PropertyGroup
+
+from bonsai.bim.prop import BIMFilterGroup, StrProperty
class CsvAttribute(PropertyGroup):
diff --git a/src/bonsai/bonsai/bim/module/csv/ui.py b/src/bonsai/bonsai/bim/module/csv/ui.py
index a407efc7d1..c40be1b037 100644
--- a/src/bonsai/bonsai/bim/module/csv/ui.py
+++ b/src/bonsai/bonsai/bim/module/csv/ui.py
@@ -16,9 +16,10 @@
# You should have received a copy of the GNU General Public License
# along with Bonsai. If not, see .
+from bpy.types import Panel
+
import bonsai.bim.helper
import bonsai.tool as tool
-from bpy.types import Panel
from bonsai.bim.module.search.data import SearchData
diff --git a/src/bonsai/bonsai/bim/module/debug/__init__.py b/src/bonsai/bonsai/bim/module/debug/__init__.py
index c01cf03275..bd3ecac4f6 100644
--- a/src/bonsai/bonsai/bim/module/debug/__init__.py
+++ b/src/bonsai/bonsai/bim/module/debug/__init__.py
@@ -17,7 +17,8 @@
# along with Bonsai. If not, see .
import bpy
-from . import ui, prop, operator
+
+from . import operator, prop, ui
classes = (
operator.ChangeLogLevel,
diff --git a/src/bonsai/bonsai/bim/module/debug/operator.py b/src/bonsai/bonsai/bim/module/debug/operator.py
index 0820d5e3d6..6e30a3cc0f 100644
--- a/src/bonsai/bonsai/bim/module/debug/operator.py
+++ b/src/bonsai/bonsai/bim/module/debug/operator.py
@@ -16,14 +16,18 @@
# You should have received a copy of the GNU General Public License
# along with Bonsai. If not, see .
-import os
-import sys
-import bpy
-import time
-import random
import logging
-import subprocess
+import os
import platform
+import random
+import subprocess
+import sys
+import time
+from collections import defaultdict
+from pathlib import Path
+from typing import TYPE_CHECKING, Any, Literal, Union, assert_never, get_args
+
+import bpy
import ifcopenshell
import ifcopenshell.api
import ifcopenshell.api.pset
@@ -32,18 +36,16 @@ import ifcopenshell.ifcopenshell_wrapper as W
import ifcopenshell.util.element
import ifcopenshell.util.placement
import ifcopenshell.util.unit
-import bonsai.tool as tool
+from bpy_extras.io_utils import ExportHelper, ImportHelper
+
+import bonsai.bim.handler
+import bonsai.bim.import_ifc as import_ifc
import bonsai.core.debug as core
import bonsai.core.profile
import bonsai.core.type
-import bonsai.bim.handler
-import bonsai.bim.import_ifc as import_ifc
-from collections import defaultdict
-from bpy_extras.io_utils import ImportHelper, ExportHelper
-from pathlib import Path
-from bonsai import get_debug_info, format_debug_info
+import bonsai.tool as tool
+from bonsai import format_debug_info, get_debug_info
from bonsai.bim.ifc import IfcStore
-from typing import get_args, Union, Any, TYPE_CHECKING, Literal, get_args, assert_never
if TYPE_CHECKING:
from bonsai.bim.prop import Attribute
diff --git a/src/bonsai/bonsai/bim/module/debug/prop.py b/src/bonsai/bonsai/bim/module/debug/prop.py
index 5a28b22f79..e52ec5ff7d 100644
--- a/src/bonsai/bonsai/bim/module/debug/prop.py
+++ b/src/bonsai/bonsai/bim/module/debug/prop.py
@@ -16,20 +16,22 @@
# You should have received a copy of the GNU General Public License
# along with Bonsai. If not, see .
+from typing import TYPE_CHECKING, Literal, get_args
+
import bpy
-from bonsai.bim.prop import StrProperty, Attribute
-from bpy.types import PropertyGroup
from bpy.props import (
- PointerProperty,
- StringProperty,
- EnumProperty,
BoolProperty,
- IntProperty,
+ CollectionProperty,
+ EnumProperty,
FloatProperty,
FloatVectorProperty,
- CollectionProperty,
+ IntProperty,
+ PointerProperty,
+ StringProperty,
)
-from typing import TYPE_CHECKING, Literal, get_args
+from bpy.types import PropertyGroup
+
+from bonsai.bim.prop import Attribute, StrProperty
DisplayType = Literal["BOUNDS", "WIRE", "SOLID", "TEXTURED"]
diff --git a/src/bonsai/bonsai/bim/module/debug/ui.py b/src/bonsai/bonsai/bim/module/debug/ui.py
index 58af7b9f72..5ffa99cf35 100644
--- a/src/bonsai/bonsai/bim/module/debug/ui.py
+++ b/src/bonsai/bonsai/bim/module/debug/ui.py
@@ -17,9 +17,10 @@
# along with Bonsai. If not, see .
import bpy
-import bonsai.tool as tool
from bpy.types import Panel
+import bonsai.tool as tool
+
class BIM_PT_debug(Panel):
bl_label = "Debug"
diff --git a/src/bonsai/bonsai/bim/module/demo/__init__.py b/src/bonsai/bonsai/bim/module/demo/__init__.py
index 705e0be046..7dc5f18ff7 100644
--- a/src/bonsai/bonsai/bim/module/demo/__init__.py
+++ b/src/bonsai/bonsai/bim/module/demo/__init__.py
@@ -28,7 +28,8 @@
# system when the add-on loads. This is where it happens.
import bpy
-from . import ui, prop, operator
+
+from . import operator, prop, ui
# You'll need to provide a list of every one of your classes here. If you forget
# to specify your class, it won't load and you won't be able to use that
diff --git a/src/bonsai/bonsai/bim/module/demo/operator.py b/src/bonsai/bonsai/bim/module/demo/operator.py
index 001c8de692..fb1927c9bd 100644
--- a/src/bonsai/bonsai/bim/module/demo/operator.py
+++ b/src/bonsai/bonsai/bim/module/demo/operator.py
@@ -28,8 +28,9 @@
# "Operators", since they correlate to a single user operation.
import bpy
-import bonsai.tool as tool
+
import bonsai.core.demo as core
+import bonsai.tool as tool
# Each button correlates to a class like the one below. In this case, we're
diff --git a/src/bonsai/bonsai/bim/module/demo/prop.py b/src/bonsai/bonsai/bim/module/demo/prop.py
index 83df8ccfda..f206fe3156 100644
--- a/src/bonsai/bonsai/bim/module/demo/prop.py
+++ b/src/bonsai/bonsai/bim/module/demo/prop.py
@@ -33,20 +33,20 @@
from typing import TYPE_CHECKING
import bpy
-from bpy.types import PropertyGroup
# Properties have many different data types. We won't use all of them in this
# demo module, but this is a list for your reference.
from bpy.props import (
- PointerProperty,
- StringProperty,
- EnumProperty,
BoolProperty,
- IntProperty,
+ CollectionProperty,
+ EnumProperty,
FloatProperty,
FloatVectorProperty,
- CollectionProperty,
+ IntProperty,
+ PointerProperty,
+ StringProperty,
)
+from bpy.types import PropertyGroup
# All properties must belong in a property group. Usually, you'd have a group
diff --git a/src/bonsai/bonsai/bim/module/demo/ui.py b/src/bonsai/bonsai/bim/module/demo/ui.py
index 6005814cfa..cade6dbf03 100644
--- a/src/bonsai/bonsai/bim/module/demo/ui.py
+++ b/src/bonsai/bonsai/bim/module/demo/ui.py
@@ -27,6 +27,7 @@
# panels, buttons, labels, and input fields are laid out.
import bpy
+
import bonsai.tool as tool
from bonsai.bim.module.demo.data import DemoData
diff --git a/src/bonsai/bonsai/bim/module/diff/__init__.py b/src/bonsai/bonsai/bim/module/diff/__init__.py
index 2cfb1b3c7b..fdeaf49596 100644
--- a/src/bonsai/bonsai/bim/module/diff/__init__.py
+++ b/src/bonsai/bonsai/bim/module/diff/__init__.py
@@ -17,7 +17,8 @@
# along with Bonsai. If not, see .
import bpy
-from . import ui, prop, operator
+
+from . import operator, prop, ui
classes = (
operator.ExecuteIfcDiff,
diff --git a/src/bonsai/bonsai/bim/module/diff/data.py b/src/bonsai/bonsai/bim/module/diff/data.py
index ac3e545f43..9fce7f38ba 100644
--- a/src/bonsai/bonsai/bim/module/diff/data.py
+++ b/src/bonsai/bonsai/bim/module/diff/data.py
@@ -16,8 +16,10 @@
# You should have received a copy of the GNU General Public License
# along with Bonsai. If not, see .
-import bpy
import json
+
+import bpy
+
import bonsai.tool as tool
diff --git a/src/bonsai/bonsai/bim/module/diff/operator.py b/src/bonsai/bonsai/bim/module/diff/operator.py
index 954e43ac1e..330deed410 100644
--- a/src/bonsai/bonsai/bim/module/diff/operator.py
+++ b/src/bonsai/bonsai/bim/module/diff/operator.py
@@ -16,15 +16,17 @@
# You should have received a copy of the GNU General Public License
# along with Bonsai. If not, see .
-import bpy
import json
import logging
+
+import bpy
import ifcdiff
import ifcopenshell
+from bpy_extras.io_utils import ExportHelper, ImportHelper
+
import bonsai.bim.handler
import bonsai.bim.import_ifc
import bonsai.tool as tool
-from bpy_extras.io_utils import ImportHelper, ExportHelper
from bonsai.bim.ifc import IfcStore
diff --git a/src/bonsai/bonsai/bim/module/diff/prop.py b/src/bonsai/bonsai/bim/module/diff/prop.py
index 61da124a7c..c8f9d48c84 100644
--- a/src/bonsai/bonsai/bim/module/diff/prop.py
+++ b/src/bonsai/bonsai/bim/module/diff/prop.py
@@ -16,21 +16,23 @@
# You should have received a copy of the GNU General Public License
# along with Bonsai. If not, see .
+from typing import TYPE_CHECKING, Literal, get_args
+
import bpy
-from bonsai.bim.prop import StrProperty, BIMFilterGroup
-from bonsai.bim.module.diff.data import DiffData
-from bpy.types import PropertyGroup
from bpy.props import (
- PointerProperty,
- StringProperty,
- EnumProperty,
BoolProperty,
- IntProperty,
+ CollectionProperty,
+ EnumProperty,
FloatProperty,
FloatVectorProperty,
- CollectionProperty,
+ IntProperty,
+ PointerProperty,
+ StringProperty,
)
-from typing import TYPE_CHECKING, Literal, get_args
+from bpy.types import PropertyGroup
+
+from bonsai.bim.module.diff.data import DiffData
+from bonsai.bim.prop import BIMFilterGroup, StrProperty
def update_diff_json_file(self: "DiffProperties", context: bpy.types.Context) -> None:
diff --git a/src/bonsai/bonsai/bim/module/diff/ui.py b/src/bonsai/bonsai/bim/module/diff/ui.py
index 91e0a6b48e..383345e8b5 100644
--- a/src/bonsai/bonsai/bim/module/diff/ui.py
+++ b/src/bonsai/bonsai/bim/module/diff/ui.py
@@ -17,9 +17,10 @@
# along with Bonsai. If not, see .
from bpy.types import Panel
-from bonsai.bim.module.diff.data import DiffData
+
import bonsai.bim.helper
import bonsai.tool as tool
+from bonsai.bim.module.diff.data import DiffData
class BIM_PT_diff(Panel):
diff --git a/src/bonsai/bonsai/bim/module/document/__init__.py b/src/bonsai/bonsai/bim/module/document/__init__.py
index 3881148a18..ac3bdfb1a3 100644
--- a/src/bonsai/bonsai/bim/module/document/__init__.py
+++ b/src/bonsai/bonsai/bim/module/document/__init__.py
@@ -17,7 +17,8 @@
# along with Bonsai. If not, see .
import bpy
-from . import ui, prop, operator
+
+from . import operator, prop, ui
classes = (
operator.AddDocumentReference,
diff --git a/src/bonsai/bonsai/bim/module/document/data.py b/src/bonsai/bonsai/bim/module/document/data.py
index b68c118e56..97b4a1f206 100644
--- a/src/bonsai/bonsai/bim/module/document/data.py
+++ b/src/bonsai/bonsai/bim/module/document/data.py
@@ -17,12 +17,14 @@
# along with Bonsai. If not, see .
import os
+
import bpy
import ifcopenshell
import ifcopenshell.util.schema
-import bonsai.tool as tool
from natsort import natsorted
+import bonsai.tool as tool
+
def refresh():
DocumentData.is_loaded = False
diff --git a/src/bonsai/bonsai/bim/module/document/operator.py b/src/bonsai/bonsai/bim/module/document/operator.py
index 447d3b1693..a4e5cfc4ac 100644
--- a/src/bonsai/bonsai/bim/module/document/operator.py
+++ b/src/bonsai/bonsai/bim/module/document/operator.py
@@ -16,11 +16,13 @@
# You should have received a copy of the GNU General Public License
# along with Bonsai. If not, see .
-import bpy
import json
+
+import bpy
+
import bonsai.bim.handler
-import bonsai.tool as tool
import bonsai.core.document as core
+import bonsai.tool as tool
from bonsai.bim.module.document.data import DocumentData, ObjectDocumentData
@@ -264,8 +266,8 @@ class OpenIFCDocument(bpy.types.Operator):
uri: bpy.props.StringProperty(name="URI")
def execute(self, context):
- import subprocess
import os
+ import subprocess
if not self.uri or not self.uri.lower().startswith("file://"):
self.report({"ERROR"}, "Only local file:// URIs are supported")
diff --git a/src/bonsai/bonsai/bim/module/document/prop.py b/src/bonsai/bonsai/bim/module/document/prop.py
index 93369b546d..b1eb41cc2e 100644
--- a/src/bonsai/bonsai/bim/module/document/prop.py
+++ b/src/bonsai/bonsai/bim/module/document/prop.py
@@ -1,20 +1,21 @@
+from typing import TYPE_CHECKING, Union
+
import bpy
-import bonsai.tool as tool
-from bonsai.bim.prop import StrProperty, Attribute
-from bonsai.bim.module.document.data import refresh
-from bpy.types import PropertyGroup
from bpy.props import (
- PointerProperty,
- StringProperty,
- EnumProperty,
BoolProperty,
- IntProperty,
+ CollectionProperty,
+ EnumProperty,
FloatProperty,
FloatVectorProperty,
- CollectionProperty,
+ IntProperty,
+ PointerProperty,
+ StringProperty,
)
-from bonsai.bim.module.document.data import DocumentData
-from typing import TYPE_CHECKING, Union
+from bpy.types import PropertyGroup
+
+import bonsai.tool as tool
+from bonsai.bim.module.document.data import DocumentData, refresh
+from bonsai.bim.prop import Attribute, StrProperty
def update_document_name(self: "Document", context: bpy.types.Context) -> None:
diff --git a/src/bonsai/bonsai/bim/module/document/ui.py b/src/bonsai/bonsai/bim/module/document/ui.py
index 7688399732..eda5d34a1d 100644
--- a/src/bonsai/bonsai/bim/module/document/ui.py
+++ b/src/bonsai/bonsai/bim/module/document/ui.py
@@ -17,8 +17,9 @@
# along with Bonsai. If not, see .
import bpy
-import bonsai.tool as tool
from bpy.types import Panel, UIList
+
+import bonsai.tool as tool
from bonsai.bim.helper import draw_attributes
from bonsai.bim.module.document.data import DocumentData, ObjectDocumentData
diff --git a/src/bonsai/bonsai/bim/module/drawing/__init__.py b/src/bonsai/bonsai/bim/module/drawing/__init__.py
index 93316a0d01..67a9ed0853 100644
--- a/src/bonsai/bonsai/bim/module/drawing/__init__.py
+++ b/src/bonsai/bonsai/bim/module/drawing/__init__.py
@@ -17,9 +17,11 @@
# along with Bonsai. If not, see .
import bpy
-from . import ui, prop, operator, handler, gizmos, workspace
+
import bonsai.tool as tool
+from . import gizmos, handler, operator, prop, ui, workspace
+
classes = (
operator.ActivateDrawing,
operator.ActivateDrawingFromSheet,
diff --git a/src/bonsai/bonsai/bim/module/drawing/annotation.py b/src/bonsai/bonsai/bim/module/drawing/annotation.py
index 9589b9ac00..18d914872a 100644
--- a/src/bonsai/bonsai/bim/module/drawing/annotation.py
+++ b/src/bonsai/bonsai/bim/module/drawing/annotation.py
@@ -17,16 +17,19 @@
# along with Bonsai. If not, see .
from __future__ import annotations
-import os
-import bpy
+
import math
-import bmesh
-import bonsai.tool as tool
-import ifcopenshell.util.element
+import os
from pathlib import Path
-from mathutils import Vector, Matrix
from typing import Optional
+import bmesh
+import bpy
+import ifcopenshell.util.element
+from mathutils import Matrix, Vector
+
+import bonsai.tool as tool
+
class Annotator:
@staticmethod
diff --git a/src/bonsai/bonsai/bim/module/drawing/data.py b/src/bonsai/bonsai/bim/module/drawing/data.py
index 4941e7f51c..ed457a7bbf 100644
--- a/src/bonsai/bonsai/bim/module/drawing/data.py
+++ b/src/bonsai/bonsai/bim/module/drawing/data.py
@@ -16,18 +16,20 @@
# You should have received a copy of the GNU General Public License
# along with Bonsai. If not, see .
-import os
-import bpy
import json
-import ifcopenshell.util.element
-import ifcopenshell.util.representation
-import ifcopenshell.util.unit
-import ifcopenshell.util.selector
-import bonsai.tool as tool
+import os
from pathlib import Path
from typing import Any, Union
+
+import bpy
+import ifcopenshell.util.element
+import ifcopenshell.util.representation
+import ifcopenshell.util.selector
+import ifcopenshell.util.unit
from natsort import natsorted
+import bonsai.tool as tool
+
def refresh():
ProductAssignmentsData.is_loaded = False
diff --git a/src/bonsai/bonsai/bim/module/drawing/decoration.py b/src/bonsai/bonsai/bim/module/drawing/decoration.py
index fc3b9ecbf6..0a6bc967bf 100644
--- a/src/bonsai/bonsai/bim/module/drawing/decoration.py
+++ b/src/bonsai/bonsai/bim/module/drawing/decoration.py
@@ -16,33 +16,35 @@
# You should have received a copy of the GNU General Public License
# along with Bonsai. If not, see .
-import gpu
-import bpy
-import blf
-import os
import math
+import os
+from collections.abc import Generator, Iterator
+from functools import cache
+from math import acos, atan, cos, degrees, pi, radians, sin
+from pathlib import Path
+from timeit import default_timer as timer
+from typing import Optional, Union
+
+import blf
import bmesh
-import shapely
-import numpy as np
+import bpy
+import gpu
import ifcopenshell
import ifcopenshell.util.element
import ifcopenshell.util.representation
import ifcopenshell.util.unit
-import bonsai.tool as tool
-import bonsai.bim.module.drawing.helper as helper
-from pathlib import Path
-from math import pi, sin, cos, acos, atan, degrees, radians
+import numpy as np
+import shapely
from bpy.types import SpaceView3D
-from mathutils import Vector, Matrix
from bpy_extras.view3d_utils import location_3d_to_region_2d
from gpu_extras.batch import batch_for_shader
+from mathutils import Matrix, Vector
+
+import bonsai.bim.module.drawing.helper as helper
+import bonsai.tool as tool
from bonsai.bim.module.drawing.data import DecoratorData, DrawingsData
-from bonsai.bim.module.drawing.shaders import add_verts_sequence, add_offsets
from bonsai.bim.module.drawing.helper import format_distance
-from timeit import default_timer as timer
-from functools import cache
-from typing import Optional, Union
-from collections.abc import Generator, Iterator
+from bonsai.bim.module.drawing.shaders import add_offsets, add_verts_sequence
UNSPECIAL_ELEMENT_COLOR = (0.2, 0.2, 0.2, 1) # GREY
diff --git a/src/bonsai/bonsai/bim/module/drawing/gizmos.py b/src/bonsai/bonsai/bim/module/drawing/gizmos.py
index 3b25a0b12a..a83bd0a46a 100644
--- a/src/bonsai/bonsai/bim/module/drawing/gizmos.py
+++ b/src/bonsai/bonsai/bim/module/drawing/gizmos.py
@@ -132,28 +132,31 @@ __all__ = [ # noqa: RUF022 (unsorted `__all__`)
"ExtrusionWidget",
]
-from typing import Any, Literal, Protocol, runtime_checkable, get_args
+import math
from collections.abc import Callable, Iterator
+from dataclasses import dataclass
from enum import Enum
+from typing import Any, Literal, Protocol, get_args, runtime_checkable
import blf
import bpy
import gpu
-import math
import numpy as np
from bpy import types
-from dataclasses import dataclass
-from mathutils import Vector, Matrix
-from mathutils.kdtree import KDTree
-from mathutils.geometry import intersect_line_line
-from bpy_extras.view3d_utils import region_2d_to_vector_3d, region_2d_to_origin_3d, location_3d_to_region_2d
from bpy_extras import view3d_utils
+from bpy_extras.view3d_utils import (
+ location_3d_to_region_2d,
+ region_2d_to_origin_3d,
+ region_2d_to_vector_3d,
+)
from gpu_extras.batch import batch_for_shader
-import bonsai.tool as tool
-from bonsai.tool.unit import parse_distance_string
-from bonsai.bim.module.drawing.shaders import ExtrusionGuidesShader
from ifcopenshell.util.unit import si_conversions
+from mathutils import Matrix, Vector
+from mathutils.geometry import intersect_line_line
+from mathutils.kdtree import KDTree
+import bonsai.tool as tool
+from bonsai.bim.module.drawing.shaders import ExtrusionGuidesShader
SNAP_POINT_SIZE = 10.0
SNAP_POINT_COLOR = (1.0, 0.5, 0.0, 1.0)
@@ -1024,7 +1027,7 @@ class NumericInputState:
return
input_str = self.get_input_string()
- is_valid, value = parse_distance_string(input_str)
+ is_valid, value = tool.Unit.parse_distance_string(input_str)
if is_valid:
self.parsed_value = value
diff --git a/src/bonsai/bonsai/bim/module/drawing/handler.py b/src/bonsai/bonsai/bim/module/drawing/handler.py
index 75bf62d506..026d274fb3 100644
--- a/src/bonsai/bonsai/bim/module/drawing/handler.py
+++ b/src/bonsai/bonsai/bim/module/drawing/handler.py
@@ -17,9 +17,10 @@
# along with Bonsai. If not, see .
import bpy
+from bpy.app.handlers import persistent
+
import bonsai.bim.module.drawing.decoration as decoration
import bonsai.tool as tool
-from bpy.app.handlers import persistent
@persistent
diff --git a/src/bonsai/bonsai/bim/module/drawing/helper.py b/src/bonsai/bonsai/bim/module/drawing/helper.py
index 4d99d6c91b..ee8ecf805d 100644
--- a/src/bonsai/bonsai/bim/module/drawing/helper.py
+++ b/src/bonsai/bonsai/bim/module/drawing/helper.py
@@ -16,16 +16,18 @@
# You should have received a copy of the GNU General Public License
# along with Bonsai. If not, see .
-import bpy
import math
-import ifcopenshell.util.element
-import mathutils.geometry
-import ifcopenshell
-import ifcopenshell.util.unit
-import bonsai.tool as tool
-from mathutils import Vector
from typing import Union
+import bpy
+import ifcopenshell
+import ifcopenshell.util.element
+import ifcopenshell.util.unit
+import mathutils.geometry
+from mathutils import Vector
+
+import bonsai.tool as tool
+
# Code taken and updated from https://blenderartists.org/t/detecting-intersection-of-bounding-boxes/457520/2
diff --git a/src/bonsai/bonsai/bim/module/drawing/operator.py b/src/bonsai/bonsai/bim/module/drawing/operator.py
index 936225099b..365ff90ee3 100644
--- a/src/bonsai/bonsai/bim/module/drawing/operator.py
+++ b/src/bonsai/bonsai/bim/module/drawing/operator.py
@@ -16,58 +16,73 @@
# You should have received a copy of the GNU General Public License
# along with Bonsai. If not, see .
-import os
-import bpy
-import json
-import re
-import time
-import bmesh
-import shutil
import hashlib
-import shapely
-import shapely.ops
-import subprocess
-import numpy as np
+import json
import multiprocessing
+import os
+import re
+import shutil
+import subprocess
+import time
+from math import radians
+from pathlib import Path
+from timeit import default_timer as timer
+from typing import (
+ TYPE_CHECKING,
+ Any,
+ Literal,
+ NamedTuple,
+ Optional,
+ TypedDict,
+ Union,
+ get_args,
+)
+
+import bmesh
+import bpy
import ifcopenshell
import ifcopenshell.api
import ifcopenshell.api.document
import ifcopenshell.api.pset
import ifcopenshell.api.style
-import ifcopenshell.ifcopenshell_wrapper
import ifcopenshell.geom
+import ifcopenshell.ifcopenshell_wrapper
import ifcopenshell.util.element
import ifcopenshell.util.representation
import ifcopenshell.util.selector
import ifcopenshell.util.unit
-import bonsai.bim.helper
+import numpy as np
+import shapely
+import shapely.ops
+from bpy_extras.image_utils import load_image
+from bpy_extras.io_utils import ImportHelper
+from lxml import etree
+from mathutils import Color, Matrix, Vector
+
+import bonsai.bim.export_ifc
import bonsai.bim.handler
-import bonsai.tool as tool
-import bonsai.core.geometry
-import bonsai.core.drawing as core
-import bonsai.bim.module.drawing.svgwriter as svgwriter
+import bonsai.bim.helper
import bonsai.bim.module.drawing.annotation as annotation
import bonsai.bim.module.drawing.sheeter as sheeter
-import bonsai.bim.export_ifc
-from bpy_extras.io_utils import ImportHelper
-from bonsai.bim.module.drawing.decoration import CutDecorator
+import bonsai.bim.module.drawing.svgwriter as svgwriter
+import bonsai.core.drawing as core
+import bonsai.core.geometry
+import bonsai.tool as tool
+from bonsai.bim.ifc import IfcStore
from bonsai.bim.module.drawing.data import DecoratorData, ElementValuesData
+from bonsai.bim.module.drawing.decoration import CutDecorator
+from bonsai.bim.module.drawing.prop import (
+ RASTER_STYLE_PROPERTIES_EXCLUDE,
+ RasterStyleProperty,
+)
from bonsai.bim.module.drawing.ui import get_current_product_for_element_values
from bonsai.bim.prop import StrProperty
-from typing import NamedTuple, Union, Optional, Literal, TYPE_CHECKING, Any, TypedDict, get_args
-from lxml import etree
-from math import radians
-from mathutils import Vector, Color, Matrix
-from timeit import default_timer as timer
-from bonsai.bim.module.drawing.prop import RasterStyleProperty, RASTER_STYLE_PROPERTIES_EXCLUDE
-from bonsai.bim.ifc import IfcStore
-from pathlib import Path
-from bpy_extras.image_utils import load_image
if TYPE_CHECKING:
+ from bpy.stub_internal import rna_enums
+
from bonsai.bim.module.drawing.prop import RenderType
from bonsai.bim.module.project.prop import Link
- from bpy.stub_internal import rna_enums
cwd = os.path.dirname(os.path.realpath(__file__))
diff --git a/src/bonsai/bonsai/bim/module/drawing/prop.py b/src/bonsai/bonsai/bim/module/drawing/prop.py
index 018c0a634a..3b7040bc02 100644
--- a/src/bonsai/bonsai/bim/module/drawing/prop.py
+++ b/src/bonsai/bonsai/bim/module/drawing/prop.py
@@ -16,39 +16,45 @@
# You should have received a copy of the GNU General Public License
# along with Bonsai. If not, see .
-import os
-import bpy
-import json
import enum
+import json
+import os
+from collections.abc import Callable
+from pathlib import Path
+from typing import TYPE_CHECKING, Any, Literal, Union, get_args
+
+import bpy
import ifcopenshell
import ifcopenshell.api
import ifcopenshell.api.pset
import ifcopenshell.util.element
-import bonsai.tool as tool
-import bonsai.core.drawing as core
-import bonsai.bim.module.drawing.annotation as annotation
-import bonsai.bim.module.drawing.decoration as decoration
-from mathutils import Matrix
-from bonsai.bim.prop import BIMFilterGroup
-from bonsai.bim.module.drawing.data import DrawingsData, DecoratorData, SheetsData, AnnotationData, ElementValuesData
-from bonsai.bim.module.drawing.data import refresh as refresh_drawing_data
-from pathlib import Path
-from bonsai.bim.prop import Attribute, StrProperty
-from bpy.types import PropertyGroup
from bpy.props import (
- PointerProperty,
- StringProperty,
- EnumProperty,
BoolProperty,
- IntProperty,
+ BoolVectorProperty,
+ CollectionProperty,
+ EnumProperty,
FloatProperty,
FloatVectorProperty,
- CollectionProperty,
- BoolVectorProperty,
+ IntProperty,
+ PointerProperty,
+ StringProperty,
)
-from typing import TYPE_CHECKING, Literal, Any, get_args, Union
-from collections.abc import Callable
+from bpy.types import PropertyGroup
+from mathutils import Matrix
+import bonsai.bim.module.drawing.annotation as annotation
+import bonsai.bim.module.drawing.decoration as decoration
+import bonsai.core.drawing as core
+import bonsai.tool as tool
+from bonsai.bim.module.drawing.data import (
+ AnnotationData,
+ DecoratorData,
+ DrawingsData,
+ ElementValuesData,
+ SheetsData,
+)
+from bonsai.bim.module.drawing.data import refresh as refresh_drawing_data
+from bonsai.bim.prop import Attribute, BIMFilterGroup, StrProperty
diagram_scales_enum = []
diff --git a/src/bonsai/bonsai/bim/module/drawing/scheduler.py b/src/bonsai/bonsai/bim/module/drawing/scheduler.py
index da80a46126..3b120e8d99 100644
--- a/src/bonsai/bonsai/bim/module/drawing/scheduler.py
+++ b/src/bonsai/bonsai/bim/module/drawing/scheduler.py
@@ -18,22 +18,23 @@
import os
import re
-import bpy
import string
-import svgwrite
+from pathlib import Path
+from textwrap import wrap
+
+import bpy
import openpyxl
import openpyxl.cell # Unnecessary, bug in typeshed.
import openpyxl.utils # Unnecessary, bug in typeshed.
-import bonsai.tool as tool
-
-from bonsai.bim.module.drawing.svgwriter import SvgWriter
+import svgwrite
from odf.opendocument import load as load_ods
-from odf.table import Table, TableRow, TableColumn, TableCell
-from odf.text import P
from odf.style import Style
-from textwrap import wrap
-from pathlib import Path
+from odf.table import Table, TableCell, TableColumn, TableRow
+from odf.text import P
+
+import bonsai.tool as tool
from bonsai.bim.ifc import IfcStore
+from bonsai.bim.module.drawing.svgwriter import SvgWriter
DEBUG = False
diff --git a/src/bonsai/bonsai/bim/module/drawing/shaders.py b/src/bonsai/bonsai/bim/module/drawing/shaders.py
index 020fc53147..2efd6ea285 100644
--- a/src/bonsai/bonsai/bim/module/drawing/shaders.py
+++ b/src/bonsai/bonsai/bim/module/drawing/shaders.py
@@ -16,11 +16,10 @@
# You should have received a copy of the GNU General Public License
# along with Bonsai. If not, see .
-from gpu_extras.batch import batch_for_shader
import gpu
+from gpu_extras.batch import batch_for_shader
from mathutils import Vector
-
# NOTES:
# Since Metal doesn't support geometry shaders we stick to builtin shaders
# and generate all geometry data in python before passing it to the shader.
diff --git a/src/bonsai/bonsai/bim/module/drawing/sheeter.py b/src/bonsai/bonsai/bim/module/drawing/sheeter.py
index a3ec74159a..7d8ebb67f4 100644
--- a/src/bonsai/bonsai/bim/module/drawing/sheeter.py
+++ b/src/bonsai/bonsai/bim/module/drawing/sheeter.py
@@ -16,20 +16,22 @@
# You should have received a copy of the GNU General Public License
# along with Bonsai. If not, see .
-import os
-import bpy
-import uuid
-import shutil
import ntpath
-import pystache
+import os
+import re
+import shutil
import urllib.parse
+import uuid
import xml.etree.ElementTree as ET
-import bonsai.tool as tool
-import ifcopenshell.util.geolocation
from pathlib import Path
from xml.dom import minidom
+
+import bpy
+import ifcopenshell.util.geolocation
+import pystache
from mathutils import Vector
-import re
+
+import bonsai.tool as tool
VIEW_TITLE_OFFSET_Y = 5
DRAWING_PADDING = 10
diff --git a/src/bonsai/bonsai/bim/module/drawing/svgwriter.py b/src/bonsai/bonsai/bim/module/drawing/svgwriter.py
index d1a3897a20..dac8e54a61 100644
--- a/src/bonsai/bonsai/bim/module/drawing/svgwriter.py
+++ b/src/bonsai/bonsai/bim/module/drawing/svgwriter.py
@@ -16,33 +16,34 @@
# You should have received a copy of the GNU General Public License
# along with Bonsai. If not, see .
+import math
import os
import re
-import bpy
-import math
-import bmesh
import shutil
-from bpy.types import SplineBezierPoints, SplinePoints
-import mathutils
import xml.etree.ElementTree as ET
-import svgwrite
-import svgwrite.container
-import svgwrite.text
+from collections.abc import Callable, Sequence
+from math import acos, atan, ceil, degrees, pi
+from pathlib import Path
+from typing import Optional, Self, Union
+
+import bmesh
+import bpy
import ifcopenshell
import ifcopenshell.util.element
import ifcopenshell.util.representation
import ifcopenshell.util.selector
import ifcopenshell.util.unit
-import bonsai.tool as tool
-import bonsai.bim.module.drawing.helper as helper
-from bonsai.bim.module.drawing.data import DrawingsData
-from bonsai.bim.module.drawing.data import DecoratorData
-from math import pi, ceil, atan, degrees, acos
-from mathutils import geometry, Vector
-from typing import Optional, Self, Union
-from collections.abc import Callable, Sequence
-from pathlib import Path
+import mathutils
+import svgwrite
+import svgwrite.container
+import svgwrite.text
+from bpy.types import SplineBezierPoints, SplinePoints
from markdown_it import MarkdownIt
+from mathutils import Vector, geometry
+
+import bonsai.bim.module.drawing.helper as helper
+import bonsai.tool as tool
+from bonsai.bim.module.drawing.data import DecoratorData, DrawingsData
class External(svgwrite.container.Group):
diff --git a/src/bonsai/bonsai/bim/module/drawing/ui.py b/src/bonsai/bonsai/bim/module/drawing/ui.py
index d230add8f5..45ae50beb4 100644
--- a/src/bonsai/bonsai/bim/module/drawing/ui.py
+++ b/src/bonsai/bonsai/bim/module/drawing/ui.py
@@ -17,20 +17,23 @@
# along with Bonsai. If not, see .
from __future__ import annotations
+
+from typing import TYPE_CHECKING, Optional, Union
+
import bpy
+from bpy.types import Panel
+
import bonsai.bim.helper
import bonsai.tool as tool
-from bpy.types import Panel
from bonsai.bim.module.drawing.data import (
- ProductAssignmentsData,
- SheetsData,
+ DecoratorData,
DocumentsData,
DrawingsData,
ElementFiltersData,
- DecoratorData,
ElementValuesData,
+ ProductAssignmentsData,
+ SheetsData,
)
-from typing import TYPE_CHECKING, Union, Optional
if TYPE_CHECKING:
from bonsai.bim.module.drawing.prop import DocProperties, Drawing, Sheet
diff --git a/src/bonsai/bonsai/bim/module/drawing/workspace.py b/src/bonsai/bonsai/bim/module/drawing/workspace.py
index ae593d0873..bc7463073e 100644
--- a/src/bonsai/bonsai/bim/module/drawing/workspace.py
+++ b/src/bonsai/bonsai/bim/module/drawing/workspace.py
@@ -18,18 +18,20 @@
import os
+from functools import partial
+
import bpy
import ifcopenshell.api.group
import ifcopenshell.util.element
+import ifcopenshell.util.representation
+from bpy.types import WorkSpaceTool
+
+import bonsai.core.drawing as core
import bonsai.core.geometry
import bonsai.core.type
-import bonsai.core.drawing as core
import bonsai.tool as tool
-import ifcopenshell.util.representation
-from bonsai.bim.module.drawing.data import DecoratorData, AnnotationData
from bonsai.bim.helper import prop_with_search
-from bpy.types import WorkSpaceTool
-from functools import partial
+from bonsai.bim.module.drawing.data import AnnotationData, DecoratorData
class LaunchAnnotationTypeManager(bpy.types.Operator):
@@ -166,7 +168,7 @@ def create_annotation_occurrence(context):
)
assert element
- bonsai.core.type.assign_type(tool.Ifc, tool.Type, element=element, type=relating_type)
+ bonsai.core.type.assign_type(tool.Ifc, tool.Model, tool.Type, element=element, type=relating_type)
ifcopenshell.api.group.assign_group(ifc_file, group=tool.Drawing.get_drawing_group(drawing), products=[element])
tool.Collector.assign(obj)
diff --git a/src/bonsai/bonsai/bim/module/fm/__init__.py b/src/bonsai/bonsai/bim/module/fm/__init__.py
index dc26a6379c..5b54adb71b 100644
--- a/src/bonsai/bonsai/bim/module/fm/__init__.py
+++ b/src/bonsai/bonsai/bim/module/fm/__init__.py
@@ -19,7 +19,8 @@
# pyright: reportAttributeAccessIssue=false
import bpy
-from . import ui, prop, operator
+
+from . import operator, prop, ui
classes = (
operator.ExecuteIfcFM,
diff --git a/src/bonsai/bonsai/bim/module/fm/data.py b/src/bonsai/bonsai/bim/module/fm/data.py
index fa4a9c4c6a..80a686e364 100644
--- a/src/bonsai/bonsai/bim/module/fm/data.py
+++ b/src/bonsai/bonsai/bim/module/fm/data.py
@@ -16,9 +16,10 @@
# You should have received a copy of the GNU General Public License
# along with Bonsai. If not, see .
-import os
-import ifcfm
import importlib
+import os
+
+import ifcfm
def refresh():
diff --git a/src/bonsai/bonsai/bim/module/fm/operator.py b/src/bonsai/bonsai/bim/module/fm/operator.py
index cda36598db..629251282a 100644
--- a/src/bonsai/bonsai/bim/module/fm/operator.py
+++ b/src/bonsai/bonsai/bim/module/fm/operator.py
@@ -16,16 +16,18 @@
# You should have received a copy of the GNU General Public License
# along with Bonsai. If not, see .
-import os
-import bpy
import json
-import ifcfm
import logging
+import os
import tempfile
+
+import bpy
+import ifcfm
import ifcopenshell
-import bonsai.tool as tool
from bpy_extras.io_utils import ExportHelper, ImportHelper
+import bonsai.tool as tool
+
class ExecuteIfcFM(bpy.types.Operator, ExportHelper):
bl_idname = "bim.execute_ifcfm"
diff --git a/src/bonsai/bonsai/bim/module/fm/prop.py b/src/bonsai/bonsai/bim/module/fm/prop.py
index 25db89224f..2eb1ae4739 100644
--- a/src/bonsai/bonsai/bim/module/fm/prop.py
+++ b/src/bonsai/bonsai/bim/module/fm/prop.py
@@ -16,22 +16,24 @@
# You should have received a copy of the GNU General Public License
# along with Bonsai. If not, see .
+from typing import TYPE_CHECKING, Literal
+
import bpy
+from bpy.props import (
+ BoolProperty,
+ CollectionProperty,
+ EnumProperty,
+ FloatProperty,
+ FloatVectorProperty,
+ IntProperty,
+ PointerProperty,
+ StringProperty,
+)
+from bpy.types import PropertyGroup
+
import bonsai.tool as tool
from bonsai.bim.module.fm.data import FMData
from bonsai.bim.prop import MultipleFileSelect, StrProperty
-from bpy.types import PropertyGroup
-from bpy.props import (
- PointerProperty,
- StringProperty,
- EnumProperty,
- BoolProperty,
- IntProperty,
- FloatProperty,
- FloatVectorProperty,
- CollectionProperty,
-)
-from typing import TYPE_CHECKING, Literal
def get_engine(self: "BIMFMProperties", context: object) -> tool.Blender.BLENDER_ENUM_ITEMS:
diff --git a/src/bonsai/bonsai/bim/module/fm/ui.py b/src/bonsai/bonsai/bim/module/fm/ui.py
index fa889c61fd..69e51ea6dc 100644
--- a/src/bonsai/bonsai/bim/module/fm/ui.py
+++ b/src/bonsai/bonsai/bim/module/fm/ui.py
@@ -16,8 +16,9 @@
# You should have received a copy of the GNU General Public License
# along with Bonsai. If not, see .
-import bonsai.tool as tool
from bpy.types import Panel
+
+import bonsai.tool as tool
from bonsai.bim.module.fm.data import FMData
diff --git a/src/bonsai/bonsai/bim/module/geometry/__init__.py b/src/bonsai/bonsai/bim/module/geometry/__init__.py
index de9a75fbc7..bc64947436 100644
--- a/src/bonsai/bonsai/bim/module/geometry/__init__.py
+++ b/src/bonsai/bonsai/bim/module/geometry/__init__.py
@@ -16,12 +16,14 @@
# You should have received a copy of the GNU General Public License
# along with Bonsai. If not, see .
-import bpy
-from . import ui, prop, operator
-from bpy.app.handlers import persistent
-import ifcopenshell.util.element
import math
+import bpy
+import ifcopenshell.util.element
+from bpy.app.handlers import persistent
+
+from . import operator, prop, ui
+
classes = (
operator.AddCurvelikeItem,
operator.AddHalfSpaceSolidItem,
diff --git a/src/bonsai/bonsai/bim/module/geometry/data.py b/src/bonsai/bonsai/bim/module/geometry/data.py
index 2e7d6c4205..05344ab87e 100644
--- a/src/bonsai/bonsai/bim/module/geometry/data.py
+++ b/src/bonsai/bonsai/bim/module/geometry/data.py
@@ -16,16 +16,18 @@
# You should have received a copy of the GNU General Public License
# along with Bonsai. If not, see .
+from typing import Any, Union
+
import bpy
import ifcopenshell.util.element
import ifcopenshell.util.geolocation
import ifcopenshell.util.placement
import ifcopenshell.util.representation
import ifcopenshell.util.unit
-import bonsai.tool as tool
-from typing import Any, Union
from mathutils import Vector
+import bonsai.tool as tool
+
def refresh():
ViewportData.is_loaded = False
diff --git a/src/bonsai/bonsai/bim/module/geometry/decorator.py b/src/bonsai/bonsai/bim/module/geometry/decorator.py
index 02cb4bd255..c5a82c1d59 100644
--- a/src/bonsai/bonsai/bim/module/geometry/decorator.py
+++ b/src/bonsai/bonsai/bim/module/geometry/decorator.py
@@ -16,18 +16,20 @@
# You should have received a copy of the GNU General Public License
# along with Bonsai. If not, see .
-import bpy
+from collections.abc import Sequence
+
import blf
-import gpu
import bmesh
+import bpy
+import gpu
import ifcopenshell
-import bonsai.tool as tool
import numpy as np
from bpy.types import SpaceView3D
-from mathutils import Vector, Matrix
-from gpu_extras.batch import batch_for_shader
from bpy_extras.view3d_utils import location_3d_to_region_2d
-from collections.abc import Sequence
+from gpu_extras.batch import batch_for_shader
+from mathutils import Matrix, Vector
+
+import bonsai.tool as tool
class ItemDecorator:
diff --git a/src/bonsai/bonsai/bim/module/geometry/helper.py b/src/bonsai/bonsai/bim/module/geometry/helper.py
index 7f70df4b96..511669d60d 100644
--- a/src/bonsai/bonsai/bim/module/geometry/helper.py
+++ b/src/bonsai/bonsai/bim/module/geometry/helper.py
@@ -16,19 +16,21 @@
# You should have received a copy of the GNU General Public License
# along with Bonsai. If not, see .
-import bpy
+from math import pi, pow
+from typing import Any, Optional, TypeVar, Union
+
import bmesh
-import shapely
+import bpy
+import ifcopenshell
+import ifcopenshell.util.shape
+import ifcopenshell.util.unit
import mathutils
import numpy as np
-import ifcopenshell
-import ifcopenshell.util.unit
-import ifcopenshell.util.shape
-import bonsai.tool as tool
-from math import pi, pow
-from mathutils import Vector, Matrix, geometry
-from typing import Union, Any, TypeVar, Optional
+import shapely
from ifcopenshell.util.shape_builder import ShapeBuilder
+from mathutils import Matrix, Vector, geometry
+
+import bonsai.tool as tool
T = TypeVar("T")
diff --git a/src/bonsai/bonsai/bim/module/geometry/operator.py b/src/bonsai/bonsai/bim/module/geometry/operator.py
index a35a4de7bc..15f3052935 100644
--- a/src/bonsai/bonsai/bim/module/geometry/operator.py
+++ b/src/bonsai/bonsai/bim/module/geometry/operator.py
@@ -17,17 +17,30 @@
# along with Bonsai. If not, see .
import re
-import bpy
+from collections.abc import Sequence
+from time import time
+from typing import (
+ TYPE_CHECKING,
+ Any,
+ Literal,
+ NamedTuple,
+ Union,
+ assert_never,
+ get_args,
+)
+
import bmesh
-import numpy as np
-import numpy.typing as npt
+import bpy
import ifcopenshell
+import ifcopenshell.api
+import ifcopenshell.api.boundary
import ifcopenshell.api.drawing
-import ifcopenshell.api.group
-import ifcopenshell.api.pset
import ifcopenshell.api.geometry
+import ifcopenshell.api.grid
+import ifcopenshell.api.group
import ifcopenshell.api.layer
import ifcopenshell.api.material
+import ifcopenshell.api.pset
import ifcopenshell.api.root
import ifcopenshell.api.style
import ifcopenshell.util.element
@@ -35,26 +48,23 @@ import ifcopenshell.util.placement
import ifcopenshell.util.representation
import ifcopenshell.util.shape_builder
import ifcopenshell.util.unit
-import ifcopenshell.api
-import ifcopenshell.api.boundary
-import ifcopenshell.api.grid
+import numpy as np
+import numpy.typing as npt
+from ifcopenshell.util.shape_builder import ShapeBuilder
+from mathutils import Matrix, Quaternion, Vector
+
+import bonsai.bim.handler
+import bonsai.core.aggregate
+import bonsai.core.drawing
import bonsai.core.geometry
import bonsai.core.geometry as core
-import bonsai.core.aggregate
import bonsai.core.nest
+import bonsai.core.root
import bonsai.core.spatial
import bonsai.core.style
-import bonsai.core.root
-import bonsai.core.drawing
import bonsai.tool as tool
-import bonsai.bim.handler
-from bonsai.bim.module.model.data import AuthoringData
-from mathutils import Vector, Matrix, Quaternion
-from time import time
from bonsai.bim.ifc import IfcStore
-from ifcopenshell.util.shape_builder import ShapeBuilder
-from collections.abc import Sequence
-from typing import Any, Union, Literal, get_args, TYPE_CHECKING, assert_never, NamedTuple
+from bonsai.bim.module.model.data import AuthoringData
from bonsai.bim.module.model.decorator import ProfileDecorator
if TYPE_CHECKING:
@@ -1715,40 +1725,19 @@ class RefreshLinkedAggregate(bpy.types.Operator, tool.Ifc.Operator):
# Only assign container if element is not already aggregated under another element
# Aggregated elements should not be in the spatial structure
if not ifcopenshell.util.element.get_aggregate(element):
- container = original_data[matching_group_id][index]["Container"]
bonsai.core.spatial.assign_container(
tool.Ifc,
tool.Collector,
tool.Spatial,
- container=container,
+ container=original_data[matching_group_id][index]["Container"],
element_obj=obj,
)
+ for part in ifcopenshell.util.element.get_parts(tool.Ifc.get_entity(obj)):
+ tool.Collector.assign(tool.Ifc.get_object(part))
- # Get the container's collection for moving parts in the outliner
- container_obj = tool.Ifc.get_object(container)
- container_collection = container_obj.BIMObjectProperties.collection if container_obj else None
-
- # Move all parts to the container's collection in the outliner
- if container_collection:
- for part in ifcopenshell.util.element.get_parts(element):
- part_obj = tool.Ifc.get_object(part)
- if part_obj:
- # Remove from all previous collections
- for col in part_obj.users_collection[:]:
- col.objects.unlink(part_obj)
-
- # Link to container collection
- if part_obj.name not in container_collection.objects:
- container_collection.objects.link(part_obj)
-
- # Recursively handle nested parts
- for nested_part in ifcopenshell.util.element.get_parts(part):
- nested_part_obj = tool.Ifc.get_object(nested_part)
- if nested_part_obj:
- for col in nested_part_obj.users_collection[:]:
- col.objects.unlink(nested_part_obj)
- if nested_part_obj.name not in container_collection.objects:
- container_collection.objects.link(nested_part_obj)
+ assignments = original_data[matching_group_id][index]["Assignment"]
+ if assignments:
+ assign_to_annotations(obj, assignments)
else:
try:
obj.name = original_data[matching_group_id][index]["Name"]
@@ -2053,6 +2042,7 @@ class OverrideJoin(bpy.types.Operator, tool.Ifc.Operator):
return position
items = list(representation.Items)
+ skipped_objects = []
for obj in context.selected_editable_objects:
if obj == self.target:
continue
@@ -2072,12 +2062,8 @@ class OverrideJoin(bpy.types.Operator, tool.Ifc.Operator):
assert obj_rep
if obj_rep.RepresentationType != representation_type:
obj.select_set(False)
- self.report(
- {"ERROR"},
- f"IFC join failed - object '{obj.name}' has a different representation type "
- f"({obj_rep.RepresentationType})\nthan target '{self.target.name}' ({representation_type}).",
- )
- return
+ skipped_objects.append((obj.name, obj_rep.RepresentationType))
+ continue
placement = np.array(obj.matrix_world)
placement[M_TRANSLATION] /= si_conversion
@@ -2157,6 +2143,9 @@ class OverrideJoin(bpy.types.Operator, tool.Ifc.Operator):
items.append(copied_item)
ifcopenshell.api.root.remove_product(ifc_file, product=element)
+ if skipped_objects:
+ skipped_info = ", ".join(f"'{name}' ({rep_type})" for name, rep_type in skipped_objects)
+ self.report({"INFO"}, f"Skipped incompatible objects: {skipped_info}")
representation.Items = items
bpy.ops.object.join()
core.switch_representation(
diff --git a/src/bonsai/bonsai/bim/module/geometry/prop.py b/src/bonsai/bonsai/bim/module/geometry/prop.py
index 1f8e00c11b..5336eef1c0 100644
--- a/src/bonsai/bonsai/bim/module/geometry/prop.py
+++ b/src/bonsai/bonsai/bim/module/geometry/prop.py
@@ -16,23 +16,25 @@
# You should have received a copy of the GNU General Public License
# along with Bonsai. If not, see .
-import ifcopenshell
+from typing import TYPE_CHECKING, Literal, Optional, Union
+
import bpy
-import bonsai.tool as tool
-from bonsai.bim.prop import StrProperty, Attribute, ObjProperty
-from bonsai.bim.module.geometry.data import RepresentationsData, ViewportData
-from bpy.types import PropertyGroup
+import ifcopenshell
from bpy.props import (
- PointerProperty,
- StringProperty,
- EnumProperty,
BoolProperty,
- IntProperty,
+ CollectionProperty,
+ EnumProperty,
FloatProperty,
FloatVectorProperty,
- CollectionProperty,
+ IntProperty,
+ PointerProperty,
+ StringProperty,
)
-from typing import Optional, TYPE_CHECKING, Union, Literal
+from bpy.types import PropertyGroup
+
+import bonsai.tool as tool
+from bonsai.bim.module.geometry.data import RepresentationsData, ViewportData
+from bonsai.bim.prop import Attribute, ObjProperty, StrProperty
def get_contexts(self: "BIMObjectGeometryProperties", context: bpy.types.Context) -> list[tuple[str, str, str]]:
diff --git a/src/bonsai/bonsai/bim/module/geometry/ui.py b/src/bonsai/bonsai/bim/module/geometry/ui.py
index c4ae6e5491..2af216c7a1 100644
--- a/src/bonsai/bonsai/bim/module/geometry/ui.py
+++ b/src/bonsai/bonsai/bim/module/geometry/ui.py
@@ -17,16 +17,17 @@
# along with Bonsai. If not, see .
import bpy
+from bpy.types import Menu, Panel, UIList
+
import bonsai.bim
import bonsai.tool as tool
-from bpy.types import Panel, Menu, UIList
from bonsai.bim.helper import prop_with_search
from bonsai.bim.module.geometry.data import (
- RepresentationsData,
- RepresentationItemsData,
ConnectionsData,
- PlacementData,
DerivedCoordinatesData,
+ PlacementData,
+ RepresentationItemsData,
+ RepresentationsData,
)
from bonsai.bim.module.layer.data import LayersData
diff --git a/src/bonsai/bonsai/bim/module/georeference/__init__.py b/src/bonsai/bonsai/bim/module/georeference/__init__.py
index 407cd8fead..39ee8f4143 100644
--- a/src/bonsai/bonsai/bim/module/georeference/__init__.py
+++ b/src/bonsai/bonsai/bim/module/georeference/__init__.py
@@ -17,7 +17,8 @@
# along with Bonsai. If not, see .
import bpy
-from . import ui, prop, operator
+
+from . import operator, prop, ui
classes = (
operator.AddGeoreferencing,
diff --git a/src/bonsai/bonsai/bim/module/georeference/data.py b/src/bonsai/bonsai/bim/module/georeference/data.py
index 059368abc7..cf86314f9a 100644
--- a/src/bonsai/bonsai/bim/module/georeference/data.py
+++ b/src/bonsai/bonsai/bim/module/georeference/data.py
@@ -18,14 +18,15 @@
import bpy
-import numpy as np
-import bonsai.tool as tool
import ifcopenshell.util.element
import ifcopenshell.util.geolocation
import ifcopenshell.util.schema
import ifcopenshell.util.unit
-from mathutils import Matrix, Vector
+import numpy as np
from ifcopenshell.util.doc import get_entity_doc
+from mathutils import Matrix, Vector
+
+import bonsai.tool as tool
def refresh():
diff --git a/src/bonsai/bonsai/bim/module/georeference/decorator.py b/src/bonsai/bonsai/bim/module/georeference/decorator.py
index 01818e9805..6cece45cc8 100644
--- a/src/bonsai/bonsai/bim/module/georeference/decorator.py
+++ b/src/bonsai/bonsai/bim/module/georeference/decorator.py
@@ -16,18 +16,20 @@
# You should have received a copy of the GNU General Public License
# along with Bonsai. If not, see .
-import bpy
+from math import radians
+
import blf
-import gpu
import bmesh
+import bpy
+import gpu
import ifcopenshell
import ifcopenshell.util.geolocation
-import bonsai.tool as tool
-from math import radians
from bpy.types import SpaceView3D
-from mathutils import Vector, Matrix
-from gpu_extras.batch import batch_for_shader
from bpy_extras.view3d_utils import location_3d_to_region_2d
+from gpu_extras.batch import batch_for_shader
+from mathutils import Matrix, Vector
+
+import bonsai.tool as tool
from bonsai.bim.module.georeference.data import GeoreferenceData
diff --git a/src/bonsai/bonsai/bim/module/georeference/operator.py b/src/bonsai/bonsai/bim/module/georeference/operator.py
index 7d8f98dd6c..6c82e6684c 100644
--- a/src/bonsai/bonsai/bim/module/georeference/operator.py
+++ b/src/bonsai/bonsai/bim/module/georeference/operator.py
@@ -17,10 +17,10 @@
# along with Bonsai. If not, see .
import bpy
-
-import bonsai.tool as tool
-import bonsai.core.georeference as core
from bpy_extras.io_utils import ImportHelper
+
+import bonsai.core.georeference as core
+import bonsai.tool as tool
from bonsai.bim.module.georeference.decorator import GeoreferenceDecorator
diff --git a/src/bonsai/bonsai/bim/module/georeference/prop.py b/src/bonsai/bonsai/bim/module/georeference/prop.py
index 1b6088556b..5a1a37f06f 100644
--- a/src/bonsai/bonsai/bim/module/georeference/prop.py
+++ b/src/bonsai/bonsai/bim/module/georeference/prop.py
@@ -16,24 +16,26 @@
# You should have received a copy of the GNU General Public License
# along with Bonsai. If not, see .
+from typing import TYPE_CHECKING
+
import bpy
import ifcopenshell.util.geolocation
-import bonsai.tool as tool
-from bonsai.bim.prop import Attribute
-from bpy.types import PropertyGroup
from bpy.props import (
- PointerProperty,
- StringProperty,
- EnumProperty,
BoolProperty,
- IntProperty,
+ CollectionProperty,
+ EnumProperty,
FloatProperty,
FloatVectorProperty,
- CollectionProperty,
+ IntProperty,
+ PointerProperty,
+ StringProperty,
)
+from bpy.types import PropertyGroup
+
+import bonsai.tool as tool
from bonsai.bim.module.georeference.data import GeoreferenceData
from bonsai.bim.module.georeference.decorator import GeoreferenceDecorator
-from typing import TYPE_CHECKING
+from bonsai.bim.prop import Attribute
def get_coordinate_operation_class(
diff --git a/src/bonsai/bonsai/bim/module/georeference/ui.py b/src/bonsai/bonsai/bim/module/georeference/ui.py
index 3dfec3a9f5..93e16b0fbe 100644
--- a/src/bonsai/bonsai/bim/module/georeference/ui.py
+++ b/src/bonsai/bonsai/bim/module/georeference/ui.py
@@ -16,9 +16,10 @@
# You should have received a copy of the GNU General Public License
# along with Bonsai. If not, see .
-import bonsai.tool as tool
from bpy.types import Panel
-from bonsai.bim.helper import draw_attributes, draw_attribute
+
+import bonsai.tool as tool
+from bonsai.bim.helper import draw_attribute, draw_attributes
from bonsai.bim.module.georeference.data import GeoreferenceData
diff --git a/src/bonsai/bonsai/bim/module/gis/__init__.py b/src/bonsai/bonsai/bim/module/gis/__init__.py
index 4f0707c693..2e0eeecad3 100644
--- a/src/bonsai/bonsai/bim/module/gis/__init__.py
+++ b/src/bonsai/bonsai/bim/module/gis/__init__.py
@@ -17,9 +17,8 @@
# along with Bonsai. If not, see .
import bpy
-from . import prop
-from . import operator
-from . import ui
+
+from . import operator, prop, ui
classes = (
prop.BIMCityJsonProperties,
diff --git a/src/bonsai/bonsai/bim/module/gis/prop.py b/src/bonsai/bonsai/bim/module/gis/prop.py
index bbf12aeb07..1e6ae61614 100644
--- a/src/bonsai/bonsai/bim/module/gis/prop.py
+++ b/src/bonsai/bonsai/bim/module/gis/prop.py
@@ -16,8 +16,9 @@
# You should have received a copy of the GNU General Public License
# along with Bonsai. If not, see .
+from bpy.props import BoolProperty, CollectionProperty, EnumProperty, StringProperty
from bpy.types import PropertyGroup
-from bpy.props import StringProperty, BoolProperty, EnumProperty, CollectionProperty
+
from bonsai.bim.prop import StrProperty
diff --git a/src/bonsai/bonsai/bim/module/group/__init__.py b/src/bonsai/bonsai/bim/module/group/__init__.py
index 86e8536672..6fd4ed5408 100644
--- a/src/bonsai/bonsai/bim/module/group/__init__.py
+++ b/src/bonsai/bonsai/bim/module/group/__init__.py
@@ -17,7 +17,8 @@
# along with Bonsai. If not, see .
import bpy
-from . import ui, prop, operator
+
+from . import operator, prop, ui
classes = (
operator.AddGroup,
diff --git a/src/bonsai/bonsai/bim/module/group/data.py b/src/bonsai/bonsai/bim/module/group/data.py
index 60b97e77f0..c7be2ff393 100644
--- a/src/bonsai/bonsai/bim/module/group/data.py
+++ b/src/bonsai/bonsai/bim/module/group/data.py
@@ -20,6 +20,7 @@ import bpy
import ifcopenshell
import ifcopenshell.util.cost
import ifcopenshell.util.element
+
import bonsai.tool as tool
diff --git a/src/bonsai/bonsai/bim/module/group/operator.py b/src/bonsai/bonsai/bim/module/group/operator.py
index 40c3e418a1..66872ed90a 100644
--- a/src/bonsai/bonsai/bim/module/group/operator.py
+++ b/src/bonsai/bonsai/bim/module/group/operator.py
@@ -16,13 +16,15 @@
# You should have received a copy of the GNU General Public License
# along with Bonsai. If not, see .
+from typing import TYPE_CHECKING, Literal, get_args
+
import bpy
import ifcopenshell.api
import ifcopenshell.api.group
import ifcopenshell.util.element
+
import bonsai.bim.helper
import bonsai.tool as tool
-from typing import TYPE_CHECKING, Literal, get_args
class LoadGroups(bpy.types.Operator, tool.Ifc.Operator):
diff --git a/src/bonsai/bonsai/bim/module/group/prop.py b/src/bonsai/bonsai/bim/module/group/prop.py
index e96f6f8a2a..48bff62e35 100644
--- a/src/bonsai/bonsai/bim/module/group/prop.py
+++ b/src/bonsai/bonsai/bim/module/group/prop.py
@@ -16,22 +16,24 @@
# You should have received a copy of the GNU General Public License
# along with Bonsai. If not, see .
+from typing import TYPE_CHECKING, Union
+
import bpy
-import bonsai.tool as tool
-from bonsai.bim.prop import StrProperty, Attribute
-from bonsai.bim.module.pset.data import refresh as refresh_pset
-from bpy.types import PropertyGroup
from bpy.props import (
- PointerProperty,
- StringProperty,
- EnumProperty,
BoolProperty,
- IntProperty,
+ CollectionProperty,
+ EnumProperty,
FloatProperty,
FloatVectorProperty,
- CollectionProperty,
+ IntProperty,
+ PointerProperty,
+ StringProperty,
)
-from typing import TYPE_CHECKING, Union
+from bpy.types import PropertyGroup
+
+import bonsai.tool as tool
+from bonsai.bim.module.pset.data import refresh as refresh_pset
+from bonsai.bim.prop import Attribute, StrProperty
def update_active_group_index(self, context):
diff --git a/src/bonsai/bonsai/bim/module/group/ui.py b/src/bonsai/bonsai/bim/module/group/ui.py
index ac437e9c42..a9620c8ffc 100644
--- a/src/bonsai/bonsai/bim/module/group/ui.py
+++ b/src/bonsai/bonsai/bim/module/group/ui.py
@@ -17,12 +17,15 @@
# along with Bonsai. If not, see .
from __future__ import annotations
+
+from typing import TYPE_CHECKING
+
import bpy
-import bonsai.tool as tool
from bpy.types import Panel, UIList
+
+import bonsai.tool as tool
from bonsai.bim.helper import draw_attributes
from bonsai.bim.module.group.data import GroupsData, ObjectGroupsData
-from typing import TYPE_CHECKING
if TYPE_CHECKING:
from bonsai.bim.module.group.prop import BIMGroupProperties, Group
diff --git a/src/bonsai/bonsai/bim/module/ifcgit/__init__.py b/src/bonsai/bonsai/bim/module/ifcgit/__init__.py
index ae946e4e9d..df47b7774c 100644
--- a/src/bonsai/bonsai/bim/module/ifcgit/__init__.py
+++ b/src/bonsai/bonsai/bim/module/ifcgit/__init__.py
@@ -16,8 +16,8 @@
# Massimo Fabbro
import bpy
-from . import ui, prop, operator
+from . import operator, prop, ui
classes = (
operator.AddFileToRepo,
diff --git a/src/bonsai/bonsai/bim/module/ifcgit/data.py b/src/bonsai/bonsai/bim/module/ifcgit/data.py
index 18ffe0e55c..9cb9f2655d 100644
--- a/src/bonsai/bonsai/bim/module/ifcgit/data.py
+++ b/src/bonsai/bonsai/bim/module/ifcgit/data.py
@@ -1,7 +1,8 @@
-import bpy
import os
import shutil
+import bpy
+
# import tool
import bonsai.tool as tool
diff --git a/src/bonsai/bonsai/bim/module/ifcgit/operator.py b/src/bonsai/bonsai/bim/module/ifcgit/operator.py
index 8457c69fc7..829a0a62a2 100644
--- a/src/bonsai/bonsai/bim/module/ifcgit/operator.py
+++ b/src/bonsai/bonsai/bim/module/ifcgit/operator.py
@@ -1,10 +1,12 @@
import os
import re
+from typing import TYPE_CHECKING
+
import bpy
+
import bonsai.core.ifcgit as core
import bonsai.tool as tool
from bonsai.bim.module.ifcgit.data import IfcGitData, refresh
-from typing import TYPE_CHECKING
class CreateRepo(bpy.types.Operator):
diff --git a/src/bonsai/bonsai/bim/module/ifcgit/prop.py b/src/bonsai/bonsai/bim/module/ifcgit/prop.py
index 128cfcd44b..cba3ca632c 100644
--- a/src/bonsai/bonsai/bim/module/ifcgit/prop.py
+++ b/src/bonsai/bonsai/bim/module/ifcgit/prop.py
@@ -1,15 +1,17 @@
+from typing import TYPE_CHECKING, Literal
+
import bpy
-import bonsai.tool as tool
-from bpy.types import PropertyGroup
from bpy.props import (
- StringProperty,
BoolProperty,
CollectionProperty,
- IntProperty,
EnumProperty,
+ IntProperty,
+ StringProperty,
)
+from bpy.types import PropertyGroup
+
+import bonsai.tool as tool
from bonsai.bim.module.ifcgit.data import IfcGitData
-from typing import TYPE_CHECKING, Literal
def git_branches(self: "IfcGitProperties", context: bpy.types.Context) -> tool.Blender.BLENDER_ENUM_ITEMS:
diff --git a/src/bonsai/bonsai/bim/module/ifcgit/ui.py b/src/bonsai/bonsai/bim/module/ifcgit/ui.py
index 631f33c7e1..d8b7357e7b 100644
--- a/src/bonsai/bonsai/bim/module/ifcgit/ui.py
+++ b/src/bonsai/bonsai/bim/module/ifcgit/ui.py
@@ -1,15 +1,17 @@
from __future__ import annotations
-import bpy
-import time
+
import os
import platform
-import bonsai.tool as tool
+import time
from typing import TYPE_CHECKING
+import bpy
+
+import bonsai.tool as tool
from bonsai.bim.module.ifcgit.data import IfcGitData
if TYPE_CHECKING:
- from bonsai.bim.module.ifcgit.prop import IfcGitProperties, IfcGitListItem
+ from bonsai.bim.module.ifcgit.prop import IfcGitListItem, IfcGitProperties
class IFCGIT_PT_panel(bpy.types.Panel):
diff --git a/src/bonsai/bonsai/bim/module/layer/__init__.py b/src/bonsai/bonsai/bim/module/layer/__init__.py
index 9ee1c57fb4..06d5175833 100644
--- a/src/bonsai/bonsai/bim/module/layer/__init__.py
+++ b/src/bonsai/bonsai/bim/module/layer/__init__.py
@@ -17,7 +17,8 @@
# along with Bonsai. If not, see .
import bpy
-from . import ui, prop, operator
+
+from . import operator, prop, ui
classes = (
operator.AddPresentationLayer,
diff --git a/src/bonsai/bonsai/bim/module/layer/data.py b/src/bonsai/bonsai/bim/module/layer/data.py
index f55b4c2900..4550d3257e 100644
--- a/src/bonsai/bonsai/bim/module/layer/data.py
+++ b/src/bonsai/bonsai/bim/module/layer/data.py
@@ -16,10 +16,12 @@
# You should have received a copy of the GNU General Public License
# along with Bonsai. If not, see .
+from typing import Any
+
import bpy
import ifcopenshell
+
import bonsai.tool as tool
-from typing import Any
def refresh():
diff --git a/src/bonsai/bonsai/bim/module/layer/operator.py b/src/bonsai/bonsai/bim/module/layer/operator.py
index d1b5a0580b..8475bebd54 100644
--- a/src/bonsai/bonsai/bim/module/layer/operator.py
+++ b/src/bonsai/bonsai/bim/module/layer/operator.py
@@ -16,13 +16,15 @@
# You should have received a copy of the GNU General Public License
# along with Bonsai. If not, see .
+from typing import TYPE_CHECKING
+
import bpy
import ifcopenshell.api
import ifcopenshell.api.layer
import ifcopenshell.util.element
+
import bonsai.bim.helper
import bonsai.tool as tool
-from typing import TYPE_CHECKING
def get_active_mesh(context: bpy.types.Context, mesh_name: str) -> bpy.types.Mesh:
diff --git a/src/bonsai/bonsai/bim/module/layer/prop.py b/src/bonsai/bonsai/bim/module/layer/prop.py
index 079ba262de..26a6c3680d 100644
--- a/src/bonsai/bonsai/bim/module/layer/prop.py
+++ b/src/bonsai/bonsai/bim/module/layer/prop.py
@@ -16,21 +16,23 @@
# You should have received a copy of the GNU General Public License
# along with Bonsai. If not, see .
+from typing import TYPE_CHECKING
+
import bpy
-import bonsai.tool as tool
-from bonsai.bim.prop import StrProperty, Attribute
-from bpy.types import PropertyGroup
from bpy.props import (
- PointerProperty,
- StringProperty,
- EnumProperty,
BoolProperty,
- IntProperty,
+ CollectionProperty,
+ EnumProperty,
FloatProperty,
FloatVectorProperty,
- CollectionProperty,
+ IntProperty,
+ PointerProperty,
+ StringProperty,
)
-from typing import TYPE_CHECKING
+from bpy.types import PropertyGroup
+
+import bonsai.tool as tool
+from bonsai.bim.prop import Attribute, StrProperty
def update_layer_property(self: "Layer", context: bpy.types.Context, *, property: str) -> None:
diff --git a/src/bonsai/bonsai/bim/module/layer/ui.py b/src/bonsai/bonsai/bim/module/layer/ui.py
index d7fcdec215..b4de131ad6 100644
--- a/src/bonsai/bonsai/bim/module/layer/ui.py
+++ b/src/bonsai/bonsai/bim/module/layer/ui.py
@@ -17,12 +17,15 @@
# along with Bonsai. If not, see .
from __future__ import annotations
+
+from typing import TYPE_CHECKING
+
import bpy
+from bpy.types import Mesh, Panel, UIList
+
import bonsai.tool as tool
-from bpy.types import Panel, UIList, Mesh
from bonsai.bim.helper import draw_attributes
from bonsai.bim.module.layer.data import LayersData
-from typing import TYPE_CHECKING
if TYPE_CHECKING:
from bonsai.bim.module.layer.prop import BIMLayerProperties, Layer
diff --git a/src/bonsai/bonsai/bim/module/library/__init__.py b/src/bonsai/bonsai/bim/module/library/__init__.py
index 5017772cfe..a3ef2c3060 100644
--- a/src/bonsai/bonsai/bim/module/library/__init__.py
+++ b/src/bonsai/bonsai/bim/module/library/__init__.py
@@ -17,7 +17,8 @@
# along with Bonsai. If not, see .
import bpy
-from . import ui, prop, operator
+
+from . import operator, prop, ui
classes = (
operator.AddLibrary,
diff --git a/src/bonsai/bonsai/bim/module/library/data.py b/src/bonsai/bonsai/bim/module/library/data.py
index 87ad7c23ae..0d26369035 100644
--- a/src/bonsai/bonsai/bim/module/library/data.py
+++ b/src/bonsai/bonsai/bim/module/library/data.py
@@ -17,6 +17,7 @@
# along with Bonsai. If not, see .
import bpy
+
import bonsai.tool as tool
diff --git a/src/bonsai/bonsai/bim/module/library/operator.py b/src/bonsai/bonsai/bim/module/library/operator.py
index 6f4e971465..6c7abe8be5 100644
--- a/src/bonsai/bonsai/bim/module/library/operator.py
+++ b/src/bonsai/bonsai/bim/module/library/operator.py
@@ -18,8 +18,9 @@
import bpy
import ifcopenshell.api
-import bonsai.tool as tool
+
import bonsai.core.library as core
+import bonsai.tool as tool
class AddLibrary(bpy.types.Operator, tool.Ifc.Operator):
diff --git a/src/bonsai/bonsai/bim/module/library/prop.py b/src/bonsai/bonsai/bim/module/library/prop.py
index 24defdf9ea..69647c195f 100644
--- a/src/bonsai/bonsai/bim/module/library/prop.py
+++ b/src/bonsai/bonsai/bim/module/library/prop.py
@@ -16,22 +16,24 @@
# You should have received a copy of the GNU General Public License
# along with Bonsai. If not, see .
+from typing import TYPE_CHECKING, Literal
+
import bpy
-import bonsai.tool as tool
-from bonsai.bim.prop import StrProperty, Attribute
-from bonsai.bim.module.library.data import LibrariesData
-from bpy.types import PropertyGroup
from bpy.props import (
- PointerProperty,
- StringProperty,
- EnumProperty,
BoolProperty,
- IntProperty,
+ CollectionProperty,
+ EnumProperty,
FloatProperty,
FloatVectorProperty,
- CollectionProperty,
+ IntProperty,
+ PointerProperty,
+ StringProperty,
)
-from typing import TYPE_CHECKING, Literal
+from bpy.types import PropertyGroup
+
+import bonsai.tool as tool
+from bonsai.bim.module.library.data import LibrariesData
+from bonsai.bim.prop import Attribute, StrProperty
def update_active_reference_index(self, context):
diff --git a/src/bonsai/bonsai/bim/module/library/ui.py b/src/bonsai/bonsai/bim/module/library/ui.py
index bfc64e3020..f76e6a3251 100644
--- a/src/bonsai/bonsai/bim/module/library/ui.py
+++ b/src/bonsai/bonsai/bim/module/library/ui.py
@@ -17,12 +17,15 @@
# along with Bonsai. If not, see .
from __future__ import annotations
+
+from typing import TYPE_CHECKING
+
import bpy
+from bpy.types import Panel, UIList
+
import bonsai.bim.helper
import bonsai.tool as tool
-from bpy.types import Panel, UIList
from bonsai.bim.module.library.data import LibrariesData, LibraryReferencesData
-from typing import TYPE_CHECKING
if TYPE_CHECKING:
from bonsai.bim.module.library.prop import BIMLibraryProperties, LibraryReference
diff --git a/src/bonsai/bonsai/bim/module/light/__init__.py b/src/bonsai/bonsai/bim/module/light/__init__.py
index 2785bba125..1bfe11be7a 100644
--- a/src/bonsai/bonsai/bim/module/light/__init__.py
+++ b/src/bonsai/bonsai/bim/module/light/__init__.py
@@ -16,17 +16,17 @@
# You should have received a copy of the GNU General Public License
# along with Bonsai. If not, see .
-import bpy
-from . import ui, prop, operator, list
-
-import stat
-from pathlib import Path
-
import importlib
import importlib.util
+import stat
import traceback
+from pathlib import Path
+
+import bpy
import pyradiance
+from . import list, operator, prop, ui
+
def get_pyradiance_path():
return importlib.util.find_spec("pyradiance").submodule_search_locations[0]
diff --git a/src/bonsai/bonsai/bim/module/light/data.py b/src/bonsai/bonsai/bim/module/light/data.py
index abe9d9e87d..d708b6170f 100644
--- a/src/bonsai/bonsai/bim/module/light/data.py
+++ b/src/bonsai/bonsai/bim/module/light/data.py
@@ -17,10 +17,11 @@
# along with Bonsai. If not, see .
import bpy
-import bonsai.tool as tool
import ifcopenshell.util.geolocation
from mathutils import Vector
+import bonsai.tool as tool
+
def refresh():
SolarData.is_loaded = False
diff --git a/src/bonsai/bonsai/bim/module/light/decorator.py b/src/bonsai/bonsai/bim/module/light/decorator.py
index 77cd20ddbd..9cfb9ae186 100644
--- a/src/bonsai/bonsai/bim/module/light/decorator.py
+++ b/src/bonsai/bonsai/bim/module/light/decorator.py
@@ -16,16 +16,18 @@
# You should have received a copy of the GNU General Public License
# along with Bonsai. If not, see .
-import bpy
+from math import degrees, radians
+
import blf
-import gpu
import bmesh
-import bonsai.tool as tool
+import bpy
+import gpu
from bpy.types import SpaceView3D
-from math import radians, degrees
-from mathutils import Vector, Matrix
-from gpu_extras.batch import batch_for_shader
from bpy_extras.view3d_utils import location_3d_to_region_2d
+from gpu_extras.batch import batch_for_shader
+from mathutils import Matrix, Vector
+
+import bonsai.tool as tool
from bonsai.bim.module.light.data import SolarData
diff --git a/src/bonsai/bonsai/bim/module/light/list.py b/src/bonsai/bonsai/bim/module/light/list.py
index 6eaa1f4c79..ff6b7ae4bd 100644
--- a/src/bonsai/bonsai/bim/module/light/list.py
+++ b/src/bonsai/bonsai/bim/module/light/list.py
@@ -17,13 +17,18 @@
# along with Bonsai. If not, see .
from __future__ import annotations
-import bpy
+
import json
import os
from typing import TYPE_CHECKING
+import bpy
+
if TYPE_CHECKING:
- from bonsai.bim.module.light.prop import RadianceExporterProperties, RadianceMaterial
+ from bonsai.bim.module.light.prop import (
+ RadianceExporterProperties,
+ RadianceMaterial,
+ )
with open(os.path.join(os.path.dirname(__file__), "spectraldb.json"), "r") as f:
spectraldb = json.load(f)
diff --git a/src/bonsai/bonsai/bim/module/light/operator.py b/src/bonsai/bonsai/bim/module/light/operator.py
index 4a8d993e0e..41bae9179c 100644
--- a/src/bonsai/bonsai/bim/module/light/operator.py
+++ b/src/bonsai/bonsai/bim/module/light/operator.py
@@ -16,28 +16,28 @@
# You should have received a copy of the GNU General Public License
# along with Bonsai. If not, see .
-import os
-
-import pyradiance as pr
-from datetime import datetime
-import bpy
-import bonsai.tool as tool
-from pathlib import Path
-from typing import Union, TYPE_CHECKING
import json
import math
-import time
-import ifcopenshell
-import ifcopenshell.util.geolocation
-import webbrowser
-import ifcopenshell.geom
import multiprocessing
-import requests
+import os
+import time
+import webbrowser
+from datetime import datetime
from math import radians
+from pathlib import Path
+from typing import TYPE_CHECKING, Union
+
+import bpy
+import ifcopenshell
+import ifcopenshell.geom
+import ifcopenshell.util.geolocation
+import pyradiance as pr
+import requests
+from bpy_extras.io_utils import ExportHelper, ImportHelper
from mathutils import Vector
+
+import bonsai.tool as tool
from bonsai.bim.module.light.data import SolarData
-from bpy_extras.io_utils import ExportHelper
-from bpy_extras.io_utils import ImportHelper
ifc_materials = []
diff --git a/src/bonsai/bonsai/bim/module/light/prop.py b/src/bonsai/bonsai/bim/module/light/prop.py
index e538ca1bf2..d3498f18b8 100644
--- a/src/bonsai/bonsai/bim/module/light/prop.py
+++ b/src/bonsai/bonsai/bim/module/light/prop.py
@@ -16,27 +16,29 @@
# You should have received a copy of the GNU General Public License
# along with Bonsai. If not, see .
+import datetime
+import json
+import os
+from math import pi, radians
+from typing import TYPE_CHECKING, Literal, Union
+
import bpy
import pytz
import tzfpy
-import json
-import datetime
-import bonsai.tool as tool
-from typing import TYPE_CHECKING, Literal, Union
-from math import radians, pi
-from mathutils import Euler, Vector, Matrix, Quaternion
from bpy.props import (
- IntProperty,
- StringProperty,
+ BoolProperty,
+ CollectionProperty,
EnumProperty,
FloatProperty,
FloatVectorProperty,
- BoolProperty,
- CollectionProperty,
+ IntProperty,
PointerProperty,
+ StringProperty,
)
-import os
from bpy.types import PropertyGroup
+from mathutils import Euler, Matrix, Quaternion, Vector
+
+import bonsai.tool as tool
from bonsai.bim.module.light.data import SolarData
from bonsai.bim.module.light.decorator import SolarDecorator
diff --git a/src/bonsai/bonsai/bim/module/light/ui.py b/src/bonsai/bonsai/bim/module/light/ui.py
index 0f0ffc09cb..cd4bdbb362 100644
--- a/src/bonsai/bonsai/bim/module/light/ui.py
+++ b/src/bonsai/bonsai/bim/module/light/ui.py
@@ -17,9 +17,11 @@
# along with Bonsai. If not, see .
import calendar
-import bpy
-import bonsai.tool as tool
from typing import TYPE_CHECKING
+
+import bpy
+
+import bonsai.tool as tool
from bonsai.bim.module.light.data import SolarData
diff --git a/src/bonsai/bonsai/bim/module/material/__init__.py b/src/bonsai/bonsai/bim/module/material/__init__.py
index c7f7756bc9..5f14b170ee 100644
--- a/src/bonsai/bonsai/bim/module/material/__init__.py
+++ b/src/bonsai/bonsai/bim/module/material/__init__.py
@@ -17,7 +17,8 @@
# along with Bonsai. If not, see .
import bpy
-from . import ui, prop, operator
+
+from . import operator, prop, ui
classes = (
operator.AddConstituent,
diff --git a/src/bonsai/bonsai/bim/module/material/data.py b/src/bonsai/bonsai/bim/module/material/data.py
index b56ff93e33..36c93add4f 100644
--- a/src/bonsai/bonsai/bim/module/material/data.py
+++ b/src/bonsai/bonsai/bim/module/material/data.py
@@ -17,15 +17,17 @@
# along with Bonsai. If not, see .
import os
+from typing import Any, Union
+
import bpy
import ifcopenshell
-import ifcopenshell.util.element
import ifcopenshell.util.doc
+import ifcopenshell.util.element
import ifcopenshell.util.schema
+from natsort import natsorted
+
import bonsai.tool as tool
from bonsai.bim.module.drawing.helper import format_distance
-from typing import Any, Union
-from natsort import natsorted
def refresh():
diff --git a/src/bonsai/bonsai/bim/module/material/operator.py b/src/bonsai/bonsai/bim/module/material/operator.py
index f46f2c7b6a..81ef17e6e4 100644
--- a/src/bonsai/bonsai/bim/module/material/operator.py
+++ b/src/bonsai/bonsai/bim/module/material/operator.py
@@ -16,20 +16,22 @@
# You should have received a copy of the GNU General Public License
# along with Bonsai. If not, see .
-import bpy
import json
+from typing import TYPE_CHECKING, Any, Literal, Union
+
+import bpy
import ifcopenshell.api
import ifcopenshell.api.material
import ifcopenshell.api.profile
import ifcopenshell.api.style
import ifcopenshell.util.element
import ifcopenshell.util.representation
+
import bonsai.bim.helper
-import bonsai.tool as tool
-import bonsai.core.material as core
import bonsai.bim.module.model.profile as model_profile
-from typing import Any, Union, TYPE_CHECKING, Literal
-from bonsai.bim.module.model import wall, slab
+import bonsai.core.material as core
+import bonsai.tool as tool
+from bonsai.bim.module.model import slab, wall
if TYPE_CHECKING:
from bonsai.bim.prop import Attribute
diff --git a/src/bonsai/bonsai/bim/module/material/prop.py b/src/bonsai/bonsai/bim/module/material/prop.py
index 2fbd8d2847..27567ab27e 100644
--- a/src/bonsai/bonsai/bim/module/material/prop.py
+++ b/src/bonsai/bonsai/bim/module/material/prop.py
@@ -16,26 +16,28 @@
# You should have received a copy of the GNU General Public License
# along with Bonsai. If not, see .
-import ifcopenshell
+from typing import TYPE_CHECKING
+
import bpy
+import ifcopenshell
+from bpy.props import (
+ BoolProperty,
+ CollectionProperty,
+ EnumProperty,
+ FloatProperty,
+ FloatVectorProperty,
+ IntProperty,
+ PointerProperty,
+ StringProperty,
+)
+from bpy.types import PropertyGroup
from ifcopenshell.util.doc import get_entity_doc
+
import bonsai.tool as tool
from bonsai.bim.module.classification.data import MaterialClassificationsData
from bonsai.bim.module.material.data import MaterialsData, ObjectMaterialData
from bonsai.bim.module.profile.data import ProfileData
-from bonsai.bim.prop import StrProperty, Attribute
-from bpy.types import PropertyGroup
-from bpy.props import (
- PointerProperty,
- StringProperty,
- EnumProperty,
- BoolProperty,
- IntProperty,
- FloatProperty,
- FloatVectorProperty,
- CollectionProperty,
-)
-from typing import TYPE_CHECKING
+from bonsai.bim.prop import Attribute, StrProperty
def get_profile_classes(self, context):
diff --git a/src/bonsai/bonsai/bim/module/material/ui.py b/src/bonsai/bonsai/bim/module/material/ui.py
index db05276d9b..2ac1908327 100644
--- a/src/bonsai/bonsai/bim/module/material/ui.py
+++ b/src/bonsai/bonsai/bim/module/material/ui.py
@@ -17,19 +17,21 @@
# along with Bonsai. If not, see .
from __future__ import annotations
-import bonsai.bim.helper
-import bonsai.tool as tool
+
+from typing import TYPE_CHECKING, Any
+
import bpy
import ifcopenshell.util.element
import ifcopenshell.util.unit
from bpy.types import Panel, UIList
-from bonsai.bim.helper import draw_attributes
-from bonsai.bim.helper import prop_with_search
+
+import bonsai.bim.helper
+import bonsai.tool as tool
+from bonsai.bim.helper import draw_attributes, prop_with_search
from bonsai.bim.module.material.data import MaterialsData, ObjectMaterialData
-from typing import TYPE_CHECKING, Any
if TYPE_CHECKING:
- from bonsai.bim.module.material.prop import Material, BIMMaterialProperties
+ from bonsai.bim.module.material.prop import BIMMaterialProperties, Material
class BIM_PT_materials(Panel):
diff --git a/src/bonsai/bonsai/bim/module/misc/__init__.py b/src/bonsai/bonsai/bim/module/misc/__init__.py
index 31926217fc..a71e467b7f 100644
--- a/src/bonsai/bonsai/bim/module/misc/__init__.py
+++ b/src/bonsai/bonsai/bim/module/misc/__init__.py
@@ -17,7 +17,8 @@
# along with Bonsai. If not, see .
import bpy
-from . import ui, prop, operator
+
+from . import operator, prop, ui
classes = (
operator.DrawSystemArrows,
diff --git a/src/bonsai/bonsai/bim/module/misc/operator.py b/src/bonsai/bonsai/bim/module/misc/operator.py
index ee3c592f3e..33703331f8 100644
--- a/src/bonsai/bonsai/bim/module/misc/operator.py
+++ b/src/bonsai/bonsai/bim/module/misc/operator.py
@@ -16,18 +16,20 @@
# You should have received a copy of the GNU General Public License
# along with Bonsai. If not, see .
+from typing import TYPE_CHECKING, Literal, assert_never, get_args
+
import bpy
-import numpy as np
import ifcopenshell
import ifcopenshell.util.geolocation
import ifcopenshell.util.placement
import ifcopenshell.util.unit
-import bonsai.tool as tool
-import bonsai.core.misc as core
+import numpy as np
+from mathutils import Euler, Matrix, Vector
+
import bonsai.core.geometry as core_geometry
+import bonsai.core.misc as core
import bonsai.core.root
-from mathutils import Vector, Matrix, Euler
-from typing import TYPE_CHECKING, Literal, get_args, assert_never
+import bonsai.tool as tool
class SetOverrideColour(bpy.types.Operator):
diff --git a/src/bonsai/bonsai/bim/module/misc/prop.py b/src/bonsai/bonsai/bim/module/misc/prop.py
index 3201cbd94d..889e1f5099 100644
--- a/src/bonsai/bonsai/bim/module/misc/prop.py
+++ b/src/bonsai/bonsai/bim/module/misc/prop.py
@@ -17,18 +17,19 @@
# along with Bonsai. If not, see .
import bpy
-from bonsai.bim.prop import StrProperty, Attribute
-from bpy.types import PropertyGroup
from bpy.props import (
- PointerProperty,
- StringProperty,
- EnumProperty,
BoolProperty,
- IntProperty,
+ CollectionProperty,
+ EnumProperty,
FloatProperty,
FloatVectorProperty,
- CollectionProperty,
+ IntProperty,
+ PointerProperty,
+ StringProperty,
)
+from bpy.types import PropertyGroup
+
+from bonsai.bim.prop import Attribute, StrProperty
class BIMMiscProperties(PropertyGroup):
diff --git a/src/bonsai/bonsai/bim/module/model/__init__.py b/src/bonsai/bonsai/bim/module/model/__init__.py
index c758aa7f54..57b4b561d0 100644
--- a/src/bonsai/bonsai/bim/module/model/__init__.py
+++ b/src/bonsai/bonsai/bim/module/model/__init__.py
@@ -16,33 +16,33 @@
# You should have received a copy of the GNU General Public License
# along with Bonsai. If not, see .
+from typing import NamedTuple
+
import bpy
+
from . import (
- handler,
- prop,
- ui,
- grid,
array,
+ covering,
+ door,
+ external,
+ grid,
+ handler,
+ mep,
+ opening,
product,
- wall,
+ profile,
+ prop,
+ railing,
roof,
slab,
space,
- covering,
stair,
- window,
- opening,
- mep,
- workspace,
- profile,
sverchok_modifier,
- door,
- railing,
- roof,
- mep,
- external,
+ ui,
+ wall,
+ window,
+ workspace,
)
-from typing import NamedTuple
classes = (
array.AddArray,
diff --git a/src/bonsai/bonsai/bim/module/model/array.py b/src/bonsai/bonsai/bim/module/model/array.py
index ec1bce2096..3fb9360256 100644
--- a/src/bonsai/bonsai/bim/module/model/array.py
+++ b/src/bonsai/bonsai/bim/module/model/array.py
@@ -16,15 +16,17 @@
# You should have received a copy of the GNU General Public License
# along with Bonsai. If not, see .
-import bpy
import json
+
+import bpy
import ifcopenshell
import ifcopenshell.api
import ifcopenshell.api.pset
import ifcopenshell.util.element
import ifcopenshell.util.unit
+from mathutils import Matrix, Vector
+
import bonsai.tool as tool
-from mathutils import Vector, Matrix
class AddArray(bpy.types.Operator, tool.Ifc.Operator):
diff --git a/src/bonsai/bonsai/bim/module/model/covering.py b/src/bonsai/bonsai/bim/module/model/covering.py
index 72eba944d1..468554b9be 100644
--- a/src/bonsai/bonsai/bim/module/model/covering.py
+++ b/src/bonsai/bonsai/bim/module/model/covering.py
@@ -20,8 +20,9 @@
import bpy
import ifcopenshell
import ifcopenshell.util.element
-import bonsai.tool as tool
+
import bonsai.core.covering as core
+import bonsai.tool as tool
class AddInstanceFlooringCoveringFromCursor(bpy.types.Operator, tool.Ifc.Operator):
diff --git a/src/bonsai/bonsai/bim/module/model/data.py b/src/bonsai/bonsai/bim/module/model/data.py
index 649b92b325..0b97e05e77 100644
--- a/src/bonsai/bonsai/bim/module/model/data.py
+++ b/src/bonsai/bonsai/bim/module/model/data.py
@@ -16,17 +16,19 @@
# You should have received a copy of the GNU General Public License
# along with Bonsai. If not, see .
-import bpy
-import math
import json
+import math
+from math import degrees
+from typing import Any, Optional, Union
+
+import bpy
import ifcopenshell
import ifcopenshell.util.element
import ifcopenshell.util.schema
from ifcopenshell.util.doc import get_entity_doc, get_predefined_type_doc
-import bonsai.tool as tool
-from math import degrees
from natsort import natsorted
-from typing import Union, Optional, Any
+
+import bonsai.tool as tool
def refresh():
diff --git a/src/bonsai/bonsai/bim/module/model/decorator.py b/src/bonsai/bonsai/bim/module/model/decorator.py
index 00e733b397..328804d4c6 100644
--- a/src/bonsai/bonsai/bim/module/model/decorator.py
+++ b/src/bonsai/bonsai/bim/module/model/decorator.py
@@ -17,26 +17,27 @@
# along with Bonsai. If not, see .
from __future__ import annotations
-import bpy
+
+import math
+from itertools import chain
+from math import cos, radians, sin, tan
+from typing import Any, Literal, Union
+
import blf
+import bmesh
import bpy
import gpu
-import bmesh
import ifcopenshell
-import bonsai.tool as tool
-import math
import mathutils
-from math import sin, cos, tan, radians
from bpy.types import SpaceView3D
from bpy_extras import view3d_utils
-from mathutils import Vector, Matrix, Quaternion
+from bpy_extras.view3d_utils import location_3d_to_region_2d
from gpu_extras.batch import batch_for_shader
from gpu_extras.presets import draw_circle_2d
-from typing import Union
+from mathutils import Matrix, Quaternion, Vector
+
+import bonsai.tool as tool
from bonsai.bim.module.drawing.helper import format_distance
-from itertools import chain
-from typing import Union, Any, Literal
-from bpy_extras.view3d_utils import location_3d_to_region_2d
def transparent_color(color, alpha=0.1):
diff --git a/src/bonsai/bonsai/bim/module/model/door.py b/src/bonsai/bonsai/bim/module/model/door.py
index 26d1a1a7fb..dbdf5e8dcf 100644
--- a/src/bonsai/bonsai/bim/module/model/door.py
+++ b/src/bonsai/bonsai/bim/module/model/door.py
@@ -17,8 +17,13 @@
# along with Bonsai. If not, see .
-import bpy
+import collections
+import collections.abc
+import json
+from typing import TYPE_CHECKING, get_args
+
import bmesh
+import bpy
import ifcopenshell
import ifcopenshell.api
import ifcopenshell.api.geometry
@@ -28,19 +33,14 @@ import ifcopenshell.util.element
import ifcopenshell.util.representation
import ifcopenshell.util.schema
import ifcopenshell.util.unit
-import bonsai.tool as tool
+from mathutils import Matrix, Vector
+
import bonsai.core.geometry as core
import bonsai.core.root
-from bonsai.bim.module.model.window import create_bm_window, create_bm_box
+import bonsai.tool as tool
from bonsai.bim.module.drawing import gizmos as gizmo
from bonsai.bim.module.drawing.gizmos import DimensionGizmoConfig
-
-from mathutils import Vector, Matrix
-
-import json
-import collections
-import collections.abc
-from typing import get_args, TYPE_CHECKING
+from bonsai.bim.module.model.window import create_bm_box, create_bm_window
if TYPE_CHECKING:
from bonsai.bim.module.model.prop import BIMDoorProperties
diff --git a/src/bonsai/bonsai/bim/module/model/grid.py b/src/bonsai/bonsai/bim/module/model/grid.py
index 4bac1b3f94..df4f140ebc 100644
--- a/src/bonsai/bonsai/bim/module/model/grid.py
+++ b/src/bonsai/bonsai/bim/module/model/grid.py
@@ -16,16 +16,18 @@
# You should have received a copy of the GNU General Public License
# along with Bonsai. If not, see .
+from typing import TYPE_CHECKING
+
import bpy
import ifcopenshell.api
import ifcopenshell.api.grid
-import bonsai.tool as tool
+from bpy.props import FloatProperty, IntProperty
+from bpy.types import Operator
+from mathutils import Vector
+
import bonsai.core.geometry
import bonsai.core.root
-from bpy.types import Operator
-from bpy.props import FloatProperty, IntProperty
-from mathutils import Vector
-from typing import TYPE_CHECKING
+import bonsai.tool as tool
def add_object(self: "BIM_OT_add_object", context: bpy.types.Context) -> None:
diff --git a/src/bonsai/bonsai/bim/module/model/handler.py b/src/bonsai/bonsai/bim/module/model/handler.py
index 76ebbf57ee..47075cdcfa 100644
--- a/src/bonsai/bonsai/bim/module/model/handler.py
+++ b/src/bonsai/bonsai/bim/module/model/handler.py
@@ -19,9 +19,10 @@
import bpy
import ifcopenshell
import ifcopenshell.api
-from bonsai.bim.module.model import product, wall, slab, profile, opening, task
from bpy.app.handlers import persistent
+from bonsai.bim.module.model import opening, product, profile, slab, task, wall
+
@persistent
def load_post(*args):
@@ -36,24 +37,11 @@ def load_post(*args):
"sequence.edit_task_time", "Bonsai.Task.CalculateQuantities", task.calculate_quantities
)
- ifcopenshell.api.add_post_listener(
- "type.assign_type", "Bonsai.DumbWall.RegenerateFromType", wall.DumbWallPlaner().regenerate_from_type
- )
-
- ifcopenshell.api.add_post_listener(
- "type.assign_type", "Bonsai.DumbSlab.RegenerateFromType", slab.DumbSlabPlaner().regenerate_from_type
- )
-
ifcopenshell.api.add_post_listener(
"material.edit_profile",
"Bonsai.DumbProfile.RegenerateFromProfile",
profile.DumbProfileRegenerator().regenerate_from_profile,
)
- ifcopenshell.api.add_post_listener(
- "type.assign_type",
- "Bonsai.DumbProfile.RegenerateFromType",
- profile.DumbProfileRegenerator().regenerate_from_type,
- )
ifcopenshell.api.add_post_listener(
"type.assign_type",
diff --git a/src/bonsai/bonsai/bim/module/model/mep.py b/src/bonsai/bonsai/bim/module/model/mep.py
index ab96e60b0d..cdb2538d28 100644
--- a/src/bonsai/bonsai/bim/module/model/mep.py
+++ b/src/bonsai/bonsai/bim/module/model/mep.py
@@ -16,13 +16,16 @@
# You should have received a copy of the GNU General Public License
# along with Bonsai. If not, see .
-import bpy
-import math
import collections
import collections.abc
-import bmesh
-import re
import json
+import math
+import re
+from copy import copy
+from math import asin, cos, degrees, pi, radians, sin, tan
+
+import bmesh
+import bpy
import ifcopenshell
import ifcopenshell.api
import ifcopenshell.api.geometry
@@ -35,14 +38,13 @@ import ifcopenshell.util.representation
import ifcopenshell.util.system
import ifcopenshell.util.unit
import numpy as np
-import bonsai.core.type
-import bonsai.core.root
-import bonsai.core.geometry
-import bonsai.tool as tool
-from math import pi, degrees, radians, sin, cos, asin, tan
-from copy import copy
-from mathutils import Vector, Matrix
from ifcopenshell.util.shape_builder import ShapeBuilder
+from mathutils import Matrix, Vector
+
+import bonsai.core.geometry
+import bonsai.core.root
+import bonsai.core.type
+import bonsai.tool as tool
from bonsai.bim.module.model.profile import DumbProfileJoiner
from bonsai.tool.cad import VTX_PRECISION
diff --git a/src/bonsai/bonsai/bim/module/model/opening.py b/src/bonsai/bonsai/bim/module/model/opening.py
index 256251b06c..b0806ec33d 100644
--- a/src/bonsai/bonsai/bim/module/model/opening.py
+++ b/src/bonsai/bonsai/bim/module/model/opening.py
@@ -16,38 +16,39 @@
# You should have received a copy of the GNU General Public License
# along with Bonsai. If not, see .
+import json
+import logging
+from collections import defaultdict
+from collections.abc import Sequence
+from math import pi, radians
+from typing import Any, Optional, Union, cast
+
+import bmesh
import bpy
import gpu
-import json
-import bmesh
-import shapely
-import logging
-import numpy as np
import ifcopenshell
import ifcopenshell.api
-import ifcopenshell.api.geometry
import ifcopenshell.api.feature
+import ifcopenshell.api.geometry
import ifcopenshell.api.root
import ifcopenshell.geom
-import ifcopenshell.util.shape
import ifcopenshell.util.element
-import ifcopenshell.util.shape_builder
import ifcopenshell.util.placement
import ifcopenshell.util.representation
+import ifcopenshell.util.shape
+import ifcopenshell.util.shape_builder
import ifcopenshell.util.unit
-import bonsai.tool as tool
-import bonsai.core.geometry
-import bonsai.bim.import_ifc as import_ifc
-from collections import defaultdict
-from math import pi, radians
-from mathutils import Vector, Matrix, Euler
-from bpy.types import Operator
-from bpy.types import SpaceView3D
+import numpy as np
+import shapely
from bpy.props import FloatProperty
+from bpy.types import Operator, SpaceView3D
from bpy_extras.object_utils import AddObjectHelper, object_data_add
from gpu_extras.batch import batch_for_shader
-from typing import Union, Optional, Any, cast
-from collections.abc import Sequence
+from mathutils import Euler, Matrix, Vector
+
+import bonsai.bim.import_ifc as import_ifc
+import bonsai.core.geometry
+import bonsai.tool as tool
from bonsai.bim.module.drawing.decoration import DecoratorData
diff --git a/src/bonsai/bonsai/bim/module/model/polyline.py b/src/bonsai/bonsai/bim/module/model/polyline.py
index d2514321f3..de169796f6 100644
--- a/src/bonsai/bonsai/bim/module/model/polyline.py
+++ b/src/bonsai/bonsai/bim/module/model/polyline.py
@@ -17,28 +17,31 @@
# along with Bonsai. If not, see .
from __future__ import annotations
-import bpy
+
import copy
import math
+from typing import Any, Literal, Optional, Union
+
import bmesh
+import bpy
import ifcopenshell
import ifcopenshell.api
import ifcopenshell.geom
-import ifcopenshell.util.unit
import ifcopenshell.util.element
import ifcopenshell.util.placement
import ifcopenshell.util.representation
import ifcopenshell.util.type
+import ifcopenshell.util.unit
import mathutils.geometry
-import bonsai.core.type
-import bonsai.core.root
+from lark import Lark, Transformer
+from mathutils import Vector
+
import bonsai.core.geometry
import bonsai.core.model as core
+import bonsai.core.root
+import bonsai.core.type
import bonsai.tool as tool
-from mathutils import Vector
from bonsai.bim.module.model.decorator import PolylineDecorator
-from typing import Optional, Union, Literal, Any
-from lark import Lark, Transformer
class PolylineOperator:
diff --git a/src/bonsai/bonsai/bim/module/model/product.py b/src/bonsai/bonsai/bim/module/model/product.py
index 191a9406fe..8ca5712116 100644
--- a/src/bonsai/bonsai/bim/module/model/product.py
+++ b/src/bonsai/bonsai/bim/module/model/product.py
@@ -18,38 +18,41 @@
#
# pyright: reportUnnecessaryTypeIgnoreComment=error
-import bpy
+import json
+from typing import TYPE_CHECKING, Any, Literal, Optional, Union, assert_never, get_args
+
import bmesh
-import mathutils
-import numpy as np
+import bpy
import ifcopenshell
import ifcopenshell.api
import ifcopenshell.api.geometry
import ifcopenshell.api.system
-import ifcopenshell.util.system
import ifcopenshell.util.element
import ifcopenshell.util.placement
import ifcopenshell.util.representation
import ifcopenshell.util.shape_builder
+import ifcopenshell.util.system
import ifcopenshell.util.type
import ifcopenshell.util.unit
-import bonsai.tool as tool
+import mathutils
+import numpy as np
+from bpy_extras.object_utils import AddObjectHelper
+from mathutils import Matrix, Vector
+
import bonsai.core.aggregate
-import bonsai.core.type
-import bonsai.core.root
import bonsai.core.geometry
import bonsai.core.model as core
+import bonsai.core.root
import bonsai.core.spatial
-from . import wall, slab, profile, mep
-from bonsai.bim.ifc import IfcStore
+import bonsai.core.type
+import bonsai.tool as tool
from bonsai.bim.helper import get_enum_items
+from bonsai.bim.ifc import IfcStore
from bonsai.bim.module.model.data import AuthoringData
-from bonsai.bim.module.model.polyline import PolylineOperator
from bonsai.bim.module.model.decorator import PolylineDecorator, ProductDecorator
-from mathutils import Vector, Matrix
-from bpy_extras.object_utils import AddObjectHelper
-import json
-from typing import Any, Union, Optional, Literal, get_args, assert_never, TYPE_CHECKING
+from bonsai.bim.module.model.polyline import PolylineOperator
+
+from . import mep, profile, slab, wall
class AddEmptyType(bpy.types.Operator, AddObjectHelper):
@@ -377,7 +380,7 @@ class AddOccurrence(bpy.types.Operator, tool.Ifc.Operator):
ifc_class=instance_class,
should_add_representation=False,
)
- bonsai.core.type.assign_type(tool.Ifc, tool.Type, element=element, type=relating_type)
+ bonsai.core.type.assign_type(tool.Ifc, tool.Model, tool.Type, element=element, type=relating_type)
rprops = tool.Root.get_root_props()
ifc_context = None
@@ -430,7 +433,7 @@ class AddOccurrence(bpy.types.Operator, tool.Ifc.Operator):
)
element = tool.Ifc.get_entity(obj)
- bonsai.core.type.assign_type(tool.Ifc, tool.Type, element=element, type=relating_type)
+ bonsai.core.type.assign_type(tool.Ifc, tool.Model, tool.Type, element=element, type=relating_type)
if existing_context:
representation = ifcopenshell.util.representation.get_representation(element, existing_context)
diff --git a/src/bonsai/bonsai/bim/module/model/profile.py b/src/bonsai/bonsai/bim/module/model/profile.py
index 80c7ccc20e..9271f2acc1 100644
--- a/src/bonsai/bonsai/bim/module/model/profile.py
+++ b/src/bonsai/bonsai/bim/module/model/profile.py
@@ -16,32 +16,37 @@
# You should have received a copy of the GNU General Public License
# along with Bonsai. If not, see .
-import bpy
import copy
+from math import atan2, degrees, pi
+from typing import Any, Literal, Optional, Union
+
import bmesh
-import mathutils.geometry
+import bpy
import ifcopenshell
import ifcopenshell.api
import ifcopenshell.api.geometry
import ifcopenshell.api.pset
import ifcopenshell.api.type
-import ifcopenshell.util.type
-import ifcopenshell.util.unit
import ifcopenshell.util.element
import ifcopenshell.util.placement
import ifcopenshell.util.representation
-import bonsai.tool as tool
-import bonsai.core.type
+import ifcopenshell.util.type
+import ifcopenshell.util.unit
+import mathutils.geometry
+from mathutils import Matrix, Vector
+
import bonsai.core.geometry
import bonsai.core.material
import bonsai.core.root
+import bonsai.core.type
+import bonsai.tool as tool
from bonsai.bim.ifc import IfcStore
-from math import pi, degrees, atan2
-from mathutils import Vector, Matrix
-from bonsai.bim.module.model.decorator import ProfileDecorator, PolylineDecorator, ProductDecorator
+from bonsai.bim.module.model.decorator import (
+ PolylineDecorator,
+ ProductDecorator,
+ ProfileDecorator,
+)
from bonsai.bim.module.model.polyline import PolylineOperator
-from typing import Union, Any, Optional, Literal
-
ProfileFrom2PointsReturn = Union[dict[str, Any], None]
@@ -262,22 +267,6 @@ class DumbProfileRegenerator:
results.extend(inverse.RelatedObjects)
return results
- def regenerate_from_type(self, usecase_path, ifc_file, settings):
- relating_type = settings["relating_type"]
-
- new_material = ifcopenshell.util.element.get_material(relating_type)
- if not new_material or not new_material.is_a("IfcMaterialProfileSet"):
- return
-
- for related_object in settings["related_objects"]:
- self._regenerate_from_type(related_object)
-
- def _regenerate_from_type(self, related_object: ifcopenshell.entity_instance) -> None:
- obj = tool.Ifc.get_object(related_object)
- if not obj or not tool.Geometry.get_active_representation(obj):
- return
- DumbProfileRecalculator().recalculate([obj])
-
class ExtendProfile(bpy.types.Operator, tool.Ifc.Operator):
bl_idname = "bim.extend_profile"
diff --git a/src/bonsai/bonsai/bim/module/model/prop.py b/src/bonsai/bonsai/bim/module/model/prop.py
index 4c3466d325..9f2664190d 100644
--- a/src/bonsai/bonsai/bim/module/model/prop.py
+++ b/src/bonsai/bonsai/bim/module/model/prop.py
@@ -16,22 +16,28 @@
# You should have received a copy of the GNU General Public License
# along with Bonsai. If not, see .
+import math
+from collections.abc import Callable
+from math import pi, radians
+from typing import TYPE_CHECKING, Any, Literal, Optional, Union, get_args
+
import bpy
import ifcopenshell
import ifcopenshell.util.element
+from bpy.types import NodeTree, PropertyGroup
+from mathutils import Vector
+
import bonsai.tool as tool
-import math
-from bonsai.bim.prop import ObjProperty
+from bonsai.bim.module.drawing.decoration import CutDecorator
from bonsai.bim.module.model.data import AuthoringData
-from bpy.types import PropertyGroup, NodeTree
-from math import pi, radians
-from bonsai.bim.module.model.decorator import WallAxisDecorator, SlabDirectionDecorator, BoundingBoxDecorator
+from bonsai.bim.module.model.decorator import (
+ BoundingBoxDecorator,
+ SlabDirectionDecorator,
+ WallAxisDecorator,
+)
from bonsai.bim.module.model.door import update_door_modifier_bmesh
from bonsai.bim.module.model.window import update_window_modifier_bmesh
-from bonsai.bim.module.drawing.decoration import CutDecorator
-from typing import TYPE_CHECKING, Literal, get_args, Union, Any, Optional
-from collections.abc import Callable
-from mathutils import Vector
+from bonsai.bim.prop import ObjProperty
if TYPE_CHECKING:
import sverchok.node_tree
diff --git a/src/bonsai/bonsai/bim/module/model/railing.py b/src/bonsai/bonsai/bim/module/model/railing.py
index 4f6fc348f0..624b1b64a7 100644
--- a/src/bonsai/bonsai/bim/module/model/railing.py
+++ b/src/bonsai/bonsai/bim/module/model/railing.py
@@ -17,24 +17,25 @@
# along with Bonsai. If not, see .
-import bpy
+import json
+from typing import Any
+
import bmesh
+import bpy
import ifcopenshell
import ifcopenshell.api
import ifcopenshell.api.geometry
import ifcopenshell.api.pset
import ifcopenshell.util.representation
import ifcopenshell.util.unit
-import bonsai.core.root
+from mathutils import Vector
+
import bonsai.core.geometry
+import bonsai.core.root
import bonsai.tool as tool
from bonsai.bim.module.model.data import RailingData, refresh
from bonsai.bim.module.model.decorator import ProfileDecorator
-from mathutils import Vector
-import json
-from typing import Any
-
# reference:
# https://ifc43-docs.standards.buildingsmart.org/IFC/RELEASE/IFC4x3/HTML/lexical/IfcRailing.htm
# https://ifc43-docs.standards.buildingsmart.org/IFC/RELEASE/IFC4x3/HTML/lexical/IfcRailingType.htm
diff --git a/src/bonsai/bonsai/bim/module/model/roof.py b/src/bonsai/bonsai/bim/module/model/roof.py
index daf41b86dd..4038faa993 100644
--- a/src/bonsai/bonsai/bim/module/model/roof.py
+++ b/src/bonsai/bonsai/bim/module/model/roof.py
@@ -16,27 +16,27 @@
# You should have received a copy of the GNU General Public License
# along with Bonsai. If not, see .
-import bpy
-import bmesh
+import json
+from math import cos, pi, radians, tan
+from typing import Any, Literal, Union
+import bmesh
+import bpy
import ifcopenshell
import ifcopenshell.api
import ifcopenshell.api.pset
import ifcopenshell.util.representation
import ifcopenshell.util.unit
+import mathutils.geometry
+import shapely
+from bpypolyskel import bpypolyskel
+from mathutils import Matrix, Quaternion, Vector
+
import bonsai.core.root
import bonsai.tool as tool
from bonsai.bim.module.model.data import RoofData, refresh
from bonsai.bim.module.model.decorator import ProfileDecorator
-import json
-from math import cos, tan, pi, radians
-from mathutils import Vector, Matrix, Quaternion
-import mathutils.geometry
-from bpypolyskel import bpypolyskel
-import shapely
-from typing import Literal, Union, Any
-
# reference:
# https://ifc43-docs.standards.buildingsmart.org/IFC/RELEASE/IFC4x3/HTML/lexical/IfcRoof.htm
# https://ifc43-docs.standards.buildingsmart.org/IFC/RELEASE/IFC4x3/HTML/lexical/IfcRoofType.htm
diff --git a/src/bonsai/bonsai/bim/module/model/slab.py b/src/bonsai/bonsai/bim/module/model/slab.py
index b6046df18d..509d24a60c 100644
--- a/src/bonsai/bonsai/bim/module/model/slab.py
+++ b/src/bonsai/bonsai/bim/module/model/slab.py
@@ -16,9 +16,12 @@
# You should have received a copy of the GNU General Public License
# along with Bonsai. If not, see .
-import bpy
import json
+from math import acos, cos, degrees, pi, sin
+from typing import Optional
+
import bmesh
+import bpy
import ifcopenshell
import ifcopenshell.api
import ifcopenshell.api.geometry
@@ -28,18 +31,21 @@ import ifcopenshell.api.type
import ifcopenshell.util.element
import ifcopenshell.util.placement
import ifcopenshell.util.representation
-import ifcopenshell.util.unit
import ifcopenshell.util.type
-import bonsai.core.type
+import ifcopenshell.util.unit
+from mathutils import Matrix, Vector
+
import bonsai.core.geometry
import bonsai.core.root
+import bonsai.core.type
import bonsai.tool as tool
from bonsai.bim.ifc import IfcStore
-from math import cos, sin, pi, acos, degrees
-from mathutils import Vector, Matrix
-from bonsai.bim.module.model.decorator import ProfileDecorator, PolylineDecorator, ProductDecorator
+from bonsai.bim.module.model.decorator import (
+ PolylineDecorator,
+ ProductDecorator,
+ ProfileDecorator,
+)
from bonsai.bim.module.model.polyline import PolylineOperator
-from typing import Optional
class DumbSlabGenerator:
@@ -237,38 +243,6 @@ class DumbSlabPlaner:
for element in rel.RelatedObjects:
self.change_thickness(element, total_thickness, preserve_offset=True)
- def regenerate_from_type(self, usecase_path, ifc_file, settings):
- relating_type = settings["relating_type"]
-
- new_material = ifcopenshell.util.element.get_material(relating_type)
- if not new_material or not new_material.is_a("IfcMaterialLayerSet"):
- return
-
- parametric = ifcopenshell.util.element.get_psets(settings["relating_type"]).get("EPset_Parametric")
- layer_set_direction = None
- if parametric:
- layer_set_direction = parametric.get("LayerSetDirection", layer_set_direction)
- new_thickness = sum([l.LayerThickness for l in new_material.MaterialLayers])
-
- self.unit_scale = ifcopenshell.util.unit.calculate_unit_scale(ifc_file)
- for related_object in settings["related_objects"]:
- self._regenerate_from_type(related_object, layer_set_direction, new_thickness)
-
- def _regenerate_from_type(
- self, related_object: ifcopenshell.entity_instance, layer_set_direction: Optional[str], new_thickness: float
- ) -> None:
- obj = tool.Ifc.get_object(related_object)
- if not obj or not tool.Geometry.get_active_representation(obj):
- return
-
- material = ifcopenshell.util.element.get_material(related_object)
- if not material or not material.is_a("IfcMaterialLayerSetUsage"):
- return
- if layer_set_direction:
- material.LayerSetDirection = layer_set_direction
- if material.LayerSetDirection == "AXIS3":
- self.change_thickness(related_object, new_thickness)
-
def regenerate_from_occurence(self, element, material_set_usage):
self.unit_scale = ifcopenshell.util.unit.calculate_unit_scale(tool.Ifc.get())
layer_set = material_set_usage.ForLayerSet
@@ -744,6 +718,8 @@ class EnableEditingExtrusionProfile(bpy.types.Operator, tool.Ifc.Operator):
usage_type = tool.Model.get_usage_type(element)
+ # TODO: review #7537 properly, this is a quick fix but something doesn't seem right.
+ original_rotation_x = 0
if extrusion.Position:
position = Matrix(ifcopenshell.util.placement.get_axis2placement(extrusion.Position).tolist())
position.translation *= self.unit_scale
diff --git a/src/bonsai/bonsai/bim/module/model/space.py b/src/bonsai/bonsai/bim/module/model/space.py
index aeebea071b..baa7401358 100644
--- a/src/bonsai/bonsai/bim/module/model/space.py
+++ b/src/bonsai/bonsai/bim/module/model/space.py
@@ -18,8 +18,9 @@
import bpy
-import bonsai.tool as tool
+
import bonsai.core.spatial as core
+import bonsai.tool as tool
class GenerateSpace(bpy.types.Operator, tool.Ifc.Operator):
diff --git a/src/bonsai/bonsai/bim/module/model/stair.py b/src/bonsai/bonsai/bim/module/model/stair.py
index 91ddeccbc3..5b52308542 100644
--- a/src/bonsai/bonsai/bim/module/model/stair.py
+++ b/src/bonsai/bonsai/bim/module/model/stair.py
@@ -16,25 +16,32 @@
# You should have received a copy of the GNU General Public License
# along with Bonsai. If not, see .
-import bpy
import json
+
import bmesh
+import bpy
import ifcopenshell
import ifcopenshell.api.pset
import ifcopenshell.util.element
import ifcopenshell.util.representation
import ifcopenshell.util.unit
+from mathutils import Matrix, Vector
+
import bonsai.core.root
import bonsai.tool as tool
from bonsai.bim.module.drawing import gizmos as gizmo
from bonsai.bim.module.drawing.gizmos import DimensionGizmoConfig
-from bonsai.tool.numeric_input import IntegerInputState, run_integer_input_modal, update_header
-from mathutils import Vector, Matrix
+from bonsai.tool.numeric_input import (
+ IntegerInputState,
+ run_integer_input_modal,
+ update_header,
+)
V_ = tool.Blender.V_
+from typing import TYPE_CHECKING, get_args
+
from bmesh.types import BMVert
from bpy.props import IntProperty
-from typing import get_args, TYPE_CHECKING
if TYPE_CHECKING:
from bonsai.bim.module.model.prop import BIMStairProperties
diff --git a/src/bonsai/bonsai/bim/module/model/sverchok_modifier.py b/src/bonsai/bonsai/bim/module/model/sverchok_modifier.py
index d30852f1eb..0a318b1fb1 100644
--- a/src/bonsai/bonsai/bim/module/model/sverchok_modifier.py
+++ b/src/bonsai/bonsai/bim/module/model/sverchok_modifier.py
@@ -16,18 +16,18 @@
# You should have received a copy of the GNU General Public License
# along with Bonsai. If not, see .
-import bpy
-import bmesh
+import json
+import os.path
+import zipfile
+import bmesh
+import bpy
import ifcopenshell
import ifcopenshell.api.pset
import ifcopenshell.util.element
-import bonsai.tool as tool
+from bpy_extras.io_utils import ExportHelper, ImportHelper
-import json
-import zipfile
-import os.path
-from bpy_extras.io_utils import ImportHelper, ExportHelper
+import bonsai.tool as tool
def update_sverchok_modifier(context):
diff --git a/src/bonsai/bonsai/bim/module/model/ui.py b/src/bonsai/bonsai/bim/module/model/ui.py
index 0d9aea58cd..2c931f4f45 100644
--- a/src/bonsai/bonsai/bim/module/model/ui.py
+++ b/src/bonsai/bonsai/bim/module/model/ui.py
@@ -17,24 +17,27 @@
# along with Bonsai. If not, see .
from __future__ import annotations
+
+from collections.abc import Iterable
+from typing import TYPE_CHECKING, Any
+
import bpy
+from bpy.types import Menu, Panel
+
import bonsai.bim
-from bonsai.bim import module
import bonsai.tool as tool
-from bpy.types import Panel, Menu
+from bonsai.bim import module
from bonsai.bim.helper import prop_with_search
from bonsai.bim.module.model.data import (
- AuthoringData,
ArrayData,
- StairData,
- SverchokData,
- WindowData,
+ AuthoringData,
DoorData,
RailingData,
RoofData,
+ StairData,
+ SverchokData,
+ WindowData,
)
-from collections.abc import Iterable
-from typing import Any, TYPE_CHECKING
if TYPE_CHECKING or bpy.app.version >= (5, 0, 0):
import _bl_ui_utils.layout as bl_ui_utils_layout
diff --git a/src/bonsai/bonsai/bim/module/model/wall.py b/src/bonsai/bonsai/bim/module/model/wall.py
index d343bc75ae..5276e64692 100644
--- a/src/bonsai/bonsai/bim/module/model/wall.py
+++ b/src/bonsai/bonsai/bim/module/model/wall.py
@@ -18,37 +18,39 @@
#
# pyright: reportUnnecessaryTypeIgnoreComment=error
-import bpy
import copy
import math
-import numpy as np
+from math import acos, atan2, cos, degrees, pi, sin
+from typing import TYPE_CHECKING, Any, Literal, Optional, Union, assert_never, get_args
+
+import bpy
import ifcopenshell
import ifcopenshell.api
import ifcopenshell.api.feature
+import ifcopenshell.api.geometry
import ifcopenshell.api.material
import ifcopenshell.api.pset
import ifcopenshell.api.root
import ifcopenshell.api.type
-import ifcopenshell.api.geometry
-import ifcopenshell.util.unit
import ifcopenshell.util.element
import ifcopenshell.util.placement
import ifcopenshell.util.representation
import ifcopenshell.util.shape_builder
import ifcopenshell.util.type
+import ifcopenshell.util.unit
import mathutils.geometry
-import bonsai.core.type
-import bonsai.core.root
+import numpy as np
+from mathutils import Matrix, Vector
+
import bonsai.core.geometry
import bonsai.core.model as core
+import bonsai.core.root
+import bonsai.core.type
import bonsai.tool as tool
from bonsai.bim.ifc import IfcStore
-from math import pi, sin, cos, degrees, atan2, acos
-from mathutils import Vector, Matrix
-from bonsai.bim.module.model.opening import FilledOpeningGenerator
from bonsai.bim.module.model.decorator import PolylineDecorator, ProductDecorator
+from bonsai.bim.module.model.opening import FilledOpeningGenerator
from bonsai.bim.module.model.polyline import PolylineOperator
-from typing import Optional, assert_never, TYPE_CHECKING, get_args, Literal, Union, Any
class UnjoinWalls(bpy.types.Operator, tool.Ifc.Operator):
@@ -1130,37 +1132,6 @@ class DumbWallPlaner:
walls.extend([tool.Ifc.get_object(e) for e in rel.RelatedObjects])
tool.Model.recalculate_walls([w for w in set(walls) if w])
- def regenerate_from_type(self, usecase_path, ifc_file, settings):
- relating_type = settings["relating_type"]
-
- new_material = ifcopenshell.util.element.get_material(relating_type)
- if not new_material or not new_material.is_a("IfcMaterialLayerSet"):
- return
-
- parametric = ifcopenshell.util.element.get_psets(relating_type).get("EPset_Parametric")
- layer_set_direction = None
- if parametric:
- layer_set_direction = parametric.get("LayerSetDirection", layer_set_direction)
-
- self.unit_scale = ifcopenshell.util.unit.calculate_unit_scale(ifc_file)
- for related_object in settings["related_objects"]:
- self._regenerate_from_type(related_object, layer_set_direction)
-
- def _regenerate_from_type(
- self, related_object: ifcopenshell.entity_instance, layer_set_direction: Optional[str]
- ) -> None:
- obj = tool.Ifc.get_object(related_object)
- if not obj or not tool.Geometry.get_active_representation(obj):
- return
-
- material = ifcopenshell.util.element.get_material(related_object)
- if not material or not material.is_a("IfcMaterialLayerSetUsage"):
- return
- if layer_set_direction:
- material.LayerSetDirection = layer_set_direction
- if material.LayerSetDirection == "AXIS2":
- tool.Model.recalculate_walls([obj])
-
class DumbWallJoiner:
def __init__(self):
diff --git a/src/bonsai/bonsai/bim/module/model/window.py b/src/bonsai/bonsai/bim/module/model/window.py
index 206f65de08..ad473a110e 100644
--- a/src/bonsai/bonsai/bim/module/model/window.py
+++ b/src/bonsai/bonsai/bim/module/model/window.py
@@ -17,29 +17,31 @@
# along with Bonsai. If not, see .
-import bpy
-import json
-import bmesh
import collections
import collections.abc
+import json
+from typing import TYPE_CHECKING, get_args
+
+import bmesh
+import bpy
import ifcopenshell
-import ifcopenshell.api.geometry
-import ifcopenshell.api.pset
-import bonsai.tool as tool
-import bonsai.core.root
-import bonsai.core.geometry
-from bonsai.bim.module.drawing import gizmos as gizmo
-from bonsai.bim.module.drawing.gizmos import DimensionGizmoConfig
-from ifcopenshell.api.geometry.add_window_representation import DEFAULT_PANEL_SCHEMAS
import ifcopenshell.api
+import ifcopenshell.api.geometry
import ifcopenshell.api.material
+import ifcopenshell.api.pset
import ifcopenshell.util.element
import ifcopenshell.util.representation
import ifcopenshell.util.shape_builder
import ifcopenshell.util.unit
from bmesh.types import BMVert
-from mathutils import Vector, Matrix
-from typing import get_args, TYPE_CHECKING
+from ifcopenshell.api.geometry.add_window_representation import DEFAULT_PANEL_SCHEMAS
+from mathutils import Matrix, Vector
+
+import bonsai.core.geometry
+import bonsai.core.root
+import bonsai.tool as tool
+from bonsai.bim.module.drawing import gizmos as gizmo
+from bonsai.bim.module.drawing.gizmos import DimensionGizmoConfig
if TYPE_CHECKING:
from bonsai.bim.module.model.prop import BIMWindowProperties
diff --git a/src/bonsai/bonsai/bim/module/model/workspace.py b/src/bonsai/bonsai/bim/module/model/workspace.py
index 578fbefa2a..7b7a91906d 100644
--- a/src/bonsai/bonsai/bim/module/model/workspace.py
+++ b/src/bonsai/bonsai/bim/module/model/workspace.py
@@ -18,19 +18,21 @@
import os
import sys
+from functools import partial
+from typing import Any, Optional, Union
+
import bpy
import bpy.utils.previews
+from bpy.types import Menu, WorkSpaceTool
+
import bonsai.bim
-import bonsai.tool as tool
import bonsai.core.model as core
-from bonsai.bim.module.model.wall import DumbWallJoiner, DumbWallAligner
-from bonsai.bim.helper import prop_with_search, draw_attribute
-from bpy.types import WorkSpaceTool, Menu
+import bonsai.tool as tool
+from bonsai.bim.helper import draw_attribute, prop_with_search
from bonsai.bim.module.model.data import AuthoringData, ItemData
-from bonsai.bim.module.system.data import PortData
from bonsai.bim.module.model.prop import get_ifc_class
-from typing import Optional, Union, Any
-from functools import partial
+from bonsai.bim.module.model.wall import DumbWallAligner, DumbWallJoiner
+from bonsai.bim.module.system.data import PortData
def load_custom_icons():
@@ -399,16 +401,6 @@ class EditItemUI:
assert obj
mesh_props = tool.Geometry.get_mesh_props(obj.data)
-
- # Get the parent element from representation_obj to check for layer set usage
- has_layer_set_usage = False
- props = tool.Geometry.get_geometry_props()
- if props.representation_obj:
- parent_element = tool.Ifc.get_entity(props.representation_obj)
- if parent_element:
- material_usage = tool.Model.get_usage_type(parent_element)
- has_layer_set_usage = material_usage == "LAYER3"
-
if AuthoringData.data["is_representation_item_swept_solid"]:
# TODO: support EndSweptArea for IfcRevolvedAreaSolidTapered,
# will need to add second attribute for this.
@@ -422,12 +414,8 @@ class EditItemUI:
op.profile_id = int(mesh_props.item_profile)
for item_attribute in mesh_props.item_attributes:
- # Skip depth attribute for LAYER3 objects with layer set usage
- if has_layer_set_usage and item_attribute.name.lower() == "depth":
- continue
row = cls.layout.row()
draw_attribute(item_attribute, cls.layout)
-
if len(mesh_props.item_attributes) or AuthoringData.data["is_representation_item_swept_solid"]:
row = cls.layout.row()
row.operator("bim.update_item_attributes", icon="FILE_REFRESH", text="")
diff --git a/src/bonsai/bonsai/bim/module/nest/__init__.py b/src/bonsai/bonsai/bim/module/nest/__init__.py
index 883fd00186..a4bf3de181 100644
--- a/src/bonsai/bonsai/bim/module/nest/__init__.py
+++ b/src/bonsai/bonsai/bim/module/nest/__init__.py
@@ -17,7 +17,8 @@
# along with Bonsai. If not, see .
import bpy
-from . import ui, prop, operator
+
+from . import operator, prop, ui
classes = (
operator.BIM_OT_nest_assign_object,
diff --git a/src/bonsai/bonsai/bim/module/nest/data.py b/src/bonsai/bonsai/bim/module/nest/data.py
index 77ec0d020f..abe94997fe 100644
--- a/src/bonsai/bonsai/bim/module/nest/data.py
+++ b/src/bonsai/bonsai/bim/module/nest/data.py
@@ -17,9 +17,10 @@
# along with Bonsai. If not, see .
import bpy
-import bonsai.tool as tool
import ifcopenshell.util.element
+import bonsai.tool as tool
+
def refresh():
NestData.is_loaded = False
diff --git a/src/bonsai/bonsai/bim/module/nest/decorator.py b/src/bonsai/bonsai/bim/module/nest/decorator.py
index 5a16ef8e44..e9630ebc26 100644
--- a/src/bonsai/bonsai/bim/module/nest/decorator.py
+++ b/src/bonsai/bonsai/bim/module/nest/decorator.py
@@ -21,11 +21,12 @@ import bpy
import gpu
import ifcopenshell
import ifcopenshell.util.element
-import bonsai.tool as tool
from bpy.types import SpaceView3D
from bpy_extras import view3d_utils
from gpu_extras.batch import batch_for_shader
from mathutils import Vector
+
+import bonsai.tool as tool
from bonsai.bim.module.geometry.decorator import ItemDecorator
diff --git a/src/bonsai/bonsai/bim/module/nest/operator.py b/src/bonsai/bonsai/bim/module/nest/operator.py
index 68b6839e79..9d7eb2df67 100644
--- a/src/bonsai/bonsai/bim/module/nest/operator.py
+++ b/src/bonsai/bonsai/bim/module/nest/operator.py
@@ -19,8 +19,9 @@
import bpy
import ifcopenshell
import ifcopenshell.util.element
-import bonsai.tool as tool
+
import bonsai.core.nest as core
+import bonsai.tool as tool
class BIM_OT_nest_assign_object(bpy.types.Operator, tool.Ifc.Operator):
diff --git a/src/bonsai/bonsai/bim/module/nest/prop.py b/src/bonsai/bonsai/bim/module/nest/prop.py
index 6cb787b3d4..c36388398c 100644
--- a/src/bonsai/bonsai/bim/module/nest/prop.py
+++ b/src/bonsai/bonsai/bim/module/nest/prop.py
@@ -16,23 +16,25 @@
# You should have received a copy of the GNU General Public License
# along with Bonsai. If not, see .
+from typing import TYPE_CHECKING, Union
+
import bpy
-import bonsai.tool as tool
-from bonsai.bim.prop import StrProperty, Attribute
-from bonsai.bim.module.spatial.data import SpatialData
-from bpy.types import PropertyGroup
from bpy.props import (
- PointerProperty,
- StringProperty,
- EnumProperty,
BoolProperty,
- IntProperty,
+ CollectionProperty,
+ EnumProperty,
FloatProperty,
FloatVectorProperty,
- CollectionProperty,
+ IntProperty,
+ PointerProperty,
+ StringProperty,
)
+from bpy.types import PropertyGroup
+
+import bonsai.tool as tool
from bonsai.bim.module.nest.decorator import NestDecorator, NestModeDecorator
-from typing import TYPE_CHECKING, Union
+from bonsai.bim.module.spatial.data import SpatialData
+from bonsai.bim.prop import Attribute, StrProperty
def update_relating_object(self: "BIMObjectNestProperties", context: bpy.types.Context) -> None:
diff --git a/src/bonsai/bonsai/bim/module/nest/ui.py b/src/bonsai/bonsai/bim/module/nest/ui.py
index 2ea33de49a..6d61c5d66b 100644
--- a/src/bonsai/bonsai/bim/module/nest/ui.py
+++ b/src/bonsai/bonsai/bim/module/nest/ui.py
@@ -16,8 +16,9 @@
# You should have received a copy of the GNU General Public License
# along with Bonsai. If not, see .
-import bonsai.tool as tool
from bpy.types import Panel
+
+import bonsai.tool as tool
from bonsai.bim.module.nest.data import NestData
diff --git a/src/bonsai/bonsai/bim/module/owner/__init__.py b/src/bonsai/bonsai/bim/module/owner/__init__.py
index 52c1c7cc19..6d24f2f5dc 100644
--- a/src/bonsai/bonsai/bim/module/owner/__init__.py
+++ b/src/bonsai/bonsai/bim/module/owner/__init__.py
@@ -17,7 +17,8 @@
# along with Bonsai. If not, see .
import bpy
-from . import ui, prop, operator
+
+from . import operator, prop, ui
classes = (
operator.AddActor,
diff --git a/src/bonsai/bonsai/bim/module/owner/data.py b/src/bonsai/bonsai/bim/module/owner/data.py
index 9eb5b9e4c8..88a56d4b1f 100644
--- a/src/bonsai/bonsai/bim/module/owner/data.py
+++ b/src/bonsai/bonsai/bim/module/owner/data.py
@@ -16,13 +16,15 @@
# You should have received a copy of the GNU General Public License
# along with Bonsai. If not, see .
+from typing import Any, Union
+
import bpy
import ifcopenshell
-import bonsai.tool as tool
-from typing import Any, Union
from ifcopenshell.util.doc import get_entity_doc
from natsort import natsorted
+import bonsai.tool as tool
+
def refresh():
PeopleData.is_loaded = False
diff --git a/src/bonsai/bonsai/bim/module/owner/operator.py b/src/bonsai/bonsai/bim/module/owner/operator.py
index 4d3434f00a..2470fd8227 100644
--- a/src/bonsai/bonsai/bim/module/owner/operator.py
+++ b/src/bonsai/bonsai/bim/module/owner/operator.py
@@ -16,12 +16,14 @@
# You should have received a copy of the GNU General Public License
# along with Bonsai. If not, see .
+from typing import TYPE_CHECKING, get_args
+
import bpy
-import bonsai.tool as tool
-import bonsai.core.owner as core
import ifcopenshell.api.owner
from ifcopenshell.api.owner.add_address import ADDRESS_TYPE
-from typing import TYPE_CHECKING, get_args
+
+import bonsai.core.owner as core
+import bonsai.tool as tool
if TYPE_CHECKING:
import bpy.stub_internal.rna_enums as rna_enums
diff --git a/src/bonsai/bonsai/bim/module/owner/prop.py b/src/bonsai/bonsai/bim/module/owner/prop.py
index ecd8b8f723..dfe2b95ecd 100644
--- a/src/bonsai/bonsai/bim/module/owner/prop.py
+++ b/src/bonsai/bonsai/bim/module/owner/prop.py
@@ -16,22 +16,24 @@
# You should have received a copy of the GNU General Public License
# along with Bonsai. If not, see .
-import bpy
-import bonsai.tool as tool
-from bonsai.bim.prop import StrProperty, Attribute
-from bonsai.bim.module.owner.data import OwnerData, ActorData, ObjectActorData
from typing import TYPE_CHECKING, Literal
-from bpy.types import PropertyGroup
+
+import bpy
from bpy.props import (
- PointerProperty,
- StringProperty,
- EnumProperty,
BoolProperty,
- IntProperty,
+ CollectionProperty,
+ EnumProperty,
FloatProperty,
FloatVectorProperty,
- CollectionProperty,
+ IntProperty,
+ PointerProperty,
+ StringProperty,
)
+from bpy.types import PropertyGroup
+
+import bonsai.tool as tool
+from bonsai.bim.module.owner.data import ActorData, ObjectActorData, OwnerData
+from bonsai.bim.prop import Attribute, StrProperty
def get_user_person(self: "BIMOwnerProperties", context: bpy.types.Context) -> tool.Blender.BLENDER_ENUM_ITEMS:
diff --git a/src/bonsai/bonsai/bim/module/owner/ui.py b/src/bonsai/bonsai/bim/module/owner/ui.py
index f348804d77..f1e7ae9ea3 100644
--- a/src/bonsai/bonsai/bim/module/owner/ui.py
+++ b/src/bonsai/bonsai/bim/module/owner/ui.py
@@ -16,17 +16,19 @@
# You should have received a copy of the GNU General Public License
# along with Bonsai. If not, see .
+from typing import Any
+
import bpy
+
import bonsai.bim.helper
import bonsai.tool as tool
-from typing import Any
from bonsai.bim.module.owner.data import (
- PeopleData,
+ ActorData,
+ ApplicationsData,
+ ObjectActorData,
OrganisationsData,
OwnerData,
- ActorData,
- ObjectActorData,
- ApplicationsData,
+ PeopleData,
)
diff --git a/src/bonsai/bonsai/bim/module/patch/__init__.py b/src/bonsai/bonsai/bim/module/patch/__init__.py
index 0a35e4b0d8..fd5de30d38 100644
--- a/src/bonsai/bonsai/bim/module/patch/__init__.py
+++ b/src/bonsai/bonsai/bim/module/patch/__init__.py
@@ -17,7 +17,8 @@
# along with Bonsai. If not, see .
import bpy
-from . import ui, prop, operator
+
+from . import operator, prop, ui
classes = (
operator.ExecuteIfcPatch,
diff --git a/src/bonsai/bonsai/bim/module/patch/operator.py b/src/bonsai/bonsai/bim/module/patch/operator.py
index 5ff7e998ce..57413214d6 100644
--- a/src/bonsai/bonsai/bim/module/patch/operator.py
+++ b/src/bonsai/bonsai/bim/module/patch/operator.py
@@ -16,17 +16,19 @@
# You should have received a copy of the GNU General Public License
# along with Bonsai. If not, see .
-import os
-import bpy
import json
+import os
+from pathlib import Path
+from typing import TYPE_CHECKING, cast
+
+import bpy
import ifcopenshell
import ifcpatch
-import bonsai.tool as tool
-import bonsai.core.patch as core
+from bpy_extras.io_utils import ExportHelper, ImportHelper
+
import bonsai.bim.handler
-from bpy_extras.io_utils import ImportHelper, ExportHelper
-from pathlib import Path
-from typing import cast, TYPE_CHECKING
+import bonsai.core.patch as core
+import bonsai.tool as tool
if TYPE_CHECKING:
from bonsai.bim.prop import AttributeDataType
diff --git a/src/bonsai/bonsai/bim/module/patch/prop.py b/src/bonsai/bonsai/bim/module/patch/prop.py
index 3d372e5036..9382b4e786 100644
--- a/src/bonsai/bonsai/bim/module/patch/prop.py
+++ b/src/bonsai/bonsai/bim/module/patch/prop.py
@@ -16,25 +16,26 @@
# You should have received a copy of the GNU General Public License
# along with Bonsai. If not, see .
-import bpy
import importlib
import importlib.util
from pathlib import Path
-import ifcpatch
-from bonsai.bim.prop import StrProperty, Attribute
-from bpy.types import PropertyGroup
-from bpy.props import (
- PointerProperty,
- StringProperty,
- EnumProperty,
- BoolProperty,
- IntProperty,
- FloatProperty,
- FloatVectorProperty,
- CollectionProperty,
-)
from typing import TYPE_CHECKING, Literal, Union
+import bpy
+import ifcpatch
+from bpy.props import (
+ BoolProperty,
+ CollectionProperty,
+ EnumProperty,
+ FloatProperty,
+ FloatVectorProperty,
+ IntProperty,
+ PointerProperty,
+ StringProperty,
+)
+from bpy.types import PropertyGroup
+
+from bonsai.bim.prop import Attribute, StrProperty
ifcpatchrecipes_enum: list[tuple[str, str, str]] = []
diff --git a/src/bonsai/bonsai/bim/module/patch/ui.py b/src/bonsai/bonsai/bim/module/patch/ui.py
index 8c165d692f..c3101b4705 100644
--- a/src/bonsai/bonsai/bim/module/patch/ui.py
+++ b/src/bonsai/bonsai/bim/module/patch/ui.py
@@ -17,12 +17,14 @@
# along with Bonsai. If not, see .
from __future__ import annotations
-import bpy
-import bonsai.tool as tool
-from bonsai.bim.helper import prop_with_search
-from bonsai.bim.helper import draw_attributes
+
from typing import TYPE_CHECKING
+import bpy
+
+import bonsai.tool as tool
+from bonsai.bim.helper import draw_attributes, prop_with_search
+
if TYPE_CHECKING:
from bonsai.bim.prop import Attribute
diff --git a/src/bonsai/bonsai/bim/module/profile/__init__.py b/src/bonsai/bonsai/bim/module/profile/__init__.py
index 00a6728d32..d53deebb9c 100644
--- a/src/bonsai/bonsai/bim/module/profile/__init__.py
+++ b/src/bonsai/bonsai/bim/module/profile/__init__.py
@@ -17,7 +17,8 @@
# along with Bonsai. If not, see .
import bpy
-from . import ui, prop, operator, data
+
+from . import data, operator, prop, ui
classes = (
operator.AddProfileDef,
diff --git a/src/bonsai/bonsai/bim/module/profile/data.py b/src/bonsai/bonsai/bim/module/profile/data.py
index eb21a72f25..34ea4d1b7b 100644
--- a/src/bonsai/bonsai/bim/module/profile/data.py
+++ b/src/bonsai/bonsai/bim/module/profile/data.py
@@ -16,12 +16,14 @@
# You should have received a copy of the GNU General Public License
# along with Bonsai. If not, see .
+from typing import Any
+
import bpy
import bpy.utils
import bpy.utils.previews
import ifcopenshell.util.doc
+
import bonsai.tool as tool
-from typing import Any
def refresh():
diff --git a/src/bonsai/bonsai/bim/module/profile/operator.py b/src/bonsai/bonsai/bim/module/profile/operator.py
index 99f47923e4..871d8f3b86 100644
--- a/src/bonsai/bonsai/bim/module/profile/operator.py
+++ b/src/bonsai/bonsai/bim/module/profile/operator.py
@@ -20,14 +20,15 @@ import bpy
import ifcopenshell.api
import ifcopenshell.api.profile
import ifcopenshell.util.element
+
import bonsai.bim.helper
-import bonsai.tool as tool
import bonsai.bim.module.model.profile as model_profile
import bonsai.core.profile as core
-from bonsai.bim.module.model.decorator import ProfileDecorator
-from bonsai.bim.module.profile.prop import generate_thumbnail_for_active_profile
-from bonsai.bim.module.profile.data import refresh
+import bonsai.tool as tool
from bonsai.bim.module.geometry.helper import Helper
+from bonsai.bim.module.model.decorator import ProfileDecorator
+from bonsai.bim.module.profile.data import refresh
+from bonsai.bim.module.profile.prop import generate_thumbnail_for_active_profile
class LoadProfiles(bpy.types.Operator):
diff --git a/src/bonsai/bonsai/bim/module/profile/prop.py b/src/bonsai/bonsai/bim/module/profile/prop.py
index f69f6a6cd9..61e2546193 100644
--- a/src/bonsai/bonsai/bim/module/profile/prop.py
+++ b/src/bonsai/bonsai/bim/module/profile/prop.py
@@ -16,25 +16,27 @@
# You should have received a copy of the GNU General Public License
# along with Bonsai. If not, see .
+from typing import TYPE_CHECKING, Union
+
import bpy
import ifcopenshell
-import ifcopenshell.util.schema
import ifcopenshell.util.attribute
-import bonsai.tool as tool
-from bonsai.bim.prop import StrProperty, Attribute
-from bonsai.bim.module.profile.data import ProfileData
-from bpy.types import PropertyGroup
+import ifcopenshell.util.schema
from bpy.props import (
- PointerProperty,
- StringProperty,
- EnumProperty,
BoolProperty,
- IntProperty,
+ CollectionProperty,
+ EnumProperty,
FloatProperty,
FloatVectorProperty,
- CollectionProperty,
+ IntProperty,
+ PointerProperty,
+ StringProperty,
)
-from typing import TYPE_CHECKING, Union
+from bpy.types import PropertyGroup
+
+import bonsai.tool as tool
+from bonsai.bim.module.profile.data import ProfileData
+from bonsai.bim.prop import Attribute, StrProperty
def get_profile_classes(self: "BIMProfileProperties", context: bpy.types.Context) -> list[tuple[str, str, str]]:
diff --git a/src/bonsai/bonsai/bim/module/profile/ui.py b/src/bonsai/bonsai/bim/module/profile/ui.py
index 33b8ca7d58..3128fe82ea 100644
--- a/src/bonsai/bonsai/bim/module/profile/ui.py
+++ b/src/bonsai/bonsai/bim/module/profile/ui.py
@@ -17,13 +17,16 @@
# along with Bonsai. If not, see .
from __future__ import annotations
+
+from typing import TYPE_CHECKING
+
import bpy
+from bpy.types import Panel, UIList
+
import bonsai.bim.helper
import bonsai.tool as tool
-from bpy.types import Panel, UIList
from bonsai.bim.module.profile.data import ProfileData
from bonsai.bim.module.profile.prop import generate_thumbnail_for_active_profile
-from typing import TYPE_CHECKING
if TYPE_CHECKING:
from bonsai.bim.module.profile.prop import BIMProfileProperties, Profile
diff --git a/src/bonsai/bonsai/bim/module/project/__init__.py b/src/bonsai/bonsai/bim/module/project/__init__.py
index 26961b8c64..53ebaff14e 100644
--- a/src/bonsai/bonsai/bim/module/project/__init__.py
+++ b/src/bonsai/bonsai/bim/module/project/__init__.py
@@ -17,7 +17,8 @@
# along with Bonsai. If not, see .
import bpy
-from . import ui, prop, operator, workspace, gizmo, decorator
+
+from . import decorator, gizmo, operator, prop, ui, workspace
classes = (
operator.AddProjectLibrary,
diff --git a/src/bonsai/bonsai/bim/module/project/data.py b/src/bonsai/bonsai/bim/module/project/data.py
index 1f51737205..e2e960b382 100644
--- a/src/bonsai/bonsai/bim/module/project/data.py
+++ b/src/bonsai/bonsai/bim/module/project/data.py
@@ -17,13 +17,15 @@
# along with Bonsai. If not, see .
import os
-import bpy
-import bonsai.tool as tool
-import ifcopenshell.util.file
-from bonsai.bim.ifc import IfcStore
-from pathlib import Path
from collections import defaultdict
-from typing import Union, Any
+from pathlib import Path
+from typing import Any, Union
+
+import bpy
+import ifcopenshell.util.file
+
+import bonsai.tool as tool
+from bonsai.bim.ifc import IfcStore
def refresh():
diff --git a/src/bonsai/bonsai/bim/module/project/decorator.py b/src/bonsai/bonsai/bim/module/project/decorator.py
index fbb3e9ae97..14035ca91c 100644
--- a/src/bonsai/bonsai/bim/module/project/decorator.py
+++ b/src/bonsai/bonsai/bim/module/project/decorator.py
@@ -16,17 +16,19 @@
# You should have received a copy of the GNU General Public License
# along with Bonsai. If not, see .
-import gpu
+from typing import Union
+
import blf
-import bpy
import bmesh
-import bonsai.tool as tool
+import bpy
+import gpu
+from bpy.app.handlers import persistent
from bpy.types import SpaceView3D
from bpy_extras import view3d_utils
-from mathutils import Vector
from gpu_extras.batch import batch_for_shader
-from bpy.app.handlers import persistent
-from typing import Union
+from mathutils import Vector
+
+import bonsai.tool as tool
from bonsai.bim.module.model.decorator import PolylineDecorator
diff --git a/src/bonsai/bonsai/bim/module/project/gizmo.py b/src/bonsai/bonsai/bim/module/project/gizmo.py
index bb372b9cb7..d91668eaa8 100644
--- a/src/bonsai/bonsai/bim/module/project/gizmo.py
+++ b/src/bonsai/bonsai/bim/module/project/gizmo.py
@@ -18,10 +18,11 @@
import bpy
-import bonsai.tool as tool
from bpy.types import GizmoGroup
from mathutils import Matrix
+import bonsai.tool as tool
+
class ClippingPlane(GizmoGroup):
bl_idname = "OBJECT_GGT_bim_clipping_plane"
diff --git a/src/bonsai/bonsai/bim/module/project/operator.py b/src/bonsai/bonsai/bim/module/project/operator.py
index b0f74cfb40..8fad709de3 100644
--- a/src/bonsai/bonsai/bim/module/project/operator.py
+++ b/src/bonsai/bonsai/bim/module/project/operator.py
@@ -16,58 +16,63 @@
# You should have received a copy of the GNU General Public License
# along with Bonsai. If not, see .
-import os
-import bpy
-import time
+import datetime
import json
import logging
-import tempfile
-import traceback
+import os
import subprocess
-import datetime
-import ifcopenshell.api.attribute
-import numpy as np
+import tempfile
+import time
+import traceback
+from collections import defaultdict
+from math import radians
+from pathlib import Path
+from typing import TYPE_CHECKING, Literal, Union, get_args
+
+import bpy
import ifcopenshell
import ifcopenshell.api
+import ifcopenshell.api.attribute
import ifcopenshell.api.nest
import ifcopenshell.api.project
import ifcopenshell.api.root
import ifcopenshell.geom
import ifcopenshell.ifcopenshell_wrapper as W
+import ifcopenshell.util.element
import ifcopenshell.util.file
-import ifcopenshell.util.selector
import ifcopenshell.util.geolocation
import ifcopenshell.util.representation
-import ifcopenshell.util.element
-import ifcopenshell.util.representation
+import ifcopenshell.util.selector
import ifcopenshell.util.shape
import ifcopenshell.util.shape_builder
import ifcopenshell.util.unit
+import numpy as np
+from bpy.app.handlers import persistent
+from bpy_extras.io_utils import ExportHelper, ImportHelper
+from ifcopenshell.geom import ShapeElementType
+from mathutils import Matrix, Vector
+
import bonsai.bim.handler
import bonsai.bim.helper
import bonsai.bim.schema
-import bonsai.tool as tool
import bonsai.core.project as core
-from bpy_extras.io_utils import ExportHelper, ImportHelper
+import bonsai.tool as tool
+from bonsai.bim import export_ifc, import_ifc
from bonsai.bim.ifc import IfcStore
-from bonsai.bim.ui import IFCFileSelector
-from bonsai.bim import import_ifc
-from bonsai.bim import export_ifc
-from math import radians
-from pathlib import Path
-from collections import defaultdict
-from mathutils import Vector, Matrix
-from bpy.app.handlers import persistent
-from ifcopenshell.geom import ShapeElementType
-from bonsai.bim.module.project.data import LinksData, ProjectLibraryData
-from bonsai.bim.module.project.decorator import ProjectDecorator, ClippingPlaneDecorator, MeasureDecorator
-from bonsai.bim.module.project.prop import BreadcrumbType
-from bonsai.bim.module.model.decorator import PolylineDecorator, FaceAreaDecorator
+from bonsai.bim.module.model.decorator import FaceAreaDecorator, PolylineDecorator
from bonsai.bim.module.model.polyline import PolylineOperator
-from typing import Union, TYPE_CHECKING, get_args, Literal
+from bonsai.bim.module.project.data import LinksData, ProjectLibraryData
+from bonsai.bim.module.project.decorator import (
+ ClippingPlaneDecorator,
+ MeasureDecorator,
+ ProjectDecorator,
+)
+from bonsai.bim.module.project.prop import BreadcrumbType
+from bonsai.bim.ui import IFCFileSelector
if TYPE_CHECKING:
import bpy.stub_internal.rna_enums as rna_enums
+
from bonsai.bim.module.project.prop import Link
@@ -119,8 +124,6 @@ class NewProject(bpy.types.Operator):
bpy.context.scene.unit_settings.length_unit = "MILLIMETERS"
bim_props.area_unit = "SQUARE_METRE"
bim_props.volume_unit = "CUBIC_METRE"
- bim_props.mass_unit = "KILOGRAM"
- bim_props.time_unit = "SECOND"
pprops.template_file = "IFC4 Demo Template.ifc"
if self.preset != "wizard":
@@ -1850,9 +1853,10 @@ class LoadLinkedProject(bpy.types.Operator, ImportHelper):
return ImportHelper.invoke(self, context, event)
def execute(self, context):
- import ifcpatch
import multiprocessing
+ import ifcpatch
+
start = time.time()
pprops = tool.Project.get_project_props()
@@ -2162,7 +2166,11 @@ class QueryLinkedElement(bpy.types.Operator):
def execute(self, context):
import sqlite3
- from bpy_extras.view3d_utils import region_2d_to_vector_3d, region_2d_to_origin_3d
+
+ from bpy_extras.view3d_utils import (
+ region_2d_to_origin_3d,
+ region_2d_to_vector_3d,
+ )
LinksData.linked_data = {}
props = tool.Project.get_project_props()
@@ -2507,9 +2515,10 @@ class RefreshClippingPlanes(bpy.types.Operator):
break
def refresh_clipping_planes(self, context):
- import bmesh
from itertools import cycle
+ import bmesh
+
area = next(a for a in bpy.context.screen.areas if a.type == "VIEW_3D")
region = next(r for r in area.regions if r.type == "WINDOW")
data = region.data
@@ -2569,7 +2578,10 @@ class CreateClippingPlane(bpy.types.Operator):
bl_options = {"REGISTER", "UNDO"}
def execute(self, context):
- from bpy_extras.view3d_utils import region_2d_to_vector_3d, region_2d_to_origin_3d
+ from bpy_extras.view3d_utils import (
+ region_2d_to_origin_3d,
+ region_2d_to_vector_3d,
+ )
# Clean up deleted planes
props = tool.Project.get_project_props()
diff --git a/src/bonsai/bonsai/bim/module/project/prop.py b/src/bonsai/bonsai/bim/module/project/prop.py
index 6894392437..ea5c9c843a 100644
--- a/src/bonsai/bonsai/bim/module/project/prop.py
+++ b/src/bonsai/bonsai/bim/module/project/prop.py
@@ -17,26 +17,28 @@
# along with Bonsai. If not, see .
import os
+from collections.abc import Generator
+from typing import TYPE_CHECKING, Literal, Union, assert_never, get_args
+
import bpy
import ifcopenshell.util.element
import ifcopenshell.util.placement
-import bonsai.tool as tool
-import bonsai.bim.helper
-from bonsai.bim.module.project.data import ProjectData, ProjectLibraryData
-from bonsai.bim.ifc import IfcStore
-from bonsai.bim.prop import StrProperty, ObjProperty, Attribute
-from bpy.types import PropertyGroup
from bpy.props import (
- PointerProperty,
BoolProperty,
CollectionProperty,
EnumProperty,
FloatProperty,
IntProperty,
+ PointerProperty,
StringProperty,
)
-from typing import TYPE_CHECKING, Literal, Union, get_args, assert_never
-from collections.abc import Generator
+from bpy.types import PropertyGroup
+
+import bonsai.bim.helper
+import bonsai.tool as tool
+from bonsai.bim.ifc import IfcStore
+from bonsai.bim.module.project.data import ProjectData, ProjectLibraryData
+from bonsai.bim.prop import Attribute, ObjProperty, StrProperty
def get_export_schema(self: "BIMProjectProperties", context: bpy.types.Context) -> list[tuple[str, str, str]]:
diff --git a/src/bonsai/bonsai/bim/module/project/ui.py b/src/bonsai/bonsai/bim/module/project/ui.py
index ac70720dbe..79ed2c7d7a 100644
--- a/src/bonsai/bonsai/bim/module/project/ui.py
+++ b/src/bonsai/bonsai/bim/module/project/ui.py
@@ -17,19 +17,27 @@
# along with Bonsai. If not, see .
from __future__ import annotations
-import bpy
+
import os
-import ifcopenshell
-import bonsai.bim
-import bonsai.tool as tool
-from bonsai.bim.helper import prop_with_search, draw_attributes
-from bpy.types import Panel, Menu, UIList
-from bonsai.bim.ifc import IfcStore
-from bonsai.bim.module.project.data import ProjectData, LinksData
from typing import TYPE_CHECKING
+import bpy
+import ifcopenshell
+from bpy.types import Menu, Panel, UIList
+
+import bonsai.bim
+import bonsai.tool as tool
+from bonsai.bim.helper import draw_attributes, prop_with_search
+from bonsai.bim.ifc import IfcStore
+from bonsai.bim.module.project.data import LinksData, ProjectData
+
if TYPE_CHECKING:
- from bonsai.bim.module.project.prop import LibraryElement, BIMProjectProperties, FilterCategory, Link
+ from bonsai.bim.module.project.prop import (
+ BIMProjectProperties,
+ FilterCategory,
+ LibraryElement,
+ Link,
+ )
def file_import_menu(self, context):
diff --git a/src/bonsai/bonsai/bim/module/project/workspace.py b/src/bonsai/bonsai/bim/module/project/workspace.py
index 59b86e431d..a72981c625 100644
--- a/src/bonsai/bonsai/bim/module/project/workspace.py
+++ b/src/bonsai/bonsai/bim/module/project/workspace.py
@@ -17,9 +17,11 @@
# along with Bonsai. If not, see .
import os
+
import bpy
-import bonsai.tool as tool
from bpy.types import WorkSpaceTool
+
+import bonsai.tool as tool
from bonsai.bim.module.project.data import LinksData
diff --git a/src/bonsai/bonsai/bim/module/pset/__init__.py b/src/bonsai/bonsai/bim/module/pset/__init__.py
index 7e0d72061b..5284e88f36 100644
--- a/src/bonsai/bonsai/bim/module/pset/__init__.py
+++ b/src/bonsai/bonsai/bim/module/pset/__init__.py
@@ -17,7 +17,8 @@
# along with Bonsai. If not, see .
import bpy
-from . import ui, prop, operator
+
+from . import operator, prop, ui
classes = (
operator.AddProposedProp,
diff --git a/src/bonsai/bonsai/bim/module/pset/data.py b/src/bonsai/bonsai/bim/module/pset/data.py
index 12b38efc98..969f54f387 100644
--- a/src/bonsai/bonsai/bim/module/pset/data.py
+++ b/src/bonsai/bonsai/bim/module/pset/data.py
@@ -23,9 +23,9 @@ import ifcopenshell
import ifcopenshell.util.attribute
import ifcopenshell.util.doc
import ifcopenshell.util.element
-import bonsai.tool as tool
-import bonsai.bim.schema
+import bonsai.bim.schema
+import bonsai.tool as tool
# TODO: Should this cache belong here? Dunno. Maybe.
is_expanded: dict[int, bool] = {}
diff --git a/src/bonsai/bonsai/bim/module/pset/operator.py b/src/bonsai/bonsai/bim/module/pset/operator.py
index 4e063b4ada..3257760531 100644
--- a/src/bonsai/bonsai/bim/module/pset/operator.py
+++ b/src/bonsai/bonsai/bim/module/pset/operator.py
@@ -16,21 +16,23 @@
# You should have received a copy of the GNU General Public License
# along with Bonsai. If not, see .
-import bpy
import json
-import ifcopenshell.api
-import ifcopenshell.api.pset
-import ifcopenshell.util.element
-import bonsai.bim.schema
-import bonsai.tool as tool
-import bonsai.core.pset as core
-import bonsai.bim.module.pset.data
-from bonsai.bim.ifc import IfcStore
from collections import defaultdict
from typing import TYPE_CHECKING
+import bpy
+import ifcopenshell.api
+import ifcopenshell.api.pset
+import ifcopenshell.util.element
+
+import bonsai.bim.module.pset.data
+import bonsai.bim.schema
+import bonsai.core.pset as core
+import bonsai.tool as tool
+from bonsai.bim.ifc import IfcStore
+
if TYPE_CHECKING:
- from bonsai.bim.module.pset.prop import RenamePropertyEntry, AddEditPropertyEntry
+ from bonsai.bim.module.pset.prop import AddEditPropertyEntry, RenamePropertyEntry
class TogglePsetExpansion(bpy.types.Operator, tool.Ifc.Operator):
diff --git a/src/bonsai/bonsai/bim/module/pset/prop.py b/src/bonsai/bonsai/bim/module/pset/prop.py
index d89ba62be1..4b16e15010 100644
--- a/src/bonsai/bonsai/bim/module/pset/prop.py
+++ b/src/bonsai/bonsai/bim/module/pset/prop.py
@@ -16,33 +16,35 @@
# You should have received a copy of the GNU General Public License
# along with Bonsai. If not, see .
+from typing import TYPE_CHECKING, Literal, Union, get_args
+
import bpy
-import bonsai.bim.schema
import ifcopenshell
import ifcopenshell.util.attribute
import ifcopenshell.util.doc
import ifcopenshell.util.element
-import bonsai.tool as tool
-from bonsai.bim.prop import Attribute, StrProperty
-from bonsai.bim.module.pset.data import (
- AddEditCustomPropertiesData,
- ObjectPsetsData,
- MaterialPsetsData,
- PsetsGeneralData,
-)
-from bonsai.bim.module.material.data import ObjectMaterialData
-from bpy.types import PropertyGroup
from bpy.props import (
- PointerProperty,
- StringProperty,
- EnumProperty,
BoolProperty,
- IntProperty,
+ CollectionProperty,
+ EnumProperty,
FloatProperty,
FloatVectorProperty,
- CollectionProperty,
+ IntProperty,
+ PointerProperty,
+ StringProperty,
)
-from typing import Union, Literal, TYPE_CHECKING, get_args, Literal
+from bpy.types import PropertyGroup
+
+import bonsai.bim.schema
+import bonsai.tool as tool
+from bonsai.bim.module.material.data import ObjectMaterialData
+from bonsai.bim.module.pset.data import (
+ AddEditCustomPropertiesData,
+ MaterialPsetsData,
+ ObjectPsetsData,
+ PsetsGeneralData,
+)
+from bonsai.bim.prop import Attribute, StrProperty
psetnames = {}
qtonames = {}
diff --git a/src/bonsai/bonsai/bim/module/pset/ui.py b/src/bonsai/bonsai/bim/module/pset/ui.py
index abd3a8b90f..03d6f8bb36 100644
--- a/src/bonsai/bonsai/bim/module/pset/ui.py
+++ b/src/bonsai/bonsai/bim/module/pset/ui.py
@@ -17,26 +17,29 @@
# along with Bonsai. If not, see .
from __future__ import annotations
+
+from typing import TYPE_CHECKING, Any, Literal, Optional, assert_never
+
import bpy
-import bonsai.tool as tool
from bpy.types import Panel
-from bonsai.bim.helper import prop_with_search, get_display_value, draw_attribute
+
+import bonsai.tool as tool
+from bonsai.bim.helper import draw_attribute, get_display_value, prop_with_search
+from bonsai.bim.module.material.data import ObjectMaterialData
from bonsai.bim.module.pset.data import (
- ObjectPsetsData,
- ObjectQtosData,
+ GroupPsetData,
+ GroupQtosData,
MaterialPsetsData,
MaterialSetItemPsetsData,
- TaskQtosData,
- ResourceQtosData,
- ResourcePsetsData,
- GroupQtosData,
- GroupPsetData,
+ ObjectPsetsData,
+ ObjectQtosData,
ProfilePsetsData,
+ ResourcePsetsData,
+ ResourceQtosData,
+ TaskQtosData,
WorkSchedulePsetsData,
ZonePsetsData,
)
-from bonsai.bim.module.material.data import ObjectMaterialData
-from typing import Any, Optional, TYPE_CHECKING, assert_never, Literal
if TYPE_CHECKING:
from bonsai.bim.module.pset.prop import IfcProperty, PsetProperties
diff --git a/src/bonsai/bonsai/bim/module/pset_template/__init__.py b/src/bonsai/bonsai/bim/module/pset_template/__init__.py
index 204824cb11..dc67e900fb 100644
--- a/src/bonsai/bonsai/bim/module/pset_template/__init__.py
+++ b/src/bonsai/bonsai/bim/module/pset_template/__init__.py
@@ -17,7 +17,8 @@
# along with Bonsai. If not, see .
import bpy
-from . import ui, prop, operator
+
+from . import operator, prop, ui
classes = (
operator.AddPropEnum,
diff --git a/src/bonsai/bonsai/bim/module/pset_template/data.py b/src/bonsai/bonsai/bim/module/pset_template/data.py
index 84d65f25f1..1725b974f1 100644
--- a/src/bonsai/bonsai/bim/module/pset_template/data.py
+++ b/src/bonsai/bonsai/bim/module/pset_template/data.py
@@ -17,14 +17,16 @@
# along with Bonsai. If not, see .
import os
-import bpy
import pathlib
+from typing import Any
+
+import bpy
import ifcopenshell
import ifcopenshell.util.attribute
import ifcopenshell.util.doc
+
import bonsai.tool as tool
from bonsai.bim.ifc import IfcStore
-from typing import Any
def refresh():
diff --git a/src/bonsai/bonsai/bim/module/pset_template/operator.py b/src/bonsai/bonsai/bim/module/pset_template/operator.py
index 0711376439..e956917df3 100644
--- a/src/bonsai/bonsai/bim/module/pset_template/operator.py
+++ b/src/bonsai/bonsai/bim/module/pset_template/operator.py
@@ -17,12 +17,14 @@
# along with Bonsai. If not, see .
import os
+
import bpy
import ifcopenshell
import ifcopenshell.api
import ifcopenshell.api.pset_template
-import bonsai.bim.schema
+
import bonsai.bim.handler
+import bonsai.bim.schema
import bonsai.tool as tool
from bonsai.bim.ifc import IfcStore
diff --git a/src/bonsai/bonsai/bim/module/pset_template/prop.py b/src/bonsai/bonsai/bim/module/pset_template/prop.py
index fdd6188a76..9ec31b364f 100644
--- a/src/bonsai/bonsai/bim/module/pset_template/prop.py
+++ b/src/bonsai/bonsai/bim/module/pset_template/prop.py
@@ -17,26 +17,28 @@
# along with Bonsai. If not, see .
import os
+from typing import TYPE_CHECKING
+
import bpy
import ifcopenshell
import ifcopenshell.util.attribute
-from ifcopenshell.util.doc import get_attribute_doc
-import bonsai.tool as tool
-from bonsai.bim.module.pset_template.data import PsetTemplatesData
-from bonsai.bim.prop import StrProperty, Attribute
-from bonsai.bim.ifc import IfcStore
-from bpy.types import PropertyGroup
from bpy.props import (
- PointerProperty,
- StringProperty,
- EnumProperty,
BoolProperty,
- IntProperty,
+ CollectionProperty,
+ EnumProperty,
FloatProperty,
FloatVectorProperty,
- CollectionProperty,
+ IntProperty,
+ PointerProperty,
+ StringProperty,
)
-from typing import TYPE_CHECKING
+from bpy.types import PropertyGroup
+from ifcopenshell.util.doc import get_attribute_doc
+
+import bonsai.tool as tool
+from bonsai.bim.ifc import IfcStore
+from bonsai.bim.module.pset_template.data import PsetTemplatesData
+from bonsai.bim.prop import Attribute, StrProperty
def updatePsetTemplateFiles(self, context):
diff --git a/src/bonsai/bonsai/bim/module/pset_template/ui.py b/src/bonsai/bonsai/bim/module/pset_template/ui.py
index af46fdc0e7..6576e8f56c 100644
--- a/src/bonsai/bonsai/bim/module/pset_template/ui.py
+++ b/src/bonsai/bonsai/bim/module/pset_template/ui.py
@@ -17,8 +17,9 @@
# along with Bonsai. If not, see .
import bpy
-import bonsai.tool as tool
from bpy.types import Panel
+
+import bonsai.tool as tool
from bonsai.bim.helper import prop_with_search
from bonsai.bim.module.pset_template.data import PsetTemplatesData
diff --git a/src/bonsai/bonsai/bim/module/qto/__init__.py b/src/bonsai/bonsai/bim/module/qto/__init__.py
index f372462f73..f4d5becb73 100644
--- a/src/bonsai/bonsai/bim/module/qto/__init__.py
+++ b/src/bonsai/bonsai/bim/module/qto/__init__.py
@@ -17,7 +17,8 @@
# along with Bonsai. If not, see .
import bpy
-from . import ui, prop, operator
+
+from . import operator, prop, ui
classes = (
operator.CalculateCircleRadius,
diff --git a/src/bonsai/bonsai/bim/module/qto/calculator.py b/src/bonsai/bonsai/bim/module/qto/calculator.py
index 091d7e1f9f..c0e5aa474f 100644
--- a/src/bonsai/bonsai/bim/module/qto/calculator.py
+++ b/src/bonsai/bonsai/bim/module/qto/calculator.py
@@ -16,21 +16,22 @@
# You should have received a copy of the GNU General Public License
# along with Bonsai. If not, see .
-import bpy
import math
+from typing import Literal, Optional, Union, assert_never
+
import bmesh
-import mathutils
-import bonsai.tool as tool
+import bpy
+import ifc5d.qto
import ifcopenshell
import ifcopenshell.geom
import ifcopenshell.util.element
-import ifc5d.qto
-from mathutils import Vector, Matrix
+import mathutils
+from mathutils import Matrix, Vector
from mathutils.bvhtree import BVHTree
from shapely.geometry import Polygon
from shapely.ops import unary_union
-from typing import Literal, Union, Optional, assert_never
+import bonsai.tool as tool
AxisType = Literal["x", "y", "z"]
VectorTuple = tuple[float, float, float]
diff --git a/src/bonsai/bonsai/bim/module/qto/data.py b/src/bonsai/bonsai/bim/module/qto/data.py
index ef780d749f..162a4bf7c6 100644
--- a/src/bonsai/bonsai/bim/module/qto/data.py
+++ b/src/bonsai/bonsai/bim/module/qto/data.py
@@ -17,6 +17,7 @@
# along with Bonsai. If not, see .
import bpy
+
import bonsai.tool as tool
diff --git a/src/bonsai/bonsai/bim/module/qto/helper.py b/src/bonsai/bonsai/bim/module/qto/helper.py
index 50253cbb63..d4f94c491f 100644
--- a/src/bonsai/bonsai/bim/module/qto/helper.py
+++ b/src/bonsai/bonsai/bim/module/qto/helper.py
@@ -16,11 +16,13 @@
# You should have received a copy of the GNU General Public License
# along with Bonsai. If not, see .
-import bpy
-import bmesh
-import bonsai.tool as tool
from collections.abc import Callable
+import bmesh
+import bpy
+
+import bonsai.tool as tool
+
def calculate_height(obj: bpy.types.Object) -> float:
return obj.dimensions[2]
diff --git a/src/bonsai/bonsai/bim/module/qto/operator.py b/src/bonsai/bonsai/bim/module/qto/operator.py
index 47b0f5059a..572c65e258 100644
--- a/src/bonsai/bonsai/bim/module/qto/operator.py
+++ b/src/bonsai/bonsai/bim/module/qto/operator.py
@@ -19,11 +19,12 @@
import bpy
import ifcopenshell
import ifcopenshell.api
-import bonsai.tool as tool
-import bonsai.core.qto as core
-from bonsai.bim.module.qto import helper
from ifcopenshell.util.profiler import Profiler
+import bonsai.core.qto as core
+import bonsai.tool as tool
+from bonsai.bim.module.qto import helper
+
class CalculateCircleRadius(bpy.types.Operator):
bl_idname = "bim.calculate_circle_radius"
diff --git a/src/bonsai/bonsai/bim/module/qto/prop.py b/src/bonsai/bonsai/bim/module/qto/prop.py
index 57e04d4cc1..9952285d30 100644
--- a/src/bonsai/bonsai/bim/module/qto/prop.py
+++ b/src/bonsai/bonsai/bim/module/qto/prop.py
@@ -16,23 +16,24 @@
# You should have received a copy of the GNU General Public License
# along with Bonsai. If not, see .
-import bpy
-import bonsai.tool as tool
-import ifc5d.qto
-from bonsai.bim.prop import StrProperty, Attribute
-from bpy.types import PropertyGroup
-from bpy.props import (
- PointerProperty,
- StringProperty,
- EnumProperty,
- BoolProperty,
- IntProperty,
- FloatProperty,
- FloatVectorProperty,
- CollectionProperty,
-)
from typing import TYPE_CHECKING, Union
+import bpy
+import ifc5d.qto
+from bpy.props import (
+ BoolProperty,
+ CollectionProperty,
+ EnumProperty,
+ FloatProperty,
+ FloatVectorProperty,
+ IntProperty,
+ PointerProperty,
+ StringProperty,
+)
+from bpy.types import PropertyGroup
+
+import bonsai.tool as tool
+from bonsai.bim.prop import Attribute, StrProperty
CALCULATOR_FUNCTION_ENUM_ITEMS: list[Union[tuple[str, str, str], None]] = []
diff --git a/src/bonsai/bonsai/bim/module/qto/ui.py b/src/bonsai/bonsai/bim/module/qto/ui.py
index 9029a63066..032df25b20 100644
--- a/src/bonsai/bonsai/bim/module/qto/ui.py
+++ b/src/bonsai/bonsai/bim/module/qto/ui.py
@@ -17,6 +17,7 @@
# along with Bonsai. If not, see .
import bpy
+
import bonsai.tool as tool
from bonsai.bim.module.qto.data import QtoData
diff --git a/src/bonsai/bonsai/bim/module/resource/__init__.py b/src/bonsai/bonsai/bim/module/resource/__init__.py
index ae08660afd..89f21f4e29 100644
--- a/src/bonsai/bonsai/bim/module/resource/__init__.py
+++ b/src/bonsai/bonsai/bim/module/resource/__init__.py
@@ -17,7 +17,8 @@
# along with Bonsai. If not, see .
import bpy
-from . import ui, prop, operator
+
+from . import operator, prop, ui
classes = (
operator.AddResource,
diff --git a/src/bonsai/bonsai/bim/module/resource/data.py b/src/bonsai/bonsai/bim/module/resource/data.py
index 601b61eb7b..cc862cf1dd 100644
--- a/src/bonsai/bonsai/bim/module/resource/data.py
+++ b/src/bonsai/bonsai/bim/module/resource/data.py
@@ -16,14 +16,16 @@
# You should have received a copy of the GNU General Public License
# along with Bonsai. If not, see .
+from typing import Any
+
import bpy
-import bonsai.tool as tool
import ifcopenshell
import ifcopenshell.util.constraint
import ifcopenshell.util.cost
import ifcopenshell.util.date
import ifcopenshell.util.resource
-from typing import Any
+
+import bonsai.tool as tool
def refresh():
diff --git a/src/bonsai/bonsai/bim/module/resource/operator.py b/src/bonsai/bonsai/bim/module/resource/operator.py
index 4d9a28c061..a82cc22918 100644
--- a/src/bonsai/bonsai/bim/module/resource/operator.py
+++ b/src/bonsai/bonsai/bim/module/resource/operator.py
@@ -18,10 +18,11 @@
import bpy
import ifcopenshell.api.pset
-from bpy_extras.io_utils import ImportHelper, ExportHelper
-from bonsai.bim.module.resource.ui import draw_productivity_ui
+from bpy_extras.io_utils import ExportHelper, ImportHelper
+
import bonsai.core.resource as core
import bonsai.tool as tool
+from bonsai.bim.module.resource.ui import draw_productivity_ui
class LoadResources(bpy.types.Operator):
diff --git a/src/bonsai/bonsai/bim/module/resource/prop.py b/src/bonsai/bonsai/bim/module/resource/prop.py
index 350417aa69..4c6828e56c 100644
--- a/src/bonsai/bonsai/bim/module/resource/prop.py
+++ b/src/bonsai/bonsai/bim/module/resource/prop.py
@@ -16,27 +16,29 @@
# You should have received a copy of the GNU General Public License
# along with Bonsai. If not, see .
+from typing import TYPE_CHECKING, Literal, get_args
+
import bpy
import ifcopenshell.api
import ifcopenshell.api.resource
import ifcopenshell.util.resource
-import bonsai.tool as tool
+from bpy.props import (
+ BoolProperty,
+ CollectionProperty,
+ EnumProperty,
+ FloatProperty,
+ FloatVectorProperty,
+ IntProperty,
+ PointerProperty,
+ StringProperty,
+)
+from bpy.types import PropertyGroup
+
import bonsai.bim.module.pset.data
import bonsai.bim.module.resource.data
import bonsai.bim.module.sequence.data
+import bonsai.tool as tool
from bonsai.bim.prop import Attribute, ISODuration
-from bpy.types import PropertyGroup
-from bpy.props import (
- PointerProperty,
- StringProperty,
- EnumProperty,
- BoolProperty,
- IntProperty,
- FloatProperty,
- FloatVectorProperty,
- CollectionProperty,
-)
-from typing import TYPE_CHECKING, Literal, get_args
quantitytypes_enum: dict[str, tool.Blender.BLENDER_ENUM_ITEMS] = {}
diff --git a/src/bonsai/bonsai/bim/module/resource/ui.py b/src/bonsai/bonsai/bim/module/resource/ui.py
index b061600978..679eed8782 100644
--- a/src/bonsai/bonsai/bim/module/resource/ui.py
+++ b/src/bonsai/bonsai/bim/module/resource/ui.py
@@ -17,16 +17,19 @@
# along with Bonsai. If not, see .
from __future__ import annotations
+
+from typing import TYPE_CHECKING, Any
+
import bpy
-import bonsai.tool as tool
-import bonsai.bim.helper
from bpy.types import Panel, UIList
+
+import bonsai.bim.helper
+import bonsai.tool as tool
from bonsai.bim.module.resource.data import ResourceData
-from typing import Any, TYPE_CHECKING
if TYPE_CHECKING:
+ from bonsai.bim.module.resource.prop import BIMResourceTreeProperties, Resource
from bonsai.bim.prop import ISODuration
- from bonsai.bim.module.resource.prop import Resource, BIMResourceTreeProperties
class BIM_PT_resources(Panel):
diff --git a/src/bonsai/bonsai/bim/module/root/__init__.py b/src/bonsai/bonsai/bim/module/root/__init__.py
index 3e6f280eb2..7192dcdff4 100644
--- a/src/bonsai/bonsai/bim/module/root/__init__.py
+++ b/src/bonsai/bonsai/bim/module/root/__init__.py
@@ -17,7 +17,8 @@
# along with Bonsai. If not, see .
import bpy
-from . import ui, prop, operator
+
+from . import operator, prop, ui
classes = (
operator.AddElement,
diff --git a/src/bonsai/bonsai/bim/module/root/data.py b/src/bonsai/bonsai/bim/module/root/data.py
index 7690210c9b..66412e7d48 100644
--- a/src/bonsai/bonsai/bim/module/root/data.py
+++ b/src/bonsai/bonsai/bim/module/root/data.py
@@ -17,13 +17,19 @@
# along with Bonsai. If not, see .
from collections import defaultdict
+from typing import Union
+
import bpy
import ifcopenshell.util.attribute
import ifcopenshell.util.element
import ifcopenshell.util.schema
-from ifcopenshell.util.doc import get_entity_doc, get_predefined_type_doc, get_class_suggestions
+from ifcopenshell.util.doc import (
+ get_class_suggestions,
+ get_entity_doc,
+ get_predefined_type_doc,
+)
+
import bonsai.tool as tool
-from typing import Union
def refresh():
diff --git a/src/bonsai/bonsai/bim/module/root/operator.py b/src/bonsai/bonsai/bim/module/root/operator.py
index a5bf766ae2..a2ac73f200 100644
--- a/src/bonsai/bonsai/bim/module/root/operator.py
+++ b/src/bonsai/bonsai/bim/module/root/operator.py
@@ -16,8 +16,10 @@
# You should have received a copy of the GNU General Public License
# along with Bonsai. If not, see .
-import bpy
+from typing import TYPE_CHECKING
+
import bmesh
+import bpy
import idprop
import ifcopenshell
import ifcopenshell.api
@@ -25,20 +27,20 @@ import ifcopenshell.api.geometry
import ifcopenshell.api.material
import ifcopenshell.api.pset
import ifcopenshell.api.root
-import ifcopenshell.util.schema
import ifcopenshell.util.element
+import ifcopenshell.util.schema
import ifcopenshell.util.shape_builder
import ifcopenshell.util.type
import ifcopenshell.util.unit
-import bonsai.bim.handler
-import bonsai.core.root as core
-import bonsai.core.geometry
-import bonsai.tool as tool
-import bonsai.bim.module.root.prop as root_prop
-from bonsai.bim.ifc import IfcStore
-from bonsai.bim.helper import get_enum_items, prop_with_search
from mathutils import Vector
-from typing import TYPE_CHECKING
+
+import bonsai.bim.handler
+import bonsai.bim.module.root.prop as root_prop
+import bonsai.core.geometry
+import bonsai.core.root as core
+import bonsai.tool as tool
+from bonsai.bim.helper import get_enum_items, prop_with_search
+from bonsai.bim.ifc import IfcStore
class EnableReassignClass(bpy.types.Operator):
@@ -307,7 +309,7 @@ class AssignClass(bpy.types.Operator, tool.Ifc.Operator):
with context.temp_override(selected_editable_objects=[obj]):
bpy.ops.object.transform_apply(location=False, rotation=False, scale=True, properties=False)
# object.transform_apply is losing normals.
- if is_negative:
+ if is_negative and bpy.app.version >= (5, 1, 0):
for polygon in obj.data.polygons:
polygon.flip()
diff --git a/src/bonsai/bonsai/bim/module/root/prop.py b/src/bonsai/bonsai/bim/module/root/prop.py
index 9bd00c4c68..854eb6d0f0 100644
--- a/src/bonsai/bonsai/bim/module/root/prop.py
+++ b/src/bonsai/bonsai/bim/module/root/prop.py
@@ -16,25 +16,27 @@
# You should have received a copy of the GNU General Public License
# along with Bonsai. If not, see .
+from typing import TYPE_CHECKING, Union
+
import bpy
import ifcopenshell
import ifcopenshell.util.element
import ifcopenshell.util.schema
import ifcopenshell.util.type
-import bonsai.tool as tool
-from bonsai.bim.module.root.data import IfcClassData
-from bpy.types import PropertyGroup
from bpy.props import (
- PointerProperty,
- StringProperty,
- EnumProperty,
BoolProperty,
- IntProperty,
+ CollectionProperty,
+ EnumProperty,
FloatProperty,
FloatVectorProperty,
- CollectionProperty,
+ IntProperty,
+ PointerProperty,
+ StringProperty,
)
-from typing import TYPE_CHECKING, Union
+from bpy.types import PropertyGroup
+
+import bonsai.tool as tool
+from bonsai.bim.module.root.data import IfcClassData
def get_ifc_predefined_types(self: "BIMRootProperties", context: bpy.types.Context) -> list[tuple[str, str]]:
diff --git a/src/bonsai/bonsai/bim/module/root/ui.py b/src/bonsai/bonsai/bim/module/root/ui.py
index facf619ad8..72eadb4e39 100644
--- a/src/bonsai/bonsai/bim/module/root/ui.py
+++ b/src/bonsai/bonsai/bim/module/root/ui.py
@@ -17,12 +17,13 @@
# along with Bonsai. If not, see .
import bpy
-import bonsai.tool as tool
-import bonsai.bim.module.root.prop as root_prop
from bpy.types import Panel
+
+import bonsai.bim.module.root.prop as root_prop
+import bonsai.tool as tool
from bonsai.bim.helper import prop_with_search
-from bonsai.bim.module.root.data import IfcClassData
from bonsai.bim.module.model.data import AuthoringData
+from bonsai.bim.module.root.data import IfcClassData
class BIM_PT_class(Panel):
diff --git a/src/bonsai/bonsai/bim/module/search/__init__.py b/src/bonsai/bonsai/bim/module/search/__init__.py
index 88cb2f6ed4..5033fd3eb4 100644
--- a/src/bonsai/bonsai/bim/module/search/__init__.py
+++ b/src/bonsai/bonsai/bim/module/search/__init__.py
@@ -17,7 +17,8 @@
# along with Bonsai. If not, see .
import bpy
-from . import ui, prop, operator
+
+from . import operator, prop, ui
classes = (
operator.ActivateContainerFilter,
diff --git a/src/bonsai/bonsai/bim/module/search/data.py b/src/bonsai/bonsai/bim/module/search/data.py
index 4bde0aa359..8c2fad00b0 100644
--- a/src/bonsai/bonsai/bim/module/search/data.py
+++ b/src/bonsai/bonsai/bim/module/search/data.py
@@ -16,12 +16,14 @@
# You should have received a copy of the GNU General Public License
# along with Bonsai. If not, see .
-import bpy
import json
+
+import bpy
import ifcopenshell.util.element
-import bonsai.tool as tool
from natsort import natsorted
+import bonsai.tool as tool
+
def refresh():
SearchData.is_loaded = False
diff --git a/src/bonsai/bonsai/bim/module/search/operator.py b/src/bonsai/bonsai/bim/module/search/operator.py
index a8c79c11bb..47e87a3caa 100644
--- a/src/bonsai/bonsai/bim/module/search/operator.py
+++ b/src/bonsai/bonsai/bim/module/search/operator.py
@@ -16,32 +16,34 @@
# You should have received a copy of the GNU General Public License
# along with Bonsai. If not, see .
-import bpy
-import json
import bisect
+import json
import traceback
+from typing import TYPE_CHECKING, Literal, assert_never, get_args
+
+import bpy
import ifcopenshell
import ifcopenshell.api
import ifcopenshell.api.group
import ifcopenshell.util.element
import ifcopenshell.util.selector
-import bonsai.tool as tool
-import bonsai.core.search as core
-from bonsai.bim.ifc import IfcStore
-from natsort import natsorted
-from bpy.types import PropertyGroup, Operator
from bpy.props import (
- PointerProperty,
- StringProperty,
- EnumProperty,
BoolProperty,
- IntProperty,
+ CollectionProperty,
+ EnumProperty,
FloatProperty,
FloatVectorProperty,
- CollectionProperty,
+ IntProperty,
+ PointerProperty,
+ StringProperty,
)
+from bpy.types import Operator, PropertyGroup
+from natsort import natsorted
+
+import bonsai.core.search as core
+import bonsai.tool as tool
+from bonsai.bim.ifc import IfcStore
from bonsai.bim.prop import StrProperty
-from typing import TYPE_CHECKING, Literal, get_args, assert_never
def draw_text_editor_header(self, context):
diff --git a/src/bonsai/bonsai/bim/module/search/prop.py b/src/bonsai/bonsai/bim/module/search/prop.py
index 3cb8a12252..e3403b5abe 100644
--- a/src/bonsai/bonsai/bim/module/search/prop.py
+++ b/src/bonsai/bonsai/bim/module/search/prop.py
@@ -16,24 +16,31 @@
# You should have received a copy of the GNU General Public License
# along with Bonsai. If not, see .
+from typing import TYPE_CHECKING, Literal, get_args
+
import bpy
-import bonsai.tool as tool
import ifcopenshell.util.schema
-from bonsai.bim.prop import ObjProperty, BIMFilterGroup
-from bonsai.bim.module.search.data import SearchData, ColourByPropertyData, SelectSimilarData
-from bpy.types import PropertyGroup
-from . import ui, prop, operator
from bpy.props import (
- PointerProperty,
- StringProperty,
- EnumProperty,
BoolProperty,
- IntProperty,
+ CollectionProperty,
+ EnumProperty,
FloatProperty,
FloatVectorProperty,
- CollectionProperty,
+ IntProperty,
+ PointerProperty,
+ StringProperty,
)
-from typing import TYPE_CHECKING, Literal, get_args
+from bpy.types import PropertyGroup
+
+import bonsai.tool as tool
+from bonsai.bim.module.search.data import (
+ ColourByPropertyData,
+ SearchData,
+ SelectSimilarData,
+)
+from bonsai.bim.prop import BIMFilterGroup, ObjProperty
+
+from . import operator, prop, ui
def get_element_key(self: "BIMSearchProperties", context: bpy.types.Context) -> list[tuple[str, str, str]]:
diff --git a/src/bonsai/bonsai/bim/module/search/ui.py b/src/bonsai/bonsai/bim/module/search/ui.py
index 3481e3709b..3b01fdcbbe 100644
--- a/src/bonsai/bonsai/bim/module/search/ui.py
+++ b/src/bonsai/bonsai/bim/module/search/ui.py
@@ -17,15 +17,26 @@
# along with Bonsai. If not, see .
from __future__ import annotations
-import bpy
-import bonsai.tool as tool
-import bonsai.bim.helper
-from bpy.types import Panel
-from bonsai.bim.module.search.data import SearchData, ColourByPropertyData, SelectSimilarData
+
from typing import TYPE_CHECKING
+import bpy
+from bpy.types import Panel
+
+import bonsai.bim.helper
+import bonsai.tool as tool
+from bonsai.bim.module.search.data import (
+ ColourByPropertyData,
+ SearchData,
+ SelectSimilarData,
+)
+
if TYPE_CHECKING:
- from bonsai.bim.module.search.prop import BIMSearchProperties, BIMColour, BIMFilterItem
+ from bonsai.bim.module.search.prop import (
+ BIMColour,
+ BIMFilterItem,
+ BIMSearchProperties,
+ )
class BIM_PT_search(Panel):
diff --git a/src/bonsai/bonsai/bim/module/sequence/__init__.py b/src/bonsai/bonsai/bim/module/sequence/__init__.py
index 3262b64527..e15d4e80ee 100644
--- a/src/bonsai/bonsai/bim/module/sequence/__init__.py
+++ b/src/bonsai/bonsai/bim/module/sequence/__init__.py
@@ -19,7 +19,8 @@
# pyright: reportAttributeAccessIssue=false
import bpy
-from . import ui, prop, operator
+
+from . import operator, prop, ui
classes = (
operator.AddAnimationCamera,
diff --git a/src/bonsai/bonsai/bim/module/sequence/data.py b/src/bonsai/bonsai/bim/module/sequence/data.py
index 94df71eacd..7ea6050ca3 100644
--- a/src/bonsai/bonsai/bim/module/sequence/data.py
+++ b/src/bonsai/bonsai/bim/module/sequence/data.py
@@ -16,14 +16,16 @@
# You should have received a copy of the GNU General Public License
# along with Bonsai. If not, see .
+import json
+from typing import Any
+
import bpy
-import bonsai.tool as tool
import ifcopenshell
import ifcopenshell.util.attribute
import ifcopenshell.util.date
from ifcopenshell.util.doc import get_predefined_type_doc
-import json
-from typing import Any
+
+import bonsai.tool as tool
def refresh():
diff --git a/src/bonsai/bonsai/bim/module/sequence/helper.py b/src/bonsai/bonsai/bim/module/sequence/helper.py
index 43dcd1d59b..50d2367144 100644
--- a/src/bonsai/bonsai/bim/module/sequence/helper.py
+++ b/src/bonsai/bonsai/bim/module/sequence/helper.py
@@ -18,12 +18,13 @@
from __future__ import annotations
-import isodate
+from datetime import datetime, timedelta
+from typing import Any, Union
+
import bpy
-from dateutil import parser
import ifcopenshell.util.date
-from datetime import timedelta, datetime
-from typing import Union, Any
+import isodate
+from dateutil import parser
from bonsai.bim.prop import ISODuration
diff --git a/src/bonsai/bonsai/bim/module/sequence/operator.py b/src/bonsai/bonsai/bim/module/sequence/operator.py
index c07b9a0496..2b4c317cd8 100644
--- a/src/bonsai/bonsai/bim/module/sequence/operator.py
+++ b/src/bonsai/bonsai/bim/module/sequence/operator.py
@@ -18,23 +18,23 @@
# pyright: reportUnnecessaryTypeIgnoreComment=error
+import calendar
+import time
import types
-
from collections import Counter
+from datetime import datetime
from functools import cache
+from typing import TYPE_CHECKING, Union, assert_never, get_args
import bpy
-import time
-import calendar
import ifcopenshell.api.pset
import ifcopenshell.util.element
+from bpy_extras.io_utils import ExportHelper, ImportHelper
+from dateutil import parser, relativedelta
+
import bonsai.bim.schema
import bonsai.core.sequence as core
import bonsai.tool as tool
-from datetime import datetime
-from dateutil import parser, relativedelta
-from bpy_extras.io_utils import ImportHelper, ExportHelper
-from typing import Union, get_args, TYPE_CHECKING, assert_never
if TYPE_CHECKING:
from bpy.stub_internal.rna_enums import OperatorReturnItems
diff --git a/src/bonsai/bonsai/bim/module/sequence/prop.py b/src/bonsai/bonsai/bim/module/sequence/prop.py
index 1c35910e6c..6a5937ac45 100644
--- a/src/bonsai/bonsai/bim/module/sequence/prop.py
+++ b/src/bonsai/bonsai/bim/module/sequence/prop.py
@@ -16,32 +16,35 @@
# You should have received a copy of the GNU General Public License
# along with Bonsai. If not, see .
+from typing import TYPE_CHECKING, Literal, Union, get_args
+
import bpy
-import isodate
import ifcopenshell.api
import ifcopenshell.api.sequence
import ifcopenshell.util.attribute
import ifcopenshell.util.date
-import bonsai.tool as tool
-import bonsai.core.sequence as core
-from bonsai.bim.module.sequence.data import SequenceData, AnimationColorSchemeData, refresh as refresh_sequence_data
-import bonsai.bim.module.resource.data
-import bonsai.bim.module.pset.data
-from mathutils import Color
-from bonsai.bim.prop import Attribute, ISODuration
-from dateutil import parser
-from bpy.types import PropertyGroup
+import isodate
from bpy.props import (
- PointerProperty,
- StringProperty,
- EnumProperty,
BoolProperty,
- IntProperty,
+ CollectionProperty,
+ EnumProperty,
FloatProperty,
FloatVectorProperty,
- CollectionProperty,
+ IntProperty,
+ PointerProperty,
+ StringProperty,
)
-from typing import TYPE_CHECKING, Literal, Union, get_args
+from bpy.types import PropertyGroup
+from dateutil import parser
+from mathutils import Color
+
+import bonsai.bim.module.pset.data
+import bonsai.bim.module.resource.data
+import bonsai.core.sequence as core
+import bonsai.tool as tool
+from bonsai.bim.module.sequence.data import AnimationColorSchemeData, SequenceData
+from bonsai.bim.module.sequence.data import refresh as refresh_sequence_data
+from bonsai.bim.prop import Attribute, ISODuration
def getTaskColumns(self, context):
diff --git a/src/bonsai/bonsai/bim/module/sequence/ui.py b/src/bonsai/bonsai/bim/module/sequence/ui.py
index 9178268c3a..0ecd772276 100644
--- a/src/bonsai/bonsai/bim/module/sequence/ui.py
+++ b/src/bonsai/bonsai/bim/module/sequence/ui.py
@@ -16,26 +16,32 @@
# You should have received a copy of the GNU General Public License
# along with Bonsai. If not, see .
+from typing import TYPE_CHECKING, Any, Optional
+
import bpy
import ifcopenshell
import isodate
-import bonsai.tool as tool
-import bonsai.bim.helper
from bpy.types import Panel, UIList
+
+import bonsai.bim.helper
+import bonsai.tool as tool
from bonsai.bim.helper import draw_attributes
from bonsai.bim.module.sequence.data import (
+ AnimationColorSchemeData,
+ SequenceData,
+ StatusData,
+ TaskICOMData,
WorkPlansData,
WorkScheduleData,
- SequenceData,
- TaskICOMData,
- AnimationColorSchemeData,
- StatusData,
)
-from typing import Any, Optional, TYPE_CHECKING
if TYPE_CHECKING:
+ from bonsai.bim.module.sequence.prop import (
+ BIMTaskTreeProperties,
+ BIMWorkScheduleProperties,
+ Task,
+ )
from bonsai.bim.prop import Attribute
- from bonsai.bim.module.sequence.prop import BIMWorkScheduleProperties, BIMTaskTreeProperties, Task
class BIM_PT_status(Panel):
diff --git a/src/bonsai/bonsai/bim/module/spatial/__init__.py b/src/bonsai/bonsai/bim/module/spatial/__init__.py
index 6c62218532..57cc84a8f1 100644
--- a/src/bonsai/bonsai/bim/module/spatial/__init__.py
+++ b/src/bonsai/bonsai/bim/module/spatial/__init__.py
@@ -17,7 +17,8 @@
# along with Bonsai. If not, see .
import bpy
-from . import ui, prop, operator, workspace
+
+from . import operator, prop, ui, workspace
classes = (
operator.AssignContainer,
diff --git a/src/bonsai/bonsai/bim/module/spatial/data.py b/src/bonsai/bonsai/bim/module/spatial/data.py
index baed31f49d..5885a9a76e 100644
--- a/src/bonsai/bonsai/bim/module/spatial/data.py
+++ b/src/bonsai/bonsai/bim/module/spatial/data.py
@@ -16,11 +16,13 @@
# You should have received a copy of the GNU General Public License
# along with Bonsai. If not, see .
-import bpy
-import bonsai.tool as tool
-import ifcopenshell.util.element
from typing import Any
+import bpy
+import ifcopenshell.util.element
+
+import bonsai.tool as tool
+
def refresh():
SpatialData.is_loaded = False
diff --git a/src/bonsai/bonsai/bim/module/spatial/decorator.py b/src/bonsai/bonsai/bim/module/spatial/decorator.py
index 824fafec1f..8d66d4e8a6 100644
--- a/src/bonsai/bonsai/bim/module/spatial/decorator.py
+++ b/src/bonsai/bonsai/bim/module/spatial/decorator.py
@@ -17,13 +17,14 @@
# along with Bonsai. If not, see .
import blf
-import gpu
import bmesh
-import bonsai.tool as tool
+import gpu
from bpy.types import SpaceView3D
-from mathutils import Vector
-from gpu_extras.batch import batch_for_shader
from bpy_extras.view3d_utils import location_3d_to_region_2d
+from gpu_extras.batch import batch_for_shader
+from mathutils import Vector
+
+import bonsai.tool as tool
class GridDecorator:
diff --git a/src/bonsai/bonsai/bim/module/spatial/operator.py b/src/bonsai/bonsai/bim/module/spatial/operator.py
index 075c3a9a38..18fc35c1c9 100644
--- a/src/bonsai/bonsai/bim/module/spatial/operator.py
+++ b/src/bonsai/bonsai/bim/module/spatial/operator.py
@@ -16,12 +16,14 @@
# You should have received a copy of the GNU General Public License
# along with Bonsai. If not, see .
+from typing import TYPE_CHECKING
+
import bpy
import ifcopenshell.util.element
-import bonsai.tool as tool
-import bonsai.core.spatial as core
+
import bonsai.bim.handler
-from typing import TYPE_CHECKING
+import bonsai.core.spatial as core
+import bonsai.tool as tool
class ReferenceStructure(bpy.types.Operator, tool.Ifc.Operator):
@@ -175,84 +177,31 @@ class AssignContainer(bpy.types.Operator, tool.Ifc.Operator):
else:
return
- def get_root_aggregate(element):
- """Traverse up the aggregate hierarchy to find the top-most aggregate"""
- current = element
- root = None
- while aggregate := ifcopenshell.util.element.get_aggregate(current):
- root = aggregate
- current = aggregate
- return root
-
- def get_all_parts_recursive(element):
- """Recursively get all parts of an aggregate"""
- parts = []
- for part in ifcopenshell.util.element.get_parts(element):
- parts.append(part)
- # Recursively get nested parts
- parts.extend(get_all_parts_recursive(part))
- return parts
-
objs: list[bpy.types.Object] = []
- processed_elements = set() # Track elements we've already handled (by IFC ID)
- promoted_parts = 0 # Count how many parts were promoted to their root aggregate
-
+ # In IFC element can be either contained of aggregated,
+ # tehrefore we skip aggregated elements here to prevent confusion.
+ # Can't handle it in `poll` since user might just select bunch of elements
+ # and try to assign a container to them
+ # and excluding aggregates because of the `poll` failing might get awkward.
+ skipped_aggregates = 0
for obj in tool.Blender.get_selected_objects():
if not (element := tool.Ifc.get_entity(obj)):
continue
-
- # Check if element is part of an aggregate (at any level)
- if root_aggregate := get_root_aggregate(element):
- # Skip if we've already processed this root aggregate
- if root_aggregate.id() in processed_elements:
- continue
-
- # Get the root aggregate object and add it instead
- if root_aggregate_obj := tool.Ifc.get_object(root_aggregate):
- objs.append(root_aggregate_obj)
- processed_elements.add(root_aggregate.id())
- if root_aggregate != element: # Only count as promoted if different from selected
- promoted_parts += 1
- else:
- # Element is not part of any aggregate
- if element.id() not in processed_elements:
- objs.append(obj)
- processed_elements.add(element.id())
-
- # Get the container's collection
- container_obj = tool.Ifc.get_object(container)
- container_collection = container_obj.BIMObjectProperties.collection if container_obj else None
+ if ifcopenshell.util.element.get_aggregate(element):
+ skipped_aggregates += 1
+ continue
+ objs.append(obj)
for element_obj in objs:
- element = tool.Ifc.get_entity(element_obj)
-
- # Only assign container to the ROOT aggregate (this updates IFC relationships)
if self.remove_from_other_containers:
for col in element_obj.users_collection[:]:
col.objects.unlink(element_obj)
core.assign_container(tool.Ifc, tool.Collector, tool.Spatial, container=container, element_obj=element_obj)
- # For parts, only move them in Blender collections (don't change IFC relationships)
- if container_collection:
- all_parts = get_all_parts_recursive(element)
- for part in all_parts:
- if part_obj := tool.Ifc.get_object(part):
- # Always remove from ALL previous collections when moving to new container
- for col in part_obj.users_collection[:]:
- col.objects.unlink(part_obj)
-
- # Link to new container collection (Blender-only, no IFC change)
- if part_obj.name not in container_collection.objects:
- container_collection.objects.link(part_obj)
-
- # Disable editing mode for all selected objects
- for obj in tool.Blender.get_selected_objects():
- core.disable_editing_container(tool.Spatial, obj=obj)
-
- promoted_msg = ""
- if promoted_parts:
- promoted_msg = f" {promoted_parts} nested parts promoted to their root aggregates."
- self.report({"INFO"}, f"{len(objs)} elements assigned.{promoted_msg}")
+ aggregates_msg = ""
+ if skipped_aggregates:
+ aggregates_msg = f" {skipped_aggregates} aggregated elements skipped."
+ self.report({"INFO"}, f"{len(objs)} elements assigned.{aggregates_msg}")
class EnableEditingContainer(bpy.types.Operator):
diff --git a/src/bonsai/bonsai/bim/module/spatial/prop.py b/src/bonsai/bonsai/bim/module/spatial/prop.py
index 3d54581551..18ddc6080d 100644
--- a/src/bonsai/bonsai/bim/module/spatial/prop.py
+++ b/src/bonsai/bonsai/bim/module/spatial/prop.py
@@ -16,28 +16,29 @@
# You should have received a copy of the GNU General Public License
# along with Bonsai. If not, see .
+from typing import TYPE_CHECKING, Literal, Union
+
import bpy
-from bonsai.bim.prop import ObjProperty
-from bonsai.bim.module.spatial.data import SpatialDecompositionData
-from bpy.types import PropertyGroup
-from bpy.props import (
- PointerProperty,
- StringProperty,
- EnumProperty,
- BoolProperty,
- IntProperty,
- FloatProperty,
- FloatVectorProperty,
- CollectionProperty,
-)
-import bonsai.tool as tool
-import bonsai.bim.handler
-import bonsai.core.geometry
import ifcopenshell
import ifcopenshell.api.attribute
import ifcopenshell.util.unit
-from bonsai.tool.unit import parse_distance_string
-from typing import TYPE_CHECKING, Union, Literal
+from bpy.props import (
+ BoolProperty,
+ CollectionProperty,
+ EnumProperty,
+ FloatProperty,
+ FloatVectorProperty,
+ IntProperty,
+ PointerProperty,
+ StringProperty,
+)
+from bpy.types import PropertyGroup
+
+import bonsai.bim.handler
+import bonsai.core.geometry
+import bonsai.tool as tool
+from bonsai.bim.module.spatial.data import SpatialDecompositionData
+from bonsai.bim.prop import ObjProperty
def get_subelement_class(
@@ -50,7 +51,7 @@ def get_subelement_class(
def update_elevation(self: "BIMContainer", context: bpy.types.Context) -> None:
# Try to parse the input string with unit support first
- is_valid, parsed_elevation = parse_distance_string(self.elevation, use_project_unit=True)
+ is_valid, parsed_elevation = tool.Unit.parse_distance_string(self.elevation, use_project_unit=True)
if is_valid:
elevation = parsed_elevation
diff --git a/src/bonsai/bonsai/bim/module/spatial/ui.py b/src/bonsai/bonsai/bim/module/spatial/ui.py
index acc604f992..69d9068f85 100644
--- a/src/bonsai/bonsai/bim/module/spatial/ui.py
+++ b/src/bonsai/bonsai/bim/module/spatial/ui.py
@@ -17,14 +17,21 @@
# along with Bonsai. If not, see .
from __future__ import annotations
+
+from typing import TYPE_CHECKING, Any, cast
+
import bpy
from bpy.types import Panel, UIList
-from bonsai.bim.module.spatial.data import SpatialData, SpatialDecompositionData
+
import bonsai.tool as tool
-from typing import TYPE_CHECKING, cast, Any
+from bonsai.bim.module.spatial.data import SpatialData, SpatialDecompositionData
if TYPE_CHECKING:
- from bonsai.bim.module.spatial.prop import BIMSpatialDecompositionProperties, BIMContainer, Element
+ from bonsai.bim.module.spatial.prop import (
+ BIMContainer,
+ BIMSpatialDecompositionProperties,
+ Element,
+ )
class BIM_PT_spatial(Panel):
diff --git a/src/bonsai/bonsai/bim/module/spatial/workspace.py b/src/bonsai/bonsai/bim/module/spatial/workspace.py
index aa57b03631..6f34099861 100644
--- a/src/bonsai/bonsai/bim/module/spatial/workspace.py
+++ b/src/bonsai/bonsai/bim/module/spatial/workspace.py
@@ -18,12 +18,14 @@
import os
+from functools import partial
+
import bpy
+from bpy.types import WorkSpaceTool
+
+import bonsai.core.spatial
import bonsai.tool as tool
from bonsai.bim.module.model.data import AuthoringData
-from bpy.types import WorkSpaceTool
-import bonsai.core.spatial
-from functools import partial
class SpatialTool(WorkSpaceTool):
diff --git a/src/bonsai/bonsai/bim/module/structural/__init__.py b/src/bonsai/bonsai/bim/module/structural/__init__.py
index db72ad497c..3fa0cb9497 100644
--- a/src/bonsai/bonsai/bim/module/structural/__init__.py
+++ b/src/bonsai/bonsai/bim/module/structural/__init__.py
@@ -17,7 +17,8 @@
# along with Bonsai. If not, see .
import bpy
-from . import ui, prop, operator, workspace
+
+from . import operator, prop, ui, workspace
classes = (
operator.ShowLoads,
diff --git a/src/bonsai/bonsai/bim/module/structural/data.py b/src/bonsai/bonsai/bim/module/structural/data.py
index f3215ddff3..1cdfcc2297 100644
--- a/src/bonsai/bonsai/bim/module/structural/data.py
+++ b/src/bonsai/bonsai/bim/module/structural/data.py
@@ -17,9 +17,10 @@
# along with Bonsai. If not, see .
import bpy
-import bonsai.tool as tool
import ifcopenshell.util.doc
+import bonsai.tool as tool
+
def refresh():
StructuralBoundaryConditionsData.is_loaded = False
diff --git a/src/bonsai/bonsai/bim/module/structural/decorator.py b/src/bonsai/bonsai/bim/module/structural/decorator.py
index 2bcc90c647..32925be61c 100644
--- a/src/bonsai/bonsai/bim/module/structural/decorator.py
+++ b/src/bonsai/bonsai/bim/module/structural/decorator.py
@@ -16,16 +16,18 @@
# You should have received a copy of the GNU General Public License
# along with Bonsai. If not, see .
-from mathutils import Vector
-import numpy as np
+from collections.abc import Iterable
+from typing import Union
+
+import blf
import bpy
import gpu
-import blf
-import bonsai.tool as tool
+import numpy as np
from bpy.types import SpaceView3D
from gpu_extras.batch import batch_for_shader
-from typing import Union
-from collections.abc import Iterable
+from mathutils import Vector
+
+import bonsai.tool as tool
from bonsai.bim.module.structural.load_decoration_data import ShaderInfo
diff --git a/src/bonsai/bonsai/bim/module/structural/load_decoration_data.py b/src/bonsai/bonsai/bim/module/structural/load_decoration_data.py
index 7df67e82d4..132c305ad1 100644
--- a/src/bonsai/bonsai/bim/module/structural/load_decoration_data.py
+++ b/src/bonsai/bonsai/bim/module/structural/load_decoration_data.py
@@ -16,20 +16,22 @@
# You should have received a copy of the GNU General Public License
# along with Bonsai. If not, see .
-import bpy
-import bmesh
-import numpy as np
+from collections.abc import Iterable
from math import sin
-from mathutils import Vector
+from typing import Literal, TypedDict
+
+import bmesh
+import bpy
import ifcopenshell
import ifcopenshell.util.placement
import ifcopenshell.util.representation
import ifcopenshell.util.unit
import ifcopenshell.util.unit as ifcunit
+import numpy as np
+from mathutils import Vector
+
import bonsai.tool as tool
from bonsai.bim.module.structural.shader import DecorationShader
-from typing import Literal, TypedDict
-from collections.abc import Iterable
class MemberInfo(TypedDict):
diff --git a/src/bonsai/bonsai/bim/module/structural/operator.py b/src/bonsai/bonsai/bim/module/structural/operator.py
index 9840f87c1e..edb3ab18ae 100644
--- a/src/bonsai/bonsai/bim/module/structural/operator.py
+++ b/src/bonsai/bonsai/bim/module/structural/operator.py
@@ -16,20 +16,22 @@
# You should have received a copy of the GNU General Public License
# along with Bonsai. If not, see .
-import bpy
import json
+from math import degrees
+from typing import TYPE_CHECKING, Any, Literal
+
+import bpy
import ifcopenshell
import ifcopenshell.api
import ifcopenshell.api.aggregate
import ifcopenshell.api.group
import ifcopenshell.api.structural
+from mathutils import Matrix, Vector
+
import bonsai.bim.helper
import bonsai.core.structural as core
import bonsai.tool as tool
-from math import degrees
-from mathutils import Vector, Matrix
from bonsai.bim.module.structural.decorator import LoadsDecorator
-from typing import Literal, Any, TYPE_CHECKING
class ShowLoads(bpy.types.Operator):
diff --git a/src/bonsai/bonsai/bim/module/structural/prop.py b/src/bonsai/bonsai/bim/module/structural/prop.py
index c0db44fac6..24d6ead470 100644
--- a/src/bonsai/bonsai/bim/module/structural/prop.py
+++ b/src/bonsai/bonsai/bim/module/structural/prop.py
@@ -17,27 +17,29 @@
# along with Bonsai. If not, see .
from math import radians
+from typing import TYPE_CHECKING, Union
+
import bpy
-import bonsai.tool as tool
-from bonsai.bim.prop import StrProperty, Attribute
-from bonsai.bim.module.structural.data import (
- StructuralLoadCasesData,
- StructuralLoadsData,
- BoundaryConditionsData,
- LoadGroupDecorationData,
-)
-from bpy.types import PropertyGroup
from bpy.props import (
- PointerProperty,
- StringProperty,
- EnumProperty,
BoolProperty,
- IntProperty,
+ CollectionProperty,
+ EnumProperty,
FloatProperty,
FloatVectorProperty,
- CollectionProperty,
+ IntProperty,
+ PointerProperty,
+ StringProperty,
)
-from typing import TYPE_CHECKING, Union
+from bpy.types import PropertyGroup
+
+import bonsai.tool as tool
+from bonsai.bim.module.structural.data import (
+ BoundaryConditionsData,
+ LoadGroupDecorationData,
+ StructuralLoadCasesData,
+ StructuralLoadsData,
+)
+from bonsai.bim.prop import Attribute, StrProperty
def get_load_groups_to_show(self: "BIMStructuralProperties", context: bpy.types.Context) -> list[tuple[str, str, str]]:
diff --git a/src/bonsai/bonsai/bim/module/structural/shader.py b/src/bonsai/bonsai/bim/module/structural/shader.py
index 389ed34839..d6f92028d6 100644
--- a/src/bonsai/bonsai/bim/module/structural/shader.py
+++ b/src/bonsai/bonsai/bim/module/structural/shader.py
@@ -16,9 +16,10 @@
# You should have received a copy of the GNU General Public License
# along with Bonsai. If not, see .
-import gpu
from typing import Literal
+import gpu
+
class DecorationShader:
"shader for the load decorations"
diff --git a/src/bonsai/bonsai/bim/module/structural/ui.py b/src/bonsai/bonsai/bim/module/structural/ui.py
index 44b56633a1..6d93bd3ffd 100644
--- a/src/bonsai/bonsai/bim/module/structural/ui.py
+++ b/src/bonsai/bonsai/bim/module/structural/ui.py
@@ -17,31 +17,34 @@
# along with Bonsai. If not, see .
from __future__ import annotations
+
+from typing import TYPE_CHECKING, Any, Union
+
import bpy
-import bonsai.tool as tool
-import bonsai.bim.helper
from bpy.types import Panel, UIList
+
+import bonsai.bim.helper
+import bonsai.tool as tool
from bonsai.bim.helper import draw_attributes, prop_with_search
from bonsai.bim.module.structural.data import (
- StructuralBoundaryConditionsData,
+ BoundaryConditionsData,
ConnectedStructuralMembersData,
- StructuralMemberData,
StructuralAnalysisModelsData,
+ StructuralBoundaryConditionsData,
+ StructuralConnectionData,
StructuralLoadCasesData,
StructuralLoadsData,
- StructuralConnectionData,
- BoundaryConditionsData,
+ StructuralMemberData,
)
-from typing import TYPE_CHECKING, Any, Union
if TYPE_CHECKING:
from bonsai.bim.module.structural.prop import (
- BIMStructuralProperties,
BIMObjectStructuralProperties,
+ BIMStructuralProperties,
BoundaryCondition,
- StructuralLoad,
StructuralActivity,
StructuralAnalysisModel,
+ StructuralLoad,
)
diff --git a/src/bonsai/bonsai/bim/module/structural/workspace.py b/src/bonsai/bonsai/bim/module/structural/workspace.py
index fbacac3e1a..407f017834 100644
--- a/src/bonsai/bonsai/bim/module/structural/workspace.py
+++ b/src/bonsai/bonsai/bim/module/structural/workspace.py
@@ -18,11 +18,13 @@
import os
-import bpy
-import bonsai.tool as tool
-from bpy.types import WorkSpaceTool
from functools import partial
+import bpy
+from bpy.types import WorkSpaceTool
+
+import bonsai.tool as tool
+
class StructuralTool(WorkSpaceTool):
bl_space_type = "VIEW_3D"
diff --git a/src/bonsai/bonsai/bim/module/style/__init__.py b/src/bonsai/bonsai/bim/module/style/__init__.py
index ba44a727b1..6f13fd6f2d 100644
--- a/src/bonsai/bonsai/bim/module/style/__init__.py
+++ b/src/bonsai/bonsai/bim/module/style/__init__.py
@@ -17,7 +17,8 @@
# along with Bonsai. If not, see .
import bpy
-from . import ui, prop, operator
+
+from . import operator, prop, ui
classes = (
operator.ActivateExternalStyle,
diff --git a/src/bonsai/bonsai/bim/module/style/data.py b/src/bonsai/bonsai/bim/module/style/data.py
index 83e453d7a5..dabf6f3ba7 100644
--- a/src/bonsai/bonsai/bim/module/style/data.py
+++ b/src/bonsai/bonsai/bim/module/style/data.py
@@ -16,12 +16,14 @@
# You should have received a copy of the GNU General Public License
# along with Bonsai. If not, see .
+from typing import Union
+
import bpy
import ifcopenshell
import ifcopenshell.util.schema
-import bonsai.tool as tool
from ifcopenshell.util.doc import get_entity_doc
-from typing import Union
+
+import bonsai.tool as tool
def refresh():
diff --git a/src/bonsai/bonsai/bim/module/style/operator.py b/src/bonsai/bonsai/bim/module/style/operator.py
index 4a036652f2..a26cce67f1 100644
--- a/src/bonsai/bonsai/bim/module/style/operator.py
+++ b/src/bonsai/bonsai/bim/module/style/operator.py
@@ -17,19 +17,21 @@
# along with Bonsai. If not, see .
import os
+from pathlib import Path
+from typing import Any, Union
+
import bpy
-import bonsai.bim.helper
-import bonsai.tool as tool
-import bonsai.core.style as core
import ifcopenshell.api
import ifcopenshell.api.style
import ifcopenshell.util.representation
import ifcopenshell.util.unit
-from bonsai.bim.module.style.prop import ColourRgb
from bpy_extras.io_utils import ImportHelper
-from pathlib import Path
from mathutils import Vector
-from typing import Any, Union
+
+import bonsai.bim.helper
+import bonsai.core.style as core
+import bonsai.tool as tool
+from bonsai.bim.module.style.prop import ColourRgb
# TODO: is this still relevant or can it be deleted?
diff --git a/src/bonsai/bonsai/bim/module/style/prop.py b/src/bonsai/bonsai/bim/module/style/prop.py
index 42866486c2..b1660dfd4c 100644
--- a/src/bonsai/bonsai/bim/module/style/prop.py
+++ b/src/bonsai/bonsai/bim/module/style/prop.py
@@ -16,25 +16,25 @@
# You should have received a copy of the GNU General Public License
# along with Bonsai. If not, see .
+import gettext
+from typing import TYPE_CHECKING, Literal, Union, get_args
+
import bpy
-import bonsai.tool as tool
-from bonsai.bim.prop import StrProperty, Attribute
-from bonsai.bim.module.style.data import StylesData
-from bpy.types import PropertyGroup
from bpy.props import (
- PointerProperty,
- StringProperty,
- EnumProperty,
BoolProperty,
- IntProperty,
+ CollectionProperty,
+ EnumProperty,
FloatProperty,
FloatVectorProperty,
- CollectionProperty,
+ IntProperty,
+ PointerProperty,
+ StringProperty,
)
+from bpy.types import PropertyGroup
-import gettext
-from typing import Literal, Union, TYPE_CHECKING, get_args
-
+import bonsai.tool as tool
+from bonsai.bim.module.style.data import StylesData
+from bonsai.bim.prop import Attribute, StrProperty
_ = gettext.gettext
diff --git a/src/bonsai/bonsai/bim/module/style/ui.py b/src/bonsai/bonsai/bim/module/style/ui.py
index 37c46b6d63..54ca4f5aa4 100644
--- a/src/bonsai/bonsai/bim/module/style/ui.py
+++ b/src/bonsai/bonsai/bim/module/style/ui.py
@@ -17,12 +17,15 @@
# along with Bonsai. If not, see .
from __future__ import annotations
+
+from typing import TYPE_CHECKING
+
import bpy
+from bpy.types import Panel, UIList
+
import bonsai.bim.helper
import bonsai.tool as tool
-from bpy.types import Panel, UIList
-from bonsai.bim.module.style.data import StylesData, BlenderMaterialStyleData
-from typing import TYPE_CHECKING
+from bonsai.bim.module.style.data import BlenderMaterialStyleData, StylesData
if TYPE_CHECKING:
from bonsai.bim.module.style.prop import BIMStylesProperties, Style
diff --git a/src/bonsai/bonsai/bim/module/system/__init__.py b/src/bonsai/bonsai/bim/module/system/__init__.py
index f44270cbe8..d08046ee8f 100644
--- a/src/bonsai/bonsai/bim/module/system/__init__.py
+++ b/src/bonsai/bonsai/bim/module/system/__init__.py
@@ -17,7 +17,8 @@
# along with Bonsai. If not, see .
import bpy
-from . import ui, prop, operator, decorator
+
+from . import decorator, operator, prop, ui
classes = (
operator.AddPort,
diff --git a/src/bonsai/bonsai/bim/module/system/data.py b/src/bonsai/bonsai/bim/module/system/data.py
index 5db3d60114..c5d8897cc8 100644
--- a/src/bonsai/bonsai/bim/module/system/data.py
+++ b/src/bonsai/bonsai/bim/module/system/data.py
@@ -16,14 +16,16 @@
# You should have received a copy of the GNU General Public License
# along with Bonsai. If not, see .
+from typing import Any, Union
+
import bpy
import ifcopenshell
import ifcopenshell.util.schema
import ifcopenshell.util.system
import ifcopenshell.util.unit
from ifcopenshell.util.doc import get_entity_doc
+
import bonsai.tool as tool
-from typing import Any, Union
def refresh():
diff --git a/src/bonsai/bonsai/bim/module/system/decorator.py b/src/bonsai/bonsai/bim/module/system/decorator.py
index c77b2f6879..f2448ba6e6 100644
--- a/src/bonsai/bonsai/bim/module/system/decorator.py
+++ b/src/bonsai/bonsai/bim/module/system/decorator.py
@@ -16,18 +16,19 @@
# You should have received a copy of the GNU General Public License
# along with Bonsai. If not, see .
+from math import cos, radians, sin
+
+import bmesh
import bpy
import gpu
-import bmesh
-import bonsai.tool as tool
-from math import sin, cos, radians
-from bpy.types import SpaceView3D
-from mathutils import Vector, Matrix
-from gpu_extras.batch import batch_for_shader
import ifcopenshell
-from bonsai.bim.module.system.data import SystemDecorationData
from bpy.app.handlers import persistent
+from bpy.types import SpaceView3D
+from gpu_extras.batch import batch_for_shader
+from mathutils import Matrix, Vector
+import bonsai.tool as tool
+from bonsai.bim.module.system.data import SystemDecorationData
ERROR_ELEMENTS_COLOR = (1, 0.2, 0.322, 1) # RED
UNSPECIAL_ELEMENT_COLOR = (0.2, 0.2, 0.2, 1) # GREY
diff --git a/src/bonsai/bonsai/bim/module/system/operator.py b/src/bonsai/bonsai/bim/module/system/operator.py
index 066e466bd0..8dd6724de3 100644
--- a/src/bonsai/bonsai/bim/module/system/operator.py
+++ b/src/bonsai/bonsai/bim/module/system/operator.py
@@ -16,15 +16,17 @@
# You should have received a copy of the GNU General Public License
# along with Bonsai. If not, see .
+from typing import TYPE_CHECKING
+
import bpy
import ifcopenshell.api
import ifcopenshell.api.system
import ifcopenshell.util.system
-import bonsai.tool as tool
-import bonsai.core.system as core
+
import bonsai.bim.helper
+import bonsai.core.system as core
+import bonsai.tool as tool
from bonsai.bim.module.system.data import PortData, SystemData
-from typing import TYPE_CHECKING
class LoadSystems(bpy.types.Operator):
diff --git a/src/bonsai/bonsai/bim/module/system/prop.py b/src/bonsai/bonsai/bim/module/system/prop.py
index 8954ab67f2..a40f50a90e 100644
--- a/src/bonsai/bonsai/bim/module/system/prop.py
+++ b/src/bonsai/bonsai/bim/module/system/prop.py
@@ -16,24 +16,26 @@
# You should have received a copy of the GNU General Public License
# along with Bonsai. If not, see .
+from typing import TYPE_CHECKING, Union
+
import bpy
-import bonsai.bim.handler
-import bonsai.tool as tool
-from bonsai.bim.module.system.data import SystemData
-import bonsai.bim.module.system.decorator as decorator
-from bonsai.bim.prop import StrProperty, Attribute
-from bpy.types import PropertyGroup
from bpy.props import (
- PointerProperty,
- StringProperty,
- EnumProperty,
BoolProperty,
- IntProperty,
+ CollectionProperty,
+ EnumProperty,
FloatProperty,
FloatVectorProperty,
- CollectionProperty,
+ IntProperty,
+ PointerProperty,
+ StringProperty,
)
-from typing import TYPE_CHECKING, Union
+from bpy.types import PropertyGroup
+
+import bonsai.bim.handler
+import bonsai.bim.module.system.decorator as decorator
+import bonsai.tool as tool
+from bonsai.bim.module.system.data import SystemData
+from bonsai.bim.prop import Attribute, StrProperty
def get_system_class(self: "BIMSystemProperties", context: bpy.types.Context) -> list[tuple[str, str, str]]:
diff --git a/src/bonsai/bonsai/bim/module/system/ui.py b/src/bonsai/bonsai/bim/module/system/ui.py
index e41295f40e..d621adc02b 100644
--- a/src/bonsai/bonsai/bim/module/system/ui.py
+++ b/src/bonsai/bonsai/bim/module/system/ui.py
@@ -17,16 +17,30 @@
# along with Bonsai. If not, see .
from __future__ import annotations
-import bpy
-import bonsai.bim.helper
-import bonsai.tool as tool
-from bonsai.bim.helper import prop_with_search, draw_attributes
-from bpy.types import Panel, UIList
-from bonsai.bim.module.system.data import SystemData, ZonesData, ActiveObjectZonesData, ObjectSystemData, PortData
+
from typing import TYPE_CHECKING
+import bpy
+from bpy.types import Panel, UIList
+
+import bonsai.bim.helper
+import bonsai.tool as tool
+from bonsai.bim.helper import draw_attributes, prop_with_search
+from bonsai.bim.module.system.data import (
+ ActiveObjectZonesData,
+ ObjectSystemData,
+ PortData,
+ SystemData,
+ ZonesData,
+)
+
if TYPE_CHECKING:
- from bonsai.bim.module.system.prop import BIMSystemProperties, System, BIMZoneProperties, Zone
+ from bonsai.bim.module.system.prop import (
+ BIMSystemProperties,
+ BIMZoneProperties,
+ System,
+ Zone,
+ )
FLOW_DIRECTION_TO_ICON = {
diff --git a/src/bonsai/bonsai/bim/module/tester/__init__.py b/src/bonsai/bonsai/bim/module/tester/__init__.py
index f31ac5e69a..db63d97b55 100644
--- a/src/bonsai/bonsai/bim/module/tester/__init__.py
+++ b/src/bonsai/bonsai/bim/module/tester/__init__.py
@@ -17,7 +17,8 @@
# along with Bonsai. If not, see .
import bpy
-from . import ui, prop, operator
+
+from . import operator, prop, ui
classes = (
operator.ExecuteIfcTester,
diff --git a/src/bonsai/bonsai/bim/module/tester/data.py b/src/bonsai/bonsai/bim/module/tester/data.py
index d845c210f9..1d1a1c4901 100644
--- a/src/bonsai/bonsai/bim/module/tester/data.py
+++ b/src/bonsai/bonsai/bim/module/tester/data.py
@@ -17,9 +17,10 @@
# along with Bonsai. If not, see .
import bpy
-import bonsai.tool as tool
import ifctester.reporter
+import bonsai.tool as tool
+
def refresh():
TesterData.is_loaded = False
diff --git a/src/bonsai/bonsai/bim/module/tester/operator.py b/src/bonsai/bonsai/bim/module/tester/operator.py
index 822ffd571c..6cb7999184 100644
--- a/src/bonsai/bonsai/bim/module/tester/operator.py
+++ b/src/bonsai/bonsai/bim/module/tester/operator.py
@@ -16,28 +16,30 @@
# You should have received a copy of the GNU General Public License
# along with Bonsai. If not, see .
-import os
-import bpy
-import time
-import tempfile
-import webbrowser
-import traceback
-import subprocess
-import socket
-import sys
-import threading
import asyncio
-import socketio
-from aiohttp import web
+import os
+import socket
+import subprocess
+import sys
+import tempfile
+import threading
+import time
+import traceback
+import webbrowser
+from pathlib import Path
+from typing import Union
+
+import bpy
+import ifcopenshell
import ifctester
import ifctester.ids
import ifctester.reporter
-import ifcopenshell
-import bonsai.tool as tool
-import bonsai.bim.handler
+import socketio
+from aiohttp import web
from bpy_extras.io_utils import ExportHelper
-from pathlib import Path
-from typing import Union
+
+import bonsai.bim.handler
+import bonsai.tool as tool
webapp_process = None
websocket_server_thread = None
diff --git a/src/bonsai/bonsai/bim/module/tester/prop.py b/src/bonsai/bonsai/bim/module/tester/prop.py
index fb20a0d4cd..4beb07c533 100644
--- a/src/bonsai/bonsai/bim/module/tester/prop.py
+++ b/src/bonsai/bonsai/bim/module/tester/prop.py
@@ -19,19 +19,20 @@
from typing import TYPE_CHECKING
import bpy
-from bonsai.bim.module.tester.data import TesterData
-from bonsai.bim.prop import StrProperty, MultipleFileSelect
-from bpy.types import PropertyGroup
from bpy.props import (
- PointerProperty,
- StringProperty,
- EnumProperty,
BoolProperty,
- IntProperty,
+ CollectionProperty,
+ EnumProperty,
FloatProperty,
FloatVectorProperty,
- CollectionProperty,
+ IntProperty,
+ PointerProperty,
+ StringProperty,
)
+from bpy.types import PropertyGroup
+
+from bonsai.bim.module.tester.data import TesterData
+from bonsai.bim.prop import MultipleFileSelect, StrProperty
def update_active_specification_index(self: "IfcTesterProperties", context: bpy.types.Context) -> None:
diff --git a/src/bonsai/bonsai/bim/module/tester/ui.py b/src/bonsai/bonsai/bim/module/tester/ui.py
index 66648f4e43..e20bfde1c1 100644
--- a/src/bonsai/bonsai/bim/module/tester/ui.py
+++ b/src/bonsai/bonsai/bim/module/tester/ui.py
@@ -20,12 +20,12 @@ from __future__ import annotations
from typing import TYPE_CHECKING
-from bonsai.bim.ui import draw_multiline_text
-
import bpy
from bpy.types import Panel, UIList
+
import bonsai.tool as tool
from bonsai.bim.module.tester.data import TesterData
+from bonsai.bim.ui import draw_multiline_text
if TYPE_CHECKING:
from bonsai.bim.module.tester.prop import (
diff --git a/src/bonsai/bonsai/bim/module/type/__init__.py b/src/bonsai/bonsai/bim/module/type/__init__.py
index b77bcbfb8e..0aa61167d6 100644
--- a/src/bonsai/bonsai/bim/module/type/__init__.py
+++ b/src/bonsai/bonsai/bim/module/type/__init__.py
@@ -17,7 +17,8 @@
# along with Bonsai. If not, see .
import bpy
-from . import ui, prop, operator
+
+from . import operator, prop, ui
classes = (
operator.AssignType,
diff --git a/src/bonsai/bonsai/bim/module/type/data.py b/src/bonsai/bonsai/bim/module/type/data.py
index 3d0f506986..25beb2d36d 100644
--- a/src/bonsai/bonsai/bim/module/type/data.py
+++ b/src/bonsai/bonsai/bim/module/type/data.py
@@ -17,9 +17,10 @@
# along with Bonsai. If not, see .
import bpy
-import ifcopenshell.util.type
import ifcopenshell.util.element
+import ifcopenshell.util.type
from ifcopenshell.util.doc import get_entity_doc
+
import bonsai.tool as tool
diff --git a/src/bonsai/bonsai/bim/module/type/operator.py b/src/bonsai/bonsai/bim/module/type/operator.py
index ce70f59231..8d24989f12 100644
--- a/src/bonsai/bonsai/bim/module/type/operator.py
+++ b/src/bonsai/bonsai/bim/module/type/operator.py
@@ -16,22 +16,24 @@
# You should have received a copy of the GNU General Public License
# along with Bonsai. If not, see .
-import bpy
+from typing import TYPE_CHECKING
+
import bmesh
-import ifcopenshell.util.element
-import ifcopenshell.util.schema
-import ifcopenshell.util.representation
-import ifcopenshell.util.type
-import ifcopenshell.util.unit
+import bpy
import ifcopenshell.api
import ifcopenshell.api.attribute
import ifcopenshell.api.type
+import ifcopenshell.util.element
+import ifcopenshell.util.representation
+import ifcopenshell.util.schema
+import ifcopenshell.util.type
+import ifcopenshell.util.unit
+
import bonsai.bim.helper
-import bonsai.tool as tool
import bonsai.core.geometry
-import bonsai.core.type as core
import bonsai.core.root
-from typing import TYPE_CHECKING
+import bonsai.core.type as core
+import bonsai.tool as tool
class AssignType(bpy.types.Operator, tool.Ifc.Operator):
@@ -72,7 +74,7 @@ class AssignType(bpy.types.Operator, tool.Ifc.Operator):
element = tool.Ifc.get_entity(obj)
if not element or not element.is_a("IfcObject"):
continue
- core.assign_type(tool.Ifc, tool.Type, element=element, type=relating_type)
+ core.assign_type(tool.Ifc, tool.Model, tool.Type, element=element, type=relating_type)
# Switch to the drawing's target view if available
if active_target_view and element.Representation:
@@ -382,7 +384,7 @@ class DuplicateType(bpy.types.Operator, tool.Ifc.Operator):
for selected_obj in selected_objects:
selected_element = tool.Ifc.get_entity(selected_obj)
if selected_element and selected_element.is_a("IfcObject"):
- core.assign_type(tool.Ifc, tool.Type, element=selected_element, type=new)
+ core.assign_type(tool.Ifc, tool.Model, tool.Type, element=selected_element, type=new)
if prefs.occurrence_name_style == "TYPE":
selected_obj.name = tool.Model.generate_occurrence_name(new, selected_element.is_a())
diff --git a/src/bonsai/bonsai/bim/module/type/prop.py b/src/bonsai/bonsai/bim/module/type/prop.py
index 2786636404..13141a7947 100644
--- a/src/bonsai/bonsai/bim/module/type/prop.py
+++ b/src/bonsai/bonsai/bim/module/type/prop.py
@@ -16,24 +16,26 @@
# You should have received a copy of the GNU General Public License
# along with Bonsai. If not, see .
+from typing import TYPE_CHECKING, Union
+
import bpy
import ifcopenshell.util.element
import ifcopenshell.util.type
-from bonsai.bim.module.type.data import TypeData
-from bonsai.bim.prop import Attribute
-import bonsai.tool as tool
-from typing import TYPE_CHECKING, Union
-from bpy.types import PropertyGroup
from bpy.props import (
- PointerProperty,
- StringProperty,
- EnumProperty,
BoolProperty,
- IntProperty,
+ CollectionProperty,
+ EnumProperty,
FloatProperty,
FloatVectorProperty,
- CollectionProperty,
+ IntProperty,
+ PointerProperty,
+ StringProperty,
)
+from bpy.types import PropertyGroup
+
+import bonsai.tool as tool
+from bonsai.bim.module.type.data import TypeData
+from bonsai.bim.prop import Attribute
def get_relating_type_class(self: "BIMTypeProperties", context: bpy.types.Context) -> list[tuple[str, str, str]]:
diff --git a/src/bonsai/bonsai/bim/module/type/ui.py b/src/bonsai/bonsai/bim/module/type/ui.py
index d596997d5a..fbd1edd446 100644
--- a/src/bonsai/bonsai/bim/module/type/ui.py
+++ b/src/bonsai/bonsai/bim/module/type/ui.py
@@ -17,10 +17,11 @@
# along with Bonsai. If not, see .
import bpy
-import bonsai.tool as tool
-import bonsai.bim.module.type.prop as type_prop
from bpy.types import Panel
-from bonsai.bim.helper import prop_with_search, get_display_value
+
+import bonsai.bim.module.type.prop as type_prop
+import bonsai.tool as tool
+from bonsai.bim.helper import get_display_value, prop_with_search
from bonsai.bim.module.type.data import TypeData
diff --git a/src/bonsai/bonsai/bim/module/unit/__init__.py b/src/bonsai/bonsai/bim/module/unit/__init__.py
index 29f209dcd3..a6e65f605e 100644
--- a/src/bonsai/bonsai/bim/module/unit/__init__.py
+++ b/src/bonsai/bonsai/bim/module/unit/__init__.py
@@ -17,7 +17,8 @@
# along with Bonsai. If not, see .
import bpy
-from . import ui, prop, operator
+
+from . import operator, prop, ui
classes = (
operator.AddContextDependentUnit,
diff --git a/src/bonsai/bonsai/bim/module/unit/data.py b/src/bonsai/bonsai/bim/module/unit/data.py
index 22977988bf..fc51ef3710 100644
--- a/src/bonsai/bonsai/bim/module/unit/data.py
+++ b/src/bonsai/bonsai/bim/module/unit/data.py
@@ -17,10 +17,11 @@
# along with Bonsai. If not, see .
import ifcopenshell
-import ifcopenshell.util.unit
-import ifcopenshell.util.schema
import ifcopenshell.util.attribute
+import ifcopenshell.util.schema
+import ifcopenshell.util.unit
from ifcopenshell.util.doc import get_entity_doc
+
import bonsai.tool as tool
diff --git a/src/bonsai/bonsai/bim/module/unit/operator.py b/src/bonsai/bonsai/bim/module/unit/operator.py
index f7c129aba1..da2c7edc1d 100644
--- a/src/bonsai/bonsai/bim/module/unit/operator.py
+++ b/src/bonsai/bonsai/bim/module/unit/operator.py
@@ -16,12 +16,14 @@
# You should have received a copy of the GNU General Public License
# along with Bonsai. If not, see .
+from typing import TYPE_CHECKING
+
import bpy
import ifcopenshell.api
import ifcopenshell.util.unit
-import bonsai.tool as tool
+
import bonsai.core.unit as core
-from typing import TYPE_CHECKING
+import bonsai.tool as tool
if TYPE_CHECKING:
from bpy.stub_internal import rna_enums
diff --git a/src/bonsai/bonsai/bim/module/unit/prop.py b/src/bonsai/bonsai/bim/module/unit/prop.py
index a335532294..02fe7ac803 100644
--- a/src/bonsai/bonsai/bim/module/unit/prop.py
+++ b/src/bonsai/bonsai/bim/module/unit/prop.py
@@ -16,21 +16,23 @@
# You should have received a copy of the GNU General Public License
# along with Bonsai. If not, see .
+from typing import TYPE_CHECKING
+
import bpy
-from bonsai.bim.prop import StrProperty, Attribute
-from bonsai.bim.module.unit.data import UnitsData
-from bpy.types import PropertyGroup
from bpy.props import (
- PointerProperty,
- StringProperty,
- EnumProperty,
BoolProperty,
- IntProperty,
+ CollectionProperty,
+ EnumProperty,
FloatProperty,
FloatVectorProperty,
- CollectionProperty,
+ IntProperty,
+ PointerProperty,
+ StringProperty,
)
-from typing import TYPE_CHECKING
+from bpy.types import PropertyGroup
+
+from bonsai.bim.module.unit.data import UnitsData
+from bonsai.bim.prop import Attribute, StrProperty
def get_unit_classes(self: "BIMUnitProperties", context: bpy.types.Context) -> list[tuple[str, str, str]]:
diff --git a/src/bonsai/bonsai/bim/module/unit/ui.py b/src/bonsai/bonsai/bim/module/unit/ui.py
index 9407ef01ac..703c43c3d5 100644
--- a/src/bonsai/bonsai/bim/module/unit/ui.py
+++ b/src/bonsai/bonsai/bim/module/unit/ui.py
@@ -17,13 +17,16 @@
# along with Bonsai. If not, see .
from __future__ import annotations
-import bonsai.bim.helper
-import bonsai.tool as tool
+
+from typing import TYPE_CHECKING
+
import bpy
from bpy.types import Panel, UIList
+
+import bonsai.bim.helper
+import bonsai.tool as tool
from bonsai.bim.helper import prop_with_search
from bonsai.bim.module.unit.data import UnitsData
-from typing import TYPE_CHECKING
if TYPE_CHECKING:
from bonsai.bim.module.unit.prop import BIMUnitProperties, Unit
diff --git a/src/bonsai/bonsai/bim/module/void/__init__.py b/src/bonsai/bonsai/bim/module/void/__init__.py
index f89d514ad0..1fef345a89 100644
--- a/src/bonsai/bonsai/bim/module/void/__init__.py
+++ b/src/bonsai/bonsai/bim/module/void/__init__.py
@@ -17,7 +17,8 @@
# along with Bonsai. If not, see .
import bpy
-from . import ui, prop, operator
+
+from . import operator, prop, ui
classes = (
operator.AddFilling,
diff --git a/src/bonsai/bonsai/bim/module/void/data.py b/src/bonsai/bonsai/bim/module/void/data.py
index a1999e8d21..6d1fcc12a2 100644
--- a/src/bonsai/bonsai/bim/module/void/data.py
+++ b/src/bonsai/bonsai/bim/module/void/data.py
@@ -16,11 +16,13 @@
# You should have received a copy of the GNU General Public License
# along with Bonsai. If not, see .
+from collections.abc import Generator
+from typing import Any, Union
+
import bpy
import ifcopenshell
+
import bonsai.tool as tool
-from typing import Any, Union
-from collections.abc import Generator
def refresh():
diff --git a/src/bonsai/bonsai/bim/module/void/operator.py b/src/bonsai/bonsai/bim/module/void/operator.py
index 0d2136d1d7..8c584e0b14 100644
--- a/src/bonsai/bonsai/bim/module/void/operator.py
+++ b/src/bonsai/bonsai/bim/module/void/operator.py
@@ -21,10 +21,11 @@ import ifcopenshell.api
import ifcopenshell.api.feature
import ifcopenshell.util.element
import ifcopenshell.util.representation
-import bonsai.tool as tool
+
+import bonsai.bim.handler
import bonsai.core.geometry
import bonsai.core.root
-import bonsai.bim.handler
+import bonsai.tool as tool
from bonsai.bim.module.model.opening import FilledOpeningGenerator
diff --git a/src/bonsai/bonsai/bim/module/void/prop.py b/src/bonsai/bonsai/bim/module/void/prop.py
index 0170dbd606..1c6bf088d9 100644
--- a/src/bonsai/bonsai/bim/module/void/prop.py
+++ b/src/bonsai/bonsai/bim/module/void/prop.py
@@ -16,10 +16,18 @@
# You should have received a copy of the GNU General Public License
# along with Bonsai. If not, see .
+from typing import TYPE_CHECKING, Literal, Union, get_args
+
import bpy
+from bpy.props import (
+ BoolProperty,
+ CollectionProperty,
+ EnumProperty,
+ IntProperty,
+ PointerProperty,
+ StringProperty,
+)
from bpy.types import PropertyGroup
-from bpy.props import PointerProperty, StringProperty, IntProperty, BoolProperty, CollectionProperty, EnumProperty
-from typing import Union, TYPE_CHECKING, Literal, get_args
OperatorType = Literal["DIFFERENCE", "INTERSECTION", "UNION"]
diff --git a/src/bonsai/bonsai/bim/module/void/ui.py b/src/bonsai/bonsai/bim/module/void/ui.py
index 8c80adca07..37415eb978 100644
--- a/src/bonsai/bonsai/bim/module/void/ui.py
+++ b/src/bonsai/bonsai/bim/module/void/ui.py
@@ -17,11 +17,14 @@
# along with Bonsai. If not, see .
from __future__ import annotations
+
+from typing import TYPE_CHECKING, Any
+
import bpy
-import bonsai.tool as tool
from bpy.types import Panel, UIList
+
+import bonsai.tool as tool
from bonsai.bim.module.void.data import BooleansData, VoidsData
-from typing import Any, TYPE_CHECKING
if TYPE_CHECKING:
import bpy.stub_internal.rna_enums as rna_enums
diff --git a/src/bonsai/bonsai/bim/module/web/__init__.py b/src/bonsai/bonsai/bim/module/web/__init__.py
index de3f7015a4..d2d28e0f62 100644
--- a/src/bonsai/bonsai/bim/module/web/__init__.py
+++ b/src/bonsai/bonsai/bim/module/web/__init__.py
@@ -17,7 +17,8 @@
# along with Bonsai. If not, see .
import bpy
-from . import ui, prop, operator
+
+from . import operator, prop, ui
classes = (
operator.ConnectToWebsocketServer,
diff --git a/src/bonsai/bonsai/bim/module/web/data.py b/src/bonsai/bonsai/bim/module/web/data.py
index db939cadfa..e74b7fa0b6 100644
--- a/src/bonsai/bonsai/bim/module/web/data.py
+++ b/src/bonsai/bonsai/bim/module/web/data.py
@@ -16,10 +16,12 @@
# You should have received a copy of the GNU General Public License
# along with Bonsai. If not, see .
-import bpy
-import bonsai.tool as tool
import os
+import bpy
+
+import bonsai.tool as tool
+
def refresh():
WebData.is_loaded = False
diff --git a/src/bonsai/bonsai/bim/module/web/operator.py b/src/bonsai/bonsai/bim/module/web/operator.py
index 1c8bb21e9b..8efd15494e 100644
--- a/src/bonsai/bonsai/bim/module/web/operator.py
+++ b/src/bonsai/bonsai/bim/module/web/operator.py
@@ -17,7 +17,9 @@
# along with Bonsai. If not, see .
import os
+
import bpy
+
import bonsai.core.web as core
import bonsai.tool as tool
diff --git a/src/bonsai/bonsai/bim/module/web/prop.py b/src/bonsai/bonsai/bim/module/web/prop.py
index 66ffdd4995..1538454270 100644
--- a/src/bonsai/bonsai/bim/module/web/prop.py
+++ b/src/bonsai/bonsai/bim/module/web/prop.py
@@ -17,18 +17,19 @@
# along with Bonsai. If not, see .
from typing import TYPE_CHECKING
+
import bpy
-from bpy.types import PropertyGroup
from bpy.props import (
- PointerProperty,
- StringProperty,
- EnumProperty,
BoolProperty,
- IntProperty,
+ CollectionProperty,
+ EnumProperty,
FloatProperty,
FloatVectorProperty,
- CollectionProperty,
+ IntProperty,
+ PointerProperty,
+ StringProperty,
)
+from bpy.types import PropertyGroup
class WebProperties(PropertyGroup):
diff --git a/src/bonsai/bonsai/bim/module/web/ui.py b/src/bonsai/bonsai/bim/module/web/ui.py
index 0a6fca55ae..88bd0e6e6f 100644
--- a/src/bonsai/bonsai/bim/module/web/ui.py
+++ b/src/bonsai/bonsai/bim/module/web/ui.py
@@ -17,6 +17,7 @@
# along with Bonsai. If not, see .
from bpy.types import Panel
+
import bonsai.tool as tool
from bonsai.bim.module.web.data import WebData
diff --git a/src/bonsai/bonsai/bim/operator.py b/src/bonsai/bonsai/bim/operator.py
index 3621344542..456d5ed5a0 100644
--- a/src/bonsai/bonsai/bim/operator.py
+++ b/src/bonsai/bonsai/bim/operator.py
@@ -16,40 +16,43 @@
# You should have received a copy of the GNU General Public License
# along with Bonsai. If not, see .
-import os
import contextlib
-import bpy
-import bmesh
-import time
import logging
-import textwrap
-import shutil
+import os
import platform
+import shutil
import subprocess
import tempfile
+import textwrap
+import time
import webbrowser
-import ifcopenshell
-import bonsai.bim
-import bonsai.tool as tool
-import bonsai.bim.handler
+from collections import namedtuple
+from collections.abc import Iterable
from enum import Enum
-from bpy_extras.io_utils import ImportHelper
-from bonsai.bim import import_ifc
-from bonsai.bim.prop import StrProperty
-from bonsai.bim.ui import IFCFileSelector
-from bonsai.bim.helper import get_enum_items
-from mathutils import Vector, Euler
from math import radians
from pathlib import Path
-from collections import namedtuple
-from typing import Union, TYPE_CHECKING, Literal, get_args
-from collections.abc import Iterable
+from typing import TYPE_CHECKING, Literal, Union, get_args
+
+import bmesh
+import bpy
+import ifcopenshell
+from bpy_extras.io_utils import ImportHelper
+from mathutils import Euler, Vector
from natsort import natsorted
+import bonsai.bim
+import bonsai.bim.handler
+import bonsai.tool as tool
+from bonsai.bim import import_ifc
+from bonsai.bim.helper import get_enum_items
+from bonsai.bim.prop import StrProperty
+from bonsai.bim.ui import IFCFileSelector
+
if TYPE_CHECKING:
- from bonsai.bim.prop import MultipleFileSelect, Attribute
from bpy.stub_internal import rna_enums
+ from bonsai.bim.prop import Attribute, MultipleFileSelect
+
class SetTab(bpy.types.Operator):
bl_idname = "bim.set_tab"
diff --git a/src/bonsai/bonsai/bim/prop.py b/src/bonsai/bonsai/bim/prop.py
index 2adbfab5d6..4e93c1c690 100644
--- a/src/bonsai/bonsai/bim/prop.py
+++ b/src/bonsai/bonsai/bim/prop.py
@@ -16,35 +16,37 @@
# You should have received a copy of the GNU General Public License
# along with Bonsai. If not, see .
-import os
-import bpy
import json
+import os
+from typing import TYPE_CHECKING, Any, Literal, Union, assert_never, get_args
+
+import bpy
import ifcopenshell
import ifcopenshell.util.pset
import ifcopenshell.util.unit
-from ifcopenshell.util.doc import (
- get_entity_doc,
- get_attribute_doc,
- get_property_set_doc,
- get_property_doc,
- get_predefined_type_doc,
-)
-import bonsai.bim
-import bonsai.bim.schema
-import bonsai.bim.handler
-import bonsai.tool as tool
-from bpy.types import PropertyGroup
from bpy.props import (
- PointerProperty,
- StringProperty,
- EnumProperty,
BoolProperty,
- IntProperty,
+ CollectionProperty,
+ EnumProperty,
FloatProperty,
FloatVectorProperty,
- CollectionProperty,
+ IntProperty,
+ PointerProperty,
+ StringProperty,
)
-from typing import Any, Union, Literal, get_args, TYPE_CHECKING, assert_never
+from bpy.types import PropertyGroup
+from ifcopenshell.util.doc import (
+ get_attribute_doc,
+ get_entity_doc,
+ get_predefined_type_doc,
+ get_property_doc,
+ get_property_set_doc,
+)
+
+import bonsai.bim
+import bonsai.bim.handler
+import bonsai.bim.schema
+import bonsai.tool as tool
cwd = os.path.dirname(os.path.realpath(__file__))
@@ -625,8 +627,8 @@ class BIMProperties(PropertyGroup):
items=[
("NONE", "None", ""),
("GRAM", "Gram", "Grams"),
- ("KILO/KILOGRAM", "Kilogram", "Kilograms"),
- ("MEGA/TONNE", "Tonne", "Metric Tons"),
+ ("KILO/GRAM", "Kilogram", "Kilograms"),
+ ("MEGA/GRAM", "Tonne", "Metric Tons"),
("pound", "Pound", "Pounds"),
("ounce", "Ounce", "Ounces"),
],
diff --git a/src/bonsai/bonsai/bim/schema.py b/src/bonsai/bonsai/bim/schema.py
index 7890f90006..4ef96e72a7 100644
--- a/src/bonsai/bonsai/bim/schema.py
+++ b/src/bonsai/bonsai/bim/schema.py
@@ -16,11 +16,13 @@
# You should have received a copy of the GNU General Public License
# along with Bonsai. If not, see .
+from typing import TYPE_CHECKING
+
+import bpy
import ifcopenshell
import ifcopenshell.util.pset
+
import bonsai.tool as tool
-import bpy
-from typing import TYPE_CHECKING
if TYPE_CHECKING or bpy.app.version >= (5, 0, 0):
import _bpy_restrict_state as bpy_restrict_state
diff --git a/src/bonsai/bonsai/bim/ui.py b/src/bonsai/bonsai/bim/ui.py
index 81eb4c45d0..f90d2165fb 100644
--- a/src/bonsai/bonsai/bim/ui.py
+++ b/src/bonsai/bonsai/bim/ui.py
@@ -17,49 +17,51 @@
# along with Bonsai. If not, see .
import os
-import bpy
import platform
-import platformdirs
-import bonsai.bim.helper
+import textwrap
from pathlib import Path
+from typing import TYPE_CHECKING, Literal, Optional
+
+import bpy
+import platformdirs
+from bpy.props import BoolProperty, IntProperty, StringProperty
from bpy.types import Panel
-from bpy.props import StringProperty, IntProperty, BoolProperty
from ifcopenshell.util.doc import (
+ get_attribute_doc,
get_entity_doc,
get_property_set_doc,
get_type_doc,
- get_attribute_doc,
)
-from . import ifc
-from bonsai import get_debug_info
-import bonsai.bim
-import bonsai.tool as tool
from ifcopenshell.util.file import IfcHeaderExtractor
-from bonsai.bim.prop import Attribute
+from natsort import natsorted
+
+import bonsai.bim
+import bonsai.bim.helper
+import bonsai.tool as tool
+from bonsai import get_debug_info
from bonsai.bim.module.bsdd.prop import BIMBSDDProperties, BSDDProperty
-from bonsai.bim.module.pset.prop import IfcProperty
from bonsai.bim.module.model.prop import (
BIMDoorProperties,
- BIMWindowProperties,
BIMRailingProperties,
BIMRoofProperties,
BIMStairProperties,
+ BIMWindowProperties,
)
from bonsai.bim.module.model.ui import (
draw_door_properties,
- draw_window_properties,
draw_railing_properties,
draw_roof_properties,
draw_stair_properties,
+ draw_window_properties,
)
-from typing import Optional, TYPE_CHECKING, Literal
-from natsort import natsorted
-import textwrap
+from bonsai.bim.module.pset.prop import IfcProperty
+from bonsai.bim.prop import Attribute
+from . import ifc
if TYPE_CHECKING:
- from bonsai.bim.prop import ObjProperty
from bonsai.bim.module.project.prop import BIMProjectProperties
+ from bonsai.bim.prop import ObjProperty
class IFCFileSelector:
diff --git a/src/bonsai/bonsai/core/aggregate.py b/src/bonsai/bonsai/core/aggregate.py
index a1f2723338..0b6719a180 100644
--- a/src/bonsai/bonsai/core/aggregate.py
+++ b/src/bonsai/bonsai/core/aggregate.py
@@ -17,11 +17,13 @@
# along with Bonsai. If not, see .
from __future__ import annotations
+
from typing import TYPE_CHECKING, Optional, Union
if TYPE_CHECKING:
import bpy
import ifcopenshell
+
import bonsai.tool as tool
diff --git a/src/bonsai/bonsai/core/attribute.py b/src/bonsai/bonsai/core/attribute.py
index fd41beda7a..2bc2340cd8 100644
--- a/src/bonsai/bonsai/core/attribute.py
+++ b/src/bonsai/bonsai/core/attribute.py
@@ -17,11 +17,13 @@
# along with Bonsai. If not, see .
from __future__ import annotations
+
from typing import TYPE_CHECKING, Union
if TYPE_CHECKING:
import bpy
import ifcopenshell
+
import bonsai.tool as tool
diff --git a/src/bonsai/bonsai/core/brick.py b/src/bonsai/bonsai/core/brick.py
index b285377d86..a21c6d0656 100644
--- a/src/bonsai/bonsai/core/brick.py
+++ b/src/bonsai/bonsai/core/brick.py
@@ -17,11 +17,13 @@
# along with Bonsai. If not, see .
from __future__ import annotations
+
from typing import TYPE_CHECKING, Optional, Union
if TYPE_CHECKING:
import bpy
import ifcopenshell
+
import bonsai.tool as tool
diff --git a/src/bonsai/bonsai/core/bsdd.py b/src/bonsai/bonsai/core/bsdd.py
index 3bb4513d40..1cbf610ea7 100644
--- a/src/bonsai/bonsai/core/bsdd.py
+++ b/src/bonsai/bonsai/core/bsdd.py
@@ -17,12 +17,14 @@
# along with Bonsai. If not, see .
from __future__ import annotations
-from typing import TYPE_CHECKING, Optional, Any
+
+from typing import TYPE_CHECKING, Any, Optional
if TYPE_CHECKING:
import bpy
- import ifcopenshell
import bsdd
+ import ifcopenshell
+
import bonsai.tool as tool
diff --git a/src/bonsai/bonsai/core/context.py b/src/bonsai/bonsai/core/context.py
index 626720fb33..49815881aa 100644
--- a/src/bonsai/bonsai/core/context.py
+++ b/src/bonsai/bonsai/core/context.py
@@ -17,11 +17,13 @@
# along with Bonsai. If not, see .
from __future__ import annotations
+
from typing import TYPE_CHECKING, Optional
if TYPE_CHECKING:
import bpy
import ifcopenshell
+
import bonsai.tool as tool
diff --git a/src/bonsai/bonsai/core/cost.py b/src/bonsai/bonsai/core/cost.py
index fe55d3c31c..6cd2d916c3 100644
--- a/src/bonsai/bonsai/core/cost.py
+++ b/src/bonsai/bonsai/core/cost.py
@@ -17,12 +17,14 @@
# along with Bonsai. If not, see .
from __future__ import annotations
-from typing import TYPE_CHECKING, Optional, Union, Literal
+
+from typing import TYPE_CHECKING, Literal, Optional, Union
if TYPE_CHECKING:
import bpy
import ifcopenshell
import ifcopenshell.util.cost
+
import bonsai.tool as tool
diff --git a/src/bonsai/bonsai/core/covering.py b/src/bonsai/bonsai/core/covering.py
index ffc140dac6..c308c861fc 100644
--- a/src/bonsai/bonsai/core/covering.py
+++ b/src/bonsai/bonsai/core/covering.py
@@ -17,11 +17,13 @@
# along with Bonsai. If not, see .
from __future__ import annotations
+
from typing import TYPE_CHECKING, Optional
if TYPE_CHECKING:
import bpy
import ifcopenshell
+
import bonsai.tool as tool
diff --git a/src/bonsai/bonsai/core/debug.py b/src/bonsai/bonsai/core/debug.py
index 2446a6e148..b79bd4f0e7 100644
--- a/src/bonsai/bonsai/core/debug.py
+++ b/src/bonsai/bonsai/core/debug.py
@@ -18,11 +18,13 @@
from __future__ import annotations
+
from typing import TYPE_CHECKING, Optional
if TYPE_CHECKING:
import bpy
import ifcopenshell
+
import bonsai.tool as tool
diff --git a/src/bonsai/bonsai/core/document.py b/src/bonsai/bonsai/core/document.py
index ac49fee10d..e38fc5d1e1 100644
--- a/src/bonsai/bonsai/core/document.py
+++ b/src/bonsai/bonsai/core/document.py
@@ -17,10 +17,12 @@
# along with Bonsai. If not, see .
from __future__ import annotations
+
from typing import TYPE_CHECKING, Optional
if TYPE_CHECKING:
import ifcopenshell
+
import bonsai.tool as tool
diff --git a/src/bonsai/bonsai/core/drawing.py b/src/bonsai/bonsai/core/drawing.py
index 6ce74fe394..b56b51751f 100644
--- a/src/bonsai/bonsai/core/drawing.py
+++ b/src/bonsai/bonsai/core/drawing.py
@@ -17,13 +17,15 @@
# along with Bonsai. If not, see .
from __future__ import annotations
+
from pathlib import Path
-from typing import TYPE_CHECKING, Optional, Union, Literal
+from typing import TYPE_CHECKING, Literal, Optional, Union
if TYPE_CHECKING:
import bpy
import ifcopenshell
import ifcopenshell.util.representation
+
import bonsai.tool as tool
diff --git a/src/bonsai/bonsai/core/geometry.py b/src/bonsai/bonsai/core/geometry.py
index 99512f75b8..83ba921d30 100644
--- a/src/bonsai/bonsai/core/geometry.py
+++ b/src/bonsai/bonsai/core/geometry.py
@@ -17,12 +17,14 @@
# along with Bonsai. If not, see .
from __future__ import annotations
-from typing import TYPE_CHECKING, Optional, Union
+
from collections.abc import Sequence
+from typing import TYPE_CHECKING, Optional, Union
if TYPE_CHECKING:
import bpy
import ifcopenshell
+
import bonsai.tool as tool
diff --git a/src/bonsai/bonsai/core/georeference.py b/src/bonsai/bonsai/core/georeference.py
index 419f4218ba..e74b5f577d 100644
--- a/src/bonsai/bonsai/core/georeference.py
+++ b/src/bonsai/bonsai/core/georeference.py
@@ -17,11 +17,13 @@
# along with Bonsai. If not, see .
from __future__ import annotations
+
from typing import TYPE_CHECKING, Optional
if TYPE_CHECKING:
import bpy
import ifcopenshell
+
import bonsai.tool as tool
diff --git a/src/bonsai/bonsai/core/ifcgit.py b/src/bonsai/bonsai/core/ifcgit.py
index f3a2ead14a..703013e266 100644
--- a/src/bonsai/bonsai/core/ifcgit.py
+++ b/src/bonsai/bonsai/core/ifcgit.py
@@ -17,14 +17,16 @@
# along with Bonsai. If not, see .
from __future__ import annotations
+
import platform
from typing import TYPE_CHECKING, Optional
if TYPE_CHECKING:
import bpy
- import ifcopenshell
- import bonsai.tool as tool
import git
+ import ifcopenshell
+
+ import bonsai.tool as tool
def create_repo(ifcgit: type[tool.IfcGit], ifc: type[tool.Ifc]) -> None:
diff --git a/src/bonsai/bonsai/core/library.py b/src/bonsai/bonsai/core/library.py
index 53f5f8ce8c..e6c58bf0f7 100644
--- a/src/bonsai/bonsai/core/library.py
+++ b/src/bonsai/bonsai/core/library.py
@@ -17,11 +17,13 @@
# along with Bonsai. If not, see .
from __future__ import annotations
+
from typing import TYPE_CHECKING, Optional
if TYPE_CHECKING:
import bpy
import ifcopenshell
+
import bonsai.tool as tool
diff --git a/src/bonsai/bonsai/core/material.py b/src/bonsai/bonsai/core/material.py
index 25a1df3e89..65c5955603 100644
--- a/src/bonsai/bonsai/core/material.py
+++ b/src/bonsai/bonsai/core/material.py
@@ -17,11 +17,13 @@
# along with Bonsai. If not, see .
from __future__ import annotations
+
from typing import TYPE_CHECKING, Optional, Union
if TYPE_CHECKING:
import bpy
import ifcopenshell
+
import bonsai.tool as tool
diff --git a/src/bonsai/bonsai/core/misc.py b/src/bonsai/bonsai/core/misc.py
index a69ffb2180..297b81eac8 100644
--- a/src/bonsai/bonsai/core/misc.py
+++ b/src/bonsai/bonsai/core/misc.py
@@ -17,11 +17,13 @@
# along with Bonsai. If not, see .
from __future__ import annotations
+
from typing import TYPE_CHECKING, Optional
if TYPE_CHECKING:
import bpy
import ifcopenshell
+
import bonsai.tool as tool
diff --git a/src/bonsai/bonsai/core/model.py b/src/bonsai/bonsai/core/model.py
index c82de50e0e..6edce4d100 100644
--- a/src/bonsai/bonsai/core/model.py
+++ b/src/bonsai/bonsai/core/model.py
@@ -17,15 +17,16 @@
# along with Bonsai. If not, see .
from __future__ import annotations
-from typing import TYPE_CHECKING, Optional, Literal
+
+from typing import TYPE_CHECKING, Literal, Optional
if TYPE_CHECKING:
import bpy
import ifcopenshell
- import bonsai.tool as tool
-
from mathutils import Vector
- from bonsai.bim.module.model.wall import DumbWallJoiner, DumbWallAligner
+
+ import bonsai.tool as tool
+ from bonsai.bim.module.model.wall import DumbWallAligner, DumbWallJoiner
AlignType = Literal["CENTER", "EXTERIOR", "INTERIOR"]
OffsetType = Literal["CENTER", "EXTERIOR", "INTERIOR"]
diff --git a/src/bonsai/bonsai/core/nest.py b/src/bonsai/bonsai/core/nest.py
index 645efa0eb6..4ab491666b 100644
--- a/src/bonsai/bonsai/core/nest.py
+++ b/src/bonsai/bonsai/core/nest.py
@@ -17,11 +17,13 @@
# along with Bonsai. If not, see .
from __future__ import annotations
+
from typing import TYPE_CHECKING, Optional, Union
if TYPE_CHECKING:
import bpy
import ifcopenshell
+
import bonsai.tool as tool
diff --git a/src/bonsai/bonsai/core/owner.py b/src/bonsai/bonsai/core/owner.py
index f2dd366138..90383e7885 100644
--- a/src/bonsai/bonsai/core/owner.py
+++ b/src/bonsai/bonsai/core/owner.py
@@ -17,14 +17,16 @@
# along with Bonsai. If not, see .
from __future__ import annotations
+
from typing import TYPE_CHECKING, Optional, Union
if TYPE_CHECKING:
import bpy
import ifcopenshell
- import bonsai.tool as tool
- from ifcopenshell.api.owner.add_address import ADDRESS_TYPE
from ifcopenshell.api.owner.add_actor import ACTOR_TYPE
+ from ifcopenshell.api.owner.add_address import ADDRESS_TYPE
+
+ import bonsai.tool as tool
def add_person(ifc: type[tool.Ifc]) -> ifcopenshell.entity_instance:
diff --git a/src/bonsai/bonsai/core/patch.py b/src/bonsai/bonsai/core/patch.py
index a715f11f74..4acee34494 100644
--- a/src/bonsai/bonsai/core/patch.py
+++ b/src/bonsai/bonsai/core/patch.py
@@ -18,11 +18,13 @@
from __future__ import annotations
+
from typing import TYPE_CHECKING, Optional
if TYPE_CHECKING:
import bpy
import ifcopenshell
+
import bonsai.tool as tool
diff --git a/src/bonsai/bonsai/core/profile.py b/src/bonsai/bonsai/core/profile.py
index 46e179229c..e102360062 100644
--- a/src/bonsai/bonsai/core/profile.py
+++ b/src/bonsai/bonsai/core/profile.py
@@ -17,11 +17,13 @@
# along with Bonsai. If not, see .
from __future__ import annotations
+
from typing import TYPE_CHECKING, Optional
if TYPE_CHECKING:
import bpy
import ifcopenshell
+
import bonsai.tool as tool
diff --git a/src/bonsai/bonsai/core/project.py b/src/bonsai/bonsai/core/project.py
index f699c8bfe9..18dbd3fab2 100644
--- a/src/bonsai/bonsai/core/project.py
+++ b/src/bonsai/bonsai/core/project.py
@@ -17,11 +17,13 @@
# along with Bonsai. If not, see .
from __future__ import annotations
+
from typing import TYPE_CHECKING, Optional
if TYPE_CHECKING:
import bpy
import ifcopenshell
+
import bonsai.tool as tool
diff --git a/src/bonsai/bonsai/core/pset.py b/src/bonsai/bonsai/core/pset.py
index 6a92f3d400..6af9f1e1ee 100644
--- a/src/bonsai/bonsai/core/pset.py
+++ b/src/bonsai/bonsai/core/pset.py
@@ -18,11 +18,13 @@
from __future__ import annotations
-from typing import TYPE_CHECKING, Optional, Union, Any
+
+from typing import TYPE_CHECKING, Any, Optional, Union
if TYPE_CHECKING:
import bpy
import ifcopenshell
+
import bonsai.tool as tool
diff --git a/src/bonsai/bonsai/core/qto.py b/src/bonsai/bonsai/core/qto.py
index d56130962b..40a866ac33 100644
--- a/src/bonsai/bonsai/core/qto.py
+++ b/src/bonsai/bonsai/core/qto.py
@@ -17,10 +17,12 @@
# along with Bonsai. If not, see .
from __future__ import annotations
+
from typing import TYPE_CHECKING
if TYPE_CHECKING:
import bpy
+
import bonsai.tool as tool
diff --git a/src/bonsai/bonsai/core/resource.py b/src/bonsai/bonsai/core/resource.py
index a3423c98db..cab03b7ebc 100644
--- a/src/bonsai/bonsai/core/resource.py
+++ b/src/bonsai/bonsai/core/resource.py
@@ -19,12 +19,14 @@
# ############################################################################ #
from __future__ import annotations
-from typing import TYPE_CHECKING, Optional
+
from collections.abc import Iterable
+from typing import TYPE_CHECKING, Optional
if TYPE_CHECKING:
import bpy
import ifcopenshell
+
import bonsai.tool as tool
diff --git a/src/bonsai/bonsai/core/root.py b/src/bonsai/bonsai/core/root.py
index b8f960247c..3a283a6a65 100644
--- a/src/bonsai/bonsai/core/root.py
+++ b/src/bonsai/bonsai/core/root.py
@@ -17,12 +17,15 @@
# along with Bonsai. If not, see .
from __future__ import annotations
+
from typing import TYPE_CHECKING, Optional
+
import ifcopenshell.util.element
if TYPE_CHECKING:
import bpy
import ifcopenshell
+
import bonsai.tool as tool
diff --git a/src/bonsai/bonsai/core/search.py b/src/bonsai/bonsai/core/search.py
index 5e9d279df9..cc16fb56f6 100644
--- a/src/bonsai/bonsai/core/search.py
+++ b/src/bonsai/bonsai/core/search.py
@@ -17,10 +17,12 @@
# along with Bonsai. If not, see .
from __future__ import annotations
+
from typing import TYPE_CHECKING
if TYPE_CHECKING:
import bpy
+
import bonsai.tool as tool
diff --git a/src/bonsai/bonsai/core/sequence.py b/src/bonsai/bonsai/core/sequence.py
index 610c7095b6..d62b4325ad 100644
--- a/src/bonsai/bonsai/core/sequence.py
+++ b/src/bonsai/bonsai/core/sequence.py
@@ -17,11 +17,13 @@
# along with Bonsai. If not, see .
from __future__ import annotations
+
from typing import TYPE_CHECKING, Optional, Union
if TYPE_CHECKING:
import bpy
import ifcopenshell
+
import bonsai.tool as tool
diff --git a/src/bonsai/bonsai/core/spatial.py b/src/bonsai/bonsai/core/spatial.py
index 16e11e0fa9..4207d033d4 100644
--- a/src/bonsai/bonsai/core/spatial.py
+++ b/src/bonsai/bonsai/core/spatial.py
@@ -17,11 +17,13 @@
# along with Bonsai. If not, see .
from __future__ import annotations
+
from typing import TYPE_CHECKING, Optional, Union, assert_never
if TYPE_CHECKING:
import bpy
import ifcopenshell
+
import bonsai.tool as tool
diff --git a/src/bonsai/bonsai/core/structural.py b/src/bonsai/bonsai/core/structural.py
index 4c31883fe5..c3f787905a 100644
--- a/src/bonsai/bonsai/core/structural.py
+++ b/src/bonsai/bonsai/core/structural.py
@@ -17,11 +17,13 @@
# along with Bonsai. If not, see .
from __future__ import annotations
+
from typing import TYPE_CHECKING, Optional, Union
if TYPE_CHECKING:
import bpy
import ifcopenshell
+
import bonsai.tool as tool
diff --git a/src/bonsai/bonsai/core/style.py b/src/bonsai/bonsai/core/style.py
index 85bb4200aa..20fd98509c 100644
--- a/src/bonsai/bonsai/core/style.py
+++ b/src/bonsai/bonsai/core/style.py
@@ -17,11 +17,13 @@
# along with Bonsai. If not, see .
from __future__ import annotations
-from typing import TYPE_CHECKING, Optional, Any
+
+from typing import TYPE_CHECKING, Any, Optional
if TYPE_CHECKING:
import bpy
import ifcopenshell
+
import bonsai.tool as tool
diff --git a/src/bonsai/bonsai/core/system.py b/src/bonsai/bonsai/core/system.py
index 01f1b7166e..418c472645 100644
--- a/src/bonsai/bonsai/core/system.py
+++ b/src/bonsai/bonsai/core/system.py
@@ -17,11 +17,13 @@
# along with Bonsai. If not, see .
from __future__ import annotations
+
from typing import TYPE_CHECKING, Optional, Union
if TYPE_CHECKING:
import bpy
import ifcopenshell
+
import bonsai.tool as tool
diff --git a/src/bonsai/bonsai/core/tool.py b/src/bonsai/bonsai/core/tool.py
index c07ac9f483..9d78297c4e 100644
--- a/src/bonsai/bonsai/core/tool.py
+++ b/src/bonsai/bonsai/core/tool.py
@@ -1132,7 +1132,6 @@ class Unit:
def set_active_unit(cls, unit): pass
def get_project_currency_unit(cls): pass
def get_currency_name(cls): pass
- def add_mass_and_time_units(cls): pass
@interface
class Voider:
diff --git a/src/bonsai/bonsai/core/type.py b/src/bonsai/bonsai/core/type.py
index 2918e841f7..a203b9ff76 100644
--- a/src/bonsai/bonsai/core/type.py
+++ b/src/bonsai/bonsai/core/type.py
@@ -17,50 +17,40 @@
# along with Bonsai. If not, see .
from __future__ import annotations
-import bonsai.core.geometry
+
from typing import TYPE_CHECKING, Optional
-import ifcopenshell.util.element
+
+import bonsai.core.geometry
if TYPE_CHECKING:
import bpy
import ifcopenshell
+
import bonsai.tool as tool
def assign_type(
ifc: type[tool.Ifc],
+ model: type[tool.Model],
type_tool: type[tool.Type],
element: ifcopenshell.entity_instance,
type: ifcopenshell.entity_instance,
) -> None:
-
- # Get the instance's current CardinalPoint before type assignment
- instance_cardinal_point = None
- instance_material = ifcopenshell.util.element.get_material(element)
- if instance_material and instance_material.is_a("IfcMaterialProfileSetUsage"):
- instance_cardinal_point = instance_material.CardinalPoint
-
+ usage_attributes = type_tool.record_material_usage_attributes(element)
ifc.run("type.assign_type", related_objects=[element], relating_type=type)
obj = ifc.get_object(element)
-
- if type_tool.has_material_usage(element):
- # Restore the instance's CardinalPoint to the new material usage
- if instance_cardinal_point is not None:
- new_instance_material = ifcopenshell.util.element.get_material(element)
- if new_instance_material and new_instance_material.is_a("IfcMaterialProfileSetUsage"):
- if new_instance_material.CardinalPoint != instance_cardinal_point:
- new_instance_material.CardinalPoint = instance_cardinal_point
-
- # Force representation regeneration
- from bonsai.bim.module.model.profile import DumbProfileRecalculator
-
- DumbProfileRecalculator().recalculate([obj])
- # for now, representation regeneration handled by API listeners
+ if (usage := model.get_usage_type(type)) and usage_attributes:
+ type_tool.restore_material_usage_attributes(element, usage_attributes)
+ if (usage := model.get_usage_type(type)) == "PROFILE":
+ model.regenerate_profile(obj)
+ elif usage == "LAYER2":
+ model.recalculate_walls([obj])
+ elif usage == "LAYER3":
+ model.regenerate_slab(obj)
else:
type_data = type_tool.get_object_data(ifc.get_object(type))
if type_data:
type_tool.change_object_data(obj, type_data, is_global=False)
-
type_tool.disable_editing(obj)
diff --git a/src/bonsai/bonsai/core/unit.py b/src/bonsai/bonsai/core/unit.py
index a8325f9d89..863821e6f5 100644
--- a/src/bonsai/bonsai/core/unit.py
+++ b/src/bonsai/bonsai/core/unit.py
@@ -18,11 +18,13 @@
from __future__ import annotations
+
from typing import TYPE_CHECKING, Optional
if TYPE_CHECKING:
import bpy
import ifcopenshell
+
import bonsai.tool as tool
diff --git a/src/bonsai/bonsai/core/web.py b/src/bonsai/bonsai/core/web.py
index 187d479b6b..b0d9222460 100644
--- a/src/bonsai/bonsai/core/web.py
+++ b/src/bonsai/bonsai/core/web.py
@@ -17,11 +17,13 @@
# along with Bonsai. If not, see .
from __future__ import annotations
+
from typing import TYPE_CHECKING, Optional, Union
if TYPE_CHECKING:
import bpy
import ifcopenshell
+
import bonsai.tool as tool
diff --git a/src/bonsai/bonsai/tool/__init__.py b/src/bonsai/bonsai/tool/__init__.py
index 8dae934981..68fbf0e381 100644
--- a/src/bonsai/bonsai/tool/__init__.py
+++ b/src/bonsai/bonsai/tool/__init__.py
@@ -39,8 +39,7 @@ from bonsai.tool.geometry import Geometry
from bonsai.tool.georeference import Georeference
from bonsai.tool.group import Group
from bonsai.tool.ifc import Ifc
-from bonsai.tool.ifcgit import IfcGit
-from bonsai.tool.ifcgit import IfcGitRepo
+from bonsai.tool.ifcgit import IfcGit, IfcGitRepo
from bonsai.tool.layer import Layer
from bonsai.tool.library import Library
from bonsai.tool.loader import Loader
diff --git a/src/bonsai/bonsai/tool/aggregate.py b/src/bonsai/bonsai/tool/aggregate.py
index db037c2b02..43b155a5aa 100644
--- a/src/bonsai/bonsai/tool/aggregate.py
+++ b/src/bonsai/bonsai/tool/aggregate.py
@@ -17,15 +17,21 @@
# along with Bonsai. If not, see .
from __future__ import annotations
+
+from typing import TYPE_CHECKING, Literal, Union
+
import bpy
-import bonsai.core.tool
-import bonsai.tool as tool
import ifcopenshell.util.element
import ifcopenshell.util.representation
-from typing import Union, TYPE_CHECKING, Literal
+
+import bonsai.core.tool
+import bonsai.tool as tool
if TYPE_CHECKING:
- from bonsai.bim.module.aggregate.prop import BIMAggregateProperties, BIMObjectAggregateProperties
+ from bonsai.bim.module.aggregate.prop import (
+ BIMAggregateProperties,
+ BIMObjectAggregateProperties,
+ )
class Aggregate(bonsai.core.tool.Aggregate):
diff --git a/src/bonsai/bonsai/tool/attribute.py b/src/bonsai/bonsai/tool/attribute.py
index 0515edc04c..426283ac9e 100644
--- a/src/bonsai/bonsai/tool/attribute.py
+++ b/src/bonsai/bonsai/tool/attribute.py
@@ -17,23 +17,29 @@
# along with Bonsai. If not, see .
from __future__ import annotations
-import bpy
-import bonsai.core.tool
-import bonsai.bim.helper as helper
-import bonsai.tool as tool
-import ifcopenshell
+
from typing import (
- Any,
- Optional,
- Union,
- Literal,
- TypeVar,
TYPE_CHECKING,
+ Any,
+ Literal,
+ Optional,
+ TypeVar,
+ Union,
assert_never,
)
+import bpy
+import ifcopenshell
+
+import bonsai.bim.helper as helper
+import bonsai.core.tool
+import bonsai.tool as tool
+
if TYPE_CHECKING:
- from bonsai.bim.module.attribute.prop import BIMAttributeProperties, BIMExplorerProperties
+ from bonsai.bim.module.attribute.prop import (
+ BIMAttributeProperties,
+ BIMExplorerProperties,
+ )
T = TypeVar("T")
diff --git a/src/bonsai/bonsai/tool/bcf.py b/src/bonsai/bonsai/tool/bcf.py
index b67a5a98db..c98cfeb4e0 100644
--- a/src/bonsai/bonsai/tool/bcf.py
+++ b/src/bonsai/bonsai/tool/bcf.py
@@ -17,23 +17,23 @@
# along with Bonsai. If not, see .
from __future__ import annotations
-import bcf.v2.visinfo
-import bonsai.core.tool
-import bonsai.tool as tool
-import bpy
-import bcf.v2.model
-import bcf.v2.model.visinfo
-import bcf.v2.topic
-import bcf.v3.model
-import bcf.v3.model.visinfo
-import bcf.v3.topic
+from typing import TYPE_CHECKING, Any, Optional, TypeGuard, TypeVar, Union
import bcf.agnostic.model
import bcf.agnostic.topic
import bcf.agnostic.visinfo
+import bcf.v2.model
+import bcf.v2.model.visinfo
+import bcf.v2.topic
+import bcf.v2.visinfo
+import bcf.v3.model
+import bcf.v3.model.visinfo
+import bcf.v3.topic
+import bpy
-from typing import Any, Union, TypeVar, TypeGuard, Optional, TYPE_CHECKING
+import bonsai.core.tool
+import bonsai.tool as tool
if TYPE_CHECKING:
from bonsai.bim.module.bcf.prop import BCFProperties
diff --git a/src/bonsai/bonsai/tool/blender.py b/src/bonsai/bonsai/tool/blender.py
index 24cd5071fa..d4491e104a 100644
--- a/src/bonsai/bonsai/tool/blender.py
+++ b/src/bonsai/bonsai/tool/blender.py
@@ -17,53 +17,63 @@
# along with Bonsai. If not, see .
from __future__ import annotations
-import sys
-import bpy
-import bmesh
+
+import contextlib
+import importlib
import json
import os
import platform
import subprocess
-import contextlib
+import sys
import tempfile
import traceback
+import types
+from collections.abc import Callable, Generator, Iterable, Sequence, Sized
+from datetime import datetime
+from functools import cache, lru_cache
+from pathlib import Path
+from typing import (
+ TYPE_CHECKING,
+ Any,
+ Literal,
+ Optional,
+ TypeVar,
+ Union,
+ assert_never,
+)
+
+import bmesh
+import bpy
+import ifcopenshell.api
+import ifcopenshell.util.element
import numpy as np
import numpy.typing as npt
from ifcopenshell import entity_instance
-import ifcopenshell.api
-import ifcopenshell.util.element
+from mathutils import Vector
+
+import bonsai.bim
import bonsai.core.tool
import bonsai.tool as tool
-import bonsai.bim
-import types
-import importlib
-from datetime import datetime
-from mathutils import Vector
-from pathlib import Path
-from functools import lru_cache, cache
from bonsai.bim.ifc import IFC_CONNECTED_TYPE
-from typing import (
- Any,
- Optional,
- Union,
- Literal,
- TypeVar,
- TYPE_CHECKING,
- assert_never,
-)
-from collections.abc import Iterable, Callable, Generator, Sequence, Sized
if TYPE_CHECKING:
- from sun_position.properties import SunPosProperties
import bpy.stub_internal.rna_enums as rna_enums
- from bonsai.bim.prop import BIMProperties, BIMObjectProperties, BIMSnapProperties
+ from sun_position.properties import SunPosProperties
+
from bonsai.bim.module.attribute.prop import BIMAttributeProperties
- from bonsai.bim.module.constraint.prop import BIMConstraintProperties, BIMObjectConstraintProperties
+ from bonsai.bim.module.constraint.prop import (
+ BIMConstraintProperties,
+ BIMObjectConstraintProperties,
+ )
from bonsai.bim.module.covetool.prop import CoveToolProperties
from bonsai.bim.module.csv.prop import CsvProperties
from bonsai.bim.module.diff.prop import DiffProperties
from bonsai.bim.module.fm.prop import BIMFMProperties
- from bonsai.bim.module.light.prop import BIMSolarProperties, RadianceExporterProperties
+ from bonsai.bim.module.light.prop import (
+ BIMSolarProperties,
+ RadianceExporterProperties,
+ )
+ from bonsai.bim.prop import BIMObjectProperties, BIMProperties, BIMSnapProperties
T = TypeVar("T")
@@ -1223,7 +1233,8 @@ class Blender(bonsai.core.tool.Blender):
@classmethod
def constrain_children_to_parent(cls, parent_element: ifcopenshell.entity_instance) -> None:
- parent_obj = tool.Ifc.get_object(parent_element)
+ if not (parent_obj := tool.Ifc.get_object(parent_element)):
+ return # Filtered out, arrayed void, etc
assert isinstance(parent_obj, bpy.types.Object)
children = cls.get_all_children_objects(parent_element)
for child in children:
@@ -1348,11 +1359,11 @@ class Blender(bonsai.core.tool.Blender):
@classmethod
def register_toolbar(cls):
- import bonsai.bim.module.model.workspace as ws_model
+ import bonsai.bim.module.covering.workspace as ws_covering
import bonsai.bim.module.drawing.workspace as ws_drawing
+ import bonsai.bim.module.model.workspace as ws_model
import bonsai.bim.module.spatial.workspace as ws_spatial
import bonsai.bim.module.structural.workspace as ws_structural
- import bonsai.bim.module.covering.workspace as ws_covering
if bpy.app.background:
return
@@ -1380,11 +1391,11 @@ class Blender(bonsai.core.tool.Blender):
@classmethod
def unregister_toolbar(cls):
- import bonsai.bim.module.model.workspace as ws_model
+ import bonsai.bim.module.covering.workspace as ws_covering
import bonsai.bim.module.drawing.workspace as ws_drawing
+ import bonsai.bim.module.model.workspace as ws_model
import bonsai.bim.module.spatial.workspace as ws_spatial
import bonsai.bim.module.structural.workspace as ws_structural
- import bonsai.bim.module.covering.workspace as ws_covering
if bpy.app.background:
return
@@ -1762,8 +1773,8 @@ class Blender(bonsai.core.tool.Blender):
@classmethod
@lru_cache
def get_list_of_tools(cls) -> tuple[str, ...]:
- from bonsai.bim.module.model.workspace import BimTool
from bonsai.bim.module.drawing.workspace import AnnotationTool
+ from bonsai.bim.module.model.workspace import BimTool
return tuple(cls.bl_idname for cls in (BimTool.__subclasses__() + [BimTool, AnnotationTool]))
diff --git a/src/bonsai/bonsai/tool/boundary.py b/src/bonsai/bonsai/tool/boundary.py
index d09ebcbee1..16662919aa 100644
--- a/src/bonsai/bonsai/tool/boundary.py
+++ b/src/bonsai/bonsai/tool/boundary.py
@@ -17,16 +17,22 @@
# along with Bonsai. If not, see .
from __future__ import annotations
+
+from collections.abc import Sequence
+from typing import TYPE_CHECKING, Any
+
import bpy
import mathutils
+from mathutils import Matrix, Vector
+
import bonsai.core.tool
import bonsai.tool as tool
-from mathutils import Matrix, Vector
-from typing import Any, TYPE_CHECKING
-from collections.abc import Sequence
if TYPE_CHECKING:
- from bonsai.bim.module.boundary.prop import BIMBoundaryProperties, BIMObjectBoundaryProperties
+ from bonsai.bim.module.boundary.prop import (
+ BIMBoundaryProperties,
+ BIMObjectBoundaryProperties,
+ )
class Boundary(bonsai.core.tool.Boundary):
diff --git a/src/bonsai/bonsai/tool/brick.py b/src/bonsai/bonsai/tool/brick.py
index 9da53f4413..42b80cc288 100644
--- a/src/bonsai/bonsai/tool/brick.py
+++ b/src/bonsai/bonsai/tool/brick.py
@@ -17,28 +17,32 @@
# along with Bonsai. If not, see .
from __future__ import annotations
-import os
-import bpy
+
import datetime
+import os
+from collections.abc import Generator
+from contextlib import contextmanager
+from pathlib import Path
+from typing import TYPE_CHECKING, Any, Union
+
+import bpy
import ifcopenshell
import ifcopenshell.guid
import ifcopenshell.util.brick
import ifcopenshell.util.element
import ifcopenshell.util.system
+
import bonsai.core.brick
import bonsai.core.tool
import bonsai.tool as tool
-from pathlib import Path
-from contextlib import contextmanager
-from typing import Any, Union, TYPE_CHECKING
-from collections.abc import Generator
try:
+ import urllib.parse
+
import brickschema
import brickschema.persistent
from brickschema.namespaces import REF, A
- import urllib.parse
- from rdflib import Literal, URIRef, Namespace, BNode
+ from rdflib import BNode, Literal, Namespace, URIRef
from rdflib.namespace import RDF
except:
# See #1860
@@ -46,7 +50,8 @@ except:
if TYPE_CHECKING:
import brickschema
- from rdflib import Literal, URIRef, Namespace, BNode
+ from rdflib import BNode, Literal, Namespace, URIRef
+
from bonsai.bim.module.brick.prop import BIMBrickProperties
# silence known rdflib_sqlalchemy TypeError warning
diff --git a/src/bonsai/bonsai/tool/bsdd.py b/src/bonsai/bonsai/tool/bsdd.py
index 337cf626c9..dc42708867 100644
--- a/src/bonsai/bonsai/tool/bsdd.py
+++ b/src/bonsai/bonsai/tool/bsdd.py
@@ -17,16 +17,19 @@
# along with Bonsai. If not, see .
from __future__ import annotations
-import bonsai.core.tool
-import bonsai.tool as tool
-import bpy
+
import json
+from typing import TYPE_CHECKING, Any, TypedDict, Union
+
+import bpy
import bsdd
import ifcopenshell.api.library
-import ifcopenshell.util.type
-import ifcopenshell.util.element
import ifcopenshell.util.classification
-from typing import Any, Union, TYPE_CHECKING, TypedDict
+import ifcopenshell.util.element
+import ifcopenshell.util.type
+
+import bonsai.core.tool
+import bonsai.tool as tool
if TYPE_CHECKING:
from bonsai.bim.module.bsdd.prop import BIMBSDDProperties, BSDDDictionary
diff --git a/src/bonsai/bonsai/tool/cad.py b/src/bonsai/bonsai/tool/cad.py
index 8c65f4babb..4e3d8e1499 100644
--- a/src/bonsai/bonsai/tool/cad.py
+++ b/src/bonsai/bonsai/tool/cad.py
@@ -29,16 +29,18 @@
# - You can now derive the center from an arc without generating geometry
from __future__ import annotations
-import sys
-import bpy
-import math
-import bmesh
-import numpy as np
-import mathutils.geometry
-from mathutils import Vector, Matrix, geometry
+
import itertools
+import math
+import sys
from typing import TYPE_CHECKING, Union
+import bmesh
+import bpy
+import mathutils.geometry
+import numpy as np
+from mathutils import Matrix, Vector, geometry
+
if TYPE_CHECKING:
from bonsai.bim.module.cad.prop import BIMCadProperties
diff --git a/src/bonsai/bonsai/tool/clash.py b/src/bonsai/bonsai/tool/clash.py
index 17582540e4..7c9961646c 100644
--- a/src/bonsai/bonsai/tool/clash.py
+++ b/src/bonsai/bonsai/tool/clash.py
@@ -17,17 +17,20 @@
# along with Bonsai. If not, see .
from __future__ import annotations
-import os
-import bpy
+
import json
-import ifcopenshell
-import bonsai.core.tool
-import bonsai.tool as tool
+import os
from contextlib import contextmanager
-from mathutils import Vector
+from typing import TYPE_CHECKING, Literal, Union, get_args
+
+import bpy
+import ifcopenshell
from ifcclash import ifcclash
from ifcclash.ifcclash import ClashSource
-from typing import TYPE_CHECKING, Union, Literal, get_args
+from mathutils import Vector
+
+import bonsai.core.tool
+import bonsai.tool as tool
if TYPE_CHECKING:
from bonsai.bim.module.clash.prop import BIMClashProperties
diff --git a/src/bonsai/bonsai/tool/classification.py b/src/bonsai/bonsai/tool/classification.py
index 3535e0a12f..7b2ebb073e 100644
--- a/src/bonsai/bonsai/tool/classification.py
+++ b/src/bonsai/bonsai/tool/classification.py
@@ -17,15 +17,21 @@
# along with Bonsai. If not, see .
from __future__ import annotations
+
+from typing import TYPE_CHECKING, Union, assert_never
+
import bpy
import ifcopenshell.api
import ifcopenshell.util.classification
+
import bonsai.core.tool
import bonsai.tool as tool
-from typing import Union, assert_never, TYPE_CHECKING
if TYPE_CHECKING:
- from bonsai.bim.module.classification.prop import BIMClassificationReferenceProperties, BIMClassificationProperties
+ from bonsai.bim.module.classification.prop import (
+ BIMClassificationProperties,
+ BIMClassificationReferenceProperties,
+ )
class Classification(bonsai.core.tool.Classification):
diff --git a/src/bonsai/bonsai/tool/collector.py b/src/bonsai/bonsai/tool/collector.py
index c357287a6b..01c13d6cec 100644
--- a/src/bonsai/bonsai/tool/collector.py
+++ b/src/bonsai/bonsai/tool/collector.py
@@ -16,11 +16,13 @@
# You should have received a copy of the GNU General Public License
# along with Bonsai. If not, see .
+from typing import Union
+
import bpy
+import ifcopenshell.util.element
+
import bonsai.core.tool
import bonsai.tool as tool
-import ifcopenshell.util.element
-from typing import Union
class Collector(bonsai.core.tool.Collector):
diff --git a/src/bonsai/bonsai/tool/context.py b/src/bonsai/bonsai/tool/context.py
index c1582cd37f..50223a6320 100644
--- a/src/bonsai/bonsai/tool/context.py
+++ b/src/bonsai/bonsai/tool/context.py
@@ -17,16 +17,19 @@
# along with Bonsai. If not, see .
from __future__ import annotations
+
+from typing import TYPE_CHECKING, Any, Union
+
import bpy
-import bonsai.bim.helper
-import bonsai.tool as tool
-import bonsai.core.tool
import ifcopenshell
-from typing import Any, Union, TYPE_CHECKING
+
+import bonsai.bim.helper
+import bonsai.core.tool
+import bonsai.tool as tool
if TYPE_CHECKING:
- from bonsai.bim.prop import Attribute
from bonsai.bim.module.context.prop import BIMContextProperties
+ from bonsai.bim.prop import Attribute
class Context(bonsai.core.tool.Context):
diff --git a/src/bonsai/bonsai/tool/cost.py b/src/bonsai/bonsai/tool/cost.py
index d1ee2a841c..771b15f43e 100644
--- a/src/bonsai/bonsai/tool/cost.py
+++ b/src/bonsai/bonsai/tool/cost.py
@@ -17,26 +17,29 @@
# along with Bonsai. If not, see .
from __future__ import annotations
+
+import json
+from collections.abc import Generator
+from pathlib import Path
+from typing import TYPE_CHECKING, Any, Literal, Optional, Union, assert_never
+
import bpy
-import bonsai.core.tool
-import bonsai.tool as tool
import ifcopenshell.api
import ifcopenshell.api.cost
import ifcopenshell.api.document
import ifcopenshell.api.nest
-import ifcopenshell.util.element
-import ifcopenshell.util.date
import ifcopenshell.util.cost
+import ifcopenshell.util.date
+import ifcopenshell.util.element
import ifcopenshell.util.unit
+
import bonsai.bim.helper
-import json
-from pathlib import Path
-from typing import Optional, Any, Union, Literal, TYPE_CHECKING, assert_never
-from collections.abc import Generator
+import bonsai.core.tool
+import bonsai.tool as tool
if TYPE_CHECKING:
- from bonsai.bim.prop import Attribute
from bonsai.bim.module.cost.prop import BIMCostProperties, CostItemQuantity
+ from bonsai.bim.prop import Attribute
class Cost(bonsai.core.tool.Cost):
@@ -581,9 +584,10 @@ class Cost(bonsai.core.tool.Cost):
) -> ifcopenshell.entity_instance:
if not file_path:
return
- from ifc5d.csv2ifc import Csv2Ifc
import time
+ from ifc5d.csv2ifc import Csv2Ifc
+
start = time.time()
resolved_path = tool.Ifc.resolve_uri(file_path)
@@ -804,8 +808,8 @@ class Cost(bonsai.core.tool.Cost):
format: Literal["CSV", "ODS", "XLSX"],
cost_schedule: Optional[ifcopenshell.entity_instance] = None,
) -> Union[str, None]:
- import subprocess
import os
+ import subprocess
import sys
if dirpath:
diff --git a/src/bonsai/bonsai/tool/covering.py b/src/bonsai/bonsai/tool/covering.py
index c83a6f3e09..018a39eb46 100644
--- a/src/bonsai/bonsai/tool/covering.py
+++ b/src/bonsai/bonsai/tool/covering.py
@@ -17,12 +17,15 @@
# along with Bonsai. If not, see .
from __future__ import annotations
+
+from typing import TYPE_CHECKING
+
import bpy
import ifcopenshell
import ifcopenshell.util.element
+
import bonsai.core.tool
import bonsai.tool as tool
-from typing import TYPE_CHECKING
if TYPE_CHECKING:
from bonsai.bim.module.covering.prop import BIMCoveringProperties
diff --git a/src/bonsai/bonsai/tool/debug.py b/src/bonsai/bonsai/tool/debug.py
index 8bd17fa1c1..ccd30ddd74 100644
--- a/src/bonsai/bonsai/tool/debug.py
+++ b/src/bonsai/bonsai/tool/debug.py
@@ -17,25 +17,28 @@
# along with Bonsai. If not, see .
from __future__ import annotations
+
+import json
import os
import re
-import json
+from collections import defaultdict
+from collections.abc import Iterable
+from typing import TYPE_CHECKING, Literal, Union, assert_never
+
import bmesh
import bpy
-import ifcopenshell.ifcopenshell_wrapper as W
import ifcopenshell.api.material
import ifcopenshell.api.owner
import ifcopenshell.express
+import ifcopenshell.ifcopenshell_wrapper as W
import ifcopenshell.util.element
import ifcopenshell.util.schema
+from mathutils import Vector
+
import bonsai.core.style
import bonsai.core.tool
import bonsai.tool as tool
from bonsai.bim.ifc import IfcStore
-from mathutils import Vector
-from collections import defaultdict
-from typing import Literal, TYPE_CHECKING, assert_never, Union
-from collections.abc import Iterable
if TYPE_CHECKING:
from bonsai.bim.module.debug.prop import BIMDebugProperties
diff --git a/src/bonsai/bonsai/tool/demo.py b/src/bonsai/bonsai/tool/demo.py
index 745fcf914c..98375b3e3b 100644
--- a/src/bonsai/bonsai/tool/demo.py
+++ b/src/bonsai/bonsai/tool/demo.py
@@ -31,11 +31,13 @@
from __future__ import annotations
+from typing import TYPE_CHECKING
+
import bpy
import ifcopenshell
+
import bonsai.core.tool
import bonsai.tool as tool
-from typing import TYPE_CHECKING
if TYPE_CHECKING:
from bonsai.bim.module.demo.prop import BIMDemoProperties
diff --git a/src/bonsai/bonsai/tool/document.py b/src/bonsai/bonsai/tool/document.py
index bf8e4d17b8..5d0aaf1a8e 100644
--- a/src/bonsai/bonsai/tool/document.py
+++ b/src/bonsai/bonsai/tool/document.py
@@ -17,14 +17,17 @@
# along with Bonsai. If not, see .
from __future__ import annotations
+
+import json
+from typing import TYPE_CHECKING, Any, Union
+
import bpy
import ifcopenshell.util.system
+from natsort import natsorted
+
import bonsai.bim.helper
import bonsai.core.tool
import bonsai.tool as tool
-import json
-from natsort import natsorted
-from typing import Any, Union, TYPE_CHECKING
if TYPE_CHECKING:
from bonsai.bim.module.document.prop import BIMDocumentProperties
diff --git a/src/bonsai/bonsai/tool/drawing.py b/src/bonsai/bonsai/tool/drawing.py
index 3f1c6de28d..51d06c1c18 100644
--- a/src/bonsai/bonsai/tool/drawing.py
+++ b/src/bonsai/bonsai/tool/drawing.py
@@ -17,60 +17,63 @@
# along with Bonsai. If not, see .
from __future__ import annotations
-import os
-import re
+
import collections
import collections.abc
-import bpy
-import math
import json
-import lark
-import bmesh
-import shutil
import logging
-import shapely
+import math
+import os
import platform
-import mathutils
+import re
+import shutil
import subprocess
-import numpy as np
-import bonsai.core.tool
-import bonsai.core.geometry
-import bonsai.core.type
-import bonsai.tool as tool
+from collections.abc import Iterable, Sequence
+from fractions import Fraction
+from pathlib import Path
+from typing import TYPE_CHECKING, Any, Literal, NamedTuple, Optional, Union
+
+import bmesh
+import bpy
import ifcopenshell.api
-import ifcopenshell.api.geometry
import ifcopenshell.api.context
-import ifcopenshell.api.drawing
import ifcopenshell.api.document
+import ifcopenshell.api.drawing
+import ifcopenshell.api.geometry
import ifcopenshell.api.pset
import ifcopenshell.api.root
import ifcopenshell.geom
-import ifcopenshell.util.placement
-import ifcopenshell.util.unit
-import ifcopenshell.util.representation
import ifcopenshell.util.element
+import ifcopenshell.util.placement
+import ifcopenshell.util.representation
import ifcopenshell.util.selector
import ifcopenshell.util.shape
+import ifcopenshell.util.unit
+import lark
+import mathutils
+import numpy as np
+import shapely
+from ifcopenshell.util.shape_builder import ShapeBuilder
+from lxml import etree
+from mathutils import Matrix, Vector
+from shapely.ops import unary_union
+
import bonsai.bim.helper
import bonsai.bim.import_ifc
+import bonsai.core.geometry
import bonsai.core.root
-from shapely.ops import unary_union
-from lxml import etree
-from mathutils import Vector, Matrix
-from fractions import Fraction
-from typing import Optional, Union, Any, Literal, TYPE_CHECKING, NamedTuple
-from collections.abc import Iterable, Sequence
-from pathlib import Path
-from ifcopenshell.util.shape_builder import ShapeBuilder
+import bonsai.core.tool
+import bonsai.core.type
+import bonsai.tool as tool
if TYPE_CHECKING:
from bonsai.bim.module.drawing.prop import (
+ BIMAnnotationProperties,
+ BIMAssignedProductProperties,
+ BIMCameraProperties,
+ BIMTextProperties,
DocProperties,
Sheet,
- BIMAnnotationProperties,
- BIMTextProperties,
- BIMCameraProperties,
- BIMAssignedProductProperties,
)
from bonsai.bim.module.drawing.prop import Drawing as DrawingProperties
@@ -1276,7 +1279,7 @@ class Drawing(bonsai.core.tool.Drawing):
@classmethod
def run_type_assign_type(cls, element: ifcopenshell.entity_instance, relating_type: ifcopenshell.entity_instance):
- return bonsai.core.type.assign_type(tool.Ifc, tool.Type, element=element, type=relating_type)
+ return bonsai.core.type.assign_type(tool.Ifc, tool.Model, tool.Type, element=element, type=relating_type)
@classmethod
def reload_representation(cls, obj: bpy.types.Object, representation: ifcopenshell.entity_instance):
@@ -2793,9 +2796,10 @@ class Drawing(bonsai.core.tool.Drawing):
@classmethod
def convert_svg_to_dxf(cls, svg_filepath: Path, dxf_filepath: Path) -> None:
- import ezdxf
import xml.etree.ElementTree as ET
+ import ezdxf
+
SVG = "{http://www.w3.org/2000/svg}"
IFC = "{http://www.ifcopenshell.org/ns}"
diff --git a/src/bonsai/bonsai/tool/feature.py b/src/bonsai/bonsai/tool/feature.py
index adc6cd9528..d58a8df55c 100644
--- a/src/bonsai/bonsai/tool/feature.py
+++ b/src/bonsai/bonsai/tool/feature.py
@@ -17,16 +17,19 @@
# along with Bonsai. If not, see .
from __future__ import annotations
+
+from collections.abc import Iterable
+from typing import TYPE_CHECKING
+
import bpy
-import bonsai.core.tool
-import bonsai.tool as tool
-import bonsai.bim.helper
-import bonsai.core.geometry
import ifcopenshell
import ifcopenshell.api.feature
import ifcopenshell.util.representation
-from typing import TYPE_CHECKING
-from collections.abc import Iterable
+
+import bonsai.bim.helper
+import bonsai.core.geometry
+import bonsai.core.tool
+import bonsai.tool as tool
if TYPE_CHECKING:
from bonsai.bim.module.void.prop import BIMBooleanProperties
diff --git a/src/bonsai/bonsai/tool/geometry.py b/src/bonsai/bonsai/tool/geometry.py
index e2955d3d28..5a6429adfe 100644
--- a/src/bonsai/bonsai/tool/geometry.py
+++ b/src/bonsai/bonsai/tool/geometry.py
@@ -17,14 +17,27 @@
# along with Bonsai. If not, see .
from __future__ import annotations
-import bpy
-import bmesh
-import struct
+
import hashlib
import logging
-import numpy as np
-import numpy.typing as npt
import multiprocessing
+import struct
+from collections import defaultdict
+from collections.abc import Generator, Iterable, Iterator
+from math import pi, radians
+from typing import (
+ TYPE_CHECKING,
+ Any,
+ Literal,
+ Optional,
+ TypeGuard,
+ Union,
+ cast,
+ get_args,
+)
+
+import bmesh
+import bpy
import ifcopenshell
import ifcopenshell.api
import ifcopenshell.api.boundary
@@ -45,37 +58,30 @@ import ifcopenshell.util.shape
import ifcopenshell.util.shape_builder
import ifcopenshell.util.system
import ifcopenshell.util.unit
-import bonsai.core.tool
+import numpy as np
+import numpy.typing as npt
+from mathutils import Matrix, Vector
+from mathutils.bvhtree import BVHTree
+from typing_extensions import TypeIs
+
+import bonsai.bim.helper
+import bonsai.bim.import_ifc
import bonsai.core.drawing
import bonsai.core.geometry
import bonsai.core.root
import bonsai.core.spatial
import bonsai.core.style
import bonsai.core.system
+import bonsai.core.tool
import bonsai.tool as tool
-import bonsai.bim.helper
-import bonsai.bim.import_ifc
-from collections import defaultdict
-from math import radians, pi
-from mathutils import Vector, Matrix
-from mathutils.bvhtree import BVHTree
from bonsai.bim.ifc import IfcStore
-from typing import (
- Union,
- Optional,
- Literal,
- TYPE_CHECKING,
- get_args,
- cast,
- TypeGuard,
- Any,
-)
-from collections.abc import Iterable, Iterator, Generator
-from typing_extensions import TypeIs
if TYPE_CHECKING:
+ from bonsai.bim.module.geometry.prop import (
+ BIMGeometryProperties,
+ BIMObjectGeometryProperties,
+ )
from bonsai.bim.prop import Attribute, BIMMeshProperties
- from bonsai.bim.module.geometry.prop import BIMObjectGeometryProperties, BIMGeometryProperties
class Geometry(bonsai.core.tool.Geometry):
@@ -1797,6 +1803,10 @@ class Geometry(bonsai.core.tool.Geometry):
def import_item_attributes(cls, obj: bpy.types.Object) -> None:
props = tool.Geometry.get_mesh_props(obj.data)
props.item_attributes.clear()
+ element = tool.Ifc.get_entity(tool.Geometry.get_geometry_props().representation_obj)
+ if tool.Model.get_usage_type(element) == "LAYER3":
+ return # All LAYER3 attributes are parametrically determined from the IfcMaterialLayerSet
+
item = tool.Ifc.get().by_id(props.ifc_definition_id)
allowed_attributes = [
a.name()
@@ -2106,6 +2116,14 @@ class Geometry(bonsai.core.tool.Geometry):
active_object: Optional[bpy.types.Object] = None,
linked: bool = False,
) -> tuple[dict[ifcopenshell.entity_instance, list[ifcopenshell.entity_instance]], Union[bpy.types.Object, None]]:
+ """Duplicate IFC objects
+
+ Duplication is surprisingly complicated because you might only select
+ part of a group of related items.
+
+ TODO: write some tests and figure out how to make this function
+ actually understandable.
+ """
# Handle arrays
objects_to_duplicate = set(objects_to_duplicate)
arrays_to_duplicate, array_children = cls.process_arrays_for_duplication(objects_to_duplicate)
diff --git a/src/bonsai/bonsai/tool/georeference.py b/src/bonsai/bonsai/tool/georeference.py
index 7b56adbab2..eefdd12cd9 100644
--- a/src/bonsai/bonsai/tool/georeference.py
+++ b/src/bonsai/bonsai/tool/georeference.py
@@ -17,22 +17,25 @@
# along with Bonsai. If not, see .
from __future__ import annotations
-import bpy
+
import json
-import numpy as np
+from typing import TYPE_CHECKING, Any, Literal, Union
+
+import bpy
import ifcopenshell
import ifcopenshell.api.georeference
import ifcopenshell.util.geolocation
import ifcopenshell.util.placement
import ifcopenshell.util.unit
+import numpy as np
+
+import bonsai.bim.helper
import bonsai.core.tool
import bonsai.tool as tool
-import bonsai.bim.helper
-from typing import Any, Union, Literal, TYPE_CHECKING
if TYPE_CHECKING:
- from bonsai.bim.prop import Attribute
from bonsai.bim.module.georeference.prop import BIMGeoreferenceProperties
+ from bonsai.bim.prop import Attribute
class Georeference(bonsai.core.tool.Georeference):
diff --git a/src/bonsai/bonsai/tool/group.py b/src/bonsai/bonsai/tool/group.py
index d800904bf8..f0f3664f6f 100644
--- a/src/bonsai/bonsai/tool/group.py
+++ b/src/bonsai/bonsai/tool/group.py
@@ -17,17 +17,21 @@
# along with Bonsai. If not, see .
from __future__ import annotations
+
import json
+from typing import TYPE_CHECKING, Literal, Union, assert_never
+
import bpy
import ifcopenshell
+from natsort import natsorted
+
import bonsai.bim.helper
import bonsai.core.tool
import bonsai.tool as tool
-from typing import TYPE_CHECKING, Literal, assert_never, Union
-from natsort import natsorted
if TYPE_CHECKING:
- from bonsai.bim.module.group.prop import BIMGroupProperties, Group as GroupProp
+ from bonsai.bim.module.group.prop import BIMGroupProperties
+ from bonsai.bim.module.group.prop import Group as GroupProp
from bonsai.bim.module.system.prop import BIMSystemProperties, System
diff --git a/src/bonsai/bonsai/tool/ifc.py b/src/bonsai/bonsai/tool/ifc.py
index 9f1c84e6d1..81c5202c19 100644
--- a/src/bonsai/bonsai/tool/ifc.py
+++ b/src/bonsai/bonsai/tool/ifc.py
@@ -17,20 +17,23 @@
# along with Bonsai. If not, see .
from __future__ import annotations
+
import os
+from pathlib import Path
+from typing import TYPE_CHECKING, Any, Literal, Optional, Union, final
+
import bpy
-import numpy as np
import ifcopenshell.api
import ifcopenshell.ifcopenshell_wrapper as ifcopenshell_wrapper
import ifcopenshell.util.element
import ifcopenshell.util.schema
-import bonsai.core.tool
+import numpy as np
+
import bonsai.bim.handler
import bonsai.bim.schema
+import bonsai.core.tool
import bonsai.tool as tool
-from pathlib import Path
-from bonsai.bim.ifc import IfcStore, IFC_CONNECTED_TYPE
-from typing import Optional, Union, Any, final, Literal, TYPE_CHECKING
+from bonsai.bim.ifc import IFC_CONNECTED_TYPE, IfcStore
if TYPE_CHECKING:
from bpy.stub_internal import rna_enums
diff --git a/src/bonsai/bonsai/tool/ifcgit.py b/src/bonsai/bonsai/tool/ifcgit.py
index 7dfb2431d0..6854b38432 100644
--- a/src/bonsai/bonsai/tool/ifcgit.py
+++ b/src/bonsai/bonsai/tool/ifcgit.py
@@ -17,17 +17,20 @@
# along with Bonsai. If not, see .
from __future__ import annotations
+
+import logging
import os
import re
import subprocess
-import bpy
-import logging
import tempfile
+from pathlib import Path
+from typing import TYPE_CHECKING, Any, Literal, Union
+
+import bpy
+
+import bonsai.tool as tool
from bonsai.bim import import_ifc
from bonsai.bim.ifc import IfcStore
-import bonsai.tool as tool
-from pathlib import Path
-from typing import TYPE_CHECKING, Union, Literal, Any
# allows git import even if git executable isn't found
os.environ["GIT_PYTHON_REFRESH"] = "quiet"
diff --git a/src/bonsai/bonsai/tool/layer.py b/src/bonsai/bonsai/tool/layer.py
index 7b5775d20d..396cc13605 100644
--- a/src/bonsai/bonsai/tool/layer.py
+++ b/src/bonsai/bonsai/tool/layer.py
@@ -17,10 +17,13 @@
# along with Bonsai. If not, see .
from __future__ import annotations
+
+from typing import TYPE_CHECKING
+
import bpy
+
import bonsai.core.tool
import bonsai.tool as tool
-from typing import TYPE_CHECKING
if TYPE_CHECKING:
from bonsai.bim.module.layer.prop import BIMLayerProperties
diff --git a/src/bonsai/bonsai/tool/library.py b/src/bonsai/bonsai/tool/library.py
index e16a159b00..861278e91c 100644
--- a/src/bonsai/bonsai/tool/library.py
+++ b/src/bonsai/bonsai/tool/library.py
@@ -17,12 +17,15 @@
# along with Bonsai. If not, see .
from __future__ import annotations
-import ifcopenshell
+
+from typing import TYPE_CHECKING, Any, Literal, Union
+
import bpy
+import ifcopenshell
+
import bonsai.bim.helper
import bonsai.core.tool
import bonsai.tool as tool
-from typing import Literal, Any, Union, TYPE_CHECKING
if TYPE_CHECKING:
from bonsai.bim.module.library.prop import BIMLibraryProperties
diff --git a/src/bonsai/bonsai/tool/loader.py b/src/bonsai/bonsai/tool/loader.py
index d5ceea1db5..8fdce1da4c 100644
--- a/src/bonsai/bonsai/tool/loader.py
+++ b/src/bonsai/bonsai/tool/loader.py
@@ -17,11 +17,16 @@
# along with Bonsai. If not, see .
from __future__ import annotations
+
+import logging
import os
import re
-import bpy
+from math import atan, radians
+from pathlib import Path
+from typing import Any, Optional, Union, cast
+
import bmesh
-import logging
+import bpy
import ifcopenshell.geom
import ifcopenshell.ifcopenshell_wrapper as W
import ifcopenshell.util.element
@@ -30,17 +35,14 @@ import ifcopenshell.util.placement
import ifcopenshell.util.representation
import ifcopenshell.util.shape
import ifcopenshell.util.unit
-import bonsai.core.tool
-import bonsai.tool as tool
-import bonsai.bim.import_ifc
import numpy as np
import numpy.typing as npt
from ifcopenshell.util.shape_builder import np_to_4d
-from math import atan, radians
-from mathutils import Vector, Matrix
-from pathlib import Path
-from typing import Union, Any, Optional, cast
+from mathutils import Matrix, Vector
+import bonsai.bim.import_ifc
+import bonsai.core.tool
+import bonsai.tool as tool
# Progressively we'll refactor loading elements into Blender objects into this
# class. This will break down the monolithic import_ifc module and allow us to
@@ -313,6 +315,7 @@ class Loader(bonsai.core.tool.Loader):
# https://blender.stackexchange.com/questions/173206/how-to-efficiently-convert-a-pil-image-to-bpy-types-image
# https://blender.stackexchange.com/questions/62072/does-blender-have-a-method-to-a-get-png-formatted-bytearray-for-an-image-via-pyt
import io
+
from PIL import Image
value = texture["RasterCode"]
diff --git a/src/bonsai/bonsai/tool/material.py b/src/bonsai/bonsai/tool/material.py
index 5e8b531c5c..6f862100e2 100644
--- a/src/bonsai/bonsai/tool/material.py
+++ b/src/bonsai/bonsai/tool/material.py
@@ -17,22 +17,28 @@
# along with Bonsai. If not, see .
from __future__ import annotations
+
+from collections import defaultdict
+from typing import TYPE_CHECKING, Any, Optional, Union
+
import bpy
import ifcopenshell
import ifcopenshell.api.material
-import bonsai.core.tool
-import bonsai.core.material
-import bonsai.tool as tool
-import bonsai.bim.helper
-import ifcopenshell.util.unit
import ifcopenshell.util.element
-from collections import defaultdict
-from typing import Union, Any, TYPE_CHECKING, Optional
+import ifcopenshell.util.unit
+
+import bonsai.bim.helper
+import bonsai.core.material
+import bonsai.core.tool
+import bonsai.tool as tool
if TYPE_CHECKING:
# Avoid circular imports.
+ from bonsai.bim.module.material.prop import (
+ BIMMaterialProperties,
+ BIMObjectMaterialProperties,
+ )
from bonsai.bim.module.material.prop import Material as MaterialItem
- from bonsai.bim.module.material.prop import BIMMaterialProperties, BIMObjectMaterialProperties
class Material(bonsai.core.tool.Material):
diff --git a/src/bonsai/bonsai/tool/misc.py b/src/bonsai/bonsai/tool/misc.py
index e2a8028181..890e8aac9b 100644
--- a/src/bonsai/bonsai/tool/misc.py
+++ b/src/bonsai/bonsai/tool/misc.py
@@ -16,17 +16,19 @@
# You should have received a copy of the GNU General Public License
# along with Bonsai. If not, see .
-import bpy
+from typing import Union
+
import bmesh
+import bpy
import ifcopenshell
import ifcopenshell.util.element
import ifcopenshell.util.placement
import ifcopenshell.util.unit
-import bonsai.core.tool
+from mathutils import Matrix, Vector
+
import bonsai.core.root
+import bonsai.core.tool
import bonsai.tool as tool
-from mathutils import Vector, Matrix
-from typing import Union
class Misc(bonsai.core.tool.Misc):
diff --git a/src/bonsai/bonsai/tool/model.py b/src/bonsai/bonsai/tool/model.py
index 28506bd8db..08a0a0fd85 100644
--- a/src/bonsai/bonsai/tool/model.py
+++ b/src/bonsai/bonsai/tool/model.py
@@ -17,13 +17,26 @@
# along with Bonsai. If not, see .
from __future__ import annotations
-import bpy
-import json
-import bmesh
-import shapely
+
import collections
import collections.abc
-import numpy as np
+import json
+from collections.abc import Iterable, Sequence
+from copy import deepcopy
+from math import atan, cos, degrees, pi, radians
+from typing import (
+ TYPE_CHECKING,
+ Any,
+ Literal,
+ Optional,
+ TypedDict,
+ TypeVar,
+ Union,
+ assert_never,
+)
+
+import bmesh
+import bpy
import ifcopenshell
import ifcopenshell.api
import ifcopenshell.api.geometry
@@ -37,38 +50,37 @@ import ifcopenshell.util.representation
import ifcopenshell.util.shape
import ifcopenshell.util.shape_builder
import ifcopenshell.util.unit
+import mathutils
+import numpy as np
+import shapely
+from ifcopenshell.util.shape_builder import ShapeBuilder, np_to_3d
+from mathutils import Matrix, Vector
+
import bonsai.core.geometry
import bonsai.core.tool
import bonsai.tool as tool
-import mathutils
-from math import atan, cos, degrees, pi, radians
-from mathutils import Matrix, Vector
-from copy import deepcopy
from bonsai.bim import import_ifc
-from ifcopenshell.util.shape_builder import ShapeBuilder, np_to_3d
-from typing import Optional, Union, TypeVar, Any, Literal, TYPE_CHECKING, TypedDict, assert_never
-from collections.abc import Iterable, Sequence
-
T = TypeVar("T")
V_ = tool.Blender.V_
if TYPE_CHECKING:
- import sverchok.node_tree
import ifcsverchok.nodes.ifc.shape_builder.shape_output
- from bonsai.bim.module.model.prop import (
- BIMModelProperties,
- BIMDoorProperties,
- BIMArrayProperties,
- BIMRoofProperties,
- BIMWindowProperties,
- BIMStairProperties,
- BIMRailingProperties,
- BIMExternalParametricGeometryProperties,
- BIMPolylineProperties,
- )
+ import sverchok.node_tree
from sverchok.core.node_group import SvGroupTreeNode
+ from bonsai.bim.module.model.prop import (
+ BIMArrayProperties,
+ BIMDoorProperties,
+ BIMExternalParametricGeometryProperties,
+ BIMModelProperties,
+ BIMPolylineProperties,
+ BIMRailingProperties,
+ BIMRoofProperties,
+ BIMStairProperties,
+ BIMWindowProperties,
+ )
+
class Model(bonsai.core.tool.Model):
@classmethod
@@ -1063,8 +1075,7 @@ class Model(bonsai.core.tool.Model):
removed_children = set(array["children"])
for removed_child in removed_children:
element = tool.Ifc.get().by_guid(removed_child)
- obj = tool.Ifc.get_object(element)
- if obj:
+ if obj := tool.Ifc.get_object(element):
tool.Geometry.delete_ifc_object(obj)
array["children"].clear()
@@ -1087,19 +1098,18 @@ class Model(bonsai.core.tool.Model):
offset = base_offset * i
for obj in obj_stack:
- # get currently proccesed array element and it's object
- if child_i >= total_existing_children:
- child_obj = tool.Spatial.duplicate_object_and_data(obj)
- child_element = tool.Spatial.run_root_copy_class(obj=child_obj)
- else:
+ try:
global_id = array["children"][child_i]
- try:
- child_element = tool.Ifc.get().by_guid(global_id)
- child_obj = tool.Ifc.get_object(child_element)
- assert child_obj
- except:
- child_obj = tool.Spatial.duplicate_object_and_data(obj)
- child_element = tool.Spatial.run_root_copy_class(obj=child_obj)
+ child_element = tool.Ifc.get().by_guid(global_id)
+ child_obj = tool.Ifc.get_object(child_element)
+ assert child_obj
+ except:
+ old_to_new, _ = tool.Geometry.duplicate_ifc_objects([obj])
+ # TODO Is this correct to assume one child? I really
+ # don't understand the linked aggregates and array
+ # behaviour.
+ child_element = next(iter(old_to_new.values()))[0]
+ child_obj = tool.Ifc.get_object(child_element)
# add child pset
child_pset = tool.Pset.get_element_pset(child_element, "BBIM_Array")
@@ -1183,6 +1193,7 @@ class Model(bonsai.core.tool.Model):
return
from PIL import Image, ImageDraw
+
from bonsai.bim.module.model.data import AuthoringData
obj = tool.Ifc.get_object(element)
@@ -2732,6 +2743,21 @@ class Model(bonsai.core.tool.Model):
cls.recreate_wall(element, wall)
+ @classmethod
+ def regenerate_slab(cls, obj: bpy.types.Object) -> None:
+ from bonsai.bim.module.model.slab import DumbSlabPlaner
+
+ element = tool.Ifc.get_entity(obj)
+ material_set = ifcopenshell.util.element.get_material(element, should_skip_usage=True)
+ new_thickness = sum([l.LayerThickness for l in material_set.MaterialLayers])
+ DumbSlabPlaner().change_thickness(element, new_thickness)
+
+ @classmethod
+ def regenerate_profile(cls, obj: bpy.types.Object) -> None:
+ from bonsai.bim.module.model.profile import DumbProfileRecalculator
+
+ DumbProfileRecalculator().recalculate([obj])
+
@classmethod
def run_ifcsverchok_graph_on_bonsai_file(cls, node_tree: sverchok.node_tree.SverchCustomTree) -> None:
from ifcsverchok.ifcstore import SvIfcStore
diff --git a/src/bonsai/bonsai/tool/nest.py b/src/bonsai/bonsai/tool/nest.py
index 094299c499..a386e402ec 100644
--- a/src/bonsai/bonsai/tool/nest.py
+++ b/src/bonsai/bonsai/tool/nest.py
@@ -17,11 +17,14 @@
# along with Bonsai. If not, see .
from __future__ import annotations
+
+from typing import TYPE_CHECKING, Union
+
import bpy
+import ifcopenshell.util.element
+
import bonsai.core.tool
import bonsai.tool as tool
-import ifcopenshell.util.element
-from typing import TYPE_CHECKING, Union
if TYPE_CHECKING:
from bonsai.bim.module.nest.prop import BIMNestProperties, BIMObjectNestProperties
diff --git a/src/bonsai/bonsai/tool/owner.py b/src/bonsai/bonsai/tool/owner.py
index 615fd64db8..9ed0bda219 100644
--- a/src/bonsai/bonsai/tool/owner.py
+++ b/src/bonsai/bonsai/tool/owner.py
@@ -17,12 +17,15 @@
# along with Bonsai. If not, see .
from __future__ import annotations
+
+from typing import TYPE_CHECKING, Any, Literal, Union, assert_never
+
import bpy
+import ifcopenshell
+
+import bonsai.bim.helper
import bonsai.core.tool
import bonsai.tool as tool
-import bonsai.bim.helper
-import ifcopenshell
-from typing import Union, Any, TYPE_CHECKING, Literal, assert_never
if TYPE_CHECKING:
from bonsai.bim.module.owner.prop import BIMOwnerProperties
diff --git a/src/bonsai/bonsai/tool/patch.py b/src/bonsai/bonsai/tool/patch.py
index eb2b514173..6ae06b5e10 100644
--- a/src/bonsai/bonsai/tool/patch.py
+++ b/src/bonsai/bonsai/tool/patch.py
@@ -17,11 +17,14 @@
# along with Bonsai. If not, see .
from __future__ import annotations
+
+from typing import TYPE_CHECKING, Any
+
import bpy
import ifcopenshell
import ifcpatch
+
import bonsai.core.tool
-from typing import Any, TYPE_CHECKING
if TYPE_CHECKING:
from bonsai.bim.module.patch.prop import BIMPatchProperties
diff --git a/src/bonsai/bonsai/tool/polyline.py b/src/bonsai/bonsai/tool/polyline.py
index e8bacd1b4c..b288260d7d 100644
--- a/src/bonsai/bonsai/tool/polyline.py
+++ b/src/bonsai/bonsai/tool/polyline.py
@@ -16,19 +16,21 @@
# You should have received a copy of the GNU General Public License
# along with Bonsai. If not, see .
-import bpy
-import bmesh
import math
+from dataclasses import dataclass, field
+from math import cos, degrees, radians, sin, tan
+from typing import Literal, Optional, Union
+
+import bmesh
+import bpy
import ifcopenshell
import ifcopenshell.util.unit
+from lark import Lark, Transformer
+from mathutils import Matrix, Vector
+
import bonsai.core.tool
import bonsai.tool as tool
from bonsai.bim.module.drawing.helper import format_distance
-from dataclasses import dataclass, field
-from lark import Lark, Transformer
-from math import degrees, radians, sin, cos, tan
-from mathutils import Vector, Matrix
-from typing import Optional, Union, Literal
class Polyline(bonsai.core.tool.Polyline):
diff --git a/src/bonsai/bonsai/tool/profile.py b/src/bonsai/bonsai/tool/profile.py
index cfb36a06ab..99d2164a32 100644
--- a/src/bonsai/bonsai/tool/profile.py
+++ b/src/bonsai/bonsai/tool/profile.py
@@ -17,22 +17,25 @@
# along with Bonsai. If not, see .
from __future__ import annotations
+
+from typing import TYPE_CHECKING, Union
+
import bpy
import ifcopenshell
import ifcopenshell.api.profile
import ifcopenshell.geom
import ifcopenshell.ifcopenshell_wrapper as W
import ifcopenshell.util.element
-import ifcopenshell.util.unit
import ifcopenshell.util.placement
import ifcopenshell.util.representation
import ifcopenshell.util.shape
+import ifcopenshell.util.unit
import numpy as np
+import PIL.ImageDraw
+
import bonsai.core.tool
import bonsai.tool as tool
-import PIL.ImageDraw
from bonsai.bim.module.model.decorator import ProfileDecorator
-from typing import Union, TYPE_CHECKING
if TYPE_CHECKING:
import bonsai.bim.module.profile.prop
diff --git a/src/bonsai/bonsai/tool/project.py b/src/bonsai/bonsai/tool/project.py
index 11c4bef3c9..d4df4c80de 100644
--- a/src/bonsai/bonsai/tool/project.py
+++ b/src/bonsai/bonsai/tool/project.py
@@ -17,27 +17,30 @@
# along with Bonsai. If not, see .
from __future__ import annotations
+
import os
import shutil
+from collections import defaultdict
+from pathlib import Path
+from typing import TYPE_CHECKING, NamedTuple, Optional, Union
+
import bpy
import ifcopenshell
import ifcopenshell.api.document
import ifcopenshell.util.element
import ifcopenshell.util.representation
import ifcopenshell.util.unit
+from ifcopenshell.api.project.append_asset import APPENDABLE_ASSET_TYPES
+
+import bonsai.bim.schema
import bonsai.core.aggregate
import bonsai.core.context
-import bonsai.core.tool
-import bonsai.core.root
-import bonsai.core.unit
import bonsai.core.owner
-import bonsai.bim.schema
+import bonsai.core.root
+import bonsai.core.tool
+import bonsai.core.unit
import bonsai.tool as tool
-from collections import defaultdict
from bonsai.bim.ifc import IfcStore
-from ifcopenshell.api.project.append_asset import APPENDABLE_ASSET_TYPES
-from pathlib import Path
-from typing import NamedTuple, Optional, Union, TYPE_CHECKING
if TYPE_CHECKING:
from bonsai.bim.module.project.prop import BIMProjectProperties, MeasureToolSettings
diff --git a/src/bonsai/bonsai/tool/pset.py b/src/bonsai/bonsai/tool/pset.py
index b6901238ba..8eabcd155d 100644
--- a/src/bonsai/bonsai/tool/pset.py
+++ b/src/bonsai/bonsai/tool/pset.py
@@ -17,27 +17,29 @@
# along with Bonsai. If not, see .
from __future__ import annotations
+
+from typing import TYPE_CHECKING, Any, Literal, Union, assert_never
+
import bpy
import ifcopenshell
import ifcopenshell.api.pset
import ifcopenshell.util.attribute
import ifcopenshell.util.element
+
import bonsai.bim.helper
+import bonsai.bim.schema
import bonsai.core.tool
import bonsai.tool as tool
-import bonsai.bim.schema
-from typing import Union, Literal, Any, TYPE_CHECKING, assert_never
-
if TYPE_CHECKING:
- from bonsai.bim.prop import Attribute
from bonsai.bim.module.pset.prop import (
- PsetProperties,
- GlobalPsetProperties,
AddEditPropertyEntry,
- RenamePropertyEntry,
DeletePsetEntry,
+ GlobalPsetProperties,
+ PsetProperties,
+ RenamePropertyEntry,
)
+ from bonsai.bim.prop import Attribute
class Pset(bonsai.core.tool.Pset):
diff --git a/src/bonsai/bonsai/tool/pset_template.py b/src/bonsai/bonsai/tool/pset_template.py
index 66a65e820c..e4c1c3dbe1 100644
--- a/src/bonsai/bonsai/tool/pset_template.py
+++ b/src/bonsai/bonsai/tool/pset_template.py
@@ -17,16 +17,19 @@
# along with Bonsai. If not, see .
from __future__ import annotations
+
+from pathlib import Path
+from typing import TYPE_CHECKING, Literal, final
+
import bpy
import ifcopenshell
import ifcopenshell.api.pset_template
import ifcopenshell.util.attribute
import ifcopenshell.util.element
+
+import bonsai.bim
import bonsai.core.tool
import bonsai.tool as tool
-import bonsai.bim
-from pathlib import Path
-from typing import Literal, final, TYPE_CHECKING
from bonsai.bim.ifc import IfcStore
if TYPE_CHECKING:
diff --git a/src/bonsai/bonsai/tool/qto.py b/src/bonsai/bonsai/tool/qto.py
index 0efa759335..4fd271b283 100644
--- a/src/bonsai/bonsai/tool/qto.py
+++ b/src/bonsai/bonsai/tool/qto.py
@@ -17,15 +17,18 @@
# along with Bonsai. If not, see .
from __future__ import annotations
+
+from typing import TYPE_CHECKING, Any, Literal, Optional, Union
+
import bpy
-import bonsai.core.tool
-import bonsai.bim.schema
-import bonsai.tool as tool
import ifcopenshell
-import ifcopenshell.util.unit
import ifcopenshell.util.element
+import ifcopenshell.util.unit
from mathutils import Vector
-from typing import Optional, Union, Literal, TYPE_CHECKING, Any
+
+import bonsai.bim.schema
+import bonsai.core.tool
+import bonsai.tool as tool
if TYPE_CHECKING:
from bonsai.bim.module.qto.prop import BIMQtoProperties
diff --git a/src/bonsai/bonsai/tool/raycast.py b/src/bonsai/bonsai/tool/raycast.py
index 90bec96644..ee06066dd7 100644
--- a/src/bonsai/bonsai/tool/raycast.py
+++ b/src/bonsai/bonsai/tool/raycast.py
@@ -16,16 +16,18 @@
# You should have received a copy of the GNU General Public License
# along with Bonsai. If not, see .
+import copy
+from typing import Union
+
import bmesh
import bpy
-import copy
+import mathutils
import numpy as np
from bpy_extras import view3d_utils
+from mathutils import Vector
+
import bonsai.core.tool
import bonsai.tool as tool
-import mathutils
-from mathutils import Vector
-from typing import Union
class Raycast(bonsai.core.tool.Raycast):
diff --git a/src/bonsai/bonsai/tool/resource.py b/src/bonsai/bonsai/tool/resource.py
index 425dce1a76..c64b7b503b 100644
--- a/src/bonsai/bonsai/tool/resource.py
+++ b/src/bonsai/bonsai/tool/resource.py
@@ -19,25 +19,31 @@
# ############################################################################ #
from __future__ import annotations
-import bpy
-import bonsai.core.tool
-import bonsai.tool as tool
-import bonsai.bim.helper
+
import json
import time
-import isodate
from datetime import datetime
+from typing import TYPE_CHECKING, Any, Literal, Union
+
+import bpy
import ifcopenshell.api.pset
import ifcopenshell.api.resource
-import ifcopenshell.util.date as ifcdateutils
-import ifcopenshell.util.cost
-import ifcopenshell.util.resource
import ifcopenshell.util.constraint
-from typing import Any, Union, TYPE_CHECKING, Literal
+import ifcopenshell.util.cost
+import ifcopenshell.util.date as ifcdateutils
+import ifcopenshell.util.resource
+import isodate
+
+import bonsai.bim.helper
+import bonsai.core.tool
+import bonsai.tool as tool
if TYPE_CHECKING:
+ from bonsai.bim.module.resource.prop import (
+ BIMResourceProductivity,
+ BIMResourceProperties,
+ )
from bonsai.bim.prop import Attribute
- from bonsai.bim.module.resource.prop import BIMResourceProperties, BIMResourceProductivity
class Resource(bonsai.core.tool.Resource):
diff --git a/src/bonsai/bonsai/tool/root.py b/src/bonsai/bonsai/tool/root.py
index 42bd558bd1..be7e350adc 100644
--- a/src/bonsai/bonsai/tool/root.py
+++ b/src/bonsai/bonsai/tool/root.py
@@ -17,6 +17,9 @@
# along with Bonsai. If not, see .
from __future__ import annotations
+
+from typing import TYPE_CHECKING, Any, Literal, Optional, Union
+
import bpy
import ifcopenshell
import ifcopenshell.api
@@ -24,16 +27,16 @@ import ifcopenshell.api.feature
import ifcopenshell.api.geometry
import ifcopenshell.api.root
import ifcopenshell.api.style
-import ifcopenshell.util.representation
import ifcopenshell.util.element
import ifcopenshell.util.placement
-import bonsai.core.tool
+import ifcopenshell.util.representation
+
import bonsai.core.aggregate
import bonsai.core.geometry
+import bonsai.core.tool
import bonsai.tool as tool
-from typing import Union, Optional, Any, Literal, TYPE_CHECKING
-from bonsai.bim.module.spatial.decorator import GridDecorator
from bonsai.bim.module.geometry.decorator import ItemDecorator
+from bonsai.bim.module.spatial.decorator import GridDecorator
if TYPE_CHECKING:
from bonsai.bim.module.root.prop import BIMRootProperties
diff --git a/src/bonsai/bonsai/tool/search.py b/src/bonsai/bonsai/tool/search.py
index 439e3469b3..ffd3a1aef3 100644
--- a/src/bonsai/bonsai/tool/search.py
+++ b/src/bonsai/bonsai/tool/search.py
@@ -17,20 +17,23 @@
# along with Bonsai. If not, see .
from __future__ import annotations
-import bpy
+
import json
-import lark
-import bonsai.tool as tool
-import bonsai.core.tool
+from itertools import cycle
+from typing import TYPE_CHECKING, Literal, Union
+
+import bpy
import ifcopenshell.guid
import ifcopenshell.util.selector
-from itertools import cycle
+import lark
+
+import bonsai.core.tool
+import bonsai.tool as tool
from bonsai.bim.prop import BIMFacet
-from typing import Union, Literal, TYPE_CHECKING
if TYPE_CHECKING:
- from bonsai.bim.prop import BIMFilterGroup
from bonsai.bim.module.search.prop import BIMSearchProperties
+ from bonsai.bim.prop import BIMFilterGroup
class Search(bonsai.core.tool.Search):
diff --git a/src/bonsai/bonsai/tool/sequence.py b/src/bonsai/bonsai/tool/sequence.py
index a2a2cb9668..8c5339d438 100644
--- a/src/bonsai/bonsai/tool/sequence.py
+++ b/src/bonsai/bonsai/tool/sequence.py
@@ -17,35 +17,37 @@
# along with Bonsai. If not, see .
from __future__ import annotations
+
+import base64
+import json
import os
import re
-import bpy
-import json
-import base64
-import ifcopenshell.api.sequence
-import ifcopenshell.util.element
-import pystache
-import mathutils
import webbrowser
-import isodate
-import ifcopenshell
-import ifcopenshell.api.group
-import ifcopenshell.ifcopenshell_wrapper as W
-import ifcopenshell.util.date
-import ifcopenshell.util.selector
-import ifcopenshell.util.sequence
-import bonsai.core.tool
-import bonsai.tool as tool
-import bonsai.bim.helper
-from dateutil import parser
+from collections.abc import Iterable
from datetime import datetime
from datetime import time as datetime_time
-from typing import Optional, Any, Union, Literal, TYPE_CHECKING
-from collections.abc import Iterable
+from typing import TYPE_CHECKING, Any, Literal, Optional, Union
+
+import bpy
+import ifcopenshell
+import ifcopenshell.api.group
+import ifcopenshell.api.sequence
+import ifcopenshell.ifcopenshell_wrapper as W
+import ifcopenshell.util.date
+import ifcopenshell.util.element
+import ifcopenshell.util.selector
+import ifcopenshell.util.sequence
+import isodate
+import mathutils
+import pystache
+from dateutil import parser
from mathutils import Color
+import bonsai.bim.helper
+import bonsai.core.tool
+import bonsai.tool as tool
+
if TYPE_CHECKING:
- from bonsai.bim.prop import Attribute
from bonsai.bim.module.sequence.prop import (
BIMAnimationProperties,
BIMStatusProperties,
@@ -54,6 +56,7 @@ if TYPE_CHECKING:
BIMWorkPlanProperties,
BIMWorkScheduleProperties,
)
+ from bonsai.bim.prop import Attribute
class Sequence(bonsai.core.tool.Sequence):
diff --git a/src/bonsai/bonsai/tool/snap.py b/src/bonsai/bonsai/tool/snap.py
index 0e6fe06f9e..5c538dfc43 100644
--- a/src/bonsai/bonsai/tool/snap.py
+++ b/src/bonsai/bonsai/tool/snap.py
@@ -17,20 +17,23 @@
# along with Bonsai. If not, see .
from __future__ import annotations
-import bpy
+
+import math
+from typing import TYPE_CHECKING, Any, Union
+
import bmesh
+import bpy
import ifcopenshell
import ifcopenshell.util.unit
+import mathutils
+from lark import Lark, Transformer
+from mathutils import Matrix, Vector
+
import bonsai.core.tool
import bonsai.tool as tool
from bonsai.bim.module.drawing.data import DecoratorData
from bonsai.bim.module.drawing.decoration import CutDecorator
from bonsai.bim.module.model.decorator import PolylineDecorator
-import math
-import mathutils
-from mathutils import Matrix, Vector
-from lark import Lark, Transformer
-from typing import Union, Any, TYPE_CHECKING
if TYPE_CHECKING:
from bonsai.bim.prop import BIMSnapGroups, BIMSnapProperties
diff --git a/src/bonsai/bonsai/tool/spatial.py b/src/bonsai/bonsai/tool/spatial.py
index a177a237e8..70a92f4cff 100644
--- a/src/bonsai/bonsai/tool/spatial.py
+++ b/src/bonsai/bonsai/tool/spatial.py
@@ -17,43 +17,46 @@
# along with Bonsai. If not, see .
from __future__ import annotations
-import bpy
+
+import json
+from collections import defaultdict
+from collections.abc import Generator, Iterable
+from math import pi
+from typing import TYPE_CHECKING, Any, Literal, Optional, Union
+
import bmesh
-import shapely
-import shapely.ops
+import bpy
import ifcopenshell
import ifcopenshell.api.attribute
import ifcopenshell.api.type
import ifcopenshell.geom
+import ifcopenshell.util.classification
import ifcopenshell.util.element
import ifcopenshell.util.placement
import ifcopenshell.util.representation
-import ifcopenshell.util.classification
import ifcopenshell.util.shape_builder
import ifcopenshell.util.type
import ifcopenshell.util.unit
-import bonsai.core.type
-import bonsai.core.tool
+import numpy as np
+import shapely
+import shapely.ops
+from mathutils import Matrix, Vector
+from natsort import natsorted
+from shapely import Polygon
+
+import bonsai.core.geometry
import bonsai.core.root
import bonsai.core.spatial
-import bonsai.core.geometry
+import bonsai.core.tool
+import bonsai.core.type
import bonsai.core.unit
import bonsai.tool as tool
-import json
-import numpy as np
-from math import pi
-from mathutils import Vector, Matrix
-from shapely import Polygon
-from typing import Optional, Union, Literal, Any, TYPE_CHECKING
-from collections.abc import Generator, Iterable
-from collections import defaultdict
-from natsort import natsorted
if TYPE_CHECKING:
from bonsai.bim.module.spatial.prop import (
BIMGridProperties,
- BIMSpatialDecompositionProperties,
BIMObjectSpatialProperties,
+ BIMSpatialDecompositionProperties,
)
@@ -1174,6 +1177,7 @@ class Spatial(bonsai.core.tool.Spatial):
@classmethod
def assign_type_to_obj(cls, obj: bpy.types.Object) -> None:
+ # TODO this code looks in the wrong spot and suspicious
props = tool.Model.get_model_props()
ifc_file = tool.Ifc.get()
relating_type_id = props.relating_type_id
@@ -1193,7 +1197,7 @@ class Spatial(bonsai.core.tool.Spatial):
element: ifcopenshell.entity_instance,
relating_type: ifcopenshell.entity_instance,
) -> None:
- bonsai.core.type.assign_type(ifc, type, element=element, type=relating_type)
+ bonsai.core.type.assign_type(ifc, tool.Model, type, element=element, type=relating_type)
@classmethod
def regen_obj_representation(cls, obj: bpy.types.Object, body: ifcopenshell.entity_instance) -> None:
diff --git a/src/bonsai/bonsai/tool/structural.py b/src/bonsai/bonsai/tool/structural.py
index 3f218e52e9..b011f5df88 100644
--- a/src/bonsai/bonsai/tool/structural.py
+++ b/src/bonsai/bonsai/tool/structural.py
@@ -17,21 +17,30 @@
# along with Bonsai. If not, see .
from __future__ import annotations
+
+import json
+from typing import TYPE_CHECKING, Any, Union
+
import bpy
import ifcopenshell
import ifcopenshell.api.context
import ifcopenshell.api.structural
import ifcopenshell.util.attribute
import ifcopenshell.util.representation
-import json
+
import bonsai.bim.helper
import bonsai.core.tool
import bonsai.tool as tool
-from typing import Union, Any, TYPE_CHECKING
if TYPE_CHECKING:
- from bonsai.bim.module.structural.prop import BIMStructuralProperties, BIMObjectStructuralProperties
- from ifcopenshell.api.structural.edit_structural_boundary_condition import AttributeDict
+ from ifcopenshell.api.structural.edit_structural_boundary_condition import (
+ AttributeDict,
+ )
+
+ from bonsai.bim.module.structural.prop import (
+ BIMObjectStructuralProperties,
+ BIMStructuralProperties,
+ )
class Structural(bonsai.core.tool.Structural):
diff --git a/src/bonsai/bonsai/tool/style.py b/src/bonsai/bonsai/tool/style.py
index e6861b53dc..78cb19680e 100644
--- a/src/bonsai/bonsai/tool/style.py
+++ b/src/bonsai/bonsai/tool/style.py
@@ -17,23 +17,30 @@
# along with Bonsai. If not, see .
from __future__ import annotations
+
+from collections.abc import Sequence
+from typing import TYPE_CHECKING, Any, Literal, Optional, Union
+
import bpy
-import numpy as np
import ifcopenshell
import ifcopenshell.api.style
import ifcopenshell.util.element
import ifcopenshell.util.representation
+import numpy as np
+from mathutils import Color
+
+import bonsai.bim.helper
import bonsai.core.style
import bonsai.core.tool
import bonsai.tool as tool
-import bonsai.bim.helper
-from mathutils import Color
-from typing import Union, Any, Optional, Literal, TYPE_CHECKING
-from collections.abc import Sequence
if TYPE_CHECKING:
+ from bonsai.bim.module.style.prop import (
+ BIMStyleProperties,
+ BIMStylesProperties,
+ ColourRgb,
+ )
from bonsai.bim.prop import Attribute
- from bonsai.bim.module.style.prop import BIMStylesProperties, BIMStyleProperties, ColourRgb
# fmt: off
TEXTURE_MAPS_BY_METHODS = {
diff --git a/src/bonsai/bonsai/tool/surveyor.py b/src/bonsai/bonsai/tool/surveyor.py
index 7c203586f2..f59d9cd7da 100644
--- a/src/bonsai/bonsai/tool/surveyor.py
+++ b/src/bonsai/bonsai/tool/surveyor.py
@@ -20,12 +20,13 @@ import bpy
import ifcopenshell.api
import ifcopenshell.util.geolocation
import ifcopenshell.util.unit
-import bonsai.core.tool
-import bonsai.tool as tool
import numpy as np
import numpy.typing as npt
from mathutils import Matrix
+import bonsai.core.tool
+import bonsai.tool as tool
+
class Surveyor(bonsai.core.tool.Surveyor):
@classmethod
diff --git a/src/bonsai/bonsai/tool/system.py b/src/bonsai/bonsai/tool/system.py
index 3566dbd863..8b949a36c9 100644
--- a/src/bonsai/bonsai/tool/system.py
+++ b/src/bonsai/bonsai/tool/system.py
@@ -17,26 +17,29 @@
# along with Bonsai. If not, see .
from __future__ import annotations
+
+import re
+from enum import Enum
+from typing import TYPE_CHECKING, Any, Optional, Union
+
import bpy
import ifcopenshell.api.geometry
import ifcopenshell.api.system
import ifcopenshell.util.element
import ifcopenshell.util.system
+from mathutils import Matrix, Vector
+from natsort import natsorted
+
import bonsai.bim.helper
import bonsai.core.geometry
import bonsai.core.root
import bonsai.core.tool
import bonsai.tool as tool
from bonsai.bim import import_ifc
-import re
-from mathutils import Matrix, Vector
from bonsai.bim.module.system.data import ObjectSystemData, SystemDecorationData
-from enum import Enum
-from typing import TYPE_CHECKING, Optional, Any, Union
-from natsort import natsorted
if TYPE_CHECKING:
- from bonsai.bim.module.system.prop import BIMSystemProperties, BIMZoneProperties, BIMZoneProperties
+ from bonsai.bim.module.system.prop import BIMSystemProperties, BIMZoneProperties
class System(bonsai.core.tool.System):
@@ -112,20 +115,20 @@ class System(bonsai.core.tool.System):
def create_port_at_cursor(cls, element: ifcopenshell.entity_instance) -> ifcopenshell.entity_instance:
ifc_file = tool.Ifc.get()
element_obj = tool.Ifc.get_object(element)
-
+
port = ifcopenshell.api.system.add_port(ifc_file, element=element)
port.FlowDirection = "NOTDEFINED"
port.PredefinedType = "USERDEFINED"
-
+
systems = ifcopenshell.util.system.get_element_systems(element)
system = systems[0] if systems else None
port.SystemType = getattr(system, "PredefinedType", None) or "USERDEFINED"
-
+
matrix = element_obj.matrix_world.copy()
matrix.translation = bpy.context.scene.cursor.matrix.translation
-
+
ifcopenshell.api.geometry.edit_object_placement(ifc_file, product=port, matrix=matrix, is_si=True)
-
+
return port
@classmethod
@@ -218,7 +221,7 @@ class System(bonsai.core.tool.System):
for collection in obj.users_collection:
target_collection = collection
break
-
+
if target_collection:
for port_obj in ifc_importer.added_data.values():
if isinstance(port_obj, bpy.types.Object):
diff --git a/src/bonsai/bonsai/tool/type.py b/src/bonsai/bonsai/tool/type.py
index 6c98e8bb59..84a349f288 100644
--- a/src/bonsai/bonsai/tool/type.py
+++ b/src/bonsai/bonsai/tool/type.py
@@ -17,14 +17,17 @@
# along with Bonsai. If not, see .
from __future__ import annotations
+
+from typing import TYPE_CHECKING, Union
+
import bpy
import ifcopenshell
import ifcopenshell.util.element
import ifcopenshell.util.representation
-import bonsai.core.tool
+
import bonsai.core.geometry
+import bonsai.core.tool
import bonsai.tool as tool
-from typing import Union, TYPE_CHECKING
if TYPE_CHECKING:
from bonsai.bim.module.type.prop import BIMTypeProperties
@@ -74,11 +77,13 @@ class Type(bonsai.core.tool.Type):
def get_model_types(cls) -> list[ifcopenshell.entity_instance]:
ifc_file = tool.Ifc.get()
types = ifc_file.by_type("IfcElementType")
- types += ifc_file.by_type("IfcSpatialElementType")
- types += ifc_file.by_type("IfcTypeProduct", include_subtypes=False)
- if not tool.Ifc.get_schema().startswith("IFC4X3"):
+ if tool.Ifc.get_schema() == "IFC2X3":
types += ifc_file.by_type("IfcWindowStyle")
types += ifc_file.by_type("IfcDoorStyle")
+ types += ifc_file.by_type("IfcSpatialStructureElementType")
+ else:
+ types += ifc_file.by_type("IfcSpatialElementType")
+ types += ifc_file.by_type("IfcTypeProduct", include_subtypes=False)
return types
@classmethod
@@ -138,3 +143,20 @@ class Type(bonsai.core.tool.Type):
obj=obj,
representation=representation,
)
+
+ @classmethod
+ def record_material_usage_attributes(cls, element: ifcopenshell.entity_instance) -> dict | None:
+ if (material := ifcopenshell.util.element.get_material(element)) and "Usage" in material.is_a():
+ return material.get_info()
+
+ @classmethod
+ def restore_material_usage_attributes(cls, element: ifcopenshell.entity_instance, usage_attributes: dict) -> None:
+ if (material := ifcopenshell.util.element.get_material(element)) and material.is_a() == usage_attributes[
+ "type"
+ ]:
+ if usage_attributes["type"] == "IfcMaterialLayerSetUsage":
+ for attr in ("LayerSetDirection", "DirectionSense", "OffsetFromReferenceLine", "ReferenceExtent"):
+ setattr(material, attr, usage_attributes.get(attr))
+ elif usage_attributes["type"] == "IfcMaterialProfileSetUsage":
+ for attr in ("CardinalPoint", "ReferenceExtent"):
+ setattr(material, attr, usage_attributes.get(attr))
diff --git a/src/bonsai/bonsai/tool/unit.py b/src/bonsai/bonsai/tool/unit.py
index b98e4fc272..66b56612fe 100644
--- a/src/bonsai/bonsai/tool/unit.py
+++ b/src/bonsai/bonsai/tool/unit.py
@@ -17,259 +17,23 @@
# along with Bonsai. If not, see .
from __future__ import annotations
-import bpy
+
import json
import math
+from typing import TYPE_CHECKING, Any, Literal, Union, assert_never
+
+import bpy
import ifcopenshell
+from lark import Lark, Transformer
+
import bonsai.bim.helper
import bonsai.core.tool
import bonsai.tool as tool
-from lark import Lark, Transformer
-from typing import Union, Literal, Any, TYPE_CHECKING, assert_never
if TYPE_CHECKING:
from bonsai.bim.module.unit.prop import BIMUnitProperties
-def parse_distance_string(input_string: str, use_project_unit: bool = True) -> tuple[bool, float]:
- """
- Parse a distance string with optional unit suffixes and convert to meters.
-
- This function parses distance inputs with units (e.g., "5m", "10ft", "3.5cm")
- and converts them to meters (SI units) for use in IFC models.
-
- Supports:
- - Metric units: mm, cm, dm, m
- - Imperial units: ft/feet ('), in/inches (")
- - Arithmetic expressions: +, -, *, /
- - Fractions for imperial units (e.g., 1/2")
- - Formula mode: values starting with "="
-
- :param input_string: The string to parse (e.g., "5m", "10ft", "10'6\"", "3.5cm", "12in")
- :param use_project_unit: If True, uses project unit scale; if False, uses Blender unit scale
- :return: Tuple (is_valid, value_in_meters) where is_valid indicates successful parsing
- and value_in_meters is the converted value in meters
-
- Examples:
- >>> parse_distance_string("5m")
- (True, 5.0)
- >>> parse_distance_string("30cm")
- (True, 0.3)
- >>> parse_distance_string("10ft")
- (True, 3.048)
- >>> parse_distance_string("12in")
- (True, 0.3048)
- >>> parse_distance_string("5'6\"")
- (True, 1.6764)
- >>> parse_distance_string("invalid")
- (False, 0.0)
- """
-
- grammar_imperial = r"""
- start: (FORMULA dim expr) | dim
- dim: imperial
-
- FORMULA: "="
-
- imperial: feet_inches | feet_only | inches_only | plain_number
- feet_only: NUMBER (FEET_SYM | FEET_TEXT)
- inches_only: inch_value (INCH_SYM | INCH_TEXT)
- feet_inches: NUMBER (FEET_SYM | FEET_TEXT) DASH? inch_value (INCH_SYM | INCH_TEXT)?
- plain_number: NUMBER
-
- inch_value: NUMBER fraction | fraction | NUMBER
-
- fraction: NUMBER "/" NUMBER
-
- expr: (ADD | SUB) dim | (MUL | DIV) NUMBER
-
- NUMBER: /-?(?:\d+\.?\d*|\.\d+)/
- FEET_SYM: "'"
- FEET_TEXT: "ft"
- INCH_SYM: "\""
- INCH_TEXT: "in"
- DASH: "-"
- ADD: "+"
- SUB: "-"
- MUL: "*"
- DIV: "/"
-
- %ignore " "
- """
-
- grammar_metric = r"""
- start: FORMULA? dim expr?
- dim: metric
-
- FORMULA: "="
-
- metric: NUMBER (MM | CM | DM | M | DEG)?
-
- expr: (ADD | SUB | MUL | DIV) dim
-
- NUMBER: /-?(?:\d+\.?\d*|\.\d+)/
- MM: "mm"
- CM: "cm"
- DM: "dm"
- M: "m"
- DEG: "°"
- ADD: "+"
- SUB: "-"
- MUL: "*"
- DIV: "/"
-
- %ignore " "
- """
-
- class InputTransform(Transformer):
- def NUMBER(self, n):
- return float(n)
-
- def fraction(self, numbers):
- return numbers[0] / numbers[1]
-
- def inch_value(self, args):
- # Can be: NUMBER fraction, fraction, or NUMBER
- if len(args) == 2:
- # NUMBER fraction (e.g., "9 1/64")
- return args[0] + args[1]
- else:
- # Just fraction or just NUMBER
- return args[0]
-
- def plain_number(self, args):
- # A plain number in imperial context is assumed to be feet
- feet = args[0]
- # Convert feet to meters (1 foot = 0.3048 meters)
- return feet * 0.3048
-
- def feet_only(self, args):
- # args[0] is the number of feet, args[1] is the unit token (we can ignore it)
- feet = args[0]
- # Convert feet to meters (1 foot = 0.3048 meters)
- return feet * 0.3048
-
- def inches_only(self, args):
- # args[0] is the inch_value, args[1] is the unit token
- inches = args[0]
- # Convert inches to meters (1 inch = 0.0254 meters)
- return inches * 0.0254
-
- def feet_inches(self, args):
- # Extract feet and inches values
- feet = args[0]
- # Find the inch_value (it's a number, not a token)
- inches = None
- for arg in args[1:]:
- if isinstance(arg, (int, float)):
- inches = arg
- break
- if inches is None:
- inches = 0
-
- # If feet is negative, inches should also be negative (subtractive)
- if feet < 0:
- inches = -inches
-
- # Convert to meters
- total_meters = (feet * 0.3048) + (inches * 0.0254)
- return total_meters
-
- def imperial(self, args):
- # Just return the value from the sub-rule (feet_only, inches_only, or feet_inches)
- return args[0]
-
- def metric(self, args):
- # args[0] is the NUMBER, args[1] if present is the unit
- value = args[0]
- if len(args) > 1:
- unit = str(args[1])
- # Convert to meters based on unit
- if unit == "mm":
- value = value / 1000.0
- elif unit == "cm":
- value = value / 100.0
- elif unit == "dm":
- value = value / 10.0
- elif unit == "m":
- value = value # already in meters
- elif unit == "°":
- value = value # degrees, pass through
- # If no unit specified, assume it's already in the project's unit system
- return value
-
- def dim(self, args):
- return args[0]
-
- def expr(self, args):
- op = args[0]
- value = float(args[1])
- if op == "+":
- return lambda x: x + value
- elif op == "-":
- return lambda x: x - value
- elif op == "*":
- return lambda x: x * value
- elif op == "/":
- return lambda x: x / value
-
- def FORMULA(self, args):
- return args[0]
-
- def start(self, args):
- i = 0
- if args[0] == "=":
- i += 1
- else:
- if len(args) > 1:
- raise ValueError("Invalid input.")
- dimension = args[i]
- if len(args) > i + 1:
- expression = args[i + 1]
- return expression(dimension)
- else:
- return dimension
-
- try:
- # Determine unit scale
- if use_project_unit and tool.Ifc.get():
- unit_scale = ifcopenshell.util.unit.calculate_unit_scale(tool.Ifc.get())
- else:
- unit_scale = tool.Blender.get_unit_scale()
-
- # Try to parse with the project's default grammar first
- if bpy.context.scene.unit_settings.system == "IMPERIAL":
- primary_parser = Lark(grammar_imperial)
- fallback_parser = Lark(grammar_metric)
- else:
- primary_parser = Lark(grammar_metric)
- fallback_parser = Lark(grammar_imperial)
-
- # Try parsing with primary grammar
- parse_tree = None
- try:
- parse_tree = primary_parser.parse(input_string)
- except Exception as e:
- # If primary fails, try fallback grammar (allows metric in imperial projects and vice versa)
- try:
- parse_tree = fallback_parser.parse(input_string)
- except Exception as e2:
- pass
-
- if parse_tree is None:
- return False, 0.0
-
- # Transform the parse tree to get the numeric result
- transformer = InputTransform()
- result = transformer.transform(parse_tree)
- result = round(result, 6)
-
- return True, result
-
- except Exception as e:
- return False, 0.0
-
-
class Unit(bonsai.core.tool.Unit):
UNIT_TYPE = Literal["LENGTHUNIT", "AREAUNIT", "VOLUMEUNIT", "MASSUNIT", "TIMEUNIT"]
@@ -297,6 +61,245 @@ class Unit(bonsai.core.tool.Unit):
**kwargs,
)
+ @classmethod
+ def parse_distance_string(cls, input_string: str, use_project_unit: bool = True) -> tuple[bool, float]:
+ """
+ Parse a distance string with optional unit suffixes and convert to meters.
+
+ This function parses distance inputs with units (e.g., "5m", "10ft", "3.5cm")
+ and converts them to meters (SI units) for use in IFC models.
+
+ Supports:
+ - Metric units: mm, cm, dm, m
+ - Imperial units: ft/feet ('), in/inches (")
+ - Arithmetic expressions: +, -, *, /
+ - Fractions for imperial units (e.g., 1/2")
+ - Formula mode: values starting with "="
+
+ :param input_string: The string to parse (e.g., "5m", "10ft", "10'6\"", "3.5cm", "12in")
+ :param use_project_unit: If True, uses project unit scale; if False, uses Blender unit scale
+ :return: Tuple (is_valid, value_in_meters) where is_valid indicates successful parsing
+ and value_in_meters is the converted value in meters
+
+ Examples:
+ >>> parse_distance_string("5m")
+ (True, 5.0)
+ >>> parse_distance_string("30cm")
+ (True, 0.3)
+ >>> parse_distance_string("10ft")
+ (True, 3.048)
+ >>> parse_distance_string("12in")
+ (True, 0.3048)
+ >>> parse_distance_string("5'6\"")
+ (True, 1.6764)
+ >>> parse_distance_string("invalid")
+ (False, 0.0)
+ """
+
+ grammar_imperial = r"""
+ start: (FORMULA dim expr) | dim
+ dim: imperial
+
+ FORMULA: "="
+
+ imperial: feet_inches | feet_only | inches_only | plain_number
+ feet_only: NUMBER (FEET_SYM | FEET_TEXT)
+ inches_only: inch_value (INCH_SYM | INCH_TEXT)
+ feet_inches: NUMBER (FEET_SYM | FEET_TEXT) DASH? inch_value (INCH_SYM | INCH_TEXT)?
+ plain_number: NUMBER
+
+ inch_value: NUMBER fraction | fraction | NUMBER
+
+ fraction: NUMBER "/" NUMBER
+
+ expr: (ADD | SUB) dim | (MUL | DIV) NUMBER
+
+ NUMBER: /-?(?:\d+\.?\d*|\.\d+)/
+ FEET_SYM: "'"
+ FEET_TEXT: "ft"
+ INCH_SYM: "\""
+ INCH_TEXT: "in"
+ DASH: "-"
+ ADD: "+"
+ SUB: "-"
+ MUL: "*"
+ DIV: "/"
+
+ %ignore " "
+ """
+
+ grammar_metric = r"""
+ start: FORMULA? dim expr?
+ dim: metric
+
+ FORMULA: "="
+
+ metric: NUMBER (MM | CM | DM | M | DEG)?
+
+ expr: (ADD | SUB | MUL | DIV) dim
+
+ NUMBER: /-?(?:\d+\.?\d*|\.\d+)/
+ MM: "mm"
+ CM: "cm"
+ DM: "dm"
+ M: "m"
+ DEG: "°"
+ ADD: "+"
+ SUB: "-"
+ MUL: "*"
+ DIV: "/"
+
+ %ignore " "
+ """
+
+ class InputTransform(Transformer):
+ def NUMBER(self, n):
+ return float(n)
+
+ def fraction(self, numbers):
+ return numbers[0] / numbers[1]
+
+ def inch_value(self, args):
+ # Can be: NUMBER fraction, fraction, or NUMBER
+ if len(args) == 2:
+ # NUMBER fraction (e.g., "9 1/64")
+ return args[0] + args[1]
+ else:
+ # Just fraction or just NUMBER
+ return args[0]
+
+ def plain_number(self, args):
+ # A plain number in imperial context is assumed to be feet
+ feet = args[0]
+ # Convert feet to meters (1 foot = 0.3048 meters)
+ return feet * 0.3048
+
+ def feet_only(self, args):
+ # args[0] is the number of feet, args[1] is the unit token (we can ignore it)
+ feet = args[0]
+ # Convert feet to meters (1 foot = 0.3048 meters)
+ return feet * 0.3048
+
+ def inches_only(self, args):
+ # args[0] is the inch_value, args[1] is the unit token
+ inches = args[0]
+ # Convert inches to meters (1 inch = 0.0254 meters)
+ return inches * 0.0254
+
+ def feet_inches(self, args):
+ # Extract feet and inches values
+ feet = args[0]
+ # Find the inch_value (it's a number, not a token)
+ inches = None
+ for arg in args[1:]:
+ if isinstance(arg, (int, float)):
+ inches = arg
+ break
+ if inches is None:
+ inches = 0
+
+ # If feet is negative, inches should also be negative (subtractive)
+ if feet < 0:
+ inches = -inches
+
+ # Convert to meters
+ total_meters = (feet * 0.3048) + (inches * 0.0254)
+ return total_meters
+
+ def imperial(self, args):
+ # Just return the value from the sub-rule (feet_only, inches_only, or feet_inches)
+ return args[0]
+
+ def metric(self, args):
+ # args[0] is the NUMBER, args[1] if present is the unit
+ value = args[0]
+ if len(args) > 1:
+ unit = str(args[1])
+ # Convert to meters based on unit
+ if unit == "mm":
+ value = value / 1000.0
+ elif unit == "cm":
+ value = value / 100.0
+ elif unit == "dm":
+ value = value / 10.0
+ elif unit == "m":
+ value = value # already in meters
+ elif unit == "°":
+ value = value # degrees, pass through
+ # If no unit specified, assume it's already in the project's unit system
+ return value
+
+ def dim(self, args):
+ return args[0]
+
+ def expr(self, args):
+ op = args[0]
+ value = float(args[1])
+ if op == "+":
+ return lambda x: x + value
+ elif op == "-":
+ return lambda x: x - value
+ elif op == "*":
+ return lambda x: x * value
+ elif op == "/":
+ return lambda x: x / value
+
+ def FORMULA(self, args):
+ return args[0]
+
+ def start(self, args):
+ i = 0
+ if args[0] == "=":
+ i += 1
+ else:
+ if len(args) > 1:
+ raise ValueError("Invalid input.")
+ dimension = args[i]
+ if len(args) > i + 1:
+ expression = args[i + 1]
+ return expression(dimension)
+ else:
+ return dimension
+
+ try:
+ # Determine unit scale
+ if use_project_unit and tool.Ifc.get():
+ unit_scale = ifcopenshell.util.unit.calculate_unit_scale(tool.Ifc.get())
+ else:
+ unit_scale = tool.Blender.get_unit_scale()
+
+ # Try to parse with the project's default grammar first
+ if bpy.context.scene.unit_settings.system == "IMPERIAL":
+ primary_parser = Lark(grammar_imperial)
+ fallback_parser = Lark(grammar_metric)
+ else:
+ primary_parser = Lark(grammar_metric)
+ fallback_parser = Lark(grammar_imperial)
+
+ # Try parsing with primary grammar
+ parse_tree = None
+ try:
+ parse_tree = primary_parser.parse(input_string)
+ except Exception as e:
+ # If primary fails, try fallback grammar (allows metric in imperial projects and vice versa)
+ try:
+ parse_tree = fallback_parser.parse(input_string)
+ except Exception as e2:
+ pass
+
+ if parse_tree is None:
+ return False, 0.0
+
+ # Transform the parse tree to get the numeric result
+ transformer = InputTransform()
+ result = transformer.transform(parse_tree)
+ result = round(result, 6)
+
+ return True, result
+
+ except Exception as e:
+ return False, 0.0
+
@classmethod
def get_unit_props(cls) -> BIMUnitProperties:
return bpy.context.scene.BIMUnitProperties
@@ -333,11 +336,18 @@ class Unit(bonsai.core.tool.Unit):
def get_scene_unit_name(cls, unit_type: UNIT_TYPE) -> str | None:
if unit_type == "LENGTHUNIT":
name = bpy.context.scene.unit_settings.length_unit
- name = {"MILES": "mile", "FEET": "foot", "INCHES": "inch", "THOU": "thou", "ADAPTIVE": "METERS"}.get(
- name, name
+ if name == "ADAPTIVE":
+ if bpy.context.scene.unit_settings.system == "IMPERIAL":
+ name = "foot"
+ else:
+ name = "METRE"
+ name = (
+ {"MILES": "mile", "FEET": "foot", "INCHES": "inch", "THOU": "thou", "ADAPTIVE": "METERS"}
+ .get(name, name)
+ .replace("METERS", "METRE")
)
- if len(name) > len("METERS") and name.endswith("METERS"):
- return f"{name[:-6]}/METRE"
+ if len(name) > len("METRE") and name.endswith("METRE"):
+ return f"{name[:-5]}/METRE"
return name
bim_props = tool.Blender.get_bim_props()
if (name := getattr(bim_props, f"{unit_type[:-4].lower()}_unit")) != "NONE":
diff --git a/src/bonsai/bonsai/tool/web.py b/src/bonsai/bonsai/tool/web.py
index 2e1628378f..35811b3819 100644
--- a/src/bonsai/bonsai/tool/web.py
+++ b/src/bonsai/bonsai/tool/web.py
@@ -17,37 +17,40 @@
# along with Bonsai. If not, see .
from __future__ import annotations
-from ifcopenshell.util.classification import get_classification_data, get_references
-from ifcopenshell.util.selector import filter_elements
-import ifcopenshell.util.cost
+
+import asyncio
+import errno
+import json
+import os
+import queue
+import socket
+import subprocess
+import sys
+import threading
+import time
+import webbrowser
+from pathlib import Path
+from time import sleep
+from typing import TYPE_CHECKING, Any, Optional, Union
+
import bpy
-from bonsai.bim.module.web.data import WebData
-from ifcopenshell.util.element import get_psets, get_type, has_property
-import bonsai.core.tool
-import bonsai.tool as tool
-import ifcopenshell.api.sequence
import ifcopenshell.api.classification
import ifcopenshell.api.cost
-from typing import Any, Optional, TYPE_CHECKING, Union
-from mathutils import Color
-import time
-import socket
-import sys
-import os
-import errno
-import subprocess
-import webbrowser
-import asyncio
+import ifcopenshell.api.sequence
+import ifcopenshell.util.cost
import socketio
-import threading
-import queue
-import json
-from time import sleep
-from pathlib import Path
-import bonsai.core.sequence
-import bonsai.core.cost
from ifc5d.ifc2json import ifc5D2json
+from ifcopenshell.util.classification import get_classification_data, get_references
+from ifcopenshell.util.element import get_psets, get_type, has_property
+from ifcopenshell.util.selector import filter_elements
+from mathutils import Color
+
+import bonsai.core.cost
+import bonsai.core.sequence
+import bonsai.core.tool
+import bonsai.tool as tool
from bonsai.bim.ifc import IfcStore
+from bonsai.bim.module.web.data import WebData
if TYPE_CHECKING:
from bonsai.bim.module.web.prop import WebProperties
diff --git a/src/bonsai/pyproject.toml b/src/bonsai/pyproject.toml
index 6dab8f3454..3ec2cb8748 100644
--- a/src/bonsai/pyproject.toml
+++ b/src/bonsai/pyproject.toml
@@ -38,8 +38,3 @@ exclude = ["test*"]
[tool.ruff]
extend = "../../pyproject.toml"
-
-[tool.ruff.lint]
-ignore = [
- "I", # import sorting - ignore it temporarily, still need to do some tests
-]
diff --git a/src/bonsai/runpytest.py b/src/bonsai/runpytest.py
index f9a55fdc27..9a00ea69b0 100755
--- a/src/bonsai/runpytest.py
+++ b/src/bonsai/runpytest.py
@@ -23,6 +23,7 @@ Usage: `blender -b -P runpytest.py -- ARGS`
"""
import sys
+
import pytest
argv = [__file__]
diff --git a/src/bonsai/scripts/bonsai_translations.py b/src/bonsai/scripts/bonsai_translations.py
index de7f613210..7a0fe86ea9 100644
--- a/src/bonsai/scripts/bonsai_translations.py
+++ b/src/bonsai/scripts/bonsai_translations.py
@@ -4,20 +4,20 @@ try:
# Ensure it's not fake-bpy-module.
if not hasattr(bpy, "context"):
raise ModuleNotFoundError
- import bl_i18n_utils
import addon_utils
+ import bl_i18n_utils
BPY_IS_LOADED = True
except ModuleNotFoundError:
BPY_IS_LOADED = False
-import shutil
-import tempfile
import importlib
import os
import re
-from pathlib import Path
+import shutil
+import tempfile
from dataclasses import dataclass, field
+from pathlib import Path
from typing import Optional
bl_info = {
@@ -274,7 +274,9 @@ if BPY_IS_LOADED:
f"Couldn't find locale path in the source directory, creating dummy directory: {source_locale_path}.",
)
- from ui_translate.settings import settings as ui_translate_settings # pyright: ignore[reportMissingImports]
+ from ui_translate.settings import (
+ settings as ui_translate_settings, # pyright: ignore[reportMissingImports]
+ )
from ui_translate.update_ui import ( # pyright: ignore[reportMissingImports]
UI_OT_i18n_updatetranslation_init_settings,
)
diff --git a/src/bonsai/scripts/classifications/uniclass_classification.py b/src/bonsai/scripts/classifications/uniclass_classification.py
index ce55fae9e7..299db8a469 100644
--- a/src/bonsai/scripts/classifications/uniclass_classification.py
+++ b/src/bonsai/scripts/classifications/uniclass_classification.py
@@ -1,4 +1,5 @@
import os
+
import ifcopenshell
import pandas as pd
diff --git a/src/bonsai/scripts/classifications/vbis.py b/src/bonsai/scripts/classifications/vbis.py
index fe77308f82..7c4f43b967 100644
--- a/src/bonsai/scripts/classifications/vbis.py
+++ b/src/bonsai/scripts/classifications/vbis.py
@@ -1,12 +1,13 @@
import csv
-import os
import json
+import os
# import pystache
import subprocess
-import ifcopenshell
from pathlib import Path
+import ifcopenshell
+
class Generator:
def __init__(self):
diff --git a/src/bonsai/scripts/classifications/xml_classification.py b/src/bonsai/scripts/classifications/xml_classification.py
index d75383a051..0a80fb68e7 100644
--- a/src/bonsai/scripts/classifications/xml_classification.py
+++ b/src/bonsai/scripts/classifications/xml_classification.py
@@ -1,9 +1,10 @@
"""This script converts Graphisoft XML into an IFC file"""
+import os
import xml.etree.ElementTree as ET
+
import ifcopenshell
import ifcopenshell.guid
-import os
class IFC4Extractor:
diff --git a/src/bonsai/scripts/dev_environment_vscode_config.py b/src/bonsai/scripts/dev_environment_vscode_config.py
index b574ba9bf4..088810e05c 100644
--- a/src/bonsai/scripts/dev_environment_vscode_config.py
+++ b/src/bonsai/scripts/dev_environment_vscode_config.py
@@ -1,6 +1,10 @@
-import bonsai, json, bpy
+import json
from pathlib import Path
+import bpy
+
+import bonsai
+
repo_path = Path(bonsai.__file__).resolve().parent
install_path = Path(bonsai.__file__).absolute().parent
assert repo_path != install_path, "Run `dev_environment.py` to setup the development environment symlinks first."
diff --git a/src/bonsai/scripts/dxf2ifc.py b/src/bonsai/scripts/dxf2ifc.py
index 3fa34e379a..caef1df864 100644
--- a/src/bonsai/scripts/dxf2ifc.py
+++ b/src/bonsai/scripts/dxf2ifc.py
@@ -16,9 +16,9 @@
# You should have received a copy of the GNU General Public License
# along with Bonsai. If not, see .
+import ezdxf
import ifcopenshell
import ifcopenshell.guid
-import ezdxf
class Dxf2Ifc:
diff --git a/src/bonsai/scripts/extract.py b/src/bonsai/scripts/extract.py
index dffaaf6d40..2b4166be81 100644
--- a/src/bonsai/scripts/extract.py
+++ b/src/bonsai/scripts/extract.py
@@ -16,9 +16,13 @@
# You should have received a copy of the GNU General Public License
# along with Bonsai. If not, see .
-import xml.sax, json, copy, pathlib
-from bs4 import BeautifulSoup # pyright: ignore[reportMissingModuleSource]
+import copy
+import json
+import pathlib
import sys
+import xml.sax
+
+from bs4 import BeautifulSoup # pyright: ignore[reportMissingModuleSource]
sys.setrecursionlimit(100)
diff --git a/src/bonsai/scripts/gbxml.py b/src/bonsai/scripts/gbxml.py
index 8d23fe6018..7280c69c2a 100644
--- a/src/bonsai/scripts/gbxml.py
+++ b/src/bonsai/scripts/gbxml.py
@@ -16,15 +16,16 @@
# You should have received a copy of the GNU General Public License
# along with Bonsai. If not, see .
-import bpy
-import uuid
import math
import sys
+import uuid
+
+import bpy
+import bspy # pyright: ignore[reportMissingImports]
# sys.path.append('C:\Program Files\Python37\Lib\site-packages')
import lxml
import lxml.etree
-import bspy # pyright: ignore[reportMissingImports]
from bspy import Gbxml # pyright: ignore[reportMissingImports]
diff --git a/src/bonsai/scripts/generate_au_library.py b/src/bonsai/scripts/generate_au_library.py
index 044f2fb090..43f05b45da 100644
--- a/src/bonsai/scripts/generate_au_library.py
+++ b/src/bonsai/scripts/generate_au_library.py
@@ -30,6 +30,7 @@ import ifcopenshell.api.pset
import ifcopenshell.api.root
import ifcopenshell.api.style
import ifcopenshell.api.unit
+
import bonsai.tool as tool
diff --git a/src/bonsai/scripts/generate_demo_library.py b/src/bonsai/scripts/generate_demo_library.py
index 7a9e741dab..a77fc09ab7 100644
--- a/src/bonsai/scripts/generate_demo_library.py
+++ b/src/bonsai/scripts/generate_demo_library.py
@@ -16,6 +16,8 @@
# You should have received a copy of the GNU General Public License
# along with Bonsai. If not, see .
+from pathlib import Path
+
import bpy
import ifcopenshell
import ifcopenshell.api
@@ -31,8 +33,8 @@ import ifcopenshell.api.style
import ifcopenshell.api.unit
import ifcopenshell.util.schema
import ifcopenshell.util.shape_builder
+
import bonsai.tool as tool
-from pathlib import Path
def sync_guids(target_file: ifcopenshell.file, source_file: ifcopenshell.file) -> None:
diff --git a/src/bonsai/scripts/generate_entourage_library.py b/src/bonsai/scripts/generate_entourage_library.py
index 78ed71ac6a..7435186396 100644
--- a/src/bonsai/scripts/generate_entourage_library.py
+++ b/src/bonsai/scripts/generate_entourage_library.py
@@ -17,6 +17,8 @@
# along with Bonsai. If not, see .
import os
+from pathlib import Path
+
import bpy
import ifcopenshell
import ifcopenshell.api
@@ -26,9 +28,8 @@ import ifcopenshell.api.project
import ifcopenshell.api.root
import ifcopenshell.api.style
import ifcopenshell.api.unit
-import bonsai.tool as tool
-from pathlib import Path
+import bonsai.tool as tool
# When run from Blender
BLEND_DIR = os.path.dirname(bpy.data.filepath)
diff --git a/src/bonsai/scripts/generate_furniture_library.py b/src/bonsai/scripts/generate_furniture_library.py
index 7212191be9..1c1572c854 100644
--- a/src/bonsai/scripts/generate_furniture_library.py
+++ b/src/bonsai/scripts/generate_furniture_library.py
@@ -16,7 +16,11 @@
# You should have received a copy of the GNU General Public License
# along with Bonsai. If not, see .
-import numpy as np
+from itertools import chain
+from math import cos, pi, tan
+from pathlib import Path
+from typing import Optional, Union
+
import ifcopenshell
import ifcopenshell.api
import ifcopenshell.api.context
@@ -27,11 +31,8 @@ import ifcopenshell.api.root
import ifcopenshell.api.style
import ifcopenshell.api.unit
import ifcopenshell.util.element
-from math import cos, tan, pi
-from pathlib import Path
-from itertools import chain
-from ifcopenshell.util.shape_builder import ShapeBuilder, V, np_to_3d, np_normalized
-from typing import Optional, Union
+import numpy as np
+from ifcopenshell.util.shape_builder import ShapeBuilder, V, np_normalized, np_to_3d
GeneratorOutput = Union[list[ifcopenshell.entity_instance], list[list[ifcopenshell.entity_instance]]]
diff --git a/src/bonsai/scripts/generate_landscape_library.py b/src/bonsai/scripts/generate_landscape_library.py
index 01e694e9d0..34d2366fd5 100644
--- a/src/bonsai/scripts/generate_landscape_library.py
+++ b/src/bonsai/scripts/generate_landscape_library.py
@@ -16,10 +16,16 @@
# You should have received a copy of the GNU General Public License
# along with Bonsai. If not, see .
-import os
-import bpy
import csv
+import os
import random
+from collections import namedtuple
+from itertools import chain
+from math import cos, pi, sin, tan
+from pathlib import Path
+from random import uniform
+
+import bpy
import ifcopenshell
import ifcopenshell.api
import ifcopenshell.api.context
@@ -29,15 +35,10 @@ import ifcopenshell.api.root
import ifcopenshell.api.style
import ifcopenshell.api.unit
import ifcopenshell.util.unit
-import bonsai.tool as tool
-from math import cos, sin, tan, pi
-from pathlib import Path
-from itertools import chain
from ifcopenshell.util.shape_builder import ShapeBuilder
-from collections import namedtuple
-from mathutils import Vector, Matrix
-from random import uniform
+from mathutils import Matrix, Vector
+import bonsai.tool as tool
# When run from Blender
BLEND_DIR = os.path.dirname(bpy.data.filepath)
diff --git a/src/bonsai/scripts/generate_png_icons.py b/src/bonsai/scripts/generate_png_icons.py
index d24b69fe90..a523163a20 100644
--- a/src/bonsai/scripts/generate_png_icons.py
+++ b/src/bonsai/scripts/generate_png_icons.py
@@ -5,9 +5,9 @@
# to run on mac: python3 generate_png_icons.py
import os
+import re
import subprocess
import xml.etree.ElementTree as ET
-import re
SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__))
SVG_FILE = os.path.join(SCRIPT_DIR, "bonsai_icons.svg")
diff --git a/src/bonsai/scripts/generate_site_library.py b/src/bonsai/scripts/generate_site_library.py
index e42ad4e4f2..0b0511e9da 100644
--- a/src/bonsai/scripts/generate_site_library.py
+++ b/src/bonsai/scripts/generate_site_library.py
@@ -25,6 +25,7 @@ import ifcopenshell.api.project
import ifcopenshell.api.root
import ifcopenshell.api.style
import ifcopenshell.api.unit
+
import bonsai.tool as tool
diff --git a/src/bonsai/scripts/generate_steel_profiles_library.py b/src/bonsai/scripts/generate_steel_profiles_library.py
index 086c918689..c54818df4b 100644
--- a/src/bonsai/scripts/generate_steel_profiles_library.py
+++ b/src/bonsai/scripts/generate_steel_profiles_library.py
@@ -19,15 +19,16 @@
# fmt: off
# pylint: skip-file
+from math import cos, pi
+from pathlib import Path
+
+import boltspy as bolts # pyright: ignore[reportMissingImports]
import ifcopenshell
import ifcopenshell.api
import ifcopenshell.api.material
import ifcopenshell.api.project
import ifcopenshell.api.root
import ifcopenshell.api.unit
-import boltspy as bolts # pyright: ignore[reportMissingImports]
-from math import cos, pi
-from pathlib import Path
from ifcopenshell.util.shape_builder import ShapeBuilder, V, ifc_safe_vector_type
diff --git a/src/bonsai/scripts/generate_util_type_json.py b/src/bonsai/scripts/generate_util_type_json.py
index c162800f54..7c44a9dfe9 100644
--- a/src/bonsai/scripts/generate_util_type_json.py
+++ b/src/bonsai/scripts/generate_util_type_json.py
@@ -18,6 +18,7 @@
# See bug #1300. Dodgy quick results that we should rebuild later.
import json
+
import ifcopenshell
import ifcopenshell.util.schema
diff --git a/src/bonsai/scripts/geonodes_modifier_prototype.py b/src/bonsai/scripts/geonodes_modifier_prototype.py
index 1b3dbfd8ab..16370c1ca2 100644
--- a/src/bonsai/scripts/geonodes_modifier_prototype.py
+++ b/src/bonsai/scripts/geonodes_modifier_prototype.py
@@ -17,14 +17,15 @@
# along with Bonsai. If not, see .
+import json
+
+import bmesh
+import bpy
import ifcopenshell
import ifcopenshell.api.pset
import ifcopenshell.util.element
-import bonsai.tool as tool
-import bpy
-import bmesh
-import json
+import bonsai.tool as tool
# Below is the code for
# prototype for geonodes modifier (similar to ifc sverchok modifier)
diff --git a/src/bonsai/scripts/getIfcElements.py b/src/bonsai/scripts/getIfcElements.py
index 335260f7e9..57e03d50c4 100644
--- a/src/bonsai/scripts/getIfcElements.py
+++ b/src/bonsai/scripts/getIfcElements.py
@@ -18,9 +18,9 @@
"""This script converts the computer iterpretable listing ifcXML XSD into a JSON file"""
-import xml.etree.ElementTree as ET
import collections
import json
+import xml.etree.ElementTree as ET
class IFC4Extractor:
diff --git a/src/bonsai/scripts/get_all_qtos.py b/src/bonsai/scripts/get_all_qtos.py
index 7f23dca55a..d364115559 100644
--- a/src/bonsai/scripts/get_all_qtos.py
+++ b/src/bonsai/scripts/get_all_qtos.py
@@ -1,13 +1,14 @@
"""Update ifc5d json files with qtos from the provided pset templates path."""
import json
-import ifcopenshell.util.pset
-import ifcopenshell.util.type
-import ifc5d
from collections import defaultdict
from pathlib import Path
from typing import Union
+import ifc5d
+import ifcopenshell.util.pset
+import ifcopenshell.util.type
+
def order_dict(dictionary):
# https://stackoverflow.com/questions/22721579/sorting-a-nested-ordereddict-by-key-recursively
diff --git a/src/bonsai/scripts/get_description.py b/src/bonsai/scripts/get_description.py
index 2d581185aa..a05d5dc287 100644
--- a/src/bonsai/scripts/get_description.py
+++ b/src/bonsai/scripts/get_description.py
@@ -16,11 +16,12 @@
# You should have received a copy of the GNU General Public License
# along with Bonsai. If not, see .
-import os
-import re
import html
import json
+import os
+import re
from pathlib import Path
+
import ifcopenshell
diff --git a/src/bonsai/scripts/get_volume_by_material.py b/src/bonsai/scripts/get_volume_by_material.py
index 2f81862990..312878e53d 100644
--- a/src/bonsai/scripts/get_volume_by_material.py
+++ b/src/bonsai/scripts/get_volume_by_material.py
@@ -16,10 +16,11 @@
# You should have received a copy of the GNU General Public License
# along with Bonsai. If not, see .
-import bpy
-import bmesh
import pprint
+import bmesh
+import bpy
+
material_volumes = {}
for obj in bpy.context.selected_objects:
diff --git a/src/bonsai/scripts/headless_import.py b/src/bonsai/scripts/headless_import.py
index 111b07d78b..7554eacc04 100644
--- a/src/bonsai/scripts/headless_import.py
+++ b/src/bonsai/scripts/headless_import.py
@@ -1,6 +1,7 @@
# This can be run using `blender -b -P headless_import.py`
import bpy
+
import bonsai.tool as tool
# When federating, you may wish to manually specify the origin to ensure models
diff --git a/src/bonsai/scripts/obj2ifc-meshlab.py b/src/bonsai/scripts/obj2ifc-meshlab.py
index 1d2739ca21..c8292bb0f7 100644
--- a/src/bonsai/scripts/obj2ifc-meshlab.py
+++ b/src/bonsai/scripts/obj2ifc-meshlab.py
@@ -19,21 +19,21 @@
# This can be packaged with `pyinstaller --onefile --hidden-import numpy --collect-all ifcopenshell --clean obj2ifc.py`
import argparse
-import pymeshlab # pyright: ignore[reportMissingImports]
+from pathlib import Path
+
import ifcopenshell
import ifcopenshell.api
import ifcopenshell.api.aggregate
import ifcopenshell.api.context
import ifcopenshell.api.geometry
+import ifcopenshell.api.owner.settings
import ifcopenshell.api.project
import ifcopenshell.api.root
import ifcopenshell.api.spatial
import ifcopenshell.api.unit
-import ifcopenshell.api.owner.settings
import ifcopenshell.guid
-from pathlib import Path
-
import numpy as np
+import pymeshlab # pyright: ignore[reportMissingImports]
class Obj2Ifc:
diff --git a/src/bonsai/scripts/obj2ifc.py b/src/bonsai/scripts/obj2ifc.py
index dc91cedfd5..70f3bf7b41 100644
--- a/src/bonsai/scripts/obj2ifc.py
+++ b/src/bonsai/scripts/obj2ifc.py
@@ -19,21 +19,21 @@
# This can be packaged with `pyinstaller --onefile --hidden-import numpy --collect-all ifcopenshell --clean obj2ifc.py`
import argparse
-import pywavefront # pyright: ignore[reportMissingImports]
+from pathlib import Path
+
import ifcopenshell
import ifcopenshell.api
import ifcopenshell.api.aggregate
import ifcopenshell.api.context
import ifcopenshell.api.geometry
+import ifcopenshell.api.owner.settings
import ifcopenshell.api.project
import ifcopenshell.api.root
import ifcopenshell.api.spatial
import ifcopenshell.api.unit
-import ifcopenshell.api.owner.settings
import ifcopenshell.guid
-from pathlib import Path
-
import numpy as np
+import pywavefront # pyright: ignore[reportMissingImports]
class Obj2Ifc:
diff --git a/src/bonsai/scripts/replace_drawing_path.py b/src/bonsai/scripts/replace_drawing_path.py
index eeca3911e0..500726082f 100644
--- a/src/bonsai/scripts/replace_drawing_path.py
+++ b/src/bonsai/scripts/replace_drawing_path.py
@@ -27,15 +27,15 @@ It works on the active ifc file (if exists).
"""
-import bonsai.tool as tool
+import os
+import sys
+from sys import platform
+
import ifcopenshell
import ifcopenshell.api.pset
import ifcopenshell.util.element
-import sys
-
-import os
-from sys import platform
+import bonsai.tool as tool
file = tool.Ifc.get()
if not file:
diff --git a/src/bonsai/scripts/reregister_bonsai.py b/src/bonsai/scripts/reregister_bonsai.py
index 437c9f5b34..ba9ab2ba2a 100644
--- a/src/bonsai/scripts/reregister_bonsai.py
+++ b/src/bonsai/scripts/reregister_bonsai.py
@@ -25,6 +25,7 @@ to ensure disable and enable occur in the same Blender session.
import bpy
+
import bonsai.tool as tool
bonsai_name = tool.Blender.get_blender_addon_package_name()
diff --git a/src/bonsai/scripts/setup_pytest.py b/src/bonsai/scripts/setup_pytest.py
index 90af113eca..28dc7565f1 100644
--- a/src/bonsai/scripts/setup_pytest.py
+++ b/src/bonsai/scripts/setup_pytest.py
@@ -16,8 +16,8 @@
# You should have received a copy of the GNU General Public License
# along with Bonsai. If not, see .
-import sys
import subprocess
+import sys
from pathlib import Path
print("Here are the detected system paths:")
@@ -45,10 +45,10 @@ for dep in dependencies:
subprocess.check_call(command + [dep])
try:
+ import pygments
import pytest
import pytest_bdd
import pytest_blender
- import pygments
print("Test dependency installation was successful!")
except Exception as e:
diff --git a/src/bonsai/scripts/standalone_blender_import.py b/src/bonsai/scripts/standalone_blender_import.py
index 27dc84e07f..a2b9908afb 100644
--- a/src/bonsai/scripts/standalone_blender_import.py
+++ b/src/bonsai/scripts/standalone_blender_import.py
@@ -1,6 +1,7 @@
+import multiprocessing
+
import ifcopenshell
import ifcopenshell.geom
-import multiprocessing
class BlenderImporter:
diff --git a/src/bonsai/scripts/standalone_drawer.py b/src/bonsai/scripts/standalone_drawer.py
index 1b669adb3f..3eed11b9c9 100644
--- a/src/bonsai/scripts/standalone_drawer.py
+++ b/src/bonsai/scripts/standalone_drawer.py
@@ -1,10 +1,11 @@
-import sys
-import ifcopenshell
-import ifcopenshell.util.element
-import ifcopenshell.geom
import multiprocessing
+import sys
from typing import NamedTuple
+
+import ifcopenshell
+import ifcopenshell.geom
import ifcopenshell.ifcopenshell_wrapper as W
+import ifcopenshell.util.element
# W.turn_on_detailed_logging()
diff --git a/src/bonsai/scripts/standalone_section_shader.py b/src/bonsai/scripts/standalone_section_shader.py
index 970e58105b..20afd92fea 100644
--- a/src/bonsai/scripts/standalone_section_shader.py
+++ b/src/bonsai/scripts/standalone_section_shader.py
@@ -12,20 +12,16 @@ bl_info = {
}
-import bpy
-from bpy.types import Operator, PropertyGroup, Panel
-from mathutils import Vector, Matrix, Euler
from math import radians
+
+import bpy
from bpy.props import (
- PointerProperty,
- StringProperty,
- EnumProperty,
BoolProperty,
- IntProperty,
- FloatProperty,
FloatVectorProperty,
- CollectionProperty,
+ PointerProperty,
)
+from bpy.types import Operator, Panel, PropertyGroup
+from mathutils import Euler, Vector
class SectionCutawayManager:
diff --git a/src/bonsai/scripts/waldo.py b/src/bonsai/scripts/waldo.py
index 5ed734356c..00243c5782 100644
--- a/src/bonsai/scripts/waldo.py
+++ b/src/bonsai/scripts/waldo.py
@@ -1,4 +1,8 @@
-import numpy as np
+# https://stackoverflow.com/a/9184560/9627415
+# Possible optimisation to linalg.norm?
+from itertools import cycle
+from math import radians
+
import ifcopenshell
import ifcopenshell.api.aggregate
import ifcopenshell.api.context
@@ -12,14 +16,7 @@ import ifcopenshell.api.type
import ifcopenshell.api.unit
import ifcopenshell.util.placement
import ifcopenshell.util.shape_builder
-
-# https://stackoverflow.com/a/9184560/9627415
-# Possible optimisation to linalg.norm?
-
-# from ifcopenshell.util.shape_builder import VectorType, SequenceOfVectors
-from itertools import cycle
-from collections import namedtuple
-from math import sin, cos, radians
+import numpy as np
f = ifcopenshell.api.project.create_file()
diff --git a/src/bonsai/test/bim/bootstrap.py b/src/bonsai/test/bim/bootstrap.py
index 6d997bdd7f..c799c74c00 100644
--- a/src/bonsai/test/bim/bootstrap.py
+++ b/src/bonsai/test/bim/bootstrap.py
@@ -19,17 +19,19 @@
import os
import re
-import bpy
-import pytest
import webbrowser
-import bonsai.bim.handler
-import bonsai.tool as tool
+
+import bpy
import ifcopenshell
import ifcopenshell.util.element
import ifcopenshell.util.representation
-from bonsai.bim.ifc import IfcStore
+import pytest
from mathutils import Vector
+import bonsai.bim.handler
+import bonsai.tool as tool
+from bonsai.bim.ifc import IfcStore
+
# Monkey-patch webbrowser opening since we want to test headlessly
webbrowser.open = lambda x: True
diff --git a/src/bonsai/test/bim/module/drawing/test_segment_clipping.py b/src/bonsai/test/bim/module/drawing/test_segment_clipping.py
index 2a30f6a957..2846a3f2b7 100644
--- a/src/bonsai/test/bim/module/drawing/test_segment_clipping.py
+++ b/src/bonsai/test/bim/module/drawing/test_segment_clipping.py
@@ -18,8 +18,8 @@
import pytest
from mathutils import Vector
-from bonsai.bim.module.drawing.helper import clip_segment
+from bonsai.bim.module.drawing.helper import clip_segment
BOUNDS = (10, 30, 10, 30, None, None)
diff --git a/src/bonsai/test/bim/stub.py b/src/bonsai/test/bim/stub.py
index a5c498f81e..969cf98cbe 100644
--- a/src/bonsai/test/bim/stub.py
+++ b/src/bonsai/test/bim/stub.py
@@ -17,7 +17,7 @@
# along with Bonsai. If not, see .
-from typing import Union, Any, Optional
+from typing import Any, Optional, Union
class bSDDClientStub:
diff --git a/src/bonsai/test/bim/test_feature.py b/src/bonsai/test/bim/test_feature.py
index 036e0bf464..9df6bbf627 100644
--- a/src/bonsai/test/bim/test_feature.py
+++ b/src/bonsai/test/bim/test_feature.py
@@ -17,31 +17,34 @@
# along with Bonsai. If not, see .
from __future__ import annotations
+
import os
-import types
-import bpy
-import pytest
-import shutil
import pprint
+import shutil
import traceback
+import types
import webbrowser
-import numpy as np
-import test.bim.stub
+from collections.abc import Generator
+from inspect import signature
+from math import radians
+from pathlib import Path
+from typing import Any, Union
+
+import bpy
import ifcopenshell
import ifcopenshell.util.element
import ifcopenshell.util.representation
-import bonsai.tool as tool
-import bonsai.bim.handler
-from collections.abc import Generator
-from bonsai.bim.ifc import IfcStore
-from bonsai.tool.brick import BrickStore
-from bonsai.bim.module.model.data import AuthoringData
-from pytest_bdd import scenarios, given, when, then, parsers
-from inspect import signature
+import numpy as np
+import pytest
from mathutils import Vector
-from math import radians
-from pathlib import Path
-from typing import Union, Any
+from pytest_bdd import given, parsers, scenarios, then, when
+
+import bonsai.bim.handler
+import bonsai.tool as tool
+import test.bim.stub
+from bonsai.bim.ifc import IfcStore
+from bonsai.bim.module.model.data import AuthoringData
+from bonsai.tool.brick import BrickStore
scenarios("feature")
diff --git a/src/bonsai/test/core/bootstrap.py b/src/bonsai/test/core/bootstrap.py
index 837ce67b94..3cf7589420 100644
--- a/src/bonsai/test/core/bootstrap.py
+++ b/src/bonsai/test/core/bootstrap.py
@@ -16,11 +16,13 @@
# You should have received a copy of the GNU General Public License
# along with Bonsai. If not, see .
-import sys
import json
+import sys
+from typing import Any, Literal, Optional, Self, TypedDict
+
import pytest
+
import bonsai.core.tool
-from typing import Any, Optional, TypedDict, Literal, Self
@pytest.fixture
diff --git a/src/bonsai/test/core/test_aggregate.py b/src/bonsai/test/core/test_aggregate.py
index 157b1c3999..4e7babe13a 100644
--- a/src/bonsai/test/core/test_aggregate.py
+++ b/src/bonsai/test/core/test_aggregate.py
@@ -17,7 +17,7 @@
# along with Bonsai. If not, see .
import bonsai.core.aggregate as subject
-from test.core.bootstrap import ifc, aggregate, collector
+from test.core.bootstrap import aggregate, collector, ifc
class TestEnableEditingAggregate:
diff --git a/src/bonsai/test/core/test_attribute.py b/src/bonsai/test/core/test_attribute.py
index aba74e1a4e..d62b832cd9 100644
--- a/src/bonsai/test/core/test_attribute.py
+++ b/src/bonsai/test/core/test_attribute.py
@@ -17,7 +17,7 @@
# along with Bonsai. If not, see .
import bonsai.core.attribute as subject
-from test.core.bootstrap import ifc, blender, root, spatial
+from test.core.bootstrap import blender, ifc, root, spatial
class TestCopyAttributeToSelection:
diff --git a/src/bonsai/test/core/test_brick.py b/src/bonsai/test/core/test_brick.py
index 10a4a7cfd1..c40df06973 100644
--- a/src/bonsai/test/core/test_brick.py
+++ b/src/bonsai/test/core/test_brick.py
@@ -17,7 +17,7 @@
# along with Bonsai. If not, see .
import bonsai.core.brick as subject
-from test.core.bootstrap import ifc, brick
+from test.core.bootstrap import brick, ifc
class TestLoadBrickProject:
diff --git a/src/bonsai/test/core/test_context.py b/src/bonsai/test/core/test_context.py
index 7388754765..2fd9e05834 100644
--- a/src/bonsai/test/core/test_context.py
+++ b/src/bonsai/test/core/test_context.py
@@ -17,7 +17,7 @@
# along with Bonsai. If not, see .
import bonsai.core.context as subject
-from test.core.bootstrap import ifc, context
+from test.core.bootstrap import context, ifc
class TestAddContext:
diff --git a/src/bonsai/test/core/test_document.py b/src/bonsai/test/core/test_document.py
index 5baf3e709f..bd9f743a3d 100644
--- a/src/bonsai/test/core/test_document.py
+++ b/src/bonsai/test/core/test_document.py
@@ -17,7 +17,7 @@
# along with Bonsai. If not, see .
import bonsai.core.document as subject
-from test.core.bootstrap import ifc, document
+from test.core.bootstrap import document, ifc
class TestLoadProjectDocuments:
diff --git a/src/bonsai/test/core/test_drawing.py b/src/bonsai/test/core/test_drawing.py
index 957bd79f79..a83f026ad3 100644
--- a/src/bonsai/test/core/test_drawing.py
+++ b/src/bonsai/test/core/test_drawing.py
@@ -17,7 +17,7 @@
# along with Bonsai. If not, see .
import bonsai.core.drawing as subject
-from test.core.bootstrap import ifc, drawing, collector, geometry, blender, Prophecy
+from test.core.bootstrap import Prophecy, blender, collector, drawing, geometry, ifc
class TestEnableEditingText:
diff --git a/src/bonsai/test/core/test_geometry.py b/src/bonsai/test/core/test_geometry.py
index c9e3392808..21ccb09220 100644
--- a/src/bonsai/test/core/test_geometry.py
+++ b/src/bonsai/test/core/test_geometry.py
@@ -18,7 +18,7 @@
import bonsai.core.geometry as subject
import test.core.test_style
-from test.core.bootstrap import ifc, surveyor, geometry, style
+from test.core.bootstrap import geometry, ifc, style, surveyor
class TestEditObjectPlacement:
diff --git a/src/bonsai/test/core/test_georeference.py b/src/bonsai/test/core/test_georeference.py
index 6048ae5828..b9b330d816 100644
--- a/src/bonsai/test/core/test_georeference.py
+++ b/src/bonsai/test/core/test_georeference.py
@@ -17,7 +17,7 @@
# along with Bonsai. If not, see .
import bonsai.core.georeference as subject
-from test.core.bootstrap import ifc, georeference
+from test.core.bootstrap import georeference, ifc
class TestAddGeoreferencing:
diff --git a/src/bonsai/test/core/test_material.py b/src/bonsai/test/core/test_material.py
index a8baee0c6c..a2cbf8c433 100644
--- a/src/bonsai/test/core/test_material.py
+++ b/src/bonsai/test/core/test_material.py
@@ -17,7 +17,7 @@
# along with Bonsai. If not, see .
import bonsai.core.material as subject
-from test.core.bootstrap import ifc, material, style, spatial
+from test.core.bootstrap import ifc, material, spatial, style
class TestAddMaterial:
diff --git a/src/bonsai/test/core/test_misc.py b/src/bonsai/test/core/test_misc.py
index 950799a098..716607c0d8 100644
--- a/src/bonsai/test/core/test_misc.py
+++ b/src/bonsai/test/core/test_misc.py
@@ -17,7 +17,7 @@
# along with Bonsai. If not, see .
import bonsai.core.misc as subject
-from test.core.bootstrap import misc, ifc
+from test.core.bootstrap import ifc, misc
class TestResizeToStorey:
diff --git a/src/bonsai/test/core/test_nest.py b/src/bonsai/test/core/test_nest.py
index d2eefc9109..36cbfafc60 100644
--- a/src/bonsai/test/core/test_nest.py
+++ b/src/bonsai/test/core/test_nest.py
@@ -17,7 +17,7 @@
# along with Bonsai. If not, see .
import bonsai.core.nest as subject
-from test.core.bootstrap import ifc, nest, collector
+from test.core.bootstrap import collector, ifc, nest
class TestEnableEditingNeset:
diff --git a/src/bonsai/test/core/test_owner.py b/src/bonsai/test/core/test_owner.py
index b648030407..12d5bf3fa1 100644
--- a/src/bonsai/test/core/test_owner.py
+++ b/src/bonsai/test/core/test_owner.py
@@ -18,7 +18,7 @@
import bonsai.core.owner as subject
-from test.core.bootstrap import ifc, owner, Prophecy
+from test.core.bootstrap import Prophecy, ifc, owner
class TestAddPerson:
diff --git a/src/bonsai/test/core/test_project.py b/src/bonsai/test/core/test_project.py
index 7ecdc3c36c..462e1cabcd 100644
--- a/src/bonsai/test/core/test_project.py
+++ b/src/bonsai/test/core/test_project.py
@@ -18,7 +18,7 @@
import bonsai.core.project as subject
-from test.core.bootstrap import ifc, project, spatial, georeference
+from test.core.bootstrap import georeference, ifc, project, spatial
class TestCreateProject:
diff --git a/src/bonsai/test/core/test_root.py b/src/bonsai/test/core/test_root.py
index 7d922627ac..121236803d 100644
--- a/src/bonsai/test/core/test_root.py
+++ b/src/bonsai/test/core/test_root.py
@@ -18,7 +18,7 @@
import bonsai.core.root as subject
import test.core.test_geometry
-from test.core.bootstrap import ifc, collector, geometry, root
+from test.core.bootstrap import collector, geometry, ifc, root
class TestCopyClass:
diff --git a/src/bonsai/test/core/test_spatial.py b/src/bonsai/test/core/test_spatial.py
index a2b824fc91..0ae9695ea2 100644
--- a/src/bonsai/test/core/test_spatial.py
+++ b/src/bonsai/test/core/test_spatial.py
@@ -17,7 +17,7 @@
# along with Bonsai. If not, see .
import bonsai.core.spatial as subject
-from test.core.bootstrap import ifc, collector, spatial
+from test.core.bootstrap import collector, ifc, spatial
class TestReferenceStructure:
diff --git a/src/bonsai/test/core/test_style.py b/src/bonsai/test/core/test_style.py
index ca8fc6b962..a2278cf008 100644
--- a/src/bonsai/test/core/test_style.py
+++ b/src/bonsai/test/core/test_style.py
@@ -17,7 +17,7 @@
# along with Bonsai. If not, see .
import bonsai.core.style as subject
-from test.core.bootstrap import ifc, material, style, spatial
+from test.core.bootstrap import ifc, material, spatial, style
class TestAddStyle:
diff --git a/src/bonsai/test/core/test_system.py b/src/bonsai/test/core/test_system.py
index 4612e14d69..0f7dd34b62 100644
--- a/src/bonsai/test/core/test_system.py
+++ b/src/bonsai/test/core/test_system.py
@@ -18,7 +18,7 @@
import bonsai.core.system as subject
-from test.core.bootstrap import ifc, system, spatial, group
+from test.core.bootstrap import group, ifc, spatial, system
class TestLoadSystems:
@@ -153,8 +153,8 @@ class TestAddPort:
def test_run(self, ifc, system):
system.get_ports("element").should_be_called().will_return(["port"])
system.load_ports("element", ["port"]).should_be_called()
- #system.create_empty_at_cursor_with_element_orientation("element").should_be_called().will_return("obj")
- #system.run_root_assign_class(obj="obj", ifc_class="IfcDistributionPort", should_add_representation=False).should_be_called().will_return("port")
+ # system.create_empty_at_cursor_with_element_orientation("element").should_be_called().will_return("obj")
+ # system.run_root_assign_class(obj="obj", ifc_class="IfcDistributionPort", should_add_representation=False).should_be_called().will_return("port")
system.create_port_at_cursor("element").should_be_called().will_return("port")
system.load_ports("element", ["port"]).should_be_called()
subject.add_port(ifc, system, element="element")
diff --git a/src/bonsai/test/core/test_type.py b/src/bonsai/test/core/test_type.py
index 68130c1fa8..0987ab3d9e 100644
--- a/src/bonsai/test/core/test_type.py
+++ b/src/bonsai/test/core/test_type.py
@@ -17,11 +17,11 @@
# along with Bonsai. If not, see .
import bonsai.core.type as subject
-from test.core.bootstrap import ifc, type, geometry
+from test.core.bootstrap import ifc, model, type, geometry
class TestAssignType:
- def test_assigning_and_switching_to_an_existing_type_data(self, ifc, type):
+ def test_assigning_and_switching_to_an_existing_type_data(self, ifc, model, type):
ifc.run("type.assign_type", related_objects=["element"], relating_type="type").should_be_called()
type.has_material_usage("element").should_be_called().will_return(False)
ifc.get_object("type").should_be_called().will_return("type_obj")
@@ -29,7 +29,7 @@ class TestAssignType:
type.change_object_data("obj", "type_obj_data", is_global=False).should_be_called()
ifc.get_object("element").should_be_called().will_return("obj")
type.disable_editing("obj").should_be_called()
- subject.assign_type(ifc, type, element="element", type="type")
+ subject.assign_type(ifc, model, type, element="element", type="type")
def test_assigning_and_not_changing_data_if_the_type_has_no_data(self, ifc, type):
ifc.run("type.assign_type", related_objects=["element"], relating_type="type").should_be_called()
@@ -38,7 +38,7 @@ class TestAssignType:
type.get_object_data("type_obj").should_be_called().will_return(None)
ifc.get_object("element").should_be_called().will_return("obj")
type.disable_editing("obj").should_be_called()
- subject.assign_type(ifc, type, element="element", type="type")
+ subject.assign_type(ifc, model, type, element="element", type="type")
class TestPurgeUnusedTypes:
diff --git a/src/bonsai/test/tool/test_aggregate.py b/src/bonsai/test/tool/test_aggregate.py
index 20c31cacdc..bab71b2c4a 100644
--- a/src/bonsai/test/tool/test_aggregate.py
+++ b/src/bonsai/test/tool/test_aggregate.py
@@ -24,10 +24,11 @@ import ifcopenshell.api.root
import ifcopenshell.api.spatial
import ifcopenshell.api.unit
import ifcopenshell.util.shape_builder
+
import bonsai.core.tool
import bonsai.tool as tool
-from test.bim.bootstrap import NewFile
from bonsai.tool.aggregate import Aggregate as subject
+from test.bim.bootstrap import NewFile
class TestImplementsTool(NewFile):
diff --git a/src/bonsai/test/tool/test_blender.py b/src/bonsai/test/tool/test_blender.py
index 2db244abe1..43d04c7c19 100644
--- a/src/bonsai/test/tool/test_blender.py
+++ b/src/bonsai/test/tool/test_blender.py
@@ -16,14 +16,16 @@
# You should have received a copy of the GNU General Public License
# along with Bonsai. If not, see .
+from typing import TYPE_CHECKING
+
import bpy
import ifcopenshell
+import pytest
+
import bonsai.core.tool
import bonsai.tool as tool
-import pytest
-from test.bim.bootstrap import NewFile
-from typing import TYPE_CHECKING
from bonsai.tool.blender import Blender as subject
+from test.bim.bootstrap import NewFile
if TYPE_CHECKING:
import bpy.stub_internal.rna_enums as rna_enums
diff --git a/src/bonsai/test/tool/test_brick.py b/src/bonsai/test/tool/test_brick.py
index 7470dd5954..c3d1f429e3 100644
--- a/src/bonsai/test/tool/test_brick.py
+++ b/src/bonsai/test/tool/test_brick.py
@@ -17,22 +17,24 @@
# along with Bonsai. If not, see .
import os
+
import bpy
import brickschema
import brickschema.persistent
-from brickschema.namespaces import REF, A
import ifcopenshell
import ifcopenshell.api
import ifcopenshell.api.aggregate
import ifcopenshell.api.root
import ifcopenshell.guid
+from brickschema.namespaces import REF, A
+from rdflib import Literal, Namespace, URIRef
+from rdflib.namespace import RDF
+
import bonsai.core.tool
import bonsai.tool as tool
-from rdflib.namespace import RDF
-from rdflib import Literal, URIRef, Namespace
-from test.bim.bootstrap import NewFile
from bonsai.tool.brick import Brick as subject
from bonsai.tool.brick import BrickStore
+from test.bim.bootstrap import NewFile
class TestImplementsTool(NewFile):
diff --git a/src/bonsai/test/tool/test_cad.py b/src/bonsai/test/tool/test_cad.py
index c02aaed8c6..2e84c71718 100644
--- a/src/bonsai/test/tool/test_cad.py
+++ b/src/bonsai/test/tool/test_cad.py
@@ -16,10 +16,11 @@
# You should have received a copy of the GNU General Public License
# along with Bonsai. If not, see .
-from test.bim.bootstrap import NewFile
-from bonsai.tool.cad import Cad as subject
from mathutils import Vector
+from bonsai.tool.cad import Cad as subject
+from test.bim.bootstrap import NewFile
+
V = lambda *x: Vector([float(i) for i in x])
diff --git a/src/bonsai/test/tool/test_classification.py b/src/bonsai/test/tool/test_classification.py
index b584050e8d..7bfe2a44d7 100644
--- a/src/bonsai/test/tool/test_classification.py
+++ b/src/bonsai/test/tool/test_classification.py
@@ -17,14 +17,16 @@
# along with Bonsai. If not, see .
import os
+
import bpy
import ifcopenshell
import ifcopenshell.util.classification
import ifcopenshell.util.element
+
import bonsai.core.tool
import bonsai.tool as tool
-from test.bim.bootstrap import NewFile
from bonsai.tool.classification import Classification as subject
+from test.bim.bootstrap import NewFile
class TestImplementsTool(NewFile):
diff --git a/src/bonsai/test/tool/test_collector.py b/src/bonsai/test/tool/test_collector.py
index ba59aeef92..1ddd7e6381 100644
--- a/src/bonsai/test/tool/test_collector.py
+++ b/src/bonsai/test/tool/test_collector.py
@@ -24,6 +24,7 @@ import ifcopenshell.api.feature
import ifcopenshell.api.group
import ifcopenshell.api.spatial
import ifcopenshell.util.element
+
import bonsai.core.tool
import bonsai.tool as tool
from bonsai.tool.collector import Collector as subject
diff --git a/src/bonsai/test/tool/test_context.py b/src/bonsai/test/tool/test_context.py
index f4035ecd97..c131028e98 100644
--- a/src/bonsai/test/tool/test_context.py
+++ b/src/bonsai/test/tool/test_context.py
@@ -18,9 +18,10 @@
import bpy
import ifcopenshell
-import test.bim.bootstrap
+
import bonsai.core.tool
import bonsai.tool as tool
+import test.bim.bootstrap
from bonsai.tool.context import Context as subject
diff --git a/src/bonsai/test/tool/test_debug.py b/src/bonsai/test/tool/test_debug.py
index 24e875071b..7b434c4ee6 100644
--- a/src/bonsai/test/tool/test_debug.py
+++ b/src/bonsai/test/tool/test_debug.py
@@ -17,16 +17,18 @@
# along with Bonsai. If not, see .
import os
+from pathlib import Path
+
import bpy
import ifcopenshell
import ifcopenshell.api.style
import ifcopenshell.util.schema
+
import bonsai.core.tool
import bonsai.tool as tool
-from test.bim.bootstrap import NewFile
-from bonsai.tool.debug import Debug as subject
from bonsai.bim.ifc import IfcStore
-from pathlib import Path
+from bonsai.tool.debug import Debug as subject
+from test.bim.bootstrap import NewFile
class TestImplementsTool(NewFile):
diff --git a/src/bonsai/test/tool/test_document.py b/src/bonsai/test/tool/test_document.py
index 64ec2791b0..5afb25cd65 100644
--- a/src/bonsai/test/tool/test_document.py
+++ b/src/bonsai/test/tool/test_document.py
@@ -16,15 +16,17 @@
# You should have received a copy of the GNU General Public License
# along with Bonsai. If not, see .
+import json
+
import bpy
import ifcopenshell
import ifcopenshell.api
import ifcopenshell.api.document
+
import bonsai.core.tool
import bonsai.tool as tool
-import json
-from test.bim.bootstrap import NewFile
from bonsai.tool.document import Document as subject
+from test.bim.bootstrap import NewFile
class TestImplementsTool(NewFile):
diff --git a/src/bonsai/test/tool/test_drawing.py b/src/bonsai/test/tool/test_drawing.py
index 960e283084..f7beb94358 100644
--- a/src/bonsai/test/tool/test_drawing.py
+++ b/src/bonsai/test/tool/test_drawing.py
@@ -17,10 +17,10 @@
# along with Bonsai. If not, see .
import os
+import xml.etree.ElementTree as ET
from pathlib import Path
-import numpy as np
+
import bpy
-import mathutils
import ifcopenshell
import ifcopenshell.api.drawing
import ifcopenshell.api.group
@@ -28,14 +28,15 @@ import ifcopenshell.api.pset
import ifcopenshell.api.root
import ifcopenshell.guid
import ifcopenshell.util.element
-import bonsai.core.tool
-import bonsai.tool as tool
-from test.bim.bootstrap import NewFile
-from bonsai.tool.drawing import Drawing as subject
-from bonsai.bim.module.drawing.data import DecoratorData
+import mathutils
+import numpy as np
from mathutils import Vector
-import xml.etree.ElementTree as ET
+import bonsai.core.tool
+import bonsai.tool as tool
+from bonsai.bim.module.drawing.data import DecoratorData
+from bonsai.tool.drawing import Drawing as subject
+from test.bim.bootstrap import NewFile
class TestImplementsTool(NewFile):
diff --git a/src/bonsai/test/tool/test_geometry.py b/src/bonsai/test/tool/test_geometry.py
index a2107da12f..34300f2405 100644
--- a/src/bonsai/test/tool/test_geometry.py
+++ b/src/bonsai/test/tool/test_geometry.py
@@ -16,19 +16,21 @@
# You should have received a copy of the GNU General Public License
# along with Bonsai. If not, see .
-import bpy
import math
-import numpy as np
+from typing import Union
+
+import bpy
import ifcopenshell
import ifcopenshell.api.geometry
import ifcopenshell.api.root
import ifcopenshell.api.type
+import numpy as np
+from mathutils import Vector
+
import bonsai.core.tool
import bonsai.tool as tool
-from mathutils import Vector
-from test.bim.bootstrap import NewFile
from bonsai.tool.geometry import Geometry as subject
-from typing import Union
+from test.bim.bootstrap import NewFile
class TestImplementsTool(NewFile):
diff --git a/src/bonsai/test/tool/test_georeference.py b/src/bonsai/test/tool/test_georeference.py
index a6292abde4..2d29f8429b 100644
--- a/src/bonsai/test/tool/test_georeference.py
+++ b/src/bonsai/test/tool/test_georeference.py
@@ -16,19 +16,21 @@
# You should have received a copy of the GNU General Public License
# along with Bonsai. If not, see .
-import bpy
import math
+
+import bpy
import ifcopenshell
import ifcopenshell.api
import ifcopenshell.api.context
import ifcopenshell.api.georeference
import ifcopenshell.api.root
import ifcopenshell.api.unit
+from mathutils import Vector
+
import bonsai.core.tool
import bonsai.tool as tool
-from mathutils import Vector
-from test.bim.bootstrap import NewFile
from bonsai.tool.georeference import Georeference as subject
+from test.bim.bootstrap import NewFile
class TestImplementsTool(NewFile):
diff --git a/src/bonsai/test/tool/test_ifc.py b/src/bonsai/test/tool/test_ifc.py
index 3cbd7bdc22..9542332d52 100644
--- a/src/bonsai/test/tool/test_ifc.py
+++ b/src/bonsai/test/tool/test_ifc.py
@@ -16,15 +16,17 @@
# You should have received a copy of the GNU General Public License
# along with Bonsai. If not, see .
+import os
+import tempfile
+from pathlib import Path
+
import bpy
import ifcopenshell
-import test.bim.bootstrap
+import pytest
+
import bonsai.core.tool
import bonsai.tool as tool
-import pytest
-import tempfile
-import os
-from pathlib import Path
+import test.bim.bootstrap
from bonsai.tool.ifc import Ifc as subject
diff --git a/src/bonsai/test/tool/test_library.py b/src/bonsai/test/tool/test_library.py
index 64d73f918b..b0bbbf3990 100644
--- a/src/bonsai/test/tool/test_library.py
+++ b/src/bonsai/test/tool/test_library.py
@@ -18,10 +18,11 @@
import bpy
import ifcopenshell
+
import bonsai.core.tool
import bonsai.tool as tool
-from test.bim.bootstrap import NewFile
from bonsai.tool.library import Library as subject
+from test.bim.bootstrap import NewFile
class TestImplementsTool(NewFile):
diff --git a/src/bonsai/test/tool/test_loader.py b/src/bonsai/test/tool/test_loader.py
index b128988aba..8817d3d92b 100644
--- a/src/bonsai/test/tool/test_loader.py
+++ b/src/bonsai/test/tool/test_loader.py
@@ -16,21 +16,23 @@
# You should have received a copy of the GNU General Public License
# along with Bonsai. If not, see .
-import bpy
-import bmesh
import json
+from pathlib import Path
+
+import bmesh
+import bpy
import ifcopenshell
import ifcopenshell.api.library
import ifcopenshell.api.style
import ifcopenshell.util.schema
-import bonsai.core.tool
-import bonsai.tool as tool
-from test.bim.bootstrap import NewFile
-from bonsai.tool.loader import Loader as subject
import numpy as np
from ifcopenshell.util.shape_builder import ShapeBuilder
from mathutils import Vector
-from pathlib import Path
+
+import bonsai.core.tool
+import bonsai.tool as tool
+from bonsai.tool.loader import Loader as subject
+from test.bim.bootstrap import NewFile
class TestImplementsTool(NewFile):
@@ -188,8 +190,8 @@ class TestCreatingStyles(NewFile):
def get_png_raster_code():
import base64
- import zlib
import struct
+ import zlib
# https://blender.stackexchange.com/questions/62072/does-blender-have-a-method-to-a-get-png-formatted-bytearray-for-an-image-via-pyt
width = 2
diff --git a/src/bonsai/test/tool/test_material.py b/src/bonsai/test/tool/test_material.py
index ef423afb4c..870417a254 100644
--- a/src/bonsai/test/tool/test_material.py
+++ b/src/bonsai/test/tool/test_material.py
@@ -23,10 +23,11 @@ import ifcopenshell.api.material
import ifcopenshell.api.pset
import ifcopenshell.api.root
import ifcopenshell.api.style
+
import bonsai.core.tool
import bonsai.tool as tool
-from test.bim.bootstrap import NewFile
from bonsai.tool.material import Material as subject
+from test.bim.bootstrap import NewFile
class TestImplementsTool(NewFile):
diff --git a/src/bonsai/test/tool/test_misc.py b/src/bonsai/test/tool/test_misc.py
index 883755888a..c3d3cec2fe 100644
--- a/src/bonsai/test/tool/test_misc.py
+++ b/src/bonsai/test/tool/test_misc.py
@@ -16,16 +16,18 @@
# You should have received a copy of the GNU General Public License
# along with Bonsai. If not, see .
-import bpy
import math
-import numpy
+
+import bpy
import ifcopenshell
import ifcopenshell.api.aggregate
import ifcopenshell.api.spatial
import ifcopenshell.api.unit
-import test.bim.bootstrap
+import numpy
+
import bonsai.core.tool
import bonsai.tool as tool
+import test.bim.bootstrap
from bonsai.tool.misc import Misc as subject
diff --git a/src/bonsai/test/tool/test_model.py b/src/bonsai/test/tool/test_model.py
index d69b2a532e..756268cbee 100644
--- a/src/bonsai/test/tool/test_model.py
+++ b/src/bonsai/test/tool/test_model.py
@@ -16,6 +16,9 @@
# You should have received a copy of the GNU General Public License
# along with Bonsai. If not, see .
+import json
+from typing import Any
+
import bpy
import ifcopenshell
import ifcopenshell.api.geometry
@@ -26,14 +29,13 @@ import ifcopenshell.api.type
import ifcopenshell.util.element
import ifcopenshell.util.representation
import ifcopenshell.util.shape_builder
+import numpy as np
+from ifcopenshell.util.shape_builder import ShapeBuilder, V
+
import bonsai.core.tool
import bonsai.tool as tool
-import numpy as np
-import json
-from typing import Any
-from test.bim.bootstrap import NewFile
from bonsai.tool.model import Model as subject
-from ifcopenshell.util.shape_builder import V, ShapeBuilder
+from test.bim.bootstrap import NewFile
class TestImplementsTool(NewFile):
diff --git a/src/bonsai/test/tool/test_nest.py b/src/bonsai/test/tool/test_nest.py
index 257bbcee88..14acfa18bc 100644
--- a/src/bonsai/test/tool/test_nest.py
+++ b/src/bonsai/test/tool/test_nest.py
@@ -20,10 +20,11 @@ import bpy
import ifcopenshell
import ifcopenshell.api
import ifcopenshell.api.spatial
+
import bonsai.core.tool
import bonsai.tool as tool
-from test.bim.bootstrap import NewFile
from bonsai.tool.nest import Nest as subject
+from test.bim.bootstrap import NewFile
class TestImplementsTool(NewFile):
diff --git a/src/bonsai/test/tool/test_owner.py b/src/bonsai/test/tool/test_owner.py
index 84ca456e96..bc4ed2d533 100644
--- a/src/bonsai/test/tool/test_owner.py
+++ b/src/bonsai/test/tool/test_owner.py
@@ -16,15 +16,17 @@
# You should have received a copy of the GNU General Public License
# along with Bonsai. If not, see .
+from functools import cache
+from typing import Any
+
import bpy
import ifcopenshell
import ifcopenshell.api.owner
+
import bonsai.core.tool
import bonsai.tool as tool
-from test.bim.bootstrap import NewFile
from bonsai.tool.owner import Owner as subject
-from typing import Any
-from functools import cache
+from test.bim.bootstrap import NewFile
class TestImplementsTool(NewFile):
diff --git a/src/bonsai/test/tool/test_patch.py b/src/bonsai/test/tool/test_patch.py
index 8fce8974a9..955908f284 100644
--- a/src/bonsai/test/tool/test_patch.py
+++ b/src/bonsai/test/tool/test_patch.py
@@ -17,12 +17,14 @@
# along with Bonsai. If not, see .
import os
+
import bpy
import ifcopenshell
+
import bonsai.core.tool
import bonsai.tool as tool
-from test.bim.bootstrap import NewFile
from bonsai.tool.patch import Patch as subject
+from test.bim.bootstrap import NewFile
class TestImplementsTool(NewFile):
diff --git a/src/bonsai/test/tool/test_polyline.py b/src/bonsai/test/tool/test_polyline.py
index 9dd1e8f41c..b55c6b52a6 100644
--- a/src/bonsai/test/tool/test_polyline.py
+++ b/src/bonsai/test/tool/test_polyline.py
@@ -21,10 +21,11 @@ import ifcopenshell
import ifcopenshell.api.project
import ifcopenshell.api.root
import ifcopenshell.api.unit
+
import bonsai.core.tool
import bonsai.tool as tool
-from test.bim.bootstrap import NewFile
from bonsai.tool.polyline import Polyline as subject
+from test.bim.bootstrap import NewFile
class TestImplementsTool(NewFile):
diff --git a/src/bonsai/test/tool/test_project.py b/src/bonsai/test/tool/test_project.py
index 5751660d83..06c3f8ec25 100644
--- a/src/bonsai/test/tool/test_project.py
+++ b/src/bonsai/test/tool/test_project.py
@@ -17,20 +17,22 @@
# along with Bonsai. If not, see .
import contextlib
+import tempfile
+from pathlib import Path
+
import bpy
import ifcopenshell
import ifcopenshell.api.context
import ifcopenshell.api.document
import ifcopenshell.api.root
import ifcopenshell.api.unit
-import bonsai.core.tool
-import bonsai.tool as tool
-import tempfile
import ifcpatch
from ifcpatch.recipes import Ifc2Sql
-from test.bim.bootstrap import NewFile
+
+import bonsai.core.tool
+import bonsai.tool as tool
from bonsai.tool.project import Project as subject
-from pathlib import Path
+from test.bim.bootstrap import NewFile
class TestImplementsTool(NewFile):
diff --git a/src/bonsai/test/tool/test_pset.py b/src/bonsai/test/tool/test_pset.py
index 9aa8e70289..9b01105748 100644
--- a/src/bonsai/test/tool/test_pset.py
+++ b/src/bonsai/test/tool/test_pset.py
@@ -20,6 +20,7 @@ import bpy
import ifcopenshell
import ifcopenshell.api
import ifcopenshell.api.pset
+
import bonsai.core.tool
import bonsai.tool as tool
from bonsai.tool.pset import Pset as subject
diff --git a/src/bonsai/test/tool/test_pset_template.py b/src/bonsai/test/tool/test_pset_template.py
index a104f8baff..d2aa408caa 100644
--- a/src/bonsai/test/tool/test_pset_template.py
+++ b/src/bonsai/test/tool/test_pset_template.py
@@ -20,6 +20,7 @@ import bpy
import ifcopenshell
import ifcopenshell.api
import ifcopenshell.api.pset
+
import bonsai.core.tool
import bonsai.tool as tool
from bonsai.tool.pset_template import PsetTemplate as subject
diff --git a/src/bonsai/test/tool/test_qto.py b/src/bonsai/test/tool/test_qto.py
index 2b06cbb3c9..9ec7dc4efd 100644
--- a/src/bonsai/test/tool/test_qto.py
+++ b/src/bonsai/test/tool/test_qto.py
@@ -25,11 +25,12 @@ import ifcopenshell.api.pset
import ifcopenshell.api.root
import ifcopenshell.api.unit
import ifcopenshell.util.pset
-import test.bim.bootstrap
-import bonsai.core.tool
-import bonsai.core.root
-import bonsai.tool as tool
+
import bonsai.bim.import_ifc as import_ifc
+import bonsai.core.root
+import bonsai.core.tool
+import bonsai.tool as tool
+import test.bim.bootstrap
from bonsai.tool.qto import Qto as subject
diff --git a/src/bonsai/test/tool/test_root.py b/src/bonsai/test/tool/test_root.py
index b27b556a03..39b853d63c 100644
--- a/src/bonsai/test/tool/test_root.py
+++ b/src/bonsai/test/tool/test_root.py
@@ -22,10 +22,11 @@ import ifcopenshell.api
import ifcopenshell.api.feature
import ifcopenshell.api.type
import ifcopenshell.util.element
+
import bonsai.core.tool
import bonsai.tool as tool
-from test.bim.bootstrap import NewFile
from bonsai.tool.root import Root as subject
+from test.bim.bootstrap import NewFile
class TestImplementsTool(NewFile):
diff --git a/src/bonsai/test/tool/test_sequence.py b/src/bonsai/test/tool/test_sequence.py
index 7dab2671b9..af915f0273 100644
--- a/src/bonsai/test/tool/test_sequence.py
+++ b/src/bonsai/test/tool/test_sequence.py
@@ -17,15 +17,17 @@
# along with Bonsai. If not, see .
import os
+
import bpy
import ifcopenshell
import ifcopenshell.api
import ifcopenshell.api.pset
import ifcopenshell.api.root
+
import bonsai.core.tool
import bonsai.tool as tool
-from test.bim.bootstrap import NewFile
from bonsai.tool.sequence import Sequence as subject
+from test.bim.bootstrap import NewFile
class TestImplementsTool(NewFile):
diff --git a/src/bonsai/test/tool/test_spatial.py b/src/bonsai/test/tool/test_spatial.py
index fd9316912a..299e615f2f 100644
--- a/src/bonsai/test/tool/test_spatial.py
+++ b/src/bonsai/test/tool/test_spatial.py
@@ -16,17 +16,18 @@
# You should have received a copy of the GNU General Public License
# along with Bonsai. If not, see .
-import numpy as np
import bpy
import ifcopenshell
import ifcopenshell.api
import ifcopenshell.api.root
import ifcopenshell.api.spatial
+import numpy as np
+from mathutils import Matrix
+
import bonsai.core.tool
import bonsai.tool as tool
from bonsai.tool.spatial import Spatial as subject
from test.bim.bootstrap import NewFile
-from mathutils import Matrix
class TestImplementsTool(NewFile):
diff --git a/src/bonsai/test/tool/test_style.py b/src/bonsai/test/tool/test_style.py
index 23c70461ee..743ac317ec 100644
--- a/src/bonsai/test/tool/test_style.py
+++ b/src/bonsai/test/tool/test_style.py
@@ -17,17 +17,19 @@
# along with Bonsai. If not, see .
import os
+
import bpy
import ifcopenshell
import ifcopenshell.api
import ifcopenshell.api.root
import ifcopenshell.util.representation
import pytest
+from ifcopenshell.util.shape_builder import ShapeBuilder
+
import bonsai.core.tool
import bonsai.tool as tool
-from test.bim.bootstrap import NewFile
from bonsai.tool.style import Style as subject
-from ifcopenshell.util.shape_builder import ShapeBuilder
+from test.bim.bootstrap import NewFile
class TestImplementsTool(NewFile):
diff --git a/src/bonsai/test/tool/test_surveyor.py b/src/bonsai/test/tool/test_surveyor.py
index 0228cd9271..782b171a6d 100644
--- a/src/bonsai/test/tool/test_surveyor.py
+++ b/src/bonsai/test/tool/test_surveyor.py
@@ -17,16 +17,16 @@
# along with Bonsai. If not, see .
import bpy
-import numpy as np
import ifcopenshell
import ifcopenshell.api
import ifcopenshell.api.root
import ifcopenshell.api.unit
import ifcopenshell.util.geolocation
+import numpy as np
-import test.bim.bootstrap
import bonsai.core.tool
import bonsai.tool as tool
+import test.bim.bootstrap
from bonsai.tool import Surveyor as subject
diff --git a/src/bonsai/test/tool/test_system.py b/src/bonsai/test/tool/test_system.py
index ba20305140..3067ccfa09 100644
--- a/src/bonsai/test/tool/test_system.py
+++ b/src/bonsai/test/tool/test_system.py
@@ -16,19 +16,21 @@
# You should have received a copy of the GNU General Public License
# along with Bonsai. If not, see .
+from math import pi
+
import bpy
import ifcopenshell
import ifcopenshell.api
import ifcopenshell.api.root
import ifcopenshell.api.system
import ifcopenshell.util.unit
+import numpy as np
+from mathutils import Euler, Matrix, Vector
+
import bonsai.core.tool
import bonsai.tool as tool
-import numpy as np
-from test.bim.bootstrap import NewFile
from bonsai.tool.system import System as subject
-from mathutils import Euler, Vector, Matrix
-from math import pi
+from test.bim.bootstrap import NewFile
class TestImplementsTool(NewFile):
@@ -103,6 +105,7 @@ class TestCreateEmptyAtCursorWithElementOrientation(NewFile):
obj = subject.create_empty_at_cursor_with_element_orientation(element)
assert obj.matrix_world == bpy.context.scene.cursor.matrix
+
class TestCreatePortAtCursor(NewFile):
def test_run(self):
assert bpy.context.scene
diff --git a/src/bonsai/test/tool/test_type.py b/src/bonsai/test/tool/test_type.py
index 5bbf3c4c42..0d91b1f4f0 100644
--- a/src/bonsai/test/tool/test_type.py
+++ b/src/bonsai/test/tool/test_type.py
@@ -20,10 +20,11 @@ import bpy
import ifcopenshell
import ifcopenshell.api.root
import ifcopenshell.api.type
+
import bonsai.core.tool
import bonsai.tool as tool
-from test.bim.bootstrap import NewFile
from bonsai.tool.type import Type as subject
+from test.bim.bootstrap import NewFile
class TestImplementsTool(NewFile):
diff --git a/src/bonsai/test/tool/test_unit.py b/src/bonsai/test/tool/test_unit.py
index 190a8fa302..df3acc1b3e 100644
--- a/src/bonsai/test/tool/test_unit.py
+++ b/src/bonsai/test/tool/test_unit.py
@@ -21,10 +21,11 @@ import ifcopenshell
import ifcopenshell.api.project
import ifcopenshell.api.root
import ifcopenshell.api.unit
+
import bonsai.core.tool
import bonsai.tool as tool
-from test.bim.bootstrap import NewFile
from bonsai.tool.unit import Unit as subject
+from test.bim.bootstrap import NewFile
class TestImplementsTool(NewFile):
@@ -32,6 +33,17 @@ class TestImplementsTool(NewFile):
assert isinstance(subject(), bonsai.core.tool.Unit)
+class TestParseDistanceString(NewFile):
+ def test_run(self):
+ assert subject.parse_distance_string("5m") == (True, 5.0)
+ assert subject.parse_distance_string("30cm") == (True, 0.3)
+ assert subject.parse_distance_string("10ft") == (True, 3.048)
+ assert subject.parse_distance_string("12in") == (True, 0.3048)
+ assert subject.parse_distance_string("5'6\"") == (True, 1.6764)
+ assert subject.parse_distance_string("-5'6\"") == (True, -1.6764)
+ assert subject.parse_distance_string("invalid") == (False, 0.0)
+
+
class TestClearActiveUnit(NewFile):
def test_run(self):
props = tool.Unit.get_unit_props()
@@ -130,25 +142,43 @@ class TestGetSceneUnitName(NewFile):
assert subject.get_scene_unit_name("AREAUNIT") == "square foot"
assert subject.get_scene_unit_name("VOLUMEUNIT") == "cubic inch"
+ def test_getting_an_si_name(self):
+ props = tool.Blender.get_bim_props()
+ bpy.context.scene.unit_settings.system = "METRIC"
+ bpy.context.scene.unit_settings.length_unit = "METERS"
+ props.area_unit = "SQUARE_METRE"
+ props.volume_unit = "CUBIC_METRE"
+ assert subject.get_scene_unit_name("LENGTHUNIT") == "METRE"
+ assert subject.get_scene_unit_name("AREAUNIT") == "SQUARE_METRE"
+ assert subject.get_scene_unit_name("VOLUMEUNIT") == "CUBIC_METRE"
+ bpy.context.scene.unit_settings.length_unit = "MILLIMETERS"
+ assert subject.get_scene_unit_name("LENGTHUNIT") == "MILLI/METRE"
+ bpy.context.scene.unit_settings.length_unit = "ADAPTIVE"
+ assert subject.get_scene_unit_name("LENGTHUNIT") == "METRE"
+
def test_getting_a_name_with_no_unit_system(self):
assert bpy.context.scene
bpy.context.scene.unit_settings.system = "NONE"
- assert subject.get_scene_unit_name("LENGTHUNIT") == "foot"
+ assert subject.get_scene_unit_name("LENGTHUNIT") == "METRE"
+ bpy.context.scene.unit_settings.length_unit = "ADAPTIVE"
+ assert subject.get_scene_unit_name("LENGTHUNIT") == "METRE"
+ assert subject.get_scene_unit_name("AREAUNIT") == "SQUARE_METRE"
+ assert subject.get_scene_unit_name("VOLUMEUNIT") == "CUBIC_METRE"
def test_getting_mass_unit_names(self):
"""Test getting mass unit names for different systems"""
assert bpy.context.scene
props = tool.Blender.get_bim_props()
props.mass_unit = "GRAM"
- assert subject.get_scene_unit_name("MASSUNIT") == "gram"
- props.mass_unit = "KILOGRAM"
- assert subject.get_scene_unit_name("MASSUNIT") == "kilogram"
- props.mass_unit = "POUND"
+ assert subject.get_scene_unit_name("MASSUNIT") == "GRAM"
+ props.mass_unit = "KILO/GRAM"
+ assert subject.get_scene_unit_name("MASSUNIT") == "KILO/GRAM"
+ props.mass_unit = "MEGA/GRAM"
+ assert subject.get_scene_unit_name("MASSUNIT") == "MEGA/GRAM"
+ props.mass_unit = "pound"
assert subject.get_scene_unit_name("MASSUNIT") == "pound"
- props.mass_unit = "OUNCE"
+ props.mass_unit = "ounce"
assert subject.get_scene_unit_name("MASSUNIT") == "ounce"
- props.mass_unit = "TONNE"
- assert subject.get_scene_unit_name("MASSUNIT") == "tonne"
def test_getting_time_unit_names(self):
"""Test getting time unit names for different systems"""
@@ -156,64 +186,26 @@ class TestGetSceneUnitName(NewFile):
props = tool.Blender.get_bim_props()
props.time_unit = "SECOND"
- assert subject.get_scene_unit_name("TIMEUNIT") == "second"
- props.time_unit = "MINUTE"
+ assert subject.get_scene_unit_name("TIMEUNIT") == "SECOND"
+ props.time_unit = "minute"
assert subject.get_scene_unit_name("TIMEUNIT") == "minute"
- props.time_unit = "HOUR"
- assert subject.get_scene_unit_name("TIMEUNIT") == "hour"
- props.time_unit = "DAY"
- assert subject.get_scene_unit_name("TIMEUNIT") == "day"
+ props.time_unit = "NONE"
+ assert not subject.get_scene_unit_name("TIMEUNIT")
class TestGetSceneUnitSIPrefix:
def test_run(self):
assert bpy.context.scene
- bpy.context.scene.unit_settings.system = "METRIC"
- bpy.context.scene.unit_settings.length_unit = "METERS"
- assert subject.get_scene_unit_si_prefix("LENGTHUNIT") is None
- bpy.context.scene.unit_settings.length_unit = "MICROMETERS"
- assert subject.get_scene_unit_si_prefix("LENGTHUNIT") == "MICRO"
- bpy.context.scene.unit_settings.length_unit = "MILLIMETERS"
- assert subject.get_scene_unit_si_prefix("LENGTHUNIT") == "MILLI"
- bpy.context.scene.unit_settings.length_unit = "CENTIMETERS"
- assert subject.get_scene_unit_si_prefix("LENGTHUNIT") == "CENTI"
- bpy.context.scene.unit_settings.length_unit = "KILOMETERS"
- assert subject.get_scene_unit_si_prefix("LENGTHUNIT") == "KILO"
- bpy.context.scene.unit_settings.length_unit = "ADAPTIVE"
- assert subject.get_scene_unit_si_prefix("LENGTHUNIT") is None
- props = tool.Blender.get_bim_props()
- props.area_unit = "SQUARE_METRE"
- assert subject.get_scene_unit_si_prefix("AREAUNIT") is None
- props.area_unit = "MILLI/SQUARE_METRE"
- assert subject.get_scene_unit_si_prefix("AREAUNIT") == "MILLI"
- props.volume_unit = "CUBIC_METRE"
- assert subject.get_scene_unit_si_prefix("VOLUMEUNIT") is None
- props.volume_unit = "MILLI/CUBIC_METRE"
- assert subject.get_scene_unit_si_prefix("VOLUMEUNIT") == "MILLI"
+ assert subject.get_scene_unit_si_prefix("METRE") is None
+ assert subject.get_scene_unit_si_prefix("MICRO/METRE") == "MICRO"
+ assert subject.get_scene_unit_si_prefix("SQUARE_METRE") is None
+ assert subject.get_scene_unit_si_prefix("MILLI/SQUARE_METRE") == "MILLI"
+ assert subject.get_scene_unit_si_prefix("foot") is None
def test_mass_and_time_unit_prefixes(self):
- assert bpy.context.scene
- props = tool.Blender.get_bim_props()
-
- props.mass_unit = "KILOGRAM"
- assert subject.get_scene_unit_si_prefix("MASSUNIT") == "KILO"
- props.mass_unit = "GRAM"
- assert subject.get_scene_unit_si_prefix("MASSUNIT") is None
- props.mass_unit = "POUND"
- assert subject.get_scene_unit_si_prefix("MASSUNIT") == "CONVERSION"
- props.mass_unit = "OUNCE"
- assert subject.get_scene_unit_si_prefix("MASSUNIT") == "CONVERSION"
- props.mass_unit = "TONNE"
- assert subject.get_scene_unit_si_prefix("MASSUNIT") == "MEGA"
-
- props.time_unit = "SECOND"
- assert subject.get_scene_unit_si_prefix("TIMEUNIT") is None
- props.time_unit = "MINUTE"
- assert subject.get_scene_unit_si_prefix("TIMEUNIT") == "CONVERSION"
- props.time_unit = "HOUR"
- assert subject.get_scene_unit_si_prefix("TIMEUNIT") == "CONVERSION"
- props.time_unit = "DAY"
- assert subject.get_scene_unit_si_prefix("TIMEUNIT") == "CONVERSION"
+ assert subject.get_scene_unit_si_prefix("KILO/GRAM") == "KILO"
+ assert subject.get_scene_unit_si_prefix("MEGA/GRAM") == "MEGA"
+ assert subject.get_scene_unit_si_prefix("GRAM") is None
class TestImportUnitAttributes(NewFile):
diff --git a/src/bsdd/bsdd.py b/src/bsdd/bsdd.py
index ff633095bf..fbc14cc393 100644
--- a/src/bsdd/bsdd.py
+++ b/src/bsdd/bsdd.py
@@ -984,7 +984,6 @@ class Client:
def apply_ifc_classification_properties(
ifc_file: ifcopenshell.file, element: ifcopenshell.entity_instance, classificationProperties: dict[str, Any]
) -> None:
- import ifcopenshell.api
import ifcopenshell.api.pset
import ifcopenshell.util.element
diff --git a/src/bsdd/pyproject.toml b/src/bsdd/pyproject.toml
index d64d667a20..17fa72f37a 100644
--- a/src/bsdd/pyproject.toml
+++ b/src/bsdd/pyproject.toml
@@ -43,3 +43,9 @@ Issues = "https://github.com/IfcOpenShell/IfcOpenShell/issues"
[tool.setuptools]
py-modules = ["bsdd","bsdd_json","type_hints"]
+
+[tool.ruff]
+extend = "../../pyproject.toml"
+lint.select = [
+ "F401", # unused imports
+]
diff --git a/src/examples/CMakeLists.txt b/src/examples/CMakeLists.txt
index 3a5c0187b5..79a2399821 100644
--- a/src/examples/CMakeLists.txt
+++ b/src/examples/CMakeLists.txt
@@ -35,51 +35,41 @@ else()
include_directories("${CMAKE_SOURCE_DIR}/../src")
endif()
-if(SCHEMA_VERSIONS MATCHES "2x3")
- add_executable(IfcParseExamples IfcParseExamples.cpp)
+macro(build_example exe_name)
+ set (additional_targets ${ARGN})
+ add_executable(${exe_name} ${exe_name}.cpp)
if(STANDALONE_PROJECT)
- target_link_libraries(IfcParseExamples IfcOpenShell::IfcParse)
+ target_link_libraries(${exe_name} IfcOpenShell::IfcParse $<$:IfcOpenShell::${additional_targets}>)
else()
- target_include_directories(IfcParseExamples PRIVATE "${CMAKE_SOURCE_DIR}/../src")
- target_link_libraries(IfcParseExamples IfcParse)
- set_target_properties(IfcParseExamples PROPERTIES FOLDER Examples)
+ target_include_directories(${exe_name} PRIVATE "${CMAKE_SOURCE_DIR}/../src")
+ target_link_libraries(${exe_name} IfcParse ${additional_targets})
+ set_target_properties(${exe_name} PROPERTIES FOLDER Examples)
endif()
- install(TARGETS IfcParseExamples)
+ install(TARGETS ${exe_name})
+endmacro()
+
+if("4" IN_LIST SCHEMA_VERSIONS)
+ build_example(arbitrary_open_profile_def)
+ build_example(triangulated_faceset)
+endif()
+
+if("2x3" IN_LIST SCHEMA_VERSIONS)
+ build_example(composite_profile_def)
+ build_example(csg_primitive)
+ build_example(ellipse_pies)
+ build_example(faces)
+ build_example(ifc_curve_rebar)
+ build_example(profiles)
+ build_example(IfcParseExamples)
if(WITH_OPENCASCADE)
- add_executable(IfcOpenHouse IfcOpenHouse.cpp)
- add_executable(IfcAdvancedHouse IfcAdvancedHouse.cpp)
- add_library(IfcHouseInterface INTERFACE)
-
- if(STANDALONE_PROJECT)
- target_link_libraries(IfcHouseInterface INTERFACE IfcOpenShell::IfcParse IfcOpenShell::geometry_serializer)
- else()
- target_link_libraries(IfcHouseInterface INTERFACE IfcParse geometry_serializer)
- set_target_properties(IfcOpenHouse PROPERTIES FOLDER Examples)
- set_target_properties(IfcAdvancedHouse PROPERTIES FOLDER Examples)
- endif()
- target_link_libraries(IfcOpenHouse PRIVATE IfcHouseInterface)
- target_link_libraries(IfcAdvancedHouse PRIVATE IfcHouseInterface)
- install(TARGETS IfcOpenHouse IfcAdvancedHouse)
+ build_example(IfcOpenHouse geometry_serializer)
+ build_example(IfcAdvancedHouse geometry_serializer)
endif()
endif()
-if(SCHEMA_VERSIONS MATCHES "4x3_add2")
- add_executable(IfcAlignment IfcAlignment.cpp)
- add_executable(IfcSimplifiedAlignment IfcSimplifiedAlignment.cpp)
- add_library(IfcAlignmentInterface INTERFACE)
-
- if(STANDALONE_PROJECT)
- target_link_libraries(IfcAlignmentInterface INTERFACE IfcOpenShell::IfcParse)
- else()
- target_link_libraries(IfcAlignmentInterface INTERFACE IfcParse)
- set_target_properties(IfcAlignment PROPERTIES FOLDER Examples)
- set_target_properties(IfcSimplifiedAlignment PROPERTIES FOLDER Examples)
- endif()
-
- target_link_libraries(IfcAlignment PRIVATE IfcAlignmentInterface)
- target_link_libraries(IfcSimplifiedAlignment PRIVATE IfcAlignmentInterface)
-
- install(TARGETS IfcAlignment IfcSimplifiedAlignment)
+if("4x3_add2" IN_LIST SCHEMA_VERSIONS)
+ build_example(IfcAlignment)
+ build_example(IfcSimplifiedAlignment)
endif()
diff --git a/src/examples/IfcAlignment.cpp b/src/examples/IfcAlignment.cpp
index d4e3ed0348..491aef1e79 100644
--- a/src/examples/IfcAlignment.cpp
+++ b/src/examples/IfcAlignment.cpp
@@ -489,6 +489,6 @@ int main() {
}
// That's it - save the model to a file
- std::ofstream ofs("FHWA_Bridge_Geometry_Alignment_Example.ifc");
+ std::ofstream ofs("IfcAlignment.ifc");
ofs << file;
}
diff --git a/src/examples/IfcSimplifiedAlignment.cpp b/src/examples/IfcSimplifiedAlignment.cpp
index bde0e59b61..1c88de4c29 100644
--- a/src/examples/IfcSimplifiedAlignment.cpp
+++ b/src/examples/IfcSimplifiedAlignment.cpp
@@ -159,6 +159,6 @@ int main() {
}
// That's it - save the model to a file
- std::ofstream ofs("FHWA_Bridge_Geometry_Alignment_Example_Simplified.ifc");
+ std::ofstream ofs("IfcSimplifiedAlignment.ifc");
ofs << file;
}
diff --git a/src/examples/arbitrary_open_profile_def.cpp b/src/examples/arbitrary_open_profile_def.cpp
index 45495736d5..1346c56a5d 100644
--- a/src/examples/arbitrary_open_profile_def.cpp
+++ b/src/examples/arbitrary_open_profile_def.cpp
@@ -28,16 +28,16 @@
#include
#include
-#include "../ifcparse/Ifc2x3.h"
-#include "../ifcparse/IfcUtil.h"
-#include "../ifcparse/IfcHierarchyHelper.h"
+#define IfcSchema Ifc4
+#include "ifcparse/Ifc4.h"
+#include "ifcparse/IfcHierarchyHelper.h"
typedef std::string S;
typedef IfcParse::IfcGlobalId guid;
boost::none_t const null = boost::none;
static int i = 0;
-void create_product_from_item(IfcHierarchyHelper& file, IfcSchema::IfcRepresentationItem* item, const std::string& s) {
+void create_product_from_item(IfcHierarchyHelper& file, IfcSchema::IfcRepresentationItem* item, const std::string& s) {
IfcSchema::IfcBuildingElementProxy* product = new IfcSchema::IfcBuildingElementProxy(
guid(), 0, S("product"), null, null, 0, 0, null, null);
file.addBuildingProduct(product);
@@ -50,7 +50,7 @@ void create_product_from_item(IfcHierarchyHelper& file, IfcSchema::IfcRepresenta
items->push(item);
if (s == "GeometricSet") {
- IfcSchema::IfcGeometricSet* set = new IfcSchema::IfcGeometricSet(items->generalize());
+ IfcSchema::IfcGeometricSet* set = new IfcSchema::IfcGeometricSet(items->as());
file.addEntity(set);
items = IfcSchema::IfcRepresentationItem::list::ptr(new IfcSchema::IfcRepresentationItem::list());
items->push(set);
@@ -67,7 +67,7 @@ void create_product_from_item(IfcHierarchyHelper& file, IfcSchema::IfcRepresenta
product->setRepresentation(shape);
}
-void create_surfaces_from_profile(IfcHierarchyHelper& file, IfcSchema::IfcProfileDef* profile) {
+void create_surfaces_from_profile(IfcHierarchyHelper& file, IfcSchema::IfcProfileDef* profile) {
IfcSchema::IfcSurfaceOfLinearExtrusion* extrusion = new IfcSchema::IfcSurfaceOfLinearExtrusion(profile, file.addPlacement3d(), file.addTriplet(0, 0, 1), 100.);
file.addEntity(extrusion);
@@ -80,7 +80,7 @@ void create_surfaces_from_profile(IfcHierarchyHelper& file, IfcSchema::IfcProfil
create_product_from_item(file, revolution, "GeometricSet");
}
-void create_solids_from_profile(IfcHierarchyHelper& file, IfcSchema::IfcProfileDef* profile) {
+void create_solids_from_profile(IfcHierarchyHelper& file, IfcSchema::IfcProfileDef* profile) {
IfcSchema::IfcExtrudedAreaSolid* extrusion = new IfcSchema::IfcExtrudedAreaSolid(profile, file.addPlacement3d(), file.addTriplet(0, 0, 1), 100.);
file.addEntity(extrusion);
@@ -96,7 +96,7 @@ void create_solids_from_profile(IfcHierarchyHelper& file, IfcSchema::IfcProfileD
create_product_from_item(file, revolution2, "SweptSolid");
}
-void create_products_from_curve(IfcHierarchyHelper& file, IfcSchema::IfcBoundedCurve* curve) {
+void create_products_from_curve(IfcHierarchyHelper& file, IfcSchema::IfcBoundedCurve* curve) {
IfcSchema::IfcArbitraryOpenProfileDef* open = new IfcSchema::IfcArbitraryOpenProfileDef(IfcSchema::IfcProfileTypeEnum::IfcProfileType_CURVE, null, curve);
IfcSchema::IfcCenterLineProfileDef* center_line = new IfcSchema::IfcCenterLineProfileDef(IfcSchema::IfcProfileTypeEnum::IfcProfileType_AREA, null, curve, 10.);
file.addEntity(open);
@@ -107,9 +107,9 @@ void create_products_from_curve(IfcHierarchyHelper& file, IfcSchema::IfcBoundedC
}
int main(int argc, char** argv) {
- const char filename[] = "IfcArbitraryOpenProfileDef.ifc";
- IfcHierarchyHelper file;
- file.header().file_name().name(filename);
+ const char filename[] = "arbitrary_open_profile_def.ifc";
+ IfcHierarchyHelper file;
+ file.header().file_name()->setname(filename);
double coords1[] = {-50.0, 0.0};
double coords2[] = { 50.0, 0.0};
@@ -124,17 +124,18 @@ int main(int argc, char** argv) {
IfcSchema::IfcEllipse* ellipse = new IfcSchema::IfcEllipse(file.addPlacement2d(), 50., 25.);
file.addEntity(ellipse);
- IfcEntityList::ptr trim1(new IfcEntityList);
- IfcEntityList::ptr trim2(new IfcEntityList);
+ aggregate_of_instance::ptr trim1(new aggregate_of_instance);
+ aggregate_of_instance::ptr trim2(new aggregate_of_instance);
trim1->push(new IfcSchema::IfcParameterValue( 0.));
trim2->push(new IfcSchema::IfcParameterValue(180.));
- IfcSchema::IfcTrimmedCurve* trim = new IfcSchema::IfcTrimmedCurve(ellipse, trim1, trim2, true, IfcSchema::IfcTrimmingPreference::IfcTrimmingPreference_PARAMETER);
+ IfcSchema::IfcTrimmedCurve* trim = new IfcSchema::IfcTrimmedCurve(ellipse, trim1->as(), trim2->as(), true, IfcSchema::IfcTrimmingPreference::IfcTrimmingPreference_PARAMETER);
file.addEntity(trim);
create_products_from_curve(file, trim);
- file.getSingle()->setName("IfcArbitraryOpenProfileDef");
+ using namespace std::string_literals;
+ file.getSingle()->setName("arbitrary_open_profile_def"s);
std::ofstream f(filename);
f << file;
-}
+}
\ No newline at end of file
diff --git a/src/examples/composite_profile_def.cpp b/src/examples/composite_profile_def.cpp
index 5ff41a3b13..2b5f082f55 100644
--- a/src/examples/composite_profile_def.cpp
+++ b/src/examples/composite_profile_def.cpp
@@ -27,18 +27,18 @@
#include
#include
-#include "../ifcparse/Ifc2x3.h"
-#include "../ifcparse/IfcUtil.h"
-#include "../ifcparse/IfcHierarchyHelper.h"
+#define IfcSchema Ifc2x3
+#include "ifcparse/Ifc2x3.h"
+#include "ifcparse/IfcHierarchyHelper.h"
typedef std::string S;
typedef IfcParse::IfcGlobalId guid;
boost::none_t const null = boost::none;
int main(int argc, char** argv) {
- const char filename[] = "IfcCompositeProfileDef.ifc";
- IfcHierarchyHelper file;
- file.header().file_name().name(filename);
+ const char filename[] = "composite_profile_def.ifc";
+ IfcHierarchyHelper file;
+ file.header().file_name()->setname(filename);
double coords1[] = {100.0, 0.0};
double coords2[] = {200.0, 0.0};
@@ -112,7 +112,8 @@ int main(int argc, char** argv) {
product->setRepresentation(shape);
- file.getSingle()->setName("IfcCompositeProfileDef");
+ using namespace std::string_literals;
+ file.getSingle()->setName("composite_profile_def"s);
std::ofstream f(filename);
f << file;
diff --git a/src/examples/csg_primitive.cpp b/src/examples/csg_primitive.cpp
index 190236ed6b..4d805a3375 100644
--- a/src/examples/csg_primitive.cpp
+++ b/src/examples/csg_primitive.cpp
@@ -27,9 +27,9 @@
#include
#include
-#include "../ifcparse/Ifc2x3.h"
-#include "../ifcparse/IfcUtil.h"
-#include "../ifcparse/IfcHierarchyHelper.h"
+#define IfcSchema Ifc2x3
+#include "ifcparse/Ifc2x3.h"
+#include "ifcparse/IfcHierarchyHelper.h"
typedef std::string S;
typedef IfcParse::IfcGlobalId guid;
@@ -101,7 +101,7 @@ public:
return operate(OP_INTERSECT, p);
}
- IfcSchema::IfcRepresentationItem* serialize(IfcHierarchyHelper& file) const {
+ IfcSchema::IfcRepresentationItem* serialize(IfcHierarchyHelper& file) const {
IfcSchema::IfcRepresentationItem* my;
if (op == OP_TERMINAL) {
IfcSchema::IfcAxis2Placement3D* place = file.addPlacement3d(x,y,z,zx,zy,zz,xx,xy,xz);
@@ -117,7 +117,7 @@ public:
my = new IfcSchema::IfcRightCircularCone(place, b, a);
}
} else {
- IfcSchema::IfcBooleanOperator::IfcBooleanOperator o;
+ IfcSchema::IfcBooleanOperator o = IfcSchema::IfcBooleanOperator::IfcBooleanOperator_UNION;
if (op == OP_ADD) {
o = IfcSchema::IfcBooleanOperator::IfcBooleanOperator_UNION;
} else if (op == OP_SUBTRACT) {
@@ -125,7 +125,7 @@ public:
} else if (op == OP_INTERSECT) {
o = IfcSchema::IfcBooleanOperator::IfcBooleanOperator_INTERSECTION;
}
- my = new IfcSchema::IfcBooleanResult(o, left->serialize(file), right->serialize(file));
+ my = new IfcSchema::IfcBooleanResult(o, left->serialize(file)->as(), right->serialize(file)->as());
}
file.addEntity(my);
return my;
@@ -133,9 +133,9 @@ public:
};
int main(int argc, char** argv) {
- const char filename[] = "IfcCsgPrimitive.ifc";
- IfcHierarchyHelper file;
- file.header().file_name().name(filename);
+ const char filename[] = "csg_primitive.ifc";
+ IfcHierarchyHelper file;
+ file.header().file_name()->setname(filename);
IfcSchema::IfcRepresentationItem* csg1 = Node::Box(8000.,6000.,3000.).subtract(
Node::Box(7600.,5600.,2800.).move(200.,200.,200.)
@@ -186,7 +186,8 @@ int main(int argc, char** argv) {
product->setRepresentation(shape);
- file.getSingle()->setName("IfcCompositeProfileDef");
+ using namespace std::string_literals;
+ file.getSingle()->setName("csg_primitive"s);
std::ofstream f(filename);
f << file;
diff --git a/src/examples/ellipse_pies.cpp b/src/examples/ellipse_pies.cpp
index 9994ca820d..8128c4377c 100644
--- a/src/examples/ellipse_pies.cpp
+++ b/src/examples/ellipse_pies.cpp
@@ -27,9 +27,9 @@
#include
#include
-#include "../ifcparse/Ifc2x3.h"
-#include "../ifcparse/IfcUtil.h"
-#include "../ifcparse/IfcHierarchyHelper.h"
+#define IfcSchema Ifc2x3
+#include "ifcparse/Ifc2x3.h"
+#include "ifcparse/IfcHierarchyHelper.h"
typedef std::string S;
typedef IfcParse::IfcGlobalId guid;
@@ -44,7 +44,7 @@ typedef struct {
static int i = 0;
-void create_testcase_for(IfcHierarchyHelper& file, const EllipsePie& pie, Ifc2x3::IfcTrimmingPreference::IfcTrimmingPreference pref) {
+void create_testcase_for(IfcHierarchyHelper& file, const EllipsePie& pie, IfcSchema::IfcTrimmingPreference pref) {
const double deg = 1. / 180. * 3.141592653;
double flt1[] = {0. , 0. };
double flt2[] = {pie.r1 * cos(pie.t1*deg), pie.r2 * sin(pie.t1*deg)};
@@ -67,16 +67,16 @@ void create_testcase_for(IfcHierarchyHelper& file, const EllipsePie& pie, Ifc2x3
Ifc2x3::IfcEllipse* ellipse = new Ifc2x3::IfcEllipse(file.addPlacement2d(), pie.r1, pie.r2);
file.addEntity(ellipse);
- IfcEntityList::ptr trim1(new IfcEntityList);
- IfcEntityList::ptr trim2(new IfcEntityList);
- if (pref == Ifc2x3::IfcTrimmingPreference::IfcTrimmingPreference_PARAMETER) {
+ aggregate_of_instance::ptr trim1(new aggregate_of_instance);
+ aggregate_of_instance::ptr trim2(new aggregate_of_instance);
+ if (pref == IfcSchema::IfcTrimmingPreference::IfcTrimmingPreference_PARAMETER) {
trim1->push(new Ifc2x3::IfcParameterValue(pie.t1));
trim2->push(new Ifc2x3::IfcParameterValue(pie.t2));
} else {
trim1->push(p2);
trim2->push(p3);
}
- Ifc2x3::IfcTrimmedCurve* trim = new Ifc2x3::IfcTrimmedCurve(ellipse, trim1, trim2, true, pref);
+ Ifc2x3::IfcTrimmedCurve* trim = new Ifc2x3::IfcTrimmedCurve(ellipse, trim1->as(), trim2->as(), true, pref);
file.addEntity(trim);
Ifc2x3::IfcCompositeCurveSegment::list::ptr segments(new Ifc2x3::IfcCompositeCurveSegment::list());
@@ -124,25 +124,25 @@ void create_testcase_for(IfcHierarchyHelper& file, const EllipsePie& pie, Ifc2x3
int main(int argc, char** argv) {
const std::string filename = "ellipse_pies.ifc";
- IfcHierarchyHelper file;
+ IfcHierarchyHelper file;
{ EllipsePie pie = {80., 50., 0., 150.};
- create_testcase_for(file, pie, Ifc2x3::IfcTrimmingPreference::IfcTrimmingPreference_PARAMETER);
- create_testcase_for(file, pie, Ifc2x3::IfcTrimmingPreference::IfcTrimmingPreference_CARTESIAN);}
+ create_testcase_for(file, pie, IfcSchema::IfcTrimmingPreference::IfcTrimmingPreference_PARAMETER);
+ create_testcase_for(file, pie, IfcSchema::IfcTrimmingPreference::IfcTrimmingPreference_CARTESIAN);}
{ EllipsePie pie = {80, 50., 30., 300.};
- create_testcase_for(file, pie, Ifc2x3::IfcTrimmingPreference::IfcTrimmingPreference_PARAMETER);
- create_testcase_for(file, pie, Ifc2x3::IfcTrimmingPreference::IfcTrimmingPreference_CARTESIAN);}
+ create_testcase_for(file, pie, IfcSchema::IfcTrimmingPreference::IfcTrimmingPreference_PARAMETER);
+ create_testcase_for(file, pie, IfcSchema::IfcTrimmingPreference::IfcTrimmingPreference_CARTESIAN);}
{ EllipsePie pie = {80, 50., 300., 30.};
- create_testcase_for(file, pie, Ifc2x3::IfcTrimmingPreference::IfcTrimmingPreference_PARAMETER);
- create_testcase_for(file, pie, Ifc2x3::IfcTrimmingPreference::IfcTrimmingPreference_CARTESIAN);}
+ create_testcase_for(file, pie, IfcSchema::IfcTrimmingPreference::IfcTrimmingPreference_PARAMETER);
+ create_testcase_for(file, pie, IfcSchema::IfcTrimmingPreference::IfcTrimmingPreference_CARTESIAN);}
{ EllipsePie pie = {50., 80., 0., 150.};
- create_testcase_for(file, pie, Ifc2x3::IfcTrimmingPreference::IfcTrimmingPreference_PARAMETER);
- create_testcase_for(file, pie, Ifc2x3::IfcTrimmingPreference::IfcTrimmingPreference_CARTESIAN);}
+ create_testcase_for(file, pie, IfcSchema::IfcTrimmingPreference::IfcTrimmingPreference_PARAMETER);
+ create_testcase_for(file, pie, IfcSchema::IfcTrimmingPreference::IfcTrimmingPreference_CARTESIAN);}
{ EllipsePie pie = {50, 80., 30., 300.};
- create_testcase_for(file, pie, Ifc2x3::IfcTrimmingPreference::IfcTrimmingPreference_PARAMETER);
- create_testcase_for(file, pie, Ifc2x3::IfcTrimmingPreference::IfcTrimmingPreference_CARTESIAN);}
+ create_testcase_for(file, pie, IfcSchema::IfcTrimmingPreference::IfcTrimmingPreference_PARAMETER);
+ create_testcase_for(file, pie, IfcSchema::IfcTrimmingPreference::IfcTrimmingPreference_CARTESIAN);}
{ EllipsePie pie = {50, 80., 300., 30.};
- create_testcase_for(file, pie, Ifc2x3::IfcTrimmingPreference::IfcTrimmingPreference_PARAMETER);
- create_testcase_for(file, pie, Ifc2x3::IfcTrimmingPreference::IfcTrimmingPreference_CARTESIAN);}
+ create_testcase_for(file, pie, IfcSchema::IfcTrimmingPreference::IfcTrimmingPreference_PARAMETER);
+ create_testcase_for(file, pie, IfcSchema::IfcTrimmingPreference::IfcTrimmingPreference_CARTESIAN);}
std::ofstream f(filename.c_str());
f << file;
}
diff --git a/src/examples/faces.cpp b/src/examples/faces.cpp
index 985b23dd8e..f7e3858c58 100644
--- a/src/examples/faces.cpp
+++ b/src/examples/faces.cpp
@@ -22,18 +22,19 @@
* Example that generates various forms of IfcFace *
* *
********************************************************************************/
+#include
-#include "../ifcparse/Ifc2x3.h"
-#include "../ifcparse/IfcUtil.h"
-#include "../ifcparse/IfcHierarchyHelper.h"
+#define IfcSchema Ifc2x3
+#include "ifcparse/Ifc2x3.h"
+#include "ifcparse/IfcHierarchyHelper.h"
typedef std::string S;
typedef IfcParse::IfcGlobalId guid;
-boost::none_t const null = (static_cast(0));
+boost::none_t const null = boost::none;
static int x = 0;
-void create_testcase(IfcHierarchyHelper& file, IfcSchema::IfcFace* face, const std::string& name) {
+void create_testcase(IfcHierarchyHelper& file, IfcSchema::IfcFace* face, const std::string& name) {
IfcSchema::IfcFace::list::ptr faces(new IfcSchema::IfcFace::list);
faces->push(face);
IfcSchema::IfcOpenShell* shell = new IfcSchema::IfcOpenShell(faces);
@@ -57,14 +58,14 @@ void create_testcase(IfcHierarchyHelper& file, IfcSchema::IfcFace* face, const s
file.getRepresentationContext("Model"), S("Body"), S("SurfaceModel"), items);
reps->push(rep);
- IfcSchema::IfcProductDefinitionShape* shape = new IfcSchema::IfcProductDefinitionShape(0, 0, reps);
+ IfcSchema::IfcProductDefinitionShape* shape = new IfcSchema::IfcProductDefinitionShape(boost::none, boost::none, reps);
file.addEntity(shape);
product->setRepresentation(shape);
}
int main(int argc, char** argv) {
- IfcHierarchyHelper file;
+ IfcHierarchyHelper file;
{
IfcSchema::IfcCartesianPoint::list::ptr points (new IfcSchema::IfcCartesianPoint::list);
points->push(file.addTriplet(-400, -400, 0));
@@ -192,7 +193,7 @@ int main(int argc, char** argv) {
IfcSchema::IfcCartesianPoint::list::ptr trim2(new IfcSchema::IfcCartesianPoint::list);
trim1->push(point1);
trim2->push(point2);
- IfcSchema::IfcTrimmedCurve* trimmed_curve = new IfcSchema::IfcTrimmedCurve(circle, trim1->generalize(), trim2->generalize(), true, IfcSchema::IfcTrimmingPreference::IfcTrimmingPreference_CARTESIAN);
+ IfcSchema::IfcTrimmedCurve* trimmed_curve = new IfcSchema::IfcTrimmedCurve(circle, trim1->generalize()->as(), trim2->generalize()->as(), true, IfcSchema::IfcTrimmingPreference::IfcTrimmingPreference_CARTESIAN);
IfcSchema::IfcArbitraryOpenProfileDef* profile = new IfcSchema::IfcArbitraryOpenProfileDef(IfcSchema::IfcProfileTypeEnum::IfcProfileType_CURVE, boost::none, trimmed_curve);
IfcSchema::IfcAxis1Placement* place = new IfcSchema::IfcAxis1Placement(file.addTriplet(0., 0., 0.), file.addTriplet(1., 0., 0.));
IfcSchema::IfcSurfaceOfRevolution* surface = new IfcSchema::IfcSurfaceOfRevolution(profile, file.addPlacement3d(), place);
@@ -200,8 +201,8 @@ int main(int argc, char** argv) {
IfcSchema::IfcFace* face = new IfcSchema::IfcFaceSurface(bounds, surface, true);
create_testcase(file, face, "face surface");
}
- const std::string filename = "faces.ifc";
- file.header().file_name().name(filename);
- std::ofstream f(filename.c_str());
+ const char filename[] = "faces.ifc";
+ file.header().file_name()->setname(filename);
+ std::ofstream f(filename);
f << file;
}
\ No newline at end of file
diff --git a/src/examples/ifc_curve_rebar.cpp b/src/examples/ifc_curve_rebar.cpp
index 2ba269e015..81a705dc5e 100644
--- a/src/examples/ifc_curve_rebar.cpp
+++ b/src/examples/ifc_curve_rebar.cpp
@@ -27,16 +27,15 @@
#include
#include
-#include "ifcparse\Ifc2x3.h"
-#include "ifcparse\IfcUtil.h"
-#include "ifcparse\IfcHierarchyHelper.h"
-#include "ifcgeom\IfcGeom.h"
+#define IfcSchema Ifc2x3
+#include "ifcparse/Ifc2x3.h"
+#include "ifcparse/IfcHierarchyHelper.h"
typedef std::string S;
typedef IfcParse::IfcGlobalId guid;
boost::none_t const null = boost::none;
-void create_curve_rebar(IfcHierarchyHelper& file)
+void create_curve_rebar(IfcHierarchyHelper& file)
{
int dia = 24;
int R = 3 * dia;
@@ -83,14 +82,15 @@ void create_curve_rebar(IfcHierarchyHelper& file)
IfcSchema::IfcCircle* circle = new IfcSchema::IfcCircle(axis1, R);
file.addEntity(circle);
- IfcEntityList::ptr trim1(new IfcEntityList);
- IfcEntityList::ptr trim2(new IfcEntityList);
-
+ IfcSchema::IfcTrimmingSelect::list::ptr trim1(new IfcSchema::IfcTrimmingSelect::list);
+ IfcSchema::IfcTrimmingSelect::list::ptr trim2(new IfcSchema::IfcTrimmingSelect::list);
+
trim1->push(new IfcSchema::IfcParameterValue(180));
trim1->push(p2);
trim2->push(new IfcSchema::IfcParameterValue(270));
trim2->push(p4);
+
IfcSchema::IfcTrimmedCurve* trimmed_curve = new IfcSchema::IfcTrimmedCurve(circle, trim1, trim2, false, IfcSchema::IfcTrimmingPreference::IfcTrimmingPreference_PARAMETER);
file.addEntity(trimmed_curve);
@@ -133,8 +133,8 @@ void create_curve_rebar(IfcHierarchyHelper& file)
int main()
{
- IfcHierarchyHelper file;
- file.header().file_name().name("ifc_curve_rebar.ifc");
+ IfcHierarchyHelper file;
+ file.header().file_name()->setname("ifc_curve_rebar.ifc");
create_curve_rebar(file);
std::ofstream f("ifc_curve_rebar.ifc");
f << file;
diff --git a/src/examples/profiles.cpp b/src/examples/profiles.cpp
index d171745dc7..78cc67f13f 100644
--- a/src/examples/profiles.cpp
+++ b/src/examples/profiles.cpp
@@ -27,21 +27,21 @@
#include
#include
-#include "../ifcparse/Ifc2x3.h"
-#include "../ifcparse/IfcUtil.h"
-#include "../ifcparse/IfcHierarchyHelper.h"
+#define IfcSchema Ifc2x3
+#include "ifcparse/Ifc2x3.h"
+#include "ifcparse/IfcHierarchyHelper.h"
typedef std::string S;
-typedef IfcWrite::IfcGuidHelper guid;
-boost::none_t const null = (static_cast(0));
+typedef IfcParse::IfcGlobalId guid;
+boost::none_t const null = boost::none;
void create_testcase_for(IfcSchema::IfcProfileDef::list::ptr profiles) {
IfcSchema::IfcProfileDef* profile = *profiles->begin();
- const std::string profile_type = IfcSchema::Type::ToString(profile->type());
+ const std::string& profile_type = profile->declaration().name();
const std::string filename = profile_type + ".ifc";
- IfcHierarchyHelper file;
- file.filename(filename);
+ IfcHierarchyHelper file;
+ file.header().file_name()->setname(filename);
int i = 0;
for (IfcSchema::IfcProfileDef::list::it it = profiles->begin(); it != profiles->end(); ++it, ++i) {
@@ -54,7 +54,7 @@ void create_testcase_for(IfcSchema::IfcProfileDef::list::ptr profiles) {
product->setObjectPlacement(file.addLocalPlacement(0, 100. * i));
- if (profile->is(IfcSchema::Type::IfcParameterizedProfileDef)) {
+ if (profile->declaration().is(IfcSchema::IfcParameterizedProfileDef::Class())) {
((IfcSchema::IfcParameterizedProfileDef*) profile)->setPosition(file.addPlacement2d());
}
@@ -72,7 +72,7 @@ void create_testcase_for(IfcSchema::IfcProfileDef::list::ptr profiles) {
file.getSingle(), S("Body"), S("SweptSolid"), items);
reps->push(rep);
- IfcSchema::IfcProductDefinitionShape* shape = new IfcSchema::IfcProductDefinitionShape(0, 0, reps);
+ IfcSchema::IfcProductDefinitionShape* shape = new IfcSchema::IfcProductDefinitionShape(null, null, reps);
file.addEntity(rep);
file.addEntity(shape);
@@ -84,122 +84,123 @@ void create_testcase_for(IfcSchema::IfcProfileDef::list::ptr profiles) {
}
int main(int argc, char** argv) {
+ IfcSchema::get_schema(); // Ensure schema is initialized
{ IfcSchema::IfcProfileDef::list::ptr profiles (new IfcSchema::IfcProfileDef::list);
- profiles->push(new Ifc2x3::IfcUShapeProfileDef(
+ profiles->push(new IfcSchema::IfcUShapeProfileDef(
IfcSchema::IfcProfileTypeEnum::IfcProfileType_AREA,
null, 0, 50.0, 25.0, 5.0, 5.0, null, null, null, null));
- profiles->push(new Ifc2x3::IfcUShapeProfileDef(
+ profiles->push(new IfcSchema::IfcUShapeProfileDef(
IfcSchema::IfcProfileTypeEnum::IfcProfileType_AREA,
null, 0, 50.0, 25.0, 5.0, 5.0, 2.0, 2.0, null, null));
- profiles->push(new Ifc2x3::IfcUShapeProfileDef(
+ profiles->push(new IfcSchema::IfcUShapeProfileDef(
IfcSchema::IfcProfileTypeEnum::IfcProfileType_AREA,
null, 0, 50.0, 25.0, 5.0, 5.0, null, null, 4.0, null));
- profiles->push(new Ifc2x3::IfcUShapeProfileDef(
+ profiles->push(new IfcSchema::IfcUShapeProfileDef(
IfcSchema::IfcProfileTypeEnum::IfcProfileType_AREA,
null, 0, 50.0, 25.0, 5.0, 5.0, 1.0, 3.0, 6.0, null));
create_testcase_for(profiles); }
{ IfcSchema::IfcProfileDef::list::ptr profiles (new IfcSchema::IfcProfileDef::list);
- profiles->push(new Ifc2x3::IfcTShapeProfileDef(
+ profiles->push(new IfcSchema::IfcTShapeProfileDef(
IfcSchema::IfcProfileTypeEnum::IfcProfileType_AREA,
null, 0, 50.0, 25.0, 5.0, 5.0, null, null, null, null, null, null));
- profiles->push(new Ifc2x3::IfcTShapeProfileDef(
+ profiles->push(new IfcSchema::IfcTShapeProfileDef(
IfcSchema::IfcProfileTypeEnum::IfcProfileType_AREA,
null, 0, 50.0, 25.0, 5.0, 5.0, 2.0, 2.0, 2.0, null, null, null));
- profiles->push(new Ifc2x3::IfcTShapeProfileDef(
+ profiles->push(new IfcSchema::IfcTShapeProfileDef(
IfcSchema::IfcProfileTypeEnum::IfcProfileType_AREA,
null, 0, 50.0, 25.0, 5.0, 5.0, null, null, null, 2.0, 2.0, null));
- profiles->push(new Ifc2x3::IfcTShapeProfileDef(
+ profiles->push(new IfcSchema::IfcTShapeProfileDef(
IfcSchema::IfcProfileTypeEnum::IfcProfileType_AREA,
null, 0, 50.0, 25.0, 5.0, 5.0, 3.0, 2.0, 1.0, 2.0, 2.0, null));
create_testcase_for(profiles); }
{ IfcSchema::IfcProfileDef::list::ptr profiles (new IfcSchema::IfcProfileDef::list);
- profiles->push(new Ifc2x3::IfcZShapeProfileDef(
+ profiles->push(new IfcSchema::IfcZShapeProfileDef(
IfcSchema::IfcProfileTypeEnum::IfcProfileType_AREA,
null, 0, 50.0, 25.0, 5.0, 5.0, null, null));
- profiles->push(new Ifc2x3::IfcZShapeProfileDef(
+ profiles->push(new IfcSchema::IfcZShapeProfileDef(
IfcSchema::IfcProfileTypeEnum::IfcProfileType_AREA,
null, 0, 50.0, 25.0, 5.0, 5.0, 2.0, 2.0));
create_testcase_for(profiles); }
{ IfcSchema::IfcProfileDef::list::ptr profiles (new IfcSchema::IfcProfileDef::list);
- profiles->push(new Ifc2x3::IfcEllipseProfileDef(
+ profiles->push(new IfcSchema::IfcEllipseProfileDef(
IfcSchema::IfcProfileTypeEnum::IfcProfileType_AREA,
null, 0, 25.0, 15.0));
- profiles->push(new Ifc2x3::IfcEllipseProfileDef(
+ profiles->push(new IfcSchema::IfcEllipseProfileDef(
IfcSchema::IfcProfileTypeEnum::IfcProfileType_AREA,
null, 0, 15.0, 25.0));
create_testcase_for(profiles); }
{ IfcSchema::IfcProfileDef::list::ptr profiles (new IfcSchema::IfcProfileDef::list);
- profiles->push(new Ifc2x3::IfcIShapeProfileDef(
+ profiles->push(new IfcSchema::IfcIShapeProfileDef(
IfcSchema::IfcProfileTypeEnum::IfcProfileType_AREA,
null, 0, 25.0, 50.0, 5.0, 5.0, null));
- profiles->push(new Ifc2x3::IfcIShapeProfileDef(
+ profiles->push(new IfcSchema::IfcIShapeProfileDef(
IfcSchema::IfcProfileTypeEnum::IfcProfileType_AREA,
null, 0, 25.0, 50.0, 5.0, 5.0, 2.0));
- profiles->push(new Ifc2x3::IfcAsymmetricIShapeProfileDef(
+ profiles->push(new IfcSchema::IfcAsymmetricIShapeProfileDef(
IfcSchema::IfcProfileTypeEnum::IfcProfileType_AREA,
null, 0, 25.0, 50.0, 5.0, 5.0, 2.0, 20.0, 10.0, 5.0, null));
create_testcase_for(profiles); }
{ IfcSchema::IfcProfileDef::list::ptr profiles (new IfcSchema::IfcProfileDef::list);
- profiles->push(new Ifc2x3::IfcLShapeProfileDef(
+ profiles->push(new IfcSchema::IfcLShapeProfileDef(
IfcSchema::IfcProfileTypeEnum::IfcProfileType_AREA,
null, 0, 50.0, 25.0, 5.0, null, null, null, null, null));
- profiles->push(new Ifc2x3::IfcLShapeProfileDef(
+ profiles->push(new IfcSchema::IfcLShapeProfileDef(
IfcSchema::IfcProfileTypeEnum::IfcProfileType_AREA,
null, 0, 50.0, 25.0, 5.0, 2.0, 2.0, null, null, null));
- profiles->push(new Ifc2x3::IfcLShapeProfileDef(
+ profiles->push(new IfcSchema::IfcLShapeProfileDef(
IfcSchema::IfcProfileTypeEnum::IfcProfileType_AREA,
null, 0, 50.0, 25.0, 5.0, null, null, 2.0, null, null));
- profiles->push(new Ifc2x3::IfcLShapeProfileDef(
+ profiles->push(new IfcSchema::IfcLShapeProfileDef(
IfcSchema::IfcProfileTypeEnum::IfcProfileType_AREA,
null, 0, 50.0, 25.0, 5.0, 1.0, 2.0, 2.0, null, null));
create_testcase_for(profiles); }
{ IfcSchema::IfcProfileDef::list::ptr profiles (new IfcSchema::IfcProfileDef::list);
- profiles->push(new Ifc2x3::IfcCShapeProfileDef(
+ profiles->push(new IfcSchema::IfcCShapeProfileDef(
IfcSchema::IfcProfileTypeEnum::IfcProfileType_AREA,
null, 0, 50.0, 25.0, 5.0, 10.0, null, null));
- profiles->push(new Ifc2x3::IfcCShapeProfileDef(
+ profiles->push(new IfcSchema::IfcCShapeProfileDef(
IfcSchema::IfcProfileTypeEnum::IfcProfileType_AREA,
null, 0, 50.0, 25.0, 5.0, 10.0, 2.0, null));
create_testcase_for(profiles); }
{ IfcSchema::IfcProfileDef::list::ptr profiles (new IfcSchema::IfcProfileDef::list);
- profiles->push(new Ifc2x3::IfcCircleProfileDef(
+ profiles->push(new IfcSchema::IfcCircleProfileDef(
IfcSchema::IfcProfileTypeEnum::IfcProfileType_AREA,
null, 0, 25.0));
- profiles->push(new Ifc2x3::IfcCircleHollowProfileDef(
+ profiles->push(new IfcSchema::IfcCircleHollowProfileDef(
IfcSchema::IfcProfileTypeEnum::IfcProfileType_AREA,
null, 0, 25.0, 5.0));
create_testcase_for(profiles); }
{ IfcSchema::IfcProfileDef::list::ptr profiles (new IfcSchema::IfcProfileDef::list);
- profiles->push(new Ifc2x3::IfcRectangleProfileDef(
+ profiles->push(new IfcSchema::IfcRectangleProfileDef(
IfcSchema::IfcProfileTypeEnum::IfcProfileType_AREA,
null, 0, 50.0, 25.0));
- profiles->push(new Ifc2x3::IfcRoundedRectangleProfileDef(
+ profiles->push(new IfcSchema::IfcRoundedRectangleProfileDef(
IfcSchema::IfcProfileTypeEnum::IfcProfileType_AREA,
null, 0, 50.0, 25.0, 5.0));
- profiles->push(new Ifc2x3::IfcRectangleHollowProfileDef(
+ profiles->push(new IfcSchema::IfcRectangleHollowProfileDef(
IfcSchema::IfcProfileTypeEnum::IfcProfileType_AREA,
null, 0, 50.0, 25.0, 5.0, null, null));
- profiles->push(new Ifc2x3::IfcRectangleHollowProfileDef(
+ profiles->push(new IfcSchema::IfcRectangleHollowProfileDef(
IfcSchema::IfcProfileTypeEnum::IfcProfileType_AREA,
null, 0, 50.0, 25.0, 5.0, 2.0, 4.0));
create_testcase_for(profiles); }
{ IfcSchema::IfcProfileDef::list::ptr profiles (new IfcSchema::IfcProfileDef::list);
- profiles->push(new Ifc2x3::IfcTrapeziumProfileDef(
+ profiles->push(new IfcSchema::IfcTrapeziumProfileDef(
IfcSchema::IfcProfileTypeEnum::IfcProfileType_AREA,
null, 0, 50.0, 30.0, 25.0, 0.0));
- profiles->push(new Ifc2x3::IfcTrapeziumProfileDef(
+ profiles->push(new IfcSchema::IfcTrapeziumProfileDef(
IfcSchema::IfcProfileTypeEnum::IfcProfileType_AREA,
null, 0, 50.0, 60.0, 25.0, -20.0));
- profiles->push(new Ifc2x3::IfcTrapeziumProfileDef(
+ profiles->push(new IfcSchema::IfcTrapeziumProfileDef(
IfcSchema::IfcProfileTypeEnum::IfcProfileType_AREA,
null, 0, 50.0, 10.0, 25.0, 30.0));
create_testcase_for(profiles); }
diff --git a/src/examples/triangulated_faceset.cpp b/src/examples/triangulated_faceset.cpp
index acf56d60c1..18eb1c3b73 100644
--- a/src/examples/triangulated_faceset.cpp
+++ b/src/examples/triangulated_faceset.cpp
@@ -23,15 +23,19 @@
* *
********************************************************************************/
-#include "../ifcparse/Ifc4.h"
-#include "../ifcparse/IfcUtil.h"
-#include "../ifcparse/IfcHierarchyHelper.h"
+#include
+#include
+#include
+
+#define IfcSchema Ifc4
+#include "ifcparse/Ifc4.h"
+#include "ifcparse/IfcHierarchyHelper.h"
#include "suzanne_geometry.h"
typedef std::string S;
typedef IfcParse::IfcGlobalId guid;
-boost::none_t const null = (static_cast(0));
+boost::none_t const null = boost::none;
template
std::vector< std::vector > create_vector_from_array(const T* arr, unsigned size) {
@@ -50,7 +54,7 @@ std::vector< std::vector > create_vector_from_array(const T* arr, unsigned si
}
int main(int argc, char** argv) {
- IfcHierarchyHelper file;
+ IfcHierarchyHelper file;
IfcSchema::IfcBuildingElementProxy* product = new IfcSchema::IfcBuildingElementProxy(
guid(), 0, S("Blender's Suzanne"), null, null, 0, 0, null, null);
@@ -73,13 +77,13 @@ int main(int argc, char** argv) {
file.getRepresentationContext("Model"), S("Body"), S("SurfaceModel"), items);
reps->push(rep);
- IfcSchema::IfcProductDefinitionShape* shape = new IfcSchema::IfcProductDefinitionShape(0, 0, reps);
+ IfcSchema::IfcProductDefinitionShape* shape = new IfcSchema::IfcProductDefinitionShape(boost::none, boost::none, reps);
file.addEntity(shape);
product->setRepresentation(shape);
- const std::string filename = "tesselated_faceset.ifc";
- file.header().file_name().name(filename);
- std::ofstream f(filename.c_str());
+ const std::string filename = "triangulated_faceset.ifc";
+ file.header().file_name()->setname(filename);
+ std::ofstream f(filename);
f << file;
}
diff --git a/src/ifc4d/__main__.py b/src/ifc4d/__main__.py
index 8313ba7464..86c36394e6 100644
--- a/src/ifc4d/__main__.py
+++ b/src/ifc4d/__main__.py
@@ -1,8 +1,7 @@
import argparse
-import os
-import sys
import ifcopenshell
+
from ifc4d.msp2ifc import MSP2Ifc
from ifc4d.p6xer2ifc import P6XER2Ifc
from ifc4d.p62ifc import P62Ifc
diff --git a/src/ifc4d/ifc4d/common.py b/src/ifc4d/ifc4d/common.py
index f4fd42e1d1..296b8f36cb 100644
--- a/src/ifc4d/ifc4d/common.py
+++ b/src/ifc4d/ifc4d/common.py
@@ -4,11 +4,9 @@ from datetime import date, datetime, timedelta
from typing import Any, TypedDict, Union
import ifcopenshell
-import ifcopenshell.api
import ifcopenshell.api.control
import ifcopenshell.api.resource
import ifcopenshell.api.sequence
-import ifcopenshell.util.date
from typing_extensions import NotRequired
diff --git a/src/ifc4d/ifc4d/csv2ifc.py b/src/ifc4d/ifc4d/csv2ifc.py
index 6efbf4fad6..a908acdb53 100644
--- a/src/ifc4d/ifc4d/csv2ifc.py
+++ b/src/ifc4d/ifc4d/csv2ifc.py
@@ -24,7 +24,6 @@ import datetime
from typing import Any, Literal, NamedTuple, Optional, Union, cast, get_args
import ifcopenshell
-import ifcopenshell.api
import ifcopenshell.api.cost
import ifcopenshell.api.pset
import ifcopenshell.api.resource
@@ -33,7 +32,6 @@ import ifcopenshell.api.unit
import ifcopenshell.util.date
import ifcopenshell.util.element
import ifcopenshell.util.resource
-import ifcopenshell.util.unit
import isodate
SUPPORTED_COLUMN = Literal[
diff --git a/src/ifc4d/ifc4d/csv4d2ifc.py b/src/ifc4d/ifc4d/csv4d2ifc.py
index 2e519cc0ea..4247a06bbc 100644
--- a/src/ifc4d/ifc4d/csv4d2ifc.py
+++ b/src/ifc4d/ifc4d/csv4d2ifc.py
@@ -22,7 +22,6 @@ import locale
import re
import ifcopenshell
-import ifcopenshell.api
import ifcopenshell.api.root
import ifcopenshell.api.sequence
import ifcopenshell.util.date
diff --git a/src/ifc4d/ifc4d/ifc2p6.py b/src/ifc4d/ifc4d/ifc2p6.py
index 5093f306be..a4634ca372 100644
--- a/src/ifc4d/ifc4d/ifc2p6.py
+++ b/src/ifc4d/ifc4d/ifc2p6.py
@@ -24,8 +24,6 @@ import ifcopenshell
import ifcopenshell.util.date
import ifcopenshell.util.sequence
-from .common import ScheduleIfcGenerator
-
class Ifc2P6:
def __init__(self):
diff --git a/src/ifc4d/ifc4d/msp2ifc.py b/src/ifc4d/ifc4d/msp2ifc.py
index 3ba14a6985..91ae683c84 100644
--- a/src/ifc4d/ifc4d/msp2ifc.py
+++ b/src/ifc4d/ifc4d/msp2ifc.py
@@ -18,10 +18,9 @@
import datetime
import xml.etree.ElementTree as ET
-from datetime import date, timedelta
+from datetime import timedelta
import ifcopenshell
-import ifcopenshell.api
import ifcopenshell.api.control
import ifcopenshell.api.pset
import ifcopenshell.api.root
diff --git a/src/ifc4d/ifc4d/p62ifc.py b/src/ifc4d/ifc4d/p62ifc.py
index 833bf39dd3..7d4881161a 100644
--- a/src/ifc4d/ifc4d/p62ifc.py
+++ b/src/ifc4d/ifc4d/p62ifc.py
@@ -17,13 +17,8 @@
# along with Ifc4D. If not, see .
import datetime
-import math
import xml.etree.ElementTree as ET
-import ifcopenshell
-import ifcopenshell.api
-import ifcopenshell.util.date
-
from .common import ScheduleIfcGenerator
diff --git a/src/ifc4d/ifc4d/p6xer2ifc.py b/src/ifc4d/ifc4d/p6xer2ifc.py
index ef218ade2d..935634767d 100644
--- a/src/ifc4d/ifc4d/p6xer2ifc.py
+++ b/src/ifc4d/ifc4d/p6xer2ifc.py
@@ -16,11 +16,7 @@
# You should have received a copy of the GNU Lesser General Public License
# along with Ifc4D. If not, see .
-from datetime import date, datetime, timedelta
-import ifcopenshell
-import ifcopenshell.api
-import ifcopenshell.util.date
from xerparser.reader import Reader
from .common import ScheduleIfcGenerator
diff --git a/src/ifc4d/ifc4d/pp2ifc.py b/src/ifc4d/ifc4d/pp2ifc.py
index 338a887e91..b2be0c753b 100644
--- a/src/ifc4d/ifc4d/pp2ifc.py
+++ b/src/ifc4d/ifc4d/pp2ifc.py
@@ -12,8 +12,6 @@ from collections import defaultdict
from datetime import timedelta
from typing import Any
-import ifcopenshell.util.date
-
from .common import Activity, Calendar, ScheduleIfcGenerator, WBSEntry
from .wpattern import AstaCalendarWorkPattern
diff --git a/src/ifc4d/pyproject.toml b/src/ifc4d/pyproject.toml
index 6bb2cc9f22..bbc101905a 100644
--- a/src/ifc4d/pyproject.toml
+++ b/src/ifc4d/pyproject.toml
@@ -28,3 +28,9 @@ Issues = "https://github.com/IfcOpenShell/IfcOpenShell/issues"
[tool.setuptools.packages.find]
include = ["ifc4d"]
exclude = ["test*"]
+
+[tool.ruff]
+extend = "../../pyproject.toml"
+lint.select = [
+ "F401", # unused imports
+]
diff --git a/src/ifc5d/ifc5d/csv2ifc.py b/src/ifc5d/ifc5d/csv2ifc.py
index b1edd82d88..c33d6e847e 100644
--- a/src/ifc5d/ifc5d/csv2ifc.py
+++ b/src/ifc5d/ifc5d/csv2ifc.py
@@ -24,7 +24,6 @@ from pathlib import Path
from typing import Optional, TypedDict, Union
import ifcopenshell
-import ifcopenshell.api
import ifcopenshell.api.control
import ifcopenshell.api.cost
import ifcopenshell.api.root
diff --git a/src/ifc5d/ifc5d/ifc5Dspreadsheet.py b/src/ifc5d/ifc5d/ifc5Dspreadsheet.py
index 324340fb1c..5aab765c26 100644
--- a/src/ifc5d/ifc5d/ifc5Dspreadsheet.py
+++ b/src/ifc5d/ifc5d/ifc5Dspreadsheet.py
@@ -25,7 +25,7 @@ import logging
import os
import time
from collections import Counter
-from typing import Any, Optional, TypedDict, Union
+from typing import Optional, TypedDict, Union
import ifcopenshell
import ifcopenshell.util.cost
@@ -420,7 +420,7 @@ class Ifc5DCsvWriter(Ifc5Dwriter):
class Ifc5DOdsWriter(Ifc5Dwriter):
def write(self) -> None:
- from odf.number import CurrencyStyle, CurrencySymbol, Number, NumberStyle, Text
+ from odf.number import CurrencyStyle, CurrencySymbol, Number
from odf.opendocument import OpenDocumentSpreadsheet
from odf.style import Style, TableCellProperties
@@ -450,7 +450,7 @@ class Ifc5DOdsWriter(Ifc5Dwriter):
self.doc.save(os.path.join(self.output, file_name), True)
def write_table(self, cost_schedule):
- from odf.number import CurrencyStyle, CurrencySymbol, Number, NumberStyle, Text
+ from odf.number import CurrencySymbol, Number
from odf.table import Table, TableCell, TableRow
from odf.text import P
diff --git a/src/ifc5d/ifc5d/qto.py b/src/ifc5d/ifc5d/qto.py
index f7fba8d9e5..955c6fd7af 100644
--- a/src/ifc5d/ifc5d/qto.py
+++ b/src/ifc5d/ifc5d/qto.py
@@ -27,7 +27,6 @@ from collections.abc import Iterable
from typing import Any, Literal, NamedTuple, Union, get_args
import ifcopenshell
-import ifcopenshell.api
import ifcopenshell.api.pset
import ifcopenshell.geom
import ifcopenshell.ifcopenshell_wrapper as W
@@ -35,7 +34,6 @@ import ifcopenshell.util.element
import ifcopenshell.util.representation
import ifcopenshell.util.selector
import ifcopenshell.util.shape
-import ifcopenshell.util.type
import ifcopenshell.util.unit
diff --git a/src/ifc5d/pyproject.toml b/src/ifc5d/pyproject.toml
index 4d89b8a108..8d51a63819 100644
--- a/src/ifc5d/pyproject.toml
+++ b/src/ifc5d/pyproject.toml
@@ -35,3 +35,9 @@ exclude = ["test*"]
[tool.setuptools.package-data]
"*" = ["*.*"]
+
+[tool.ruff]
+extend = "../../pyproject.toml"
+lint.select = [
+ "F401", # unused imports
+]
diff --git a/src/ifc5d/test/test_csv2ifc.py b/src/ifc5d/test/test_csv2ifc.py
index 7dc1bbd718..c14a795da3 100644
--- a/src/ifc5d/test/test_csv2ifc.py
+++ b/src/ifc5d/test/test_csv2ifc.py
@@ -20,15 +20,15 @@ import csv
import tempfile
from pathlib import Path
-import ifc5d.csv2ifc
-import ifc5d.ifc5Dspreadsheet
import ifcopenshell
import ifcopenshell.api.root
import ifcopenshell.api.unit
import ifcopenshell.util.cost
-import ifcopenshell.util.element
import pytest
+import ifc5d.csv2ifc
+import ifc5d.ifc5Dspreadsheet
+
class TestCsv2Ifc:
@staticmethod
diff --git a/src/ifccsv/ifccsv.py b/src/ifccsv/ifccsv.py
index 341fa186e7..f6d3157f81 100755
--- a/src/ifccsv/ifccsv.py
+++ b/src/ifccsv/ifccsv.py
@@ -29,14 +29,11 @@ from statistics import mean
from typing import Literal, Optional, Union
import ifcopenshell
-import ifcopenshell.util.element
-import ifcopenshell.util.schema
import ifcopenshell.util.selector
try:
from odf.namespaces import OFFICENS
- from odf.opendocument import OpenDocumentSpreadsheet, load
- from odf.style import Style, TableCellProperties
+ from odf.opendocument import load
from odf.table import Table, TableCell, TableRow
from odf.text import P
except:
diff --git a/src/ifccsv/pyproject.toml b/src/ifccsv/pyproject.toml
index 4485d411e5..c012decd23 100644
--- a/src/ifccsv/pyproject.toml
+++ b/src/ifccsv/pyproject.toml
@@ -26,3 +26,9 @@ Issues = "https://github.com/IfcOpenShell/IfcOpenShell/issues"
[tool.setuptools]
py-modules = ["ifccsv"]
+
+[tool.ruff]
+extend = "../../pyproject.toml"
+lint.select = [
+ "F401", # unused imports
+]
diff --git a/src/ifcgeom/CMakeLists.txt b/src/ifcgeom/CMakeLists.txt
index 4bacbf2f72..31bb2e7bce 100644
--- a/src/ifcgeom/CMakeLists.txt
+++ b/src/ifcgeom/CMakeLists.txt
@@ -29,13 +29,7 @@ endif()
find_package(Eigen3 REQUIRED)
-target_link_libraries(
- IfcGeom
- ${mapping_libraries}
- ${CMAKE_THREAD_LIBS_INIT}
- "Eigen3::Eigen"
- ${CGAL_LIBRARIES}
-)
+target_link_libraries(IfcGeom ${mapping_libraries} ${CMAKE_THREAD_LIBS_INIT} "Eigen3::Eigen" ${CGAL_LIBRARIES})
if(WITH_OPENCASCADE)
target_link_libraries(IfcGeom TKernel)
diff --git a/src/ifcgeom/Serialization/CMakeLists.txt b/src/ifcgeom/Serialization/CMakeLists.txt
index 4463cabcc9..0c49136101 100644
--- a/src/ifcgeom/Serialization/CMakeLists.txt
+++ b/src/ifcgeom/Serialization/CMakeLists.txt
@@ -1,6 +1,6 @@
add_subdirectory(schema)
-add_library(geometry_serializer STATIC Serialization.cpp)
+add_library(geometry_serializer Serialization.cpp)
file(GLOB IFCGEOM_SERIALIZATION_H_FILE *.h)
set_target_properties(
diff --git a/src/ifcgeom/Serialization/schema/CMakeLists.txt b/src/ifcgeom/Serialization/schema/CMakeLists.txt
index b6daf97cd9..583c177634 100644
--- a/src/ifcgeom/Serialization/schema/CMakeLists.txt
+++ b/src/ifcgeom/Serialization/schema/CMakeLists.txt
@@ -1,5 +1,5 @@
foreach(schema ${SCHEMA_VERSIONS})
- add_library(geometry_serializer_ifc${schema} STATIC Serialization.cpp)
+ add_library(geometry_serializer_ifc${schema} OBJECT Serialization.cpp)
target_link_libraries(geometry_serializer_ifc${schema} ${OpenCASCADE_LIBRARIES})
set_target_properties(
geometry_serializer_ifc${schema}
diff --git a/src/ifcgeom/kernels/CMakeLists.txt b/src/ifcgeom/kernels/CMakeLists.txt
index 73882d2c71..6775a8f378 100644
--- a/src/ifcgeom/kernels/CMakeLists.txt
+++ b/src/ifcgeom/kernels/CMakeLists.txt
@@ -43,7 +43,4 @@ endforeach()
set(kernel_libraries ${kernel_libraries} PARENT_SCOPE)
-install(
- FILES ifc_geomlibrary_api.h
- DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/ifcgeom/kernels/"
-)
+install(FILES ifc_geomlibrary_api.h DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/ifcgeom/kernels/")
diff --git a/src/ifcopenshell-python/test/api/alignment/test_create_as_offset_curve.py b/src/ifcopenshell-python/test/api/alignment/test_create_as_offset_curve.py
index 0b431163bc..ac763e6af1 100644
--- a/src/ifcopenshell-python/test/api/alignment/test_create_as_offset_curve.py
+++ b/src/ifcopenshell-python/test/api/alignment/test_create_as_offset_curve.py
@@ -18,7 +18,6 @@
import math
-
import ifcopenshell.api.alignment
import ifcopenshell.api.unit
import ifcopenshell.util
diff --git a/src/ifcopenshell-python/test/api/alignment/test_create_layout_segment.py b/src/ifcopenshell-python/test/api/alignment/test_create_layout_segment.py
index ad654ac97d..e1b0978e1a 100644
--- a/src/ifcopenshell-python/test/api/alignment/test_create_layout_segment.py
+++ b/src/ifcopenshell-python/test/api/alignment/test_create_layout_segment.py
@@ -18,7 +18,6 @@
import math
-
import ifcopenshell.api.alignment
import ifcopenshell.api.context
import ifcopenshell.api.unit
diff --git a/src/ifcopenshell-python/test/test_stream.py b/src/ifcopenshell-python/test/test_stream.py
index 20fe67e5ec..754fcc4527 100644
--- a/src/ifcopenshell-python/test/test_stream.py
+++ b/src/ifcopenshell-python/test/test_stream.py
@@ -18,7 +18,6 @@
from pathlib import Path
-
import ifcopenshell
TEST_FILE = Path(__file__).parent / "files" / "basic.ifc"
diff --git a/src/ifcopenshell-python/test/util/test_file.py b/src/ifcopenshell-python/test/util/test_file.py
index a1ee333b6b..18fc8ef07c 100644
--- a/src/ifcopenshell-python/test/util/test_file.py
+++ b/src/ifcopenshell-python/test/util/test_file.py
@@ -20,7 +20,6 @@ import tempfile
import zipfile
from pathlib import Path
-
import ifcopenshell.util.file as subject
import test.bootstrap
diff --git a/src/ifcpatch/bootstrap.py b/src/ifcpatch/bootstrap.py
index 368d7b5cff..f703e25969 100644
--- a/src/ifcpatch/bootstrap.py
+++ b/src/ifcpatch/bootstrap.py
@@ -15,12 +15,3 @@
#
# You should have received a copy of the GNU Lesser General Public License
# along with IfcPatch. If not, see .
-
-import ifcopenshell.util.element
-import ifcopenshell.util.schema
-import ifcopenshell.util.selector
-import ifcpatch.__main__
-import ifcpatch.recipes
-import toposort
-
-import ifcpatch
diff --git a/src/ifcpatch/ifcpatch/__init__.py b/src/ifcpatch/ifcpatch/__init__.py
index 7ea668d55e..c279bfea1c 100644
--- a/src/ifcpatch/ifcpatch/__init__.py
+++ b/src/ifcpatch/ifcpatch/__init__.py
@@ -18,7 +18,6 @@
# You should have received a copy of the GNU Lesser General Public License
# along with IfcPatch. If not, see .
-import collections
import importlib
import importlib.util
import inspect
diff --git a/src/ifcpatch/ifcpatch/recipes/AGS2IFC.py b/src/ifcpatch/ifcpatch/recipes/AGS2IFC.py
index 8067d2e718..d24aec34e4 100644
--- a/src/ifcpatch/ifcpatch/recipes/AGS2IFC.py
+++ b/src/ifcpatch/ifcpatch/recipes/AGS2IFC.py
@@ -19,9 +19,7 @@
import csv
import os
-from itertools import cycle
-import ifcopenshell
import ifcopenshell.api.aggregate
import ifcopenshell.api.context
import ifcopenshell.api.document
diff --git a/src/ifcpatch/ifcpatch/recipes/AddGeometricRepresentationToAlignment.py b/src/ifcpatch/ifcpatch/recipes/AddGeometricRepresentationToAlignment.py
index 65f48f899d..8045490181 100644
--- a/src/ifcpatch/ifcpatch/recipes/AddGeometricRepresentationToAlignment.py
+++ b/src/ifcpatch/ifcpatch/recipes/AddGeometricRepresentationToAlignment.py
@@ -16,7 +16,6 @@
# You should have received a copy of the GNU Lesser General Public License
# along with IfcPatch. If not, see .
-import typing
from logging import Logger
from typing import Union
diff --git a/src/ifcpatch/ifcpatch/recipes/AddLinearPlacementFallbackPosition.py b/src/ifcpatch/ifcpatch/recipes/AddLinearPlacementFallbackPosition.py
index 9ec3f52a6a..c659c38c64 100644
--- a/src/ifcpatch/ifcpatch/recipes/AddLinearPlacementFallbackPosition.py
+++ b/src/ifcpatch/ifcpatch/recipes/AddLinearPlacementFallbackPosition.py
@@ -16,7 +16,6 @@
# You should have received a copy of the GNU Lesser General Public License
# along with IfcPatch. If not, see .
-import typing
from logging import Logger
from typing import Union
diff --git a/src/ifcpatch/ifcpatch/recipes/AddZeroLengthSegmentToAlignment.py b/src/ifcpatch/ifcpatch/recipes/AddZeroLengthSegmentToAlignment.py
index e1f6664cd0..d92f794959 100644
--- a/src/ifcpatch/ifcpatch/recipes/AddZeroLengthSegmentToAlignment.py
+++ b/src/ifcpatch/ifcpatch/recipes/AddZeroLengthSegmentToAlignment.py
@@ -16,7 +16,6 @@
# You should have received a copy of the GNU Lesser General Public License
# along with IfcPatch. If not, see .
-import typing
from logging import Logger
from typing import Union
diff --git a/src/ifcpatch/ifcpatch/recipes/ConvertLengthUnit.py b/src/ifcpatch/ifcpatch/recipes/ConvertLengthUnit.py
index 6b3554b192..3b5774bfcb 100644
--- a/src/ifcpatch/ifcpatch/recipes/ConvertLengthUnit.py
+++ b/src/ifcpatch/ifcpatch/recipes/ConvertLengthUnit.py
@@ -21,10 +21,6 @@ from logging import Logger
from typing import Union
import ifcopenshell
-import ifcopenshell.api
-import ifcopenshell.api.owner.settings
-import ifcopenshell.util.element
-import ifcopenshell.util.pset
import ifcopenshell.util.unit
import ifcpatch
diff --git a/src/ifcpatch/ifcpatch/recipes/ConvertNestToAggregate.py b/src/ifcpatch/ifcpatch/recipes/ConvertNestToAggregate.py
index 8471ed28f3..0d10de9bae 100644
--- a/src/ifcpatch/ifcpatch/recipes/ConvertNestToAggregate.py
+++ b/src/ifcpatch/ifcpatch/recipes/ConvertNestToAggregate.py
@@ -16,7 +16,6 @@
# You should have received a copy of the GNU Lesser General Public License
# along with IfcPatch. If not, see .
-import ifcopenshell
import ifcopenshell.guid
diff --git a/src/ifcpatch/ifcpatch/recipes/ConvertPropertiesToQuantities.py b/src/ifcpatch/ifcpatch/recipes/ConvertPropertiesToQuantities.py
index a9df2c93c4..3b3b54cac4 100644
--- a/src/ifcpatch/ifcpatch/recipes/ConvertPropertiesToQuantities.py
+++ b/src/ifcpatch/ifcpatch/recipes/ConvertPropertiesToQuantities.py
@@ -20,9 +20,7 @@ from logging import Logger
from typing import Union
import ifcopenshell
-import ifcopenshell.api
import ifcopenshell.api.pset
-import ifcopenshell.util.element
import ifcopenshell.util.pset
diff --git a/src/ifcpatch/ifcpatch/recipes/DowngradeIndexedPolyCurve.py b/src/ifcpatch/ifcpatch/recipes/DowngradeIndexedPolyCurve.py
index ea169f2967..4ae36f26b8 100644
--- a/src/ifcpatch/ifcpatch/recipes/DowngradeIndexedPolyCurve.py
+++ b/src/ifcpatch/ifcpatch/recipes/DowngradeIndexedPolyCurve.py
@@ -16,7 +16,6 @@
# You should have received a copy of the GNU Lesser General Public License
# along with IfcPatch. If not, see .
-import ifcopenshell
import ifcopenshell.util.element
diff --git a/src/ifcpatch/ifcpatch/recipes/ExtractElements.py b/src/ifcpatch/ifcpatch/recipes/ExtractElements.py
index 31f1fb4140..6f88f820be 100644
--- a/src/ifcpatch/ifcpatch/recipes/ExtractElements.py
+++ b/src/ifcpatch/ifcpatch/recipes/ExtractElements.py
@@ -20,7 +20,6 @@ from logging import Logger
from typing import Union
import ifcopenshell
-import ifcopenshell.api
import ifcopenshell.api.project
import ifcopenshell.guid
import ifcopenshell.util.selector
diff --git a/src/ifcpatch/ifcpatch/recipes/ExtractPropertiesToSQLite.py b/src/ifcpatch/ifcpatch/recipes/ExtractPropertiesToSQLite.py
index 5df98c4ab4..634a8fb796 100644
--- a/src/ifcpatch/ifcpatch/recipes/ExtractPropertiesToSQLite.py
+++ b/src/ifcpatch/ifcpatch/recipes/ExtractPropertiesToSQLite.py
@@ -17,13 +17,8 @@
# along with IfcPatch. If not, see .
-import json
-import os
-import re
import tempfile
-import time
-import ifcopenshell
import ifcopenshell.util.element
try:
diff --git a/src/ifcpatch/ifcpatch/recipes/FixArchiCADToRevitDoorSwings.py b/src/ifcpatch/ifcpatch/recipes/FixArchiCADToRevitDoorSwings.py
index cf602bab0a..c2523c7e8f 100644
--- a/src/ifcpatch/ifcpatch/recipes/FixArchiCADToRevitDoorSwings.py
+++ b/src/ifcpatch/ifcpatch/recipes/FixArchiCADToRevitDoorSwings.py
@@ -18,8 +18,6 @@
import logging
-import math
-import os
from typing import Union
import ifcopenshell
diff --git a/src/ifcpatch/ifcpatch/recipes/FixArchiCADToRevitSpaces.py b/src/ifcpatch/ifcpatch/recipes/FixArchiCADToRevitSpaces.py
index c6ea871c7b..38a7a2950e 100644
--- a/src/ifcpatch/ifcpatch/recipes/FixArchiCADToRevitSpaces.py
+++ b/src/ifcpatch/ifcpatch/recipes/FixArchiCADToRevitSpaces.py
@@ -18,8 +18,6 @@
import logging
-import ifcopenshell
-
class Patcher:
def __init__(self, file: None, logger: logging.Logger, filepath: str):
@@ -70,7 +68,6 @@ class Patcher:
def patch(self) -> None:
import bonsai.tool as tool
import bpy
- import ifcopenshell
import ifcopenshell.util.element
from mathutils import Matrix, Vector
diff --git a/src/ifcpatch/ifcpatch/recipes/FixRevit2025TINs.py b/src/ifcpatch/ifcpatch/recipes/FixRevit2025TINs.py
index d6dc49be18..642afb6e8c 100644
--- a/src/ifcpatch/ifcpatch/recipes/FixRevit2025TINs.py
+++ b/src/ifcpatch/ifcpatch/recipes/FixRevit2025TINs.py
@@ -21,9 +21,7 @@ import logging
from typing import Optional
import ifcopenshell
-import ifcopenshell.util.schema
import ifcopenshell.util.shape_builder
-import ifcopenshell.util.unit
class Patcher:
@@ -167,8 +165,6 @@ class Patcher:
import bpy
import ifcopenshell.api.geometry
import ifcopenshell.api.root
- import ifcopenshell.api.spatial
- import ifcopenshell.api.type
import ifcopenshell.util.element
import ifcopenshell.util.representation
@@ -234,11 +230,8 @@ class Patcher:
import bmesh
import bonsai.tool as tool
- import bpy
import ifcopenshell.api.geometry
import ifcopenshell.api.root
- import ifcopenshell.api.spatial
- import ifcopenshell.api.type
import ifcopenshell.util.element
import ifcopenshell.util.representation
@@ -284,11 +277,8 @@ class Patcher:
import bmesh
import bonsai.tool as tool
- import bpy
import ifcopenshell.api.geometry
import ifcopenshell.api.root
- import ifcopenshell.api.spatial
- import ifcopenshell.api.type
import ifcopenshell.util.element
import ifcopenshell.util.representation
from mathutils import Matrix
diff --git a/src/ifcpatch/ifcpatch/recipes/FixRevitClassificationCodeTypes.py b/src/ifcpatch/ifcpatch/recipes/FixRevitClassificationCodeTypes.py
index 1ec5b331de..1ec871160a 100644
--- a/src/ifcpatch/ifcpatch/recipes/FixRevitClassificationCodeTypes.py
+++ b/src/ifcpatch/ifcpatch/recipes/FixRevitClassificationCodeTypes.py
@@ -16,7 +16,6 @@
# You should have received a copy of the GNU Lesser General Public License
# along with IfcPatch. If not, see .
-import ifcopenshell
import ifcopenshell.util.element
diff --git a/src/ifcpatch/ifcpatch/recipes/FixRevitTINs.py b/src/ifcpatch/ifcpatch/recipes/FixRevitTINs.py
index 872b1a0091..6c083456e9 100644
--- a/src/ifcpatch/ifcpatch/recipes/FixRevitTINs.py
+++ b/src/ifcpatch/ifcpatch/recipes/FixRevitTINs.py
@@ -19,8 +19,6 @@
import logging
-import ifcopenshell
-
class Patcher:
def __init__(self, file: None, logger: logging.Logger, filepath: str, is_solid: bool = True):
diff --git a/src/ifcpatch/ifcpatch/recipes/Ifc2Sql.py b/src/ifcpatch/ifcpatch/recipes/Ifc2Sql.py
index 74744f3487..f7e294898a 100644
--- a/src/ifcpatch/ifcpatch/recipes/Ifc2Sql.py
+++ b/src/ifcpatch/ifcpatch/recipes/Ifc2Sql.py
@@ -21,9 +21,7 @@ import itertools
import json
import logging
import multiprocessing
-import os
import re
-import tempfile
import time
import typing
from pathlib import Path
diff --git a/src/ifcpatch/ifcpatch/recipes/MergeDuplicateTypes.py b/src/ifcpatch/ifcpatch/recipes/MergeDuplicateTypes.py
index 2c8385066b..38b01135b3 100644
--- a/src/ifcpatch/ifcpatch/recipes/MergeDuplicateTypes.py
+++ b/src/ifcpatch/ifcpatch/recipes/MergeDuplicateTypes.py
@@ -20,7 +20,6 @@ from logging import Logger
from typing import Any
import ifcopenshell
-import ifcopenshell.api
import ifcopenshell.api.type
import ifcopenshell.util.element
diff --git a/src/ifcpatch/ifcpatch/recipes/Migrate.py b/src/ifcpatch/ifcpatch/recipes/Migrate.py
index 6b5c18ff11..627342f096 100644
--- a/src/ifcpatch/ifcpatch/recipes/Migrate.py
+++ b/src/ifcpatch/ifcpatch/recipes/Migrate.py
@@ -16,7 +16,6 @@
# You should have received a copy of the GNU Lesser General Public License
# along with IfcPatch. If not, see .
-import typing
from logging import Logger
from typing import Union
diff --git a/src/ifcpatch/ifcpatch/recipes/OffsetObjectPlacements.py b/src/ifcpatch/ifcpatch/recipes/OffsetObjectPlacements.py
index a575fc4eac..7b8f122482 100644
--- a/src/ifcpatch/ifcpatch/recipes/OffsetObjectPlacements.py
+++ b/src/ifcpatch/ifcpatch/recipes/OffsetObjectPlacements.py
@@ -19,7 +19,6 @@
import math
import typing
-import ifcopenshell
import ifcopenshell.util.placement
import numpy as np
from ifcopenshell.util.shape_builder import ShapeBuilder
diff --git a/src/ifcpatch/ifcpatch/recipes/Optimise.py b/src/ifcpatch/ifcpatch/recipes/Optimise.py
index 79699ae2e6..b0043a7299 100644
--- a/src/ifcpatch/ifcpatch/recipes/Optimise.py
+++ b/src/ifcpatch/ifcpatch/recipes/Optimise.py
@@ -17,7 +17,6 @@
# along with IfcPatch. If not, see .
import ifcopenshell
-import ifcopenshell.util.element
class Patcher:
diff --git a/src/ifcpatch/ifcpatch/recipes/PatchStationReferentPosition.py b/src/ifcpatch/ifcpatch/recipes/PatchStationReferentPosition.py
index cd3a4fb523..9af1afc950 100644
--- a/src/ifcpatch/ifcpatch/recipes/PatchStationReferentPosition.py
+++ b/src/ifcpatch/ifcpatch/recipes/PatchStationReferentPosition.py
@@ -1,4 +1,3 @@
-import typing
from logging import Logger
from typing import Union
diff --git a/src/ifcpatch/ifcpatch/recipes/ResetAbsoluteCoordinates.py b/src/ifcpatch/ifcpatch/recipes/ResetAbsoluteCoordinates.py
index 641ba928b1..1414464fcd 100644
--- a/src/ifcpatch/ifcpatch/recipes/ResetAbsoluteCoordinates.py
+++ b/src/ifcpatch/ifcpatch/recipes/ResetAbsoluteCoordinates.py
@@ -17,7 +17,7 @@
# along with IfcPatch. If not, see .
import logging
-from typing import Literal, Optional, Union
+from typing import Literal, Union
import ifcopenshell
import numpy as np
diff --git a/src/ifcpatch/ifcpatch/recipes/ResetSpatialElementLocations.py b/src/ifcpatch/ifcpatch/recipes/ResetSpatialElementLocations.py
index 0f7c3933b4..9bd751e763 100644
--- a/src/ifcpatch/ifcpatch/recipes/ResetSpatialElementLocations.py
+++ b/src/ifcpatch/ifcpatch/recipes/ResetSpatialElementLocations.py
@@ -19,9 +19,7 @@
import logging
import ifcopenshell
-import ifcopenshell.api
import ifcopenshell.api.geometry
-import ifcopenshell.util
import ifcopenshell.util.element
import ifcopenshell.util.placement
import numpy as np
diff --git a/src/ifcpatch/ifcpatch/recipes/SetFalseOrigin.py b/src/ifcpatch/ifcpatch/recipes/SetFalseOrigin.py
index 72218e5ecf..bd8706f9e1 100644
--- a/src/ifcpatch/ifcpatch/recipes/SetFalseOrigin.py
+++ b/src/ifcpatch/ifcpatch/recipes/SetFalseOrigin.py
@@ -18,7 +18,6 @@
import typing
-import ifcopenshell
import ifcopenshell.api.georeference
import ifcopenshell.util.geolocation
diff --git a/src/ifcpatch/ifcpatch/recipes/TessellateElements.py b/src/ifcpatch/ifcpatch/recipes/TessellateElements.py
index 14ee80aec2..75dc5578d8 100644
--- a/src/ifcpatch/ifcpatch/recipes/TessellateElements.py
+++ b/src/ifcpatch/ifcpatch/recipes/TessellateElements.py
@@ -21,7 +21,6 @@ from logging import Logger
from typing import Union
import ifcopenshell
-import ifcopenshell.api
import ifcopenshell.api.geometry
import ifcopenshell.geom
import ifcopenshell.util.representation
diff --git a/src/ifcpatch/ifcpatch/recipes/UnsharePsets.py b/src/ifcpatch/ifcpatch/recipes/UnsharePsets.py
index e7a1ad9eb1..67dc3da646 100644
--- a/src/ifcpatch/ifcpatch/recipes/UnsharePsets.py
+++ b/src/ifcpatch/ifcpatch/recipes/UnsharePsets.py
@@ -20,7 +20,6 @@ from logging import Logger
import ifcopenshell
import ifcopenshell.api.pset
-import ifcopenshell.guid
import ifcopenshell.util.element
import ifcopenshell.util.selector
diff --git a/src/ifcpatch/pyproject.toml b/src/ifcpatch/pyproject.toml
index 72ec9ca3f0..22cf2ec3c5 100644
--- a/src/ifcpatch/pyproject.toml
+++ b/src/ifcpatch/pyproject.toml
@@ -31,3 +31,11 @@ Issues = "https://github.com/IfcOpenShell/IfcOpenShell/issues"
[tool.setuptools.packages.find]
include = ["ifcpatch*"]
exclude = ["test*"]
+
+[tool.ruff]
+extend = "../../pyproject.toml"
+
+[tool.ruff.lint]
+select = [
+ "F401", # unused imports
+]
diff --git a/src/ifcpatch/test/test_ConvertLengthUnit.py b/src/ifcpatch/test/test_ConvertLengthUnit.py
index a4f586512f..6fdf2668ec 100644
--- a/src/ifcpatch/test/test_ConvertLengthUnit.py
+++ b/src/ifcpatch/test/test_ConvertLengthUnit.py
@@ -16,7 +16,6 @@
# You should have received a copy of the GNU Lesser General Public License
# along with IfcOpenShell. If not, see .
-import ifcopenshell.api
import ifcopenshell.api.root
import ifcopenshell.api.unit
import ifcopenshell.util.unit
diff --git a/src/ifcpatch/test/test_ExtractElements.py b/src/ifcpatch/test/test_ExtractElements.py
index fe2e9350dd..8d7d4021c6 100644
--- a/src/ifcpatch/test/test_ExtractElements.py
+++ b/src/ifcpatch/test/test_ExtractElements.py
@@ -19,7 +19,6 @@
import os
import ifcopenshell
-import ifcopenshell.api
import ifcopenshell.api.aggregate
import ifcopenshell.api.root
import ifcopenshell.api.spatial
diff --git a/src/ifcpatch/test/test_Ifc2Sql.py b/src/ifcpatch/test/test_Ifc2Sql.py
index 79257a69c3..49e38c08fe 100644
--- a/src/ifcpatch/test/test_Ifc2Sql.py
+++ b/src/ifcpatch/test/test_Ifc2Sql.py
@@ -20,15 +20,6 @@ import tempfile
from pathlib import Path
import ifcopenshell
-import ifcopenshell.api.context
-import ifcopenshell.api.geometry
-import ifcopenshell.api.georeference
-import ifcopenshell.geom
-import ifcopenshell.util.geolocation
-import ifcopenshell.util.placement
-import ifcopenshell.util.representation
-import ifcopenshell.util.shape
-import ifcopenshell.util.shape_builder
import ifcpatch
diff --git a/src/ifcpatch/test/test_MergeDuplicateTypes.py b/src/ifcpatch/test/test_MergeDuplicateTypes.py
index 439f7a0c06..565a62517b 100644
--- a/src/ifcpatch/test/test_MergeDuplicateTypes.py
+++ b/src/ifcpatch/test/test_MergeDuplicateTypes.py
@@ -16,17 +16,13 @@
# You should have received a copy of the GNU Lesser General Public License
# along with IfcOpenShell. If not, see .
-import os
-import ifcopenshell
-import ifcopenshell.api
import ifcopenshell.api.geometry
import ifcopenshell.api.material
import ifcopenshell.api.root
import ifcopenshell.api.type
import ifcopenshell.util.element
import ifcopenshell.util.representation
-import pytest
import ifcpatch
import test.bootstrap
diff --git a/src/ifcpatch/test/test_Migrate.py b/src/ifcpatch/test/test_Migrate.py
index 319e01d91b..85e60ff09f 100644
--- a/src/ifcpatch/test/test_Migrate.py
+++ b/src/ifcpatch/test/test_Migrate.py
@@ -16,7 +16,6 @@
# You should have received a copy of the GNU Lesser General Public License
# along with IfcOpenShell. If not, see .
-import ifcopenshell
import ifcpatch
import test.bootstrap
diff --git a/src/ifcpatch/test/test_RegenerateGlobalIds.py b/src/ifcpatch/test/test_RegenerateGlobalIds.py
index e51e4c7a9c..4858b6a7b0 100644
--- a/src/ifcpatch/test/test_RegenerateGlobalIds.py
+++ b/src/ifcpatch/test/test_RegenerateGlobalIds.py
@@ -16,13 +16,8 @@
# You should have received a copy of the GNU Lesser General Public License
# along with IfcOpenShell. If not, see .
-import os
-import ifcopenshell
-import ifcopenshell.api
import ifcopenshell.api.root
-import ifcopenshell.util.element
-import pytest
import ifcpatch
import test.bootstrap
diff --git a/src/ifcpatch/test/test_ResetSpatialElementLocations.py b/src/ifcpatch/test/test_ResetSpatialElementLocations.py
index 5d446c9128..d0dc385015 100644
--- a/src/ifcpatch/test/test_ResetSpatialElementLocations.py
+++ b/src/ifcpatch/test/test_ResetSpatialElementLocations.py
@@ -16,7 +16,6 @@
# You should have received a copy of the GNU Lesser General Public License
# along with IfcOpenShell. If not, see .
-import ifcopenshell.api
import ifcopenshell.api.aggregate
import ifcopenshell.api.geometry
import ifcopenshell.api.root
diff --git a/src/ifcpatch/test/test_SetFalseOrigin.py b/src/ifcpatch/test/test_SetFalseOrigin.py
index 1357ec39b0..e15e8684fb 100644
--- a/src/ifcpatch/test/test_SetFalseOrigin.py
+++ b/src/ifcpatch/test/test_SetFalseOrigin.py
@@ -16,7 +16,6 @@
# You should have received a copy of the GNU Lesser General Public License
# along with IfcOpenShell. If not, see .
-import ifcopenshell.api
import ifcopenshell.api.aggregate
import ifcopenshell.api.context
import ifcopenshell.api.geometry
diff --git a/src/ifcpatch/test/test_TesselateElements.py b/src/ifcpatch/test/test_TesselateElements.py
index 7acdc899a7..9e15c35f72 100644
--- a/src/ifcpatch/test/test_TesselateElements.py
+++ b/src/ifcpatch/test/test_TesselateElements.py
@@ -16,14 +16,10 @@
# You should have received a copy of the GNU Lesser General Public License
# along with IfcOpenShell. If not, see .
-import ifcopenshell
import ifcopenshell.api.context
import ifcopenshell.api.geometry
-import ifcopenshell.api.profile
import ifcopenshell.api.root
import ifcopenshell.api.unit
-import ifcopenshell.geom
-import ifcopenshell.util.element
import ifcopenshell.util.representation
from ifcopenshell.util.shape_builder import ShapeBuilder
diff --git a/src/ifcpatch/test/test_UnsharePsets.py b/src/ifcpatch/test/test_UnsharePsets.py
index fc40bdb74d..ae09ed879b 100644
--- a/src/ifcpatch/test/test_UnsharePsets.py
+++ b/src/ifcpatch/test/test_UnsharePsets.py
@@ -18,7 +18,6 @@
import ifcopenshell
import ifcopenshell.api.pset
-import ifcopenshell.geom
import ifcopenshell.util.element
import ifcpatch
diff --git a/src/ifcsverchok/__init__.py b/src/ifcsverchok/__init__.py
index 4594d8a367..2355ab6783 100644
--- a/src/ifcsverchok/__init__.py
+++ b/src/ifcsverchok/__init__.py
@@ -120,6 +120,8 @@ def nodes_index() -> list[tuple[str, list[tuple[str, str]]]]:
("ifc.shape_builder.representation", "SvIfcSbRepresentation"),
("ifc.shape_builder.test", "SvIfcSbTest"),
("ifc.shape_builder.shape_output", "SvSbShapeOutput"),
+ ("ifc.shape_builder.mesh", "SvSbMesh"),
+ ("ifc.shape_builder.polyline", "SvSbPolyline"),
],
),
]
diff --git a/src/ifcsverchok/helper.py b/src/ifcsverchok/helper.py
index 8f9bda0c97..7407bd94cd 100644
--- a/src/ifcsverchok/helper.py
+++ b/src/ifcsverchok/helper.py
@@ -75,7 +75,18 @@ def get_socket_value(
*,
value_type: Literal["SINGLE_VALUE", "CONTAINER", "FLATTEN"] = "SINGLE_VALUE",
) -> Any:
- value = sockets[name].sv_get()
+ """
+ :param value_type:
+
+ - ``SINGLE_VALUE`` - e.g. ``[[x]]`` -> ``x``.
+
+ - ``CONTAINER`` - e.g. ``[ [ [x, y, z], [x,y, z] ] ]`` -> ``[ [x1, y1, z1], [x2, y2, z2] ]``.
+
+ - ``FLATTEN`` - e.g. `` [ [ [x1], [x2] ] ] `` -> `` [x1, x2] ``.
+ """
+ socket = sockets[name]
+ assert isinstance(socket, sverchok.core.sockets.SvSocketCommon)
+ value = socket.sv_get()
if value_type == "FLATTEN":
return flatten_data(value)
value = value[0]
@@ -91,10 +102,19 @@ def set_socket_value(
*,
value_type: Literal["SINGLE_VALUE", "FINAL_VALUE"] = "SINGLE_VALUE",
) -> None:
+ """
+ :param value_type:
+
+ - ``SINGLE_VALUE`` - e.g. ``x`` -> ``[[x]]``.
+
+ - ``FINAL_VALUE`` - keep value as is.
+ """
+ socket = sockets[name]
+ assert isinstance(socket, sverchok.core.sockets.SvSocketCommon)
if value_type == "SINGLE_VALUE":
- sockets[name].sv_set([[value]])
+ socket.sv_set([[value]])
return
- sockets[name].sv_set(value)
+ socket.sv_set(value)
def create_socket(
diff --git a/src/ifcsverchok/nodes/ifc/shape_builder/extrude.py b/src/ifcsverchok/nodes/ifc/shape_builder/extrude.py
index 44fd47cebc..1725f37aa2 100644
--- a/src/ifcsverchok/nodes/ifc/shape_builder/extrude.py
+++ b/src/ifcsverchok/nodes/ifc/shape_builder/extrude.py
@@ -20,14 +20,13 @@ from typing import TYPE_CHECKING, Literal
import bpy
import ifcopenshell
+import ifcsverchok.helper
+import ifcsverchok.helper as helper
from ifcopenshell.util.shape_builder import ShapeBuilder
from sverchok.core.sockets import SvVerticesSocket
from sverchok.data_structure import updateNode
from sverchok.node_tree import SverchCustomTreeNode
-import ifcsverchok.helper
-import ifcsverchok.helper as helper
-
class SvIfcSbExtrude(bpy.types.Node, SverchCustomTreeNode, ifcsverchok.helper.SvIfcCore):
bl_idname = "SvIfcSbExtrude"
diff --git a/src/ifcsverchok/nodes/ifc/shape_builder/mesh.py b/src/ifcsverchok/nodes/ifc/shape_builder/mesh.py
new file mode 100644
index 0000000000..8b740bef08
--- /dev/null
+++ b/src/ifcsverchok/nodes/ifc/shape_builder/mesh.py
@@ -0,0 +1,51 @@
+# IfcSverchok - IFC Sverchok extension
+# Copyright (C) 2022 Martina Jakubowska
+#
+# This file is part of IfcSverchok.
+#
+# IfcSverchok is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# IfcSverchok is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with IfcSverchok. If not, see .
+
+import bpy
+import ifcsverchok.helper as helper
+import sverchok.core.sockets
+from ifcsverchok.nodes.ifc.shape_builder.representation import ShapeBuilder
+from sverchok.node_tree import SverchCustomTreeNode
+
+
+class SvSbMesh(bpy.types.Node, SverchCustomTreeNode, helper.SvIfcCore):
+ bl_idname = "SvSbMesh"
+ bl_label = "IFC Mesh"
+
+ def sv_init(self, context):
+ helper.create_socket(self.inputs, "Vers", socket_type=sverchok.core.sockets.SvVerticesSocket)
+ helper.create_socket(self.inputs, "Pols")
+ helper.create_socket(self.outputs, "Representation Item", data_type="list[list[ifcopenshell.entity_instance]]")
+
+ def process(self):
+ ifc_file = helper.get_file()
+
+ vertices: list[[list[float]]] = helper.get_socket_value(self.inputs, "Vers", value_type="CONTAINER")
+ polygons: list[[list[int]]] = helper.get_socket_value(self.inputs, "Pols", value_type="CONTAINER")
+
+ builder = ShapeBuilder(ifc_file)
+ mesh = builder.mesh(vertices, polygons)
+ helper.set_socket_value(self.outputs, "Representation Item", mesh)
+
+
+def register():
+ bpy.utils.register_class(SvSbMesh)
+
+
+def unregister():
+ bpy.utils.unregister_class(SvSbMesh)
diff --git a/src/ifcsverchok/nodes/ifc/shape_builder/polyline.py b/src/ifcsverchok/nodes/ifc/shape_builder/polyline.py
new file mode 100644
index 0000000000..2f27a3834f
--- /dev/null
+++ b/src/ifcsverchok/nodes/ifc/shape_builder/polyline.py
@@ -0,0 +1,52 @@
+# IfcSverchok - IFC Sverchok extension
+# Copyright (C) 2022 Martina Jakubowska
+#
+# This file is part of IfcSverchok.
+#
+# IfcSverchok is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# IfcSverchok is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with IfcSverchok. If not, see .
+
+import bpy
+import ifcsverchok.helper as helper
+import sverchok.core.sockets
+from ifcsverchok.nodes.ifc.shape_builder.representation import ShapeBuilder
+from sverchok.node_tree import SverchCustomTreeNode
+
+
+class SvSbPolyline(bpy.types.Node, SverchCustomTreeNode, helper.SvIfcCore):
+ bl_idname = "SvSbPolyline"
+ bl_label = "IFC Polyline"
+ bl_description = "Create closed polyline from vertices."
+
+ def sv_init(self, context):
+ helper.create_socket(self.inputs, "Vers", socket_type=sverchok.core.sockets.SvVerticesSocket)
+ helper.create_socket(self.inputs, "Closed", data_type="list[list[bool]]")
+ helper.create_socket(self.outputs, "Representation Item", data_type="list[list[ifcopenshell.entity_instance]]")
+
+ def process(self):
+ ifc_file = helper.get_file()
+
+ vertices: list[[list[float]]] = helper.get_socket_value(self.inputs, "Vers", value_type="CONTAINER")
+ closed = helper.get_socket_value(self.inputs, "Closed")
+
+ builder = ShapeBuilder(ifc_file)
+ Polyline = builder.polyline(vertices, closed=closed)
+ helper.set_socket_value(self.outputs, "Representation Item", Polyline)
+
+
+def register():
+ bpy.utils.register_class(SvSbPolyline)
+
+
+def unregister():
+ bpy.utils.unregister_class(SvSbPolyline)
diff --git a/src/ifcsverchok/nodes/ifc/shape_builder/rectangle.py b/src/ifcsverchok/nodes/ifc/shape_builder/rectangle.py
index 8b9b60c81d..35e73db71f 100644
--- a/src/ifcsverchok/nodes/ifc/shape_builder/rectangle.py
+++ b/src/ifcsverchok/nodes/ifc/shape_builder/rectangle.py
@@ -17,11 +17,10 @@
# along with IfcSverchok. If not, see .
import bpy
-from ifcopenshell.util.shape_builder import ShapeBuilder
-from sverchok.node_tree import SverchCustomTreeNode
-
import ifcsverchok.helper
import ifcsverchok.helper as helper
+from ifcopenshell.util.shape_builder import ShapeBuilder
+from sverchok.node_tree import SverchCustomTreeNode
class SvIfcSbRectangle(bpy.types.Node, SverchCustomTreeNode, ifcsverchok.helper.SvIfcCore):
diff --git a/src/ifcsverchok/nodes/ifc/shape_builder/representation.py b/src/ifcsverchok/nodes/ifc/shape_builder/representation.py
index c1e8a9eb54..7fefe038dc 100644
--- a/src/ifcsverchok/nodes/ifc/shape_builder/representation.py
+++ b/src/ifcsverchok/nodes/ifc/shape_builder/representation.py
@@ -19,11 +19,10 @@
import bpy
import ifcopenshell
import ifcopenshell.util.representation
-from ifcopenshell.util.shape_builder import ShapeBuilder
-from sverchok.node_tree import SverchCustomTreeNode
-
import ifcsverchok.helper
import ifcsverchok.helper as helper
+from ifcopenshell.util.shape_builder import ShapeBuilder
+from sverchok.node_tree import SverchCustomTreeNode
class SvIfcSbRepresentation(bpy.types.Node, SverchCustomTreeNode, ifcsverchok.helper.SvIfcCore):
diff --git a/src/ifcsverchok/nodes/ifc/shape_builder/shape_output.py b/src/ifcsverchok/nodes/ifc/shape_builder/shape_output.py
index c3555c25e4..d8585ba7a2 100644
--- a/src/ifcsverchok/nodes/ifc/shape_builder/shape_output.py
+++ b/src/ifcsverchok/nodes/ifc/shape_builder/shape_output.py
@@ -21,11 +21,10 @@ import ifcopenshell
import ifcopenshell.geom
import ifcopenshell.ifcopenshell_wrapper as W
import ifcopenshell.util.shape
+import ifcsverchok.helper as helper
import sverchok.core.sockets
from sverchok.node_tree import SverchCustomTreeNode
-import ifcsverchok.helper as helper
-
class SvSbShapeOutput(bpy.types.Node, SverchCustomTreeNode, helper.SvIfcCore):
"""
@@ -52,6 +51,7 @@ class SvSbShapeOutput(bpy.types.Node, SverchCustomTreeNode, helper.SvIfcCore):
def create(self, entity: ifcopenshell.entity_instance) -> None:
assert bpy.context.scene
settings = ifcopenshell.geom.settings()
+ settings.set("dimensionality", ifcopenshell.ifcopenshell_wrapper.CURVES_SURFACES_AND_SOLIDS)
shape = ifcopenshell.geom.create_shape(settings, entity)
assert isinstance(shape, W.Triangulation)
self.verts = ifcopenshell.util.shape.get_vertices(shape).tolist()
diff --git a/src/ifcsverchok/nodes/ifc/shape_builder/test.py b/src/ifcsverchok/nodes/ifc/shape_builder/test.py
index e2fc702721..4b8cd2ba04 100644
--- a/src/ifcsverchok/nodes/ifc/shape_builder/test.py
+++ b/src/ifcsverchok/nodes/ifc/shape_builder/test.py
@@ -17,10 +17,9 @@
# along with IfcSverchok. If not, see .
import bpy
-from sverchok.node_tree import SverchCustomTreeNode
-
import ifcsverchok.helper
import ifcsverchok.helper as helper
+from sverchok.node_tree import SverchCustomTreeNode
class SvIfcSbTest(bpy.types.Node, SverchCustomTreeNode, ifcsverchok.helper.SvIfcCore):
diff --git a/src/ifctester/ifctester/__init__.py b/src/ifctester/ifctester/__init__.py
index edb1db90e4..f7d708105d 100644
--- a/src/ifctester/ifctester/__init__.py
+++ b/src/ifctester/ifctester/__init__.py
@@ -19,3 +19,4 @@
from .ids import open
__version__ = version = "0.0.0"
+__all__ = ["open"]
diff --git a/src/ifctester/ifctester/ids.py b/src/ifctester/ifctester/ids.py
index d7403e2594..8d00ce9fac 100644
--- a/src/ifctester/ifctester/ids.py
+++ b/src/ifctester/ifctester/ids.py
@@ -42,6 +42,7 @@ from .facet import (
get_psets,
)
+__all__ = ["Attribute", "Classification", "Entity", "Material", "PartOf", "Property", "Restriction"]
cwd = os.path.dirname(os.path.realpath(__file__))
schema = None
diff --git a/src/ifctester/pyproject.toml b/src/ifctester/pyproject.toml
index c174854190..1be89ed68b 100644
--- a/src/ifctester/pyproject.toml
+++ b/src/ifctester/pyproject.toml
@@ -32,3 +32,9 @@ exclude = ["test*"]
[tool.setuptools.package-data]
"*" = ["*.*"]
+
+[tool.ruff]
+extend = "../../pyproject.toml"
+lint.select = [
+ "F401", # unused imports
+]
diff --git a/src/ifctester/test/ids_doc_generator.py b/src/ifctester/test/ids_doc_generator.py
index a8323fbeed..3788afebbc 100644
--- a/src/ifctester/test/ids_doc_generator.py
+++ b/src/ifctester/test/ids_doc_generator.py
@@ -24,7 +24,6 @@ from pathlib import Path
from xml.dom.minidom import parseString
import ifcopenshell
-import ifcopenshell.api
import ifcopenshell.api.aggregate
import ifcopenshell.api.context
import ifcopenshell.api.geometry
diff --git a/src/ifctester/test/test_facet.py b/src/ifctester/test/test_facet.py
index 2e0a16ec85..3c5d91a6e4 100644
--- a/src/ifctester/test/test_facet.py
+++ b/src/ifctester/test/test_facet.py
@@ -20,7 +20,6 @@
import uuid
import ifcopenshell
-import ifcopenshell.api
import ifcopenshell.api.aggregate
import ifcopenshell.api.classification
import ifcopenshell.api.group
@@ -34,6 +33,7 @@ import ifcopenshell.api.type
import ifcopenshell.api.unit
import ifcopenshell.guid
import ifcopenshell.util.pset
+
import ifctester.facet
import ifctester.ids
from ifctester.facet import (
diff --git a/src/ifctester/test/test_ids.py b/src/ifctester/test/test_ids.py
index 0a851a355c..9410d73948 100644
--- a/src/ifctester/test/test_ids.py
+++ b/src/ifctester/test/test_ids.py
@@ -20,7 +20,6 @@ import os
from typing import Optional
import ifcopenshell
-import ifcopenshell.api
import ifcopenshell.api.material
import pytest
import xmlschema
diff --git a/src/ifctester/webapp/public/worker/api.py b/src/ifctester/webapp/public/worker/api.py
index dafc61c646..c7d3a90662 100644
--- a/src/ifctester/webapp/public/worker/api.py
+++ b/src/ifctester/webapp/public/worker/api.py
@@ -1,13 +1,10 @@
-import xml.etree.ElementTree as ET
-
import ifcopenshell
-import ifcopenshell.util
import ifcopenshell.util.attribute
import ifcopenshell.util.pset
-import ifcopenshell.util.schema
-from ifctester.ids import Ids, IdsXmlValidationError, get_schema
from xmlschema.validators.exceptions import XMLSchemaValidationError
+from ifctester.ids import Ids, IdsXmlValidationError, get_schema
+
# https://github.com/buildingSMART/IDS/blob/9914d568c7ac037acd97e58a0d16e9f93c3e3416/Schema/ids.xsd#L232
ifc_schemas = ["IFC2X3", "IFC4", "IFC4X3_ADD2"]
diff --git a/test/run.py b/test/run.py
index 320b8decc4..ad1880166f 100644
--- a/test/run.py
+++ b/test/run.py
@@ -28,7 +28,6 @@
import inspect
import os
-import shutil
import subprocess
import sys
from urllib.request import urlretrieve
diff --git a/win/patches/.gersemirc b/win/patches/.gersemirc
new file mode 100644
index 0000000000..f64d72913d
--- /dev/null
+++ b/win/patches/.gersemirc
@@ -0,0 +1 @@
+disable_formatting: true