Из слоя удаляется символьный объект с указанным ElemID, если он соединен с двумя участками. Участки объединяются в один объект.
Visual Basic:
Function ExcludeSymbol(ElemID As Long) As Long
ElemID - ID удаляемого символьного объекта.
Удаление символа происходит, если он связан с двумя участками. При этом участки объединяются в один участок, тем самым сохраняя связность сети. Объединенный участок получает ID одного из исходных участков. Если узел не может быть удален, метод возвращает -1.
При успешном удалении метод возвращает 0: символ и один из участков исчезают из слоя, а оставшийся участок продолжается до конца удалённого.
-1 метод возвращает, если к символу подключён один участок или больше двух, если ElemID — ключ линии или ключ, которого в слое нет, а также для простого символа между простыми линиями: метод работает с типовыми объектами сети, связанными между собой.
Visual Basic:
Sub Layer_ExcludeSymbol 'Берем активный слой карты Set L = Zulu.ActiveMapDoc.Layers.Active 'Тип и режим символа и участка берем у первых таких объектов слоя NodeType = -1 LineType = -1 Set En = L.EnumElements En.MoveFirst Do While Not En.IsEOF If En.GraphType = 2 And NodeType = -1 Then NodeType = En.TypeID NodeMode = En.ModeId End If If En.GraphType = 0 And LineType = -1 Then LineType = En.TypeID LineMode = En.ModeId End If En.MoveNext Loop If NodeType = -1 Or LineType = -1 Then MsgBox "В слое нет типовых символов или линий" Exit Sub End If 'Правее слоя строим три узла и два участка между ними Set R = L.GetBoundsRectangle D = (R.Xmax - R.Xmin) / 10 X = R.Xmax + D Y = R.Ymin L.AddSymbol X, Y, NodeType, NodeMode Middle = L.AddSymbol(X + D, Y, NodeType, NodeMode) L.AddSymbol X + 2 * D, Y, NodeType, NodeMode Set St = CreateObject("ZuluLib.ElemStyle") Set PL = CreateObject("ZuluLib.PolyLine") PL.AddPoint X, Y PL.AddPoint X + D, Y Line1 = L.AddPolyLine(PL, St, LineType, LineMode) Set PL = CreateObject("ZuluLib.PolyLine") PL.AddPoint X + D, Y PL.AddPoint X + 2 * D, Y Line2 = L.AddPolyLine(PL, St, LineType, LineMode) 'Исключаем средний узел: участки сливаются в один MsgBox "Участки " & Line1 & " и " & Line2 & vbCrLf & _ "ExcludeSymbol(" & Middle & ") = " & L.ExcludeSymbol(Middle) End SubPython:
import zulu def Macro_Layer_ExcludeSymbol(): # Берем активный слой карты L = zulu.App.ActiveMapDoc.Layers.Active # Тип и режим символа и участка берем у первых таких объектов слоя node = line = None En = L.EnumElements() En.MoveFirst() while not En.IsEOF(): if En.GraphType == 2 and node is None: node = (En.TypeID, En.ModeId) if En.GraphType == 0 and line is None: line = (En.TypeID, En.ModeId) En.MoveNext() if node is None or line is None: print("В слое нет типовых символов или линий") return # Правее слоя строим три узла и два участка между ними R = L.GetBoundsRectangle() d = (R.Xmax - R.Xmin) / 10 x = R.Xmax + d y = R.Ymin L.AddSymbol(x, y, node[0], node[1]) middle = L.AddSymbol(x + d, y, node[0], node[1]) L.AddSymbol(x + 2 * d, y, node[0], node[1]) lines = [] for x0 in (x, x + d): PL = zulu.PolyLine() PL.AddPoint(x0, y) PL.AddPoint(x0 + d, y) lines.append(L.AddPolyLine(PL, zulu.ElemStyle(), line[0], line[1])) # Исключаем средний узел: участки сливаются в один print("Участки", lines[0], "и", lines[1]) print("ExcludeSymbol(", middle, ") =", L.ExcludeSymbol(middle))