From eba798c544de8bb55f180c7740ec71499a764808 Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Fri, 13 Mar 2026 18:28:51 +0500 Subject: [PATCH] typing --- src/bonsai/bonsai/bim/module/augin/prop.py | 13 +++++- src/bonsai/bonsai/bim/module/cost/ui.py | 23 ++++++++--- .../bonsai/bim/module/document/operator.py | 1 + src/bonsai/bonsai/bim/module/document/ui.py | 29 +++++++++---- src/bonsai/bonsai/bim/module/drawing/data.py | 2 + .../bonsai/bim/module/drawing/gizmos.py | 2 +- .../bonsai/bim/module/drawing/operator.py | 1 + src/bonsai/bonsai/bim/module/gis/prop.py | 13 ++++++ .../bonsai/bim/module/model/decorator.py | 9 +++- src/bonsai/bonsai/bim/module/model/prop.py | 3 ++ .../bim/module/model/sverchok_modifier.py | 6 +-- src/bonsai/bonsai/bim/module/sequence/ui.py | 3 +- src/bonsai/bonsai/bim/module/unit/ui.py | 5 +-- src/bonsai/bonsai/tool/cad.py | 8 ++-- src/bonsai/bonsai/tool/nest.py | 5 ++- src/bonsai/bonsai/tool/project.py | 2 +- src/bonsai/bonsai/tool/unit.py | 1 + src/bonsai/scripts/bonsai_translations.py | 4 +- src/bonsai/test/tool/test_system.py | 1 + .../api/geometry/add_representation.py | 6 +-- .../api/style/add_surface_textures.py | 2 +- .../ifcopenshell/geom/__init__.py | 4 +- .../ifcopenshell/geom/main.py | 6 +-- .../ifcopenshell/geom/occ_utils.py | 8 ++-- .../ifcopenshell/util/shape_builder.py | 2 +- .../ifcopenshell/validate.py | 5 +-- src/ifcpatch/ifcpatch/__init__.py | 4 +- .../recipes/FixArchiCADToRevitSpaces.py | 4 +- .../ifcpatch/recipes/FixRevit2025TINs.py | 41 +++++++++++-------- src/ifcpatch/ifcpatch/recipes/FixRevitTINs.py | 4 +- 30 files changed, 142 insertions(+), 75 deletions(-) diff --git a/src/bonsai/bonsai/bim/module/augin/prop.py b/src/bonsai/bonsai/bim/module/augin/prop.py index 9878909eb0..6358371613 100644 --- a/src/bonsai/bonsai/bim/module/augin/prop.py +++ b/src/bonsai/bonsai/bim/module/augin/prop.py @@ -16,8 +16,9 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . -import bpy.props -import bpy.types +from typing import TYPE_CHECKING + +import bpy class AuginProperties(bpy.types.PropertyGroup): @@ -27,3 +28,11 @@ class AuginProperties(bpy.types.PropertyGroup): project_name: bpy.props.StringProperty(name="Project Name") project_filename: bpy.props.StringProperty(name="IFC Filename") is_success: bpy.props.BoolProperty(name="Is Successful Upload", default=False) + + if TYPE_CHECKING: + username: str + password: str + token: str + project_name: str + project_filename: str + is_success: bool diff --git a/src/bonsai/bonsai/bim/module/cost/ui.py b/src/bonsai/bonsai/bim/module/cost/ui.py index 87e7bbb790..f8126d3c6c 100644 --- a/src/bonsai/bonsai/bim/module/cost/ui.py +++ b/src/bonsai/bonsai/bim/module/cost/ui.py @@ -663,10 +663,17 @@ class BIM_UL_cost_items_trait: split2.label(text="Rate") def draw_item( - self, context, layout: bpy.types.UILayout, data, item: CostProp.CostItem, icon, active_data, active_propname + self, + context, + layout: bpy.types.UILayout, + data: BIMCostProperties, + item: CostProp.CostItem, + icon, + active_data, + active_propname, ) -> None: if item: - self.props = tool.Cost.get_cost_props() + self.props = data cost_item = CostSchedulesData.data["cost_items"][item.ifc_definition_id] row = layout.row(align=True) @@ -812,10 +819,16 @@ class BIM_UL_cost_columns(UIList): class BIM_UL_cost_item_types(UIList): def draw_item( - self, context, layout: bpy.types.UILayout, data, item: CostProp.CostItemType, icon, active_data, active_propname + self, + context, + layout: bpy.types.UILayout, + data: BIMCostProperties, + item: CostProp.CostItemType, + icon, + active_data, + active_propname, ) -> None: - props = tool.Cost.get_cost_props() - cost_item = props.cost_items[props.active_cost_item_index] + cost_item = data.cost_items[data.active_cost_item_index] if item: row = layout.row(align=True) diff --git a/src/bonsai/bonsai/bim/module/document/operator.py b/src/bonsai/bonsai/bim/module/document/operator.py index 006ed27957..21abc42895 100644 --- a/src/bonsai/bonsai/bim/module/document/operator.py +++ b/src/bonsai/bonsai/bim/module/document/operator.py @@ -19,6 +19,7 @@ import json import bpy +import ifcopenshell.util.element import bonsai.core.document as core import bonsai.tool as tool diff --git a/src/bonsai/bonsai/bim/module/document/ui.py b/src/bonsai/bonsai/bim/module/document/ui.py index cdcf4b2580..1b25c05c15 100644 --- a/src/bonsai/bonsai/bim/module/document/ui.py +++ b/src/bonsai/bonsai/bim/module/document/ui.py @@ -26,7 +26,11 @@ from bpy.types import Panel, UIList import bonsai.tool as tool if TYPE_CHECKING: - from bonsai.bim.module.document.prop import Document, DocumentObject + from bonsai.bim.module.document.prop import ( + BIMDocumentProperties, + Document, + DocumentObject, + ) from bonsai.bim.helper import draw_attributes from bonsai.bim.module.document.data import DocumentData, ObjectDocumentData @@ -217,7 +221,14 @@ class BIM_PT_object_documents(Panel): class BIM_UL_documents(UIList): def draw_item( - self, context, layout: bpy.types.UILayout, data, item: Document, icon, active_data, active_propname + self, + context, + layout: bpy.types.UILayout, + data: BIMDocumentProperties, + item: Document, + icon, + active_data, + active_propname, ) -> None: if item: row = layout.row(align=True) @@ -264,17 +275,21 @@ class BIM_UL_documents(UIList): class BIM_UL_document_objects(UIList): def draw_item( - self, context, layout: bpy.types.UILayout, data, item: DocumentObject, icon, active_data, active_propname + self, + context, + layout: bpy.types.UILayout, + data: BIMDocumentProperties, + item: DocumentObject, + icon, + active_data, + active_propname, ) -> None: if item: row = layout.row(align=True) row.prop(item, "name", text="", emboss=False, icon="OBJECT_DATA") row.operator("bim.select_object", text="", icon="RESTRICT_SELECT_OFF").obj_name = item.name - props = tool.Document.get_document_props() - if props.active_document: - document = props.active_document - + if document := data.active_document: op = row.operator("bim.unassign_document", text="", icon="X") op.document = document.ifc_definition_id op.obj = item.name diff --git a/src/bonsai/bonsai/bim/module/drawing/data.py b/src/bonsai/bonsai/bim/module/drawing/data.py index 8373ed29bc..23ee7c1987 100644 --- a/src/bonsai/bonsai/bim/module/drawing/data.py +++ b/src/bonsai/bonsai/bim/module/drawing/data.py @@ -22,7 +22,9 @@ from pathlib import Path from typing import Any, Union import bpy +import ifcopenshell.util.classification import ifcopenshell.util.element +import ifcopenshell.util.placement import ifcopenshell.util.unit from natsort import natsorted diff --git a/src/bonsai/bonsai/bim/module/drawing/gizmos.py b/src/bonsai/bonsai/bim/module/drawing/gizmos.py index af5b9d8d5a..7f3a53ddf4 100644 --- a/src/bonsai/bonsai/bim/module/drawing/gizmos.py +++ b/src/bonsai/bonsai/bim/module/drawing/gizmos.py @@ -151,7 +151,7 @@ from bpy_extras.view3d_utils import ( ) from gpu_extras.batch import batch_for_shader from ifcopenshell.util.unit import si_conversions -from mathutils import Matrix, Vector +from mathutils import Matrix, Vector, geometry from mathutils.geometry import intersect_line_line from mathutils.kdtree import KDTree diff --git a/src/bonsai/bonsai/bim/module/drawing/operator.py b/src/bonsai/bonsai/bim/module/drawing/operator.py index 582c7b062b..8b30737176 100644 --- a/src/bonsai/bonsai/bim/module/drawing/operator.py +++ b/src/bonsai/bonsai/bim/module/drawing/operator.py @@ -42,6 +42,7 @@ import bmesh import bpy import ifcopenshell import ifcopenshell.api.document +import ifcopenshell.api.geometry import ifcopenshell.api.pset import ifcopenshell.api.style import ifcopenshell.geom diff --git a/src/bonsai/bonsai/bim/module/gis/prop.py b/src/bonsai/bonsai/bim/module/gis/prop.py index 1e6ae61614..9f685517c3 100644 --- a/src/bonsai/bonsai/bim/module/gis/prop.py +++ b/src/bonsai/bonsai/bim/module/gis/prop.py @@ -16,6 +16,9 @@ # 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.props import BoolProperty, CollectionProperty, EnumProperty, StringProperty from bpy.types import PropertyGroup @@ -37,3 +40,13 @@ class BIMCityJsonProperties(PropertyGroup): lod: EnumProperty(name="LOD", description="", items=get_lods, options={"ANIMATABLE"}, default=None) is_lod_found: BoolProperty(name="Is LOD Found", default=False) load_after_convert: BoolProperty(name="Load After Converting", default=True) + + if TYPE_CHECKING: + input: str + output: str + name: str + split_lod: bool + lods: bpy.types.bpy_prop_collection_idprop[StrProperty] + lod: str + is_lod_found: bool + load_after_convert: bool diff --git a/src/bonsai/bonsai/bim/module/model/decorator.py b/src/bonsai/bonsai/bim/module/model/decorator.py index d4dc1a218d..49090e2c9f 100644 --- a/src/bonsai/bonsai/bim/module/model/decorator.py +++ b/src/bonsai/bonsai/bim/module/model/decorator.py @@ -19,7 +19,7 @@ from __future__ import annotations import math -from math import cos, radians, sin, tan +from math import cos, pi, radians, sin, tan from typing import Any, Literal import blf @@ -27,6 +27,10 @@ import bmesh import bpy import gpu import ifcopenshell +import ifcopenshell.geom +import ifcopenshell.util.element +import ifcopenshell.util.representation +import ifcopenshell.util.unit import mathutils from bpy.types import SpaceView3D from bpy_extras import view3d_utils @@ -35,6 +39,7 @@ from gpu_extras.batch import batch_for_shader from gpu_extras.presets import draw_circle_2d from mathutils import Matrix, Quaternion, Vector +import bonsai.core.geometry import bonsai.tool as tool from bonsai.bim.module.drawing.helper import format_distance @@ -1566,7 +1571,7 @@ class ProductDecorator: obj_type, representation, ) - context.view_layer.update() + bpy.context.view_layer.update() break translate_mouse = Matrix.Translation(mouse_point) diff --git a/src/bonsai/bonsai/bim/module/model/prop.py b/src/bonsai/bonsai/bim/module/model/prop.py index cb246ac7c5..c4956056aa 100644 --- a/src/bonsai/bonsai/bim/module/model/prop.py +++ b/src/bonsai/bonsai/bim/module/model/prop.py @@ -733,6 +733,9 @@ class BIMStairProperties(PropertyGroup): class BIMSverchokProperties(PropertyGroup): node_group: bpy.props.PointerProperty(name="Node Group", type=NodeTree) + if TYPE_CHECKING: + node_group: bpy.types.NodeTree | None + def window_type_prop_update(self, context): number_of_panels, panels_data = self.window_types_panels[self.window_type] diff --git a/src/bonsai/bonsai/bim/module/model/sverchok_modifier.py b/src/bonsai/bonsai/bim/module/model/sverchok_modifier.py index 2eda14283b..448fb9725c 100644 --- a/src/bonsai/bonsai/bim/module/model/sverchok_modifier.py +++ b/src/bonsai/bonsai/bim/module/model/sverchok_modifier.py @@ -69,7 +69,7 @@ class CreateNewSverchokGraph(bpy.types.Operator, tool.Ifc.Operator): bl_options = {"REGISTER"} def _execute(self, context): - import sverchok + import sverchok.ui.sv_temporal_viewers obj = context.active_object props = tool.Model.get_sverchok_props(obj) @@ -193,7 +193,7 @@ class ImportSverchokGraph(bpy.types.Operator, tool.Ifc.Operator, ImportHelper): filename_ext = ".json" def _execute(self, context): - import sverchok + import sverchok.utils.sv_json_import importer = sverchok.utils.sv_json_import.JSONImporter.init_from_path(self.filepath) obj = context.active_object @@ -232,7 +232,7 @@ class ExportSverchokGraph(bpy.types.Operator, tool.Ifc.Operator, ExportHelper): compress: bpy.props.BoolProperty() def _execute(self, context): - import sverchok + import sverchok.utils.sv_json_export obj = context.active_object props = tool.Model.get_sverchok_props(obj) diff --git a/src/bonsai/bonsai/bim/module/sequence/ui.py b/src/bonsai/bonsai/bim/module/sequence/ui.py index 8ba77df347..56847fa750 100644 --- a/src/bonsai/bonsai/bim/module/sequence/ui.py +++ b/src/bonsai/bonsai/bim/module/sequence/ui.py @@ -810,11 +810,10 @@ class BIM_UL_task_columns(UIList): active_data, active_propname, ): - props = tool.Sequence.get_work_schedule_props() if item: row = layout.row(align=True) row.prop(item, "name", emboss=False, text="") - if props.sort_column == item.name: + if data.sort_column == item.name: row.label(text="", icon="SORTALPHA") row.operator("bim.remove_task_column", text="", icon="X").name = item.name diff --git a/src/bonsai/bonsai/bim/module/unit/ui.py b/src/bonsai/bonsai/bim/module/unit/ui.py index 703c43c3d5..848425cd4e 100644 --- a/src/bonsai/bonsai/bim/module/unit/ui.py +++ b/src/bonsai/bonsai/bim/module/unit/ui.py @@ -123,7 +123,6 @@ class BIM_UL_units(UIList): active_data, active_propname, ) -> None: - props = tool.Unit.get_unit_props() if item: icon = tool.Unit.get_icon_for_unit_class(item.ifc_class) row = layout.row(align=True) @@ -137,10 +136,10 @@ class BIM_UL_units(UIList): op = row.operator("bim.assign_unit", text="", icon="KEYFRAME", emboss=False) op.unit = item.ifc_definition_id - if props.active_unit_id == item.ifc_definition_id: + if data.active_unit_id == item.ifc_definition_id: row.operator("bim.edit_unit", text="", icon="CHECKMARK").unit = item.ifc_definition_id row.operator("bim.disable_editing_unit", text="", icon="CANCEL") - elif props.active_unit_id: + elif data.active_unit_id: row.operator("bim.remove_unit", text="", icon="X").unit = item.ifc_definition_id else: op = row.operator("bim.enable_editing_unit", text="", icon="GREASEPENCIL") diff --git a/src/bonsai/bonsai/tool/cad.py b/src/bonsai/bonsai/tool/cad.py index 13678df15a..c91b5df0d8 100644 --- a/src/bonsai/bonsai/tool/cad.py +++ b/src/bonsai/bonsai/tool/cad.py @@ -841,7 +841,7 @@ class Cad: return new_verts @classmethod - def region_2d_to_vector_3d_np(cls, region: bpy.types.Region, rv3d: bpy.types.RegionView3d, coord: Vector) -> Vector: + def region_2d_to_vector_3d_np(cls, region: bpy.types.Region, rv3d: bpy.types.RegionView3D, coord: Vector) -> Vector: """ Numpy version of view3d_utils.region_2d_to_vector_3d Return a direction vector from the viewport at the specific 2d region @@ -880,7 +880,7 @@ class Cad: @classmethod def region_2d_to_location_3d_np( - cls, region: bpy.types.Region, rv3d: bpy.types.RegionView3d, coord: Vector, depth_location: Vector + cls, region: bpy.types.Region, rv3d: bpy.types.RegionView3D, coord: Vector, depth_location: Vector ) -> Vector: """ Numpy version of view3d_utils.region_2d_to_location_3d @@ -913,7 +913,7 @@ class Cad: @classmethod def region_2d_to_origin_3d_np( - cls, region: bpy.types.Region, rv3d: bpy.types.RegionView3d, coord: Vector, *, clamp: float = None + cls, region: bpy.types.Region, rv3d: bpy.types.RegionView3D, coord: Vector, *, clamp: float = None ) -> Vector: """ Numpy version of view3d_utils.region_2d_to_origin_3d @@ -971,7 +971,7 @@ class Cad: @classmethod def location_3d_to_region_2d_np( - cls, region: bpy.types.Region, rv3d: bpy.types.RegionView3d, coord: Vector, *, default=None + cls, region: bpy.types.Region, rv3d: bpy.types.RegionView3D, coord: Vector, *, default=None ) -> Vector: """ Numpy version of view3d_utils.location_3d_to_region_2d diff --git a/src/bonsai/bonsai/tool/nest.py b/src/bonsai/bonsai/tool/nest.py index 8b4fde0e78..37d0fa678f 100644 --- a/src/bonsai/bonsai/tool/nest.py +++ b/src/bonsai/bonsai/tool/nest.py @@ -123,10 +123,11 @@ class Nest(bonsai.core.tool.Nest): return {"FINISHED"} @classmethod - def disable_nest_mode(cls): + def disable_nest_mode(cls) -> None: props = cls.get_nest_props() for obj_prop in props.not_editing_objects: obj = obj_prop.obj + assert obj and obj.original obj.original.display_type = obj_prop.previous_display_type element = tool.Ifc.get_entity(obj) if not element: @@ -134,7 +135,7 @@ class Nest(bonsai.core.tool.Nest): components = ifcopenshell.util.element.get_components(tool.Ifc.get_entity(props.editing_nest)) objs = [tool.Ifc.get_object(component) for component in components] - if context.space_data.local_view: + if bpy.context.space_data.local_view: bpy.ops.view3d.localview() props.in_nest_mode = False diff --git a/src/bonsai/bonsai/tool/project.py b/src/bonsai/bonsai/tool/project.py index 259bff86d0..1bfb239726 100644 --- a/src/bonsai/bonsai/tool/project.py +++ b/src/bonsai/bonsai/tool/project.py @@ -43,7 +43,7 @@ import ifcopenshell.util.shape_builder import numpy as np import numpy.typing as npt from ifcopenshell.api.project.append_asset import APPENDABLE_ASSET_TYPES -from mathutils import Matrix +from mathutils import Matrix, Vector import bonsai.bim.schema import bonsai.core.aggregate diff --git a/src/bonsai/bonsai/tool/unit.py b/src/bonsai/bonsai/tool/unit.py index 5825c6f382..4c3e45b794 100644 --- a/src/bonsai/bonsai/tool/unit.py +++ b/src/bonsai/bonsai/tool/unit.py @@ -24,6 +24,7 @@ from typing import TYPE_CHECKING, Any, Literal, Union import bpy import ifcopenshell +import ifcopenshell.util.unit from lark import Lark, Transformer import bonsai.bim.helper diff --git a/src/bonsai/scripts/bonsai_translations.py b/src/bonsai/scripts/bonsai_translations.py index 1597eaabcb..fbf11df6e8 100644 --- a/src/bonsai/scripts/bonsai_translations.py +++ b/src/bonsai/scripts/bonsai_translations.py @@ -273,8 +273,8 @@ 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 ( # pyright: ignore[reportMissingImports] + settings as ui_translate_settings, ) from ui_translate.update_ui import ( # pyright: ignore[reportMissingImports] UI_OT_i18n_updatetranslation_init_settings, diff --git a/src/bonsai/test/tool/test_system.py b/src/bonsai/test/tool/test_system.py index 3067ccfa09..5c18ad623f 100644 --- a/src/bonsai/test/tool/test_system.py +++ b/src/bonsai/test/tool/test_system.py @@ -23,6 +23,7 @@ import ifcopenshell import ifcopenshell.api import ifcopenshell.api.root import ifcopenshell.api.system +import ifcopenshell.util.system import ifcopenshell.util.unit import numpy as np from mathutils import Euler, Matrix, Vector diff --git a/src/ifcopenshell-python/ifcopenshell/api/geometry/add_representation.py b/src/ifcopenshell-python/ifcopenshell/api/geometry/add_representation.py index 0a1adb1ec1..7cb9368f68 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/geometry/add_representation.py +++ b/src/ifcopenshell-python/ifcopenshell/api/geometry/add_representation.py @@ -20,11 +20,11 @@ from __future__ import annotations import math from typing import TYPE_CHECKING, Any, Literal, Optional, Union -import bmesh -import bpy.types +import bmesh # pyright: ignore[reportMissingImports] +import bpy # pyright: ignore[reportMissingImports] import numpy as np import numpy.typing as npt -from mathutils import Matrix, Vector +from mathutils import Matrix, Vector # pyright: ignore[reportMissingImports] import ifcopenshell.util.shape_builder import ifcopenshell.util.unit diff --git a/src/ifcopenshell-python/ifcopenshell/api/style/add_surface_textures.py b/src/ifcopenshell-python/ifcopenshell/api/style/add_surface_textures.py index 49e1381da2..3db088f83e 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/style/add_surface_textures.py +++ b/src/ifcopenshell-python/ifcopenshell/api/style/add_surface_textures.py @@ -22,7 +22,7 @@ from typing import TYPE_CHECKING, Any, Optional import ifcopenshell if TYPE_CHECKING: - import bpy + import bpy # pyright: ignore[reportMissingImports] def add_surface_textures( diff --git a/src/ifcopenshell-python/ifcopenshell/geom/__init__.py b/src/ifcopenshell-python/ifcopenshell/geom/__init__.py index 9ed96fa0c8..606004864c 100644 --- a/src/ifcopenshell-python/ifcopenshell/geom/__init__.py +++ b/src/ifcopenshell-python/ifcopenshell/geom/__init__.py @@ -33,14 +33,14 @@ def _has_occ(): # Previous versions (pythonocc<=0.17.3) are using just OCC. try: - import OCC.Core.BRepTools + import OCC.Core.BRepTools # pyright: ignore[reportMissingImports] return True except ImportError: pass try: - import OCC.BRepTools # noqa: F401 + import OCC.BRepTools # noqa: F401 # pyright: ignore[reportMissingImports] return True except ImportError: diff --git a/src/ifcopenshell-python/ifcopenshell/geom/main.py b/src/ifcopenshell-python/ifcopenshell/geom/main.py index db6deecb15..299f09281a 100644 --- a/src/ifcopenshell-python/ifcopenshell/geom/main.py +++ b/src/ifcopenshell-python/ifcopenshell/geom/main.py @@ -28,7 +28,7 @@ from ..file import file from . import has_occ if TYPE_CHECKING: - from OCC.Core import TopoDS + from OCC.Core import TopoDS # pyright: ignore[reportMissingImports] IteratorOutput = Union["ShapeElementType", "utils.shape_tuple"] @@ -47,9 +47,9 @@ if has_occ: from . import occ_utils as utils try: - from OCC.Core import TopoDS + from OCC.Core import TopoDS # pyright: ignore[reportMissingImports] except ImportError: - from OCC import TopoDS + from OCC import TopoDS # pyright: ignore[reportMissingImports] def wrap_shape_creation(settings: settings, shape: ifcopenshell_wrapper.Element): if getattr(settings, "use_python_opencascade", False): diff --git a/src/ifcopenshell-python/ifcopenshell/geom/occ_utils.py b/src/ifcopenshell-python/ifcopenshell/geom/occ_utils.py index 8964b2392a..9a4a44c18f 100644 --- a/src/ifcopenshell-python/ifcopenshell/geom/occ_utils.py +++ b/src/ifcopenshell-python/ifcopenshell/geom/occ_utils.py @@ -26,17 +26,17 @@ import warnings from collections.abc import Iterable from typing import NamedTuple, Union -import OCC +import OCC # pyright: ignore[reportMissingImports] from typing_extensions import assert_never import ifcopenshell.ifcopenshell_wrapper as ifcopenshell_wrapper try: - from OCC.Core import AIS, BRepTools, Graphic3d, Quantity, TopoDS, V3d, gp + from OCC.Core import AIS, BRepTools, Graphic3d, Quantity, TopoDS, V3d, gp # pyright: ignore[reportMissingImports] USE_OCCT_HANDLE = False except ImportError: - from OCC import AIS, BRepTools, Graphic3d, Quantity, TopoDS, V3d, gp + from OCC import AIS, BRepTools, Graphic3d, Quantity, TopoDS, V3d, gp # pyright: ignore[reportMissingImports] USE_OCCT_HANDLE = True @@ -68,7 +68,7 @@ DEFAULT_STYLES = { def initialize_display(): - import OCC.Display.SimpleGui + import OCC.Display.SimpleGui # pyright: ignore[reportMissingImports] global handle, main_loop, add_menu, add_function_to_menu handle, main_loop, add_menu, add_function_to_menu = OCC.Display.SimpleGui.init_display() diff --git a/src/ifcopenshell-python/ifcopenshell/util/shape_builder.py b/src/ifcopenshell-python/ifcopenshell/util/shape_builder.py index 31a067bc80..907cb85b5a 100644 --- a/src/ifcopenshell-python/ifcopenshell/util/shape_builder.py +++ b/src/ifcopenshell-python/ifcopenshell/util/shape_builder.py @@ -40,7 +40,7 @@ if TYPE_CHECKING: # NOTE: mathutils is never used at runtime in ifcopenshell, # only for type checking to ensure methods are compatible with # Blender vectors. - from mathutils import Vector + from mathutils import Vector # pyright: ignore[reportMissingImports] # Support both numpy arrays and python sequences as inputs. VectorType = Union[Sequence[float], Vector, np.ndarray] diff --git a/src/ifcopenshell-python/ifcopenshell/validate.py b/src/ifcopenshell-python/ifcopenshell/validate.py index e1270afb57..a98282fd1c 100644 --- a/src/ifcopenshell-python/ifcopenshell/validate.py +++ b/src/ifcopenshell-python/ifcopenshell/validate.py @@ -60,7 +60,6 @@ from typing import TYPE_CHECKING, Any, Optional, Union import ifcopenshell import ifcopenshell.express.rule_executor import ifcopenshell.ifcopenshell_wrapper -import ifcopenshell.ifcopenshell_wrapper as W if TYPE_CHECKING: import ifcopenshell.simple_spf @@ -705,10 +704,10 @@ def validate_ifc_header( log_error(header_entity, name, index, STRING_TYPE, type(value).__name__) # Ignore header.file_schema as file won't load to IfcOpenShell with invalid file_schema. - file_description: W.FileDescription = header.file_description + file_description = header.file_description validate_attribute(file_description, "description", 0, aggregate=True) validate_attribute(file_description, "implementation_level", 1) - file_name: W.FileName = header.file_name + file_name = header.file_name validate_attribute(file_name, "name", 0) validate_attribute(file_name, "time_stamp", 1) validate_attribute(file_name, "author", 2, aggregate=True) diff --git a/src/ifcpatch/ifcpatch/__init__.py b/src/ifcpatch/ifcpatch/__init__.py index c279bfea1c..3b6b8fdf40 100644 --- a/src/ifcpatch/ifcpatch/__init__.py +++ b/src/ifcpatch/ifcpatch/__init__.py @@ -215,11 +215,11 @@ def _extract_docs(cls: type, method_name: str, boilerplate_args: Union[Sequence[ input_data = inputs[input_name] # E.g. list[str]. - if isinstance(type_hint, typing.GenericAlias): + if isinstance(type_hint, typing.GenericAlias): # pyright: ignore[reportAttributeAccessIssue] input_data["generic_type"] = type_hint.__name__ type_hint = typing.get_args(type_hint)[0] - if isinstance(type_hint, typing._UnionGenericAlias): + if isinstance(type_hint, typing._UnionGenericAlias): # pyright: ignore[reportAttributeAccessIssue] inputs[input_name]["type"] = [t.__name__ for t in typing.get_args(type_hint)] elif type_hint.__name__ == "Literal": inputs[input_name]["type"] = "Literal" diff --git a/src/ifcpatch/ifcpatch/recipes/FixArchiCADToRevitSpaces.py b/src/ifcpatch/ifcpatch/recipes/FixArchiCADToRevitSpaces.py index 38a7a2950e..8a80b5d264 100644 --- a/src/ifcpatch/ifcpatch/recipes/FixArchiCADToRevitSpaces.py +++ b/src/ifcpatch/ifcpatch/recipes/FixArchiCADToRevitSpaces.py @@ -67,9 +67,9 @@ class Patcher: def patch(self) -> None: import bonsai.tool as tool - import bpy + import bpy # pyright: ignore[reportMissingImports] import ifcopenshell.util.element - from mathutils import Matrix, Vector + from mathutils import Matrix, Vector # pyright: ignore[reportMissingImports] if len(bpy.data.objects) > 0: bpy.data.batch_remove(bpy.data.objects) diff --git a/src/ifcpatch/ifcpatch/recipes/FixRevit2025TINs.py b/src/ifcpatch/ifcpatch/recipes/FixRevit2025TINs.py index 642afb6e8c..4045e86aad 100644 --- a/src/ifcpatch/ifcpatch/recipes/FixRevit2025TINs.py +++ b/src/ifcpatch/ifcpatch/recipes/FixRevit2025TINs.py @@ -18,11 +18,15 @@ import logging -from typing import Optional +from typing import Optional, TYPE_CHECKING + import ifcopenshell import ifcopenshell.util.shape_builder +if TYPE_CHECKING: + import bpy # pyright: ignore[reportMissingImports] + class Patcher: def __init__( @@ -109,12 +113,14 @@ class Patcher: self.should_create_edges = should_create_edges def patch(self) -> None: - import bmesh + import bmesh # pyright: ignore[reportMissingImports] import bonsai.tool as tool - import bpy - import ifcopenshell.util.shape_builder + import bpy # pyright: ignore[reportMissingImports] + import ifcopenshell.util.schema + import ifcopenshell.util.unit - bpy.context.scene.BIMProjectProperties.should_use_native_meshes = True + props = tool.Project.get_project_props() + props.should_use_native_meshes = True bpy.ops.bim.load_project(filepath=self.filepath) old_history_size = tool.Ifc.get().history_size @@ -125,7 +131,7 @@ class Patcher: self.unit_scale = ifcopenshell.util.unit.calculate_unit_scale(tool.Ifc.get()) for obj in bpy.data.objects: - if not obj.BIMObjectProperties.ifc_definition_id or not obj.data: + if not tool.Blender.get_ifc_definition_id(obj) or not obj.data: continue if not obj.data.polygons: continue @@ -159,14 +165,14 @@ class Patcher: self.file = tool.Ifc.get() - def create_edges(self, obj): - import bmesh + def create_edges(self, obj: bpy.types.Object) -> None: + import bmesh # pyright: ignore[reportMissingImports] import bonsai.tool as tool - import bpy + import bpy # pyright: ignore[reportMissingImports] import ifcopenshell.api.geometry import ifcopenshell.api.root - import ifcopenshell.util.element import ifcopenshell.util.representation + import ifcopenshell.util.schema element = tool.Ifc.get_entity(obj) data = obj.data @@ -224,16 +230,16 @@ class Patcher: ifcopenshell.util.schema.reassign_class(tool.Ifc.get(), element2, "IfcVirtualElement") bm.free() - def create_face_sampleable_object(self, obj): + def create_face_sampleable_object(self, obj: bpy.types.Object) -> None: # No sharp faces from math import degrees - import bmesh + import bmesh # pyright: ignore[reportMissingImports] import bonsai.tool as tool import ifcopenshell.api.geometry import ifcopenshell.api.root - import ifcopenshell.util.element import ifcopenshell.util.representation + import ifcopenshell.util.shape_builder print("working on ", obj.name) element = tool.Ifc.get_entity(obj) @@ -271,17 +277,17 @@ class Patcher: bm.free() - def create_edge_sampleable_object(self, obj): + def create_edge_sampleable_object(self, obj: bpy.types.Object) -> None: # This is crazy but we need a sharp face per island from math import degrees, radians, sin - import bmesh + import bmesh # pyright: ignore[reportMissingImports] import bonsai.tool as tool import ifcopenshell.api.geometry import ifcopenshell.api.root - import ifcopenshell.util.element import ifcopenshell.util.representation - from mathutils import Matrix + import ifcopenshell.util.shape_builder + from mathutils import Matrix # pyright: ignore[reportMissingImports] # Get the active object (assumed to have a mesh) mesh = obj.data @@ -430,7 +436,6 @@ class Patcher: bm.free() print("Added a triangle to", islands_count, "mesh island(s).") - return def create_curves_from_curve_ifc2x3( self, is_2d: bool = False, curve_object_data=None diff --git a/src/ifcpatch/ifcpatch/recipes/FixRevitTINs.py b/src/ifcpatch/ifcpatch/recipes/FixRevitTINs.py index 6c083456e9..a1912d3b6e 100644 --- a/src/ifcpatch/ifcpatch/recipes/FixRevitTINs.py +++ b/src/ifcpatch/ifcpatch/recipes/FixRevitTINs.py @@ -80,9 +80,9 @@ class Patcher: def patch(self) -> None: from math import degrees - import bmesh + import bmesh # pyright: ignore[reportMissingImports] import bonsai.tool as tool - import bpy + import bpy # pyright: ignore[reportMissingImports] props = tool.Project.get_project_props() props.should_use_native_meshes = True