mirror of
https://github.com/IfcOpenShell/IfcOpenShell.git
synced 2026-08-10 17:58:20 +00:00
57 lines
2.8 KiB
Python
57 lines
2.8 KiB
Python
import ifcopenshell.api
|
|
import ifcopenshell.util.element
|
|
|
|
|
|
class Usecase:
|
|
def __init__(self, file, **settings):
|
|
self.file = file
|
|
self.settings = {"product": None, "representation": None}
|
|
for key, value in settings.items():
|
|
self.settings[key] = value
|
|
|
|
def execute(self):
|
|
if self.settings["product"].is_a("IfcProduct"):
|
|
self.unassign_product_representation(self.settings["product"], self.settings["representation"])
|
|
elif self.settings["product"].is_a("IfcTypeProduct"):
|
|
self.unassign_type_representation()
|
|
|
|
def unassign_product_representation(self, product, representation):
|
|
representations = list(product.Representation.Representations or [])
|
|
if representation not in representations:
|
|
return
|
|
representations.remove(representation)
|
|
if not representations:
|
|
self.file.remove(product.Representation)
|
|
else:
|
|
product.Representation.Representations = representations
|
|
|
|
def unassign_type_representation(self):
|
|
for representation_map in self.settings["product"].RepresentationMaps or []:
|
|
if representation_map.MappedRepresentation == self.settings["representation"]:
|
|
self.unassign_products_using_mapped_representation(representation_map)
|
|
self.remove_representation_map_only(representation_map)
|
|
break
|
|
self.settings["product"].RepresentationMaps = self.settings["product"].RepresentationMaps or None
|
|
|
|
def remove_representation_map_only(self, representation_map):
|
|
dummy_representation = self.file.createIfcShapeRepresentation()
|
|
representation_map.MappedRepresentation = dummy_representation
|
|
ifcopenshell.util.element.remove_deep(self.file, representation_map)
|
|
self.file.remove(representation_map)
|
|
|
|
def unassign_products_using_mapped_representation(self, representation_map):
|
|
mapped_representations = []
|
|
just_representations = []
|
|
for map_usage in representation_map.MapUsage or []:
|
|
for inverse in self.file.get_inverse(map_usage):
|
|
if not inverse.is_a("IfcShapeRepresentation"):
|
|
continue
|
|
for definition in inverse.OfProductRepresentation or []:
|
|
for product in definition.ShapeOfProduct or []:
|
|
mapped_representations.append({"product": product, "representation": inverse})
|
|
just_representations.append(inverse)
|
|
for item in mapped_representations:
|
|
self.unassign_product_representation(item["product"], item["representation"])
|
|
for representation in just_representations:
|
|
ifcopenshell.api.run("geometry.remove_representation", self.file, **{"representation": representation})
|