InsertSymbol method (Layer)

Разбивает участок с указанным ElemID символьным объектом.

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

Layer

Синтаксис:

Visual Basic:

Function InsertSymbol(ElemID As Long, Num As Long, InsType As Long, X As Double, Y As Double, TypeID As Long, ModeNum As Long) As Long

ElemID - ID разбиваемого участка.

Num - номер элемента ломаной по которому происходит разбиение (нумерация с нуля).

InsType - способ разбиения участка:

0 - разбивается отрезок ломаной с номером Num

1 - разбивается в точке перелома с номером Num

X, Y - координаты добавляемого символа (только для InsType = 0)

TypeID - ID типа символьного объекта, или ID существующего символьного объекта при ModeNum = -1

ModeNum - номер режима (нумерация с единицы)

Описание:

Если параметр ModeNum больше нуля, то участок разбивается новым типовым символьным объектом с типом TypeID и режимом ModeNum. Метод возвращает ID этого добавленного символа, а в случае неудачи - -1.

Если параметр ModeNum равен -1, то участок разбивается существующим символьным объектом с ID, заданным в параметре TypeID. При этом существующий символьный объект перемещается в точку с координатами (X,Y), либо в вершину полилинии в случае разбиения по вершине ломаной; метод возвращает 0.

Разбитый участок остается в слое со своим прежним ID, а вторая его половина получает новый ID, так что число объектов слоя увеличивается на два: на новую половину участка и на символ. Узнать наибольший ID до и после разбиения позволяет метод GetLargestID.

Пример:

Пример добавляет в слой собственный участок в стороне от данных слоя, разбивает его символом и убирает за собой добавленные объекты.

Visual Basic:

Sub Layer_InsertSymbol
'Берем активный слой карты
Set L = Zulu.ActiveMapDoc.Layers.Active
Set R = L.GetBoundsRectangle
nBefore = L.GetLargestID
'Свой участок за краем данных слоя
X0 = R.Xmax + 100
Y0 = R.Ymin
Y1 = R.Ymin + 200
Set PL = CreateObject("ZuluLib.PolyLine")
PL.AddPoint X0, Y0
PL.AddPoint X0, Y1
KeyLine = L.AddPolyLine(PL, CreateObject("ZuluLib.ElemStyle"), 6, 1)
'Разбиваем первый отрезок участка символом типа 2 режима 1
KeySym = L.InsertSymbol(KeyLine, 0, 0, X0, (Y0 + Y1) / 2, 2, 1)
S = "Участок: " & KeyLine & vbCrLf & "символ: " & KeySym
S = S & vbCrLf & "объектов в слое: " & L.ElementKeys.Count
'Убираем за собой все, что добавили
Set Keys = L.ElementKeys
For i = Keys.Count To 1 Step -1
  If Keys.Item(i) > nBefore Then L.DeleteElement Keys.Item(i)
Next
MsgBox S
End Sub

Python:

import zulu

def Macro_Layer_InsertSymbol():
    # Берем активный слой карты
    L = zulu.App.ActiveMapDoc.Layers.Active
    R = L.GetBoundsRectangle()
    n_before = L.GetLargestID()
    # Свой участок за краем данных слоя
    x0 = R.Xmax + 100
    y0 = R.Ymin
    y1 = R.Ymin + 200
    pl = zulu.PolyLine()
    pl.AddPoint(x0, y0)
    pl.AddPoint(x0, y1)
    key_line = L.AddPolyLine(pl, zulu.ElemStyle(), 6, 1)
    # Разбиваем первый отрезок участка символом типа 2 режима 1
    key_sym = L.InsertSymbol(key_line, 0, 0, x0, (y0 + y1) / 2, 2, 1)
    print("Участок:", key_line, "символ:", key_sym)
    print("объектов в слое:", L.ElementKeys.Count)
    # Убираем за собой все, что добавили
    keys = L.ElementKeys
    for i in range(keys.Count, 0, -1):
        if keys.Item(i) > n_before:
            L.DeleteElement(keys.Item(i))