Включает режим ускоренной проверки занятости точек при добавлении символов в слой.
Visual Basic:
Sub AddSymbolsStart()
Методы AddSymbol, AddSymbolEx и AddSimpleSymbol не ставят символ в точку, где уже стоит другой символ.
Метод AddSymbolsStart один раз запоминает координаты всех символов слоя — типовых и простых. До вызова метода AddSymbolsFinish занятая точка распознаётся по этому списку, и отказ происходит значительно быстрее. Режим полезен, когда значительная часть добавляемых символов приходится на уже занятые точки — например, при расстановке символов в концах линий сети.
Изменения, сделанные в этом режиме, учитываются сразу: в точку, куда уже поставлен символ, второй не ставится, а после удаления символа методом DeleteElement в его точку можно поставить новый.
Повторный вызов AddSymbolsStart составляет список заново.
Visual Basic:
Sub Layer_AddSymbolsStart 'Берем активный слой карты Set L = Zulu.ActiveMapDoc.Layers.Active 'Собираем концы всех линий, тип и режим берем у первого символа слоя Dim X(), Y() n = 0 TypeID = -1 Set En = L.EnumElements En.MoveFirst Do While Not En.IsEOF If En.GraphType = 2 And TypeID = -1 Then TypeID = En.TypeID ModeNum = En.ModeId ElseIf En.GraphType = 0 Then Set P = En.GetPoints ReDim Preserve X(n + 1), Y(n + 1) X(n) = P.GetX(1) Y(n) = P.GetY(1) X(n + 1) = P.GetX(P.Count) Y(n + 1) = P.GetY(P.Count) n = n + 2 End If En.MoveNext Loop 'Ставим символы в концы линий: в занятые точки символ не добавляется L.AddSymbolsStart Added = 0 For i = 0 To n - 1 If L.AddSymbol(X(i), Y(i), TypeID, ModeNum) <> -1 Then Added = Added + 1 Next L.AddSymbolsFinish MsgBox "Концов линий: " & n & vbCrLf & "Добавлено символов: " & Added End SubPython:
import zulu def Macro_Layer_AddSymbolsStart(): # Берем активный слой карты L = zulu.App.ActiveMapDoc.Layers.Active # Собираем концы всех линий, тип и режим берем у первого символа слоя ends = [] type_id = mode_num = -1 En = L.EnumElements() En.MoveFirst() while not En.IsEOF(): if En.GraphType == 2 and type_id == -1: type_id, mode_num = En.TypeID, En.ModeId elif En.GraphType == 0: P = En.GetPoints() ends.append((P.GetX(1), P.GetY(1))) ends.append((P.GetX(P.Count), P.GetY(P.Count))) En.MoveNext() # Ставим символы в концы линий: в занятые точки символ не добавляется L.AddSymbolsStart() added = 0 for x, y in ends: if L.AddSymbol(x, y, type_id, mode_num) != -1: added += 1 L.AddSymbolsFinish() print("Концов линий:", len(ends)) print("Добавлено символов:", added)