def init(self, title=u'', label=u'', default_txt=u'', mask=u'', reg_exp=r''): """ Инициализация диалогового окна. @param title: Заголовок диалогового окна. @param label: Текст сообщения. @param default_txt: Строка заполняемая по умолчанию. @param mask: Маска. @param reg_exp: Регулярное выражение. """ # Проверка входных параметров if default_txt is None: default_txt = u'' self.edit_text = u'' self.SetTitle(title) self.label_staticText.SetLabelText(label) log.debug(u'Установка значения по умолчанию <%s> для редактирования' % default_txt) self.masked_textCtrl.SetMaskParameters(mask=mask, validRegex=reg_exp) # ВНИМАНИЕ! Установка значения м.б. только после # установки парамеров маски. # SetValue производит дополнительный контроль значения self.masked_textCtrl.SetValue(default_txt)
def read_value(self, address): """ Чтение значения по адресу. @param address: Адрес значения в узле. @return: Запрашиваемое значение или None в случае ошибки чтения. """ opc = None opc_host = self.getHost() opc_server = self.getOPCServer() topic = self.getTopic() try: # Создание клиента OPC opc = self.connect(opc_host) if opc is None: return None # Прочитать из OPC сервера val = opc.read(address) result = val[0] if val and val[1] == 'Good' else None self.disconnect(opc) log.debug(u'Адрес <%s>. Результат чтения данных %s' % (address, result)) return result except: self.disconnect() log.fatal(u'Ошибка чтения значения по адресу <%s> в <%s>' % (address, self.__class__.__name__)) return None
def GetAssociateFld(self, key, fld_name): """ Возвращает значение определенного поля ассоциации. @type key: C{tuple} @param key: Ключ объекта в словаре. @type fld_name: C{string} @param fld_name: Имя поля. """ if key in self._model: vals = self._model[key][0] # Определяем индекс поля try: indx = list(self.assc_val).index(fld_name) value = vals[indx] log.debug(u'>>> IN GetAssociateFld FIND FIELD Value = %s' % value) return value except: log.error( u'>>> fld_name value ERROR in GetAssociateFld fld_name: %s' % fld_name) log.fatal(u'>>> asscDict = %s' % self._model) return None
def addPage(self, Page_, Title_, Select_=False, Image_=None, not_dublicate=True): """ Добавить страницу. @param Page_: Страница-объект наследник wx.Window. @param Title_: Заголовок страницы. @param Select_: Выбирается по умолчанию эта страница? @param Image_: Файл образа или сам образ в заголовке страницы. @param not_dublicate: Не открывать страницу с таким же именем? """ if Page_ is None: log.warning(u'Не определена страница для добавления в главный нотебук') return if not_dublicate: # Запретить открытие страницы с таким же заголовком page_titles = [page['title'] for page in self.getPages()] if Title_ in page_titles: msg = u'Страница <%s> уже открыта' % Title_ log.warning(msg) Page_.Destroy() ic_dlg.icWarningBox(u'ВНИМАНИЕ!', msg) return None # У объекта страницы поменять хозяина # Чтобы органайзер синхронно переразмеривался с главным окном if Page_.GetParent() != self: log.debug(u'Смена родителя <%s> страницы <%s>' % (Page_.GetParent(), Page_.__class__.__name__)) Page_.Reparent(self) return self.AddPage(Page_, Title_, Select_, Image_)
def updateValues(self): """ Обновить значения контролов. """ try: log.debug(u'Старт процедуры обновления значений контролов') obj_addresses = self.get_panel_obj_addresses() # obj_addresses_names = [ctrl.getName() for ctrl, address in obj_addresses] # log.debug(u'Список обрабатываемых контролов %s' % obj_addresses_names) for ctrl, address in obj_addresses: engine_name, obj_name = address engine = self.findSCADAEngine(engine_name) if engine: obj = engine.FindObjectByName(obj_name) if obj: value = obj.getCurValue() # ctrl = self.FindObjectByName(ctrlname) ctrl.setValue(value) else: log.warning(u'Объект <%s> не найден в движке <%s>' % (obj_name, engine_name)) log.debug(u'Конец процедуры обновления значений контролов') except: log.fatal( u'Ошибка обновления значений контролов формы SCADA системы')
def start(self, update_panels=None): """ Запуск основного цикла обработки тегов. @param update_panels: Принудительно обновить панели. Может задаваться как списком так и объектом. @return: True/False. """ self.init_scan_objects() self.exit_run = False thread.start_new(self.run, ()) # Ожидание запуска движка start_time = time.time() stop_time = start_time + ENGINE_START_TIMEOUT cur_time = time.time() log.debug(u'Начало ожидания запуска') while not self.is_running and cur_time < stop_time: cur_time = time.time() log.debug(u'Окончание ожидания запуска. Ожидание %s секунд.' % (cur_time - start_time)) # После удачного запуска движка принудительно обновить панели вызывающие их self.update_panels(update_panels) return self.is_running
def __init__(self, parent, Context_=None, ProjectRoot_=None): """ Конструктор интерфейса. """ # Вызываем конструктор базового класса icobjectinterface.icObjectInterface.__init__(self, parent, resource) try: viewer = self.GetNameObj('view_treectrl') if Context_ is None: Context_ = ic_user.getKernel().GetContext() variables = self._contextConvert(Context_) viewer.LoadTree(variables) except: log.error( u'Ошибка инициализации дерева просмотра хранилища переменных.') self._project_root = ProjectRoot_ if self._project_root: try: env_grid = self.GetNameObj('env_grid') env_dict = self._project_root.prj_res_manager.getPrjEnv() env_list = env_dict.items() env_list.sort() log.debug('Environment list: <%s>' % env_list) env_grid.setTable(env_list) except: log.error( u'Ошибка инициализации грида редактирования дополнительных атрибутов проекта.' )
def onBtn(event): values = {'m_checkBox1': True, 'm_spinCtrl1': 3, 'm_textCtrl2': u'www'} result = quick_entry_edit_dlg(btn, u'Тестовое окно', quick_entry_panel_class=testPanel, defaults=values) log.debug(u'Результат: %s' % str(result)) event.Skip()
def getDateRangeDlg(parent=None, is_concrete_date=False): """ Выбор периода по датам в диалоговом окне. @param parent: Родительское окно. Если не определено, то береться wx.GetApp().GetTopWindow() @param is_concrete_date: Вкл. режим ввода конкретной даты? @return: Кортеж периода по датам (datetime) или None если нажата <отмена>. """ selected_range = None if parent is None: parent = wx.GetApp().GetTopWindow() dlg = icdaterangedlg.icDateRangeDialog(parent) dlg.setConcreteDateCheck(is_concrete_date) dlg.Centre() if dlg.ShowModal() == wx.ID_OK: selected_range = dlg.getSelectedDateRangeAsDatetime() dlg.Destroy() if selected_range: try: log.debug(u'Выбранный диапазон дат: <%s> - <%s>' % selected_range) except: pass return selected_range
def lockRes(ResName_, ResFileName_, ResFileExt_, LockDir_=None): """ Заблокировать ресурс. Имя файла блокировки гонерируется как ИмяРесурса_ИмяФайлаРесурса_РасширениеФайлаРесурса.lck. В файл блокировки записывается информация о владельце блокировки в виде словаря {'owner':Имя хоста с которого заблокировался ресурс}. @param ResName_: Имя ресурса. Если имя ресурса None, то блокируется файл ресурса целиком. @param ResFileName_: Имя файла ресурса. @param ResFileExt_: Расширение файла ресурса/тип ресурса. @param LockDir_: Папка блокировок. """ if LockDir_ is None: LockDir_ = os.getcwd() + '/lock' try: os.makedirs(LockDir_) except: pass lock_filename = '%s_%s_%s%s' % (ResName_, ResFileName_, ResFileExt_, lock.LOCK_FILE_EXT) lock_full_filename = os.path.join(LockDir_, lock_filename) log.debug('LOCK_RES <%s>' % lock_full_filename) return lock.LockFile(lock_full_filename, '{\'owner\':\'%s\'}' % lock.ComputerName())
def isLockRes(ResName_, ResFileName_, ResFileExt_, LockDir_=None): """ Проверить заблокирован ли ресурс. @param ResName_: Имя ресурса. @param ResFileName_: Имя файла ресурса. @param ResFileExt_: Расширение файла ресурса/тип ресурса. @param LockDir_: Папка блокировок. """ if LockDir_ is None: LockDir_ = os.getcwd() + '/lock' try: os.makedirs(LockDir_) except: pass lock_filename = '%s_%s_%s%s' % (ResName_, ResFileName_, ResFileExt_, lock.LOCK_FILE_EXT) lock_full_filename = os.path.join(LockDir_, lock_filename) log.debug('IS_LOCK_RES <%s>' % lock_full_filename) is_lock = lock.IsLockedFile(lock_full_filename) if is_lock: # Если файл блокировки есть, то # проверить кем он заблокирован is_lock = bool( getLockResOwner(ResName_, ResFileName_, ResFileExt_, LockDir_) != lock.ComputerName()) return is_lock
def icSysCmd(sCommand): """ Функция выполняет комманду системы. @param sCommand: Строка системной команды. """ log.debug(u'Выполнение команды: <%s>' % sCommand) return os.system(sCommand)
def gen_resource(self): """ Генерация ресурса, соответстствующего объеку 1С. @return: True/False. """ # Открыть проект prj_res_ctrl = ic.getKernel().getProjectResController() if prj_res_ctrl is None: log.warning( u'Не определен контроллер управления ресурсом проекта. Генерация ресурса таблицы хранения перечислений 1С не взможна.' ) return False else: log.debug(u'Контроллер управления ресурсом проекта <%s>' % prj_res_ctrl) prj_res_ctrl.openPrj() # Создать необходимые ресурсные файлы self._gen_enum_tab(prj_res_ctrl) self._gen_enum_spravmanager(prj_res_ctrl) self._gen_enum_sprav(prj_res_ctrl) # Добавить в таблицу значения перечислений self._add_values(prj_res_ctrl) return True
def test(): """ Тестовая функция """ from ic import config log.init(config) db_url = DEFAULT_DB_URL registry = icObjRegistry(db_url, 'test_oper_obj', 'test_object') registry.connect() registry.append_obj_requisite('test_tab', 'text') registry.append_obj_requisite('test_num', 'int') registry.clear_all() registry.do_state(n_obj='1234', test_tab='zz', test_num=21) registry.do_state(n_obj='1234', test_tab='z2', test_num=3, state='STATE2') registry.do_state(n_obj='1234', test_tab='z0', test_num=-3, state='STATE2') registry.do_state(n_obj='1234', test_tab='z3', test_num=4, state='STATE3') registry.do_state(n_obj='1234', test_tab='z4', test_num=5, state='STATE4') registry.undo_state(n_obj='1234') log.debug( u'Operation record <STATE2> - %s' % registry.get_operation_state_record(n_obj='1234', state='STATE2')) registry.disconnect()
def register_custom_editor(self, *editor_classes): """ Регистрация пользовательских редакторов свойств. @param editors_classes: Список классов пользовательских редакторов. """ if not editor_classes: editor_classes = CUSTOM_PROPERTY_EDITORS # # Let's use some simple custom editor # # NOTE: Editor must be registered *before* adding a property that # uses it. if not getattr(sys, '_PropGridEditorsRegistered', False): for editor_class in editor_classes: if editor_class: log.debug( u'Регистрация пользовательского редактора свойства <%s>' % editor_class.__name__) editor_class.setPropertyEditManager(self) self.RegisterEditor(editor_class) else: log.warning( u'Не определен пользовательский редактор свойства в редакторе ресурса' ) # ensure we only do it once sys._PropGridEditorsRegistered = True
def create(self, parent=None, *arg, **kwarg): """ Создание выбранного объекта. """ if ic_mode.isDebugMode(): log.debug('CREATE Object <%s>' % self.passport()) kernel = ic_user.getKernel() if kernel: if 'context' in kwarg: if isinstance(kwarg['context'], dict): # В случае если передается контекст в виде словаря # необходимо создать объект контекста context = icwidget.icResObjContext(kernel) context.update(kwarg['context']) else: # Контекст создаваемому объекту передается явно context = kwarg['context'] del kwarg['context'] else: # Надо определить контекст context = icwidget.icResObjContext(kernel) return kernel.Create(self.passport(), parent, context=context, *arg, **kwarg)
def read_values(self, addresses): """ Чтение значений по адресам. @param addresses: Список адресов значений в узле. @return: Список запрашиваемых значений или None в случае ошибки чтения. """ opc = None opc_host = self.getHost() opc_server = self.getOPCServer() topic = self.getTopic() try: # Создание клиента OPC opc = self.connect(opc_host) if opc is None: return None # Прочитать из OPC сервера values = opc.read(addresses) result = [ val[1] if val and val[2] == 'Good' else None for val in values ] self.disconnect(opc) log.debug(u'Адреса %s. Результат чтения данных %s' % (addresses, result)) return result except: self.disconnect() log.fatal(u'Ошибка чтения значения по адресам %s в <%s>' % (addresses, self.__class__.__name__)) return None
def get(self, parent=None, *arg, **kwarg): """ Получить объект. Если не зарегистрирован в ядре, то создать его. """ if ic_mode.isDebugMode(): log.debug('GET Object <%s>' % self.passport()) kernel = ic_user.getKernel() if kernel: # Проверить зарегистрирован ли уже объект в ядре name = self.passport()[0][1] obj = kernel.getObject(name) if obj: # Если уже зарегистрирован, то просто вернуть его return obj if 'context' in kwarg: if isinstance(kwarg['context'], dict): # В случае если передается контекст в виде словаря # необходимо создать объект контекста context = icwidget.icResObjContext(kernel) context.update(kwarg['context']) else: # Контекст создаваемому объекту передается явно context = kwarg['context'] del kwarg['context'] else: # Надо определить контекст context = icwidget.icResObjContext(kernel) return kernel.Create(self.passport(), parent, context=context, *arg, **kwarg)
def gen_resources(self, metaobjects): """ Генерация ресурсов, соответствующих метаобъектам 1С. @return: """ log.debug(u'Запуск генерации ресурсов') for metaobject in metaobjects: metaobject.gen_resource()
def get_interval_colors(self): """ Цвета секторов мажорной шкалы. """ self.evalSpace['self'] = self interval_colors = self.eval_attr('interval_colors')[1] log.debug(u'Speedmeter. Interval colors <%s>' % interval_colors) if interval_colors is None: interval_colors = list() return interval_colors
def get_user_property_editor(value, pos, size, style, propEdt, *arg, **kwarg): """ Стандартная функция для вызова пользовательских редакторов свойств (EDT_USER_PROPERTY). """ if value: parent = propEdt res = icpassportchoice.icPassportChoiceDlg(parent) log.debug(u'passport = %s' % res) return str(res)
def Update(self, bAsk=False): """ Обновление объектов, работающих с данным. """ for obj in self.evalSpace['_has_source'].values(): try: obj.Update(bAsk=bAsk) log.debug(u'Update Object: type=<%s>, name=<%s>' % (obj.type, obj.name)) except: log.fatal(u'Ошибка обновления объектов диалоговогоокна, работающих с данными')
def get_intervals(self): """ Мажорная шкала в градусах. """ self.evalSpace['self'] = self intervals = self.eval_attr('intervals')[1] log.debug(u'Speedmeter. Intervals <%s>' % intervals) if intervals is None: intervals = list() return intervals
def outDevice(msg, Device_=IC_CONSOLE): """ Вывод на устройство регистрации специальных сообщений. @type msg: C{string} @param msg: Сообщение об ошибке. @type Device_: C{int} @param Device_: Указание устройства вывода. """ if Device_ & IC_CONSOLE: try: print(msg) except: return False if Device_ & IC_CONSOLE_INFO: try: log.info(msg) except: return False if Device_ & IC_CONSOLE_ERR: try: log.error(msg) except: return False if Device_ & IC_CONSOLE_WARN: try: log.warning(msg) except: return False if Device_ & IC_CONSOLE_DBG: try: log.debug(msg) except: return False if Device_ & IC_FILE: try: log_file = None log_file = open(IC_LOG_FILE_DEFAULT, 'w+') log_file.write(msg) log_file.close() except: if log_file: log_file.close() return False if Device_ & IC_MSG_INFO: import ic.dlg ic.dlg.ic_dlg.icMsgBox(u'ВНИМАНИЕ', msg) if Device_ & IC_MSG_ERR: import ic.dlg ic.dlg.ic_dlg.icErrBox(u'ОШИБКА', msg) return True
def onOnAllButtonClick(self, event): """ Обработчик включения всех элементов. """ log.debug(u'Включение всех элементов') record_idx = self.getItemSelectedIdx(self.browse_panel.record_listCtrl) self.records[record_idx][ON_ITEMS_KEY] = self.records[record_idx].get(OFF_ITEMS_KEY, list()) self.records[record_idx][OFF_ITEMS_KEY] = list() self.refreshItems(record_idx, self.records[record_idx]) event.Skip()
def onDelToolClicked(self, event): """ Обработчик инструмента <Удалить тег> """ selected_idx = self.getItemSelectedIdx(self.tags_listCtrl) if selected_idx >= 0: tag_name = self.tags_listCtrl.GetItemText(selected_idx) log.debug(u'Удален тег <%s>' % tag_name) del self.tags[tag_name] self.update_tags(**self.tags) event.Skip()
def on_changed(self, event): """ Перед открытием этой страницы. """ # Построить список метаобъектов конфигурации 1с для компонента выбора wizard = self.GetParent() cf_analyzer = wizard.getCFAnalyzer() log.debug(u'Запуск анализатора папки конфигурации <%s>' % wizard.environment['cf_dir']) cf_obj_lst = cf_analyzer.createCFList(wizard.environment['cf_dir']) log.debug(u'Загрузка дерева метаобъектов') self.cf_tree_list_ctrl.LoadTree(cf_obj_lst, is_progress=True)
def convertColGroupKey(GROUP_KEY): """ Преобразовать данный ключ группы в строку заголовка группы колонки. @param GROUP_KEY: Ключ группы. """ result = util.ic_eval(get_grp_title, evalSpace=locals()) try: log.debug(u'Определение заголовка группы колонки <%s>. Результат <%s>' % (column['name'], result)) except: pass return result[1]
def getColGroupKey(RECORD): """ Получить ключ группы колонки. @param RECORD: Словарь записи. """ result = util.ic_eval(get_grp_key, evalSpace=locals()) try: log.debug(u'Определение ключа группы колонки <%s>. Результат <%s>' % (column['name'], result)) except: pass return result[1]
def get_user_property_editor(value, pos, size, style, propEdt, *arg, **kwarg): """ Стандартная функция для вызова пользовательских редакторов свойств (EDT_USER_PROPERTY). """ if value: parent = propEdt value = icObjectPassportListUserEdt.str_to_val_user_property( value, propEdt) res = icpassportchoice.icPassportListDlg(parent, None, value) log.debug(u'passports = %s' % res) return str(res)