| 77 | |
| 78 | |
| 79 | class Clasher: |
| 80 | def __init__(self, settings: ClashSettings): |
| 81 | self.settings = settings |
| 82 | self.geom_settings = ifcopenshell.geom.settings() |
| 83 | self.clash_sets: list[ClashSet] = [] |
| 84 | self.logger = self.settings.logger |
| 85 | self.groups: dict[str, ClashGroup] = {} |
| 86 | self.ifcs: dict[str, ifcopenshell.file] = {} |
| 87 | self.tree = None |
| 88 | |
| 89 | def clash(self) -> None: |
| 90 | for clash_set in self.clash_sets: |
| 91 | self.process_clash_set(clash_set) |
| 92 | |
| 93 | def process_clash_set(self, clash_set: ClashSet) -> None: |
| 94 | self.tree = ifcopenshell.geom.tree() |
| 95 | self.create_group("a") |
| 96 | for source in clash_set["a"]: |
| 97 | source["ifc"] = self.load_ifc(source["file"]) |
| 98 | self.add_collision_objects("a", source["ifc"], source) |
| 99 | |
| 100 | if "b" in clash_set and clash_set["b"]: |
| 101 | self.create_group("b") |
| 102 | for source in clash_set["b"]: |
| 103 | source["ifc"] = self.load_ifc(source["file"]) |
| 104 | self.add_collision_objects("b", source["ifc"], source) |
| 105 | b = "b" |
| 106 | else: |
| 107 | b = "a" |
| 108 | |
| 109 | mode = clash_set["mode"] |
| 110 | if mode == "intersection": |
| 111 | assert "tolerance" in clash_set and "check_all" in clash_set |
| 112 | results = self.tree.clash_intersection_many( |
| 113 | list(self.groups["a"]["elements"].values()), |
| 114 | list(self.groups[b]["elements"].values()), |
| 115 | tolerance=clash_set["tolerance"], |
| 116 | check_all=clash_set["check_all"], |
| 117 | ) |
| 118 | elif mode == "collision": |
| 119 | assert "allow_touching" in clash_set |
| 120 | results = self.tree.clash_collision_many( |
| 121 | list(self.groups["a"]["elements"].values()), |
| 122 | list(self.groups[b]["elements"].values()), |
| 123 | allow_touching=clash_set["allow_touching"], |
| 124 | ) |
| 125 | elif mode == "clearance": |
| 126 | assert "clearance" in clash_set and "check_all" in clash_set |
| 127 | results = self.tree.clash_clearance_many( |
| 128 | list(self.groups["a"]["elements"].values()), |
| 129 | list(self.groups[b]["elements"].values()), |
| 130 | clearance=clash_set["clearance"], |
| 131 | check_all=clash_set["check_all"], |
| 132 | ) |
| 133 | else: |
| 134 | assert_never(mode) |
| 135 | |
| 136 | processed_results: dict[str, ClashResult] = {} |