1 | import wx |
---|
2 | |
---|
3 | |
---|
4 | class ReportImageHandler: |
---|
5 | # Singleton class that manages all report plot images |
---|
6 | # To call the handler, call the static method set_figs |
---|
7 | |
---|
8 | class _ReportImageHandler: |
---|
9 | |
---|
10 | def __init__(self): |
---|
11 | self.img_holder = wx.MemoryFSHandler() |
---|
12 | wx.FileSystem.AddHandler(wx.MemoryFSHandler()) |
---|
13 | self.refs = {} |
---|
14 | self.indices = [] |
---|
15 | |
---|
16 | def set_figs(self, figs, bitmaps, perspective): |
---|
17 | """ |
---|
18 | Save figures and images to memory and return refernces |
---|
19 | :param figs: A list of matplotlib Figures |
---|
20 | :param bitmaps: A list of bitmaps |
---|
21 | :param perspective: A String with the perspective name |
---|
22 | :return: A tuple of a list of Figures and a list of memory refs |
---|
23 | """ |
---|
24 | imgs = [] |
---|
25 | refs = [] |
---|
26 | if figs is None or len(figs) == 0: |
---|
27 | figs = [None] |
---|
28 | for fig in figs: |
---|
29 | if fig is not None: |
---|
30 | ind = figs.index(fig) |
---|
31 | bitmap = bitmaps[ind] |
---|
32 | |
---|
33 | # name of the fig |
---|
34 | name = self.create_unique_name(perspective) |
---|
35 | # AddFile, image can be retrieved with 'memory:filename' |
---|
36 | ref = 'memory:' + name |
---|
37 | self.refs[ref] = fig |
---|
38 | self.img_holder.AddFile(name, bitmap, wx.BITMAP_TYPE_PNG) |
---|
39 | refs.append(ref) |
---|
40 | imgs.append(fig) |
---|
41 | return imgs, refs |
---|
42 | |
---|
43 | def create_unique_name(self, perspective, index=None): |
---|
44 | """ |
---|
45 | Create a unique key for each item in memory |
---|
46 | :param perspective: The perspective name as a string |
---|
47 | :param index: The base index used for incrementing the name |
---|
48 | :return: A unique file name not currently in use |
---|
49 | """ |
---|
50 | if not index: |
---|
51 | index = len(self.indices) |
---|
52 | if index in self.indices: |
---|
53 | name = self.create_unique_name(index + 1) |
---|
54 | else: |
---|
55 | self.indices.append(index) |
---|
56 | name = 'img_{}_{:03d}.png'.format(str(perspective), index) |
---|
57 | return name |
---|
58 | |
---|
59 | instance = None |
---|
60 | |
---|
61 | @staticmethod |
---|
62 | def set_figs(figs, bitmaps, perspective): |
---|
63 | if not ReportImageHandler.instance: |
---|
64 | ReportImageHandler.instance = ReportImageHandler._ReportImageHandler() |
---|
65 | return ReportImageHandler.instance.set_figs(figs, bitmaps, perspective) |
---|