mirror of
https://github.com/IfcOpenShell/IfcOpenShell.git
synced 2026-09-27 18:57:17 +00:00
New UI to add and remove classifications
This commit is contained in:
@@ -44,12 +44,19 @@ classes = (
|
|||||||
operator.RemoveAttribute,
|
operator.RemoveAttribute,
|
||||||
operator.QuickProjectSetup,
|
operator.QuickProjectSetup,
|
||||||
operator.SelectGlobalId,
|
operator.SelectGlobalId,
|
||||||
|
operator.CreateAggregate,
|
||||||
|
operator.EditAggregate,
|
||||||
|
operator.SaveAggregate,
|
||||||
|
operator.AssignClassification,
|
||||||
|
operator.UnassignClassification,
|
||||||
|
operator.RemoveClassification,
|
||||||
ui.BIMProperties,
|
ui.BIMProperties,
|
||||||
ui.MapConversion,
|
ui.MapConversion,
|
||||||
ui.TargetCRS,
|
ui.TargetCRS,
|
||||||
ui.Attribute,
|
ui.Attribute,
|
||||||
ui.Pset,
|
ui.Pset,
|
||||||
ui.Document,
|
ui.Document,
|
||||||
|
ui.Classification,
|
||||||
ui.BIMObjectProperties,
|
ui.BIMObjectProperties,
|
||||||
ui.BIMMaterialProperties,
|
ui.BIMMaterialProperties,
|
||||||
ui.BIMMeshProperties,
|
ui.BIMMeshProperties,
|
||||||
|
|||||||
@@ -279,11 +279,12 @@ class IfcParser():
|
|||||||
self.rel_associates_document_object.setdefault(
|
self.rel_associates_document_object.setdefault(
|
||||||
document.file, []).append(product)
|
document.file, []).append(product)
|
||||||
|
|
||||||
|
for classification in object.BIMObjectProperties.classifications:
|
||||||
|
self.rel_associates_classification_object.setdefault(
|
||||||
|
classification.identification, []).append(product)
|
||||||
|
|
||||||
for key in object.keys():
|
for key in object.keys():
|
||||||
if key[0:5] == 'Class':
|
if key[0:9] == 'Objective':
|
||||||
self.rel_associates_classification_object.setdefault(
|
|
||||||
object[key], []).append(product)
|
|
||||||
elif key[0:9] == 'Objective':
|
|
||||||
self.rel_associates_constraint_objective_object.setdefault(
|
self.rel_associates_constraint_objective_object.setdefault(
|
||||||
object[key], []).append(product)
|
object[key], []).append(product)
|
||||||
|
|
||||||
|
|||||||
@@ -503,3 +503,35 @@ class SaveAggregate(bpy.types.Operator):
|
|||||||
if obj.instance_collection == aggregate:
|
if obj.instance_collection == aggregate:
|
||||||
obj.hide_viewport = False
|
obj.hide_viewport = False
|
||||||
return {'FINISHED'}
|
return {'FINISHED'}
|
||||||
|
|
||||||
|
class AssignClassification(bpy.types.Operator):
|
||||||
|
bl_idname = 'bim.assign_classification'
|
||||||
|
bl_label = 'Assign Classification'
|
||||||
|
|
||||||
|
def execute(self, context):
|
||||||
|
for obj in bpy.context.selected_objects:
|
||||||
|
classification = obj.BIMObjectProperties.classifications.add()
|
||||||
|
classification.identification = bpy.context.scene.BIMProperties.reference
|
||||||
|
return {'FINISHED'}
|
||||||
|
|
||||||
|
class UnassignClassification(bpy.types.Operator):
|
||||||
|
bl_idname = 'bim.unassign_classification'
|
||||||
|
bl_label = 'Unassign Classification'
|
||||||
|
|
||||||
|
def execute(self, context):
|
||||||
|
for obj in bpy.context.selected_objects:
|
||||||
|
index = object.BIMObjectProperties.classifications.find(bpy.context.scene.BIMProperties.classification)
|
||||||
|
if index != -1:
|
||||||
|
object.BIMObjectProperties.classifications.remove(index)
|
||||||
|
|
||||||
|
obj.BIMObjectProperties.classification = ''
|
||||||
|
return {'FINISHED'}
|
||||||
|
|
||||||
|
class RemoveClassification(bpy.types.Operator):
|
||||||
|
bl_idname = 'bim.remove_classification'
|
||||||
|
bl_label = 'Remove Classification'
|
||||||
|
classification_index: bpy.props.IntProperty()
|
||||||
|
|
||||||
|
def execute(self, context):
|
||||||
|
bpy.context.active_object.BIMObjectProperties.classifications.remove(self.classification_index)
|
||||||
|
return {'FINISHED'}
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
import bpy
|
import bpy
|
||||||
import json
|
import json
|
||||||
import os
|
import os
|
||||||
|
import csv
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
|
|
||||||
cwd = os.path.dirname(os.path.realpath(__file__)) + os.path.sep
|
cwd = os.path.dirname(os.path.realpath(__file__)) + os.path.sep
|
||||||
@@ -36,6 +37,22 @@ class BIMProperties(bpy.types.PropertyGroup):
|
|||||||
files = os.listdir(bpy.context.scene.BIMProperties.data_dir + 'pset/{}/'.format(bpy.context.scene.BIMProperties.pset_name))
|
files = os.listdir(bpy.context.scene.BIMProperties.data_dir + 'pset/{}/'.format(bpy.context.scene.BIMProperties.pset_name))
|
||||||
return [(f.replace('.csv', ''), f.replace('.csv', ''), '') for f in files]
|
return [(f.replace('.csv', ''), f.replace('.csv', ''), '') for f in files]
|
||||||
|
|
||||||
|
def getClassifications(self, context):
|
||||||
|
with open(bpy.context.scene.BIMProperties.data_dir + 'class/classifications.csv', 'r') as f:
|
||||||
|
data = list(csv.reader(f))
|
||||||
|
keys = data.pop(0)
|
||||||
|
index = keys.index('Name')
|
||||||
|
return [(str(i), d[index], '') for i, d in enumerate(data)]
|
||||||
|
|
||||||
|
def getReferences(self, context):
|
||||||
|
if not bpy.context.scene.BIMProperties.classification:
|
||||||
|
return []
|
||||||
|
with open(bpy.context.scene.BIMProperties.data_dir + 'class/references.csv', 'r') as f:
|
||||||
|
data = list(csv.reader(f))
|
||||||
|
keys = data.pop(0)
|
||||||
|
return [(d[0], '{} - {}'.format(d[0], d[1]), '') for d in data if
|
||||||
|
d[2] == bpy.context.scene.BIMProperties.classification]
|
||||||
|
|
||||||
schema_dir: bpy.props.StringProperty(default=cwd + 'schema/', name="Schema Directory")
|
schema_dir: bpy.props.StringProperty(default=cwd + 'schema/', name="Schema Directory")
|
||||||
data_dir: bpy.props.StringProperty(default=cwd + 'data/', name="Data Directory")
|
data_dir: bpy.props.StringProperty(default=cwd + 'data/', name="Data Directory")
|
||||||
ifc_class: bpy.props.EnumProperty(items = getIfcClasses, name="Class")
|
ifc_class: bpy.props.EnumProperty(items = getIfcClasses, name="Class")
|
||||||
@@ -53,6 +70,8 @@ class BIMProperties(bpy.types.PropertyGroup):
|
|||||||
diff_json_file: bpy.props.StringProperty(default='', name="Diff JSON File")
|
diff_json_file: bpy.props.StringProperty(default='', name="Diff JSON File")
|
||||||
aggregate_class: bpy.props.EnumProperty(items = getIfcClasses, name="Aggregate Class")
|
aggregate_class: bpy.props.EnumProperty(items = getIfcClasses, name="Aggregate Class")
|
||||||
aggregate_name: bpy.props.StringProperty(name="Aggregate Name")
|
aggregate_name: bpy.props.StringProperty(name="Aggregate Name")
|
||||||
|
classification: bpy.props.EnumProperty(items = getClassifications, name="Classification")
|
||||||
|
reference: bpy.props.EnumProperty(items = getReferences, name="Reference")
|
||||||
|
|
||||||
class MapConversion(bpy.types.PropertyGroup):
|
class MapConversion(bpy.types.PropertyGroup):
|
||||||
eastings: bpy.props.StringProperty(name="Eastings")
|
eastings: bpy.props.StringProperty(name="Eastings")
|
||||||
@@ -86,6 +105,10 @@ class Pset(bpy.types.PropertyGroup):
|
|||||||
class Document(bpy.types.PropertyGroup):
|
class Document(bpy.types.PropertyGroup):
|
||||||
file: bpy.props.StringProperty(name="File")
|
file: bpy.props.StringProperty(name="File")
|
||||||
|
|
||||||
|
class Classification(bpy.types.PropertyGroup):
|
||||||
|
name: bpy.props.StringProperty(name="Name")
|
||||||
|
identification: bpy.props.StringProperty(name="Identification")
|
||||||
|
|
||||||
class BIMObjectProperties(bpy.types.PropertyGroup):
|
class BIMObjectProperties(bpy.types.PropertyGroup):
|
||||||
def getApplicableAttributes(self, context):
|
def getApplicableAttributes(self, context):
|
||||||
if '/' in bpy.context.active_object.name \
|
if '/' in bpy.context.active_object.name \
|
||||||
@@ -108,6 +131,7 @@ class BIMObjectProperties(bpy.types.PropertyGroup):
|
|||||||
applicable_attributes: bpy.props.EnumProperty(items=getApplicableAttributes, name="Attribute Names")
|
applicable_attributes: bpy.props.EnumProperty(items=getApplicableAttributes, name="Attribute Names")
|
||||||
documents: bpy.props.CollectionProperty(name="Documents", type=Document)
|
documents: bpy.props.CollectionProperty(name="Documents", type=Document)
|
||||||
applicable_documents: bpy.props.EnumProperty(items=getApplicableDocuments, name="Available Documents")
|
applicable_documents: bpy.props.EnumProperty(items=getApplicableDocuments, name="Available Documents")
|
||||||
|
classifications: bpy.props.CollectionProperty(name="Classifications", type=Classification)
|
||||||
|
|
||||||
class BIMMaterialProperties(bpy.types.PropertyGroup):
|
class BIMMaterialProperties(bpy.types.PropertyGroup):
|
||||||
is_external: bpy.props.BoolProperty(name="Has External Definition")
|
is_external: bpy.props.BoolProperty(name="Has External Definition")
|
||||||
@@ -174,6 +198,18 @@ class ObjectPanel(bpy.types.Panel):
|
|||||||
row = layout.row()
|
row = layout.row()
|
||||||
row.prop(bpy.context.active_object.BIMObjectProperties, 'documents')
|
row.prop(bpy.context.active_object.BIMObjectProperties, 'documents')
|
||||||
|
|
||||||
|
layout.label(text="Classification:")
|
||||||
|
|
||||||
|
for index, classification in enumerate(bpy.context.active_object.BIMObjectProperties.classifications):
|
||||||
|
row = layout.row(align=True)
|
||||||
|
row.prop(classification, 'identification', text='')
|
||||||
|
row.prop(classification, 'name', text='')
|
||||||
|
row.operator('bim.remove_classification', icon='CANCEL', text='').classification_index = index
|
||||||
|
|
||||||
|
row = layout.row()
|
||||||
|
row.prop(bpy.context.active_object.BIMObjectProperties, 'classifications')
|
||||||
|
|
||||||
|
|
||||||
class MeshPanel(bpy.types.Panel):
|
class MeshPanel(bpy.types.Panel):
|
||||||
bl_label = 'IFC Representations'
|
bl_label = 'IFC Representations'
|
||||||
bl_idname = 'BIM_PT_mesh'
|
bl_idname = 'BIM_PT_mesh'
|
||||||
@@ -317,6 +353,16 @@ class BIMPanel(bpy.types.Panel):
|
|||||||
row.operator("bim.edit_aggregate")
|
row.operator("bim.edit_aggregate")
|
||||||
row.operator("bim.save_aggregate")
|
row.operator("bim.save_aggregate")
|
||||||
|
|
||||||
|
layout.label(text="Classifications:")
|
||||||
|
row = layout.row()
|
||||||
|
row.prop(bim_properties, "classification")
|
||||||
|
row = layout.row()
|
||||||
|
row.prop(bim_properties, "reference")
|
||||||
|
|
||||||
|
row = layout.row(align=True)
|
||||||
|
row.operator("bim.assign_classification")
|
||||||
|
row.operator("bim.unassign_classification")
|
||||||
|
|
||||||
class QAPanel(bpy.types.Panel):
|
class QAPanel(bpy.types.Panel):
|
||||||
bl_label = "BIMTester Quality Auditing"
|
bl_label = "BIMTester Quality Auditing"
|
||||||
bl_idname = "BIM_PT_qa"
|
bl_idname = "BIM_PT_qa"
|
||||||
|
|||||||
Reference in New Issue
Block a user