AddSymbolsStart method (Layer)

Включает режим ускоренной проверки занятости точек при добавлении символов в слой.

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

Layer

Синтаксис:

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 Sub

Python:

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)