mwxlib 1.5.13__py3-none-any.whl → 1.6.2__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of mwxlib might be problematic. Click here for more details.

mwx/framework.py CHANGED
@@ -1,7 +1,7 @@
1
1
  #! python3
2
2
  """mwxlib framework.
3
3
  """
4
- __version__ = "1.5.13"
4
+ __version__ = "1.6.2"
5
5
  __author__ = "Kazuya O'moto <komoto@jeol.co.jp>"
6
6
 
7
7
  from contextlib import contextmanager
mwx/graphman.py CHANGED
@@ -9,6 +9,7 @@ from pprint import pformat
9
9
  import threading
10
10
  import traceback
11
11
  import inspect
12
+ import types
12
13
  import sys
13
14
  import os
14
15
  import platform
@@ -487,15 +488,9 @@ class Layer(LayerInterface, KnobCtrlPanel):
487
488
  LayerInterface.__init__(self, parent, session)
488
489
 
489
490
 
490
- def register(cls, module=None):
491
- """Register dummy plug; Add module.Plugin <Layer>.
492
- """
493
- if not module:
494
- module = inspect.getmodule(cls) # rebase module or __main__
495
-
491
+ def _register__dummy_plug__(cls, module):
496
492
  if issubclass(cls, LayerInterface):
497
- cls.__module__ = module.__name__ # __main__ to module
498
- warn(f"Duplicate iniheritance of LayerInterface by {cls}.")
493
+ ## warn(f"Duplicate iniheritance of LayerInterface by {cls}.")
499
494
  module.Plugin = cls
500
495
  return cls
501
496
 
@@ -504,8 +499,8 @@ def register(cls, module=None):
504
499
  cls.__init__(self, parent, **kwargs)
505
500
  LayerInterface.__init__(self, parent, session)
506
501
 
507
- _Plugin.__module__ = cls.__module__ = module.__name__
508
- _Plugin.__name__ = cls.__name__ + str("~")
502
+ _Plugin.__module__ = module.__name__
503
+ _Plugin.__name__ = cls.__name__ + "~"
509
504
  _Plugin.__doc__ = cls.__doc__
510
505
  module.Plugin = _Plugin
511
506
  return _Plugin
@@ -554,25 +549,13 @@ class Graph(GraphPlot):
554
549
  if self.infobar.IsShown():
555
550
  self.infobar.ShowMessage(frame.annotation)
556
551
 
557
- def get_markups_visible(self):
558
- return self.marked.get_visible()
559
-
560
- def set_markups_visible(self, v):
561
- self.selected.set_visible(v)
562
- self.marked.set_visible(v)
563
- self.rected.set_visible(v)
564
- self.update_art_of_mark()
565
-
566
- def remove_markups(self):
567
- del self.selector
568
- del self.markers
569
- del self.region
570
-
571
552
  def hide_layers(self):
572
553
  for plug in self.parent.get_all_plugs():
573
554
  for art in plug.Arts:
574
555
  art.set_visible(0)
575
- self.remove_markups()
556
+ del self.selector
557
+ del self.markers
558
+ del self.region
576
559
  self.draw()
577
560
 
578
561
 
@@ -740,13 +723,6 @@ class Frame(mwx.Frame):
740
723
  (wx.ID_PASTE, "&Paste\t(C-v)", "Paste buffer from clipboard", Icon('paste'),
741
724
  lambda v: self.__view.read_buffer_from_clipboard()),
742
725
  (),
743
- (mwx.ID_(21), "Toggle &markers", "Show/Hide markups", wx.ITEM_CHECK, Icon('+'),
744
- lambda v: self.__view.set_markups_visible(v.IsChecked()),
745
- lambda v: v.Check(self.__view.get_markups_visible())),
746
-
747
- (mwx.ID_(22), "&Remove markers", "Remove markups", Icon('-'),
748
- lambda v: self.__view.remove_markups()),
749
- (),
750
726
  (mwx.ID_(23), "Hide all &layers", "Hide all layers", Icon('xr'),
751
727
  lambda v: self.__view.hide_layers()),
752
728
  (),
@@ -756,14 +732,14 @@ class Frame(mwx.Frame):
756
732
 
757
733
  (mwx.ID_(25), "&Invert color\t(C-i)", "Invert colormap", wx.ITEM_CHECK,
758
734
  lambda v: self.__view.invert_cmap(),
759
- lambda v: v.Check(self.__view.get_cmap()[-2:] == "_r")),
735
+ lambda v: v.Check(self.__view.get_cmapstr()[-2:] == "_r")),
760
736
  ]
761
737
 
762
738
  def _cmenu(i, name):
763
739
  return (mwx.ID_(30 + i), "&" + name, name, wx.ITEM_CHECK,
764
- lambda v: self.__view.set_cmap(name),
765
- lambda v: v.Check(self.__view.get_cmap() == name
766
- or self.__view.get_cmap() == name+"_r"),
740
+ lambda v: self.__view.set_cmapstr(name),
741
+ lambda v: v.Check(self.__view.get_cmapstr() == name
742
+ or self.__view.get_cmapstr() == name+"_r"),
767
743
  )
768
744
  colours = [c for c in dir(cm) if c[-2:] != "_r"
769
745
  and isinstance(getattr(cm, c), colors.LinearSegmentedColormap)]
@@ -771,8 +747,8 @@ class Frame(mwx.Frame):
771
747
  self.menubar["Edit"] += [
772
748
  (),
773
749
  ## (mwx.ID_(26), "Default Color", "gray", wx.ITEM_CHECK,
774
- ## lambda v: self.__view.set_cmap('gray'),
775
- ## lambda v: v.Check(self.__view.get_cmap()[:4] == "gray")),
750
+ ## lambda v: self.__view.set_cmapstr('gray'),
751
+ ## lambda v: v.Check(self.__view.get_cmapstr()[:4] == "gray")),
776
752
  ##
777
753
  ("Standard colors",
778
754
  [_cmenu(i, c) for i, c in enumerate(colours) if c.islower()]),
@@ -814,8 +790,8 @@ class Frame(mwx.Frame):
814
790
  })
815
791
 
816
792
  ## Add main-menu to context-menu
817
- self.graph.menu += self.menubar["Edit"][2:7]
818
- self.output.menu += self.menubar["Edit"][2:7]
793
+ self.graph.menu += self.menubar["Edit"][2:4]
794
+ self.output.menu += self.menubar["Edit"][2:4]
819
795
 
820
796
  self._mgr.Bind(aui.EVT_AUI_PANE_CLOSE, self.OnPaneClose)
821
797
 
@@ -1024,6 +1000,13 @@ class Frame(mwx.Frame):
1024
1000
  ## --------------------------------
1025
1001
  plugins = property(lambda self: self.__plugins)
1026
1002
 
1003
+ def register(self, cls=None, **kwargs):
1004
+ """Decorator of plugin class register."""
1005
+ if cls is None:
1006
+ return lambda f: self.register(f, **kwargs)
1007
+ self.load_plug(cls, force=1, show=1, **kwargs)
1008
+ return cls
1009
+
1027
1010
  def require(self, name):
1028
1011
  """Get named plug window.
1029
1012
  If not found, try to load it once.
@@ -1046,13 +1029,14 @@ class Frame(mwx.Frame):
1046
1029
  if name in self.plugins:
1047
1030
  return self.plugins[name].__plug__
1048
1031
  elif isinstance(name, LayerInterface):
1049
- return name
1032
+ ## return name
1033
+ return next((x for x in self.get_all_plugs() if x is name), None)
1050
1034
 
1051
1035
  def get_all_plugs(self):
1052
1036
  for name, module in self.plugins.items():
1053
1037
  yield module.__plug__
1054
1038
 
1055
- def load_plug(self, root, force=False, session=None, show=False,
1039
+ def load_plug(self, root, session=None, force=False, show=False,
1056
1040
  dock=0, floating_pos=None, floating_size=None,
1057
1041
  **kwargs):
1058
1042
  """Load plugin.
@@ -1061,14 +1045,12 @@ class Frame(mwx.Frame):
1061
1045
  root: Plugin <Layer> module, or name of the module.
1062
1046
  Any wx.Window object can be specified (as dummy-plug).
1063
1047
  However, do not use this mode in release versions.
1064
- force: force loading even if it is already loaded
1065
1048
  session: Conditions for initializing the plug and starting session
1066
-
1049
+ force: force loading even if it is already loaded
1067
1050
  show: the pane is shown after loaded
1068
1051
  dock: dock_direction (1:top, 2:right, 3:bottom, 4:left, 5:center)
1069
1052
  floating_pos: posision of floating window
1070
1053
  floating_size: size of floating window
1071
-
1072
1054
  **kwargs: keywords for Plugin <Layer>
1073
1055
 
1074
1056
  Returns:
@@ -1081,22 +1063,20 @@ class Frame(mwx.Frame):
1081
1063
  floating_pos=floating_pos,
1082
1064
  floating_size=floating_size)
1083
1065
 
1084
- if inspect.ismodule(root): # @TODO: Change root module name
1085
- name = root.__file__
1086
- ## name = root.__name__
1066
+ if inspect.ismodule(root):
1067
+ name = root.__name__
1087
1068
  elif inspect.isclass(root):
1088
- name = inspect.getsourcefile(root)
1069
+ name = root.__module__
1089
1070
  else:
1090
1071
  name = root
1091
- dirname_, name = os.path.split(name) # if the name is full path,...
1072
+ dirname_, name = os.path.split(name) # if the name is full-path:str
1092
1073
  if name.endswith(".py"):
1093
1074
  name = name[:-3]
1094
1075
 
1095
1076
  if not force:
1096
- ## 文字列参照 (root:str) による重複ロードを避ける
1077
+ ## 文字列参照 (full-path) による重複ロードを避ける
1097
1078
  module = next((v for v in self.plugins.values() if root == v.__file__), None)
1098
1079
  if module:
1099
- ## print(f"- {name!r} is already loaded as {module.__name__!r}.")
1100
1080
  plug = module.__plug__
1101
1081
  else:
1102
1082
  plug = self.get_plug(name)
@@ -1126,20 +1106,25 @@ class Frame(mwx.Frame):
1126
1106
  module = reload(sys.modules[name])
1127
1107
  else:
1128
1108
  module = import_module(name)
1109
+ except ModuleNotFoundError:
1110
+ module = types.ModuleType(name) # dummy module (cannot reload)
1111
+ module.__file__ = "<scratch>"
1112
+ ## sys.modules[name] = module
1129
1113
  except Exception:
1130
1114
  traceback.print_exc() # Unable to load the module.
1131
1115
  return False
1116
+
1117
+ ## Register dummy plug; Add module.Plugin <Layer>.
1118
+ if not hasattr(module, 'Plugin'):
1119
+ if inspect.isclass(root):
1120
+ _register__dummy_plug__(root, module)
1121
+ module.__dummy_plug__ = root
1132
1122
  else:
1133
- if not hasattr(module, 'Plugin'):
1134
- if isinstance(root, type):
1135
- ## warn(f"Use dummy plug for {name!r}.")
1136
- module.__dummy_plug__ = root
1137
- register(root, module)
1138
- else:
1139
- if hasattr(module, '__dummy_plug__'):
1140
- root = module.__dummy_plug__ # old class (imported)
1141
- cls = getattr(module, root.__name__) # new class (reloaded)
1142
- register(cls, module)
1123
+ if hasattr(module, '__dummy_plug__'):
1124
+ cls = module.__dummy_plug__ # old class (imported)
1125
+ cls = getattr(module, cls.__name__) # new class (reloaded)
1126
+ _register__dummy_plug__(cls, module)
1127
+ module.__dummy_plug__ = cls
1143
1128
 
1144
1129
  ## Note: name (module.__name__) != Plugin.__module__ if module is a package.
1145
1130
  try:
@@ -1169,8 +1154,8 @@ class Frame(mwx.Frame):
1169
1154
  show = show or pane.IsShown()
1170
1155
  props.update(
1171
1156
  dock_direction = pane.IsDocked() and pane.dock_direction,
1172
- floating_pos = floating_pos or pane.floating_pos[:], # copy unloading pane
1173
- floating_size = floating_size or pane.floating_size[:], # copy unloading pane
1157
+ floating_pos = floating_pos or pane.floating_pos[:], # copy unloading pane
1158
+ floating_size = floating_size or pane.floating_size[:], # copy unloading pane
1174
1159
  )
1175
1160
  self.unload_plug(name)
1176
1161
 
@@ -1295,11 +1280,17 @@ class Frame(mwx.Frame):
1295
1280
 
1296
1281
  session = {}
1297
1282
  try:
1298
- print("Reloading {}...".format(plug))
1283
+ print(f"Reloading {plug}...")
1299
1284
  plug.save_session(session)
1300
1285
  except Exception:
1301
1286
  traceback.print_exc() # Failed to save the plug session.
1287
+
1302
1288
  self.load_plug(plug.__module__, force=1, session=session)
1289
+
1290
+ ## Update shell.target --> new plug
1291
+ for shell in self.shellframe.get_all_shells():
1292
+ if shell.target is plug:
1293
+ shell.handler('shell_activated', shell)
1303
1294
 
1304
1295
  def inspect_plug(self, name):
1305
1296
  """Dive into the process to inspect plugs in the shell."""
@@ -1309,6 +1300,7 @@ class Frame(mwx.Frame):
1309
1300
  return
1310
1301
 
1311
1302
  shell = self.shellframe.clone_shell(plug)
1303
+ name = plug.Name # init(shell) で名前を参照するため再定義する
1312
1304
 
1313
1305
  @shell.handler.bind("shell_activated")
1314
1306
  def init(shell):
@@ -1355,7 +1347,7 @@ class Frame(mwx.Frame):
1355
1347
 
1356
1348
  if not filename:
1357
1349
  default_path = view.frame.pathname if view.frame else None
1358
- with wx.FileDialog(self, "Select index file to import",
1350
+ with wx.FileDialog(self, "Select index file to load",
1359
1351
  defaultDir=os.path.dirname(default_path or ''),
1360
1352
  defaultFile=self.ATTRIBUTESFILE,
1361
1353
  wildcard="Index (*.index)|*.index|"
@@ -1758,7 +1750,10 @@ class Frame(mwx.Frame):
1758
1750
 
1759
1751
  for name, module in self.plugins.items():
1760
1752
  plug = self.get_plug(name)
1761
- name = module.__file__ # Replace the name with full path.
1753
+ name = module.__file__ # Replace the name with full-path.
1754
+ if not plug or not os.path.exists(name):
1755
+ print(f"Skipping dummy plugin {name!r}...")
1756
+ continue
1762
1757
  if hasattr(module, '__path__'): # is the module a package?
1763
1758
  name = os.path.dirname(name)
1764
1759
  session = {}
@@ -1766,7 +1761,7 @@ class Frame(mwx.Frame):
1766
1761
  plug.save_session(session)
1767
1762
  except Exception:
1768
1763
  traceback.print_exc() # Failed to save the plug session.
1769
- o.write("self.load_plug({!r}, session={})\n".format(name, session or None))
1764
+ o.write("self.load_plug({!r}, session={})\n".format(name, session))
1770
1765
  o.write("self._mgr.LoadPerspective({!r})\n".format(self._mgr.SavePerspective()))
1771
1766
 
1772
1767
  def _save(view):
mwx/matplot2g.py CHANGED
@@ -51,7 +51,8 @@ def _to_buffer(img):
51
51
  if not isinstance(img, np.ndarray):
52
52
  raise ValueError("targets must be arrays or images.")
53
53
 
54
- assert img.ndim > 1, "targets must be 2d arrays."
54
+ if img.ndim < 2:
55
+ raise ValueError("targets must be 2d arrays.")
55
56
 
56
57
  if img.ndim > 2:
57
58
  return cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
@@ -324,13 +325,19 @@ class AxesImagePhantom:
324
325
  sx = slice(max(0, nx[0]), nx[1]) # nx slice
325
326
  sy = slice(max(0, ny[1]), ny[0]) # ny slice 反転 (降順)
326
327
  return self.__buf[sy, sx]
327
- return self.__buf
328
+ return None
328
329
 
329
330
  @roi.setter
330
331
  def roi(self, v):
331
- self.roi[:] = v # cannot broadcast input array into different shape
332
+ if not self.parent.region.size:
333
+ raise ValueError("region is not selected.")
334
+ self.roi[:] = v # cannot broadcast input array into different shape
332
335
  self.update_buffer()
333
336
 
337
+ @property
338
+ def roi_or_buffer(self):
339
+ return self.roi if self.parent.region.size else self.buffer
340
+
334
341
  @property
335
342
  def buffer(self):
336
343
  return self.__buf
@@ -565,7 +572,7 @@ class GraphPlot(MatplotPanel):
565
572
  (),
566
573
  (mwx.ID_(500), "&Invert Color", "Invert colormap", wx.ITEM_CHECK,
567
574
  lambda v: self.invert_cmap(),
568
- lambda v: v.Check(self.get_cmap()[-2:] == "_r")),
575
+ lambda v: v.Check(self.get_cmapstr()[-2:] == "_r")),
569
576
  (),
570
577
  (wx.ID_CLOSE, "&Kill buffer\t(C-k)", "Kill buffer", _Icon(wx.ART_DELETE),
571
578
  lambda v: self.kill_buffer(),
@@ -637,7 +644,7 @@ class GraphPlot(MatplotPanel):
637
644
  show: Show immediately when loaded.
638
645
  **kwargs: frame attributes.
639
646
  """
640
- assert buf is not None, "Load buffer must be an array or string (not None)"
647
+ assert buf is not None, "Load buffer must be an array or path:str (not None)"
641
648
 
642
649
  if isinstance(buf, str):
643
650
  buf = Image.open(buf)
@@ -898,12 +905,12 @@ class GraphPlot(MatplotPanel):
898
905
  self.handler('frame_deselected', self.frame)
899
906
  self.on_picker_lock(evt)
900
907
 
901
- def get_cmap(self):
908
+ def get_cmapstr(self):
902
909
  if self.frame:
903
910
  return self.frame.get_cmap().name
904
911
  return ''
905
912
 
906
- def set_cmap(self, name):
913
+ def set_cmapstr(self, name):
907
914
  if self.frame:
908
915
  self.frame.set_cmap(name)
909
916
  self.handler('frame_cmapped', self.frame)
@@ -912,7 +919,7 @@ class GraphPlot(MatplotPanel):
912
919
  def invert_cmap(self):
913
920
  if self.frame:
914
921
  name = self.frame.get_cmap().name
915
- self.set_cmap(name + "_r" if name[-2:] != "_r" else name[:-2])
922
+ self.set_cmapstr(name + "_r" if name[-2:] != "_r" else name[:-2])
916
923
 
917
924
  def trace_point(self, x, y, type=NORMAL):
918
925
  """Puts (override) a message of points x and y."""
@@ -985,7 +992,7 @@ class GraphPlot(MatplotPanel):
985
992
  return
986
993
 
987
994
  name = frame.name
988
- data = frame.roi
995
+ data = frame.roi_or_buffer
989
996
  GraphPlot.clipboard_name = name
990
997
  GraphPlot.clipboard_data = data
991
998
  bins, vlim, img = _to_image(data, frame.cuts)
@@ -216,7 +216,7 @@ class Plugin(Layer):
216
216
  tc.value = round(self.mc.Tell()) / 1000
217
217
 
218
218
  def set_crop(self):
219
- """Set crop area (W:H:Left:Top) to roi."""
219
+ """Set crop area (W:H:Left:Top) to ROI."""
220
220
  if not self._path:
221
221
  return
222
222
  frame = self.graph.frame
@@ -232,7 +232,7 @@ class Plugin(Layer):
232
232
  self.message("Failed to evaluate crop text.")
233
233
 
234
234
  def get_crop(self):
235
- """Get crop area (W:H:Left:Top) from roi."""
235
+ """Get crop area (W:H:Left:Top) from ROI."""
236
236
  if not self._path:
237
237
  return
238
238
  crop = ''
mwx/plugins/fft_view.py CHANGED
@@ -51,7 +51,7 @@ class Plugin(Layer):
51
51
  frame = self.graph.frame
52
52
  if frame:
53
53
  self.message("FFT execution...")
54
- src = fftcrop(frame.roi)
54
+ src = fftcrop(frame.roi_or_buffer)
55
55
  h, w = src.shape
56
56
 
57
57
  dst = fftshift(fft2(src))
@@ -60,8 +60,7 @@ class Plugin(Layer):
60
60
  u = 1 / w
61
61
  if self.pchk.Value:
62
62
  u /= frame.unit
63
- self.output.load(dst, "*fft of {}*".format(frame.name),
64
- localunit=u)
63
+ self.output.load(dst, f"*fft of {frame.name}*", localunit=u)
65
64
  self.message("\b done")
66
65
 
67
66
  def newifft(self):
@@ -69,18 +68,17 @@ class Plugin(Layer):
69
68
  frame = self.output.frame
70
69
  if frame:
71
70
  self.message("iFFT execution...")
72
- src = frame.roi
71
+ src = frame.buffer # Don't crop fft region
73
72
  h, w = src.shape
74
73
 
75
74
  if self.ftor.check:
76
75
  y, x = np.ogrid[-h/2:h/2, -w/2:w/2]
77
76
  mask = np.hypot(y, x) > w / self.ftor.value
78
- src = src.copy() # apply mask to the copy
77
+ src = src.copy() # apply mask to the copy
79
78
  src[mask] = 0
80
79
 
81
80
  dst = ifft2(ifftshift(src))
82
81
 
83
82
  self.message("\b Loading image...")
84
- self.graph.load(dst.real, "*ifft of {}*".format(frame.name),
85
- localunit=1/w/frame.unit)
83
+ self.graph.load(dst.real, f"*ifft of {frame.name}*", localunit=1/w/frame.unit)
86
84
  self.message("\b done")
mwx/testsuite.py CHANGED
@@ -17,7 +17,7 @@ Is equivalent to:
17
17
  from contextlib import contextmanager
18
18
  import wx
19
19
 
20
- __all__ = ["testApp", "testFrame", "testPlugin", "testPanel"]
20
+ __all__ = ["testApp", "testFrame"]
21
21
 
22
22
 
23
23
  @contextmanager
@@ -36,23 +36,3 @@ def testFrame(**kwargs):
36
36
  yield frm
37
37
  frm.Show()
38
38
  ## wx.Frame.run = staticmethod(testFrame)
39
-
40
-
41
- @contextmanager
42
- def testPanel(**kwargs):
43
- import mwx
44
- with testApp():
45
- frm = mwx.Frame(None)
46
- panel = mwx.ControlPanel(frm, **kwargs)
47
- yield panel
48
- panel.Sizer.Fit(frm)
49
- frm.Show()
50
-
51
-
52
- @contextmanager
53
- def testPlugin(**kwargs):
54
- import mwx.graphman
55
- with testApp():
56
- frm = mwx.graphman.Frame(None, **kwargs)
57
- yield frm
58
- frm.Show()
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mwxlib
3
- Version: 1.5.13
3
+ Version: 1.6.2
4
4
  Summary: A wrapper of matplotlib and wxPython (phoenix)
5
5
  Home-page: https://github.com/komoto48g/mwxlib
6
6
  Author: Kazuya O'moto
@@ -1,28 +1,28 @@
1
1
  mwx/__init__.py,sha256=pS7ZG8QKRypiFFiaWAq_opBB6I_1viZ0zUMk2TbjzE0,667
2
2
  mwx/bookshelf.py,sha256=yW17nMNPXKHM7LLXLpr9DaRhyFHz_OBAZ_DsuEK2QzA,8387
3
3
  mwx/controls.py,sha256=B9f_A0ev3SPf75K-LIZCusMLeDGYz1O3cMml7IOrDrM,49870
4
- mwx/framework.py,sha256=E9wqJeF8_r7qhBGBHAt6lsLdEhckqeTzjPgYPbRpFZ8,77464
5
- mwx/graphman.py,sha256=m5n4Ew25CXyCszTOI8RiFMNKfJPrV5Rte4ZwdH8bGGo,69831
4
+ mwx/framework.py,sha256=8E9hGW9YPJBpv55ZvPrIQnVcNeDtWP-RRvgXOJbvYXc,77463
5
+ mwx/graphman.py,sha256=l6SjyjZj0_aDj-_dwNDlVI6aD3BQqbhoLe95NAzAEqo,69699
6
6
  mwx/images.py,sha256=Kkfy9QI_hMtwShSjUS4-ZpC_EkVuah_XhpBOR4wAKkM,49792
7
7
  mwx/matplot2.py,sha256=cjdN12RENqWFw1v9QyO05XQc6dK3Pn_ltdC3OfmhGfg,32995
8
- mwx/matplot2g.py,sha256=KY4zvtd-11RhlaSJD8nNbzv2cM4i3IWDi1rFmQJf8_g,65213
8
+ mwx/matplot2g.py,sha256=0gxjl7UKx8QGRI2thpniA7dQu9fpHGG0mvl7Ml2exrc,65474
9
9
  mwx/matplot2lg.py,sha256=jE-LYPEVaEapQN8L-eviRyEx4Lw-8GyLGzZotrIZShU,27413
10
10
  mwx/mgplt.py,sha256=SVUJ0ls4gC9xulbWxK2qqmDxf0uBCflvwoPkxoF5s3M,5566
11
11
  mwx/nutshell.py,sha256=Sa5PKSiXxT74Mj_vE9fUinxkfm5Xtg1MGGUjwbRH-yY,147552
12
- mwx/testsuite.py,sha256=0Q_n_XOOsZ8lsLWUkuO8QW00hts9wEQfnUKMpf0BAyU,1235
12
+ mwx/testsuite.py,sha256=pBB7ZNicI_thrg6LmNPgUOgfMWwRoAaYWN1nFy6t6S4,790
13
13
  mwx/utilus.py,sha256=JOYBTHoo_GmYykX72PgiPzgD2M-1pcOR8gMBLc2bnck,39016
14
14
  mwx/wxmon.py,sha256=aS6lSjDm0PxIhfyBPtg-wIP0v-R3g2K5a3k2mclWSrQ,12798
15
15
  mwx/wxpdb.py,sha256=ehRawAnqQberUeDN9j_-drWYQzu23w5UeQyto4nj53g,18812
16
16
  mwx/wxwil.py,sha256=_74m3jEUu3ktjHKHWEEK34ck439u9A0PhDDxFVTA0_Y,5404
17
17
  mwx/wxwit.py,sha256=W7wP9loxw0dAdk5-NWMIHt19Og1h-3vFzz-8BPicHB4,7348
18
18
  mwx/plugins/__init__.py,sha256=jnJ-Sl9XJ_7BFDslD_r7dsbxsOT57q_IaEriV53XIGY,41
19
- mwx/plugins/ffmpeg_view.py,sha256=GT3mAP7cvAgkzHyA0Em_FP8wiWS-dRekUyBgaXIBQCc,10982
20
- mwx/plugins/fft_view.py,sha256=Hsho8y-42hG3htQAJ9ct1347NHJ8qPvN4snq_1jYOxw,2793
19
+ mwx/plugins/ffmpeg_view.py,sha256=TZX4hoB4z8vJ2yO_aXHOkc7kHxRASVLchY5TRkqPbrU,10982
20
+ mwx/plugins/fft_view.py,sha256=k_Ow7osBR-nXyiqAPFdEsd7B3Q-87By3INntJMZxahc,2742
21
21
  mwx/plugins/frame_listview.py,sha256=yd2NCgspqGfTNhj1wxuW8r1zapIm7vNzVX2iytk8CDM,10618
22
22
  mwx/plugins/line_profile.py,sha256=zzm6_7lnAnNepLbh07ordp3nRWDFQJtu719ZVjrVf8s,819
23
23
  mwx/py/__init__.py,sha256=xykgfOytOwNuvXsfkLoumFZSTN-iBsHOjczYXngjmUE,12
24
24
  mwx/py/filling.py,sha256=vWCJoHd_oyXOeXTHtXGY7wfNQeNAZhV3GZu4xlc8GDY,16867
25
- mwxlib-1.5.13.dist-info/METADATA,sha256=Z1q0ZF9W0_js50oiiwHqvPtGXRCPMrbkih4zpgM-G3w,7382
26
- mwxlib-1.5.13.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
27
- mwxlib-1.5.13.dist-info/top_level.txt,sha256=SI1Mh118AstnUFGPNq5aMNKiAnVNmZk1S9Ij-OwAEpY,4
28
- mwxlib-1.5.13.dist-info/RECORD,,
25
+ mwxlib-1.6.2.dist-info/METADATA,sha256=RshZtfKDFUVVMf92eAGQhe08pmtZjPR3ClIhuYOpGRc,7381
26
+ mwxlib-1.6.2.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
27
+ mwxlib-1.6.2.dist-info/top_level.txt,sha256=SI1Mh118AstnUFGPNq5aMNKiAnVNmZk1S9Ij-OwAEpY,4
28
+ mwxlib-1.6.2.dist-info/RECORD,,