Fix #4060. The colour by property panel now shows the number of results in the legend.

This commit is contained in:
Dion Moult
2024-04-01 15:45:34 +11:00
parent b5d672ba42
commit 7b968030ca
4 changed files with 19 additions and 13 deletions
@@ -271,25 +271,29 @@ class ColourByProperty(Operator):
colourscheme = {} colourscheme = {}
if len(props.colourscheme): if len(props.colourscheme):
colourscheme = {cs.name: cs.colour[0:3] for cs in props.colourscheme} colourscheme = {cs.name: {"colour": cs.colour[0:3], "total": 0} for cs in props.colourscheme}
for obj in context.visible_objects: for obj in context.visible_objects:
element = tool.Ifc.get_entity(obj) element = tool.Ifc.get_entity(obj)
if not element: if not element:
continue continue
value = str(ifcopenshell.util.selector.get_element_value(element, query)) value = str(ifcopenshell.util.selector.get_element_value(element, query))
if value not in colourscheme: if value in colourscheme:
colourscheme[value] = next(colours)[0:3] colourscheme[value]["total"] += 1
obj.color = (*colourscheme[value], 1) else:
colourscheme[value] = {"colour": next(colours)[0:3], "total": 1}
obj.color = (*colourscheme[value]["colour"], 1)
areas = [a for a in context.screen.areas if a.type == "VIEW_3D"] areas = [a for a in context.screen.areas if a.type == "VIEW_3D"]
if areas: if areas:
areas[0].spaces[0].shading.color_type = "OBJECT" areas[0].spaces[0].shading.color_type = "OBJECT"
props.colourscheme.clear() props.colourscheme.clear()
for value, colour in colourscheme.items(): for value in sorted(colourscheme.keys()):
data = colourscheme[value]
new = props.colourscheme.add() new = props.colourscheme.add()
new.name = str(value) new.name = str(value)
new.colour = colour[0:3] new.total = data["total"]
new.colour = data["colour"][0:3]
return {"FINISHED"} return {"FINISHED"}
def store_state(self, context): def store_state(self, context):
@@ -351,16 +355,16 @@ class SaveColourscheme(Operator, tool.Ifc.Operator):
query = props.colourscheme_query query = props.colourscheme_query
group = [g for g in tool.Ifc.get().by_type("IfcGroup") if g.Name == self.name] group = [g for g in tool.Ifc.get().by_type("IfcGroup") if g.Name == self.name]
coulour_scheme = {cs.name: cs.colour[0:3] for cs in props.colourscheme} colourscheme = {cs.name: {"colour": cs.colour[0:3], "total": cs.total} for cs in props.colourscheme}
if group: if group:
group = group[0] group = group[0]
description = json.loads(group.Description) description = json.loads(group.Description)
description["colourscheme"] = coulour_scheme description["colourscheme"] = colourscheme
description["colourscheme_query"] = query description["colourscheme_query"] = query
group.Description = json.dumps(description) group.Description = json.dumps(description)
else: else:
description = json.dumps( description = json.dumps(
{"type": "BBIM_Search", "colourscheme": coulour_scheme, "colourscheme_query": query} {"type": "BBIM_Search", "colourscheme": colourscheme, "colourscheme_query": query}
) )
group = ifcopenshell.api.run("group.add_group", tool.Ifc.get(), Name=self.name, Description=description) group = ifcopenshell.api.run("group.add_group", tool.Ifc.get(), Name=self.name, Description=description)
@@ -380,10 +384,11 @@ class LoadColourscheme(Operator, tool.Ifc.Operator):
description = json.loads(group.Description) description = json.loads(group.Description)
props.colourscheme_query = description.get("colourscheme_query") props.colourscheme_query = description.get("colourscheme_query")
props.colourscheme.clear() props.colourscheme.clear()
for name, colour in description.get("colourscheme", {}).items(): for name, data in description.get("colourscheme", {}).items():
new = props.colourscheme.add() new = props.colourscheme.add()
new.name = name new.name = name
new.colour = colour new.total = data["total"]
new.colour = data["colour"]
def draw(self, context): def draw(self, context):
props = context.scene.BIMSearchProperties props = context.scene.BIMSearchProperties
@@ -100,6 +100,7 @@ class BIMFilterBuildingStoreys(PropertyGroup):
class BIMColour(PropertyGroup): class BIMColour(PropertyGroup):
name: StringProperty(name="Name") name: StringProperty(name="Name")
total: IntProperty(name="Total")
colour: FloatVectorProperty(name="Colour", subtype="COLOR", default=(1, 0, 0), min=0.0, max=1.0) colour: FloatVectorProperty(name="Colour", subtype="COLOR", default=(1, 0, 0), min=0.0, max=1.0)
@@ -125,7 +125,7 @@ class BIM_UL_colourscheme(bpy.types.UIList):
if not item: if not item:
return return
row = layout.row(align=True) row = layout.row(align=True)
row.label(text=item.name) row.label(text=f"{item.name} ({item.total})")
row.prop(item, "colour", text="") row.prop(item, "colour", text="")
+1 -1
View File
@@ -117,7 +117,7 @@ class Clasher:
def add_collision_objects(self, name, ifc_file, mode=None, selector=None): def add_collision_objects(self, name, ifc_file, mode=None, selector=None):
start = time.time() start = time.time()
self.settings.logger.info("Creating iterator") self.settings.logger.info("Creating iterator")
if not mode or not selector: if not mode or mode == "a" or not selector:
elements = set(ifc_file.by_type("IfcElement")) elements = set(ifc_file.by_type("IfcElement"))
elements -= set(ifc_file.by_type("IfcFeatureElement")) elements -= set(ifc_file.by_type("IfcFeatureElement"))
elif mode == "e": elif mode == "e":