From 7b968030ca55aa2cfebe517c2ea152f58a2cd5fc Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Mon, 1 Apr 2024 15:45:34 +1100 Subject: [PATCH] Fix #4060. The colour by property panel now shows the number of results in the legend. --- .../blenderbim/bim/module/search/operator.py | 27 +++++++++++-------- .../blenderbim/bim/module/search/prop.py | 1 + .../blenderbim/bim/module/search/ui.py | 2 +- src/ifcclash/ifcclash/ifcclash.py | 2 +- 4 files changed, 19 insertions(+), 13 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/module/search/operator.py b/src/blenderbim/blenderbim/bim/module/search/operator.py index 132d61216a..9fee78e1ac 100644 --- a/src/blenderbim/blenderbim/bim/module/search/operator.py +++ b/src/blenderbim/blenderbim/bim/module/search/operator.py @@ -271,25 +271,29 @@ class ColourByProperty(Operator): 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: element = tool.Ifc.get_entity(obj) if not element: continue value = str(ifcopenshell.util.selector.get_element_value(element, query)) - if value not in colourscheme: - colourscheme[value] = next(colours)[0:3] - obj.color = (*colourscheme[value], 1) + if value in colourscheme: + colourscheme[value]["total"] += 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"] if areas: areas[0].spaces[0].shading.color_type = "OBJECT" props.colourscheme.clear() - for value, colour in colourscheme.items(): + for value in sorted(colourscheme.keys()): + data = colourscheme[value] new = props.colourscheme.add() new.name = str(value) - new.colour = colour[0:3] + new.total = data["total"] + new.colour = data["colour"][0:3] return {"FINISHED"} def store_state(self, context): @@ -351,16 +355,16 @@ class SaveColourscheme(Operator, tool.Ifc.Operator): query = props.colourscheme_query 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: group = group[0] description = json.loads(group.Description) - description["colourscheme"] = coulour_scheme + description["colourscheme"] = colourscheme description["colourscheme_query"] = query group.Description = json.dumps(description) else: 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) @@ -380,10 +384,11 @@ class LoadColourscheme(Operator, tool.Ifc.Operator): description = json.loads(group.Description) props.colourscheme_query = description.get("colourscheme_query") props.colourscheme.clear() - for name, colour in description.get("colourscheme", {}).items(): + for name, data in description.get("colourscheme", {}).items(): new = props.colourscheme.add() new.name = name - new.colour = colour + new.total = data["total"] + new.colour = data["colour"] def draw(self, context): props = context.scene.BIMSearchProperties diff --git a/src/blenderbim/blenderbim/bim/module/search/prop.py b/src/blenderbim/blenderbim/bim/module/search/prop.py index 2414cb8201..c8c5580e6e 100644 --- a/src/blenderbim/blenderbim/bim/module/search/prop.py +++ b/src/blenderbim/blenderbim/bim/module/search/prop.py @@ -100,6 +100,7 @@ class BIMFilterBuildingStoreys(PropertyGroup): class BIMColour(PropertyGroup): name: StringProperty(name="Name") + total: IntProperty(name="Total") colour: FloatVectorProperty(name="Colour", subtype="COLOR", default=(1, 0, 0), min=0.0, max=1.0) diff --git a/src/blenderbim/blenderbim/bim/module/search/ui.py b/src/blenderbim/blenderbim/bim/module/search/ui.py index 6512ccbfa4..8117bc9f52 100644 --- a/src/blenderbim/blenderbim/bim/module/search/ui.py +++ b/src/blenderbim/blenderbim/bim/module/search/ui.py @@ -125,7 +125,7 @@ class BIM_UL_colourscheme(bpy.types.UIList): if not item: return row = layout.row(align=True) - row.label(text=item.name) + row.label(text=f"{item.name} ({item.total})") row.prop(item, "colour", text="") diff --git a/src/ifcclash/ifcclash/ifcclash.py b/src/ifcclash/ifcclash/ifcclash.py index d5c16413db..a967be3ce3 100644 --- a/src/ifcclash/ifcclash/ifcclash.py +++ b/src/ifcclash/ifcclash/ifcclash.py @@ -117,7 +117,7 @@ class Clasher: def add_collision_objects(self, name, ifc_file, mode=None, selector=None): start = time.time() 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("IfcFeatureElement")) elif mode == "e":