From 2d61817489637ef535a176606d686e91fc683856 Mon Sep 17 00:00:00 2001 From: Iaroshuk Dmitrii Date: Thu, 10 Sep 2026 11:35:29 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9F=D0=BE=D0=BF=D1=80=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=20=D1=81=D0=BA=D1=80=D0=B8=D0=BF=D1=82=20=D0=B2=20?= =?UTF-8?q?=D1=87=D0=B0=D1=81=D1=82=D0=B8=20=D1=8D=D0=BA=D1=81=D0=BF=D0=BE?= =?UTF-8?q?=D1=80=D1=82=D0=B0=20=D0=BE=D0=B1=D1=89=D0=B8=D1=85=20=D1=84?= =?UTF-8?q?=D0=B0=D0=B9=D0=BB=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Скрипты/export_plc_src.py | 27 ++++++++++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) diff --git a/Скрипты/export_plc_src.py b/Скрипты/export_plc_src.py index d6bb5e8..98b81e6 100644 --- a/Скрипты/export_plc_src.py +++ b/Скрипты/export_plc_src.py @@ -269,6 +269,25 @@ def is_device_node(obj): return False +class NonDeviceRoot(object): + """Обёртка вокруг proj, отдающая только НЕ-device top-level узлы + (Enums, Structs, __VisualizationStyle и т.п.). + + Нужна из-за того, что walk() при входе в рекурсию не добавляет имя + самого переданного node в current_path -- в путь попадают только имена + ЕГО детей. Раньше walk() вызывался прямо на каждом top-level non-device + child'е (например, на папке Enums), поэтому имя "Enums" терялось и все + объекты внутри неё экспортировались с Path: -, хотя реально лежат на + уровень глубже. Обернув proj и вызвав walk() один раз на обёртке, + получаем, что "Enums" воспринимается как обычный child и попадает + в путь корректно.""" + def __init__(self, proj): + self._proj = proj + + def get_children(self, sort): + return [c for c in self._proj.get_children(sort) if not is_device_node(c)] + + def walk(node, dirs, exported, project_name, device_name, current_path=None, parent_pou_path=None): """current_path -- список имён родителей от корня устройства (без учёта device_name самого), накапливается по мере рекурсивного спуска по реальному дереву проекта -- поэтому Path @@ -388,9 +407,11 @@ else: walk(device, dev_dirs, exported, project_name, device_name) other_dirs = make_dirs(os.path.join(OUTPUT_ROOT, "_common")) - for child in top_children: - if not is_device_node(child): - walk(child, other_dirs, exported, project_name, "-") + # Обходим НЕ-device top-level узлы (Enums, Structs, ...) через + # обёртку NonDeviceRoot одним вызовом walk(), а не по одному + # per-child -- иначе имя самой папки (напр. "Enums") теряется + # и не попадает в Path (см. комментарий к NonDeviceRoot выше). + walk(NonDeviceRoot(proj), other_dirs, exported, project_name, "-") else: print("Устройства верхнего уровня не найдены, экспорт без разбивки по папкам.") dirs = make_dirs(OUTPUT_ROOT)