Fix #1848. Purge remaining references to API data classes.

This commit is contained in:
Dion Moult
2023-02-01 15:41:21 +11:00
parent 4efb80efe4
commit a778b98fdb
20 changed files with 35 additions and 113 deletions
-5
View File
@@ -27,8 +27,6 @@ from bpy.app.handlers import persistent
from blenderbim.bim.ifc import IfcStore
from blenderbim.bim.module.owner.prop import get_user_person, get_user_organisation
from blenderbim.bim.module.model.data import AuthoringData
from ifcopenshell.api.material.data import Data as MaterialData
from ifcopenshell.api.type.data import Data as TypeData
global_subscription_owner = object()
@@ -67,7 +65,6 @@ def name_callback(obj, data):
if isinstance(obj, bpy.types.Material):
if obj.BIMObjectProperties.ifc_definition_id:
IfcStore.get_file().by_id(obj.BIMObjectProperties.ifc_definition_id).Name = obj.name
MaterialData.load_materials()
if obj.BIMMaterialProperties.ifc_style_id:
IfcStore.get_file().by_id(obj.BIMMaterialProperties.ifc_style_id).Name = obj.name
refresh_ui_data()
@@ -91,8 +88,6 @@ def name_callback(obj, data):
break
if grid_collection:
grid_collection.name = obj.name
if element.is_a("IfcTypeProduct"):
TypeData.purge()
element.Name = "/".join(obj.name.split("/")[1:])
refresh_ui_data()
@@ -25,7 +25,6 @@ import blenderbim.bim.handler
import blenderbim.tool as tool
import blenderbim.core.attribute as core
from blenderbim.bim.ifc import IfcStore
from ifcopenshell.api.attribute.data import Data
class Operator:
@@ -51,8 +50,6 @@ class EnableEditingAttributes(bpy.types.Operator):
oprops = obj.BIMObjectProperties
props = obj.BIMAttributeProperties
props.attributes.clear()
if oprops.ifc_definition_id not in Data.products:
Data.load(IfcStore.get_file(), oprops.ifc_definition_id)
blenderbim.bim.helper.import_attributes2(tool.Ifc.get().by_id(oprops.ifc_definition_id), props.attributes)
props.is_editing_attributes = True
return {"FINISHED"}
@@ -88,33 +85,10 @@ class EditAttributes(bpy.types.Operator, Operator):
obj = bpy.data.objects.get(self.obj)
elif self.obj_type == "Material":
obj = bpy.data.materials.get(self.obj)
oprops = obj.BIMObjectProperties
props = obj.BIMAttributeProperties
attributes = {}
for attribute in Data.products[oprops.ifc_definition_id]:
blender_attribute = props.attributes.get(attribute["name"])
if not blender_attribute:
continue
if attribute["is_optional"] and blender_attribute.is_null:
attributes[attribute["name"]] = None
elif attribute["type"] == "string":
attributes[attribute["name"]] = blender_attribute.string_value
elif attribute["type"] == "list":
values = blender_attribute.string_value[1:-1].split(", ")
if attribute["list_type"] == "float":
values = [float(v) for v in values]
elif attribute["list_type"] == "integer":
values = [int(v) for v in values]
attributes[attribute["name"]] = values
elif attribute["type"] == "integer":
attributes[attribute["name"]] = blender_attribute.int_value
elif attribute["type"] == "float":
attributes[attribute["name"]] = blender_attribute.float_value
elif attribute["type"] == "enum":
attributes[attribute["name"]] = blender_attribute.enum_value
product = self.file.by_id(oprops.ifc_definition_id)
ifcopenshell.api.run("attribute.edit_attributes", self.file, **{"product": product, "attributes": attributes})
Data.load(IfcStore.get_file(), oprops.ifc_definition_id)
product = tool.Ifc.get_entity(obj)
attributes = blenderbim.bim.helper.export_attributes(props.attributes)
ifcopenshell.api.run("attribute.edit_attributes", self.file, product=product, attributes=attributes)
bpy.ops.bim.disable_editing_attributes(obj=obj.name, obj_type=self.obj_type)
return {"FINISHED"}
@@ -22,7 +22,6 @@ import blenderbim.core.context as core
import blenderbim.bim.module.context.data
import blenderbim.bim.handler
from blenderbim.bim.ifc import IfcStore
from ifcopenshell.api.context.data import Data
class Operator:
@@ -23,7 +23,6 @@ import ifcopenshell.util.attribute
import blenderbim.tool as tool
import blenderbim.core.document as core
from blenderbim.bim.ifc import IfcStore
from ifcopenshell.api.document.data import Data
class LoadProjectDocuments(bpy.types.Operator, tool.Ifc.Operator):
@@ -44,8 +44,6 @@ from mathutils import Vector
from timeit import default_timer as timer
from blenderbim.bim.module.drawing.prop import RasterStyleProperty
from blenderbim.bim.ifc import IfcStore
from ifcopenshell.api.group.data import Data as GroupData
from ifcopenshell.api.pset.data import Data as PsetData
cwd = os.path.dirname(os.path.realpath(__file__))
@@ -1346,4 +1344,4 @@ class SelectAssignedProduct(bpy.types.Operator, Operator):
bl_options = {"REGISTER", "UNDO"}
def _execute(self, context):
core.select_assigned_product(tool.Drawing)
core.select_assigned_product(tool.Drawing)
@@ -31,9 +31,6 @@ import blenderbim.core.root
import blenderbim.tool as tool
import blenderbim.bim.handler
from mathutils import Vector
from ifcopenshell.api.geometry.data import Data
from ifcopenshell.api.context.data import Data as ContextData
from ifcopenshell.api.void.data import Data as VoidData
from blenderbim.bim import import_ifc
from blenderbim.bim.ifc import IfcStore
from blenderbim.bim.module.root.prop import get_contexts
@@ -168,9 +165,6 @@ class UpdateRepresentation(bpy.types.Operator):
return IfcStore.execute_ifc_operator(self, context)
def _execute(self, context):
if not ContextData.is_loaded:
ContextData.load(IfcStore.get_file())
if context.active_object and context.active_object.mode != "OBJECT":
# Ensure mode is object to prevent invalid mesh data causing CTD
bpy.ops.object.mode_set(mode="OBJECT", toggle=False)
@@ -266,7 +260,6 @@ class UpdateRepresentation(bpy.types.Operator):
obj.data.BIMMeshProperties.ifc_definition_id = int(new_representation.id())
obj.data.name = f"{old_representation.ContextOfItems.id()}/{new_representation.id()}"
core.remove_representation(tool.Ifc, tool.Geometry, obj=obj, representation=old_representation)
Data.load(self.file, obj.BIMObjectProperties.ifc_definition_id)
if obj.data.BIMMeshProperties.ifc_parameters:
core.get_representation_ifc_parameters(tool.Geometry, obj=obj)
@@ -18,7 +18,6 @@
import blenderbim.bim.helper
from bpy.types import Panel, UIList
from ifcopenshell.api.material.data import Data
from blenderbim.bim.ifc import IfcStore
from blenderbim.bim.helper import draw_attributes
from blenderbim.bim.helper import prop_with_search
@@ -33,7 +33,6 @@ from blenderbim.bim.ifc import IfcStore
from blenderbim.bim.module.model.data import AuthoringData
from blenderbim.bim.module.model.prop import store_cursor_position
from blenderbim.bim.helper import draw_image_for_ifc_profile
from ifcopenshell.api.pset.data import Data as PsetData
from mathutils import Vector, Matrix
from bpy_extras.object_utils import AddObjectHelper
from . import prop
@@ -32,8 +32,6 @@ import blenderbim.core.geometry
from blenderbim.bim.ifc import IfcStore
from math import pi, degrees, inf
from mathutils import Vector, Matrix
from ifcopenshell.api.pset.data import Data as PsetData
from ifcopenshell.api.material.data import Data as MaterialData
from blenderbim.bim.module.geometry.helper import Helper
@@ -191,7 +189,6 @@ class DumbProfileGenerator:
pset = ifcopenshell.api.run("pset.add_pset", self.file, product=element, name="EPset_Parametric")
ifcopenshell.api.run("pset.edit_pset", self.file, pset=pset, properties={"Engine": "BlenderBIM.DumbProfile"})
MaterialData.load(self.file)
if link_to_scene:
obj.select_set(True)
@@ -37,8 +37,6 @@ from bpy.types import SpaceView3D
from blenderbim.bim.ifc import IfcStore
from math import pi, degrees, sin, cos, radians
from mathutils import Vector, Matrix
from ifcopenshell.api.pset.data import Data as PsetData
from ifcopenshell.api.material.data import Data as MaterialData
from blenderbim.bim.module.geometry.helper import Helper
from gpu.types import GPUShader, GPUBatch, GPUIndexBuf, GPUVertBuf, GPUVertFormat
from gpu_extras.batch import batch_for_shader
@@ -118,7 +116,6 @@ def calculate_quantities(usecase_path, ifc_file, settings):
)
ifcopenshell.api.run("pset.edit_qto", ifc_file, should_run_listeners=False, qto=qto, properties=properties)
PsetData.load(ifc_file, obj.BIMObjectProperties.ifc_definition_id)
class DumbSlabGenerator:
@@ -228,7 +225,6 @@ class DumbSlabGenerator:
pset = ifcopenshell.api.run("pset.add_pset", self.file, product=element, name="EPset_Parametric")
ifcopenshell.api.run("pset.edit_pset", self.file, pset=pset, properties={"Engine": "BlenderBIM.DumbLayer3"})
MaterialData.load(self.file)
obj.select_set(True)
return obj
@@ -19,7 +19,6 @@
import ifcopenshell
import ifcopenshell.api
import ifcopenshell.util.date
from ifcopenshell.api.pset.data import Data as PsetData
def calculate_quantities(usecase_path, ifc_file, settings):
@@ -43,4 +42,3 @@ def calculate_quantities(usecase_path, ifc_file, settings):
"StandardWork": ifcopenshell.util.date.ifc2datetime(element.ScheduleDuration).days,
},
)
PsetData.load(ifc_file, task.id())
@@ -32,8 +32,6 @@ import blenderbim.core.root
import blenderbim.core.geometry
import blenderbim.tool as tool
from blenderbim.bim.ifc import IfcStore
from ifcopenshell.api.pset.data import Data as PsetData
from ifcopenshell.api.material.data import Data as MaterialData
from math import pi, sin, cos, degrees, radians
from mathutils import Vector, Matrix
@@ -660,7 +658,6 @@ class DumbWallGenerator:
)
pset = ifcopenshell.api.run("pset.add_pset", self.file, product=element, name="EPset_Parametric")
ifcopenshell.api.run("pset.edit_pset", self.file, pset=pset, properties={"Engine": "BlenderBIM.DumbLayer2"})
MaterialData.load(self.file)
obj.select_set(True)
return obj
@@ -719,7 +716,6 @@ def calculate_quantities(usecase_path, ifc_file, settings):
"NetVolume": round(net_volume, 2),
},
)
PsetData.load(ifc_file, obj.BIMObjectProperties.ifc_definition_id)
class DumbWallPlaner:
@@ -789,7 +785,6 @@ class DumbWallJoiner:
connection = "ATEND" if connection > 0.5 else "ATSTART"
wall2 = self.duplicate_wall(wall1)
MaterialData.load(tool.Ifc.get())
element2 = tool.Ifc.get_entity(wall2)
ifcopenshell.api.run("geometry.disconnect_path", tool.Ifc.get(), element=element1, connection_type="ATEND")
@@ -34,7 +34,6 @@ from blenderbim.bim.ifc import IfcStore
from blenderbim.bim.ui import IFCFileSelector
from blenderbim.bim import import_ifc
from blenderbim.bim import export_ifc
from ifcopenshell.api.context.data import Data as ContextData
class CreateProject(bpy.types.Operator):
@@ -30,8 +30,6 @@ import blenderbim.core.pset as core
import blenderbim.core.qto as QtoCore
import blenderbim.bim.module.pset.data
from blenderbim.bim.ifc import IfcStore
from ifcopenshell.api.pset.data import Data
from ifcopenshell.api.cost.data import Data as CostData
from blenderbim.bim.module.pset.qto_calculator import QtoCalculator
from blenderbim.bim.module.pset.calc_quantity_function_mapper import mapper
@@ -85,23 +83,22 @@ class EnablePsetEditing(bpy.types.Operator):
self.props = get_pset_props(context, self.obj, self.obj_type)
self.props.properties.clear()
ifc_definition_id = blenderbim.bim.helper.get_obj_ifc_definition_id(context, self.obj, self.obj_type)
Data.load(IfcStore.get_file(), ifc_definition_id)
data = Data.psets if self.pset_id in Data.psets else Data.qtos
pset_data = data[self.pset_id]
self.props.active_pset_name = pset_data["Name"]
pset = tool.Ifc.get().by_id(self.pset_id)
self.props.active_pset_name = pset.Name
pset_template = blenderbim.bim.schema.ifc.psetqto.get_by_name(pset_data["Name"])
pset_template = blenderbim.bim.schema.ifc.psetqto.get_by_name(pset.Name)
if pset_template:
self.load_from_pset_template(pset_template, pset_data)
self.load_from_pset_template(pset_template, pset)
else:
self.load_from_pset_data(pset_data)
self.load_from_pset_data(pset)
self.props.active_pset_id = self.pset_id
return {"FINISHED"}
def load_from_pset_template(self, pset_template, pset_data):
data = {Data.properties[p]["Name"]: Data.properties[p]["NominalValue"] for p in pset_data["Properties"]}
def load_from_pset_template(self, pset_template, pset):
data = ifcopenshell.util.element.get_property_definition(pset)
del data["id"]
for prop_template in pset_template.HasPropertyTemplates:
if not prop_template.is_a("IfcSimplePropertyTemplate"):
continue # Other types not yet supported
@@ -173,21 +170,26 @@ class EnablePsetEditing(bpy.types.Operator):
setattr(new, data_type, enum)
new.is_selected = enum in selected_enum_items
def load_from_pset_data(self, pset_data):
for prop_id in pset_data["Properties"]:
prop = Data.properties[prop_id]
def load_from_pset_data(self, pset):
if pset.is_a("IfcElementQuantity"):
props = pset.Quantities
elif pset.is_a("IfcPropertySet"):
props = pset.HasProperties
elif pset.is_a("IfcMaterialProperties") or pset.is_a("IfcProfileProperties"):
props = pset.Properties
if prop["type"] == "IfcPropertyEnumeratedValue":
for prop in props:
if prop.is_a("IfcPropertyEnumeratedValue"):
simple_prop = self.props.properties.add()
simple_prop.value_type = "IfcPropertyEnumeratedValue"
metadata = simple_prop.metadata
metadata.name = prop["Name"]
metadata.name = prop.Name
metadata.is_null = len(simple_prop.enumerated_value.enumerated_values) == 0
metadata.is_optional = True
metadata.set_value(prop["EnumerationReference"].EnumerationValues[0].wrappedValue)
metadata.set_value(prop.EnumerationReference.EnumerationValues[0].wrappedValue)
enum_items = [v.wrappedValue for v in prop["EnumerationReference"].EnumerationValues]
selected_enum_items = [v.wrappedValue for v in prop["EnumerationValues"]]
enum_items = [v.wrappedValue for v in prop.EnumerationReference.EnumerationValues]
selected_enum_items = [v.wrappedValue for v in prop.EnumerationValues]
data_type = metadata.get_value_name()
for enum in enum_items:
@@ -195,11 +197,14 @@ class EnablePsetEditing(bpy.types.Operator):
setattr(new, data_type, enum)
new.is_selected = enum in selected_enum_items
else:
value = prop["NominalValue"]
if prop.is_a("IfcSimplePropertyTemplate"):
value = prop.NominalValue.wrappedValue
elif prop.is_a("IfcPhysicalSimpleQuantity"):
value = prop[3]
new_prop = self.props.properties.add()
metadata = new_prop.metadata
metadata.set_value(value)
metadata.name = prop["Name"]
metadata.name = prop.Name
metadata.is_null = value is None
metadata.is_optional = True
metadata.set_value(metadata.get_value_default() if metadata.is_null else value)
@@ -236,7 +241,6 @@ class EditPset(bpy.types.Operator, Operator):
if self.properties:
properties = json.loads(self.properties)
else:
data = Data.psets if pset_id in Data.psets else Data.qtos
for prop in props.properties:
if prop.value_type == "IfcPropertySingleValue":
properties[prop.metadata.name] = prop.metadata.get_value()
@@ -246,7 +250,7 @@ class EditPset(bpy.types.Operator, Operator):
e[value_name] for e in prop.enumerated_value.enumerated_values if e.is_selected
]
if pset_id in Data.psets:
if tool.Ifc.get().by_id(pset_id).is_a("IfcPropertySet"):
ifcopenshell.api.run(
"pset.edit_pset",
self.file,
@@ -270,9 +274,7 @@ class EditPset(bpy.types.Operator, Operator):
"properties": properties,
},
)
CostData.purge()
bpy.ops.bim.load_cost_item_quantities()
Data.load(IfcStore.get_file(), ifc_definition_id)
bpy.ops.bim.disable_pset_editing(obj=self.obj, obj_type=self.obj_type)
@@ -302,7 +304,6 @@ class RemovePset(bpy.types.Operator, Operator):
ifcopenshell.api.run(
"pset.remove_pset", tool.Ifc.get(), product=element, pset=tool.Ifc.get().by_id(pset["id"])
)
Data.load(IfcStore.get_file(), ifc_definition_id)
class AddPset(bpy.types.Operator, Operator):
@@ -329,7 +330,6 @@ class AddPset(bpy.types.Operator, Operator):
element = tool.Ifc.get().by_id(ifc_definition_id)
if pset_name in blenderbim.bim.schema.ifc.psetqto.get_applicable_names(element.is_a(), pset_only=True):
ifcopenshell.api.run("pset.add_pset", self.file, product=element, name=pset_name)
Data.load(IfcStore.get_file(), ifc_definition_id)
class AddQto(bpy.types.Operator, Operator):
@@ -352,7 +352,6 @@ class AddQto(bpy.types.Operator, Operator):
"name": props.qto_name,
},
)
Data.load(IfcStore.get_file(), ifc_definition_id)
class CalculateQuantity(bpy.types.Operator):
@@ -536,7 +535,6 @@ class BIM_OT_rename_parameters(bpy.types.Operator):
continue
if prop2map.existing_property_name == obj_prop.Name:
obj_prop.Name = prop2map.new_property_name
Data.load(IfcStore.get_file(), ifc_element.id())
class BIM_OT_add_edit_custom_property(bpy.types.Operator):
@@ -572,7 +570,6 @@ class BIM_OT_add_edit_custom_property(bpy.types.Operator):
ifcopenshell.api.run(
"pset.edit_pset", self.file, pset=new_pset, properties={prop.property_name: value_ifc_entity}
)
Data.load(IfcStore.get_file(), ifc_definition_id)
self.report({"INFO"}, "Finished applying changes")
return {"FINISHED"}
@@ -634,7 +631,6 @@ class BIM_OT_bulk_remove_psets(bpy.types.Operator):
)
except KeyError:
pass # Sometimes the pset id is not found, I'm not sure why this happens though. - vulevukusej
Data.load(IfcStore.get_file(), ifc_definition_id)
self.report({"INFO"}, "Finished applying changes")
return {"FINISHED"}
@@ -18,10 +18,10 @@
import bpy
import blenderbim.bim.schema
from blenderbim.bim.prop import Attribute, StrProperty
import ifcopenshell
from ifcopenshell.api.pset.data import Data
import ifcopenshell.util.element
import blenderbim.tool as tool
from blenderbim.bim.prop import Attribute, StrProperty
from blenderbim.bim.module.pset.data import AddEditCustomPropertiesData
from blenderbim.bim.ifc import IfcStore
from bpy.types import PropertyGroup
@@ -62,14 +62,12 @@ def get_pset_names(self, context):
obj = context.active_object
if not obj.BIMObjectProperties.ifc_definition_id:
return []
if obj.BIMObjectProperties.ifc_definition_id not in Data.products:
Data.load(IfcStore.get_file(), obj.BIMObjectProperties.ifc_definition_id)
element = IfcStore.get_file().by_id(obj.BIMObjectProperties.ifc_definition_id)
ifc_class = element.is_a()
if ifc_class not in psetnames:
psets = blenderbim.bim.schema.ifc.psetqto.get_applicable(ifc_class, pset_only=True)
psetnames[ifc_class] = blender_formatted_enum_from_psets(psets)
assigned_names = [Data.psets[p]["Name"] for p in Data.products[obj.BIMObjectProperties.ifc_definition_id]["psets"]]
assigned_names = ifcopenshell.util.element.get_psets(element, psets_only=True).keys()
return [p for p in psetnames[ifc_class] if p[0] not in assigned_names]
@@ -23,7 +23,6 @@ import blenderbim.tool as tool
import blenderbim.core.qto as core
from blenderbim.bim.ifc import IfcStore
from blenderbim.bim.module.qto import helper
from ifcopenshell.api.pset.data import Data as PsetData
from blenderbim.bim.module.pset.qto_calculator import QtoCalculator
@@ -169,7 +168,6 @@ class QuantifyObjects(bpy.types.Operator):
name=props.qto_name,
)
ifcopenshell.api.run("pset.edit_qto", self.file, qto=qto, properties={props.prop_name: result})
PsetData.load(self.file, obj.BIMObjectProperties.ifc_definition_id)
return {"FINISHED"}
class AssignBaseQto(bpy.types.Operator, tool.Ifc.Operator):
@@ -198,4 +196,4 @@ class CalculateAllQuantities(bpy.types.Operator, tool.Ifc.Operator):
def _execute(self, context):
core.calculate_objects_base_quantities(tool.Ifc, tool.Qto, QtoCalculator(), selected_objects = context.selected_objects)
return {"FINISHED"}
return {"FINISHED"}
@@ -29,7 +29,6 @@ import blenderbim.core.style
import blenderbim.core.type
import blenderbim.core.root as core
import blenderbim.tool as tool
from ifcopenshell.api.void.data import Data as VoidData
from blenderbim.bim.ifc import IfcStore
from blenderbim.bim.helper import get_enum_items
@@ -20,7 +20,6 @@ import re
import bpy
import ifcopenshell
import ifcopenshell.util.element
from ifcopenshell.api.group.data import Data
from ifcopenshell.util.selector import Selector
import blenderbim.tool as tool
from blenderbim.bim.ifc import IfcStore
@@ -26,9 +26,6 @@ import blenderbim.core.geometry
import blenderbim.core.type as core
import blenderbim.core.root
from blenderbim.bim.ifc import IfcStore
from ifcopenshell.api.type.data import Data
from ifcopenshell.api.geometry.data import Data as GeometryData
from ifcopenshell.api.material.data import Data as MaterialData
class Operator:
@@ -55,10 +52,6 @@ class AssignType(bpy.types.Operator, Operator):
for obj in related_objects:
core.assign_type(tool.Ifc, tool.Type, element=tool.Ifc.get_entity(obj), type=type)
oprops = obj.BIMObjectProperties
Data.load(IfcStore.get_file(), oprops.ifc_definition_id)
GeometryData.load(IfcStore.get_file(), oprops.ifc_definition_id)
MaterialData.load(IfcStore.get_file(), oprops.ifc_definition_id)
MaterialData.load(IfcStore.get_file())
class UnassignType(bpy.types.Operator):
@@ -84,7 +77,6 @@ class UnassignType(bpy.types.Operator):
"related_object": self.file.by_id(oprops.ifc_definition_id),
},
)
Data.load(IfcStore.get_file(), oprops.ifc_definition_id)
return {"FINISHED"}
@@ -25,7 +25,6 @@ import blenderbim.bim.handler
import blenderbim.tool as tool
import blenderbim.core.unit as core
from blenderbim.bim.ifc import IfcStore
from ifcopenshell.api.unit.data import Data
class Operator: