code review
This commit is contained in:
		@@ -120,7 +120,6 @@ class MainFrame (wx.Frame):
 | 
				
			|||||||
        self.Layout()
 | 
					        self.Layout()
 | 
				
			||||||
        self.Centre(wx.BOTH)
 | 
					        self.Centre(wx.BOTH)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 | 
				
			||||||
    def LoadIcons(self):
 | 
					    def LoadIcons(self):
 | 
				
			||||||
        icons = Icons()
 | 
					        icons = Icons()
 | 
				
			||||||
        ilist = wx.ImageList(16, 16)
 | 
					        ilist = wx.ImageList(16, 16)
 | 
				
			||||||
@@ -143,7 +142,7 @@ class MainFrame (wx.Frame):
 | 
				
			|||||||
        menu.Append(ID_NEW, "&New\tCtrl+N")
 | 
					        menu.Append(ID_NEW, "&New\tCtrl+N")
 | 
				
			||||||
        menu.Append(ID_OPEN, "&Open\tCtrl+O")
 | 
					        menu.Append(ID_OPEN, "&Open\tCtrl+O")
 | 
				
			||||||
        menu.Append(ID_SAVE, "&Save\tCtrl+S")
 | 
					        menu.Append(ID_SAVE, "&Save\tCtrl+S")
 | 
				
			||||||
        menubar.Append(menu, '&Model')
 | 
					        menubar.Append(menu, '&Project')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        menu = wx.Menu()
 | 
					        menu = wx.Menu()
 | 
				
			||||||
        menu.Append(ID_ADD_MODEL_ROOT, 'Add model to root')
 | 
					        menu.Append(ID_ADD_MODEL_ROOT, 'Add model to root')
 | 
				
			||||||
@@ -154,7 +153,7 @@ class MainFrame (wx.Frame):
 | 
				
			|||||||
        menu.Append(ID_DELETE_MODEL, 'Delete\tCtrl+E')
 | 
					        menu.Append(ID_DELETE_MODEL, 'Delete\tCtrl+E')
 | 
				
			||||||
        menu.AppendSeparator()
 | 
					        menu.AppendSeparator()
 | 
				
			||||||
        menu.Append(ID_TEST, "&Test\tCtrl+T")
 | 
					        menu.Append(ID_TEST, "&Test\tCtrl+T")
 | 
				
			||||||
        menubar.Append(menu, '&Edit')
 | 
					        menubar.Append(menu, '&Model')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        menu = wx.Menu()
 | 
					        menu = wx.Menu()
 | 
				
			||||||
        menu.Append(ID_PROCESS_MODEL, 'Process\tF5')
 | 
					        menu.Append(ID_PROCESS_MODEL, 'Process\tF5')
 | 
				
			||||||
@@ -253,7 +252,6 @@ class LineSelectDialog(wx.Dialog):
 | 
				
			|||||||
        self.Layout()   
 | 
					        self.Layout()   
 | 
				
			||||||
        self.Centre(wx.BOTH)
 | 
					        self.Centre(wx.BOTH)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 | 
				
			||||||
class PlotFrame(wx.Frame):
 | 
					class PlotFrame(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(600, 400))
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										375
									
								
								trunk/opal.py
									
									
									
									
									
								
							
							
						
						
									
										375
									
								
								trunk/opal.py
									
									
									
									
									
								
							@@ -79,12 +79,11 @@ class MainFrame(forms.MainFrame):
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        s = server.LocalServer()
 | 
					        s = server.LocalServer()
 | 
				
			||||||
        s.LoadModels()
 | 
					        s.LoadModels()
 | 
				
			||||||
        models = s.GetModels()
 | 
					        self.models = s.GetModels()
 | 
				
			||||||
        self.models = models
 | 
					 | 
				
			||||||
        s.Start()
 | 
					        s.Start()
 | 
				
			||||||
        self.server = s
 | 
					        self.server = s
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        model = models[0]
 | 
					        # События компонентов
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        self.m_user_models.Bind(wx.EVT_TREE_SEL_CHANGED,
 | 
					        self.m_user_models.Bind(wx.EVT_TREE_SEL_CHANGED,
 | 
				
			||||||
            self.OnModelActivated)
 | 
					            self.OnModelActivated)
 | 
				
			||||||
@@ -100,7 +99,9 @@ class MainFrame(forms.MainFrame):
 | 
				
			|||||||
            self.OnPlotProcess)
 | 
					            self.OnPlotProcess)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        self.Bind(wx.EVT_MENU, self.OnNewModel,
 | 
					        # События меню
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        self.Bind(wx.EVT_MENU, self.OnNewProject,
 | 
				
			||||||
            id = forms.ID_NEW)
 | 
					            id = forms.ID_NEW)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        self.Bind(wx.EVT_MENU, self.OnTest,
 | 
					        self.Bind(wx.EVT_MENU, self.OnTest,
 | 
				
			||||||
@@ -130,6 +131,8 @@ class MainFrame(forms.MainFrame):
 | 
				
			|||||||
        self.Bind(wx.EVT_MENU, self.OnAddMarkers,
 | 
					        self.Bind(wx.EVT_MENU, self.OnAddMarkers,
 | 
				
			||||||
            id = forms.ID_ADD_MARKERS)
 | 
					            id = forms.ID_ADD_MARKERS)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        # События приложения
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        self.Bind(wx.EVT_CLOSE, self.OnClose)
 | 
					        self.Bind(wx.EVT_CLOSE, self.OnClose)
 | 
				
			||||||
        self.Bind(wx.EVT_IDLE, self.OnIdle)
 | 
					        self.Bind(wx.EVT_IDLE, self.OnIdle)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -145,13 +148,17 @@ class MainFrame(forms.MainFrame):
 | 
				
			|||||||
        ov.daemon = True
 | 
					        ov.daemon = True
 | 
				
			||||||
        ov.start()
 | 
					        ov.start()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        self.NewProject(model)
 | 
					        self.NewProject(self.models[0])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # Функции приложения и обработки сервера
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def OnClose(self, event):
 | 
					    def OnClose(self, event):
 | 
				
			||||||
        self.server.Stop()
 | 
					        self.server.Stop()
 | 
				
			||||||
        self.Destroy()
 | 
					        self.Destroy()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def OnIdle(self, event):
 | 
				
			||||||
 | 
					        pass
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def Overseer(self):
 | 
					    def Overseer(self):
 | 
				
			||||||
        """
 | 
					        """
 | 
				
			||||||
        Функция-надсмотрщик, которая периодически проверяет состояние
 | 
					        Функция-надсмотрщик, которая периодически проверяет состояние
 | 
				
			||||||
@@ -217,6 +224,67 @@ class MainFrame(forms.MainFrame):
 | 
				
			|||||||
        except Exception, e:
 | 
					        except Exception, e:
 | 
				
			||||||
            print 'Error in overseer: ', e
 | 
					            print 'Error in overseer: ', e
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # Функции создания модели, сохранения и загрузки
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def BuildSpecs(self, model):
 | 
				
			||||||
 | 
					        """
 | 
				
			||||||
 | 
					        Выстраивает иерархию спецификаций для выбранной модели
 | 
				
			||||||
 | 
					        """
 | 
				
			||||||
 | 
					        def DoItem(item, model):
 | 
				
			||||||
 | 
					            sp.SetPyData(item, model)
 | 
				
			||||||
 | 
					            for spec in model.GetSpecs():
 | 
				
			||||||
 | 
					                child = sp.AppendItem(item, spec.GetTitle())
 | 
				
			||||||
 | 
					                DoItem(child, spec)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        sp = self.m_specs
 | 
				
			||||||
 | 
					        sp.DeleteAllItems()
 | 
				
			||||||
 | 
					        root = sp.AddRoot(model.GetTitle())
 | 
				
			||||||
 | 
					        DoItem(root, model)
 | 
				
			||||||
 | 
					        sp.ExpandAll()
 | 
				
			||||||
 | 
					        sp.SortChildren(root)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def NewProject(self, model):
 | 
				
			||||||
 | 
					        """
 | 
				
			||||||
 | 
					        Начать новый проект:
 | 
				
			||||||
 | 
					        0. Очичтить все компоненты
 | 
				
			||||||
 | 
					        1. Построить дерево спецификаций
 | 
				
			||||||
 | 
					        2. Создать одну пользовательскую модель (по умолчанию)
 | 
				
			||||||
 | 
					        3. Сделать заготовки для графиков/отчетов/прочего
 | 
				
			||||||
 | 
					        """
 | 
				
			||||||
 | 
					        self.m_specs.DeleteAllItems()
 | 
				
			||||||
 | 
					        self.m_user_models.DeleteAllItems()
 | 
				
			||||||
 | 
					        self.m_params.ClearPage(0)
 | 
				
			||||||
 | 
					        self.m_quick_result.ClearPage(0)
 | 
				
			||||||
 | 
					        self.m_plots.DeleteAllItems()
 | 
				
			||||||
 | 
					        # Строим спецификации
 | 
				
			||||||
 | 
					        self.BuildSpecs(model)
 | 
				
			||||||
 | 
					        # Очищаем окно пользовательских моделей
 | 
				
			||||||
 | 
					        # и создаем там одну
 | 
				
			||||||
 | 
					        um = self.m_user_models
 | 
				
			||||||
 | 
					        um.DeleteAllItems()
 | 
				
			||||||
 | 
					        um.AddRoot('root')
 | 
				
			||||||
 | 
					        self.AddModelToRoot(model)
 | 
				
			||||||
 | 
					        # Создаем корневой элемент для окна с графиками
 | 
				
			||||||
 | 
					        self.m_plots.AddRoot('root')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        self.SetStatusText('Model "{}" selected'.format(model.GetTitle()), 0)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return True # Project(model)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def OnNewProject(self, event):
 | 
				
			||||||
 | 
					        self.do_nothing = True
 | 
				
			||||||
 | 
					        f = SelectModelDialog(self, self.models)
 | 
				
			||||||
 | 
					        if f.ShowModal() == wx.ID_OK:
 | 
				
			||||||
 | 
					            model = f.GetSelectedModel()
 | 
				
			||||||
 | 
					            if model:
 | 
				
			||||||
 | 
					                self.NewProject(model)
 | 
				
			||||||
 | 
					        self.do_nothing = False
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # Функции непосредственной работы с моделями:
 | 
				
			||||||
 | 
					    # создание, изменение, дублирование и прочее
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # Работа с именами моделей
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def CheckName(self, name):
 | 
					    def CheckName(self, name):
 | 
				
			||||||
        """
 | 
					        """
 | 
				
			||||||
        Проверяет имя на уникальность в иерархии пользовательских моделей.
 | 
					        Проверяет имя на уникальность в иерархии пользовательских моделей.
 | 
				
			||||||
@@ -242,22 +310,7 @@ class MainFrame(forms.MainFrame):
 | 
				
			|||||||
                return name
 | 
					                return name
 | 
				
			||||||
            self.name_id += 1
 | 
					            self.name_id += 1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def BuildSpecs(self, model):
 | 
					    # Добавление новых моделей
 | 
				
			||||||
        """
 | 
					 | 
				
			||||||
        Выстраивает иерархию спецификаций для выбранной модели
 | 
					 | 
				
			||||||
        """
 | 
					 | 
				
			||||||
        def DoItem(item, model):
 | 
					 | 
				
			||||||
            sp.SetPyData(item, model)
 | 
					 | 
				
			||||||
            for spec in model.GetSpecs():
 | 
					 | 
				
			||||||
                child = sp.AppendItem(item, spec.GetTitle())
 | 
					 | 
				
			||||||
                DoItem(child, spec)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        sp = self.m_specs
 | 
					 | 
				
			||||||
        sp.DeleteAllItems()
 | 
					 | 
				
			||||||
        root = sp.AddRoot(model.GetTitle())
 | 
					 | 
				
			||||||
        DoItem(root, model)
 | 
					 | 
				
			||||||
        sp.ExpandAll()
 | 
					 | 
				
			||||||
        sp.SortChildren(root)
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def AddModelToRoot(self, model):
 | 
					    def AddModelToRoot(self, model):
 | 
				
			||||||
        """
 | 
					        """
 | 
				
			||||||
@@ -288,130 +341,6 @@ class MainFrame(forms.MainFrame):
 | 
				
			|||||||
        if root:
 | 
					        if root:
 | 
				
			||||||
            um.Expand(root)
 | 
					            um.Expand(root)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def NewProject(self, model):
 | 
					 | 
				
			||||||
        """
 | 
					 | 
				
			||||||
        Начать новый проект:
 | 
					 | 
				
			||||||
        1. Построить дерево спецификаций
 | 
					 | 
				
			||||||
        2. Создать одну пользовательскую модель (по умолчанию)
 | 
					 | 
				
			||||||
        3. Сделать заготовки для графиков/отчетов/прочего
 | 
					 | 
				
			||||||
        """
 | 
					 | 
				
			||||||
        # Строим спецификации
 | 
					 | 
				
			||||||
        self.BuildSpecs(model)
 | 
					 | 
				
			||||||
        # Очищаем окно пользовательских моделей
 | 
					 | 
				
			||||||
        # и создаем там одну
 | 
					 | 
				
			||||||
        um = self.m_user_models
 | 
					 | 
				
			||||||
        um.DeleteAllItems()
 | 
					 | 
				
			||||||
        um.AddRoot('root')
 | 
					 | 
				
			||||||
        self.AddModelToRoot(model)
 | 
					 | 
				
			||||||
        # Создаем корневой элемент для окна с графиками
 | 
					 | 
				
			||||||
        self.m_plots.AddRoot('root')
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        return True # Project(model)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    def SelectUserModel(self, model_def):
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        def SelectProperty(param_type):
 | 
					 | 
				
			||||||
            """
 | 
					 | 
				
			||||||
            По указанному имени типа возвращает "свойство" для списка "свойств"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            Смотри руководство пользователя для того, чтобы получить полную
 | 
					 | 
				
			||||||
            информацию о всех типах данных, используемых в Opal.
 | 
					 | 
				
			||||||
            """
 | 
					 | 
				
			||||||
            if   param_type == 'bool' or param_type == 'boolean':
 | 
					 | 
				
			||||||
                return wxpg.BoolProperty
 | 
					 | 
				
			||||||
            elif param_type == 'int':
 | 
					 | 
				
			||||||
                return wxpg.IntProperty
 | 
					 | 
				
			||||||
            elif param_type == 'float' or param_type == 'double':
 | 
					 | 
				
			||||||
                return wxpg.FloatProperty
 | 
					 | 
				
			||||||
            elif param_type == 'str' or param_type == 'string':
 | 
					 | 
				
			||||||
                return wxpg.StringProperty
 | 
					 | 
				
			||||||
            elif param_type == 'list':
 | 
					 | 
				
			||||||
                return wxpg.ArrayStringProperty
 | 
					 | 
				
			||||||
            else:
 | 
					 | 
				
			||||||
                # очень плохо, если это произошло
 | 
					 | 
				
			||||||
                raise KeyError()
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        msg = model_def.PackParams()
 | 
					 | 
				
			||||||
        pg = self.m_params
 | 
					 | 
				
			||||||
        pg.ClearPage(0)
 | 
					 | 
				
			||||||
        for label, value in model_def.params.iteritems():
 | 
					 | 
				
			||||||
            param   = model_def.DD[label]
 | 
					 | 
				
			||||||
            title   = param.GetTitle()
 | 
					 | 
				
			||||||
            prop    = SelectProperty(param.GetType())
 | 
					 | 
				
			||||||
            pid     = pg.Append(prop(title, value = value))
 | 
					 | 
				
			||||||
            pg.SetPropertyClientData(pid, label)
 | 
					 | 
				
			||||||
            pg.SetPropertyHelpString(pid, param.GetComment())
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        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):
 | 
					 | 
				
			||||||
        item = source.GetSelection()
 | 
					 | 
				
			||||||
        if not item.IsOk():
 | 
					 | 
				
			||||||
            raise ItemError('Invalid item')
 | 
					 | 
				
			||||||
        return item
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    def GetSelectedData(self, source):
 | 
					 | 
				
			||||||
        item = self.GetSelectedItem(source)
 | 
					 | 
				
			||||||
        data = source.GetPyData(item)
 | 
					 | 
				
			||||||
        if not data:
 | 
					 | 
				
			||||||
            raise ItemError('Empty data')
 | 
					 | 
				
			||||||
        return data
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    def GetSelectedItemData(self, source):
 | 
					 | 
				
			||||||
        item = self.GetSelectedItem(source)
 | 
					 | 
				
			||||||
        data = source.GetPyData(item)
 | 
					 | 
				
			||||||
        if not data:
 | 
					 | 
				
			||||||
            raise ItemError('Empty data')
 | 
					 | 
				
			||||||
        return (item, data)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    def OnModelActivated(self, event):
 | 
					 | 
				
			||||||
        item = event.GetItem()
 | 
					 | 
				
			||||||
        data = self.m_user_models.GetPyData(item)
 | 
					 | 
				
			||||||
        if data:
 | 
					 | 
				
			||||||
            self.SelectUserModel(data.mdef)
 | 
					 | 
				
			||||||
            self.ShowQuickResult(data.res)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    def OnParamChanging(self, event):
 | 
					 | 
				
			||||||
        #value = event.GetValue()
 | 
					 | 
				
			||||||
        #print repr(value)
 | 
					 | 
				
			||||||
        #wx.MessageBox(value, 'changing')
 | 
					 | 
				
			||||||
        #event.Veto()
 | 
					 | 
				
			||||||
        pass
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    def OnParamChanged(self, event):
 | 
					 | 
				
			||||||
        prop = event.GetProperty()
 | 
					 | 
				
			||||||
        if not prop:
 | 
					 | 
				
			||||||
            return
 | 
					 | 
				
			||||||
        value = prop.GetValue()
 | 
					 | 
				
			||||||
        param = prop.GetClientData()
 | 
					 | 
				
			||||||
        item, data = self.GetSelectedItemData(self.m_user_models)
 | 
					 | 
				
			||||||
        data.mdef[param] = value
 | 
					 | 
				
			||||||
        self.m_user_models.SetItemImage(item, self.icons.mready)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    def OnTest(self, event):
 | 
					 | 
				
			||||||
        um = self.m_user_models
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    def OnNewModel(self, event):
 | 
					 | 
				
			||||||
        self.do_nothing = True
 | 
					 | 
				
			||||||
        f = SelectModelDialog(self, self.models)
 | 
					 | 
				
			||||||
        if f.ShowModal() == wx.ID_OK:
 | 
					 | 
				
			||||||
            model = f.GetSelectedModel()
 | 
					 | 
				
			||||||
            if model:
 | 
					 | 
				
			||||||
                print model.GetTitle()
 | 
					 | 
				
			||||||
            else:
 | 
					 | 
				
			||||||
                print 'Bad :('
 | 
					 | 
				
			||||||
        self.do_nothing = False
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    def OnAddModelToRoot(self, event):
 | 
					    def OnAddModelToRoot(self, event):
 | 
				
			||||||
        model = self.GetSelectedData(self.m_specs)
 | 
					        model = self.GetSelectedData(self.m_specs)
 | 
				
			||||||
        self.AddModelToRoot(model)
 | 
					        self.AddModelToRoot(model)
 | 
				
			||||||
@@ -437,6 +366,103 @@ class MainFrame(forms.MainFrame):
 | 
				
			|||||||
        else:
 | 
					        else:
 | 
				
			||||||
            wx.MessageBox('It\'s impossible to append model', 'Error')
 | 
					            wx.MessageBox('It\'s impossible to append model', 'Error')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # Реакция на выбор модели
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def SelectUserModel(self, model_def):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        def SelectProperty(param_type):
 | 
				
			||||||
 | 
					            """
 | 
				
			||||||
 | 
					            По указанному имени типа возвращает "свойство" для списка "свойств"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            Смотри руководство пользователя для того, чтобы получить полную
 | 
				
			||||||
 | 
					            информацию о всех типах данных, используемых в Opal.
 | 
				
			||||||
 | 
					            """
 | 
				
			||||||
 | 
					            if   param_type == 'bool' or param_type == 'boolean':
 | 
				
			||||||
 | 
					                return wxpg.BoolProperty
 | 
				
			||||||
 | 
					            elif param_type == 'int':
 | 
				
			||||||
 | 
					                return wxpg.IntProperty
 | 
				
			||||||
 | 
					            elif param_type == 'float' or param_type == 'double':
 | 
				
			||||||
 | 
					                return wxpg.FloatProperty
 | 
				
			||||||
 | 
					            elif param_type == 'str' or param_type == 'string':
 | 
				
			||||||
 | 
					                return wxpg.StringProperty
 | 
				
			||||||
 | 
					            elif param_type == 'list':
 | 
				
			||||||
 | 
					                return wxpg.ArrayStringProperty
 | 
				
			||||||
 | 
					            else:
 | 
				
			||||||
 | 
					                # очень плохо, если это произошло
 | 
				
			||||||
 | 
					                raise KeyError()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        pg = self.m_params
 | 
				
			||||||
 | 
					        pg.ClearPage(0)
 | 
				
			||||||
 | 
					        for label, value in model_def.params.iteritems():
 | 
				
			||||||
 | 
					            param   = model_def.DD[label]
 | 
				
			||||||
 | 
					            title   = param.GetTitle()
 | 
				
			||||||
 | 
					            prop    = SelectProperty(param.GetType())
 | 
				
			||||||
 | 
					            pid     = pg.Append(prop(title, value = value))
 | 
				
			||||||
 | 
					            pg.SetPropertyClientData(pid, label)
 | 
				
			||||||
 | 
					            pg.SetPropertyHelpString(pid, param.GetComment())
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    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 OnModelActivated(self, event):
 | 
				
			||||||
 | 
					        item = event.GetItem()
 | 
				
			||||||
 | 
					        data = self.m_user_models.GetPyData(item)
 | 
				
			||||||
 | 
					        if data:
 | 
				
			||||||
 | 
					            self.SelectUserModel(data.mdef)
 | 
				
			||||||
 | 
					            self.ShowQuickResult(data.res)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # Изменение параметров модели
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def OnParamChanging(self, event):
 | 
				
			||||||
 | 
					        #value = event.GetValue()
 | 
				
			||||||
 | 
					        #print repr(value)
 | 
				
			||||||
 | 
					        #wx.MessageBox(value, 'changing')
 | 
				
			||||||
 | 
					        #event.Veto()
 | 
				
			||||||
 | 
					        pass
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def OnParamChanged(self, event):
 | 
				
			||||||
 | 
					        prop = event.GetProperty()
 | 
				
			||||||
 | 
					        if not prop:
 | 
				
			||||||
 | 
					            return
 | 
				
			||||||
 | 
					        value = prop.GetValue()
 | 
				
			||||||
 | 
					        param = prop.GetClientData()
 | 
				
			||||||
 | 
					        item, data = self.GetSelectedItemData(self.m_user_models)
 | 
				
			||||||
 | 
					        data.mdef[param] = value
 | 
				
			||||||
 | 
					        self.m_user_models.SetItemImage(item, self.icons.mready)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def OnTest(self, event):
 | 
				
			||||||
 | 
					        um = self.m_user_models
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # Получение данных выбранной модели
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def GetSelectedItem(self, source):
 | 
				
			||||||
 | 
					        item = source.GetSelection()
 | 
				
			||||||
 | 
					        if not item.IsOk():
 | 
				
			||||||
 | 
					            raise ItemError('Invalid item')
 | 
				
			||||||
 | 
					        return item
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def GetSelectedData(self, source):
 | 
				
			||||||
 | 
					        item = self.GetSelectedItem(source)
 | 
				
			||||||
 | 
					        data = source.GetPyData(item)
 | 
				
			||||||
 | 
					        if not data:
 | 
				
			||||||
 | 
					            raise ItemError('Empty data')
 | 
				
			||||||
 | 
					        return data
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def GetSelectedItemData(self, source):
 | 
				
			||||||
 | 
					        item = self.GetSelectedItem(source)
 | 
				
			||||||
 | 
					        data = source.GetPyData(item)
 | 
				
			||||||
 | 
					        if not data:
 | 
				
			||||||
 | 
					            raise ItemError('Empty data')
 | 
				
			||||||
 | 
					        return (item, data)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # Дублирование модели
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def OnDuplicate(self, event):
 | 
					    def OnDuplicate(self, event):
 | 
				
			||||||
        """
 | 
					        """
 | 
				
			||||||
        Обработчик события "дублирование модели"
 | 
					        Обработчик события "дублирование модели"
 | 
				
			||||||
@@ -458,17 +484,23 @@ class MainFrame(forms.MainFrame):
 | 
				
			|||||||
    def OnDuplicateTree(self, event):
 | 
					    def OnDuplicateTree(self, event):
 | 
				
			||||||
        pass
 | 
					        pass
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # Удаление модели
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def OnDeleteModel(self, event):
 | 
					    def OnDeleteModel(self, event):
 | 
				
			||||||
        item, data = self.GetSelectedItemData(self.m_user_models)
 | 
					        item, data = self.GetSelectedItemData(self.m_user_models)
 | 
				
			||||||
        self.server.DeleteJob(data.jid)
 | 
					        self.server.DeleteJob(data.jid)
 | 
				
			||||||
        self.m_user_models.Delete(item)
 | 
					        self.m_user_models.Delete(item)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # Функции запуска модели на выполнение и управления очередью
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def OnModelProcess(self, event):
 | 
					    def OnModelProcess(self, event):
 | 
				
			||||||
        um = self.m_user_models
 | 
					        um = self.m_user_models
 | 
				
			||||||
        for i in um.GetSelections():
 | 
					        for i in um.GetSelections():
 | 
				
			||||||
            data = um.GetItemPyData(i)
 | 
					            data = um.GetItemPyData(i)
 | 
				
			||||||
            self.server.LaunchJob(data.jid, data.mdef)
 | 
					            self.server.LaunchJob(data.jid, data.mdef)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # Функции управления таблицами и отчетами
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def OnShowResult(self, event):
 | 
					    def OnShowResult(self, event):
 | 
				
			||||||
        item, data = self.GetSelectedItemData(self.m_user_models)
 | 
					        item, data = self.GetSelectedItemData(self.m_user_models)
 | 
				
			||||||
        title = self.m_user_models.GetItemText(item)
 | 
					        title = self.m_user_models.GetItemText(item)
 | 
				
			||||||
@@ -476,6 +508,15 @@ class MainFrame(forms.MainFrame):
 | 
				
			|||||||
        rframe = ResultFrame(self, title, data.res)
 | 
					        rframe = ResultFrame(self, title, data.res)
 | 
				
			||||||
        rframe.Show()
 | 
					        rframe.Show()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # Функции управления графиками
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def OnAddPlot(self, event):
 | 
				
			||||||
 | 
					        root = self.m_plots.GetRootItem()
 | 
				
			||||||
 | 
					        child = self.m_plots.AppendItem(root, 'New plot')
 | 
				
			||||||
 | 
					        self.m_plots.SetPyData(child, 'plot')
 | 
				
			||||||
 | 
					        self.m_plots.SetItemImage(child, self.icons.porg)
 | 
				
			||||||
 | 
					        self.m_plots.SelectItem(child)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def GetLines(self, line_type):
 | 
					    def GetLines(self, line_type):
 | 
				
			||||||
        """
 | 
					        """
 | 
				
			||||||
        Возвращает набор линий, которые пользователь указал для
 | 
					        Возвращает набор линий, которые пользователь указал для
 | 
				
			||||||
@@ -507,30 +548,6 @@ class MainFrame(forms.MainFrame):
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        return lines
 | 
					        return lines
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def ShowPlot(self, lines, plot_title = ''):
 | 
					 | 
				
			||||||
        if lines:
 | 
					 | 
				
			||||||
            p = PlotFrame(self, 'Plot', lines)
 | 
					 | 
				
			||||||
            p.Show()
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    def OnQuickShowPlot(self, event):
 | 
					 | 
				
			||||||
        lines = self.GetLines(LINE_CURVE)
 | 
					 | 
				
			||||||
        um    = self.m_user_models
 | 
					 | 
				
			||||||
        item, data = self.GetSelectedItemData(um)
 | 
					 | 
				
			||||||
        title = um.GetItemText(item)
 | 
					 | 
				
			||||||
        for line in lines:
 | 
					 | 
				
			||||||
            colx, coly = line.columns
 | 
					 | 
				
			||||||
            title_x = data.res.columns[colx].GetTitle()
 | 
					 | 
				
			||||||
            title_y = data.res.columns[coly].GetTitle()
 | 
					 | 
				
			||||||
            line.title = "{}: {}({})".format(title, title_y, title_x)
 | 
					 | 
				
			||||||
        self.ShowPlot(lines, title)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    def OnAddPlot(self, event):
 | 
					 | 
				
			||||||
        root = self.m_plots.GetRootItem()
 | 
					 | 
				
			||||||
        child = self.m_plots.AppendItem(root, 'New plot')
 | 
					 | 
				
			||||||
        self.m_plots.SetPyData(child, 'plot')
 | 
					 | 
				
			||||||
        self.m_plots.SetItemImage(child, self.icons.porg)
 | 
					 | 
				
			||||||
        self.m_plots.SelectItem(child)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    def AddLines(self, line_type):
 | 
					    def AddLines(self, line_type):
 | 
				
			||||||
        item, data = self.GetSelectedItemData(self.m_plots)
 | 
					        item, data = self.GetSelectedItemData(self.m_plots)
 | 
				
			||||||
        if data != 'plot':
 | 
					        if data != 'plot':
 | 
				
			||||||
@@ -555,13 +572,28 @@ class MainFrame(forms.MainFrame):
 | 
				
			|||||||
            else:
 | 
					            else:
 | 
				
			||||||
                self.m_plots.SetItemImage(child, self.icons.pline)
 | 
					                self.m_plots.SetItemImage(child, self.icons.pline)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 | 
				
			||||||
    def OnAddCurves(self, event):
 | 
					    def OnAddCurves(self, event):
 | 
				
			||||||
        self.AddLines(LINE_CURVE)
 | 
					        self.AddLines(LINE_CURVE)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def OnAddMarkers(self, event):
 | 
					    def OnAddMarkers(self, event):
 | 
				
			||||||
        self.AddLines(LINE_MARKER)
 | 
					        self.AddLines(LINE_MARKER)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def ShowPlot(self, lines, plot_title = ''):
 | 
				
			||||||
 | 
					        p = PlotFrame(self, 'Plot', lines)
 | 
				
			||||||
 | 
					        p.Show()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def OnQuickShowPlot(self, event):
 | 
				
			||||||
 | 
					        lines = self.GetLines(LINE_CURVE)
 | 
				
			||||||
 | 
					        um    = self.m_user_models
 | 
				
			||||||
 | 
					        item, data = self.GetSelectedItemData(um)
 | 
				
			||||||
 | 
					        title = um.GetItemText(item)
 | 
				
			||||||
 | 
					        for line in lines:
 | 
				
			||||||
 | 
					            colx, coly = line.columns
 | 
				
			||||||
 | 
					            title_x = data.res.columns[colx].GetTitle()
 | 
				
			||||||
 | 
					            title_y = data.res.columns[coly].GetTitle()
 | 
				
			||||||
 | 
					            line.title = "{}: {}({})".format(title, title_y, title_x)
 | 
				
			||||||
 | 
					        self.ShowPlot(lines, title)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def OnPlotProcess(self, event):
 | 
					    def OnPlotProcess(self, event):
 | 
				
			||||||
        item = self.m_plots.GetSelection()
 | 
					        item = self.m_plots.GetSelection()
 | 
				
			||||||
        data = self.m_plots.GetItemPyData(item)
 | 
					        data = self.m_plots.GetItemPyData(item)
 | 
				
			||||||
@@ -581,9 +613,6 @@ class MainFrame(forms.MainFrame):
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        self.ShowPlot(lines)
 | 
					        self.ShowPlot(lines)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def OnIdle(self, event):
 | 
					 | 
				
			||||||
        pass
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#-----------------------------------------------------------------------------
 | 
					#-----------------------------------------------------------------------------
 | 
				
			||||||
# Форма с выбором модели из представленного списка
 | 
					# Форма с выбором модели из представленного списка
 | 
				
			||||||
#-----------------------------------------------------------------------------
 | 
					#-----------------------------------------------------------------------------
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user