mwxlib 1.5.13__py3-none-any.whl → 1.6.3__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 +1 -1
- mwx/graphman.py +70 -70
- mwx/matplot2g.py +16 -9
- mwx/plugins/ffmpeg_view.py +2 -2
- mwx/plugins/fft_view.py +5 -7
- mwx/testsuite.py +1 -21
- {mwxlib-1.5.13.dist-info → mwxlib-1.6.3.dist-info}/METADATA +1 -1
- {mwxlib-1.5.13.dist-info → mwxlib-1.6.3.dist-info}/RECORD +10 -10
- {mwxlib-1.5.13.dist-info → mwxlib-1.6.3.dist-info}/WHEEL +0 -0
- {mwxlib-1.5.13.dist-info → mwxlib-1.6.3.dist-info}/top_level.txt +0 -0
mwx/framework.py
CHANGED
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
|
|
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
|
-
|
|
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__ =
|
|
508
|
-
_Plugin.__name__ = cls.__name__ +
|
|
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.
|
|
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.
|
|
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.
|
|
765
|
-
lambda v: v.Check(self.__view.
|
|
766
|
-
or self.__view.
|
|
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.
|
|
775
|
-
## lambda v: v.Check(self.__view.
|
|
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:
|
|
818
|
-
self.output.menu += self.menubar["Edit"][2:
|
|
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,
|
|
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,23 @@ class Frame(mwx.Frame):
|
|
|
1081
1063
|
floating_pos=floating_pos,
|
|
1082
1064
|
floating_size=floating_size)
|
|
1083
1065
|
|
|
1084
|
-
if inspect.ismodule(root):
|
|
1085
|
-
name = root.
|
|
1086
|
-
## name = root.__name__
|
|
1066
|
+
if inspect.ismodule(root):
|
|
1067
|
+
name = root.__name__
|
|
1087
1068
|
elif inspect.isclass(root):
|
|
1088
|
-
name =
|
|
1069
|
+
name = root.__module__
|
|
1089
1070
|
else:
|
|
1090
1071
|
name = root
|
|
1091
|
-
|
|
1072
|
+
if name == "__main__":
|
|
1073
|
+
name = inspect.getfile(__import__("__main__"))
|
|
1074
|
+
|
|
1075
|
+
dirname_, name = os.path.split(name) # if the name is full-path:str
|
|
1092
1076
|
if name.endswith(".py"):
|
|
1093
1077
|
name = name[:-3]
|
|
1094
1078
|
|
|
1095
1079
|
if not force:
|
|
1096
|
-
## 文字列参照 (
|
|
1080
|
+
## 文字列参照 (full-path) による重複ロードを避ける
|
|
1097
1081
|
module = next((v for v in self.plugins.values() if root == v.__file__), None)
|
|
1098
1082
|
if module:
|
|
1099
|
-
## print(f"- {name!r} is already loaded as {module.__name__!r}.")
|
|
1100
1083
|
plug = module.__plug__
|
|
1101
1084
|
else:
|
|
1102
1085
|
plug = self.get_plug(name)
|
|
@@ -1127,19 +1110,26 @@ class Frame(mwx.Frame):
|
|
|
1127
1110
|
else:
|
|
1128
1111
|
module = import_module(name)
|
|
1129
1112
|
except Exception:
|
|
1130
|
-
|
|
1131
|
-
|
|
1132
|
-
|
|
1133
|
-
|
|
1134
|
-
if isinstance(root, type):
|
|
1135
|
-
## warn(f"Use dummy plug for {name!r}.")
|
|
1136
|
-
module.__dummy_plug__ = root
|
|
1137
|
-
register(root, module)
|
|
1113
|
+
module = inspect.getmodule(name) # __main__ ? Check if the module is dummy.
|
|
1114
|
+
if module:
|
|
1115
|
+
traceback.print_exc() # Unable to load the module.
|
|
1116
|
+
return False
|
|
1138
1117
|
else:
|
|
1139
|
-
|
|
1140
|
-
|
|
1141
|
-
|
|
1142
|
-
|
|
1118
|
+
module = types.ModuleType(name) # dummy module (cannot reload)
|
|
1119
|
+
module.__file__ = "<scratch>"
|
|
1120
|
+
## sys.modules[name] = module
|
|
1121
|
+
|
|
1122
|
+
## Register dummy plug; Add module.Plugin <Layer>.
|
|
1123
|
+
if not hasattr(module, 'Plugin'):
|
|
1124
|
+
if inspect.isclass(root):
|
|
1125
|
+
_register__dummy_plug__(root, module)
|
|
1126
|
+
module.__dummy_plug__ = root
|
|
1127
|
+
else:
|
|
1128
|
+
if hasattr(module, '__dummy_plug__'):
|
|
1129
|
+
cls = module.__dummy_plug__ # old class (imported)
|
|
1130
|
+
cls = getattr(module, cls.__name__) # new class (reloaded)
|
|
1131
|
+
_register__dummy_plug__(cls, module)
|
|
1132
|
+
module.__dummy_plug__ = cls
|
|
1143
1133
|
|
|
1144
1134
|
## Note: name (module.__name__) != Plugin.__module__ if module is a package.
|
|
1145
1135
|
try:
|
|
@@ -1169,8 +1159,8 @@ class Frame(mwx.Frame):
|
|
|
1169
1159
|
show = show or pane.IsShown()
|
|
1170
1160
|
props.update(
|
|
1171
1161
|
dock_direction = pane.IsDocked() and pane.dock_direction,
|
|
1172
|
-
floating_pos = floating_pos or pane.floating_pos[:],
|
|
1173
|
-
floating_size = floating_size or pane.floating_size[:],
|
|
1162
|
+
floating_pos = floating_pos or pane.floating_pos[:], # copy unloading pane
|
|
1163
|
+
floating_size = floating_size or pane.floating_size[:], # copy unloading pane
|
|
1174
1164
|
)
|
|
1175
1165
|
self.unload_plug(name)
|
|
1176
1166
|
|
|
@@ -1295,11 +1285,17 @@ class Frame(mwx.Frame):
|
|
|
1295
1285
|
|
|
1296
1286
|
session = {}
|
|
1297
1287
|
try:
|
|
1298
|
-
print("Reloading {}..."
|
|
1288
|
+
print(f"Reloading {plug}...")
|
|
1299
1289
|
plug.save_session(session)
|
|
1300
1290
|
except Exception:
|
|
1301
1291
|
traceback.print_exc() # Failed to save the plug session.
|
|
1292
|
+
|
|
1302
1293
|
self.load_plug(plug.__module__, force=1, session=session)
|
|
1294
|
+
|
|
1295
|
+
## Update shell.target --> new plug
|
|
1296
|
+
for shell in self.shellframe.get_all_shells():
|
|
1297
|
+
if shell.target is plug:
|
|
1298
|
+
shell.handler('shell_activated', shell)
|
|
1303
1299
|
|
|
1304
1300
|
def inspect_plug(self, name):
|
|
1305
1301
|
"""Dive into the process to inspect plugs in the shell."""
|
|
@@ -1309,6 +1305,7 @@ class Frame(mwx.Frame):
|
|
|
1309
1305
|
return
|
|
1310
1306
|
|
|
1311
1307
|
shell = self.shellframe.clone_shell(plug)
|
|
1308
|
+
name = plug.Name # init(shell) で名前を参照するため再定義する
|
|
1312
1309
|
|
|
1313
1310
|
@shell.handler.bind("shell_activated")
|
|
1314
1311
|
def init(shell):
|
|
@@ -1355,7 +1352,7 @@ class Frame(mwx.Frame):
|
|
|
1355
1352
|
|
|
1356
1353
|
if not filename:
|
|
1357
1354
|
default_path = view.frame.pathname if view.frame else None
|
|
1358
|
-
with wx.FileDialog(self, "Select index file to
|
|
1355
|
+
with wx.FileDialog(self, "Select index file to load",
|
|
1359
1356
|
defaultDir=os.path.dirname(default_path or ''),
|
|
1360
1357
|
defaultFile=self.ATTRIBUTESFILE,
|
|
1361
1358
|
wildcard="Index (*.index)|*.index|"
|
|
@@ -1758,7 +1755,10 @@ class Frame(mwx.Frame):
|
|
|
1758
1755
|
|
|
1759
1756
|
for name, module in self.plugins.items():
|
|
1760
1757
|
plug = self.get_plug(name)
|
|
1761
|
-
name = module.__file__ # Replace the name with full
|
|
1758
|
+
name = module.__file__ # Replace the name with full-path.
|
|
1759
|
+
if not plug or not os.path.exists(name):
|
|
1760
|
+
print(f"Skipping dummy plugin {name!r}...")
|
|
1761
|
+
continue
|
|
1762
1762
|
if hasattr(module, '__path__'): # is the module a package?
|
|
1763
1763
|
name = os.path.dirname(name)
|
|
1764
1764
|
session = {}
|
|
@@ -1766,7 +1766,7 @@ class Frame(mwx.Frame):
|
|
|
1766
1766
|
plug.save_session(session)
|
|
1767
1767
|
except Exception:
|
|
1768
1768
|
traceback.print_exc() # Failed to save the plug session.
|
|
1769
|
-
o.write("self.load_plug({!r}, session={})\n".format(name, session
|
|
1769
|
+
o.write("self.load_plug({!r}, session={})\n".format(name, session))
|
|
1770
1770
|
o.write("self._mgr.LoadPerspective({!r})\n".format(self._mgr.SavePerspective()))
|
|
1771
1771
|
|
|
1772
1772
|
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
|
-
|
|
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
|
|
328
|
+
return None
|
|
328
329
|
|
|
329
330
|
@roi.setter
|
|
330
331
|
def roi(self, v):
|
|
331
|
-
self.
|
|
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.
|
|
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
|
|
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
|
|
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
|
|
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.
|
|
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.
|
|
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)
|
mwx/plugins/ffmpeg_view.py
CHANGED
|
@@ -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
|
|
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
|
|
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.
|
|
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 {}*"
|
|
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.
|
|
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()
|
|
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 {}*"
|
|
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"
|
|
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,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=
|
|
5
|
-
mwx/graphman.py,sha256=
|
|
4
|
+
mwx/framework.py,sha256=J6f1PekG4O0fwH5n4aNnR6qvXV6FAgmA0QOIEE8PCvY,77463
|
|
5
|
+
mwx/graphman.py,sha256=SL0msdXDqbw2GswBbspFa916z2fJbHYTDph9vcRP1yU,69917
|
|
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=
|
|
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=
|
|
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=
|
|
20
|
-
mwx/plugins/fft_view.py,sha256=
|
|
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.
|
|
26
|
-
mwxlib-1.
|
|
27
|
-
mwxlib-1.
|
|
28
|
-
mwxlib-1.
|
|
25
|
+
mwxlib-1.6.3.dist-info/METADATA,sha256=QbzAtx8OsYdp8LIL8pvOgmh_qgGAIxGLtGsdKuOj-9w,7381
|
|
26
|
+
mwxlib-1.6.3.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
27
|
+
mwxlib-1.6.3.dist-info/top_level.txt,sha256=SI1Mh118AstnUFGPNq5aMNKiAnVNmZk1S9Ij-OwAEpY,4
|
|
28
|
+
mwxlib-1.6.3.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|