From 9e250a9616a0b294ad2100523cd644328c058990 Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Sun, 3 May 2020 11:24:52 +1000 Subject: [PATCH] Cache IFC metadata so you don't need to reload the IFC file on every view generation --- .../blenderbim/bim/cut_ifc.py | 60 +++++++++++-------- 1 file changed, 34 insertions(+), 26 deletions(-) diff --git a/src/ifcblenderexport/blenderbim/bim/cut_ifc.py b/src/ifcblenderexport/blenderbim/bim/cut_ifc.py index c9c54a220b..929a25f88c 100644 --- a/src/ifcblenderexport/blenderbim/bim/cut_ifc.py +++ b/src/ifcblenderexport/blenderbim/bim/cut_ifc.py @@ -185,6 +185,9 @@ class IfcCutter: print('# Timer logged at {:.2f} seconds'.format(time.time() - start_time)) def load_ifc_files(self): + if not self.should_recut: + return + loaded_files = [] for ifc_file in self.ifc_files: print('Loading file {} ...'.format(ifc_file)) @@ -579,9 +582,38 @@ class IfcCutter: with multiprocessing.Pool(9) as p: results = p.map(do_cut, process_data) for result in results: - polygons = [p for p in result if p['points']] + polygons = [self.get_polygon_metadata(p, 'cut') for p in result if p['points']] self.cut_polygons.extend(polygons) + def get_polygon_metadata(self, polygon, position): + polygon['metadata'] = { + 'classes': self.get_classes(self.get_ifc_element(polygon['global_id']), position) + } + return polygon + + def get_ifc_element(self, global_id): + # TODO: make this less bad + element = None + for ifc_file in self.ifc_files: + try: + element = ifc_file.by_id(global_id) + return element + except: + pass + + def get_classes(self, element, position): + classes = [position, element.is_a()] + for association in element.HasAssociations: + if association.is_a('IfcRelAssociatesMaterial'): + classes.append('material-{}'.format(self.get_material_name(association.RelatingMaterial))) + classes.append('globalid-{}'.format(element.GlobalId)) + return classes + + def get_material_name(self, element): + if hasattr(element, 'Name') and element.Name: + return element.Name + return element.id() + def get_pickled_cut_polygons(self): if os.path.isfile(self.cut_pickle_file): with open(self.cut_pickle_file, 'rb') as pickle_file: @@ -992,29 +1024,5 @@ class SvgWriter(): self.svg.add(self.svg.line(start=points[0], end=points[1], class_=' '.join(classes))) def draw_polygon(self, polygon, position): - classes = self.get_classes(self.get_ifc_element(polygon['global_id']), position) points = [(p[0] * self.scale, p[1] * self.scale) for p in polygon['points']] - self.svg.add(self.svg.polygon(points=points, class_=' '.join(classes))) - - def get_ifc_element(self, global_id): - # TODO: make this less bad - element = None - for ifc_file in self.ifc_cutter.ifc_files: - try: - element = ifc_file.by_id(global_id) - return element - except: - pass - - def get_classes(self, element, position): - classes = [position, element.is_a()] - for association in element.HasAssociations: - if association.is_a('IfcRelAssociatesMaterial'): - classes.append('material-{}'.format(self.get_material_name(association.RelatingMaterial))) - classes.append('globalid-{}'.format(element.GlobalId)) - return classes - - def get_material_name(self, element): - if hasattr(element, 'Name') and element.Name: - return element.Name - return element.id() + self.svg.add(self.svg.polygon(points=points, class_=' '.join(polygon['metadata']['classes'])))