First attempt at ripping out agnostic code into ifcopenshell.api namespace. See #1399.

This commit is contained in:
Dion Moult
2021-03-25 10:48:31 +11:00
parent 911d703f57
commit d77bc6bdaa
190 changed files with 388 additions and 437 deletions
@@ -0,0 +1,16 @@
import ifcopenshell
class Usecase:
def __init__(self, file, settings=None):
self.file = file
self.settings = {"opening": None, "element": None}
for key, value in settings.items():
self.settings[key] = value
def execute(self):
self.file.create_entity("IfcRelFillsElement", **{
"GlobalId": ifcopenshell.guid.new(),
"RelatingOpeningElement": self.settings["opening"],
"RelatedBuildingElement": self.settings["element"]
})
@@ -0,0 +1,16 @@
import ifcopenshell
class Usecase:
def __init__(self, file, settings=None):
self.file = file
self.settings = {"opening": None, "element": None}
for key, value in settings.items():
self.settings[key] = value
def execute(self):
self.file.create_entity("IfcRelVoidsElement", **{
"GlobalId": ifcopenshell.guid.new(),
"RelatingBuildingElement": self.settings["element"],
"RelatedOpeningElement": self.settings["opening"]
})
@@ -0,0 +1,61 @@
class Data:
products = {}
openings = {}
fillings = {}
@classmethod
def purge(cls):
cls.products = {}
cls.openings = {}
cls.fillings = {}
@classmethod
def load(cls, file, product_id):
if not file:
return
cls.products[product_id] = set()
if product_id in cls.fillings:
del cls.fillings[product_id]
product = file.by_id(product_id)
for rel in file.by_type("IfcRelVoidsElement"):
building_element = rel.RelatingBuildingElement
if building_element != product:
continue
opening = rel.RelatedOpeningElement
opening_id = int(opening.id())
cls.products[product_id].add(opening_id)
cls.openings[opening_id] = {"Name": opening.Name, "HasFillings": set()}
for rel in file.by_type("IfcRelFillsElement"):
opening = rel.RelatingOpeningElement
opening_id = int(opening.id())
filling = rel.RelatedBuildingElement
filling_id = int(filling.id())
if filling_id == product_id and opening_id not in cls.openings:
cls.openings[opening_id] = {"Name": opening.Name, "HasFillings": set()}
if opening_id not in cls.openings:
continue
cls.fillings[filling_id] = {"Name": filling.Name, "FillsVoid": opening_id}
cls.openings[opening_id]["HasFillings"].add(filling_id)
return # See bug #1224
#if not hasattr(product, "HasOpenings") or not product.HasOpenings:
# return
#for rel_voids_element in product.HasOpenings:
# opening = rel_voids_element.RelatedOpeningElement
# opening_id = int(opening.id())
# fillings = []
# if opening.HasFillings:
# for rel_fills_element in opening.HasFillings:
# filling = rel_fills_element.RelatedBuildingElement
# filling_id = int(filling.id())
# fillings.append(filling_id)
# cls.fillings[filling_id] = {
# "Name": filling.Name,
# }
# cls.openings[opening_id] = {
# "Name": opening.Name,
# "HasFillings": fillings,
# }
# cls.products[product_id].append(opening_id)
@@ -0,0 +1,12 @@
class Usecase:
def __init__(self, file, settings=None):
self.file = file
self.settings = {"element": None}
for key, value in settings.items():
self.settings[key] = value
def execute(self):
for rel in self.file.by_type("IfcRelFillsElement"):
if rel.RelatedBuildingElement == self.settings["element"]:
self.file.remove(rel)
break
@@ -0,0 +1,20 @@
class Usecase:
def __init__(self, file, settings=None):
self.file = file
self.settings = {"opening": None}
for key, value in settings.items():
self.settings[key] = value
def execute(self):
to_remove = [] # See bug #1224
for rel in self.file.by_type("IfcRelVoidsElement"):
if rel.RelatedOpeningElement == self.settings["opening"]:
to_remove.append(rel)
break
for rel in self.file.by_type("IfcRelFillsElement"):
if rel.RelatingOpeningElement == self.settings["opening"]:
to_remove.append(rel)
break
self.file.remove(self.settings["opening"])
for element in to_remove:
self.file.remove(element)