improve ux for assigning cost item to product types

1) also consider active object as selected when assigning / unassigning cost item to product types. Typically types are hidden and if you select some type in outliner it will become active but still not selected. Now it will be possible to add this active object without unhiding the entire Types collection.

2) info messages to make UI more responsive
This commit is contained in:
Andrej730
2024-05-23 12:10:47 +05:00
parent edfd446833
commit 993ce46fcc
3 changed files with 34 additions and 14 deletions
@@ -224,35 +224,39 @@ class EditCostItem(bpy.types.Operator, tool.Ifc.Operator):
class AssignCostItemType(bpy.types.Operator, tool.Ifc.Operator): class AssignCostItemType(bpy.types.Operator, tool.Ifc.Operator):
bl_idname = "bim.assign_cost_item_type" bl_idname = "bim.assign_cost_item_type"
bl_label = "Assign Cost Item To Product Types" bl_label = "Assign Cost Item To Product Types"
bl_description = "Assign cost item to currently selected or active product types"
bl_options = {"REGISTER", "UNDO"} bl_options = {"REGISTER", "UNDO"}
cost_item: bpy.props.IntProperty() cost_item: bpy.props.IntProperty()
prop_name: bpy.props.StringProperty() prop_name: bpy.props.StringProperty()
def _execute(self, context): def _execute(self, context):
core.assign_cost_item_type( product_types = core.assign_cost_item_type(
tool.Ifc, tool.Ifc,
tool.Cost, tool.Cost,
tool.Spatial, tool.Spatial,
cost_item=tool.Ifc.get().by_id(self.cost_item), cost_item=tool.Ifc.get().by_id(self.cost_item),
prop_name=self.prop_name, # TODO: REVIEW PROP_NAME USABILITY prop_name=self.prop_name, # TODO: REVIEW PROP_NAME USABILITY
) )
self.report({"INFO"}, f"Cost item was assigned to {len(product_types)} product types.")
class UnassignCostItemType(bpy.types.Operator, tool.Ifc.Operator): class UnassignCostItemType(bpy.types.Operator, tool.Ifc.Operator):
bl_idname = "bim.unassign_cost_item_type" bl_idname = "bim.unassign_cost_item_type"
bl_label = "Unassign Cost Item Type" bl_label = "Unassign Cost Item Type"
bl_description = "Unassign cost item from currently selected or active product types"
bl_options = {"REGISTER", "UNDO"} bl_options = {"REGISTER", "UNDO"}
cost_item: bpy.props.IntProperty() cost_item: bpy.props.IntProperty()
related_object: bpy.props.IntProperty() related_object: bpy.props.IntProperty()
def _execute(self, context): def _execute(self, context):
core.unassign_cost_item_type( product_types = core.unassign_cost_item_type(
tool.Ifc, tool.Ifc,
tool.Cost, tool.Cost,
tool.Spatial, tool.Spatial,
cost_item=tool.Ifc.get().by_id(self.cost_item), cost_item=tool.Ifc.get().by_id(self.cost_item),
product_types=[tool.Ifc.get().by_id(self.related_object)] if self.related_object else [], product_types=[tool.Ifc.get().by_id(self.related_object)] if self.related_object else None,
) )
self.report({"INFO"}, f"Cost item was unassigned from {len(product_types)} product types.")
return {"FINISHED"} return {"FINISHED"}
@@ -287,9 +291,11 @@ class UnassignCostItemQuantity(bpy.types.Operator, tool.Ifc.Operator):
tool.Ifc, tool.Ifc,
tool.Cost, tool.Cost,
cost_item=tool.Ifc.get().by_id(self.cost_item), cost_item=tool.Ifc.get().by_id(self.cost_item),
products=[tool.Ifc.get().by_id(self.related_object)] products=(
if self.related_object [tool.Ifc.get().by_id(self.related_object)]
else tool.Spatial.get_selected_products(), if self.related_object
else tool.Spatial.get_selected_products()
),
) )
+21 -7
View File
@@ -17,7 +17,7 @@
# along with BlenderBIM Add-on. If not, see <http://www.gnu.org/licenses/>. # along with BlenderBIM Add-on. If not, see <http://www.gnu.org/licenses/>.
from __future__ import annotations from __future__ import annotations
from typing import TYPE_CHECKING, Optional from typing import TYPE_CHECKING, Optional, Union
if TYPE_CHECKING: if TYPE_CHECKING:
import bpy import bpy
@@ -111,25 +111,39 @@ def edit_cost_item(ifc: tool.Ifc, cost: tool.Cost):
def assign_cost_item_type( def assign_cost_item_type(
ifc: tool.Ifc, cost: tool.Cost, spatial: tool.Spatial, cost_item: ifcopenshell.entity_instance, prop_name ifc: tool.Ifc, cost: tool.Cost, spatial: tool.Spatial, cost_item: ifcopenshell.entity_instance, prop_name
): ) -> list[ifcopenshell.entity_instance]:
product_types = spatial.get_selected_product_types() """
[ Returns:
List of found product types.
"""
product_types = list(spatial.get_selected_product_types())
rels = [
ifc.run("control.assign_control", relating_control=cost_item, related_object=product_type) ifc.run("control.assign_control", relating_control=cost_item, related_object=product_type)
for product_type in product_types for product_type in product_types
] ]
cost.load_cost_item_types(cost_item) cost.load_cost_item_types(cost_item)
return product_types
def unassign_cost_item_type( def unassign_cost_item_type(
ifc: tool.Ifc, cost: tool.Cost, spatial: tool.Spatial, cost_item: ifcopenshell.entity_instance, product_types ifc: tool.Ifc,
): cost: tool.Cost,
spatial: tool.Spatial,
cost_item: ifcopenshell.entity_instance,
product_types: Optional[list[ifcopenshell.entity_instance]] = None,
) -> list[ifcopenshell.entity_instance]:
"""
Returns:
List of found product types.
"""
if not product_types: if not product_types:
product_types = spatial.get_selected_product_types() product_types = list(spatial.get_selected_product_types())
[ [
ifc.run("control.unassign_control", relating_control=cost_item, related_object=product_type) ifc.run("control.unassign_control", relating_control=cost_item, related_object=product_type)
for product_type in product_types for product_type in product_types
] ]
cost.load_cost_item_types(cost_item) cost.load_cost_item_types(cost_item)
return product_types
def load_cost_item_types(cost: tool.Cost): def load_cost_item_types(cost: tool.Cost):
+1 -1
View File
@@ -196,7 +196,7 @@ class Spatial(blenderbim.core.tool.Spatial):
@classmethod @classmethod
def get_selected_product_types(cls) -> Generator[ifcopenshell.entity_instance, None, None]: def get_selected_product_types(cls) -> Generator[ifcopenshell.entity_instance, None, None]:
for obj in bpy.context.selected_objects: for obj in tool.Blender.get_selected_objects():
entity = tool.Ifc.get_entity(obj) entity = tool.Ifc.get_entity(obj)
if entity and entity.is_a("IfcTypeProduct"): if entity and entity.is_a("IfcTypeProduct"):
yield entity yield entity