Находит кратчайший путь от узла до узла. Возвращает коллекцию ElementKeys, содержащую цепочку ключей объектов, вошедших в найденный путь.
Visual Basic:
Function ShortWay(BeginID As Long, EndID As Long) As ElementKeys
BeginID - ID начального узла.
EndID - ID конечного узла.
Путь возвращается цепочкой ключей от начального узла до конечного: в ней чередуются узлы и участки, а сами концы входят в набор. Вызов в обратную сторону дает ту же цепочку, перечисленную от другого конца.
Набор пуст, если пути нет, если начало и конец совпадают, если такого ключа в слое нет или если вместо узла передан участок. Исключения при этом не возникает - проверять нужно Count. Пустой ответ - обычное дело, если сеть слоя состоит из несвязанных частей.
Подготовка сети методом NetWorkDataPrepare не требуется: до и после нее ответ одинаковый. Путь через несколько промежуточных точек строит метод GetShortWay, а дерево путей от одного узла ко всем - GetShortWayTree.
Когда путей нужно много, поиск заключают между ShortWayStart и ShortWayFinish.
Sub Layer_ShortWay 'Берем активный слой тепловой сети Set L = Zulu.ActiveMapDoc.Layers.Active 'Первый узел сети берем началом пути Set Nodes = L.NetworkObjects(1) A = Nodes.Key(1) 'Ищем ближайший узел, до которого путь есть: не все узлы связаны B = 0 For i = 2 To Nodes.Count If B = 0 Then Set Keys = L.ShortWay(A, Nodes.Key(i)) If Keys.Count > 0 Then B = Nodes.Key(i) End If Next Set Keys = L.ShortWay(A, B) S = "Путь от узла " & A & " до узла " & B S = S & vbCrLf & "объектов в пути: " & Keys.Count For i = 1 To Keys.Count If i <= 5 Then S = S & vbCrLf & " ключ " & Keys.Item(i) Next MsgBox S End SubPython:
import zulu def Macro_Layer_ShortWay(): # Берем активный слой тепловой сети L = zulu.App.ActiveMapDoc.Layers.Active # Первый узел сети берем началом пути nodes = L.NetworkObjects(1) a = nodes.Key(1) # Ищем ближайший узел, до которого путь есть: не все узлы связаны b = 0 for i in range(2, nodes.Count + 1): if b == 0 and L.ShortWay(a, nodes.Key(i)).Count > 0: b = nodes.Key(i) keys = L.ShortWay(a, b) print("Путь от узла", a, "до узла", b) print("объектов в пути:", keys.Count) for i in range(1, min(keys.Count, 5) + 1): print(" ключ", keys.Item(i))