layer.unassign_layer - support batching #4474

This commit is contained in:
Andrej730
2024-04-08 14:45:47 +05:00
parent 7ecec973dd
commit abe6dbdfc9
3 changed files with 68 additions and 10 deletions
@@ -176,7 +176,10 @@ class UnassignPresentationLayer(bpy.types.Operator):
ifcopenshell.api.run( ifcopenshell.api.run(
"layer.unassign_layer", "layer.unassign_layer",
self.file, self.file,
**{"item": self.file.by_id(item.BIMMeshProperties.ifc_definition_id), "layer": self.file.by_id(self.layer)} **{
"items": [self.file.by_id(item.BIMMeshProperties.ifc_definition_id)],
"layer": self.file.by_id(self.layer),
}
) )
return {"FINISHED"} return {"FINISHED"}
@@ -16,16 +16,23 @@
# You should have received a copy of the GNU Lesser General Public License # You should have received a copy of the GNU Lesser General Public License
# along with IfcOpenShell. If not, see <http://www.gnu.org/licenses/>. # along with IfcOpenShell. If not, see <http://www.gnu.org/licenses/>.
import ifcopenshell
import ifcopenshell.util.element
class Usecase: class Usecase:
def __init__(self, file, item=None, layer=None): def __init__(
"""Unassigns an item from a layer self, file: ifcopenshell.file, items: list[ifcopenshell.entity_instance], layer: ifcopenshell.entity_instance
):
"""Unassigns representation items from a layer
If the representation item isn't assigned to the layer, nothing will If the representation item isn't assigned to the layer, nothing will
happen. happen.
If after unassignment layer won't have any assigned items it will be
removed to keep IFC valid.
:param item: An IfcRepresentationItem element to unassign :param items: A list IfcRepresentationItem elements to unassign
:type item: ifcopenshell.entity_instance.entity_instance :type items: list[ifcopenshell.entity_instance.entity_instance]
:param layer: The IfcPresentationLayerAssignment to unassign from :param layer: The IfcPresentationLayerAssignment to unassign from
:type layer: ifcopenshell.entity_instance.entity_instance :type layer: ifcopenshell.entity_instance.entity_instance
:return: None :return: None
@@ -57,15 +64,24 @@ class Usecase:
ifcopenshell.api.run("layer.assign_layer", model, items=[representation.Items[0]], layer=layer) ifcopenshell.api.run("layer.assign_layer", model, items=[representation.Items[0]], layer=layer)
# Let's undo it! # Let's undo it!
ifcopenshell.api.run("layer.unassign_layer", model, item=representation.Items[0], layer=layer) ifcopenshell.api.run("layer.unassign_layer", model, items=[representation.Items[0]], layer=layer)
""" """
self.file = file self.file = file
self.settings = { self.settings = {
"item": item, "items": items,
"layer": layer, "layer": layer,
} }
def execute(self): def execute(self):
assigned_items = set(self.settings["layer"].AssignedItems) or set() layer = self.settings["layer"]
assigned_items.remove(self.settings["item"]) assigned_items = set(layer.AssignedItems) or set()
self.settings["layer"].AssignedItems = list(assigned_items) items = set(self.settings["items"])
if not items.issubset(assigned_items):
return
assigned_items = list(assigned_items - items)
# keep IFC valid in case if there are no items left
if assigned_items:
layer.AssignedItems = assigned_items
else:
self.file.remove(layer)
@@ -0,0 +1,39 @@
# IfcOpenShell - IFC toolkit and geometry engine
# Copyright (C) 2022 Dion Moult <dion@thinkmoult.com>
#
# This file is part of IfcOpenShell.
#
# IfcOpenShell is free software: you can redistribute it and/or modify
# it under the terms of the GNU Lesser General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# IfcOpenShell is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public License
# along with IfcOpenShell. If not, see <http://www.gnu.org/licenses/>.
import test.bootstrap
import ifcopenshell.api
class TestUnassignLayer(test.bootstrap.IFC4):
def test_unassign_layer_from_items(self):
items = [self.file.createIfcExtrudedAreaSolid() for i in range(3)]
layer = self.file.createIfcPresentationLayerAssignment()
ifcopenshell.api.run("layer.assign_layer", self.file, items=items, layer=layer)
ifcopenshell.api.run("layer.unassign_layer", self.file, items=items[2:], layer=layer)
assert len(layer.AssignedItems) == 2
assert set(layer.AssignedItems) == set(items[:2])
def test_remove_layer_if_all_items_are_unassigned(self):
items = [self.file.createIfcExtrudedAreaSolid() for i in range(3)]
layer = self.file.createIfcPresentationLayerAssignment()
ifcopenshell.api.run("layer.assign_layer", self.file, items=items, layer=layer)
ifcopenshell.api.run("layer.unassign_layer", self.file, items=items, layer=layer)
assert not self.file.by_type("IfcPresentationLayerAssignment")