Разбивает участок с указанным ElemID символьным объектом.
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 SubPython:
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))