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