def readTags(self, *tags): """ Прочитать список тегов. @param tags: Список объектов тегов. @return: True/False. """ if not tags: log.warning(u'Не определен список тегов для чтения') return False # Контроль что все теги соответствуют узлу is_my_tags_list = [tag.getNode().GetPassport() == self.GetPassport() for tag in tags] is_my_tags = all(is_my_tags_list) if not is_my_tags: not_my_tags = [tags[i].name for i, is_my_tag in enumerate(is_my_tags_list) if not is_my_tag] log.error(u'Не соответствие читаемых тегов %s Memory источнику данных' % not_my_tags) return False for tag in tags: # Все теги Memory узла являются вычисляемыми. # Выражение для вычисления записывается в 'address' expression = tag.GetResource().get('address', None) if not expression: log.warning(u'Не определена функция вычисляемого тега <%s> для определения значения' % tag.getName()) value = None else: self.setEnv(TAG=tag) # log.debug(u'Обработка вычисляемого тега <%s>. Выражение <%s>' % (tag.getName(), expression)) value = self.read_value(expression) tag.setCurValue(value) return True
def _add_values(self, prj_res_ctrl=None): """ Добавить в таблицу значения перечислений. @param prj_res_ctrl: Контроллер управления ресурсом проекта. """ tab_name = self._get_enum_tabname(prj_res_ctrl) if prj_res_ctrl.isRes(tab_name, 'tab'): tab = ic.getKernel().CreateObj(tab_name, tab_name, 'tab') if tab: name_lat = ic_str.rus2lat(self.name) len_code = self._get_enum_spravlevel_len() code_fmt = '%%0%dd' % len_code # Сначала удалить все данные представления tab.del_where(tab.c.type == name_lat) # Затем добавить значения values = self.children[0].children for i, value in enumerate(values): code = code_fmt % (i + 1) tab.add(type=name_lat, cod=code, name=value.description, s1=value.name, uid1c=value.uid) else: log.warning( u'Ошибка создания объекта таблицы хранения перечислений 1С <%s>' % tab_name) else: log.warning( u'Не найден ресурс таблицы хранения перечислений 1С <%s>' % tab_name)
def _find_and_goto_func(self, tree, ide, res_editor, property_value, signature='GetManager'): """ Найти и перейти к функции... @return: True - Перешли, False - функция не найдена. """ signature = '%s().' % signature len_signature = len(signature) n1 = property_value.find(signature) n2 = property_value.find('(', n1 + len_signature) if 0 <= n1 < n2: func_name = property_value[n1 + len_signature:n2] path_filename, ext = os.path.splitext(res_editor.file) py_filename = res_editor.file if ext == '.py' else path_filename + '_' + ext[ 1:] + '.py' # log.debug(u'Поиск функции <%s> в модуле <%s>' % (func_name, py_filename)) if tree and ide: bSel = ide.SelectFile(py_filename) if bSel: # log.debug(u'Переход к функции') ide.GoToFunc(func_name) return True else: log.warning(u'Модуль Python <%s> не выбран в IDE' % py_filename) else: log.warning(u'Не определена IDE') return False
def get_sort_field_idx(self, sort_column='name'): """ Определить индекс поля сортировки по указанию имени/индексу колонки сортировки. @param sort_column: Указание имени/индекса колонки сортировки. @return: Индекс поля сортировки. Или None в случае ошибки. """ sort_field_idx = None if isinstance(sort_column, int): # ВНИМАНИЕ! Увеличение на 1 сделано для того чтобы учесть # первую колонку с индексом 0. Т.к. -0 нет. # V return abs(sort_column) - 1 elif isinstance(sort_column, str) or isinstance(sort_column, unicode): if sort_column.startswith(SORT_REVERSE_SIGN): sort_field = sort_column[1:] else: sort_field = sort_column if sort_field in self.sprav_field_names: sort_field_idx = self.sprav_field_names.index(sort_field) else: log.warning(u'Сортировка.Поле <%s> не найдено среди %s.' % (sort_field, self.sprav_field_names)) sort_field_idx = None else: log.warning(u'Ошибка типа поля/колонки сортировки <%s>' % type(sort_column)) return sort_field_idx
def _signal_loop(self, *warg): """ Диспетчер сигналов. """ while True: # Обрабатываем очередь if not self._eventLoopLst.isSet(): # Ждем 5 сек, если очередь занята self._eventLoopLst.wait(0.5) if not self._eventLoopLst.isSet(): log.warning( u'Диспетчер ядра не может получить доступ к очереди сигналов.' ) else: # Если установлен признак остановки, то выходим из цикла if self.__stop: break self._parse_signal_lst() else: # Если установлен признак остановки, то выходим из цикла if self.__stop: break self._parse_signal_lst() try: time.sleep(0.001) except: log.error(u'*** EXCEPTION time.sleep(0.001) ***') break
def getParamNamesINI(sINIFileName, sSection): """ Имена параметров в секции. @type sINIFileName: C{string} @param sINIFileName: Полное имя файла настроек. @type sSection: C{string} @param sSection: Имя секции. @return: Возвращает список имен параметров в секции или None в случае ошибки. """ ini_file = None try: if not os.path.isfile(sINIFileName): log.warning(u'INI file <%s> not exists' % sINIFileName) return None # Создать объект конфигурации ini_parser = ConfigParser.ConfigParser() ini_file = open(sINIFileName, 'r') ini_parser.readfp(ini_file) ini_file.close() # Если такой секции нет if not ini_parser.has_section(sSection): log.warning(u'Section [%s] not exists in file <%s>' % (sSection, sINIFileName)) return [] # Количество параметров в секции return ini_parser.options(sSection) except: if ini_file: ini_file.close() log.fatal(u'INI file <%s> Get param names in section [%s]' % (sINIFileName, sSection)) return None
def init_columns(self, *fields): """ Инициализация колонок контрола дерева справочника. @param fields: Список имен полей справочника, которые необходимо отобразить в контроле дерева. Если поля не указываются, то отображаются только <Код> и <Наименование>. """ field_names = ['cod', 'name'] if fields: field_names += fields self.sprav_field_names = field_names if self.sprav is None: log.warning(u'Не определен справочник для выбора кода') return tab = self.sprav.getTable() # Словарь спецификаций полей таблицы справочника field_dict = dict([(field['name'], field) for field in tab.getResource()['child']]) for field_name in field_names: field = field_dict.get(field_name, None) if field: column_label = self.get_field_label(field) self.sprav_treeListCtrl.AddColumn(column_label) else: log.warning(u'Не найдено поле <%s> в описании таблицы <%s>' % (field_name, tab.name)) # Обновить отсортированные колонки self.refreshSortColumn(self.sort_column)
def sequence_list_dlg(parent=None, sequence_data=None, label_column=0): """ Вызов диалогового окна для редактирования последовательностью записей. @param parent: Родительское окно. Если не определено, то берется лавное окно программы. @param sequence_data: Список-последовательность записей. @param label_column: Имя колонки - наименования записи. @return: Отредактированный список-пследовательность или None в случае ошибки/нажата <Отмена>. """ if parent is None: parent = ic.getMainWin() if not sequence_data: log.warning(u'Не определена последовательность') sequence_data = list() dlg = icSequenceListDlg(parent=parent) dlg.sequence_control.setSequenceData(sequence_data) dlg.sequence_control.setLabelColumn(label_column) dlg.sequence_control.refreshSequence() result = dlg.ShowModal() if result == wx.ID_OK: return dlg.sequence_control.getSequenceData() return None
def load_xml_content(xml_filename, is_change_keys=True): """ Загрузить содержимое XML файла в словарно списковую структуру. @param xml_filename: Полное имя XML файла. @param is_change_keys: Произвести автоматическую замену ключей на короткие. @return: Словарно-списковая структура содержания XML файла. Или None в случае ошибки. """ if not os.path.exists(xml_filename): log.warning(u'XML файл <%s> не найден' % xml_filename) return None xml_file = None try: xml_file = open(xml_filename, 'r') xml_txt = xml_file.read() xml_file.close() except: if xml_file: xml_file.close() log.fatal(u'Ошибка загрузки содержимого XML файла <%s>' % xml_filename) return None data = xmltodict.parse(xml_txt) if is_change_keys: data = change_keys_doc(data) return data
def remove_to(self, dst_doc, doc_uuid=None, doc_num=None, requisite_replace=None, ask_del=False): """ Переместить документ из одной структуры документа в другую. Функция является примером архивирования документа. @param dst_doc: Объект документа-приемника. @param doc_uuid: UIID переносимого документа. Переносимый документ может задаваться как номером так и UUID. @param doc_num: Номер переносимого документа. Если номер не определен, то перенос производиться по UUID документа. @param requisite_replace: Словарь замены имен реквизитов. Формат: {'Имя реквизита в документе-приемнике': 'Имя реквизита в документе-источнике'} @param ask_del: Спрашивать об удалении документа из источника? @return: True/False. """ if doc_num: doc_uuid = self.getDocUUID(doc_num) if doc_uuid is None: log.warning(u'Не определен UUID документа для перемещения') return False return docfunc.document_remove_to(doc_uuid, self, dst_doc, requisite_replace, ask_del)
def _get_edit_dlg(self, attr, value, pos=wx.DefaultPosition, size=wx.DefaultSize, style=0, propEdt=None, *arg, **kwarg): """ Диалог редактирования свойства/атрибута. @type parent: C{wx.Window} @param parent: Указатель на родительское окно. @type attr: C{string} @param attr: Имя текущего атрибута. @type value: C{string} @param value: Текущее значение. @type pos: C{wx.Point} @param pos: Позиция окна. @type size: C{wx.Size} @param size: Размер диалогового окна. @type style: C{int} @param style: Стиль диалога. @param propEdt: Указатель на редактор свойств. @return: Возвращает отредактированное значение. """ if propEdt is None: propEdt = self.property_edit_manager if propEdt and propEdt.getResTree(): typRes = propEdt.getResource()['type'] modl = propEdt.getResTree().GetTypeModule(typRes) try: edtFunc = getattr(modl, 'get_user_property_editor') value = edtFunc(attr, value, pos, size, style, propEdt, *arg, **kwarg) return str(value) except: log.fatal(u'Ошибка вызова пользовательского редактора свойства <%s>' % attr) else: log.warning(u'Не определен объект редактора свойств') return ''
def getBoxListRecords(self): """ Список описаний ящиков/паллет. @return: """ records = list() board = self.truck_constructor.truck_load_constructor.getBoard() if board: tags = board.getShapeTags() for i, tag in enumerate(tags): if tag: try: n = str(i + 1) label = tag['nomenklature']['label'] if tag[ 'nomenklature'][ 'label'] is not None else DEFAULT_BOX_LABEL row_value = tag['row']['value'] made_date = str(tag['made_date']['value']) weight = str(tag['weight']['value']) row = [n, label, row_value, made_date, weight] records.append(row) except: log.fatal(u'Ошибка добавления строки. Индекс [%d]' % i) # Добавить пустую строку records.append([str(i + 1), u'', u'', u'', u'']) else: log.warning( u'Нет прикрепленного тега у фигуры размещения. Индекс [%d]' % i) # Если тег не прикреплен, то добавить пустую строку records.append([str(i + 1), u'', u'', u'', u'']) return records
def _gen_registry(self, prj_res_ctrl=None): """ Генерация ресурса регистра накопления 1С. @param prj_res_ctrl: Контроллер управления ресурсом проекта. @return: True/False. """ if prj_res_ctrl is None: log.warning( u'Не определен контроллер управления ресурсом проекта. Генерация ресурса 1С не взможна.' ) return False reg_res = self._gen_registry_res(prj_res_ctrl, name=self.name, description=self.description, uuid=self.uid) res_name = ic_str.rus2lat(self.name) if prj_res_ctrl.isRes(res_name, 'mtd'): prj_res_ctrl.delRes(res_name, 'mtd') # Сохранить ресурс prj_res_ctrl.saveRes(res_name, 'mtd', reg_res) return True
def icOctHexString(String_, Code_): """ Закодировать строку в восьмеричном/шестнадцатеричном виде. Символы с кодом < 128 не кодируются. @param String_: @param Code_: Кодировка 'OCT'-восьмеричное представление. 'HEX'-шестнадцатеричное представление. @return: Возвращает закодированную строку. """ try: if Code_.upper() == 'OCT': fmt = '\\%o' elif Code_.upper() == 'HEX': fmt = '\\x%x' else: # Ошибка аргументов log.warning('Argument error in icOctHexString.') return None # Перебор строки по символам ret_str = '' for char in String_: code_char = ord(char) # Символы с кодом < 128 не кодируются. if code_char > 128: ret_str += fmt % code_char else: ret_str += char return ret_str except: log.fatal() return None
def ChoiceSprav(self, SpravName_, ParentForm_=None, default_selected_code=None): """ Вызов выбора значения справочника по имени. @param SpravName_: Имя справочника. @param ParentForm_: Родительское окно для формы редактирования справочника. @param default_selected_code: Выбранный код по умолчанию. Если None, то ничего не выбирается. @return: Функция возвращает выбранный код справочника или None в случае ошибки или если нажата кнопка <Отмена>. """ if ParentForm_ is None: ParentForm_ = ic_user.icGetMainWin() choice_sprav = self.getSpravByName(SpravName_) if choice_sprav: result = choice_sprav.Choice( parentForm=ParentForm_, default_selected_code=default_selected_code) if result[0] == coderror.IC_CTRL_OK: return result[1] else: log.warning(u'Справочник <%s> не найден в менеджере <%s>' % (SpravName_, self.name)) return None
def do_replacement(self, res, replacement_dct=None): """ Произвести замены в ресурсе. @param res: Ресурс объекта. @param replacement_dct: Словарь замен. @return: Ресурс с произведенными заменами """ if not res: log.warning(u'Не определен ресурс') return res if replacement_dct is None: # Если словарь замен не определен, то замены производить не надо return res # Если определен словарь замен используем его for attr_name, value in replacement_dct.items(): # ВНИМАНИЕ! Типы объектов подменять нельзя if attr_name != 'type' and not attr_name.startswith('_'): if attr_name in res: res[attr_name] = value else: # Если нет такого атрибута, значит это замена атрибутов дочернего объекта if isinstance(value, dict): res = resource.update_child_resource( attr_name, res, value) else: log.warning( u'Не поддерживаемый тип %s замены ресурса дочернего объекта <%s>' % (type(value), attr_name)) return res
def icInputDate(parent, day=None, month=None, year=None): """ Функция позволяет вводить дату. В качестве параметров передается дата, на которую будет установлен календарь. Если параметры даты не передаются, то установится текщая дата. @type parent: C{wx.Windows} @param parent: Родительское окно. @type day: C{integer} @param day: День недели. @type month: C{integer} @param month: Месяц. @type year: C{integer} @param year: Год. @rtype: C{List} @return: Возвращает выбранную дату либо None. """ if parent is None: MsgBox(None, u'Для данного отображения календаря необходимо родительское окно !') return None dlg = icCalendarDialog(parent, day, month, year) dlg.result = [day, month, year] dlg.CenterOnScreen() if dlg.ShowModal() == wx.ID_OK: str_date = dlg.getStrDate() return str_date else: log.warning(u'No Date Selected') return None
def get_replacement_dct(self, res=None): """ Получить словарь замен ресурса перед сборкой связанного объекта. @param res: Ресурс. @return: Словарь замен. """ if res is None: res = self.GetResource() replacement_dct = dict() # ВНИМАНИЕ! Самое главное надо подменить имя ссылаемого объекта replacement_dct['name'] = self.name for key, val in res.items(): if key in ('border', 'flag', 'position', 'proportion', 'size', 'span'): replacement_dct[key] = val # Словарь замен может быть расширен # при помощи атрибута res_replace if self.isICAttrValue('res_replace'): res_replace = self.getICAttr('res_replace') if isinstance(res_replace, dict): replacement_dct.update(res_replace) else: log.warning( u'Не поддерживаемый тип %s замены значений ресурса при сборке объекта <%s> ' % (type(res_replace), self.getName())) return replacement_dct
def setTierCount(self, tier_count=1, box_layout_scheme=None): """ Установить количество ярусов со схемой погрузки паллет. @param tier_count: Количество ярусов. @param box_layout_scheme: Схема погрузки. Схема задается по позициям. @return: True/False. """ if box_layout_scheme and tier_count > 0: for i in range(tier_count): # Сначала подготовить доски для каждого яруса y_offset = DEFAULT_Y_OFFSET + i * DEFAULT_HEIGHT_STEP scheme = layout_scheme.init_cell_points( box_layout_scheme, DEFAULT_X_OFFSET, y_offset) self.truck_load_constructor.appendBoard( scheme, left=DEFAULT_X_OFFSET, top=y_offset, width=DEFAULT_BOARD_WIDTH, height=DEFAULT_BOARD_HEIGHT) return True else: log.warning( u'Инициализация ярусов. Не корректные входные значения.') return False
def convert_xml_file2dict(xml_filename, codepage='utf-8'): """ Простая конвертация XML файла в словарь. @param xml_filename: Полное наименование XML файла @param codepage: Кодовая страница XML файла. @return: Словарь, соотыветствующий XML файлу. """ if not os.path.exists(xml_filename): log.warning(u'XML файл не найден <%s>' % xml_filename) return dict() body_xml = ic_extend.load_file_text(xml_filename, 'utf-8') # Перекодировать текст, если надо src_codepage = ic_str.get_codepage(body_xml) if src_codepage and src_codepage.lower() != codepage: log.info(u'Перекодировка XML файла <%s> из <%s> в <%s> кодировку' % (xml_filename, src_codepage, codepage)) body_xml = ic_str.recode_text(body_xml, src_codepage, codepage) elif not src_codepage: log.warning(u'Не возможно определить кодовую страницу XML файла <%s>' % xml_filename) return dict() return convert_xml_text2dict(body_xml, codepage)
def init_search(self, *search_fields): """ Инициализация контролов выбора поиска по полям справочника. @param search_fields: Поля по которым производиться поиск. """ # По умолчанию делаем поиск по наименованию field_names = ['name', 'cod'] if search_fields: field_names += search_fields self.sprav_search_field_names = field_names if self.sprav is None: log.warning(u'Не определен справочник для выбора кода') return tab = self.sprav.getTable() # Словарь спецификаций полей таблицы справочника field_dict = dict([(field['name'], field) for field in tab.getResource()['child']]) choices = list() for field_name in field_names: field = field_dict.get(field_name, None) if field: choice_label = self.get_field_label(field) choices.append(choice_label) else: log.warning(u'Не найдено поле <%s> в описании таблицы <%s>' % (field_name, tab.name)) self.search_field_choice.Clear() self.search_field_choice.AppendItems(choices) self.search_field_choice.Select(0)
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 _runPrjCmd(self, AppDir_, PrjPath_, username=None): """ Запуск проекта на исполнение. @param AppDir_: Папка приложения. @param PrjPath_: Папка проекта. @param username: Имя пользователя, запускающего проект. Если не указано (None), то производиться выбор из списка пользователей, присутствующих в проекте. """ import ic.utils.ic_exec as ic_exec ic_exec.CreateRunApp(AppDir_) # Коммандная строка dbg_mode_cmd = '' if username is None: username = self.choiceUsernameDlg() if username is None: log.warning(u'Не определен пользователь запуска проекта') return if self.debug_mode: dbg_mode_cmd = '-dbg' if ic_util.isOSWindowsPlatform(): cmd = '\"%s/python.exe\" \"%s/run.py\" -run %s \"%s/\" -s %s' % ( sys.prefix, AppDir_, dbg_mode_cmd, PrjPath_, username) else: cmd = '%s %s/run.py -run %s %s/ -s %s' % ( sys.executable, AppDir_, dbg_mode_cmd, PrjPath_, username) log.info(u'RUN PROJECT: <%s>' % cmd) ic_exec.RunTask(cmd)
def addFormRequisite(self, name_requisite, type_requisite, *args, **kwargs): """ Добавить реквизит формы. Обычная форма. @param name_requisite: Имя реквизита формы. @param type_requisite: Тип реквизита формы. """ res_filename_requisite = os.path.join(self.getCFDir(), self.uid + '.0') if os.path.exists(res_filename_requisite) and os.path.isfile( res_filename_requisite): return self._addFormRequisiteCtrl(res_filename_requisite, name_requisite, type_requisite, *args, **kwargs) else: res_filename_requisite = os.path.join(res_filename_requisite, 'form') if os.path.exists(res_filename_requisite) and os.path.isfile( res_filename_requisite): return self._addFormRequisiteStd(res_filename_requisite, name_requisite, type_requisite, *args, **kwargs) log.warning(u'ERROR! Form %s (UID: %s) resource file not found!' % (self.name, self.uid)) return None
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 set_choices(self, table_data=None, is_empty=True): """ Установка списка выбора. @param table_data: Табличные данные. @param is_empty: Присутствует в списке пустая строка? @return: True/False. """ if table_data is None: table_data = self.getTableData() if table_data is not None: # Сначала удалим все элементы self.Clear() # Затем заполним try: if is_empty: self.Append(u'') for record in table_data.get('__data__', []): label = self.get_label(record, table_data) self.Append(label) self.SetSelection(0) return True except: log.fatal(u'Ошибка заполнения списка выбора данными') else: log.warning(u'Не определены табличные данные в компоненте <%s>' % self.name) return False
def _gen_enum_sprav(self, prj_res_ctrl=None): """ Генерация ресурса справочника перечисления 1С. @param prj_res_ctrl: Контроллер управления ресурсом проекта. @return: True/False. """ if prj_res_ctrl is None: log.warning( u'Не определен контроллер управления ресурсом проекта. Генерация ресурса таблицы хранения перечислений 1С не взможна.' ) return False sprav_res = self._gen_enum_sprav_res(prj_res_ctrl, name=self.name, description=self.description, uuid=self.uid) res_name = DEFAULT_ENUM_RES # Загрузить ресурс res = prj_res_ctrl.loadRes(res_name, 'mtd') child_names = [child['name'] for child in res['child']] if sprav_res['name'] in child_names: del res['child'][child_names.index(sprav_res['name'])] res['child'].append(sprav_res) # Сохранить ресурс prj_res_ctrl.saveRes(res_name, 'mtd', res) return True
def setCode(self, code): """ Выбранный код. Определяется по подовому полю. """ if code is None: # Да пустое значение тоже можно # устанавливать в контроле self._selected_code = None self.SetValue(u'') return True if self._src_data is not None: record = self._src_data.find_record( normal_data=self.getTableData(), field_name=self.getCodeField(), value=code) if record: self._selected_code = code label = record.get(self.getLabelField(), u'') self.SetValue(label) return True else: log.warning( u'Не определен табличный источник данных в контроле icTableChoiceCtrl <%s>' % self.name) return False
def find_on_event(self, property, property_name=None, property_value=None): """ Открыть модуль менеджера ресурса и промотать до функции - обработчика. @param property: Объект редактируемого свойства. @param property_name: Наименование свойства. @param property_value: Значение свойства. @return: True/False. """ if self.property_edit_manager is None: log.warning(u'Не определен менеджер редактора свойств') return False if self.property_edit_manager.res_tree is None: log.warning(u'Не определен объект дерева ресурса') return False # Основные управляющие объекты tree = self.property_edit_manager.res_tree res_editor = tree.GetResEditor() ide = res_editor.GetIDEInterface() # Пытаемся найти обработчик в коде result = self._find_and_goto_func(tree, ide, res_editor, property_value, signature='GetManager') if not result: result = self._find_and_goto_func(tree, ide, res_editor, property_value, signature='GetWrapper') return result
def doExpression(self, expression, environment=None): """ Выполнить выражение. ВНИМАНИЕ! Все блоки кода вычисляемых тегов выполняются в контексте Memory узла. Поэтому все функции расчетов необходимо расмолагать в менеджере Memory Node. @param expression: Выполняемое выражение. @param environment: Дополнительное окружение выполнения выражения. Если не определено, то берется автоматически заполняемое при помощи getEnv(). @return: Результат выполнения выражения или None в случае ошибки. """ if environment is None: environment = self.getEnv() context = self.GetContext() context.update(environment) tag = context.get('TAG', None) tag_name = tag.getName() if tag else 'default' # ВНИМАНИЕ! Чтобы привязать обработчики к конкретному тегу # необходимо указывать имя тега для выражения. # В данном случае функция-обработчик будет идентифицироваться по имени тега # V result = self.eval_expr(expression, tag_name) if result[0] == coderror.IC_EVAL_OK: return result[1] else: log.warning(u'''ВНИМАНИЕ! Все блоки кода вычисляемых тегов выполняются в контексте Memory узла. Поэтому все функции расчетов необходимо расмолагать в менеджере Memory Node.''') return None