Repository navigation
Expand file tree
/
Copy pathexaplot.py
More file actions
233 lines (186 loc) · 7.29 KB
/
Copy pathexaplot.py
File metadata and controls
233 lines (186 loc) · 7.29 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
from numbers import Real
from os import PathLike
from typing import Callable
from _exaplot import ( # type: ignore
RunParam,
init,
stop,
msg,
datafile as _datafile,
plot as _plot,
_Interrupt,
_set_plot_property,
_get_plot_property,
_show_plot,
)
def breakpoint():
if stop():
raise _Interrupt
def datafile(**kwargs):
if (
(path := kwargs.get("path"))
and not (isinstance(path, PathLike) or isinstance(path, Callable))
):
raise TypeError("'path' argument must be type 'PathLike' or 'Callable'")
return _datafile(**kwargs)
class PlotProperties:
class _Property:
def __init_subclass__(cls, /, **kwargs):
for p, t in kwargs.items():
def getter(self: 'PlotProperties._Property', p=p):
return _get_plot_property(self._n, f"{self._id}.{p}")
def setter(self: 'PlotProperties._Property', value, p=p, t=t):
if not isinstance(value, t):
raise TypeError(f"{self._id}.{p} must be type '{t.__name__}'")
_set_plot_property(self._n, f"{self._id}.{p}", value)
prop = property(fget=getter, fset=setter)
setattr(cls, p, prop)
def __init__(self, n: int, id: str):
self._n = n
self._id = id
class MinSize(_Property, w=int, h=int):
def __repr__(self):
return f"{self.w, self.h}"
class Range(_Property, min=Real, max=Real):
def __repr__(self):
return f"{self.min, self.max}"
class Line(_Property, type=str, color=str, style=str):
def __repr__(self):
return f"{self.type, self.color, self.style}"
class Points(_Property, shape=str, color=str, size=float):
def __repr__(self):
return f"{self.shape, self.color, self.size}"
class DataSize(_Property, x=int, y=int):
def __repr__(self):
return f"{self.x, self.y}"
class Color(_Property, min=str, max=str):
def __repr__(self):
return f"{self.min, self.max}"
class _Tab(_Property):
def show(self):
plot_type = {
"two_dimen": 0,
"color_map": 1,
}[self._id]
_show_plot(self._n, plot_type)
@property
def x_range(self):
return PlotProperties.Range(self._n, f"{self._id}.x_range")
@x_range.setter
def x_range(self, value: tuple[int, int]):
if not isinstance(value, tuple) or len(value) != 2:
raise TypeError(f"{self._id}.x_range value must be type 'tuple[int, int]'")
self.x_range.min = value[0]
self.x_range.max = value[1]
@property
def y_range(self):
return PlotProperties.Range(self._n, f"{self._id}.y_range")
@y_range.setter
def y_range(self, value: tuple[int, int]):
if not isinstance(value, tuple) or len(value) != 2:
raise TypeError(f"{self._id}.y_range value must be type 'tuple[int, int]'")
self.y_range.min = value[0]
self.y_range.max = value[1]
class TwoDimen(_Tab, autorescale_axes=bool):
@property
def line(self):
return PlotProperties.Line(self._n, f"{self._id}.line")
@line.setter
def line(self, value: tuple[str, str, str]):
if not isinstance(value, tuple) or len(value) != 3:
raise TypeError(f"{self._id}.line value must be type 'tuple[str, str, str]'")
self.line.type = value[0]
self.line.color = value[1]
self.line.style = value[2]
@property
def points(self):
return PlotProperties.Points(self._n, f"{self._id}.points")
@points.setter
def points(self, value: tuple[str, str, float]):
if not isinstance(value, tuple) or len(value) != 3:
raise TypeError(f"{self._id}.points value must be type 'tuple[str, str, float]'")
self.points.shape = value[0]
self.points.color = value[1]
self.points.size = value[2]
class ColorMap(_Tab, autorescale_axes=bool, autorescale_data=bool):
@property
def z_range(self):
return PlotProperties.Range(self._n, f"{self._id}.z_range")
@z_range.setter
def z_range(self, value: tuple[int, int]):
if not isinstance(value, tuple) or len(value) != 2:
raise TypeError(f"{self._id}.z_range value must be type 'tuple[int, int]'")
self.z_range.min = value[0]
self.z_range.max = value[1]
@property
def data_size(self):
return PlotProperties.DataSize(self._n, f"{self._id}.data_size")
@data_size.setter
def data_size(self, value: tuple[int, int]):
if not isinstance(value, tuple) or len(value) != 2:
raise TypeError(f"{self._id}.data_size value must be type 'tuple[int, int]'")
self.data_size.x = value[0]
self.data_size.y = value[1]
@property
def color(self):
return PlotProperties.Color(self._n, f"{self._id}.color")
@color.setter
def color(self, value: tuple[str, str]):
if not isinstance(value, tuple) or len(value) != 2:
raise TypeError(f"{self._id}.color value must be type 'tuple[str, str]'")
self.color.min = value[0]
self.color.max = value[1]
class Plot:
def __init__(self, n: int):
self._n = n
def __call__(self, *args, **kwargs):
return _plot(self._n, *args, **kwargs)
@property
def title(self):
return _get_plot_property(self._n, "title")
@title.setter
def title(self, value: str):
if not isinstance(value, str):
raise TypeError("title must be type 'str'")
_set_plot_property(self._n, "title", value)
@property
def x_axis(self):
return _get_plot_property(self._n, "x_axis")
@x_axis.setter
def x_axis(self, value: str):
if not isinstance(value, str):
raise TypeError("x_axis must be type 'str'")
_set_plot_property(self._n, "x_axis", value)
@property
def y_axis(self):
return _get_plot_property(self._n, "y_axis")
@y_axis.setter
def y_axis(self, value: str):
if not isinstance(value, str):
raise TypeError("y_axis must be type 'str'")
_set_plot_property(self._n, "y_axis", value)
@property
def min_size(self):
return PlotProperties.MinSize(self._n, "min_size")
@min_size.setter
def min_size(self, value: tuple[int, int]):
if not isinstance(value, tuple) or len(value) != 2:
raise TypeError("min_size value must be type 'tuple[int, int]'")
self.min_size.w = value[0]
self.min_size.h = value[1]
@property
def two_dimen(self):
return PlotProperties.TwoDimen(self._n, "two_dimen")
@property
def color_map(self):
return PlotProperties.ColorMap(self._n, "color_map")
class _Plots:
def __init__(self):
self._plots: dict[int, Plot] = {1: Plot(1)}
def __getitem__(self, index: int):
try:
return self._plots[index]
except KeyError:
self._plots[index] = Plot(index)
return self._plots[index]
plot = _Plots()