This commit is contained in:
Andrej730
2025-01-29 12:40:03 +05:00
parent 0599138bca
commit c9da643fe1
7 changed files with 158 additions and 12 deletions
+1 -1
View File
@@ -1143,7 +1143,7 @@ class IfcImportSettings:
@staticmethod @staticmethod
def factory(context=None, input_file=None, logger=None): def factory(context=None, input_file=None, logger=None):
scene_diff = bpy.context.scene.DiffProperties scene_diff = bpy.context.scene.DiffProperties
props = bpy.context.scene.BIMProjectProperties props = tool.Project.get_project_props()
settings = IfcImportSettings() settings = IfcImportSettings()
settings.input_file = input_file settings.input_file = input_file
if logger is None: if logger is None:
+34 -1
View File
@@ -111,6 +111,14 @@ class Material(PropertyGroup):
has_style: BoolProperty(name="Has Style", default=True) has_style: BoolProperty(name="Has Style", default=True)
total_elements: IntProperty(name="Total Elements") total_elements: IntProperty(name="Total Elements")
if TYPE_CHECKING:
name: str
ifc_definition_id: int
is_category: bool
is_expanded: bool
has_style: bool
total_elements: int
class BIMMaterialProperties(PropertyGroup): class BIMMaterialProperties(PropertyGroup):
is_editing: BoolProperty(name="Is Editing", default=False) is_editing: BoolProperty(name="Is Editing", default=False)
@@ -126,9 +134,21 @@ class BIMMaterialProperties(PropertyGroup):
@property @property
def active_material(self): def active_material(self):
if self.active_material_index < len(self.materials): if 0 <= self.active_material_index < len(self.materials):
return self.materials[self.active_material_index] return self.materials[self.active_material_index]
if TYPE_CHECKING:
is_editing: bool
material_type: str
materials: bpy.types.bpy_prop_collection_idprop[Material]
active_material_index: int
profiles: str
active_material_id: int
material_attributes: bpy.types.bpy_prop_collection_idprop[Attribute]
editing_material_type: str
styles: str
contexts: str
class BIMObjectMaterialProperties(PropertyGroup): class BIMObjectMaterialProperties(PropertyGroup):
material_type: EnumProperty(items=get_object_material_type, name="Material Type") material_type: EnumProperty(items=get_object_material_type, name="Material Type")
@@ -146,3 +166,16 @@ class BIMObjectMaterialProperties(PropertyGroup):
parameterized_profile_classes: EnumProperty( parameterized_profile_classes: EnumProperty(
items=get_parameterized_profile_classes, name="Parameterized Profile Classes" items=get_parameterized_profile_classes, name="Parameterized Profile Classes"
) )
if TYPE_CHECKING:
material_type: str
material: str
is_editing: bool
material_set_usage_attributes: bpy.types.bpy_prop_collection_idprop[Attribute]
material_set_attributes: bpy.types.bpy_prop_collection_idprop[Attribute]
active_material_set_item_id: int
material_set_item_attributes: bpy.types.bpy_prop_collection_idprop[Attribute]
material_set_item_profile_attributes: bpy.types.bpy_prop_collection_idprop[Attribute]
material_set_item_material: str
profile_classes: str
parameterized_profile_classes: str
+8 -1
View File
@@ -16,6 +16,7 @@
# You should have received a copy of the GNU General Public License # You should have received a copy of the GNU General Public License
# along with Bonsai. If not, see <http://www.gnu.org/licenses/>. # along with Bonsai. If not, see <http://www.gnu.org/licenses/>.
from __future__ import annotations
import bonsai.bim.helper import bonsai.bim.helper
import bonsai.tool as tool import bonsai.tool as tool
import bpy import bpy
@@ -25,6 +26,10 @@ from bonsai.bim.helper import draw_attributes
from bonsai.bim.helper import prop_with_search from bonsai.bim.helper import prop_with_search
from bonsai.bim.module.material.data import MaterialsData, ObjectMaterialData from bonsai.bim.module.material.data import MaterialsData, ObjectMaterialData
from bonsai.bim.module.drawing.helper import format_distance from bonsai.bim.module.drawing.helper import format_distance
from typing import TYPE_CHECKING
if TYPE_CHECKING:
from bonsai.bim.module.material.prop import Material
class BIM_PT_materials(Panel): class BIM_PT_materials(Panel):
@@ -395,7 +400,9 @@ class BIM_PT_object_material(Panel):
class BIM_UL_materials(UIList): class BIM_UL_materials(UIList):
def draw_item(self, context, layout, data, item, icon, active_data, active_propname): def draw_item(
self, context, layout: bpy.types.UILayout, data, item: Material, icon, active_data, active_propname
) -> None:
mprops = context.scene.BIMMaterialProperties mprops = context.scene.BIMMaterialProperties
material_type = mprops.material_type material_type = mprops.material_type
@@ -207,7 +207,7 @@ class RefreshLibrary(bpy.types.Operator):
bl_label = "Refresh Library" bl_label = "Refresh Library"
def execute(self, context): def execute(self, context):
self.props = context.scene.BIMProjectProperties self.props = tool.Project.get_project_props()
self.props.library_elements.clear() self.props.library_elements.clear()
self.props.library_breadcrumb.clear() self.props.library_breadcrumb.clear()
@@ -227,11 +227,16 @@ class ChangeLibraryElement(bpy.types.Operator):
bl_options = {"REGISTER", "UNDO"} bl_options = {"REGISTER", "UNDO"}
element_name: bpy.props.StringProperty() element_name: bpy.props.StringProperty()
if TYPE_CHECKING:
element_name: str
def execute(self, context): def execute(self, context):
self.props = context.scene.BIMProjectProperties self.props = tool.Project.get_project_props()
self.file = IfcStore.get_file() self.file = tool.Ifc.get()
self.library_file = IfcStore.library_file library_file = IfcStore.library_file
ifc_classes = set() assert library_file
self.library_file = library_file
ifc_classes: set[str] = set()
self.props.active_library_element = self.element_name self.props.active_library_element = self.element_name
crumb = self.props.library_breadcrumb.add() crumb = self.props.library_breadcrumb.add()
+80 -2
View File
@@ -34,6 +34,7 @@ from bpy.props import (
IntProperty, IntProperty,
StringProperty, StringProperty,
) )
from typing import TYPE_CHECKING, Literal, Union
def get_export_schema(self: "BIMProjectProperties", context: bpy.types.Context) -> list[tuple[str, str, str]]: def get_export_schema(self: "BIMProjectProperties", context: bpy.types.Context) -> list[tuple[str, str, str]]:
@@ -97,11 +98,18 @@ def update_filter_mode(self: "BIMProjectProperties", context: bpy.types.Context)
class LibraryElement(PropertyGroup): class LibraryElement(PropertyGroup):
# For IFC class groups only name is filled, for assets - all fields.
name: StringProperty(name="Name") name: StringProperty(name="Name")
ifc_definition_id: IntProperty(name="IFC Definition ID") ifc_definition_id: IntProperty(name="IFC Definition ID")
is_declared: BoolProperty(name="Is Declared", default=False) is_declared: BoolProperty(name="Is Declared", default=False)
is_appended: BoolProperty(name="Is Appended", default=False) is_appended: BoolProperty(name="Is Appended", default=False)
if TYPE_CHECKING:
name: str
ifc_definition_id: int
is_declared: bool
is_appended: bool
class FilterCategory(PropertyGroup): class FilterCategory(PropertyGroup):
name: StringProperty(name="Name") name: StringProperty(name="Name")
@@ -109,6 +117,12 @@ class FilterCategory(PropertyGroup):
is_selected: BoolProperty(name="Is Selected", default=False) is_selected: BoolProperty(name="Is Selected", default=False)
total_elements: IntProperty(name="Total Elements") total_elements: IntProperty(name="Total Elements")
if TYPE_CHECKING:
name: str
ifc_definition_id: int
is_selected: bool
total_elements: int
class Link(PropertyGroup): class Link(PropertyGroup):
name: StringProperty( name: StringProperty(
@@ -125,10 +139,21 @@ class Link(PropertyGroup):
type=bpy.types.Object, type=bpy.types.Object,
) )
if TYPE_CHECKING:
name: str
is_loaded: bool
is_selectable: bool
is_wireframe: bool
is_hidden: bool
empty_handle: Union[bpy.types.Object, None]
class EditedObj(PropertyGroup): class EditedObj(PropertyGroup):
obj: PointerProperty(type=bpy.types.Object) obj: PointerProperty(type=bpy.types.Object)
if TYPE_CHECKING:
obj: Union[bpy.types.Object, None]
class BIMProjectProperties(PropertyGroup): class BIMProjectProperties(PropertyGroup):
is_editing: BoolProperty(name="Is Editing", default=False) is_editing: BoolProperty(name="Is Editing", default=False)
@@ -238,12 +263,62 @@ class BIMProjectProperties(PropertyGroup):
edited_objs: bpy.props.CollectionProperty(type=EditedObj) edited_objs: bpy.props.CollectionProperty(type=EditedObj)
@property @property
def clipping_planes_objs(self): def clipping_planes_objs(self) -> list[bpy.types.Object]:
return list({cp.obj for cp in self.clipping_planes if cp.obj}) return list({cp.obj for cp in self.clipping_planes if cp.obj})
def get_library_element_index(self, lib_element): def get_library_element_index(self, lib_element: LibraryElement) -> int:
return next((i for i in range(len(self.library_elements)) if self.library_elements[i] == lib_element)) return next((i for i in range(len(self.library_elements)) if self.library_elements[i] == lib_element))
if TYPE_CHECKING:
is_editing: bool
is_loading: bool
mvd: str
author_name: str
author_email: str
organisation_name: str
organisation_email: str
authorisation: str
active_library_element: str
library_breadcrumb: bpy.types.bpy_prop_collection_idprop[StrProperty]
library_elements: bpy.types.bpy_prop_collection_idprop[LibraryElement]
active_library_element_index: int
filter_mode: Literal["NONE", "DECOMPOSITION", "IFC_CLASS", "IFC_TYPE", "WHITELIST", "BLACKLIST"]
total_elements: int
filter_categories: bpy.types.bpy_prop_collection_idprop[FilterCategory]
active_filter_category_index: int
filter_query: str
should_filter_spatial_elements: bool
geometry_library: Literal["opencascade", "cgal", "cgal-simple", "hybrid-cgal-simple-opencascade"]
should_use_cpu_multiprocessing: bool
should_merge_materials_by_colour: bool
should_stream: bool
should_load_geometry: bool
should_clean_mesh: bool
should_cache: bool
deflection_tolerance: float
angular_tolerance: float
void_limit: int
distance_limit: float
false_origin_mode: Literal["AUTOMATIC", "MANUAL", "DISABLED"]
false_origin: str
project_north: str
element_limit_mode: Literal["UNLIMITED", "RANGE"]
element_offset: int
element_limit: int
load_indexed_maps: bool
should_disable_undo_on_save: bool
links: bpy.types.bpy_prop_collection_idprop[Link]
active_link_index: int
export_schema: str
template_file: str
library_file: str
use_relative_project_path: bool
queried_obj: Union[bpy.types.Object, None]
queried_obj_root: Union[bpy.types.Object, None]
clipping_planes: bpy.types.bpy_prop_collection_idprop[ObjProperty]
clipping_planes_active: int
edited_objs: bpy.types.bpy_prop_collection_idprop[EditedObj]
class MeasureToolSettings(PropertyGroup): class MeasureToolSettings(PropertyGroup):
measurement_type_items = [ measurement_type_items = [
@@ -253,3 +328,6 @@ class MeasureToolSettings(PropertyGroup):
] ]
measurement_type: bpy.props.EnumProperty(items=measurement_type_items, default="POLYLINE") measurement_type: bpy.props.EnumProperty(items=measurement_type_items, default="POLYLINE")
if TYPE_CHECKING:
measurement_type: Literal["SINGLE", "POLYLINE", "AREA"]
+16 -1
View File
@@ -16,6 +16,8 @@
# You should have received a copy of the GNU General Public License # You should have received a copy of the GNU General Public License
# along with Bonsai. If not, see <http://www.gnu.org/licenses/>. # along with Bonsai. If not, see <http://www.gnu.org/licenses/>.
from __future__ import annotations
import bpy
import os import os
import bonsai.bim import bonsai.bim
import bonsai.tool as tool import bonsai.tool as tool
@@ -23,6 +25,10 @@ from bonsai.bim.helper import prop_with_search
from bpy.types import Panel, Menu, UIList from bpy.types import Panel, Menu, UIList
from bonsai.bim.ifc import IfcStore from bonsai.bim.ifc import IfcStore
from bonsai.bim.module.project.data import ProjectData, LinksData from bonsai.bim.module.project.data import ProjectData, LinksData
from typing import TYPE_CHECKING
if TYPE_CHECKING:
from bonsai.bim.module.project.prop import LibraryElement, BIMProjectProperties
def file_import_menu(self, context): def file_import_menu(self, context):
@@ -441,7 +447,16 @@ class BIM_PT_links(Panel):
class BIM_UL_library(UIList): class BIM_UL_library(UIList):
def draw_item(self, context, layout, data, item, icon, active_data, active_propname): def draw_item(
self,
context,
layout: bpy.types.UILayout,
data: BIMProjectProperties,
item: LibraryElement,
icon,
active_data,
active_propname,
):
if item: if item:
row = layout.row(align=True) row = layout.row(align=True)
if not item.ifc_definition_id: if not item.ifc_definition_id:
+9 -1
View File
@@ -16,6 +16,7 @@
# You should have received a copy of the GNU General Public License # You should have received a copy of the GNU General Public License
# along with Bonsai. If not, see <http://www.gnu.org/licenses/>. # along with Bonsai. If not, see <http://www.gnu.org/licenses/>.
from __future__ import annotations
import os import os
import bpy import bpy
import ifcopenshell import ifcopenshell
@@ -33,10 +34,17 @@ import bonsai.tool as tool
from bonsai.bim.ifc import IfcStore from bonsai.bim.ifc import IfcStore
from ifcopenshell.api.project.append_asset import APPENDABLE_ASSET_TYPES from ifcopenshell.api.project.append_asset import APPENDABLE_ASSET_TYPES
from pathlib import Path from pathlib import Path
from typing import Optional, Union from typing import Optional, Union, TYPE_CHECKING
if TYPE_CHECKING:
from bonsai.bim.module.project.prop import BIMProjectProperties
class Project(bonsai.core.tool.Project): class Project(bonsai.core.tool.Project):
@classmethod
def get_project_props(cls) -> BIMProjectProperties:
return bpy.context.scene.BIMProjectProperties
@classmethod @classmethod
def append_all_types_from_template(cls, template: str) -> None: def append_all_types_from_template(cls, template: str) -> None:
# TODO refactor # TODO refactor