Как запускается программа

Запуск программы происходит в несколько этапов: получение данных с XML, создание классов узлов и соединений, процесс связи узлом между собой и запуск. Для понимания нужна внимательность и знания Объектно-ориентированного программирования в Python.

Получение программы

Перед запуском программы используется Парсер XML, который получает информацию из файла с диаграммой.

file = "script.drawio"
data = parser.parse(file)

Внутри модуля parser находятся функции для определения размера узла, позиции подключения по его описанию. А также некоторое количество шаблонов регулярных выражений, каждый из которых позволяет получить ту или иную информацию из диаграммы.

id_pattern = r"id=\"(?P<id>.*?)\""
node_name_pattern = r"syncNodeName=(?P<node_name>.*?);"

Функция get_ratio позволяет получить размер узла по описанию, а то, как определяется размер узла можно прочитать в обучении создания узлов. Функция get_connectors получает все возможные позиции подключения соединений. Если узел имеет лишь один вход, то функция вернет его относительную позицию на узле. Для больших коннекторов или нескольких функция вернет сразу несколько значений.

Для получения информации с XML используется функция parse. Она пытается распаковать данные из deflate-base64 с помощью модуля coder. Если распаковка успешна или распаковывать не нужно, то программа начинает обрабатывать фигуры внутри диаграммы.

Первоначально происходит поиск (с помощью регулярных выражений) узлов. Если узел найден, то из него забирается информация: наименование узла, его положение на диаграмме, значение из описания узла, изображение и идентификатор. Данная информация сохраняется в список узлов и вскоре будет использована при обработке.

for node in re.finditer(node_pattern, data):
    ...

Далее происходит поиск соединений, эта важная часть программы, так как если неправильно определить откуда и куда идет связь, а также ошибиться в какой именно порт, то программа не будет работать

for wire in re.findall(wire_pattern, data):
    ...

Дополнительно проверяются пользовательские области видимости.

Инициализация узлов и соединений

После получения списка узлов и соединений модуль run создает объекты соединений, узлов, узлов-функций и областей видимости. Перед инициализацией узлов происходит проверка:

Инициализация областей видимости подготавливает программу к изменению области видимости узлов.

Инициализация класса узла происходит путем передачи в конструктор данных полученных из диаграммы. Если данных не хватает, то класс автоматически создаст значение по умолчанию и сохранит в требуемую переменную.

Инициализация соединения позволяет расположить соединение правильно (заменяя вход на выход если они перепутаны), а также определяется порт подключения соединения (на вход и на выход).

После завершения инициализации происходит запуск метода “update_connections” для каждого узла, который позволит связать один узел с другим, записывая в атрибуты inputs и outputs объекта класса ссылки на другие узлы (объекты). Потому из любого узла можно получить подключенный к нему узел.

Запуск программы

Запуск программы является самым простым этапом, так как в нем достаточно каждую итерацию обновлять узлы (запускаю соответствующие состоянию функции). Список всех узлов можно получить через класс base.Node, в котором сохраняются ссылки на экземпляры классов узлов.

for node in base.Node.nodes.values():
    node.update(base.INACTIVE)
for node in base.Node.nodes.values():
    node.update(base.WAITING)
for node in base.Node.nodes.values():
    node.update(base.ACTIVE)
К обучению