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)