Data wrapper for result object
This commit is contained in:
parent
603d4fedb0
commit
36fdd32011
@ -47,7 +47,7 @@ class MainFrame (wx.Frame):
|
|||||||
bSizer3 = wx.BoxSizer(wx.HORIZONTAL)
|
bSizer3 = wx.BoxSizer(wx.HORIZONTAL)
|
||||||
|
|
||||||
self.m_specs = wx.TreeCtrl(self, style = wx.TR_DEFAULT_STYLE)
|
self.m_specs = wx.TreeCtrl(self, style = wx.TR_DEFAULT_STYLE)
|
||||||
self.m_specs.SetMinSize(wx.Size(150,-1))
|
self.m_specs.SetMinSize(wx.Size(200,-1))
|
||||||
|
|
||||||
bSizer3.Add(self.m_specs, 0, wx.ALL|wx.EXPAND, 1)
|
bSizer3.Add(self.m_specs, 0, wx.ALL|wx.EXPAND, 1)
|
||||||
|
|
||||||
@ -56,25 +56,32 @@ class MainFrame (wx.Frame):
|
|||||||
self.m_user_models = TreeListCtrl(self,
|
self.m_user_models = TreeListCtrl(self,
|
||||||
style = wx.TR_DEFAULT_STYLE | wx.TR_HIDE_ROOT
|
style = wx.TR_DEFAULT_STYLE | wx.TR_HIDE_ROOT
|
||||||
| wx.TR_EDIT_LABELS | wx.TR_ROW_LINES | wx.TR_MULTIPLE)
|
| wx.TR_EDIT_LABELS | wx.TR_ROW_LINES | wx.TR_MULTIPLE)
|
||||||
self.m_user_models.SetMinSize(wx.Size(-1, 200))
|
self.m_user_models.SetMinSize(wx.Size(-1, 300))
|
||||||
self.m_user_models.AddColumn("Model name")
|
self.m_user_models.AddColumn("Model name")
|
||||||
self.m_user_models.AddColumn("Status")
|
self.m_user_models.AddColumn("Status")
|
||||||
self.m_user_models.AddColumn("Progress")
|
self.m_user_models.AddColumn("Progress")
|
||||||
self.m_user_models.AddColumn("Comment")
|
self.m_user_models.AddColumn("Comment")
|
||||||
|
|
||||||
bSizer4.Add(self.m_user_models, 0, wx.ALL|wx.EXPAND, 1)
|
bSizer4.Add(self.m_user_models, 0, wx.ALL | wx.EXPAND, 1)
|
||||||
|
|
||||||
# WARNING: wxPython code generation isn't supported for this widget yet.
|
# WARNING: wxPython code generation isn't supported for this widget yet.
|
||||||
self.m_params = wxpg.PropertyGridManager(self)
|
self.m_params = wxpg.PropertyGridManager(self)
|
||||||
self.m_params.AddPage('fp')
|
self.m_params.AddPage('fp')
|
||||||
bSizer4.Add(self.m_params, 1, wx.EXPAND |wx.ALL, 1)
|
bSizer4.Add(self.m_params, 1, wx.EXPAND | wx.ALL, 1)
|
||||||
|
|
||||||
bSizer3.Add(bSizer4, 1, wx.EXPAND, 5)
|
bSizer3.Add(bSizer4, 1, wx.EXPAND, 5)
|
||||||
|
|
||||||
self.m_job_list = wx.ListBox(self)#, style = wx.LC_LIST)
|
bSizer5 = wx.BoxSizer(wx.VERTICAL)
|
||||||
self.m_job_list.SetMinSize(wx.Size(200,-1))
|
|
||||||
|
|
||||||
bSizer3.Add(self.m_job_list, 0, wx.ALL|wx.EXPAND, 1)
|
self.m_quick_result = wxpg.PropertyGridManager(self)
|
||||||
|
self.m_quick_result.AddPage('fp')
|
||||||
|
self.m_quick_result.SetMinSize(wx.Size(200, -1))
|
||||||
|
bSizer5.Add(self.m_quick_result, 1, wx.EXPAND | wx.ALL, 1)
|
||||||
|
|
||||||
|
self.m_plots = wx.TreeCtrl(self, style = wx.TR_DEFAULT_STYLE | wx.TR_HIDE_ROOT)
|
||||||
|
bSizer5.Add(self.m_plots, 1, wx.EXPAND | wx.ALL, 1)
|
||||||
|
|
||||||
|
bSizer3.Add(bSizer5, 0, wx.ALL | wx.EXPAND, 1)
|
||||||
|
|
||||||
sbar = wx.StatusBar(self)
|
sbar = wx.StatusBar(self)
|
||||||
self.SetStatusBar(sbar)
|
self.SetStatusBar(sbar)
|
||||||
@ -130,7 +137,8 @@ class MainFrame (wx.Frame):
|
|||||||
|
|
||||||
class ResultFrame(wx.Frame):
|
class ResultFrame(wx.Frame):
|
||||||
def __init__(self, parent, title):
|
def __init__(self, parent, title):
|
||||||
wx.Frame.__init__ (self, parent, -1, title, size = wx.Size(600, 400))
|
wx.Frame.__init__ (self, parent, -1, title, size = wx.Size(500, 500),
|
||||||
|
style = wx.DEFAULT_FRAME_STYLE)
|
||||||
|
|
||||||
sizer = wx.BoxSizer(wx.VERTICAL)
|
sizer = wx.BoxSizer(wx.VERTICAL)
|
||||||
|
|
||||||
@ -140,8 +148,8 @@ class ResultFrame(wx.Frame):
|
|||||||
self.table = wx.grid.Grid(self)
|
self.table = wx.grid.Grid(self)
|
||||||
self.table.SetDefaultCellAlignment(wx.ALIGN_CENTER, wx.ALIGN_CENTER)
|
self.table.SetDefaultCellAlignment(wx.ALIGN_CENTER, wx.ALIGN_CENTER)
|
||||||
|
|
||||||
sizer.Add(self.scalar, 0, wx.EXPAND |wx.ALL, 1)
|
sizer.Add(self.scalar, 0, wx.EXPAND | wx.ALL, 1)
|
||||||
sizer.Add(self.table, 1, wx.EXPAND |wx.ALL, 1)
|
sizer.Add(self.table, 1, wx.EXPAND | wx.ALL, 1)
|
||||||
|
|
||||||
self.SetSizer(sizer)
|
self.SetSizer(sizer)
|
||||||
self.Layout()
|
self.Layout()
|
||||||
|
@ -65,6 +65,11 @@ class MainFrame(forms.MainFrame):
|
|||||||
self.OnParamChanging)
|
self.OnParamChanging)
|
||||||
self.m_params.Bind(wxpg.EVT_PG_CHANGED,
|
self.m_params.Bind(wxpg.EVT_PG_CHANGED,
|
||||||
self.OnParamChanged)
|
self.OnParamChanged)
|
||||||
|
self.m_specs.Bind(wx.EVT_TREE_ITEM_ACTIVATED,
|
||||||
|
self.OnAddModelToSelected)
|
||||||
|
self.m_user_models.Bind(wx.EVT_TREE_ITEM_ACTIVATED,
|
||||||
|
self.OnModelProcess)
|
||||||
|
|
||||||
|
|
||||||
self.Bind(wx.EVT_MENU, self.OnTest,
|
self.Bind(wx.EVT_MENU, self.OnTest,
|
||||||
id = forms.ID_TEST)
|
id = forms.ID_TEST)
|
||||||
@ -136,9 +141,15 @@ class MainFrame(forms.MainFrame):
|
|||||||
p = 'Unknown' if percent < 0 else '{:%}'.format(percent)
|
p = 'Unknown' if percent < 0 else '{:%}'.format(percent)
|
||||||
um.SetItemText(item, p, 2)
|
um.SetItemText(item, p, 2)
|
||||||
um.SetItemText(item, comment, 3)
|
um.SetItemText(item, comment, 3)
|
||||||
print jid, (state, percent, comment)
|
print 'JID', jid, (state, percent, comment)
|
||||||
|
# завершающие действия по окончанию выполнения работы
|
||||||
if state == server.JOB_COMPLETED:
|
if state == server.JOB_COMPLETED:
|
||||||
|
# получаем результаты выполнения
|
||||||
data.res = self.server.GetJobResult(jid)
|
data.res = self.server.GetJobResult(jid)
|
||||||
|
# если завершившаяся задача в данный момент выделена
|
||||||
|
# то сразу же показываем этот результат
|
||||||
|
if um.IsSelected(item):
|
||||||
|
self.ShowQuickResult(data.res)
|
||||||
|
|
||||||
wx.MutexGuiLeave()
|
wx.MutexGuiLeave()
|
||||||
time.sleep(0.1)
|
time.sleep(0.1)
|
||||||
@ -238,13 +249,13 @@ class MainFrame(forms.MainFrame):
|
|||||||
Смотри руководство пользователя для того, чтобы получить полную
|
Смотри руководство пользователя для того, чтобы получить полную
|
||||||
информацию о всех типах данных, используемых в Opal.
|
информацию о всех типах данных, используемых в Opal.
|
||||||
"""
|
"""
|
||||||
if param_type == 'bool':
|
if param_type == 'bool' or param_type == 'boolean':
|
||||||
return wxpg.BoolProperty
|
return wxpg.BoolProperty
|
||||||
elif param_type == 'int':
|
elif param_type == 'int':
|
||||||
return wxpg.IntProperty
|
return wxpg.IntProperty
|
||||||
elif param_type == 'float' or param_type == 'double':
|
elif param_type == 'float' or param_type == 'double':
|
||||||
return wxpg.FloatProperty
|
return wxpg.FloatProperty
|
||||||
elif param_type == 'string':
|
elif param_type == 'str' or param_type == 'string':
|
||||||
return wxpg.StringProperty
|
return wxpg.StringProperty
|
||||||
elif param_type == 'list':
|
elif param_type == 'list':
|
||||||
return wxpg.ArrayStringProperty
|
return wxpg.ArrayStringProperty
|
||||||
@ -257,7 +268,7 @@ class MainFrame(forms.MainFrame):
|
|||||||
pg.ClearPage(0)
|
pg.ClearPage(0)
|
||||||
for label, value in model_def.params.iteritems():
|
for label, value in model_def.params.iteritems():
|
||||||
param = model_def.DD[label]
|
param = model_def.DD[label]
|
||||||
title = param.GetTitle() or label
|
title = param.GetTitle()
|
||||||
prop = SelectProperty(param.GetType())
|
prop = SelectProperty(param.GetType())
|
||||||
pid = pg.Append(prop(title, value = value))
|
pid = pg.Append(prop(title, value = value))
|
||||||
pg.SetPropertyClientData(pid, label)
|
pg.SetPropertyClientData(pid, label)
|
||||||
@ -265,6 +276,15 @@ class MainFrame(forms.MainFrame):
|
|||||||
|
|
||||||
self.SetStatusText(model_def.PackParams(), 0)
|
self.SetStatusText(model_def.PackParams(), 0)
|
||||||
|
|
||||||
|
def ShowQuickResult(self, result):
|
||||||
|
if not result:
|
||||||
|
return
|
||||||
|
pg = self.m_quick_result
|
||||||
|
pg.ClearPage(0)
|
||||||
|
for label, param in result.data.iteritems():
|
||||||
|
pg.Append(wxpg.StringProperty(label, value = str(param.GetValue())))
|
||||||
|
pg.SetSplitterLeft()
|
||||||
|
|
||||||
def GetSelectedItem(self, source):
|
def GetSelectedItem(self, source):
|
||||||
item = source.GetSelection()
|
item = source.GetSelection()
|
||||||
if not item.IsOk():
|
if not item.IsOk():
|
||||||
@ -291,6 +311,7 @@ class MainFrame(forms.MainFrame):
|
|||||||
data = self.m_user_models.GetPyData(item)
|
data = self.m_user_models.GetPyData(item)
|
||||||
if data:
|
if data:
|
||||||
self.SelectUserModel(data.mdef)
|
self.SelectUserModel(data.mdef)
|
||||||
|
self.ShowQuickResult(data.res)
|
||||||
|
|
||||||
def OnParamChanging(self, event):
|
def OnParamChanging(self, event):
|
||||||
#value = event.GetValue()
|
#value = event.GetValue()
|
||||||
@ -389,27 +410,26 @@ class ResultFrame(forms.ResultFrame):
|
|||||||
def UpdateResults(self):
|
def UpdateResults(self):
|
||||||
self.scalar.ClearPage(0)
|
self.scalar.ClearPage(0)
|
||||||
self.table.ClearGrid()
|
self.table.ClearGrid()
|
||||||
if self.result:
|
if not self.result:
|
||||||
table = self.result.get('table', [])
|
return
|
||||||
if table and len(table):
|
|
||||||
cols = len(table[0])
|
cols = len(self.result.columns)
|
||||||
rows = len(table) - 1
|
rows = len(self.result.rows)
|
||||||
self.table.CreateGrid(rows, cols)
|
self.table.CreateGrid(rows, cols)
|
||||||
#
|
#
|
||||||
for i, col in enumerate(table[0]):
|
for i, col in enumerate(self.result.columns):
|
||||||
label = "{} ({})".format(col[0], col[1])
|
label = "{} ({} {})".format(col.GetTitle(), col.GetType(), col.GetLabel())
|
||||||
self.table.SetColLabelValue(i, label)
|
self.table.SetColLabelValue(i, label)
|
||||||
#
|
#
|
||||||
for ri, row in enumerate(table[1:]):
|
for i, row in enumerate(self.result.rows):
|
||||||
for ci, value in enumerate(row):
|
for j, value in enumerate(row):
|
||||||
self.table.SetCellValue(ri, ci, str(value))
|
self.table.SetCellValue(i, j, str(value))
|
||||||
|
|
||||||
self.table.AutoSize()
|
self.table.AutoSize()
|
||||||
|
|
||||||
data = self.result.get('data', {})
|
|
||||||
pg = self.scalar
|
pg = self.scalar
|
||||||
for label, value in data.iteritems():
|
for label, param in self.result.data.iteritems():
|
||||||
pid = pg.Append(wxpg.StringProperty(label, value = str(value)))
|
pg.Append(wxpg.StringProperty(label, value = str(param.GetValue())))
|
||||||
|
|
||||||
#-----------------------------------------------------------------------------
|
#-----------------------------------------------------------------------------
|
||||||
# Приложение
|
# Приложение
|
||||||
|
@ -246,7 +246,7 @@ class Worker(threading.Thread):
|
|||||||
# в ответе пришел результат вычислений
|
# в ответе пришел результат вычислений
|
||||||
# помещаем в секцию результата
|
# помещаем в секцию результата
|
||||||
elif ans == 'result':
|
elif ans == 'result':
|
||||||
job.result = data['result']
|
job.result = task.ResultData(data['result'])
|
||||||
# произошла ошибка
|
# произошла ошибка
|
||||||
elif ans == 'error':
|
elif ans == 'error':
|
||||||
WriteToLog('Error! ' + msg)
|
WriteToLog('Error! ' + msg)
|
||||||
|
@ -17,14 +17,18 @@ import json
|
|||||||
#-------------------------------------------------------------------------------
|
#-------------------------------------------------------------------------------
|
||||||
|
|
||||||
class Parameter:
|
class Parameter:
|
||||||
def __init__(self, data):
|
def __init__(self, label, data):
|
||||||
self.data = data
|
self.data = data
|
||||||
|
self.data['label'] = label
|
||||||
|
|
||||||
|
def GetLabel(self):
|
||||||
|
return self.data['label']
|
||||||
|
|
||||||
def GetType(self):
|
def GetType(self):
|
||||||
return self.data['type']
|
return self.data['type']
|
||||||
|
|
||||||
def GetTitle(self):
|
def GetTitle(self):
|
||||||
return self.data.get('title', '')
|
return self.data.get('title', self.GetLabel())
|
||||||
|
|
||||||
def GetComment(self):
|
def GetComment(self):
|
||||||
return self.data.get('comment', '')
|
return self.data.get('comment', '')
|
||||||
@ -38,6 +42,34 @@ class Parameter:
|
|||||||
def Test(self, value):
|
def Test(self, value):
|
||||||
return True
|
return True
|
||||||
|
|
||||||
|
class Value(Parameter):
|
||||||
|
def __init__(self, label, value):
|
||||||
|
if isinstance(value, dict):
|
||||||
|
self.data = value
|
||||||
|
else:
|
||||||
|
self.data = {
|
||||||
|
'value': value,
|
||||||
|
'type': value.__class__.__name__
|
||||||
|
}
|
||||||
|
self.data['label'] = label
|
||||||
|
|
||||||
|
def GetType(self):
|
||||||
|
return self.data.get('type', 'unknown')
|
||||||
|
|
||||||
|
def GetValue(self):
|
||||||
|
return self.data['value']
|
||||||
|
|
||||||
|
class Column(Parameter):
|
||||||
|
def __init__(self, colvalues):
|
||||||
|
self.data = {}
|
||||||
|
# следующие два поля должны обязательно присутствовать
|
||||||
|
self.data['label'] = colvalues[0]
|
||||||
|
self.data['type'] = colvalues[1]
|
||||||
|
try:
|
||||||
|
self.data['title'] = colvalues[2]
|
||||||
|
except:
|
||||||
|
pass
|
||||||
|
|
||||||
#-------------------------------------------------------------------------------
|
#-------------------------------------------------------------------------------
|
||||||
|
|
||||||
class DataDescription:
|
class DataDescription:
|
||||||
@ -51,7 +83,7 @@ class DataDescription:
|
|||||||
self.pdata = self.data.get('params', {})
|
self.pdata = self.data.get('params', {})
|
||||||
# заменяем текстовое описание на объект-параметр
|
# заменяем текстовое описание на объект-параметр
|
||||||
for label in self.pdata:
|
for label in self.pdata:
|
||||||
par = Parameter(self.pdata[label])
|
par = Parameter(label, self.pdata[label])
|
||||||
self.pdata[label] = par
|
self.pdata[label] = par
|
||||||
|
|
||||||
self.specs = []
|
self.specs = []
|
||||||
@ -129,7 +161,23 @@ class DataDefinition:
|
|||||||
|
|
||||||
class ResultData:
|
class ResultData:
|
||||||
def __init__(self, data):
|
def __init__(self, data):
|
||||||
self.data = data
|
self.data = {}
|
||||||
|
for key, value in data.get('data', {}).iteritems():
|
||||||
|
self.data[key] = Value(key, value)
|
||||||
|
|
||||||
|
table = data.get('table', [])
|
||||||
|
self.head = {}
|
||||||
|
self.table = []
|
||||||
|
if table:
|
||||||
|
self.head = [ Column(item) for item in table[0] ]
|
||||||
|
self.table = table[1:]
|
||||||
|
|
||||||
def GetColumns(self):
|
def GetColumns(self):
|
||||||
pass
|
return self.head
|
||||||
|
|
||||||
|
columns = property(GetColumns)
|
||||||
|
|
||||||
|
def GetRows(self):
|
||||||
|
return self.table
|
||||||
|
|
||||||
|
rows = property(GetRows)
|
||||||
|
@ -11,13 +11,13 @@
|
|||||||
"author": "Anton Vakhrushev",
|
"author": "Anton Vakhrushev",
|
||||||
"date": "2012-03-08",
|
"date": "2012-03-08",
|
||||||
|
|
||||||
"exec": true,
|
"exec": false,
|
||||||
|
|
||||||
"params": {
|
"params": {
|
||||||
|
|
||||||
"r": {
|
"r": {
|
||||||
"type": "float",
|
"type": "float",
|
||||||
"default": 6.28,
|
"default": 6.283185307,
|
||||||
"title": "Right edge",
|
"title": "Right edge",
|
||||||
"comment": "Right edge"
|
"comment": "Right edge"
|
||||||
},
|
},
|
||||||
|
@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
# Тестовое приложение для проекта Opal
|
# Тестовое приложение для проекта Opal
|
||||||
# Вычисление значений синуса по формулам Тейлора
|
# Вычисление значений синуса по формулам Тейлора
|
||||||
# Вычисляет значения для указанного диапазона с заданной точностью
|
# Вычисляет значения для указанного диапазона
|
||||||
# и нужным количеством шагов
|
# с заданной точностью и нужным количеством шагов
|
||||||
|
|
||||||
import sys
|
import sys
|
||||||
import json
|
import json
|
||||||
@ -48,7 +48,7 @@ def result(s, t):
|
|||||||
}})
|
}})
|
||||||
|
|
||||||
def serie(n, d, h, l = 0):
|
def serie(n, d, h, l = 0):
|
||||||
for i in xrange(n):
|
for i in xrange(n + 1):
|
||||||
y = sin_taylor(l, d)
|
y = sin_taylor(l, d)
|
||||||
yield (l, y)
|
yield (l, y)
|
||||||
l += h
|
l += h
|
||||||
@ -87,17 +87,17 @@ def main():
|
|||||||
[[ ['x', 'double'], [ 'y', 'double' ] ]] + res))
|
[[ ['x', 'double'], [ 'y', 'double' ] ]] + res))
|
||||||
|
|
||||||
elif label == 'left':
|
elif label == 'left':
|
||||||
for x, y in serie(n-1, d, h):
|
for x, y in serie(n - 1, d, h):
|
||||||
s = y * h
|
s = y * h
|
||||||
res.append([x, y, s])
|
res.append([x, y, s])
|
||||||
write(answer(x / r, label))
|
write(answer(x / r, label))
|
||||||
sum += s
|
sum += s
|
||||||
write(result(
|
write(result(
|
||||||
{ 'sum': sum },
|
{ 'sum': sum },
|
||||||
[[ ['x', 'double'], [ 'y', 'double' ], [ 's', 'double' ] ]] + res))
|
[[ ['x', 'double'], [ 'y', 'double' ], [ 's', 'double', 'Delta sum' ] ]] + res))
|
||||||
|
|
||||||
elif label == 'right':
|
elif label == 'right':
|
||||||
for x, y in serie(n-1, d, h, h):
|
for x, y in serie(n - 1, d, h, h):
|
||||||
s = y * h
|
s = y * h
|
||||||
res.append([x, y, s])
|
res.append([x, y, s])
|
||||||
write(answer(x / r, label))
|
write(answer(x / r, label))
|
||||||
@ -108,7 +108,7 @@ def main():
|
|||||||
|
|
||||||
elif label == 'trapezium':
|
elif label == 'trapezium':
|
||||||
prev = 0
|
prev = 0
|
||||||
for x, y in serie(n + 1, d, h):
|
for x, y in serie(n, d, h):
|
||||||
s = 0.5 * (y + prev) * h
|
s = 0.5 * (y + prev) * h
|
||||||
res.append([x, y, s])
|
res.append([x, y, s])
|
||||||
write(answer(x / r, label))
|
write(answer(x / r, label))
|
||||||
|
Loading…
Reference in New Issue
Block a user