JoinSelectedElements method (Layer)

Объединяет элементы, входящие в группу слоя. При этом стиль и ID объединенного объекта остаются за элементом, входящим в мишень. Для этого элемент мишени должен быть единственным.

Вызов этого метода аналогичен выполнению команды системы Zulu Правка\Объединить объекты.

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

Layer

Синтаксис:

Visual Basic:

Sub JoinSelectedElements(param as long)

param - параметр, определяющий характер площадный объединения объектов:

0 - удалять найденные общие границ полигонов.

1 - оставлять найденные общие границ полигонов.

-1 - спрашивать пользователя о принятии решения по поводу найденных общих границ.

Описание:

Объединяемые объекты набираются в выделение слоя (Selection), а тот из них, чьи ID и стиль достанутся объединенному объекту, - в мишень (TargetSelection). Остальные объекты из слоя исчезают, так что объектов в слое становится меньше. После вызова и выделение, и мишень пусты.

Два участка с общим концом объединяются в один многолинейный объект: длина складывается, а PolyLine отдает только первую часть - всю геометрию дает PolyPolyLine.

Площадные объекты объединяются по площади: у смежных объектов общая граница пропадает, у перекрывающихся получается их объединение, а у разнесенных - один объект из нескольких контуров. Значения param 0 и 1 дают одинаковый результат. Значение -1 выводит вопрос пользователю, поэтому для макроса, работающего без человека, оно не годится.

Пример:

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

Visual Basic:

Sub Layer_JoinSelectedElements
'Берем активный слой карты
Set L = Zulu.ActiveMapDoc.Layers.Active
Set R = L.GetBoundsRectangle
nBefore = L.GetLargestID
'Два своих участка с общим концом за краем данных слоя
X0 = R.Xmax + 100
Y0 = R.Ymin
Set PL = CreateObject("ZuluLib.PolyLine")
PL.AddPoint X0, Y0
PL.AddPoint X0 + 100, Y0
KeyA = L.AddPolyLine(PL, CreateObject("ZuluLib.ElemStyle"), 6, 1)
Set PL = CreateObject("ZuluLib.PolyLine")
PL.AddPoint X0 + 100, Y0
PL.AddPoint X0 + 200, Y0
KeyB = L.AddPolyLine(PL, CreateObject("ZuluLib.ElemStyle"), 6, 1)
'Объединяем их: ID и стиль останутся за участком из мишени
L.Selection.Clear
L.Selection.AddElem KeyA
L.Selection.AddElem KeyB
L.TargetSelection.Clear
L.TargetSelection.AddElem KeyA
L.JoinSelectedElements 0
Set E = L.Elements.Item(KeyA)
S = "Объединенный объект: " & KeyA
S = S & vbCrLf & "длина: " & E.Length
S = S & vbCrLf & "частей: " & E.PolyPolyLine.Count
'Убираем за собой все, что добавили
Set E = Nothing
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_JoinSelectedElements():
    # Берем активный слой карты
    L = zulu.App.ActiveMapDoc.Layers.Active
    R = L.GetBoundsRectangle()
    n_before = L.GetLargestID()
    # Два своих участка с общим концом за краем данных слоя
    x0 = R.Xmax + 100
    y0 = R.Ymin
    pl = zulu.PolyLine()
    pl.AddPoint(x0, y0)
    pl.AddPoint(x0 + 100, y0)
    key_a = L.AddPolyLine(pl, zulu.ElemStyle(), 6, 1)
    pl = zulu.PolyLine()
    pl.AddPoint(x0 + 100, y0)
    pl.AddPoint(x0 + 200, y0)
    key_b = L.AddPolyLine(pl, zulu.ElemStyle(), 6, 1)
    # Объединяем их: ID и стиль останутся за участком из мишени
    L.Selection.Clear()
    L.Selection.AddElem(key_a)
    L.Selection.AddElem(key_b)
    L.TargetSelection.Clear()
    L.TargetSelection.AddElem(key_a)
    L.JoinSelectedElements(0)
    e = L.Elements.Item(key_a)
    print("Объединенный объект:", key_a)
    print("длина:", e.Length)
    print("частей:", e.PolyPolyLine.Count)
    # Убираем за собой все, что добавили
    e = None
    keys = L.ElementKeys
    for i in range(keys.Count, 0, -1):
        if keys.Item(i) > n_before:
            L.DeleteElement(keys.Item(i))