ShortWay method (Layer)

Находит кратчайший путь от узла до узла. Возвращает коллекцию ElementKeys, содержащую цепочку ключей объектов, вошедших в найденный путь.

Применяется к:

Layer

Синтаксис:

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 Sub

Python:

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))