Replace direct access to IfcStore with tool.Ifc

This commit is contained in:
Andrej730
2025-02-19 12:15:39 +05:00
parent 67bac441ad
commit 43cc7a0304
81 changed files with 228 additions and 271 deletions
+4 -4
View File
@@ -60,7 +60,7 @@ def name_callback(obj: Union[bpy.types.Object, bpy.types.Material], data: str) -
if props.is_renaming: if props.is_renaming:
props.is_renmaing = False props.is_renmaing = False
return return
IfcStore.get_file().by_id(ifc_definition_id).Name = obj.name tool.Ifc.get().by_id(ifc_definition_id).Name = obj.name
refresh_ui_data() refresh_ui_data()
return return
@@ -71,7 +71,7 @@ def name_callback(obj: Union[bpy.types.Object, bpy.types.Material], data: str) -
obj.BIMObjectProperties.is_renaming = False obj.BIMObjectProperties.is_renaming = False
return return
element = IfcStore.get_file().by_id(obj.BIMObjectProperties.ifc_definition_id) element = tool.Ifc.get().by_id(obj.BIMObjectProperties.ifc_definition_id)
if "/" in obj.name: if "/" in obj.name:
object_name = obj.name object_name = obj.name
element_name = obj.name.split("/", 1)[1] element_name = obj.name.split("/", 1)[1]
@@ -231,9 +231,9 @@ def refresh_ui_data():
def loadIfcStore(scene): def loadIfcStore(scene):
IfcStore.purge() IfcStore.purge()
refresh_ui_data() refresh_ui_data()
if not IfcStore.get_file(): if not tool.Ifc.get():
return return
IfcStore.get_schema() tool.Ifc.schema()
IfcStore.relink_all_objects() IfcStore.relink_all_objects()
+2 -2
View File
@@ -27,7 +27,6 @@ import ifcopenshell.util.element
import ifcopenshell.util.unit 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 import bonsai.tool as tool
from bonsai.bim.ifc import IfcStore
from typing import Optional, Callable, Any, Union, Iterable, TYPE_CHECKING from typing import Optional, Callable, Any, Union, Iterable, TYPE_CHECKING
if TYPE_CHECKING: if TYPE_CHECKING:
@@ -119,7 +118,8 @@ def import_attributes(
data: dict[str, Any], data: dict[str, Any],
callback: Optional[ImportCallback] = None, callback: Optional[ImportCallback] = None,
) -> None: ) -> None:
for attribute in IfcStore.get_schema().declaration_by_name(ifc_class).all_attributes(): schema = tool.Ifc.schema()
for attribute in schema.declaration_by_name(ifc_class).all_attributes():
import_attribute(attribute, props, data, callback=callback) import_attribute(attribute, props, data, callback=callback)
+1 -1
View File
@@ -881,7 +881,7 @@ class IfcImporter:
self.ifc_import_settings.logger.info("loading file %s", self.ifc_import_settings.input_file) self.ifc_import_settings.logger.info("loading file %s", self.ifc_import_settings.input_file)
if not bpy.context.scene.BIMProperties.ifc_file: if not bpy.context.scene.BIMProperties.ifc_file:
bpy.context.scene.BIMProperties.ifc_file = self.ifc_import_settings.input_file bpy.context.scene.BIMProperties.ifc_file = self.ifc_import_settings.input_file
self.file = IfcStore.get_file() self.file = tool.Ifc.get()
def calculate_unit_scale(self): def calculate_unit_scale(self):
self.unit_scale = ifcopenshell.util.unit.calculate_unit_scale(self.file) self.unit_scale = ifcopenshell.util.unit.calculate_unit_scale(self.file)
@@ -23,7 +23,6 @@ import ifcopenshell.util.element
import bonsai.tool as tool import bonsai.tool as tool
import bonsai.core.aggregate as core import bonsai.core.aggregate as core
import bonsai.core.spatial import bonsai.core.spatial
from bonsai.bim.ifc import IfcStore
class BIM_OT_aggregate_assign_object(bpy.types.Operator, tool.Ifc.Operator): class BIM_OT_aggregate_assign_object(bpy.types.Operator, tool.Ifc.Operator):
+3 -3
View File
@@ -39,7 +39,7 @@ class BIM_PT_aggregate(Panel):
props = context.active_object.BIMObjectProperties props = context.active_object.BIMObjectProperties
if not props.ifc_definition_id: if not props.ifc_definition_id:
return False return False
if not IfcStore.get_element(props.ifc_definition_id): if not tool.Ifc.get_object_by_identifier(props.ifc_definition_id):
return False return False
if not IfcStore.get_file().by_id(props.ifc_definition_id).is_a("IfcObjectDefinition"): if not IfcStore.get_file().by_id(props.ifc_definition_id).is_a("IfcObjectDefinition"):
return False return False
@@ -120,9 +120,9 @@ class BIM_PT_linked_aggregate(Panel):
props = context.active_object.BIMObjectProperties props = context.active_object.BIMObjectProperties
if not props.ifc_definition_id: if not props.ifc_definition_id:
return False return False
if not IfcStore.get_element(props.ifc_definition_id): if not tool.Ifc.get_object_by_identifier(props.ifc_definition_id):
return False return False
if not IfcStore.get_file().by_id(props.ifc_definition_id).is_a("IfcObjectDefinition"): if not tool.Ifc.get().by_id(props.ifc_definition_id).is_a("IfcObjectDefinition"):
return False return False
return True return True
@@ -26,7 +26,6 @@ import bonsai.bim.helper
import bonsai.tool as tool import bonsai.tool as tool
import bonsai.core.attribute as core import bonsai.core.attribute as core
import bonsai.core.spatial import bonsai.core.spatial
from bonsai.bim.ifc import IfcStore
def get_objs_for_operation(operator_properties, context): def get_objs_for_operation(operator_properties, context):
@@ -117,7 +116,7 @@ class EditAttributes(bpy.types.Operator, tool.Ifc.Operator):
bl_options = {"REGISTER", "UNDO"} bl_options = {"REGISTER", "UNDO"}
def _execute(self, context): def _execute(self, context):
self.file = IfcStore.get_file() self.file = tool.Ifc.get()
obj = tool.Blender.get_active_object(is_selected=False) obj = tool.Blender.get_active_object(is_selected=False)
if not (element := tool.Ifc.get_entity(obj)): if not (element := tool.Ifc.get_entity(obj)):
return return
@@ -17,7 +17,6 @@
# along with Bonsai. If not, see <http://www.gnu.org/licenses/>. # along with Bonsai. If not, see <http://www.gnu.org/licenses/>.
import bpy import bpy
from bonsai.bim.ifc import IfcStore
from bonsai.bim.prop import StrProperty, Attribute from bonsai.bim.prop import StrProperty, Attribute
from bpy.types import PropertyGroup from bpy.types import PropertyGroup
from bpy.props import ( from bpy.props import (
@@ -18,7 +18,6 @@
import bonsai.bim.helper import bonsai.bim.helper
from bpy.types import Panel from bpy.types import Panel
from bonsai.bim.ifc import IfcStore
from bonsai.bim.module.attribute.data import AttributesData from bonsai.bim.module.attribute.data import AttributesData
import bonsai.tool as tool import bonsai.tool as tool
+4 -5
View File
@@ -43,7 +43,6 @@ import bonsai.tool as tool
import bonsai.bim.module.bcf.prop as bcf_prop import bonsai.bim.module.bcf.prop as bcf_prop
import bonsai.bim.module.bcf.bcfstore as bcfstore import bonsai.bim.module.bcf.bcfstore as bcfstore
from pathlib import Path from pathlib import Path
from bonsai.bim.ifc import IfcStore
from math import radians, degrees, atan, tan, cos, sin from math import radians, degrees, atan, tan, cos, sin
from mathutils import Vector, Matrix, Euler, geometry from mathutils import Vector, Matrix, Euler, geometry
from xsdata.models.datatype import XmlDateTime from xsdata.models.datatype import XmlDateTime
@@ -1206,7 +1205,7 @@ class ActivateBcfViewpoint(bpy.types.Operator):
return True return True
def execute(self, context): def execute(self, context):
self.file = IfcStore.get_file() self.file = tool.Ifc.get()
bcfxml = bcfstore.BcfStore.get_bcfxml() bcfxml = bcfstore.BcfStore.get_bcfxml()
assert bcfxml assert bcfxml
@@ -1355,7 +1354,7 @@ class ActivateBcfViewpoint(bpy.types.Operator):
objs: list[bpy.types.Object] = [] objs: list[bpy.types.Object] = []
for global_id in exception_global_ids: for global_id in exception_global_ids:
obj = IfcStore.get_element(global_id) obj = tool.Ifc.get_object_by_identifier(global_id)
if obj and context.view_layer.objects.get(obj.name): if obj and context.view_layer.objects.get(obj.name):
assert isinstance(obj, bpy.types.Object) assert isinstance(obj, bpy.types.Object)
objs.append(obj) objs.append(obj)
@@ -1414,7 +1413,7 @@ class ActivateBcfViewpoint(bpy.types.Operator):
return return
bpy.ops.object.select_all(action="DESELECT") bpy.ops.object.select_all(action="DESELECT")
for global_id in selected_global_ids: for global_id in selected_global_ids:
obj = IfcStore.get_element(global_id) obj = tool.Ifc.get_object_by_identifier(global_id)
if obj: if obj:
obj.select_set(True) obj.select_set(True)
obj.hide_set(False) obj.hide_set(False)
@@ -1427,7 +1426,7 @@ class ActivateBcfViewpoint(bpy.types.Operator):
for acomponent in acoloring.component: for acomponent in acoloring.component:
global_id_colours.setdefault(acomponent.ifc_guid, acoloring.color) global_id_colours.setdefault(acomponent.ifc_guid, acoloring.color)
for global_id, color in global_id_colours.items(): for global_id, color in global_id_colours.items():
obj = IfcStore.get_element(global_id) obj = tool.Ifc.get_object_by_identifier(global_id)
if obj: if obj:
obj.color = self.hex_to_rgb(color) obj.color = self.hex_to_rgb(color)
+4 -5
View File
@@ -18,7 +18,6 @@
import bpy import bpy
from bpy.types import Panel, UIList from bpy.types import Panel, UIList
from bonsai.bim.ifc import IfcStore
import bonsai.tool as tool import bonsai.tool as tool
from bonsai.bim.module.boundary.data import SpaceBoundariesData from bonsai.bim.module.boundary.data import SpaceBoundariesData
@@ -34,7 +33,7 @@ class BIM_PT_SceneBoundaries(Panel):
@classmethod @classmethod
def poll(cls, context): def poll(cls, context):
return IfcStore.get_file() return tool.Ifc.get()
def draw(self, context): def draw(self, context):
row = self.layout.row(align=True) row = self.layout.row(align=True)
@@ -58,9 +57,9 @@ class BIM_PT_Boundary(Panel):
props = context.active_object.BIMObjectProperties props = context.active_object.BIMObjectProperties
if not props.ifc_definition_id: if not props.ifc_definition_id:
return False return False
if not IfcStore.get_element(props.ifc_definition_id): if not tool.Ifc.get_object_by_identifier(props.ifc_definition_id):
return False return False
entity = IfcStore.get_file().by_id(props.ifc_definition_id) entity = tool.Ifc.get().by_id(props.ifc_definition_id)
return entity.is_a("IfcRelSpaceBoundary") return entity.is_a("IfcRelSpaceBoundary")
def draw(self, context): def draw(self, context):
@@ -134,7 +133,7 @@ class BIM_PT_SpaceBoundaries(Panel):
props = context.active_object.BIMObjectProperties props = context.active_object.BIMObjectProperties
if not props.ifc_definition_id: if not props.ifc_definition_id:
return False return False
if not IfcStore.get_element(props.ifc_definition_id): if not tool.Ifc.get_object_by_identifier(props.ifc_definition_id):
return False return False
element = tool.Ifc.get_entity(context.active_object) element = tool.Ifc.get_entity(context.active_object)
for ifc_class in ("IfcSpace", "IfcExternalSpatialElement"): for ifc_class in ("IfcSpace", "IfcExternalSpatialElement"):
-1
View File
@@ -18,7 +18,6 @@
import bonsai.tool as tool import bonsai.tool as tool
from bpy.types import Panel, UIList from bpy.types import Panel, UIList
from bonsai.bim.ifc import IfcStore
class BIM_PT_bsdd(Panel): class BIM_PT_bsdd(Panel):
@@ -300,7 +300,7 @@ class SelectIfcClashResults(bpy.types.Operator):
def execute(self, context): def execute(self, context):
# TODO refactor into new clash results system # TODO refactor into new clash results system
self.file = IfcStore.get_file() self.file = tool.Ifc.get()
self.filepath = bpy.path.ensure_ext(self.filepath, ".json") self.filepath = bpy.path.ensure_ext(self.filepath, ".json")
with open(self.filepath) as f: with open(self.filepath) as f:
clash_sets = json.load(f) clash_sets = json.load(f)
@@ -478,7 +478,7 @@ class SelectSmartGroup(bpy.types.Operator):
@classmethod @classmethod
def poll(cls, context): def poll(cls, context):
return IfcStore.get_file() and context.visible_objects and context.scene.BIMClashProperties.active_smart_group return tool.Ifc.get() and context.visible_objects and context.scene.BIMClashProperties.active_smart_group
def execute(self, context): def execute(self, context):
selected_smart_group = context.scene.BIMClashProperties.active_smart_group selected_smart_group = context.scene.BIMClashProperties.active_smart_group
@@ -240,7 +240,7 @@ class RemoveClassification(bpy.types.Operator, tool.Ifc.Operator):
classification: bpy.props.IntProperty() classification: bpy.props.IntProperty()
def _execute(self, context): def _execute(self, context):
self.file = IfcStore.get_file() self.file = tool.Ifc.get()
ifcopenshell.api.run( ifcopenshell.api.run(
"classification.remove_classification", "classification.remove_classification",
tool.Ifc.get(), tool.Ifc.get(),
@@ -21,7 +21,6 @@ import bonsai.bim.helper
import bonsai.tool as tool import bonsai.tool as tool
import bonsai.bim.module.classification.prop as classification_prop import bonsai.bim.module.classification.prop as classification_prop
from bpy.types import Panel, UIList from bpy.types import Panel, UIList
from bonsai.bim.ifc import IfcStore
from bonsai.bim.module.classification.data import ( from bonsai.bim.module.classification.data import (
ClassificationsData, ClassificationsData,
ClassificationReferencesData, ClassificationReferencesData,
@@ -124,7 +123,7 @@ class ReferenceUI:
self.sprops = context.scene.BIMClassificationProperties self.sprops = context.scene.BIMClassificationProperties
self.bprops = context.scene.BIMBSDDProperties self.bprops = context.scene.BIMBSDDProperties
self.props = context.scene.BIMClassificationReferenceProperties self.props = context.scene.BIMClassificationReferenceProperties
self.file = IfcStore.get_file() self.file = tool.Ifc.get()
self.draw_add_ui(context) self.draw_add_ui(context)
@@ -23,7 +23,6 @@ import ifcopenshell.api.constraint
import ifcopenshell.util.attribute import ifcopenshell.util.attribute
import bonsai.bim.helper import bonsai.bim.helper
import bonsai.tool as tool import bonsai.tool as tool
from bonsai.bim.ifc import IfcStore
class LoadObjectives(bpy.types.Operator): class LoadObjectives(bpy.types.Operator):
@@ -84,7 +83,7 @@ class AddObjective(bpy.types.Operator, tool.Ifc.Operator):
bl_options = {"REGISTER", "UNDO"} bl_options = {"REGISTER", "UNDO"}
def _execute(self, context): def _execute(self, context):
result = ifcopenshell.api.run("constraint.add_objective", IfcStore.get_file()) result = ifcopenshell.api.run("constraint.add_objective", tool.Ifc.get())
bpy.ops.bim.load_objectives() bpy.ops.bim.load_objectives()
bpy.ops.bim.enable_editing_constraint(constraint=result.id()) bpy.ops.bim.enable_editing_constraint(constraint=result.id())
return {"FINISHED"} return {"FINISHED"}
@@ -116,7 +115,7 @@ class RemoveConstraint(bpy.types.Operator, tool.Ifc.Operator):
def _execute(self, context): def _execute(self, context):
props = context.scene.BIMConstraintProperties props = context.scene.BIMConstraintProperties
self.file = IfcStore.get_file() self.file = tool.Ifc.get()
ifcopenshell.api.run( ifcopenshell.api.run(
"constraint.remove_constraint", self.file, **{"constraint": self.file.by_id(self.constraint)} "constraint.remove_constraint", self.file, **{"constraint": self.file.by_id(self.constraint)}
) )
@@ -16,8 +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/>.
import bonsai.tool as tool
from bpy.types import Panel, UIList from bpy.types import Panel, UIList
from bonsai.bim.ifc import IfcStore
from bonsai.bim.helper import draw_attributes from bonsai.bim.helper import draw_attributes
from bonsai.bim.module.constraint.data import ConstraintsData, ObjectConstraintsData from bonsai.bim.module.constraint.data import ConstraintsData, ObjectConstraintsData
@@ -33,7 +33,7 @@ class BIM_PT_constraints(Panel):
@classmethod @classmethod
def poll(cls, context): def poll(cls, context):
return IfcStore.get_file() return tool.Ifc.get()
def draw(self, context): def draw(self, context):
if not ConstraintsData.is_loaded: if not ConstraintsData.is_loaded:
@@ -81,7 +81,7 @@ class BIM_PT_object_constraints(Panel):
def poll(cls, context): def poll(cls, context):
if not context.active_object: if not context.active_object:
return False return False
if not IfcStore.get_element(context.active_object.BIMObjectProperties.ifc_definition_id): if not tool.Ifc.get_object_by_identifier(context.active_object.BIMObjectProperties.ifc_definition_id):
return False return False
return bool(context.active_object.BIMObjectProperties.ifc_definition_id) return bool(context.active_object.BIMObjectProperties.ifc_definition_id)
@@ -93,7 +93,7 @@ class BIM_PT_object_constraints(Panel):
self.oprops = obj.BIMObjectProperties self.oprops = obj.BIMObjectProperties
self.sprops = context.scene.BIMConstraintProperties self.sprops = context.scene.BIMConstraintProperties
self.props = obj.BIMObjectConstraintProperties self.props = obj.BIMObjectConstraintProperties
self.file = IfcStore.get_file() self.file = tool.Ifc.get()
self.draw_add_ui() self.draw_add_ui()
+2 -3
View File
@@ -19,7 +19,6 @@
import bpy import bpy
import ifcopenshell.api import ifcopenshell.api
import bonsai.tool as tool import bonsai.tool as tool
from bonsai.bim.ifc import IfcStore
from bonsai.bim.module.classification.data import CostClassificationsData from bonsai.bim.module.classification.data import CostClassificationsData
from bonsai.bim.module.cost.data import CostSchedulesData, CostItemRatesData, CostItemQuantitiesData from bonsai.bim.module.cost.data import CostSchedulesData, CostItemRatesData, CostItemQuantitiesData
from bonsai.bim.prop import StrProperty, Attribute from bonsai.bim.prop import StrProperty, Attribute
@@ -83,7 +82,7 @@ def update_cost_item_identification(self, context):
props = context.scene.BIMCostProperties props = context.scene.BIMCostProperties
if not props.is_cost_update_enabled or self.identification == "XXX": if not props.is_cost_update_enabled or self.identification == "XXX":
return return
self.file = IfcStore.get_file() self.file = tool.Ifc.get()
ifcopenshell.api.run( ifcopenshell.api.run(
"cost.edit_cost_item", "cost.edit_cost_item",
self.file, self.file,
@@ -98,7 +97,7 @@ def update_cost_item_name(self, context):
props = context.scene.BIMCostProperties props = context.scene.BIMCostProperties
if not props.is_cost_update_enabled or self.name == "Unnamed": if not props.is_cost_update_enabled or self.name == "Unnamed":
return return
self.file = IfcStore.get_file() self.file = tool.Ifc.get()
ifcopenshell.api.run( ifcopenshell.api.run(
"cost.edit_cost_item", "cost.edit_cost_item",
self.file, self.file,
+1 -2
View File
@@ -21,7 +21,6 @@ import bonsai.bim.helper
import bonsai.bim.module.cost.prop as CostProp import bonsai.bim.module.cost.prop as CostProp
import bonsai.tool as tool import bonsai.tool as tool
from bpy.types import Panel, UIList from bpy.types import Panel, UIList
from bonsai.bim.ifc import IfcStore
from bonsai.bim.module.cost.data import CostSchedulesData from bonsai.bim.module.cost.data import CostSchedulesData
from typing import Any from typing import Any
@@ -37,7 +36,7 @@ class BIM_PT_cost_schedules(Panel):
@classmethod @classmethod
def poll(cls, context): def poll(cls, context):
file = IfcStore.get_file() file = tool.Ifc.get()
return file and hasattr(file, "schema") and file.schema != "IFC2X3" return file and hasattr(file, "schema") and file.schema != "IFC2X3"
def draw(self, context): def draw(self, context):
@@ -20,8 +20,8 @@ import bpy
import json import json
import ifcopenshell import ifcopenshell
import ifcopenshell.util.element import ifcopenshell.util.element
import bonsai.tool as tool
from math import degrees, atan2 from math import degrees, atan2
from bonsai.bim.ifc import IfcStore
from .api import Api from .api import Api
@@ -92,7 +92,7 @@ class RunAnalysis(bpy.types.Operator):
bl_label = "Run Analysis" bl_label = "Run Analysis"
def execute(self, context): def execute(self, context):
self.file = IfcStore.get_file() self.file = tool.Ifc.get()
self.inputs = { self.inputs = {
"floors": [], "floors": [],
"walls": [], "walls": [],
+2 -3
View File
@@ -27,7 +27,6 @@ import ifcopenshell
import ifcopenshell.util.selector import ifcopenshell.util.selector
import bonsai.tool as tool import bonsai.tool as tool
import bonsai.bim.module.drawing.scheduler as scheduler import bonsai.bim.module.drawing.scheduler as scheduler
from bonsai.bim.ifc import IfcStore
from bonsai.bim.handler import refresh_ui_data from bonsai.bim.handler import refresh_ui_data
from typing import TYPE_CHECKING from typing import TYPE_CHECKING
from collections import Counter from collections import Counter
@@ -212,7 +211,7 @@ class ExportIfcCsv(bpy.types.Operator):
props = context.scene.CsvProperties props = context.scene.CsvProperties
self.filepath = bpy.path.ensure_ext(self.filepath, f".{props.format}") self.filepath = bpy.path.ensure_ext(self.filepath, f".{props.format}")
if props.should_load_from_memory: if props.should_load_from_memory:
ifc_file = IfcStore.get_file() ifc_file = tool.Ifc.get()
else: else:
ifc_file = ifcopenshell.open(props.csv_ifc_file) ifc_file = ifcopenshell.open(props.csv_ifc_file)
results = ifcopenshell.util.selector.filter_elements( results = ifcopenshell.util.selector.filter_elements(
@@ -314,7 +313,7 @@ class ImportIfcCsv(bpy.types.Operator, tool.Ifc.Operator):
props = context.scene.CsvProperties props = context.scene.CsvProperties
if props.should_load_from_memory: if props.should_load_from_memory:
ifc_file = IfcStore.get_file() ifc_file = tool.Ifc.get()
else: else:
ifc_file = ifcopenshell.open(props.csv_ifc_file) ifc_file = ifcopenshell.open(props.csv_ifc_file)
ifc_csv = ifccsv.IfcCsv() ifc_csv = ifccsv.IfcCsv()
+3 -3
View File
@@ -17,8 +17,8 @@
# along with Bonsai. If not, see <http://www.gnu.org/licenses/>. # along with Bonsai. If not, see <http://www.gnu.org/licenses/>.
import bonsai.bim.helper import bonsai.bim.helper
import bonsai.tool as tool
from bpy.types import Panel from bpy.types import Panel
from bonsai.bim.ifc import IfcStore
from bonsai.bim.module.search.data import SearchData from bonsai.bim.module.search.data import SearchData
@@ -37,7 +37,7 @@ class BIM_PT_ifccsv(Panel):
scene = context.scene scene = context.scene
props = scene.CsvProperties props = scene.CsvProperties
if IfcStore.get_file(): if tool.Ifc.get():
row = layout.row(align=True) row = layout.row(align=True)
row.prop(props, "should_load_from_memory") row.prop(props, "should_load_from_memory")
row.operator("bim.import_csv_attributes", icon="IMPORT", text="") row.operator("bim.import_csv_attributes", icon="IMPORT", text="")
@@ -49,7 +49,7 @@ class BIM_PT_ifccsv(Panel):
row.operator("bim.export_csv_attributes", icon="EXPORT", text="") row.operator("bim.export_csv_attributes", icon="EXPORT", text="")
row.prop(props, "should_show_settings", icon="PREFERENCES", text="") row.prop(props, "should_show_settings", icon="PREFERENCES", text="")
if not IfcStore.get_file() or not props.should_load_from_memory: if not tool.Ifc.get() or not props.should_load_from_memory:
row = layout.row(align=True) row = layout.row(align=True)
row.prop(props, "csv_ifc_file") row.prop(props, "csv_ifc_file")
row.operator("bim.select_csv_ifc_file", icon="FILE_FOLDER", text="") row.operator("bim.select_csv_ifc_file", icon="FILE_FOLDER", text="")
@@ -78,10 +78,10 @@ class PrintIfcFile(bpy.types.Operator):
@classmethod @classmethod
def poll(cls, context): def poll(cls, context):
return IfcStore.get_file() return tool.Ifc.get()
def execute(self, context): def execute(self, context):
print(IfcStore.get_file().wrapped_data.to_string()) print(tool.Ifc.get().wrapped_data.to_string())
return {"FINISHED"} return {"FINISHED"}
@@ -184,10 +184,10 @@ class CreateAllShapes(bpy.types.Operator):
@classmethod @classmethod
def poll(cls, context): def poll(cls, context):
return IfcStore.get_file() return tool.Ifc.get()
def execute(self, context): def execute(self, context):
self.file = IfcStore.get_file() self.file = tool.Ifc.get()
elements = self.file.by_type("IfcElement") + self.file.by_type("IfcSpace") elements = self.file.by_type("IfcElement") + self.file.by_type("IfcSpace")
total = len(elements) total = len(elements)
@@ -328,10 +328,10 @@ class InspectFromStepId(bpy.types.Operator):
@classmethod @classmethod
def poll(cls, context): def poll(cls, context):
return IfcStore.get_file() return tool.Ifc.get()
def execute(self, context): def execute(self, context):
self.file = IfcStore.get_file() self.file = tool.Ifc.get()
debug_props = tool.Debug.get_debug_props() debug_props = tool.Debug.get_debug_props()
debug_props.active_step_id = self.step_id debug_props.active_step_id = self.step_id
crumb = debug_props.step_id_breadcrumb.add() crumb = debug_props.step_id_breadcrumb.add()
@@ -422,7 +422,7 @@ class PrintObjectPlacement(bpy.types.Operator):
return self.execute(context) return self.execute(context)
def execute(self, context): def execute(self, context):
placement = ifcopenshell.util.placement.get_local_placement(IfcStore.get_file().by_id(self.step_id)) placement = ifcopenshell.util.placement.get_local_placement(tool.Ifc.get().by_id(self.step_id))
if self.create_empty_object: if self.create_empty_object:
bpy.ops.object.empty_add(type="ARROWS") bpy.ops.object.empty_add(type="ARROWS")
si_conversion = ifcopenshell.util.unit.calculate_unit_scale(tool.Ifc.get()) si_conversion = ifcopenshell.util.unit.calculate_unit_scale(tool.Ifc.get())
-1
View File
@@ -17,7 +17,6 @@
# along with Bonsai. If not, see <http://www.gnu.org/licenses/>. # along with Bonsai. If not, see <http://www.gnu.org/licenses/>.
from bpy.types import Panel from bpy.types import Panel
from bonsai.bim.ifc import IfcStore
from bonsai.bim.module.diff.data import DiffData from bonsai.bim.module.diff.data import DiffData
import bonsai.bim.helper import bonsai.bim.helper
import bonsai.tool as tool import bonsai.tool as tool
@@ -24,7 +24,6 @@ import ifcopenshell.util.element
import bonsai.bim.handler import bonsai.bim.handler
import bonsai.tool as tool import bonsai.tool as tool
import bonsai.core.document as core import bonsai.core.document as core
from bonsai.bim.ifc import IfcStore
class LoadProjectDocuments(bpy.types.Operator): class LoadProjectDocuments(bpy.types.Operator):
+4 -4
View File
@@ -16,8 +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/>.
import bonsai.tool as tool
from bpy.types import Panel, UIList from bpy.types import Panel, UIList
from bonsai.bim.ifc import IfcStore
from bonsai.bim.helper import draw_attributes from bonsai.bim.helper import draw_attributes
from bonsai.bim.module.document.data import DocumentData, ObjectDocumentData from bonsai.bim.module.document.data import DocumentData, ObjectDocumentData
@@ -33,7 +33,7 @@ class BIM_PT_documents(Panel):
@classmethod @classmethod
def poll(cls, context): def poll(cls, context):
return IfcStore.get_file() return tool.Ifc.get()
def draw(self, context): def draw(self, context):
if not DocumentData.is_loaded: if not DocumentData.is_loaded:
@@ -92,7 +92,7 @@ class BIM_PT_object_documents(Panel):
def poll(cls, context): def poll(cls, context):
if not context.active_object: if not context.active_object:
return False return False
if not IfcStore.get_element(context.active_object.BIMObjectProperties.ifc_definition_id): if not tool.Ifc.get_object_by_identifier(context.active_object.BIMObjectProperties.ifc_definition_id):
return False return False
return bool(context.active_object.BIMObjectProperties.ifc_definition_id) return bool(context.active_object.BIMObjectProperties.ifc_definition_id)
@@ -103,7 +103,7 @@ class BIM_PT_object_documents(Panel):
obj = context.active_object obj = context.active_object
self.oprops = obj.BIMObjectProperties self.oprops = obj.BIMObjectProperties
self.props = context.scene.BIMDocumentProperties self.props = context.scene.BIMDocumentProperties
self.file = IfcStore.get_file() self.file = tool.Ifc.get()
self.draw_add_ui() self.draw_add_ui()
@@ -261,7 +261,7 @@ class CreateDrawing(bpy.types.Operator):
self.camera = context.scene.camera self.camera = context.scene.camera
self.camera_element = tool.Ifc.get_entity(self.camera) self.camera_element = tool.Ifc.get_entity(self.camera)
self.camera_document = tool.Drawing.get_drawing_document(self.camera_element) self.camera_document = tool.Drawing.get_drawing_document(self.camera_element)
self.file = IfcStore.get_file() self.file = tool.Ifc.get()
with profile("Drawing generation process"): with profile("Drawing generation process"):
with profile("Initialize drawing generation process"): with profile("Initialize drawing generation process"):
+2 -3
View File
@@ -18,7 +18,6 @@
import bonsai.tool as tool import bonsai.tool as tool
from bpy.types import Panel from bpy.types import Panel
from bonsai.bim.ifc import IfcStore
from bonsai.bim.module.fm.data import FMData from bonsai.bim.module.fm.data import FMData
@@ -40,11 +39,11 @@ class BIM_PT_fm(Panel):
scene = context.scene scene = context.scene
props = scene.BIMFMProperties props = scene.BIMFMProperties
if IfcStore.get_file(): if tool.Ifc.get():
row = layout.row() row = layout.row()
row.prop(props, "should_load_from_memory") row.prop(props, "should_load_from_memory")
if not IfcStore.get_file() or not props.should_load_from_memory: if not tool.Ifc.get() or not props.should_load_from_memory:
row = layout.row() row = layout.row()
props.ifc_files.layout_file_select(row, "*.ifc;*.ifczip;*.ifcxml", "IFC File(s)") props.ifc_files.layout_file_select(row, "*.ifc;*.ifczip;*.ifcxml", "IFC File(s)")
@@ -609,7 +609,7 @@ class UpdateParametricRepresentation(bpy.types.Operator):
return (obj := context.active_object) and obj.mode == "OBJECT" and tool.Geometry.has_mesh_properties(obj.data) return (obj := context.active_object) and obj.mode == "OBJECT" and tool.Geometry.has_mesh_properties(obj.data)
def execute(self, context): def execute(self, context):
self.file = IfcStore.get_file() self.file = tool.Ifc.get()
obj = context.active_object obj = context.active_object
assert obj and tool.Geometry.has_mesh_properties(obj.data) assert obj and tool.Geometry.has_mesh_properties(obj.data)
props = tool.Geometry.get_mesh_props(obj.data) props = tool.Geometry.get_mesh_props(obj.data)
@@ -834,7 +834,7 @@ class OverrideOutlinerDelete(bpy.types.Operator):
# unintended IFC spatial modifications. To make life less confusing for # unintended IFC spatial modifications. To make life less confusing for
# the user, Delete means Delete. End of story. # the user, Delete means Delete. End of story.
# Deep magick from the dawn of time # Deep magick from the dawn of time
if IfcStore.get_file(): if tool.Ifc.get():
return IfcStore.execute_ifc_operator(self, context) return IfcStore.execute_ifc_operator(self, context)
# https://blender.stackexchange.com/questions/203729/python-get-selected-objects-in-outliner # https://blender.stackexchange.com/questions/203729/python-get-selected-objects-in-outliner
objects_to_delete = set() objects_to_delete = set()
@@ -958,7 +958,7 @@ class OverrideDuplicateMove(bpy.types.Operator):
@staticmethod @staticmethod
def execute_duplicate_operator(self, context, linked=False): def execute_duplicate_operator(self, context, linked=False):
# Deep magick from the dawn of time # Deep magick from the dawn of time
if IfcStore.get_file(): if tool.Ifc.get():
IfcStore.execute_ifc_operator(self, context) IfcStore.execute_ifc_operator(self, context)
if self.new_active_obj: if self.new_active_obj:
context.view_layer.objects.active = self.new_active_obj context.view_layer.objects.active = self.new_active_obj
@@ -3218,7 +3218,7 @@ class OverrideMove(bpy.types.Operator):
def execute(self, context): def execute(self, context):
# Deep magick from the dawn of time # Deep magick from the dawn of time
if IfcStore.get_file(): if tool.Ifc.get():
IfcStore.execute_ifc_operator(self, context) IfcStore.execute_ifc_operator(self, context)
if self.new_active_obj: if self.new_active_obj:
context.view_layer.objects.active = self.new_active_obj context.view_layer.objects.active = self.new_active_obj
+2 -3
View File
@@ -20,7 +20,6 @@ import bpy
import bonsai.bim import bonsai.bim
import bonsai.tool as tool import bonsai.tool as tool
from bpy.types import Panel, Menu, UIList from bpy.types import Panel, Menu, UIList
from bonsai.bim.ifc import IfcStore
from bonsai.bim.helper import prop_with_search from bonsai.bim.helper import prop_with_search
from bonsai.bim.module.geometry.data import ( from bonsai.bim.module.geometry.data import (
RepresentationsData, RepresentationsData,
@@ -337,9 +336,9 @@ class BIM_PT_connections(Panel):
def poll(cls, context): def poll(cls, context):
if not context.active_object: if not context.active_object:
return False return False
if not IfcStore.get_element(context.active_object.BIMObjectProperties.ifc_definition_id): if not tool.Ifc.get_object_by_identifier(context.active_object.BIMObjectProperties.ifc_definition_id):
return False return False
return IfcStore.get_file() return tool.Ifc.get()
def draw(self, context): def draw(self, context):
if not ConnectionsData.is_loaded: if not ConnectionsData.is_loaded:
@@ -22,7 +22,6 @@ import ifcopenshell.api.group
import ifcopenshell.util.attribute import ifcopenshell.util.attribute
import bonsai.bim.helper import bonsai.bim.helper
import bonsai.tool as tool import bonsai.tool as tool
from bonsai.bim.ifc import IfcStore
import json import json
@@ -129,8 +128,7 @@ class RemoveGroup(bpy.types.Operator, tool.Ifc.Operator):
group: bpy.props.IntProperty() group: bpy.props.IntProperty()
def _execute(self, context): def _execute(self, context):
props = context.scene.BIMGroupProperties self.file = tool.Ifc.get()
self.file = IfcStore.get_file()
ifcopenshell.api.run("group.remove_group", self.file, **{"group": self.file.by_id(self.group)}) ifcopenshell.api.run("group.remove_group", self.file, **{"group": self.file.by_id(self.group)})
bpy.ops.bim.load_groups() bpy.ops.bim.load_groups()
return {"FINISHED"} return {"FINISHED"}
+3 -3
View File
@@ -17,8 +17,8 @@
# along with Bonsai. If not, see <http://www.gnu.org/licenses/>. # along with Bonsai. If not, see <http://www.gnu.org/licenses/>.
import bpy import bpy
import bonsai.tool as tool
from bpy.types import Panel, UIList from bpy.types import Panel, UIList
from bonsai.bim.ifc import IfcStore
from bonsai.bim.helper import draw_attributes from bonsai.bim.helper import draw_attributes
from bonsai.bim.module.group.data import GroupsData, ObjectGroupsData from bonsai.bim.module.group.data import GroupsData, ObjectGroupsData
@@ -34,7 +34,7 @@ class BIM_PT_groups(Panel):
@classmethod @classmethod
def poll(cls, context): def poll(cls, context):
return IfcStore.get_file() return tool.Ifc.get()
def draw(self, context): def draw(self, context):
if not GroupsData.is_loaded: if not GroupsData.is_loaded:
@@ -93,7 +93,7 @@ class BIM_PT_object_groups(Panel):
def poll(cls, context): def poll(cls, context):
if not context.active_object: if not context.active_object:
return False return False
return IfcStore.get_file() and context.active_object.BIMObjectProperties.ifc_definition_id return tool.Ifc.get() and context.active_object.BIMObjectProperties.ifc_definition_id
def draw(self, context): def draw(self, context):
if not ObjectGroupsData.is_loaded: if not ObjectGroupsData.is_loaded:
@@ -24,7 +24,6 @@ import ifcopenshell.util.element
import ifcopenshell.util.attribute import ifcopenshell.util.attribute
import bonsai.bim.helper import bonsai.bim.helper
import bonsai.tool as tool import bonsai.tool as tool
from bonsai.bim.ifc import IfcStore
class LoadLayers(bpy.types.Operator): class LoadLayers(bpy.types.Operator):
@@ -33,7 +32,7 @@ class LoadLayers(bpy.types.Operator):
bl_options = {"REGISTER", "UNDO"} bl_options = {"REGISTER", "UNDO"}
def execute(self, context): def execute(self, context):
self.file = IfcStore.get_file() self.file = tool.Ifc.get()
props = context.scene.BIMLayerProperties props = context.scene.BIMLayerProperties
props.layers.clear() props.layers.clear()
for layer in tool.Ifc.get().by_type("IfcPresentationLayerAssignment"): for layer in tool.Ifc.get().by_type("IfcPresentationLayerAssignment"):
@@ -126,7 +125,7 @@ class RemovePresentationLayer(bpy.types.Operator, tool.Ifc.Operator):
def _execute(self, context): def _execute(self, context):
props = context.scene.BIMLayerProperties props = context.scene.BIMLayerProperties
self.file = IfcStore.get_file() self.file = tool.Ifc.get()
ifcopenshell.api.run("layer.remove_layer", self.file, **{"layer": self.file.by_id(self.layer)}) ifcopenshell.api.run("layer.remove_layer", self.file, **{"layer": self.file.by_id(self.layer)})
bpy.ops.bim.load_layers() bpy.ops.bim.load_layers()
return {"FINISHED"} return {"FINISHED"}
@@ -142,7 +141,7 @@ class AssignPresentationLayer(bpy.types.Operator, tool.Ifc.Operator):
def _execute(self, context): def _execute(self, context):
item = bpy.data.meshes.get(self.item) if self.item else context.active_object.data item = bpy.data.meshes.get(self.item) if self.item else context.active_object.data
self.file = IfcStore.get_file() self.file = tool.Ifc.get()
ifcopenshell.api.run( ifcopenshell.api.run(
"layer.assign_layer", "layer.assign_layer",
self.file, self.file,
+2 -2
View File
@@ -17,8 +17,8 @@
# along with Bonsai. If not, see <http://www.gnu.org/licenses/>. # along with Bonsai. If not, see <http://www.gnu.org/licenses/>.
import bpy import bpy
import bonsai.tool as tool
from bpy.types import Panel, UIList, Mesh from bpy.types import Panel, UIList, Mesh
from bonsai.bim.ifc import IfcStore
from bonsai.bim.helper import draw_attributes from bonsai.bim.helper import draw_attributes
from bonsai.bim.module.layer.data import LayersData from bonsai.bim.module.layer.data import LayersData
@@ -34,7 +34,7 @@ class BIM_PT_layers(Panel):
@classmethod @classmethod
def poll(cls, context): def poll(cls, context):
return IfcStore.get_file() return tool.Ifc.get()
def draw(self, context): def draw(self, context):
if not LayersData.is_loaded: if not LayersData.is_loaded:
@@ -29,7 +29,6 @@ import bonsai.tool as tool
import bonsai.core.style import bonsai.core.style
import bonsai.core.material as core import bonsai.core.material as core
import bonsai.bim.module.model.profile as model_profile import bonsai.bim.module.model.profile as model_profile
from bonsai.bim.ifc import IfcStore
from typing import Any, Union, TYPE_CHECKING from typing import Any, Union, TYPE_CHECKING
from bonsai.bim.module.model import wall, slab from bonsai.bim.module.model import wall, slab
@@ -118,7 +117,7 @@ class AssignParameterizedProfile(bpy.types.Operator, tool.Ifc.Operator):
def _execute(self, context): def _execute(self, context):
obj = bpy.data.objects.get(self.obj) if self.obj else context.active_object obj = bpy.data.objects.get(self.obj) if self.obj else context.active_object
self.file = IfcStore.get_file() self.file = tool.Ifc.get()
profile = ifcopenshell.api.run( profile = ifcopenshell.api.run(
"profile.add_parameterized_profile", "profile.add_parameterized_profile",
self.file, self.file,
@@ -292,7 +291,7 @@ class AddConstituent(bpy.types.Operator, tool.Ifc.Operator):
def _execute(self, context): def _execute(self, context):
obj = bpy.data.objects.get(self.obj) if self.obj else context.active_object obj = bpy.data.objects.get(self.obj) if self.obj else context.active_object
self.file = IfcStore.get_file() self.file = tool.Ifc.get()
ifcopenshell.api.run( ifcopenshell.api.run(
"material.add_constituent", "material.add_constituent",
self.file, self.file,
@@ -328,7 +327,7 @@ class AddProfile(bpy.types.Operator, tool.Ifc.Operator):
def _execute(self, context): def _execute(self, context):
obj = bpy.data.objects.get(self.obj) if self.obj else context.active_object obj = bpy.data.objects.get(self.obj) if self.obj else context.active_object
self.file = IfcStore.get_file() self.file = tool.Ifc.get()
props = tool.Material.get_material_props() props = tool.Material.get_material_props()
ifcopenshell.api.run( ifcopenshell.api.run(
"material.add_profile", "material.add_profile",
@@ -387,7 +386,7 @@ class ReorderMaterialSetItem(bpy.types.Operator, tool.Ifc.Operator):
def _execute(self, context): def _execute(self, context):
obj = bpy.data.objects.get(self.obj) if self.obj else context.active_object obj = bpy.data.objects.get(self.obj) if self.obj else context.active_object
self.file = IfcStore.get_file() self.file = tool.Ifc.get()
material_set = self.file.by_id(self.material_set) material_set = self.file.by_id(self.material_set)
ifcopenshell.api.run( ifcopenshell.api.run(
"material.reorder_set_item", "material.reorder_set_item",
@@ -443,7 +442,7 @@ class AddListItem(bpy.types.Operator, tool.Ifc.Operator):
def _execute(self, context): def _execute(self, context):
obj = bpy.data.objects.get(self.obj) if self.obj else context.active_object obj = bpy.data.objects.get(self.obj) if self.obj else context.active_object
self.file = IfcStore.get_file() self.file = tool.Ifc.get()
ifcopenshell.api.run( ifcopenshell.api.run(
"material.add_list_item", "material.add_list_item",
self.file, self.file,
@@ -463,7 +462,7 @@ class RemoveListItem(bpy.types.Operator, tool.Ifc.Operator):
def _execute(self, context): def _execute(self, context):
obj = bpy.data.objects.get(self.obj) if self.obj else context.active_object obj = bpy.data.objects.get(self.obj) if self.obj else context.active_object
self.file = IfcStore.get_file() self.file = tool.Ifc.get()
ifcopenshell.api.run( ifcopenshell.api.run(
"material.remove_list_item", "material.remove_list_item",
self.file, self.file,
@@ -557,7 +556,7 @@ class EditAssignedMaterial(bpy.types.Operator, tool.Ifc.Operator):
material_set_usage: bpy.props.IntProperty() material_set_usage: bpy.props.IntProperty()
def _execute(self, context): def _execute(self, context):
self.file = IfcStore.get_file() self.file = tool.Ifc.get()
active_obj = bpy.data.objects.get(self.obj) if self.obj else context.active_object active_obj = bpy.data.objects.get(self.obj) if self.obj else context.active_object
props = active_obj.BIMObjectMaterialProperties props = active_obj.BIMObjectMaterialProperties
element = tool.Ifc.get_entity(active_obj) element = tool.Ifc.get_entity(active_obj)
@@ -663,7 +662,7 @@ class EnableEditingMaterialSetItem(bpy.types.Operator):
material_set_item: bpy.props.IntProperty() material_set_item: bpy.props.IntProperty()
def execute(self, context): def execute(self, context):
self.file = IfcStore.get_file() self.file = tool.Ifc.get()
obj = bpy.data.objects.get(self.obj) if self.obj else context.active_object obj = bpy.data.objects.get(self.obj) if self.obj else context.active_object
self.mprops = tool.Material.get_material_props() self.mprops = tool.Material.get_material_props()
self.props = obj.BIMObjectMaterialProperties self.props = obj.BIMObjectMaterialProperties
@@ -707,7 +706,7 @@ class EditMaterialSetItem(bpy.types.Operator, tool.Ifc.Operator):
def _execute(self, context): def _execute(self, context):
obj = bpy.data.objects.get(self.obj) if self.obj else context.active_object obj = bpy.data.objects.get(self.obj) if self.obj else context.active_object
self.file = IfcStore.get_file() self.file = tool.Ifc.get()
props = obj.BIMObjectMaterialProperties props = obj.BIMObjectMaterialProperties
mprops = tool.Material.get_material_props() mprops = tool.Material.get_material_props()
element = tool.Ifc.get_entity(obj) element = tool.Ifc.get_entity(obj)
@@ -22,7 +22,6 @@ from ifcopenshell.util.doc import get_entity_doc
import bonsai.tool as tool import bonsai.tool as tool
from bonsai.bim.module.material.data import MaterialsData, ObjectMaterialData from bonsai.bim.module.material.data import MaterialsData, ObjectMaterialData
from bonsai.bim.module.profile.data import ProfileData from bonsai.bim.module.profile.data import ProfileData
from bonsai.bim.ifc import IfcStore
from bonsai.bim.prop import StrProperty, Attribute from bonsai.bim.prop import StrProperty, Attribute
from bpy.types import PropertyGroup from bpy.types import PropertyGroup
from bpy.props import ( from bpy.props import (
+4 -5
View File
@@ -21,7 +21,6 @@ import bonsai.bim.helper
import bonsai.tool as tool import bonsai.tool as tool
import bpy import bpy
from bpy.types import Panel, UIList from bpy.types import Panel, UIList
from bonsai.bim.ifc import IfcStore
from bonsai.bim.helper import draw_attributes 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
@@ -43,7 +42,7 @@ class BIM_PT_materials(Panel):
@classmethod @classmethod
def poll(cls, context): def poll(cls, context):
return IfcStore.get_file() return tool.Ifc.get()
def draw(self, context): def draw(self, context):
if not MaterialsData.is_loaded: if not MaterialsData.is_loaded:
@@ -143,9 +142,9 @@ class BIM_PT_object_material(Panel):
props = context.active_object.BIMObjectProperties props = context.active_object.BIMObjectProperties
if not props.ifc_definition_id: if not props.ifc_definition_id:
return False return False
if not IfcStore.get_element(props.ifc_definition_id): if not tool.Ifc.get_object_by_identifier(props.ifc_definition_id):
return False return False
if not hasattr(IfcStore.get_file().by_id(props.ifc_definition_id), "HasAssociations"): if not hasattr(tool.Ifc.get().by_id(props.ifc_definition_id), "HasAssociations"):
return False return False
return True return True
@@ -153,7 +152,7 @@ class BIM_PT_object_material(Panel):
if not ObjectMaterialData.is_loaded: if not ObjectMaterialData.is_loaded:
ObjectMaterialData.load() ObjectMaterialData.load()
self.file = IfcStore.get_file() self.file = tool.Ifc.get()
self.oprops = context.active_object.BIMObjectProperties self.oprops = context.active_object.BIMObjectProperties
self.props = context.active_object.BIMObjectMaterialProperties self.props = context.active_object.BIMObjectMaterialProperties
self.mprops = tool.Material.get_material_props() self.mprops = tool.Material.get_material_props()
@@ -20,7 +20,6 @@ import bpy
import ifcopenshell import ifcopenshell
import ifcopenshell.api import ifcopenshell.api
from bonsai.bim.module.model import product, wall, slab, profile, opening, task from bonsai.bim.module.model import product, wall, slab, profile, opening, task
from bonsai.bim.ifc import IfcStore
from bpy.app.handlers import persistent from bpy.app.handlers import persistent
@@ -38,7 +38,6 @@ import bonsai.tool as tool
import bonsai.core.geometry import bonsai.core.geometry
import bonsai.bim.import_ifc as import_ifc import bonsai.bim.import_ifc as import_ifc
from collections import defaultdict from collections import defaultdict
from bonsai.bim.ifc import IfcStore
from math import pi, radians from math import pi, radians
from mathutils import Vector, Matrix from mathutils import Vector, Matrix
from bpy.types import Operator from bpy.types import Operator
@@ -35,7 +35,6 @@ import bonsai.core.root
import bonsai.core.geometry import bonsai.core.geometry
import bonsai.core.model as core import bonsai.core.model as core
import bonsai.tool as tool import bonsai.tool as tool
from bonsai.bim.ifc import IfcStore
from math import pi, sin, cos, degrees, tan, radians from math import pi, sin, cos, degrees, tan, radians
from mathutils import Vector, Matrix, Quaternion from mathutils import Vector, Matrix, Quaternion
from bonsai.bim.module.model.opening import FilledOpeningGenerator from bonsai.bim.module.model.opening import FilledOpeningGenerator
@@ -757,7 +757,7 @@ def regenerate_profile_usage(usecase_path, ifc_file, settings):
elements.append(element) elements.append(element)
for element in elements: for element in elements:
obj = IfcStore.get_element(element.id()) obj = tool.Ifc.get_object_by_identifier(element.id())
if not obj: if not obj:
continue continue
representation = ifcopenshell.util.representation.get_representation(element, "Model", "Body", "MODEL_VIEW") representation = ifcopenshell.util.representation.get_representation(element, "Model", "Body", "MODEL_VIEW")
+1 -1
View File
@@ -889,7 +889,7 @@ class DrawPolylineSlab(bpy.types.Operator, PolylineOperator, tool.Ifc.Operator):
model_props = tool.Model.get_model_props() model_props = tool.Model.get_model_props()
direction_sense = model_props.direction_sense direction_sense = model_props.direction_sense
offset = model_props.offset offset = model_props.offset
model = IfcStore.get_file() model = tool.Ifc.get()
element = tool.Ifc.get_entity(slab) element = tool.Ifc.get_entity(slab)
material = ifcopenshell.util.element.get_material(element) material = ifcopenshell.util.element.get_material(element)
material_set_usage = model.by_id(material.id()) material_set_usage = model.by_id(material.id())
+2 -2
View File
@@ -377,7 +377,7 @@ class DrawPolylineWall(bpy.types.Operator, PolylineOperator, tool.Ifc.Operator):
walls, is_polyline_closed = DumbWallGenerator(self.relating_type).generate("POLYLINE") walls, is_polyline_closed = DumbWallGenerator(self.relating_type).generate("POLYLINE")
for wall in walls: for wall in walls:
model = IfcStore.get_file() model = tool.Ifc.get()
element = tool.Ifc.get_entity(wall["obj"]) element = tool.Ifc.get_entity(wall["obj"])
material = ifcopenshell.util.element.get_material(element) material = ifcopenshell.util.element.get_material(element)
material_set_usage = model.by_id(material.id()) material_set_usage = model.by_id(material.id())
@@ -598,7 +598,7 @@ class DumbWallGenerator:
self.unit_scale = ifcopenshell.util.unit.calculate_unit_scale(tool.Ifc.get()) self.unit_scale = ifcopenshell.util.unit.calculate_unit_scale(tool.Ifc.get())
def generate(self, insertion_type="CURSOR"): def generate(self, insertion_type="CURSOR"):
self.file = IfcStore.get_file() self.file = tool.Ifc.get()
self.layers = tool.Model.get_material_layer_parameters(self.relating_type) self.layers = tool.Model.get_material_layer_parameters(self.relating_type)
if not self.layers["thickness"]: if not self.layers["thickness"]:
return return
@@ -21,7 +21,6 @@ import ifcopenshell
import ifcopenshell.util.element import ifcopenshell.util.element
import bonsai.tool as tool import bonsai.tool as tool
import bonsai.core.nest as core import bonsai.core.nest as core
from bonsai.bim.ifc import IfcStore
class BIM_OT_nest_assign_object(bpy.types.Operator, tool.Ifc.Operator): class BIM_OT_nest_assign_object(bpy.types.Operator, tool.Ifc.Operator):
@@ -113,7 +112,7 @@ class BIM_OT_select_components(bpy.types.Operator):
obj: bpy.props.StringProperty() obj: bpy.props.StringProperty()
def execute(self, context): def execute(self, context):
self.file = IfcStore.get_file() self.file = tool.Ifc.get()
obj = bpy.data.objects.get(self.obj) or context.active_object obj = bpy.data.objects.get(self.obj) or context.active_object
components = ifcopenshell.util.element.get_components(tool.Ifc.get_entity(obj)) components = ifcopenshell.util.element.get_components(tool.Ifc.get_entity(obj))
component_objs = set(tool.Ifc.get_object(c) for c in components) component_objs = set(tool.Ifc.get_object(c) for c in components)
@@ -132,7 +131,7 @@ class BIM_OT_select_nest(bpy.types.Operator):
obj: bpy.props.StringProperty() obj: bpy.props.StringProperty()
def execute(self, context): def execute(self, context):
self.file = IfcStore.get_file() self.file = tool.Ifc.get()
obj = bpy.data.objects.get(self.obj) or context.active_object obj = bpy.data.objects.get(self.obj) or context.active_object
nest = ifcopenshell.util.element.get_nest(tool.Ifc.get_entity(obj)) nest = ifcopenshell.util.element.get_nest(tool.Ifc.get_entity(obj))
nest_obj = tool.Ifc.get_object(nest) nest_obj = tool.Ifc.get_object(nest)
+3 -3
View File
@@ -16,9 +16,9 @@
# 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/>.
import bonsai.tool as tool
from bpy.types import Panel from bpy.types import Panel
from bonsai.bim.module.nest.data import NestData from bonsai.bim.module.nest.data import NestData
from bonsai.bim.ifc import IfcStore
class BIM_PT_nest(Panel): class BIM_PT_nest(Panel):
@@ -37,9 +37,9 @@ class BIM_PT_nest(Panel):
props = context.active_object.BIMObjectProperties props = context.active_object.BIMObjectProperties
if not props.ifc_definition_id: if not props.ifc_definition_id:
return False return False
if not IfcStore.get_element(props.ifc_definition_id): if not tool.Ifc.get_object_by_identifier(props.ifc_definition_id):
return False return False
if not IfcStore.get_file().by_id(props.ifc_definition_id).is_a("IfcObjectDefinition"): if not tool.Ifc.get().by_id(props.ifc_definition_id).is_a("IfcObjectDefinition"):
return False return False
return True return True
@@ -21,7 +21,6 @@ import ifcopenshell
import ifcopenshell.util.schema import ifcopenshell.util.schema
import ifcopenshell.util.attribute import ifcopenshell.util.attribute
import bonsai.tool as tool import bonsai.tool as tool
from bonsai.bim.ifc import IfcStore
from bonsai.bim.prop import StrProperty, Attribute from bonsai.bim.prop import StrProperty, Attribute
from bonsai.bim.module.profile.data import ProfileData from bonsai.bim.module.profile.data import ProfileData
from bpy.types import PropertyGroup from bpy.types import PropertyGroup
@@ -503,10 +503,10 @@ class AppendEntireLibrary(bpy.types.Operator, tool.Ifc.Operator):
@classmethod @classmethod
def poll(cls, context): def poll(cls, context):
return IfcStore.get_file() return tool.Ifc.get()
def _execute(self, context): def _execute(self, context):
self.file = IfcStore.get_file() self.file = tool.Ifc.get()
self.library = IfcStore.library_file self.library = IfcStore.library_file
query = ", ".join(tool.Project.get_appendable_asset_types()) query = ", ".join(tool.Project.get_appendable_asset_types())
@@ -523,10 +523,10 @@ class AppendLibraryElementByQuery(bpy.types.Operator, tool.Ifc.Operator):
@classmethod @classmethod
def poll(cls, context): def poll(cls, context):
return IfcStore.get_file() return tool.Ifc.get()
def _execute(self, context): def _execute(self, context):
self.file = IfcStore.get_file() self.file = tool.Ifc.get()
self.library = IfcStore.library_file self.library = IfcStore.library_file
for element in ifcopenshell.util.selector.filter_elements(self.library, self.query): for element in ifcopenshell.util.selector.filter_elements(self.library, self.query):
@@ -556,7 +556,7 @@ class AppendLibraryElement(bpy.types.Operator, tool.Ifc.Operator):
@classmethod @classmethod
def poll(cls, context): def poll(cls, context):
poll = bool(IfcStore.get_file()) poll = bool(tool.Ifc.get())
if not poll: if not poll:
cls.poll_message_set("Please create or load a project first.") cls.poll_message_set("Please create or load a project first.")
return poll return poll
@@ -602,7 +602,7 @@ class AppendLibraryElement(bpy.types.Operator, tool.Ifc.Operator):
return {"FINISHED"} return {"FINISHED"}
def import_material_from_ifc(self, element: ifcopenshell.entity_instance, context: bpy.types.Context) -> None: def import_material_from_ifc(self, element: ifcopenshell.entity_instance, context: bpy.types.Context) -> None:
self.file = IfcStore.get_file() self.file = tool.Ifc.get()
logger = logging.getLogger("ImportIFC") logger = logging.getLogger("ImportIFC")
ifc_import_settings = import_ifc.IfcImportSettings.factory(context, IfcStore.path, logger) ifc_import_settings = import_ifc.IfcImportSettings.factory(context, IfcStore.path, logger)
ifc_importer = import_ifc.IfcImporter(ifc_import_settings) ifc_importer = import_ifc.IfcImporter(ifc_import_settings)
@@ -620,7 +620,7 @@ class AppendLibraryElement(bpy.types.Operator, tool.Ifc.Operator):
ifc_importer.create_style(style) ifc_importer.create_style(style)
def import_product_from_ifc(self, element: ifcopenshell.entity_instance, context: bpy.types.Context) -> None: def import_product_from_ifc(self, element: ifcopenshell.entity_instance, context: bpy.types.Context) -> None:
self.file = IfcStore.get_file() self.file = tool.Ifc.get()
logger = logging.getLogger("ImportIFC") logger = logging.getLogger("ImportIFC")
ifc_import_settings = import_ifc.IfcImportSettings.factory(context, IfcStore.path, logger) ifc_import_settings = import_ifc.IfcImportSettings.factory(context, IfcStore.path, logger)
ifc_importer = import_ifc.IfcImporter(ifc_import_settings) ifc_importer = import_ifc.IfcImporter(ifc_import_settings)
@@ -633,7 +633,7 @@ class AppendLibraryElement(bpy.types.Operator, tool.Ifc.Operator):
ifc_importer.place_objects_in_collections() ifc_importer.place_objects_in_collections()
def import_type_from_ifc(self, element: ifcopenshell.entity_instance, context: bpy.types.Context) -> None: def import_type_from_ifc(self, element: ifcopenshell.entity_instance, context: bpy.types.Context) -> None:
self.file = IfcStore.get_file() self.file = tool.Ifc.get()
logger = logging.getLogger("ImportIFC") logger = logging.getLogger("ImportIFC")
ifc_import_settings = import_ifc.IfcImportSettings.factory(context, IfcStore.path, logger) ifc_import_settings = import_ifc.IfcImportSettings.factory(context, IfcStore.path, logger)
@@ -648,7 +648,7 @@ class AppendLibraryElement(bpy.types.Operator, tool.Ifc.Operator):
def import_materials(self, element: ifcopenshell.entity_instance, ifc_importer: import_ifc.IfcImporter) -> None: def import_materials(self, element: ifcopenshell.entity_instance, ifc_importer: import_ifc.IfcImporter) -> None:
for material in ifcopenshell.util.element.get_materials(element): for material in ifcopenshell.util.element.get_materials(element):
if IfcStore.get_element(material.id()): if tool.Ifc.get_object_by_identifier(material.id()):
continue continue
self.import_material_styles(material, ifc_importer) self.import_material_styles(material, ifc_importer)
@@ -662,7 +662,7 @@ class AppendLibraryElement(bpy.types.Operator, tool.Ifc.Operator):
if not element.is_a("IfcRepresentationItem") or not element.StyledByItem: if not element.is_a("IfcRepresentationItem") or not element.StyledByItem:
continue continue
for element2 in self.file.traverse(element.StyledByItem[0]): for element2 in self.file.traverse(element.StyledByItem[0]):
if element2.is_a("IfcSurfaceStyle") and not IfcStore.get_element(element2.id()): if element2.is_a("IfcSurfaceStyle") and not tool.Ifc.get_object_by_identifier(element2.id()):
ifc_importer.create_style(element2) ifc_importer.create_style(element2)
def import_material_styles( def import_material_styles(
@@ -673,7 +673,7 @@ class AppendLibraryElement(bpy.types.Operator, tool.Ifc.Operator):
if not material.HasRepresentation: if not material.HasRepresentation:
return return
for element in self.file.traverse(material.HasRepresentation[0]): for element in self.file.traverse(material.HasRepresentation[0]):
if element.is_a("IfcSurfaceStyle") and not IfcStore.get_element(element.id()): if element.is_a("IfcSurfaceStyle") and not tool.Ifc.get_object_by_identifier(element.id()):
ifc_importer.create_style(element) ifc_importer.create_style(element)
@@ -770,14 +770,14 @@ class EnableEditingHeader(bpy.types.Operator):
@classmethod @classmethod
def poll(cls, context): def poll(cls, context):
return IfcStore.get_file() return tool.Ifc.get()
def execute(self, context): def execute(self, context):
self.file = tool.Ifc.get() self.file = tool.Ifc.get()
props = tool.Project.get_project_props() props = tool.Project.get_project_props()
props.is_editing = True props.is_editing = True
mvd = "".join(IfcStore.get_file().wrapped_data.header.file_description.description) mvd = "".join(tool.Ifc.get().wrapped_data.header.file_description.description)
if "[" in mvd: if "[" in mvd:
props.mvd = mvd.split("[")[1][0:-1] props.mvd = mvd.split("[")[1][0:-1]
else: else:
@@ -807,7 +807,7 @@ class EditHeader(bpy.types.Operator):
@classmethod @classmethod
def poll(cls, context): def poll(cls, context):
return IfcStore.get_file() return tool.Ifc.get()
def execute(self, context): def execute(self, context):
IfcStore.begin_transaction(self) IfcStore.begin_transaction(self)
@@ -832,7 +832,7 @@ class EditHeader(bpy.types.Operator):
return {"FINISHED"} return {"FINISHED"}
def record_state(self): def record_state(self):
self.file = IfcStore.get_file() self.file = tool.Ifc.get()
return { return {
"description": self.file.wrapped_data.header.file_description.description, "description": self.file.wrapped_data.header.file_description.description,
"author": self.file.wrapped_data.header.file_name.author, "author": self.file.wrapped_data.header.file_name.author,
@@ -841,14 +841,14 @@ class EditHeader(bpy.types.Operator):
} }
def rollback(self, data): def rollback(self, data):
file = IfcStore.get_file() file = tool.Ifc.get()
file.wrapped_data.header.file_description.description = data["old"]["description"] file.wrapped_data.header.file_description.description = data["old"]["description"]
file.wrapped_data.header.file_name.author = data["old"]["author"] file.wrapped_data.header.file_name.author = data["old"]["author"]
file.wrapped_data.header.file_name.organization = data["old"]["organisation"] file.wrapped_data.header.file_name.organization = data["old"]["organisation"]
file.wrapped_data.header.file_name.authorization = data["old"]["authorisation"] file.wrapped_data.header.file_name.authorization = data["old"]["authorisation"]
def commit(self, data): def commit(self, data):
file = IfcStore.get_file() file = tool.Ifc.get()
file.wrapped_data.header.file_description.description = data["new"]["description"] file.wrapped_data.header.file_description.description = data["new"]["description"]
file.wrapped_data.header.file_name.author = data["new"]["author"] file.wrapped_data.header.file_name.author = data["new"]["author"]
file.wrapped_data.header.file_name.organization = data["new"]["organisation"] file.wrapped_data.header.file_name.organization = data["new"]["organisation"]
+1 -1
View File
@@ -121,7 +121,7 @@ def update_filter_mode(self: "BIMProjectProperties", context: bpy.types.Context)
self.filter_categories.clear() self.filter_categories.clear()
if self.filter_mode == "NONE": if self.filter_mode == "NONE":
return return
file = IfcStore.get_file() file = tool.Ifc.get()
if self.filter_mode == "DECOMPOSITION": if self.filter_mode == "DECOMPOSITION":
if file.schema == "IFC2X3": if file.schema == "IFC2X3":
elements = file.by_type("IfcSpatialStructureElement") elements = file.by_type("IfcSpatialStructureElement")
+5 -5
View File
@@ -153,7 +153,7 @@ class BIM_PT_project(Panel):
self.layout.use_property_split = True self.layout.use_property_split = True
props = context.scene.BIMProperties props = context.scene.BIMProperties
pprops = self.props = tool.Project.get_project_props() pprops = self.props = tool.Project.get_project_props()
self.file = IfcStore.get_file() self.file = tool.Ifc.get()
if pprops.is_loading: if pprops.is_loading:
self.draw_advanced_loading_ui(context) self.draw_advanced_loading_ui(context)
elif self.file or props.ifc_file: elif self.file or props.ifc_file:
@@ -247,7 +247,7 @@ class BIM_PT_project(Panel):
def draw_editing_buttons(self, context, row): def draw_editing_buttons(self, context, row):
pprops = self.props pprops = self.props
if IfcStore.get_file(): if tool.Ifc.get():
if pprops.is_editing: if pprops.is_editing:
row.operator("bim.edit_header", icon="CHECKMARK", text="") row.operator("bim.edit_header", icon="CHECKMARK", text="")
row.operator("bim.disable_editing_header", icon="CANCEL", text="") row.operator("bim.disable_editing_header", icon="CANCEL", text="")
@@ -257,10 +257,10 @@ class BIM_PT_project(Panel):
def draw_editable_file_info(self, context): def draw_editable_file_info(self, context):
pprops = self.props pprops = self.props
if IfcStore.get_file(): if tool.Ifc.get():
row = self.layout.row(align=True) row = self.layout.row(align=True)
row.label(text="IFC Schema", icon="FILE_CACHE") row.label(text="IFC Schema", icon="FILE_CACHE")
row.label(text=IfcStore.get_file().schema) row.label(text=tool.Ifc.get().schema)
if pprops.is_editing: if pprops.is_editing:
row = self.layout.row(align=True) row = self.layout.row(align=True)
@@ -281,7 +281,7 @@ class BIM_PT_project(Panel):
else: else:
row = self.layout.row(align=True) row = self.layout.row(align=True)
row.label(text="IFC MVD", icon="FILE_HIDDEN") row.label(text="IFC MVD", icon="FILE_HIDDEN")
mvd = "".join(IfcStore.get_file().wrapped_data.header.file_description.description) mvd = "".join(tool.Ifc.get().wrapped_data.header.file_description.description)
if "[" in mvd: if "[" in mvd:
mvd = mvd.split("[")[1][0:-1] mvd = mvd.split("[")[1][0:-1]
row.label(text=mvd) row.label(text=mvd)
@@ -94,7 +94,7 @@ class EditPset(bpy.types.Operator, tool.Ifc.Operator):
properties: bpy.props.StringProperty() properties: bpy.props.StringProperty()
def _execute(self, context): def _execute(self, context):
self.file = IfcStore.get_file() self.file = tool.Ifc.get()
props = tool.Pset.get_pset_props(self.obj, self.obj_type) props = tool.Pset.get_pset_props(self.obj, self.obj_type)
ifc_definition_id = tool.Blender.get_obj_ifc_definition_id(self.obj, self.obj_type, context) ifc_definition_id = tool.Blender.get_obj_ifc_definition_id(self.obj, self.obj_type, context)
element = tool.Ifc.get().by_id(ifc_definition_id) element = tool.Ifc.get().by_id(ifc_definition_id)
@@ -226,7 +226,7 @@ class AddQto(bpy.types.Operator, tool.Ifc.Operator):
obj_type: bpy.props.StringProperty() obj_type: bpy.props.StringProperty()
def _execute(self, context): def _execute(self, context):
self.file = IfcStore.get_file() self.file = tool.Ifc.get()
qto_name = tool.Pset.get_pset_name(self.obj, self.obj_type, pset_type="QTO") qto_name = tool.Pset.get_pset_name(self.obj, self.obj_type, pset_type="QTO")
bpy.ops.bim.enable_pset_editing( bpy.ops.bim.enable_pset_editing(
pset_id=0, pset_name=qto_name, pset_type="QTO", obj=self.obj, obj_type=self.obj_type pset_id=0, pset_name=qto_name, pset_type="QTO", obj=self.obj, obj_type=self.obj_type
@@ -314,7 +314,7 @@ class BIM_OT_rename_parameters(bpy.types.Operator, tool.Ifc.Operator):
def _execute(self, context): def _execute(self, context):
props_to_map = context.scene.RenameProperties props_to_map = context.scene.RenameProperties
ifc_file = IfcStore.get_file() ifc_file = tool.Ifc.get()
all_ifc_elements = ifc_file.by_type("IfcElement") all_ifc_elements = ifc_file.by_type("IfcElement")
for ifc_element in all_ifc_elements: for ifc_element in all_ifc_elements:
@@ -347,7 +347,7 @@ class BIM_OT_add_edit_custom_property(bpy.types.Operator, tool.Ifc.Operator):
index: bpy.props.IntProperty() index: bpy.props.IntProperty()
def _execute(self, context): def _execute(self, context):
self.file = IfcStore.get_file() self.file = tool.Ifc.get()
props = context.scene.AddEditProperties props = context.scene.AddEditProperties
for obj in tool.Blender.get_selected_objects(): for obj in tool.Blender.get_selected_objects():
@@ -402,7 +402,7 @@ class BIM_OT_bulk_remove_psets(bpy.types.Operator, tool.Ifc.Operator):
index: bpy.props.IntProperty() index: bpy.props.IntProperty()
def _execute(self, context): def _execute(self, context):
self.file = IfcStore.get_file() self.file = tool.Ifc.get()
props = context.scene.DeletePsets props = context.scene.DeletePsets
for obj in tool.Blender.get_selected_objects(): for obj in tool.Blender.get_selected_objects():
+5 -5
View File
@@ -26,7 +26,6 @@ import bonsai.tool as tool
from bonsai.bim.prop import Attribute, StrProperty from bonsai.bim.prop import Attribute, StrProperty
from bonsai.bim.module.pset.data import AddEditCustomPropertiesData, ObjectPsetsData, MaterialPsetsData from bonsai.bim.module.pset.data import AddEditCustomPropertiesData, ObjectPsetsData, MaterialPsetsData
from bonsai.bim.module.material.data import ObjectMaterialData from bonsai.bim.module.material.data import ObjectMaterialData
from bonsai.bim.ifc import IfcStore
from bpy.types import PropertyGroup from bpy.types import PropertyGroup
from bpy.props import ( from bpy.props import (
PointerProperty, PointerProperty,
@@ -135,7 +134,7 @@ def get_resource_pset_names(self, context):
global psetnames global psetnames
rprops = context.scene.BIMResourceProperties rprops = context.scene.BIMResourceProperties
rtprops = context.scene.BIMResourceTreeProperties rtprops = context.scene.BIMResourceTreeProperties
ifc_class = IfcStore.get_file().by_id(rtprops.resources[rprops.active_resource_index].ifc_definition_id).is_a() ifc_class = tool.Ifc.get().by_id(rtprops.resources[rprops.active_resource_index].ifc_definition_id).is_a()
if ifc_class not in psetnames: if ifc_class not in psetnames:
psets = bonsai.bim.schema.ifc.psetqto.get_applicable(ifc_class, pset_only=True, schema=tool.Ifc.get_schema()) psets = bonsai.bim.schema.ifc.psetqto.get_applicable(ifc_class, pset_only=True, schema=tool.Ifc.get_schema())
psetnames[ifc_class] = blender_formatted_enum_from_psets(psets) psetnames[ifc_class] = blender_formatted_enum_from_psets(psets)
@@ -146,7 +145,7 @@ def get_resource_qto_names(self, context):
global qtonames global qtonames
rprops = context.scene.BIMResourceProperties rprops = context.scene.BIMResourceProperties
rtprops = context.scene.BIMResourceTreeProperties rtprops = context.scene.BIMResourceTreeProperties
ifc_class = IfcStore.get_file().by_id(rtprops.resources[rprops.active_resource_index].ifc_definition_id).is_a() ifc_class = tool.Ifc.get().by_id(rtprops.resources[rprops.active_resource_index].ifc_definition_id).is_a()
if ifc_class not in qtonames: if ifc_class not in qtonames:
psets = bonsai.bim.schema.ifc.psetqto.get_applicable(ifc_class, qto_only=True, schema=tool.Ifc.get_schema()) psets = bonsai.bim.schema.ifc.psetqto.get_applicable(ifc_class, qto_only=True, schema=tool.Ifc.get_schema())
qtonames[ifc_class] = blender_formatted_enum_from_psets(psets) qtonames[ifc_class] = blender_formatted_enum_from_psets(psets)
@@ -174,7 +173,7 @@ def get_group_qto_names(self, context):
def get_profile_pset_names(self, context): def get_profile_pset_names(self, context):
global psetnames global psetnames
pprops = tool.Profile.get_profile_props() pprops = tool.Profile.get_profile_props()
ifc_class = IfcStore.get_file().by_id(pprops.profiles[pprops.active_profile_index].ifc_definition_id).is_a() ifc_class = tool.Ifc.get().by_id(pprops.profiles[pprops.active_profile_index].ifc_definition_id).is_a()
if ifc_class not in psetnames: if ifc_class not in psetnames:
psets = bonsai.bim.schema.ifc.psetqto.get_applicable(ifc_class, pset_only=True, schema=tool.Ifc.get_schema()) psets = bonsai.bim.schema.ifc.psetqto.get_applicable(ifc_class, pset_only=True, schema=tool.Ifc.get_schema())
psetnames[ifc_class] = blender_formatted_enum_from_psets(psets) psetnames[ifc_class] = blender_formatted_enum_from_psets(psets)
@@ -290,7 +289,8 @@ class AddEditProperties(PropertyGroup):
enum_values: CollectionProperty(name="Enum Values", type=Attribute) enum_values: CollectionProperty(name="Enum Values", type=Attribute)
def get_value_name(self) -> Union[Literal["string_value", "bool_value", "int_value", "float_value"], None]: def get_value_name(self) -> Union[Literal["string_value", "bool_value", "int_value", "float_value"], None]:
ifc_data_type = IfcStore.get_schema().declaration_by_name(self.primary_measure_type) schema = tool.Ifc.schema()
ifc_data_type = schema.declaration_by_name(self.primary_measure_type)
data_type = ifcopenshell.util.attribute.get_primitive_type(ifc_data_type) data_type = ifcopenshell.util.attribute.get_primitive_type(ifc_data_type)
if data_type == "string": if data_type == "string":
return "string_value" return "string_value"
+2 -3
View File
@@ -20,7 +20,6 @@ from __future__ import annotations
import bpy import bpy
import bonsai.tool as tool import bonsai.tool as tool
from bpy.types import Panel from bpy.types import Panel
from bonsai.bim.ifc import IfcStore
from bonsai.bim.helper import prop_with_search, get_display_value from bonsai.bim.helper import prop_with_search, get_display_value
from bonsai.bim.module.pset.data import ( from bonsai.bim.module.pset.data import (
ObjectPsetsData, ObjectPsetsData,
@@ -247,7 +246,7 @@ class BIM_PT_object_psets(Panel):
props = context.active_object.BIMObjectProperties props = context.active_object.BIMObjectProperties
if not props.ifc_definition_id: if not props.ifc_definition_id:
return False return False
if not IfcStore.get_element(props.ifc_definition_id): if not tool.Ifc.get_object_by_identifier(props.ifc_definition_id):
return False return False
return True return True
@@ -325,7 +324,7 @@ class BIM_PT_object_qtos(Panel):
props = context.active_object.BIMObjectProperties props = context.active_object.BIMObjectProperties
if not props.ifc_definition_id: if not props.ifc_definition_id:
return False return False
if not IfcStore.get_element(props.ifc_definition_id): if not tool.Ifc.get_object_by_identifier(props.ifc_definition_id):
return False return False
return True return True
@@ -183,7 +183,8 @@ class PropTemplate(PropertyGroup):
def get_value_name(self) -> str: def get_value_name(self) -> str:
if self.primary_measure_type == "-": if self.primary_measure_type == "-":
return "string_value" return "string_value"
ifc_data_type = IfcStore.get_schema().declaration_by_name(self.primary_measure_type) schema = tool.Ifc.schema()
ifc_data_type = schema.declaration_by_name(self.primary_measure_type)
data_type = ifcopenshell.util.attribute.get_primitive_type(ifc_data_type) data_type = ifcopenshell.util.attribute.get_primitive_type(ifc_data_type)
if data_type == "string": if data_type == "string":
return "string_value" return "string_value"
@@ -21,7 +21,6 @@ import ifcopenshell
import ifcopenshell.api import ifcopenshell.api
import bonsai.tool as tool import bonsai.tool as tool
import bonsai.core.qto as core import bonsai.core.qto as core
from bonsai.bim.ifc import IfcStore
from bonsai.bim.module.qto import helper from bonsai.bim.module.qto import helper
@@ -19,7 +19,6 @@
import bpy import bpy
import ifcopenshell.api import ifcopenshell.api
import ifcopenshell.util.resource import ifcopenshell.util.resource
from bonsai.bim.ifc import IfcStore
import bonsai.tool as tool import bonsai.tool as tool
import bonsai.bim.module.pset.data import bonsai.bim.module.pset.data
import bonsai.bim.module.resource.data import bonsai.bim.module.resource.data
+2 -2
View File
@@ -17,9 +17,9 @@
# along with Bonsai. If not, see <http://www.gnu.org/licenses/>. # along with Bonsai. If not, see <http://www.gnu.org/licenses/>.
import bpy import bpy
import bonsai.tool as tool
import bonsai.bim.helper import bonsai.bim.helper
from bpy.types import Panel, UIList from bpy.types import Panel, UIList
from bonsai.bim.ifc import IfcStore
from bonsai.bim.module.resource.data import ResourceData from bonsai.bim.module.resource.data import ResourceData
from typing import Any from typing import Any
@@ -35,7 +35,7 @@ class BIM_PT_resources(Panel):
@classmethod @classmethod
def poll(cls, context): def poll(cls, context):
file = IfcStore.get_file() file = tool.Ifc.get()
return file and hasattr(file, "schema") and file.schema != "IFC2X3" return file and hasattr(file, "schema") and file.schema != "IFC2X3"
def draw(self, context): def draw(self, context):
@@ -57,8 +57,9 @@ class EnableReassignClass(bpy.types.Operator):
"IfcAnnotation", "IfcAnnotation",
"IfcRelSpaceBoundary", "IfcRelSpaceBoundary",
] ]
schema = tool.Ifc.schema()
for ifc_product in ifc_products: for ifc_product in ifc_products:
if ifcopenshell.util.schema.is_a(IfcStore.get_schema().declaration_by_name(ifc_class), ifc_product): if schema.declaration_by_name(ifc_class).is_a(ifc_product):
context.scene.BIMRootProperties.ifc_product = ifc_product context.scene.BIMRootProperties.ifc_product = ifc_product
element = self.file.by_id(obj.BIMObjectProperties.ifc_definition_id) element = self.file.by_id(obj.BIMObjectProperties.ifc_definition_id)
context.scene.BIMRootProperties.ifc_class = element.is_a() context.scene.BIMRootProperties.ifc_class = element.is_a()
+2 -2
View File
@@ -17,9 +17,9 @@
# along with Bonsai. If not, see <http://www.gnu.org/licenses/>. # along with Bonsai. If not, see <http://www.gnu.org/licenses/>.
import bpy import bpy
import bonsai.tool as tool
import bonsai.bim.module.root.prop as root_prop import bonsai.bim.module.root.prop as root_prop
from bpy.types import Panel from bpy.types import Panel
from bonsai.bim.ifc import IfcStore
from bonsai.bim.helper import prop_with_search from bonsai.bim.helper import prop_with_search
from bonsai.bim.module.root.data import IfcClassData from bonsai.bim.module.root.data import IfcClassData
from bonsai.bim.module.model.data import AuthoringData from bonsai.bim.module.model.data import AuthoringData
@@ -38,7 +38,7 @@ class BIM_PT_class(Panel):
def poll(cls, context): def poll(cls, context):
if not context.active_object: if not context.active_object:
return False return False
return IfcStore.get_file() return tool.Ifc.get()
def draw(self, context): def draw(self, context):
if not IfcClassData.is_loaded: if not IfcClassData.is_loaded:
@@ -31,7 +31,6 @@ import ifcopenshell.util.sequence
import ifcopenshell.util.selector import ifcopenshell.util.selector
from datetime import datetime from datetime import datetime
from dateutil import parser, relativedelta from dateutil import parser, relativedelta
from bonsai.bim.ifc import IfcStore
from bpy_extras.io_utils import ImportHelper from bpy_extras.io_utils import ImportHelper
from typing import get_args, TYPE_CHECKING from typing import get_args, TYPE_CHECKING
from typing_extensions import assert_never from typing_extensions import assert_never
@@ -700,7 +699,7 @@ class ImportP6(bpy.types.Operator, tool.Ifc.Operator, ImportHelper):
def _execute(self, context): def _execute(self, context):
from ifc4d.p62ifc import P62Ifc from ifc4d.p62ifc import P62Ifc
self.file = IfcStore.get_file() self.file = tool.Ifc.get()
start = time.time() start = time.time()
p62ifc = P62Ifc() p62ifc = P62Ifc()
p62ifc.xml = self.filepath p62ifc.xml = self.filepath
@@ -728,7 +727,7 @@ class ImportP6XER(bpy.types.Operator, tool.Ifc.Operator, ImportHelper):
def _execute(self, context): def _execute(self, context):
from ifc4d.p6xer2ifc import P6XER2Ifc from ifc4d.p6xer2ifc import P6XER2Ifc
self.file = IfcStore.get_file() self.file = tool.Ifc.get()
start = time.time() start = time.time()
p6xer2ifc = P6XER2Ifc() p6xer2ifc = P6XER2Ifc()
p6xer2ifc.xer = self.filepath p6xer2ifc.xer = self.filepath
@@ -756,7 +755,7 @@ class ImportPP(bpy.types.Operator, tool.Ifc.Operator, ImportHelper):
def _execute(self, context): def _execute(self, context):
from ifc4d.pp2ifc import PP2Ifc from ifc4d.pp2ifc import PP2Ifc
self.file = IfcStore.get_file() self.file = tool.Ifc.get()
start = time.time() start = time.time()
pp2ifc = PP2Ifc() pp2ifc = PP2Ifc()
pp2ifc.pp = self.filepath pp2ifc.pp = self.filepath
@@ -784,7 +783,7 @@ class ImportMSP(bpy.types.Operator, tool.Ifc.Operator, ImportHelper):
def _execute(self, context): def _execute(self, context):
from ifc4d.msp2ifc import MSP2Ifc from ifc4d.msp2ifc import MSP2Ifc
self.file = IfcStore.get_file() self.file = tool.Ifc.get()
start = time.time() start = time.time()
msp2ifc = MSP2Ifc() msp2ifc = MSP2Ifc()
msp2ifc.xml = self.filepath msp2ifc.xml = self.filepath
@@ -814,7 +813,7 @@ class ExportMSP(bpy.types.Operator, ImportHelper):
def execute(self, context): def execute(self, context):
from ifc4d.ifc2msp import Ifc2Msp from ifc4d.ifc2msp import Ifc2Msp
self.file = IfcStore.get_file() self.file = tool.Ifc.get()
start = time.time() start = time.time()
ifc2msp = Ifc2Msp() ifc2msp = Ifc2Msp()
ifc2msp.work_schedule = self.file.by_type("IfcWorkSchedule")[0] ifc2msp.work_schedule = self.file.by_type("IfcWorkSchedule")[0]
@@ -847,7 +846,7 @@ class ExportP6(bpy.types.Operator, ImportHelper):
def execute(self, context): def execute(self, context):
from ifc4d.ifc2p6 import Ifc2P6 from ifc4d.ifc2p6 import Ifc2P6
self.file = IfcStore.get_file() self.file = tool.Ifc.get()
start = time.time() start = time.time()
ifc2p6 = Ifc2P6() ifc2p6 = Ifc2P6()
ifc2p6.xml = bpy.path.ensure_ext(self.filepath, ".xml") ifc2p6.xml = bpy.path.ensure_ext(self.filepath, ".xml")
@@ -23,7 +23,6 @@ import ifcopenshell.util.attribute
import ifcopenshell.util.date import ifcopenshell.util.date
import bonsai.tool as tool import bonsai.tool as tool
import bonsai.core.sequence as core import bonsai.core.sequence as core
from bonsai.bim.ifc import IfcStore
from bonsai.bim.module.sequence.data import SequenceData, AnimationColorSchemeData, refresh as refresh_sequence_data from bonsai.bim.module.sequence.data import SequenceData, AnimationColorSchemeData, refresh as refresh_sequence_data
import bonsai.bim.module.resource.data import bonsai.bim.module.resource.data
import bonsai.bim.module.pset.data import bonsai.bim.module.pset.data
+5 -6
View File
@@ -22,7 +22,6 @@ import isodate
import bonsai.tool as tool import bonsai.tool as tool
import bonsai.bim.helper import bonsai.bim.helper
from bpy.types import Panel, UIList from bpy.types import Panel, UIList
from bonsai.bim.ifc import IfcStore
from bonsai.bim.helper import draw_attributes from bonsai.bim.helper import draw_attributes
from bonsai.bim.module.sequence.data import ( from bonsai.bim.module.sequence.data import (
WorkPlansData, WorkPlansData,
@@ -45,7 +44,7 @@ class BIM_PT_status(Panel):
@classmethod @classmethod
def poll(cls, context): def poll(cls, context):
return IfcStore.get_file() return tool.Ifc.get()
def draw(self, context): def draw(self, context):
self.props = context.scene.BIMStatusProperties self.props = context.scene.BIMStatusProperties
@@ -77,7 +76,7 @@ class BIM_PT_work_plans(Panel):
@classmethod @classmethod
def poll(cls, context): def poll(cls, context):
file = IfcStore.get_file() file = tool.Ifc.get()
return file and file.schema != "IFC2X3" return file and file.schema != "IFC2X3"
def draw(self, context): def draw(self, context):
@@ -147,7 +146,7 @@ class BIM_PT_work_schedules(Panel):
@classmethod @classmethod
def poll(cls, context): def poll(cls, context):
file = IfcStore.get_file() file = tool.Ifc.get()
return file and hasattr(file, "schema") and file.schema != "IFC2X3" return file and hasattr(file, "schema") and file.schema != "IFC2X3"
def draw(self, context): def draw(self, context):
@@ -592,7 +591,7 @@ class BIM_PT_animation_Color_Scheme(Panel):
@classmethod @classmethod
def poll(cls, context): def poll(cls, context):
file = IfcStore.get_file() file = tool.Ifc.get()
return file and hasattr(file, "schema") and file.schema != "IFC2X3" return file and hasattr(file, "schema") and file.schema != "IFC2X3"
def draw(self, context): def draw(self, context):
@@ -980,7 +979,7 @@ class BIM_PT_work_calendars(Panel):
@classmethod @classmethod
def poll(cls, context): def poll(cls, context):
file = IfcStore.get_file() file = tool.Ifc.get()
return file and hasattr(file, "schema") and file.schema != "IFC2X3" return file and hasattr(file, "schema") and file.schema != "IFC2X3"
def draw(self, context): def draw(self, context):
@@ -26,7 +26,6 @@ import ifcopenshell.api
import ifcopenshell.util.attribute import ifcopenshell.util.attribute
import ifcopenshell.util.unit as ifcunit import ifcopenshell.util.unit as ifcunit
import bonsai.tool as tool import bonsai.tool as tool
from bonsai.bim.ifc import IfcStore
from bonsai.bim.module.structural.shader import DecorationShader from bonsai.bim.module.structural.shader import DecorationShader
from typing import Literal, TypedDict, Iterable from typing import Literal, TypedDict, Iterable
@@ -307,7 +306,7 @@ class ShaderInfo:
props = bpy.context.scene.BIMStructuralProperties props = bpy.context.scene.BIMStructuralProperties
group_definition_id = int(props.load_group_to_show) group_definition_id = int(props.load_group_to_show)
file = IfcStore.get_file() file = tool.Ifc.get()
groups = [file.by_id(group_definition_id)] groups = [file.by_id(group_definition_id)]
recursive_subgroups(groups, 10, props.activity_type) recursive_subgroups(groups, 10, props.activity_type)
@@ -333,7 +332,7 @@ class ShaderInfo:
orientation = np.eye(3) orientation = np.eye(3)
if reference_frame == "LOCAL_COORDS": if reference_frame == "LOCAL_COORDS":
orientation = rotation orientation = rotation
blender_object: bpy.types.Object = IfcStore.get_element(getattr(surf, "GlobalId", None)) blender_object: bpy.types.Object = tool.Ifc.get_object_by_identifier(getattr(surf, "GlobalId", None))
mat = blender_object.matrix_world mat = blender_object.matrix_world
mesh: bpy.types.Mesh = blender_object.data mesh: bpy.types.Mesh = blender_object.data
@@ -454,7 +453,7 @@ class ShaderInfo:
activity_list = value["activities"] activity_list = value["activities"]
if len(activity_list) == 0: if len(activity_list) == 0:
continue continue
blender_object = IfcStore.get_element(getattr(conn, "GlobalId", None)) blender_object = tool.Ifc.get_object_by_identifier(getattr(conn, "GlobalId", None))
if blender_object.type == "MESH": if blender_object.type == "MESH":
conn_location = blender_object.matrix_world @ blender_object.data.vertices[0].co conn_location = blender_object.matrix_world @ blender_object.data.vertices[0].co
rotation = self.get_point_connection_rotation(conn) rotation = self.get_point_connection_rotation(conn)
@@ -580,7 +579,7 @@ class ShaderInfo:
if len(activity_list) == 0: if len(activity_list) == 0:
continue continue
blender_object = IfcStore.get_element(getattr(member, "GlobalId", None)) blender_object = tool.Ifc.get_object_by_identifier(getattr(member, "GlobalId", None))
start_co = blender_object.matrix_world @ blender_object.data.vertices[0].co start_co = blender_object.matrix_world @ blender_object.data.vertices[0].co
end_co = blender_object.matrix_world @ blender_object.data.vertices[1].co end_co = blender_object.matrix_world @ blender_object.data.vertices[1].co
@@ -20,13 +20,13 @@ import bpy
import json import json
import ifcopenshell import ifcopenshell
import ifcopenshell.api import ifcopenshell.api
import ifcopenshell.api.structural
import ifcopenshell.util.attribute import ifcopenshell.util.attribute
import bonsai.bim.helper import bonsai.bim.helper
import bonsai.core.structural as core import bonsai.core.structural as core
import bonsai.tool as tool import bonsai.tool as tool
from math import degrees from math import degrees
from mathutils import Vector, Matrix from mathutils import Vector, Matrix
from bonsai.bim.ifc import IfcStore
from bonsai.bim.module.structural.decorator import LoadsDecorator from bonsai.bim.module.structural.decorator import LoadsDecorator
@@ -77,13 +77,12 @@ class AddStructuralMemberConnection(bpy.types.Operator, tool.Ifc.Operator):
obj = context.active_object obj = context.active_object
oprops = obj.BIMObjectProperties oprops = obj.BIMObjectProperties
props = obj.BIMStructuralProperties props = obj.BIMStructuralProperties
file = IfcStore.get_file() file = tool.Ifc.get()
related_structural_connection = file.by_id(oprops.ifc_definition_id) related_structural_connection = file.by_id(oprops.ifc_definition_id)
relating_structural_member = file.by_id(props.relating_structural_member.BIMObjectProperties.ifc_definition_id) relating_structural_member = file.by_id(props.relating_structural_member.BIMObjectProperties.ifc_definition_id)
if not relating_structural_member.is_a("IfcStructuralMember"): if not relating_structural_member.is_a("IfcStructuralMember"):
return {"FINISHED"} return {"FINISHED"}
ifcopenshell.api.run( ifcopenshell.api.structural.add_structural_member_connection(
"structural.add_structural_member_connection",
file, file,
relating_structural_member=relating_structural_member, relating_structural_member=relating_structural_member,
related_structural_connection=related_structural_connection, related_structural_connection=related_structural_connection,
@@ -125,7 +124,7 @@ class RemoveStructuralConnectionCondition(bpy.types.Operator, tool.Ifc.Operator)
connects_structural_member: bpy.props.IntProperty() connects_structural_member: bpy.props.IntProperty()
def _execute(self, context): def _execute(self, context):
file = IfcStore.get_file() file = tool.Ifc.get()
relation = file.by_id(self.connects_structural_member) relation = file.by_id(self.connects_structural_member)
connection = relation.RelatedStructuralConnection connection = relation.RelatedStructuralConnection
ifcopenshell.api.run("structural.remove_structural_connection_condition", file, **{"relation": relation}) ifcopenshell.api.run("structural.remove_structural_connection_condition", file, **{"relation": relation})
@@ -139,7 +138,7 @@ class AddStructuralBoundaryCondition(bpy.types.Operator, tool.Ifc.Operator):
connection: bpy.props.IntProperty() connection: bpy.props.IntProperty()
def _execute(self, context): def _execute(self, context):
file = IfcStore.get_file() file = tool.Ifc.get()
connection = file.by_id(self.connection) connection = file.by_id(self.connection)
ifcopenshell.api.run("structural.add_structural_boundary_condition", file, **{"connection": connection}) ifcopenshell.api.run("structural.add_structural_boundary_condition", file, **{"connection": connection})
return {"FINISHED"} return {"FINISHED"}
@@ -152,7 +151,7 @@ class RemoveStructuralBoundaryCondition(bpy.types.Operator, tool.Ifc.Operator):
connection: bpy.props.IntProperty() connection: bpy.props.IntProperty()
def _execute(self, context): def _execute(self, context):
file = IfcStore.get_file() file = tool.Ifc.get()
connection = file.by_id(self.connection) connection = file.by_id(self.connection)
ifcopenshell.api.run("structural.remove_structural_boundary_condition", file, **{"connection": connection}) ifcopenshell.api.run("structural.remove_structural_boundary_condition", file, **{"connection": connection})
return {"FINISHED"} return {"FINISHED"}
@@ -170,8 +169,9 @@ class EnableEditingStructuralBoundaryCondition(bpy.types.Operator):
props.boundary_condition_attributes.clear() props.boundary_condition_attributes.clear()
condition = tool.Ifc.get().by_id(self.boundary_condition) condition = tool.Ifc.get().by_id(self.boundary_condition)
schema = tool.Ifc.schema()
for attribute in IfcStore.get_schema().declaration_by_name(condition.is_a()).all_attributes(): for attribute in schema.declaration_by_name(condition.is_a()).all_attributes():
value = getattr(condition, attribute.name(), None) value = getattr(condition, attribute.name(), None)
data_type = ifcopenshell.util.attribute.get_primitive_type(attribute) data_type = ifcopenshell.util.attribute.get_primitive_type(attribute)
new = props.boundary_condition_attributes.add() new = props.boundary_condition_attributes.add()
@@ -207,7 +207,7 @@ class EditStructuralBoundaryCondition(bpy.types.Operator, tool.Ifc.Operator):
obj = context.active_object obj = context.active_object
props = obj.BIMStructuralProperties props = obj.BIMStructuralProperties
file = IfcStore.get_file() file = tool.Ifc.get()
connection = file.by_id(self.connection) connection = file.by_id(self.connection)
condition = connection.AppliedCondition condition = connection.AppliedCondition
@@ -353,7 +353,7 @@ class EnableEditingStructuralItemAxis(bpy.types.Operator):
oprops = obj.BIMObjectProperties oprops = obj.BIMObjectProperties
props = obj.BIMStructuralProperties props = obj.BIMStructuralProperties
self.file = IfcStore.get_file() self.file = tool.Ifc.get()
item = self.file.by_id(oprops.ifc_definition_id) item = self.file.by_id(oprops.ifc_definition_id)
z_axis = Vector(item.Axis.DirectionRatios).normalized() @ obj.matrix_world if item.Axis else None z_axis = Vector(item.Axis.DirectionRatios).normalized() @ obj.matrix_world if item.Axis else None
x_axis = (obj.data.vertices[1].co - obj.data.vertices[0].co).normalized() x_axis = (obj.data.vertices[1].co - obj.data.vertices[0].co).normalized()
@@ -407,7 +407,7 @@ class EditStructuralItemAxis(bpy.types.Operator, tool.Ifc.Operator):
props = obj.BIMStructuralProperties props = obj.BIMStructuralProperties
relative_matrix = props.axis_empty.matrix_world @ obj.matrix_world.inverted() relative_matrix = props.axis_empty.matrix_world @ obj.matrix_world.inverted()
z_axis = relative_matrix.col[2][0:3] z_axis = relative_matrix.col[2][0:3]
self.file = IfcStore.get_file() self.file = tool.Ifc.get()
ifcopenshell.api.run( ifcopenshell.api.run(
"structural.edit_structural_item_axis", "structural.edit_structural_item_axis",
self.file, self.file,
@@ -428,7 +428,7 @@ class EnableEditingStructuralConnectionCS(bpy.types.Operator):
oprops = obj.BIMObjectProperties oprops = obj.BIMObjectProperties
props = obj.BIMStructuralProperties props = obj.BIMStructuralProperties
self.file = IfcStore.get_file() self.file = tool.Ifc.get()
item = self.file.by_id(oprops.ifc_definition_id) item = self.file.by_id(oprops.ifc_definition_id)
location = obj.data.vertices[0].co location = obj.data.vertices[0].co
@@ -496,7 +496,7 @@ class EditStructuralConnectionCS(bpy.types.Operator, tool.Ifc.Operator):
relative_matrix = props.ccs_empty.matrix_world @ obj.matrix_world.inverted() relative_matrix = props.ccs_empty.matrix_world @ obj.matrix_world.inverted()
x_axis = relative_matrix.col[0][0:3] x_axis = relative_matrix.col[0][0:3]
z_axis = relative_matrix.col[2][0:3] z_axis = relative_matrix.col[2][0:3]
self.file = IfcStore.get_file() self.file = tool.Ifc.get()
ifcopenshell.api.run( ifcopenshell.api.run(
"structural.edit_structural_connection_cs", "structural.edit_structural_connection_cs",
self.file, self.file,
@@ -515,7 +515,7 @@ class AssignStructuralLoadCase(bpy.types.Operator, tool.Ifc.Operator):
load_case: bpy.props.IntProperty() load_case: bpy.props.IntProperty()
def _execute(self, context): def _execute(self, context):
self.file = IfcStore.get_file() self.file = tool.Ifc.get()
ifcopenshell.api.run( ifcopenshell.api.run(
"aggregate.assign_object", "aggregate.assign_object",
self.file, self.file,
@@ -534,7 +534,7 @@ class UnassignStructuralLoadCase(bpy.types.Operator, tool.Ifc.Operator):
load_case: bpy.props.IntProperty() load_case: bpy.props.IntProperty()
def _execute(self, context): def _execute(self, context):
self.file = IfcStore.get_file() self.file = tool.Ifc.get()
ifcopenshell.api.run( ifcopenshell.api.run(
"aggregate.unassign_object", "aggregate.unassign_object",
self.file, self.file,
@@ -552,7 +552,7 @@ class AddStructuralLoadCase(bpy.types.Operator, tool.Ifc.Operator):
bl_options = {"REGISTER", "UNDO"} bl_options = {"REGISTER", "UNDO"}
def _execute(self, context): def _execute(self, context):
ifcopenshell.api.run("structural.add_structural_load_case", IfcStore.get_file()) ifcopenshell.api.run("structural.add_structural_load_case", tool.Ifc.get())
return {"FINISHED"} return {"FINISHED"}
@@ -564,7 +564,7 @@ class EditStructuralLoadCase(bpy.types.Operator, tool.Ifc.Operator):
def _execute(self, context): def _execute(self, context):
props = context.scene.BIMStructuralProperties props = context.scene.BIMStructuralProperties
attributes = bonsai.bim.helper.export_attributes(props.load_case_attributes) attributes = bonsai.bim.helper.export_attributes(props.load_case_attributes)
self.file = IfcStore.get_file() self.file = tool.Ifc.get()
ifcopenshell.api.run( ifcopenshell.api.run(
"structural.edit_structural_load_case", "structural.edit_structural_load_case",
self.file, self.file,
@@ -581,7 +581,7 @@ class RemoveStructuralLoadCase(bpy.types.Operator, tool.Ifc.Operator):
load_case: bpy.props.IntProperty() load_case: bpy.props.IntProperty()
def _execute(self, context): def _execute(self, context):
self.file = IfcStore.get_file() self.file = tool.Ifc.get()
ifcopenshell.api.run( ifcopenshell.api.run(
"structural.remove_structural_load_case", self.file, load_case=self.file.by_id(self.load_case) "structural.remove_structural_load_case", self.file, load_case=self.file.by_id(self.load_case)
) )
@@ -639,7 +639,7 @@ class AddStructuralLoadGroup(bpy.types.Operator, tool.Ifc.Operator):
load_case: bpy.props.IntProperty() load_case: bpy.props.IntProperty()
def _execute(self, context): def _execute(self, context):
self.file = IfcStore.get_file() self.file = tool.Ifc.get()
load_group = ifcopenshell.api.run("structural.add_structural_load_group", self.file) load_group = ifcopenshell.api.run("structural.add_structural_load_group", self.file)
ifcopenshell.api.run( ifcopenshell.api.run(
"group.assign_group", self.file, products=[load_group], group=self.file.by_id(self.load_case) "group.assign_group", self.file, products=[load_group], group=self.file.by_id(self.load_case)
@@ -654,7 +654,7 @@ class RemoveStructuralLoadGroup(bpy.types.Operator, tool.Ifc.Operator):
load_group: bpy.props.IntProperty() load_group: bpy.props.IntProperty()
def _execute(self, context): def _execute(self, context):
self.file = IfcStore.get_file() self.file = tool.Ifc.get()
ifcopenshell.api.run( ifcopenshell.api.run(
"structural.remove_structural_load_group", self.file, load_group=self.file.by_id(self.load_group) "structural.remove_structural_load_group", self.file, load_group=self.file.by_id(self.load_group)
) )
@@ -668,7 +668,7 @@ class EnableEditingStructuralLoadGroupActivities(bpy.types.Operator):
load_group: bpy.props.IntProperty() load_group: bpy.props.IntProperty()
def execute(self, context): def execute(self, context):
self.file = IfcStore.get_file() self.file = tool.Ifc.get()
self.props = context.scene.BIMStructuralProperties self.props = context.scene.BIMStructuralProperties
self.props.active_load_group_id = self.load_group self.props.active_load_group_id = self.load_group
self.props.load_group_editing_type = "ACTIVITY" self.props.load_group_editing_type = "ACTIVITY"
@@ -693,7 +693,7 @@ class AddStructuralActivity(bpy.types.Operator, tool.Ifc.Operator):
def _execute(self, context): def _execute(self, context):
self.props = context.scene.BIMStructuralProperties self.props = context.scene.BIMStructuralProperties
self.file = IfcStore.get_file() self.file = tool.Ifc.get()
for obj in context.selected_objects: for obj in context.selected_objects:
if not obj.BIMObjectProperties.ifc_definition_id: if not obj.BIMObjectProperties.ifc_definition_id:
continue continue
@@ -741,7 +741,7 @@ class LoadStructuralLoads(bpy.types.Operator):
bl_options = {"REGISTER", "UNDO"} bl_options = {"REGISTER", "UNDO"}
def execute(self, context): def execute(self, context):
self.file = IfcStore.get_file() self.file = tool.Ifc.get()
props = context.scene.BIMStructuralProperties props = context.scene.BIMStructuralProperties
props.structural_loads.clear() props.structural_loads.clear()
loads = tool.Ifc.get().by_type("IfcStructuralLoad") loads = tool.Ifc.get().by_type("IfcStructuralLoad")
@@ -787,7 +787,7 @@ class AddStructuralLoad(bpy.types.Operator, tool.Ifc.Operator):
def _execute(self, context): def _execute(self, context):
result = ifcopenshell.api.run( result = ifcopenshell.api.run(
"structural.add_structural_load", IfcStore.get_file(), name="New Load", ifc_class=self.ifc_class "structural.add_structural_load", tool.Ifc.get(), name="New Load", ifc_class=self.ifc_class
) )
bpy.ops.bim.load_structural_loads() bpy.ops.bim.load_structural_loads()
bpy.ops.bim.enable_editing_structural_load(structural_load=result.id()) bpy.ops.bim.enable_editing_structural_load(structural_load=result.id())
@@ -828,7 +828,7 @@ class RemoveStructuralLoad(bpy.types.Operator, tool.Ifc.Operator):
def _execute(self, context): def _execute(self, context):
props = context.scene.BIMStructuralProperties props = context.scene.BIMStructuralProperties
self.file = IfcStore.get_file() self.file = tool.Ifc.get()
ifcopenshell.api.run( ifcopenshell.api.run(
"structural.remove_structural_load", "structural.remove_structural_load",
self.file, self.file,
@@ -846,7 +846,7 @@ class EditStructuralLoad(bpy.types.Operator, tool.Ifc.Operator):
def _execute(self, context): def _execute(self, context):
props = context.scene.BIMStructuralProperties props = context.scene.BIMStructuralProperties
attributes = bonsai.bim.helper.export_attributes(props.structural_load_attributes) attributes = bonsai.bim.helper.export_attributes(props.structural_load_attributes)
self.file = IfcStore.get_file() self.file = tool.Ifc.get()
ifcopenshell.api.run( ifcopenshell.api.run(
"structural.edit_structural_load", "structural.edit_structural_load",
self.file, self.file,
@@ -877,7 +877,7 @@ class LoadBoundaryConditions(bpy.types.Operator):
bl_options = {"REGISTER", "UNDO"} bl_options = {"REGISTER", "UNDO"}
def execute(self, context): def execute(self, context):
self.file = IfcStore.get_file() self.file = tool.Ifc.get()
props = context.scene.BIMStructuralProperties props = context.scene.BIMStructuralProperties
props.boundary_conditions.clear() props.boundary_conditions.clear()
conditions = tool.Ifc.get().by_type("IfcBoundaryCondition") conditions = tool.Ifc.get().by_type("IfcBoundaryCondition")
@@ -936,7 +936,7 @@ class AddBoundaryCondition(bpy.types.Operator, tool.Ifc.Operator):
def _execute(self, context): def _execute(self, context):
result = ifcopenshell.api.run( result = ifcopenshell.api.run(
"structural.add_structural_boundary_condition", "structural.add_structural_boundary_condition",
IfcStore.get_file(), tool.Ifc.get(),
name="New Load", name="New Load",
ifc_class=self.ifc_class, ifc_class=self.ifc_class,
) )
@@ -957,7 +957,8 @@ class EnableEditingBoundaryCondition(bpy.types.Operator):
boundary_condition = tool.Ifc.get().by_id(self.boundary_condition) boundary_condition = tool.Ifc.get().by_id(self.boundary_condition)
# bonsai.bim.helper.import_attributes(data["type"], props.boundary_condition_attributes, data) # bonsai.bim.helper.import_attributes(data["type"], props.boundary_condition_attributes, data)
for attribute in IfcStore.get_schema().declaration_by_name(boundary_condition.is_a()).all_attributes(): schema = tool.Ifc.schema()
for attribute in schema.declaration_by_name(boundary_condition.is_a()).all_attributes():
value = getattr(boundary_condition, attribute.name(), None) value = getattr(boundary_condition, attribute.name(), None)
data_type = ifcopenshell.util.attribute.get_primitive_type(attribute) data_type = ifcopenshell.util.attribute.get_primitive_type(attribute)
new = props.boundary_condition_attributes.add() new = props.boundary_condition_attributes.add()
@@ -1000,7 +1001,7 @@ class RemoveBoundaryCondition(bpy.types.Operator, tool.Ifc.Operator):
def _execute(self, context): def _execute(self, context):
props = context.scene.BIMStructuralProperties props = context.scene.BIMStructuralProperties
self.file = IfcStore.get_file() self.file = tool.Ifc.get()
ifcopenshell.api.run( ifcopenshell.api.run(
"structural.remove_structural_boundary_condition", "structural.remove_structural_boundary_condition",
self.file, self.file,
@@ -1017,7 +1018,7 @@ class EditBoundaryCondition(bpy.types.Operator, tool.Ifc.Operator):
def _execute(self, context): def _execute(self, context):
props = context.scene.BIMStructuralProperties props = context.scene.BIMStructuralProperties
self.file = IfcStore.get_file() self.file = tool.Ifc.get()
# attributes = bonsai.bim.helper.export_attributes(props.boundary_condition_attributes) # attributes = bonsai.bim.helper.export_attributes(props.boundary_condition_attributes)
attributes = {} attributes = {}
for attribute in props.boundary_condition_attributes: for attribute in props.boundary_condition_attributes:
@@ -19,7 +19,6 @@
from math import radians from math import radians
import bpy import bpy
import bonsai.tool as tool import bonsai.tool as tool
from bonsai.bim.ifc import IfcStore
from bonsai.bim.prop import StrProperty, Attribute from bonsai.bim.prop import StrProperty, Attribute
from bonsai.bim.module.structural.data import ( from bonsai.bim.module.structural.data import (
StructuralLoadCasesData, StructuralLoadCasesData,
+14 -14
View File
@@ -17,9 +17,9 @@
# along with Bonsai. If not, see <http://www.gnu.org/licenses/>. # along with Bonsai. If not, see <http://www.gnu.org/licenses/>.
import bpy import bpy
import bonsai.tool as tool
import bonsai.bim.helper import bonsai.bim.helper
from bpy.types import Panel, UIList from bpy.types import Panel, UIList
from bonsai.bim.ifc import IfcStore
from bonsai.bim.helper import draw_attributes, prop_with_search from bonsai.bim.helper import draw_attributes, prop_with_search
from bonsai.bim.module.structural.data import ( from bonsai.bim.module.structural.data import (
StructuralBoundaryConditionsData, StructuralBoundaryConditionsData,
@@ -90,9 +90,9 @@ class BIM_PT_structural_boundary_conditions(Panel):
props = context.active_object.BIMObjectProperties props = context.active_object.BIMObjectProperties
if not props.ifc_definition_id: if not props.ifc_definition_id:
return False return False
if not IfcStore.get_element(props.ifc_definition_id): if not tool.Ifc.get_object_by_identifier(props.ifc_definition_id):
return False return False
if not IfcStore.get_file().by_id(props.ifc_definition_id).is_a("IfcStructuralConnection"): if not tool.Ifc.get().by_id(props.ifc_definition_id).is_a("IfcStructuralConnection"):
return False return False
return True return True
@@ -125,9 +125,9 @@ class BIM_PT_connected_structural_members(Panel):
props = context.active_object.BIMObjectProperties props = context.active_object.BIMObjectProperties
if not props.ifc_definition_id: if not props.ifc_definition_id:
return False return False
if not IfcStore.get_element(props.ifc_definition_id): if not tool.Ifc.get_object_by_identifier(props.ifc_definition_id):
return False return False
if not IfcStore.get_file().by_id(props.ifc_definition_id).is_a("IfcStructuralConnection"): if not tool.Ifc.get().by_id(props.ifc_definition_id).is_a("IfcStructuralConnection"):
return False return False
return True return True
@@ -178,9 +178,9 @@ class BIM_PT_structural_member(Panel):
props = context.active_object.BIMObjectProperties props = context.active_object.BIMObjectProperties
if not props.ifc_definition_id: if not props.ifc_definition_id:
return False return False
if not IfcStore.get_element(props.ifc_definition_id): if not tool.Ifc.get_object_by_identifier(props.ifc_definition_id):
return False return False
if not IfcStore.get_file().by_id(props.ifc_definition_id).is_a("IfcStructuralMember"): if not tool.Ifc.get().by_id(props.ifc_definition_id).is_a("IfcStructuralMember"):
return False return False
return True return True
@@ -221,9 +221,9 @@ class BIM_PT_structural_connection(Panel):
props = context.active_object.BIMObjectProperties props = context.active_object.BIMObjectProperties
if not props.ifc_definition_id: if not props.ifc_definition_id:
return False return False
if not IfcStore.get_element(props.ifc_definition_id): if not tool.Ifc.get_object_by_identifier(props.ifc_definition_id):
return False return False
if not IfcStore.get_file().by_id(props.ifc_definition_id).is_a("IfcStructuralConnection"): if not tool.Ifc.get().by_id(props.ifc_definition_id).is_a("IfcStructuralConnection"):
return False return False
return True return True
@@ -274,7 +274,7 @@ class BIM_PT_structural_analysis_models(Panel):
@classmethod @classmethod
def poll(cls, context): def poll(cls, context):
file = IfcStore.get_file() file = tool.Ifc.get()
return file and hasattr(file, "schema") and file.schema != "IFC2X3" return file and hasattr(file, "schema") and file.schema != "IFC2X3"
def draw(self, context): def draw(self, context):
@@ -348,7 +348,7 @@ class BIM_PT_structural_load_cases(Panel):
@classmethod @classmethod
def poll(cls, context): def poll(cls, context):
file = IfcStore.get_file() file = tool.Ifc.get()
return file and hasattr(file, "schema") and file.schema != "IFC2X3" return file and hasattr(file, "schema") and file.schema != "IFC2X3"
def draw(self, context): def draw(self, context):
@@ -443,7 +443,7 @@ class BIM_PT_show_structural_activities(Panel):
@classmethod @classmethod
def poll(cls, context): def poll(cls, context):
file = IfcStore.get_file() file = tool.Ifc.get()
return file and hasattr(file, "schema") and file.schema != "IFC2X3" return file and hasattr(file, "schema") and file.schema != "IFC2X3"
def draw(self, context): def draw(self, context):
@@ -474,7 +474,7 @@ class BIM_PT_structural_loads(Panel):
@classmethod @classmethod
def poll(cls, context): def poll(cls, context):
file = IfcStore.get_file() file = tool.Ifc.get()
return file and hasattr(file, "schema") and file.schema != "IFC2X3" return file and hasattr(file, "schema") and file.schema != "IFC2X3"
def draw(self, context): def draw(self, context):
@@ -543,7 +543,7 @@ class BIM_PT_boundary_conditions(Panel):
@classmethod @classmethod
def poll(cls, context): def poll(cls, context):
file = IfcStore.get_file() file = tool.Ifc.get()
return file and hasattr(file, "schema") and file.schema != "IFC2X3" return file and hasattr(file, "schema") and file.schema != "IFC2X3"
def draw(self, context): def draw(self, context):
+1 -3
View File
@@ -20,9 +20,7 @@ import bpy
import bonsai.bim.helper import bonsai.bim.helper
import bonsai.tool as tool import bonsai.tool as tool
from bpy.types import Panel, UIList from bpy.types import Panel, UIList
from bonsai.bim.ifc import IfcStore
from bonsai.bim.module.style.data import StylesData, BlenderMaterialStyleData from bonsai.bim.module.style.data import StylesData, BlenderMaterialStyleData
from typing import Union
class BIM_PT_styles(Panel): class BIM_PT_styles(Panel):
@@ -36,7 +34,7 @@ class BIM_PT_styles(Panel):
@classmethod @classmethod
def poll(cls, context): def poll(cls, context):
return IfcStore.get_file() return tool.Ifc.get()
def draw(self, context): def draw(self, context):
if not StylesData.is_loaded: if not StylesData.is_loaded:
@@ -21,9 +21,7 @@ import ifcopenshell.api
import bonsai.tool as tool import bonsai.tool as tool
import bonsai.core.system as core import bonsai.core.system as core
import bonsai.bim.helper import bonsai.bim.helper
from bonsai.bim.ifc import IfcStore
from bonsai.bim.module.system.data import PortData from bonsai.bim.module.system.data import PortData
from mathutils import Matrix
class LoadSystems(bpy.types.Operator): class LoadSystems(bpy.types.Operator):
@@ -29,7 +29,6 @@ import bonsai.tool as tool
import bonsai.core.geometry import bonsai.core.geometry
import bonsai.core.type as core import bonsai.core.type as core
import bonsai.core.root import bonsai.core.root
from bonsai.bim.ifc import IfcStore
class AssignType(bpy.types.Operator, tool.Ifc.Operator): class AssignType(bpy.types.Operator, tool.Ifc.Operator):
@@ -66,7 +65,7 @@ class UnassignType(bpy.types.Operator, tool.Ifc.Operator):
def exclude_callback(attribute): def exclude_callback(attribute):
return attribute.is_a("IfcProfileDef") and attribute.ProfileName return attribute.is_a("IfcProfileDef") and attribute.ProfileName
self.file = IfcStore.get_file() self.file = tool.Ifc.get()
objs = [bpy.data.objects.get(self.related_object)] if self.related_object else context.selected_objects objs = [bpy.data.objects.get(self.related_object)] if self.related_object else context.selected_objects
for obj in objs: for obj in objs:
element = tool.Ifc.get_entity(obj) element = tool.Ifc.get_entity(obj)
@@ -187,7 +186,7 @@ class SelectSimilarType(bpy.types.Operator):
related_object: bpy.props.StringProperty() related_object: bpy.props.StringProperty()
def execute(self, context): def execute(self, context):
self.file = IfcStore.get_file() self.file = tool.Ifc.get()
objects = bpy.context.selected_objects objects = bpy.context.selected_objects
# store relating types to avoid selecting same elements multiple times # store relating types to avoid selecting same elements multiple times
@@ -229,7 +228,7 @@ class SelectTypeObjects(bpy.types.Operator):
relating_type: bpy.props.StringProperty() relating_type: bpy.props.StringProperty()
def execute(self, context): def execute(self, context):
self.file = IfcStore.get_file() self.file = tool.Ifc.get()
relating_type = bpy.data.objects.get(self.relating_type) if self.relating_type else context.active_object relating_type = bpy.data.objects.get(self.relating_type) if self.relating_type else context.active_object
at_least_one_selectable_typed_object = False at_least_one_selectable_typed_object = False
for element in ifcopenshell.util.element.get_types(tool.Ifc.get_entity(relating_type)): for element in ifcopenshell.util.element.get_types(tool.Ifc.get_entity(relating_type)):
@@ -20,8 +20,6 @@ import bpy
import ifcopenshell.util.element import ifcopenshell.util.element
import ifcopenshell.util.type import ifcopenshell.util.type
from bonsai.bim.module.type.data import TypeData from bonsai.bim.module.type.data import TypeData
from bonsai.bim.prop import StrProperty, Attribute
from bonsai.bim.ifc import IfcStore
import bonsai.tool as tool import bonsai.tool as tool
from bpy.types import PropertyGroup from bpy.types import PropertyGroup
from bpy.props import ( from bpy.props import (
-1
View File
@@ -19,7 +19,6 @@
import bonsai.tool as tool import bonsai.tool as tool
import bonsai.bim.module.type.prop as type_prop import bonsai.bim.module.type.prop as type_prop
from bpy.types import Panel from bpy.types import Panel
from bonsai.bim.ifc import IfcStore
from bonsai.bim.helper import prop_with_search from bonsai.bim.helper import prop_with_search
from bonsai.bim.module.type.data import TypeData from bonsai.bim.module.type.data import TypeData
@@ -17,7 +17,6 @@
# along with Bonsai. If not, see <http://www.gnu.org/licenses/>. # along with Bonsai. If not, see <http://www.gnu.org/licenses/>.
import bpy import bpy
from bonsai.bim.ifc import IfcStore
from bonsai.bim.prop import StrProperty, Attribute from bonsai.bim.prop import StrProperty, Attribute
from bonsai.bim.module.unit.data import UnitsData from bonsai.bim.module.unit.data import UnitsData
from bpy.types import PropertyGroup from bpy.types import PropertyGroup
+2 -2
View File
@@ -17,8 +17,8 @@
# along with Bonsai. If not, see <http://www.gnu.org/licenses/>. # along with Bonsai. If not, see <http://www.gnu.org/licenses/>.
import bonsai.bim.helper import bonsai.bim.helper
import bonsai.tool as tool
from bpy.types import Panel, UIList from bpy.types import Panel, UIList
from bonsai.bim.ifc import IfcStore
from bonsai.bim.helper import prop_with_search from bonsai.bim.helper import prop_with_search
from bonsai.bim.module.unit.data import UnitsData from bonsai.bim.module.unit.data import UnitsData
@@ -34,7 +34,7 @@ class BIM_PT_units(Panel):
@classmethod @classmethod
def poll(cls, context): def poll(cls, context):
file = IfcStore.get_file() file = tool.Ifc.get()
return file return file
def draw(self, context): def draw(self, context):
@@ -24,7 +24,6 @@ import bonsai.tool as tool
import bonsai.core.geometry import bonsai.core.geometry
import bonsai.core.root import bonsai.core.root
import bonsai.bim.handler import bonsai.bim.handler
from bonsai.bim.ifc import IfcStore
from bonsai.bim.module.model.opening import FilledOpeningGenerator from bonsai.bim.module.model.opening import FilledOpeningGenerator
@@ -98,7 +97,7 @@ class AddOpening(bpy.types.Operator, tool.Ifc.Operator):
break break
element_had_openings = tool.Geometry.has_openings(voided_element) element_had_openings = tool.Geometry.has_openings(voided_element)
body_context = ifcopenshell.util.representation.get_context(IfcStore.get_file(), "Model", "Body") body_context = ifcopenshell.util.representation.get_context(tool.Ifc.get(), "Model", "Body")
if not element2: if not element2:
element2 = bonsai.core.root.assign_class( element2 = bonsai.core.root.assign_class(
tool.Ifc, tool.Ifc,
@@ -215,7 +214,7 @@ class AddFilling(bpy.types.Operator, tool.Ifc.Operator):
opening = context.scene.objects.get(self.opening, context.scene.VoidProperties.desired_opening) opening = context.scene.objects.get(self.opening, context.scene.VoidProperties.desired_opening)
if opening is None: if opening is None:
return {"FINISHED"} return {"FINISHED"}
self.file = IfcStore.get_file() self.file = tool.Ifc.get()
element_id = obj.BIMObjectProperties.ifc_definition_id element_id = obj.BIMObjectProperties.ifc_definition_id
opening_id = opening.BIMObjectProperties.ifc_definition_id opening_id = opening.BIMObjectProperties.ifc_definition_id
if not element_id or not opening_id or element_id == opening_id: if not element_id or not opening_id or element_id == opening_id:
+5 -1
View File
@@ -129,9 +129,13 @@ class Ifc(bonsai.core.tool.Ifc):
return None return None
@classmethod @classmethod
def get_object(cls, element: ifcopenshell.entity_instance) -> IFC_CONNECTED_TYPE: def get_object(cls, element: ifcopenshell.entity_instance) -> Union[IFC_CONNECTED_TYPE, None]:
return IfcStore.get_element(element.id()) return IfcStore.get_element(element.id())
@classmethod
def get_object_by_identifier(cls, id_or_guid: Union[int, str]) -> Union[IFC_CONNECTED_TYPE, None]:
return IfcStore.get_element(id_or_guid)
@classmethod @classmethod
def rebuild_element_maps(cls) -> None: def rebuild_element_maps(cls) -> None:
"""Rebuilds the id_map and guid_map """Rebuilds the id_map and guid_map
+2 -3
View File
@@ -23,8 +23,6 @@ import json
import bonsai.bim.helper import bonsai.bim.helper
import bonsai.core.tool import bonsai.core.tool
import bonsai.tool as tool import bonsai.tool as tool
from bonsai.bim.ifc import IfcStore
from pprint import pprint
from typing import Union, Any from typing import Union, Any
@@ -129,7 +127,8 @@ class Structural(bonsai.core.tool.Structural):
def load_structural_analysis_model_attributes(cls, data: dict[str, Any]) -> None: def load_structural_analysis_model_attributes(cls, data: dict[str, Any]) -> None:
props = bpy.context.scene.BIMStructuralProperties props = bpy.context.scene.BIMStructuralProperties
props.structural_analysis_model_attributes.clear() props.structural_analysis_model_attributes.clear()
for attribute in IfcStore.get_schema().declaration_by_name("IfcStructuralAnalysisModel").all_attributes(): schema = tool.Ifc.schema()
for attribute in schema.declaration_by_name("IfcStructuralAnalysisModel").all_attributes():
data_type = str(attribute.type_of_attribute) data_type = str(attribute.type_of_attribute)
if "<entity" in data_type: if "<entity" in data_type:
continue continue
@@ -62,7 +62,7 @@ Instead, stuff happens in Blender operators.
return IfcStore.execute_ifc_operator(self, context) return IfcStore.execute_ifc_operator(self, context)
def _execute(self, context): def _execute(self, context):
ifcopenshell.api.run("foo.bar", IfcStore.get_file()) ifcopenshell.api.run("foo.bar", tool.Ifc.get())
return {"FINISHED"} return {"FINISHED"}
When your operator manipulates (creates, removes, or edits) IFC data directly or When your operator manipulates (creates, removes, or edits) IFC data directly or
-1
View File
@@ -2,7 +2,6 @@
import bpy import bpy
import bonsai.tool as tool import bonsai.tool as tool
from bonsai.bim.ifc import IfcStore
# When federating, you may wish to manually specify the origin to ensure models # When federating, you may wish to manually specify the origin to ensure models
# with different or arbitrary origin conventions will turn up in the right spot. # with different or arbitrary origin conventions will turn up in the right spot.
+9 -9
View File
@@ -174,14 +174,14 @@ def the_object_name_exists(name):
def an_ifc_file_exists(): def an_ifc_file_exists():
ifc = IfcStore.get_file() ifc = tool.Ifc.get()
if not ifc: if not ifc:
assert False, "No IFC file is available" assert False, "No IFC file is available"
return ifc return ifc
def an_ifc_file_does_not_exist(): def an_ifc_file_does_not_exist():
ifc = IfcStore.get_file() ifc = tool.Ifc.get()
if ifc: if ifc:
assert False, "An IFC is available" assert False, "An IFC is available"
@@ -283,7 +283,7 @@ def the_object_name1_has_no_boolean_difference_by_name2(name1, name2):
def the_object_name_is_voided_by_void(name, void): def the_object_name_is_voided_by_void(name, void):
ifc = IfcStore.get_file() ifc = tool.Ifc.get()
element = ifc.by_id(the_object_name_exists(name).BIMObjectProperties.ifc_definition_id) element = ifc.by_id(the_object_name_exists(name).BIMObjectProperties.ifc_definition_id)
for rel in element.HasOpenings: for rel in element.HasOpenings:
if rel.RelatedOpeningElement.Name == void: if rel.RelatedOpeningElement.Name == void:
@@ -292,7 +292,7 @@ def the_object_name_is_voided_by_void(name, void):
def the_object_name_is_not_voided_by_void(name, void): def the_object_name_is_not_voided_by_void(name, void):
ifc = IfcStore.get_file() ifc = tool.Ifc.get()
element = ifc.by_id(the_object_name_exists(name).BIMObjectProperties.ifc_definition_id) element = ifc.by_id(the_object_name_exists(name).BIMObjectProperties.ifc_definition_id)
for rel in element.HasOpenings: for rel in element.HasOpenings:
if rel.RelatedOpeningElement.Name == void: if rel.RelatedOpeningElement.Name == void:
@@ -300,21 +300,21 @@ def the_object_name_is_not_voided_by_void(name, void):
def the_object_name_is_not_voided(name): def the_object_name_is_not_voided(name):
ifc = IfcStore.get_file() ifc = tool.Ifc.get()
element = ifc.by_id(the_object_name_exists(name).BIMObjectProperties.ifc_definition_id) element = ifc.by_id(the_object_name_exists(name).BIMObjectProperties.ifc_definition_id)
if any(element.HasOpenings): if any(element.HasOpenings):
assert False, "An opening was found" assert False, "An opening was found"
def the_object_name_is_not_a_void(name): def the_object_name_is_not_a_void(name):
ifc = IfcStore.get_file() ifc = tool.Ifc.get()
element = ifc.by_id(the_object_name_exists(name).BIMObjectProperties.ifc_definition_id) element = ifc.by_id(the_object_name_exists(name).BIMObjectProperties.ifc_definition_id)
if any(element.VoidsElements): if any(element.VoidsElements):
assert False, "A void was found" assert False, "A void was found"
def the_void_name_is_filled_by_filling(name, filling): def the_void_name_is_filled_by_filling(name, filling):
ifc = IfcStore.get_file() ifc = tool.Ifc.get()
element = ifc.by_id(the_object_name_exists(name).BIMObjectProperties.ifc_definition_id) element = ifc.by_id(the_object_name_exists(name).BIMObjectProperties.ifc_definition_id)
if any(rel.RelatedBuildingElement.Name == filling for rel in element.HasFillings): if any(rel.RelatedBuildingElement.Name == filling for rel in element.HasFillings):
return True return True
@@ -322,14 +322,14 @@ def the_void_name_is_filled_by_filling(name, filling):
def the_void_name_is_not_filled_by_filling(name, filling): def the_void_name_is_not_filled_by_filling(name, filling):
ifc = IfcStore.get_file() ifc = tool.Ifc.get()
element = ifc.by_id(the_object_name_exists(name).BIMObjectProperties.ifc_definition_id) element = ifc.by_id(the_object_name_exists(name).BIMObjectProperties.ifc_definition_id)
if any(rel.RelatedBuildingElement.Name == filling for rel in element.HasFillings): if any(rel.RelatedBuildingElement.Name == filling for rel in element.HasFillings):
assert False, "A filling was found" assert False, "A filling was found"
def the_object_name_is_not_a_filling(name): def the_object_name_is_not_a_filling(name):
ifc = IfcStore.get_file() ifc = tool.Ifc.get()
element = ifc.by_id(the_object_name_exists(name).BIMObjectProperties.ifc_definition_id) element = ifc.by_id(the_object_name_exists(name).BIMObjectProperties.ifc_definition_id)
if any(element.FillsVoids): if any(element.FillsVoids):
assert False, "A filling was found" assert False, "A filling was found"
+7 -7
View File
@@ -786,14 +786,14 @@ def the_ifc_material_name_does_not_exist(name):
@then("an IFC file does not exist") @then("an IFC file does not exist")
def an_ifc_file_does_not_exist(): def an_ifc_file_does_not_exist():
ifc = IfcStore.get_file() ifc = tool.Ifc.get()
if ifc: if ifc:
assert False, "An IFC is available" assert False, "An IFC is available"
@then("an IFC file exists") @then("an IFC file exists")
def an_ifc_file_exists(): def an_ifc_file_exists():
ifc = IfcStore.get_file() ifc = tool.Ifc.get()
if not ifc: if not ifc:
assert False, "No IFC file is available" assert False, "No IFC file is available"
return ifc return ifc
@@ -807,7 +807,7 @@ def the_object_name_should_display_as_mode(name, mode):
@then(parsers.parse('the object "{name}" is voided by "{void}"')) @then(parsers.parse('the object "{name}" is voided by "{void}"'))
def the_object_name_is_voided_by_void(name, void): def the_object_name_is_voided_by_void(name, void):
ifc = IfcStore.get_file() ifc = tool.Ifc.get()
element = ifc.by_id(the_object_name_exists(name).BIMObjectProperties.ifc_definition_id) element = ifc.by_id(the_object_name_exists(name).BIMObjectProperties.ifc_definition_id)
assert any((rel for rel in element.HasOpenings if rel.RelatedOpeningElement.Name == void)), "No void found" assert any((rel for rel in element.HasOpenings if rel.RelatedOpeningElement.Name == void)), "No void found"
@@ -823,14 +823,14 @@ def the_object_name_is_not_voided_by_void(name, void):
@then(parsers.parse('the object "{name}" is not voided')) @then(parsers.parse('the object "{name}" is not voided'))
def the_object_name_is_not_voided(name): def the_object_name_is_not_voided(name):
ifc = IfcStore.get_file() ifc = tool.Ifc.get()
element = ifc.by_id(the_object_name_exists(name).BIMObjectProperties.ifc_definition_id) element = ifc.by_id(the_object_name_exists(name).BIMObjectProperties.ifc_definition_id)
assert not element.HasOpenings, "A void was found" assert not element.HasOpenings, "A void was found"
@then(parsers.parse('the object "{name}" is a void')) @then(parsers.parse('the object "{name}" is a void'))
def the_object_name_is_a_void(name): def the_object_name_is_a_void(name):
ifc = IfcStore.get_file() ifc = tool.Ifc.get()
obj = the_object_name_exists(name) obj = the_object_name_exists(name)
element = ifc.by_id(obj.BIMObjectProperties.ifc_definition_id) element = ifc.by_id(obj.BIMObjectProperties.ifc_definition_id)
assert any((element.VoidsElements)), "No void was found" assert any((element.VoidsElements)), "No void was found"
@@ -936,7 +936,7 @@ def the_object_name_has_number_vertices(name, number):
@then(parsers.parse('the void "{name}" is filled by "{filling}"')) @then(parsers.parse('the void "{name}" is filled by "{filling}"'))
def the_void_name_is_filled_by_filling(name, filling): def the_void_name_is_filled_by_filling(name, filling):
ifc = IfcStore.get_file() ifc = tool.Ifc.get()
element = ifc.by_id(the_object_name_exists(name).BIMObjectProperties.ifc_definition_id) element = ifc.by_id(the_object_name_exists(name).BIMObjectProperties.ifc_definition_id)
assert any((rel.RelatedBuildingElement.Name == filling for rel in element.HasFillings)), "No filling found" assert any((rel.RelatedBuildingElement.Name == filling for rel in element.HasFillings)), "No filling found"
@@ -953,7 +953,7 @@ def the_void_name_is_not_filled_by_filling(name, filling):
@when(parsers.parse('the object "{name}" is not a filling')) @when(parsers.parse('the object "{name}" is not a filling'))
@then(parsers.parse('the object "{name}" is not a filling')) @then(parsers.parse('the object "{name}" is not a filling'))
def the_object_name_is_not_a_filling(name): def the_object_name_is_not_a_filling(name):
ifc = IfcStore.get_file() ifc = tool.Ifc.get()
element = ifc.by_id(the_object_name_exists(name).BIMObjectProperties.ifc_definition_id) element = ifc.by_id(the_object_name_exists(name).BIMObjectProperties.ifc_definition_id)
assert not any(element.FillsVoids), "A filling was found" assert not any(element.FillsVoids), "A filling was found"
-1
View File
@@ -27,7 +27,6 @@ import bonsai.core.tool
import bonsai.tool as tool import bonsai.tool as tool
from test.bim.bootstrap import NewFile from test.bim.bootstrap import NewFile
from bonsai.tool.drawing import Drawing as subject from bonsai.tool.drawing import Drawing as subject
from bonsai.bim.ifc import IfcStore
from bonsai.bim.module.drawing.data import DecoratorData from bonsai.bim.module.drawing.data import DecoratorData
from mathutils import Vector from mathutils import Vector
-1
View File
@@ -24,7 +24,6 @@ import test.bim.bootstrap
import bonsai.core.tool import bonsai.core.tool
import bonsai.tool as tool import bonsai.tool as tool
from bonsai.tool.misc import Misc as subject from bonsai.tool.misc import Misc as subject
from bonsai.bim.ifc import IfcStore
class TestImplementsTool(test.bim.bootstrap.NewFile): class TestImplementsTool(test.bim.bootstrap.NewFile):
@@ -71,7 +71,6 @@ class Patcher:
import bonsai.tool as tool import bonsai.tool as tool
import ifcopenshell import ifcopenshell
import ifcopenshell.util.element import ifcopenshell.util.element
from bonsai.bim.ifc import IfcStore
from mathutils import Vector, Matrix from mathutils import Vector, Matrix
if len(bpy.data.objects) > 0: if len(bpy.data.objects) > 0:
@@ -114,8 +113,8 @@ class Patcher:
bpy.ops.bim.update_representation( bpy.ops.bim.update_representation(
ifc_representation_class="IfcExtrudedAreaSolid/IfcArbitraryProfileDefWithVoids" ifc_representation_class="IfcExtrudedAreaSolid/IfcArbitraryProfileDefWithVoids"
) )
for context in IfcStore.get_file().by_type("IfcGeometricRepresentationContext", include_subtypes=False): for context in tool.Ifc.get().by_type("IfcGeometricRepresentationContext", include_subtypes=False):
if context.Precision: if context.Precision:
context.Precision = 10 context.Precision = 10
self.file = IfcStore.get_file() self.file = tool.Ifc.get()