Моделирует переключение на сети и возвращает результат моделируемого переключения.
Visual Basic:
Function NetworkSwitchAnalyze(States As ZElemsStates, nFlags As Long) As IZSwitchStates
States - коллекция переключаемых объектов
nFlags - флаги определяющие, какие типы объектов должны попадать в ответ: 1 - потребители, 2 - все узловые объекты, 4 - участки
На входе метода коллекция с объектами, которые будут участвовать в переключении. Элемент коллекции должен содержать ID объекта (отсекающего устройства или участка) и режим в который он должен перейти в результате переключения.
На выходе коллекция IZSwitchStates, содержащая объекты, которые изменят свое состояние по отношению к источникам в результате моделируемого переключения.
Входная коллекция набирается методами AddItem(ID, режим) или AddTypeModeItem(ID, тип, режим) - результат тот же. Ответ читается по номеру от 0 до GetCount - 1: ID объекта дает GetID, а его новое состояние - GetState.
Потребители попадают в ответ всегда, даже при nFlags = 0; флаг 2 добавляет к ним остальные узлы, флаг 4 - участки.
Сам слой метод не меняет - это только прикидка. Чтобы переключение состоялось, режимы задают методом SetModesByElemsStates, а сеть пересчитывают методом NetWorkRecalc.
В макросах на python GetState возвращает None: значения перечислений, отданные методом, в модуль zulu не попадают. Идентификаторы объектов при этом читаются как обычно, поэтому на python берут GetID, а состояние смотрят из VBScript.
Пример прикидывает, что будет, если закрыть первую задвижку слоя, и выделяет на карте объекты, которые изменят состояние. Сама задвижка при этом не переключается.
Visual Basic:
Sub Layer_NetworkSwitchAnalyze 'Берем активный слой карты Set L = Zulu.ActiveMapDoc.Layers.Active 'Ищем первую задвижку (тип 5) Set Keys = L.ElementKeys Valve = -1 For i = 1 To Keys.Count If L.Elements.Item(Keys.Item(i)).TypeID = 5 And Valve = -1 Then Valve = Keys.Item(i) Next 'Моделируем ее перевод в режим 2 с выводом узлов и участков Set Elems = CreateObject("ZuluLib.ZElemsStates") Elems.AddItem Valve, 2 Set States = L.NetworkSwitchAnalyze(Elems, 2 + 4) S = "Задвижка " & Valve & vbCrLf & "изменят состояние: " & States.GetCount & " объектов" 'Показываем их на карте и перечисляем первые три L.Selection.Clear For i = 0 To States.GetCount - 1 L.Selection.AddElem States.GetID(i) If i < 3 Then S = S & vbCrLf & "объект " & States.GetID(i) & ", состояние " & States.GetState(i) Next MsgBox S End SubPython:
import zulu def Macro_Layer_NetworkSwitchAnalyze(): # Берем активный слой карты L = zulu.App.ActiveMapDoc.Layers.Active # Ищем первую задвижку (тип 5) keys = L.ElementKeys valve = -1 for i in range(1, keys.Count + 1): if L.Elements.Item(keys.Item(i)).TypeId == 5 and valve == -1: valve = keys.Item(i) # Моделируем ее перевод в режим 2 с выводом узлов и участков elems = zulu.ZElemsStates() elems.AddItem(valve, 2) states = L.NetworkSwitchAnalyze(elems, 2 + 4) print("Задвижка", valve) print("изменят состояние:", states.GetCount(), "объектов") # Показываем их на карте и перечисляем первые три # (состояние из python не прочитать - GetState отдает None) L.Selection.Clear() for i in range(states.GetCount()): L.Selection.AddElem(states.GetID(i)) if i < 3: print("объект", states.GetID(i))