mirror of
https://github.com/IfcOpenShell/IfcOpenShell.git
synced 2026-09-17 14:02:27 +00:00
New feature to colour code objects by attribute or pset values
This commit is contained in:
@@ -44,6 +44,8 @@ if bpy is not None:
|
|||||||
operator.ExportIFC,
|
operator.ExportIFC,
|
||||||
operator.ImportIFC,
|
operator.ImportIFC,
|
||||||
operator.ColourByClass,
|
operator.ColourByClass,
|
||||||
|
operator.ColourByAttribute,
|
||||||
|
operator.ColourByPset,
|
||||||
operator.ResetObjectColours,
|
operator.ResetObjectColours,
|
||||||
operator.ApproveClass,
|
operator.ApproveClass,
|
||||||
operator.RejectClass,
|
operator.RejectClass,
|
||||||
|
|||||||
@@ -14,6 +14,20 @@ from itertools import cycle
|
|||||||
from mathutils import Vector
|
from mathutils import Vector
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
|
|
||||||
|
colour_list = [
|
||||||
|
(.651, .81, .892, 1),
|
||||||
|
(.121, .471, .706, 1),
|
||||||
|
(.699, .876, .54, 1),
|
||||||
|
(.199, .629, .174, 1),
|
||||||
|
(.983, .605, .602, 1),
|
||||||
|
(.89, .101, .112, 1),
|
||||||
|
(.989, .751, .427, 1),
|
||||||
|
(.986, .497, .1, 1),
|
||||||
|
(.792, .699, .839, 1),
|
||||||
|
(.414, .239, .603, 1),
|
||||||
|
(.993, .999, .6, 1),
|
||||||
|
(.693, .349, .157, 1)]
|
||||||
|
|
||||||
class ExportIFC(bpy.types.Operator):
|
class ExportIFC(bpy.types.Operator):
|
||||||
bl_idname = "export.ifc"
|
bl_idname = "export.ifc"
|
||||||
bl_label = "Export .ifc file"
|
bl_label = "Export .ifc file"
|
||||||
@@ -137,8 +151,8 @@ class SelectPset(bpy.types.Operator):
|
|||||||
|
|
||||||
def execute(self, context):
|
def execute(self, context):
|
||||||
import re
|
import re
|
||||||
search_pset_name = bpy.context.scene.BIMProperties.search_pset_path.split('.')[0]
|
search_pset_name = bpy.context.scene.BIMProperties.search_pset_name
|
||||||
search_prop_name = bpy.context.scene.BIMProperties.search_pset_path.split('.')[1]
|
search_prop_name = bpy.context.scene.BIMProperties.search_prop_name
|
||||||
search_value = bpy.context.scene.BIMProperties.search_pset_value
|
search_value = bpy.context.scene.BIMProperties.search_pset_value
|
||||||
for object in bpy.context.visible_objects:
|
for object in bpy.context.visible_objects:
|
||||||
pset_index = object.BIMObjectProperties.override_psets.find(search_pset_name)
|
pset_index = object.BIMObjectProperties.override_psets.find(search_pset_name)
|
||||||
@@ -232,30 +246,60 @@ class ColourByClass(bpy.types.Operator):
|
|||||||
bl_label = 'Colour by Class'
|
bl_label = 'Colour by Class'
|
||||||
|
|
||||||
def execute(self, context):
|
def execute(self, context):
|
||||||
colour_list = [
|
|
||||||
(.651, .81, .892, 1),
|
|
||||||
(.121, .471, .706, 1),
|
|
||||||
(.699, .876, .54, 1),
|
|
||||||
(.199, .629, .174, 1),
|
|
||||||
(.983, .605, .602, 1),
|
|
||||||
(.89, .101, .112, 1),
|
|
||||||
(.989, .751, .427, 1),
|
|
||||||
(.986, .497, .1, 1),
|
|
||||||
(.792, .699, .839, 1),
|
|
||||||
(.414, .239, .603, 1),
|
|
||||||
(.993, .999, .6, 1),
|
|
||||||
(.693, .349, .157, 1)]
|
|
||||||
colours = cycle(colour_list)
|
colours = cycle(colour_list)
|
||||||
ifc_classes = {}
|
ifc_classes = {}
|
||||||
for object in bpy.context.selected_objects:
|
for obj in bpy.context.visible_objects:
|
||||||
if '/' not in object.name:
|
if '/' not in obj.name:
|
||||||
continue
|
continue
|
||||||
ifc_class = object.name.split('/')[0]
|
ifc_class = obj.name.split('/')[0]
|
||||||
if ifc_class not in ifc_classes:
|
if ifc_class not in ifc_classes:
|
||||||
ifc_classes[ifc_class] = next(colours)
|
ifc_classes[ifc_class] = next(colours)
|
||||||
object.color = ifc_classes[ifc_class]
|
obj.color = ifc_classes[ifc_class]
|
||||||
return {'FINISHED'}
|
return {'FINISHED'}
|
||||||
|
|
||||||
|
|
||||||
|
class ColourByAttribute(bpy.types.Operator):
|
||||||
|
bl_idname = 'bim.colour_by_attribute'
|
||||||
|
bl_label = 'Colour by Attribute'
|
||||||
|
|
||||||
|
def execute(self, context):
|
||||||
|
colours = cycle(colour_list)
|
||||||
|
values = {}
|
||||||
|
attribute_name = bpy.context.scene.BIMProperties.search_attribute_name
|
||||||
|
for obj in bpy.context.visible_objects:
|
||||||
|
index = obj.BIMObjectProperties.attributes.find(attribute_name)
|
||||||
|
if index == -1:
|
||||||
|
continue
|
||||||
|
value = obj.BIMObjectProperties.attributes[index].string_value
|
||||||
|
if value not in values:
|
||||||
|
values[value] = next(colours)
|
||||||
|
obj.color = values[value]
|
||||||
|
return {'FINISHED'}
|
||||||
|
|
||||||
|
|
||||||
|
class ColourByPset(bpy.types.Operator):
|
||||||
|
bl_idname = 'bim.colour_by_pset'
|
||||||
|
bl_label = 'Colour by Pset'
|
||||||
|
|
||||||
|
def execute(self, context):
|
||||||
|
colours = cycle(colour_list)
|
||||||
|
values = {}
|
||||||
|
search_pset_name = bpy.context.scene.BIMProperties.search_pset_name
|
||||||
|
search_prop_name = bpy.context.scene.BIMProperties.search_prop_name
|
||||||
|
for obj in bpy.context.visible_objects:
|
||||||
|
pset_index = obj.BIMObjectProperties.override_psets.find(search_pset_name)
|
||||||
|
if pset_index == -1:
|
||||||
|
continue
|
||||||
|
prop_index = obj.BIMObjectProperties.override_psets[pset_index].properties.find(search_prop_name)
|
||||||
|
if prop_index == -1:
|
||||||
|
continue
|
||||||
|
value = obj.BIMObjectProperties.override_psets[pset_index].properties[prop_index].string_value
|
||||||
|
if value not in values:
|
||||||
|
values[value] = next(colours)
|
||||||
|
obj.color = values[value]
|
||||||
|
return {'FINISHED'}
|
||||||
|
|
||||||
|
|
||||||
class ResetObjectColours(bpy.types.Operator):
|
class ResetObjectColours(bpy.types.Operator):
|
||||||
bl_idname = 'bim.reset_object_colours'
|
bl_idname = 'bim.reset_object_colours'
|
||||||
bl_label = 'Reset Colours'
|
bl_label = 'Reset Colours'
|
||||||
|
|||||||
@@ -393,7 +393,8 @@ class BIMProperties(PropertyGroup):
|
|||||||
global_id: StringProperty(name="GlobalId")
|
global_id: StringProperty(name="GlobalId")
|
||||||
search_attribute_name: StringProperty(name="Search Attribute Name")
|
search_attribute_name: StringProperty(name="Search Attribute Name")
|
||||||
search_attribute_value: StringProperty(name="Search Attribute Value")
|
search_attribute_value: StringProperty(name="Search Attribute Value")
|
||||||
search_pset_path: StringProperty(name="Search Pset Path")
|
search_pset_name: StringProperty(name="Search Pset Name")
|
||||||
|
search_prop_name: StringProperty(name="Search Prop Name")
|
||||||
search_pset_value: StringProperty(name="Search Pset Value")
|
search_pset_value: StringProperty(name="Search Pset Value")
|
||||||
features_dir: StringProperty(default='', name="Features Directory", update=refreshFeaturesFiles)
|
features_dir: StringProperty(default='', name="Features Directory", update=refreshFeaturesFiles)
|
||||||
features_file: EnumProperty(items=getFeaturesFiles, name="Features File", update=refreshScenarios)
|
features_file: EnumProperty(items=getFeaturesFiles, name="Features File", update=refreshScenarios)
|
||||||
|
|||||||
@@ -494,12 +494,15 @@ class BIM_PT_search(Panel):
|
|||||||
row.prop(props, 'search_attribute_name', text='')
|
row.prop(props, 'search_attribute_name', text='')
|
||||||
row.prop(props, 'search_attribute_value', text='')
|
row.prop(props, 'search_attribute_value', text='')
|
||||||
row.operator('bim.select_attribute', text='', icon='VIEWZOOM')
|
row.operator('bim.select_attribute', text='', icon='VIEWZOOM')
|
||||||
|
row.operator('bim.colour_by_attribute', text='', icon='BRUSH_DATA')
|
||||||
|
|
||||||
layout.label(text="Pset:")
|
layout.label(text="Pset:")
|
||||||
row = layout.row(align=True)
|
row = layout.row(align=True)
|
||||||
row.prop(props, 'search_pset_path', text='')
|
row.prop(props, 'search_pset_name', text='')
|
||||||
|
row.prop(props, 'search_prop_name', text='')
|
||||||
row.prop(props, 'search_pset_value', text='')
|
row.prop(props, 'search_pset_value', text='')
|
||||||
row.operator('bim.select_pset', text='', icon='VIEWZOOM')
|
row.operator('bim.select_pset', text='', icon='VIEWZOOM')
|
||||||
|
row.operator('bim.colour_by_pset', text='', icon='BRUSH_DATA')
|
||||||
|
|
||||||
|
|
||||||
class BIM_PT_qa(Panel):
|
class BIM_PT_qa(Panel):
|
||||||
|
|||||||
Reference in New Issue
Block a user