Объединяет элементы, входящие в группу слоя. При этом стиль и ID объединенного объекта остаются за элементом, входящим в мишень. Для этого элемент мишени должен быть единственным.
Вызов этого метода аналогичен выполнению команды системы Zulu Правка\Объединить объекты.
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 SubPython:
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))