Coverage for bim2sim/tasks/common/serialize_elements.py: 50%

18 statements  

« prev     ^ index     » next       coverage.py v7.6.12, created at 2025-03-12 17:09 +0000

1import pickle 

2from typing import Tuple, Dict 

3 

4from bim2sim.elements.base_elements import SerializedElement 

5from bim2sim.tasks.base import ITask 

6 

7 

8class SerializeElements(ITask): 

9 """Serialize element structure, run() method holds detailed information.""" 

10 

11 reads = ('elements',) 

12 touches = ('serialized_elements',) 

13 single_use = True 

14 

15 def run(self, elements: dict) -> Tuple[Dict]: 

16 """Make the element structure serializable. 

17 

18 As due to swigPy objects coming from IfcOpenShell we can't 

19 directly serialize a whole bim2sim project or even the elements 

20 structure with serializers like pickle. To still keep the element 

21 structure information after a project run, we just copy the relevant 

22 information like the attributes from the AttributeManager, guid and 

23 type of the element to a simple SerializedElement instance and store it 

24 with pickle. 

25 

26 Args: 

27 elements: dict[guid: element] of bim2sim element structure 

28 

29 Returns: 

30 serialized_elements: dict[guid: serializedElement] of serialized 

31 elements 

32 """ 

33 all_elements = {**elements,} 

34 serialized_elements = {} 

35 for ele in all_elements.values(): 

36 se = SerializedElement(ele) 

37 serialized_elements[se.guid] = se 

38 pickle_path = self.paths.export / "serialized_elements.pickle" 

39 with open(pickle_path, "wb") as outfile: 

40 pickle.dump(serialized_elements, outfile) 

41 

42 return serialized_elements,