mirror of
https://github.com/IfcOpenShell/IfcOpenShell.git
synced 2026-08-15 18:14:08 +00:00
Fix #4060. The colour by property panel now shows the number of results in the legend.
This commit is contained in:
@@ -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="")
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -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":
|
||||||
|
|||||||
Reference in New Issue
Block a user