Move brick entity classes to BrickStore and create drop-down for entity type creation

This commit is contained in:
Trashman247
2023-07-17 16:46:01 -07:00
committed by Riley Wong
parent 0348e6d11a
commit f2db071cf3
5 changed files with 35 additions and 27 deletions
@@ -42,7 +42,6 @@ class BrickschemaData:
cls.data = {
"is_loaded": cls.get_is_loaded(),
"attributes": cls.attributes(),
"brick_equipment_classes": cls.brick_equipment_classes(),
}
@classmethod
@@ -103,24 +102,6 @@ class BrickschemaData:
)
return results
@classmethod
def brick_equipment_classes(cls):
if BrickStore.graph is None:
return []
results = []
query = BrickStore.graph.query(
"""
PREFIX brick: <https://brickschema.org/schema/Brick#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
SELECT ?class WHERE {
?class rdfs:subClassOf* brick:Equipment .
}
"""
)
for uri in sorted([x[0].toPython() for x in query]):
results.append((uri, uri.split("#")[-1], ""))
return results
class BrickschemaReferencesData:
data = {}
@@ -126,7 +126,7 @@ class AddBrick(bpy.types.Operator, Operator):
tool.Brick,
element=tool.Ifc.get_entity(context.active_object) if context.selected_objects else None,
namespace=props.namespace,
brick_class=props.brick_equipment_class,
brick_class=props.brick_entity_classes,
library=library,
label=props.new_brick_label,
)
@@ -46,10 +46,9 @@ def get_namespaces(self, context):
return BrickStore.namespaces
def get_brick_equipment_classes(self, context):
if not BrickschemaData.is_loaded:
BrickschemaData.load()
return BrickschemaData.data["brick_equipment_classes"]
def get_brick_entity_classes(self, context):
entity = context.scene.BIMBrickProperties.brick_entity_create_type
return BrickStore.entity_classes[entity]
def get_brick_roots(self, context):
@@ -74,9 +73,10 @@ class BIMBrickProperties(PropertyGroup):
active_brick_index: IntProperty(name="Active Brick Index", update=update_active_brick_index)
libraries: EnumProperty(name="Libraries", items=get_libraries)
namespace: EnumProperty(name="Namespace", items=get_namespaces)
brick_equipment_class: EnumProperty(name="Brick Equipment Class", items=get_brick_equipment_classes)
brick_entity_classes: EnumProperty(name="Brick Equipment Class", items=get_brick_entity_classes)
brick_settings_toggled: BoolProperty(name="Brick Settings Toggled", default=False)
new_brick_label: StringProperty(name="New Brick Label")
new_brick_namespace_alias: StringProperty(name="New Brick Namespace Alias")
new_brick_namespace_uri: StringProperty(name="New Brick Namespace URI")
brick_list_root: EnumProperty(name="Brick List Root", items=get_brick_roots)
brick_list_root: EnumProperty(name="Brick List Root", items=get_brick_roots)
brick_entity_create_type: EnumProperty(name="Brick Entity Types", items=get_brick_roots)
@@ -82,9 +82,13 @@ class BIM_PT_brickschema(Panel):
row = self.layout.row(align=True)
row.label(text="Create Entity:")
row = self.layout.row(align=True)
row.prop(data=self.props, property="brick_entity_create_type", text="")
row = self.layout.row(align=True)
row.prop(data=self.props, property="new_brick_label", text="")
prop_with_search(row, self.props, "brick_equipment_class", text="")
prop_with_search(row, self.props, "brick_entity_classes", text="")
row.operator("bim.add_brick", text="", icon="ADD")
row = self.layout.row(align=True)
+23
View File
@@ -269,6 +269,7 @@ class Brick(blenderbim.core.tool.Brick):
cs.load_file(filepath)
BrickStore.path = filepath
BrickStore.load_namespaces()
BrickStore.load_entity_classes()
@classmethod
def new_brick_file(cls):
@@ -280,6 +281,7 @@ class Brick(blenderbim.core.tool.Brick):
cs.load_file(BrickStore.schema)
BrickStore.graph.bind("digitaltwin", Namespace("https://example.org/digitaltwin#"))
BrickStore.load_namespaces()
BrickStore.load_entity_classes()
@classmethod
def pop_brick_breadcrumb(cls):
@@ -343,6 +345,7 @@ class BrickStore:
current_changesets = 0
history_size = 64
namespaces = []
entity_classes = {}
@staticmethod
def purge():
@@ -350,6 +353,7 @@ class BrickStore:
BrickStore.graph = None
BrickStore.path = None
BrickStore.namespaces = []
BrickStore.entity_classes = {}
@classmethod
def get_project(cls):
@@ -368,6 +372,25 @@ class BrickStore:
if not ignore_namespace:
BrickStore.namespaces.append((uri, f"{alias}: {uri}", ""))
@classmethod
def load_entity_classes(cls):
root_classes = ["System", "Location", "Equipment", "Point"]
for root_class in root_classes:
query = BrickStore.graph.query(
"""
PREFIX brick: <https://brickschema.org/schema/Brick#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
SELECT ?class WHERE {
?class rdfs:subClassOf* brick:{root_class} .
}
""".replace(
"{root_class}", root_class
)
)
BrickStore.entity_classes[root_class] = []
for uri in sorted([x[0].toPython() for x in query]):
BrickStore.entity_classes[root_class].append((uri, uri.split("#")[-1], ""))
@classmethod
def set_history_size(cls, size):
cls.history_size = size