mirror of
https://github.com/IfcOpenShell/IfcOpenShell.git
synced 2026-08-09 09:21:46 +00:00
Improve fix for #5563 based on feedback:
- Remove INFO - No statuses selected, - Remember and set last status on disable-reenable - Moved duplicated code into shared tool.Sequence class method
This commit is contained in:
@@ -43,17 +43,19 @@ class EnableStatusFilters(bpy.types.Operator):
|
|||||||
def execute(self, context):
|
def execute(self, context):
|
||||||
props = context.scene.BIMStatusProperties
|
props = context.scene.BIMStatusProperties
|
||||||
props.is_enabled = True
|
props.is_enabled = True
|
||||||
|
hidden_statuses = {s.name for s in props.statuses if not s.is_visible}
|
||||||
|
|
||||||
props.statuses.clear()
|
props.statuses.clear()
|
||||||
|
|
||||||
statuses = set()
|
statuses = set()
|
||||||
for element in tool.Ifc.get().by_type("IfcPropertyEnumeratedValue"):
|
for element in tool.Ifc.get().by_type("IfcPropertyEnumeratedValue"):
|
||||||
if element.Name == "Status":
|
if element.Name == "Status":
|
||||||
pset = element.PartOfPset[0]
|
if element.PartOfPset and isinstance(element.EnumerationValues, tuple):
|
||||||
if pset.Name.startswith("Pset_") and pset.Name.endswith("Common"):
|
pset = element.PartOfPset[0]
|
||||||
statuses.update(element.EnumerationValues)
|
if pset.Name.startswith("Pset_") and pset.Name.endswith("Common"):
|
||||||
elif pset.Name == "EPset_Status": # Our secret sauce
|
statuses.update(element.EnumerationValues)
|
||||||
statuses.update(element.EnumerationValues)
|
elif pset.Name == "EPset_Status": # Our secret sauce
|
||||||
|
statuses.update(element.EnumerationValues)
|
||||||
elif element.Name == "UserDefinedStatus":
|
elif element.Name == "UserDefinedStatus":
|
||||||
statuses.add(element.NominalValue)
|
statuses.add(element.NominalValue)
|
||||||
|
|
||||||
@@ -62,6 +64,11 @@ class EnableStatusFilters(bpy.types.Operator):
|
|||||||
for status in statuses:
|
for status in statuses:
|
||||||
new = props.statuses.add()
|
new = props.statuses.add()
|
||||||
new.name = status
|
new.name = status
|
||||||
|
if new.name in hidden_statuses:
|
||||||
|
new.is_visible = False
|
||||||
|
|
||||||
|
visible_statuses = {s.name for s in props.statuses} - hidden_statuses
|
||||||
|
tool.Sequence.set_visibility_by_status(visible_statuses)
|
||||||
return {"FINISHED"}
|
return {"FINISHED"}
|
||||||
|
|
||||||
|
|
||||||
@@ -73,27 +80,8 @@ class DisableStatusFilters(bpy.types.Operator):
|
|||||||
def execute(self, context):
|
def execute(self, context):
|
||||||
props = context.scene.BIMStatusProperties
|
props = context.scene.BIMStatusProperties
|
||||||
|
|
||||||
query = []
|
|
||||||
visible_statuses = {s.name for s in props.statuses}
|
visible_statuses = {s.name for s in props.statuses}
|
||||||
for name in visible_statuses:
|
tool.Sequence.set_visibility_by_status(visible_statuses)
|
||||||
if name == "No Status":
|
|
||||||
q = f"IfcProduct, /Pset_.*Common/.Status=NULL, EPset_Status.Status=NULL"
|
|
||||||
else:
|
|
||||||
q = f"IfcProduct, /Pset_.*Common/.Status={name} + IfcProduct, EPset_Status.Status={name}"
|
|
||||||
query.append(q)
|
|
||||||
query = " + ".join(query)
|
|
||||||
|
|
||||||
if not query:
|
|
||||||
self.report({"INFO"}, "No statuses selected.")
|
|
||||||
|
|
||||||
visible_elements = ifcopenshell.util.selector.filter_elements(tool.Ifc.get(), query)
|
|
||||||
|
|
||||||
for obj in bpy.context.view_layer.objects:
|
|
||||||
element = tool.Ifc.get_entity(obj)
|
|
||||||
if not element or not element.is_a("IfcProduct"):
|
|
||||||
continue
|
|
||||||
obj.hide_set(element not in visible_elements)
|
|
||||||
|
|
||||||
props.is_enabled = False
|
props.is_enabled = False
|
||||||
return {"FINISHED"}
|
return {"FINISHED"}
|
||||||
|
|
||||||
@@ -106,26 +94,8 @@ class ActivateStatusFilters(bpy.types.Operator):
|
|||||||
def execute(self, context):
|
def execute(self, context):
|
||||||
props = context.scene.BIMStatusProperties
|
props = context.scene.BIMStatusProperties
|
||||||
|
|
||||||
query = []
|
|
||||||
visible_statuses = {s.name for s in props.statuses if s.is_visible}
|
visible_statuses = {s.name for s in props.statuses if s.is_visible}
|
||||||
for name in visible_statuses:
|
tool.Sequence.set_visibility_by_status(visible_statuses)
|
||||||
if name == "No Status":
|
|
||||||
q = f"IfcProduct, /Pset_.*Common/.Status=NULL, EPset_Status.Status=NULL"
|
|
||||||
else:
|
|
||||||
q = f"IfcProduct, /Pset_.*Common/.Status={name} + IfcProduct, EPset_Status.Status={name}"
|
|
||||||
query.append(q)
|
|
||||||
query = " + ".join(query)
|
|
||||||
|
|
||||||
if not query:
|
|
||||||
self.report({"INFO"}, "No statuses selected.")
|
|
||||||
|
|
||||||
visible_elements = ifcopenshell.util.selector.filter_elements(tool.Ifc.get(), query)
|
|
||||||
|
|
||||||
for obj in bpy.context.view_layer.objects:
|
|
||||||
element = tool.Ifc.get_entity(obj)
|
|
||||||
if not element or not element.is_a("IfcProduct"):
|
|
||||||
continue
|
|
||||||
obj.hide_set(element not in visible_elements)
|
|
||||||
return {"FINISHED"}
|
return {"FINISHED"}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1788,3 +1788,22 @@ class Sequence(bonsai.core.tool.Sequence):
|
|||||||
if include_time:
|
if include_time:
|
||||||
return isodate.datetime_isoformat(datetime_)
|
return isodate.datetime_isoformat(datetime_)
|
||||||
return isodate.date_isoformat(datetime_)
|
return isodate.date_isoformat(datetime_)
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def set_visibility_by_status(cls, visible_statuses: list[str]) -> None:
|
||||||
|
query = []
|
||||||
|
for name in visible_statuses:
|
||||||
|
if name == "No Status":
|
||||||
|
q = f"IfcProduct, /Pset_.*Common/.Status=NULL, EPset_Status.Status=NULL"
|
||||||
|
else:
|
||||||
|
q = f"IfcProduct, /Pset_.*Common/.Status={name} + IfcProduct, EPset_Status.Status={name}"
|
||||||
|
query.append(q)
|
||||||
|
query = " + ".join(query)
|
||||||
|
|
||||||
|
visible_elements = ifcopenshell.util.selector.filter_elements(tool.Ifc.get(), query)
|
||||||
|
|
||||||
|
for obj in bpy.context.view_layer.objects:
|
||||||
|
element = tool.Ifc.get_entity(obj)
|
||||||
|
if not element or not element.is_a("IfcProduct"):
|
||||||
|
continue
|
||||||
|
obj.hide_set(element not in visible_elements)
|
||||||
|
|||||||
Reference in New Issue
Block a user