Перемещение или дублирование группы выделенных объектов слоя.
Visual Basic:
Function MoveSelection(shiftX As Double, shiftY As Double, KeepLink As Boolean, Clone As Boolean) As Long
shiftX - смещение по X.
shiftY - смещение по Y.
KeepLink - признак сохранения связности (если такая была) перемещаемых объектов с объектами, оставшимися на месте.
Clone - признак копирования эелементов группы на новом месте, определяемом заданным смещением.
Переносятся объекты, набранные в выделение слоя (Selection); смещение задается в координатах слоя. Метод возвращает 0 и при удачном переносе, и при пустом выделении, так что по возвращаемому значению судить об успехе нельзя - проверять нужно сами объекты. Выделение после вызова сохраняется.
При Clone = True исходные объекты остаются на месте, а на новом появляются их копии: объектов в слое становится больше, выделенным остается исходный объект. Повторный вызов делает еще одну копию, снова отсчитывая смещение от исходного объекта.
Копирование работает только при KeepLink = False: если сохранять связность, копия не создается и объект просто переносится, сколько бы раз вызов ни повторяли.
Связность проверяется на узле с участком: при KeepLink = True вслед за узлом уходит и конец участка (вершина участка получает новую координату узла), при False участок остается на месте, а узел уезжает от него.
Пример добавляет в слой два своих символа в стороне от данных, переносит их, делает копию со смещением и убирает за собой все, что добавил.
Visual Basic:
Sub Layer_MoveSelection 'Берем активный слой карты Set L = Zulu.ActiveMapDoc.Layers.Active Set R = L.GetBoundsRectangle nBefore = L.GetLargestID 'Два своих символа за краем данных слоя X0 = R.Xmax + 100 Y0 = R.Ymin KeyA = L.AddSymbol(X0, Y0, 2, 1) KeyB = L.AddSymbol(X0 + 100, Y0, 2, 1) L.Selection.Clear L.Selection.AddElem KeyA L.Selection.AddElem KeyB 'Переносим выделенное на 50 по X и 25 по Y L.MoveSelection 50, 25, False, False S = "Символ " & KeyA & " теперь в " & L.Elements.Item(KeyA).BasePoint.X & "; " & _ L.Elements.Item(KeyA).BasePoint.Y S = S & vbCrLf & "объектов в слое: " & L.ElementKeys.Count 'Делаем копию выделенного выше по Y L.MoveSelection 0, 200, False, True 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_MoveSelection(): # Берем активный слой карты L = zulu.App.ActiveMapDoc.Layers.Active R = L.GetBoundsRectangle() n_before = L.GetLargestID() # Два своих символа за краем данных слоя x0 = R.Xmax + 100 y0 = R.Ymin key_a = L.AddSymbol(x0, y0, 2, 1) key_b = L.AddSymbol(x0 + 100, y0, 2, 1) L.Selection.Clear() L.Selection.AddElem(key_a) L.Selection.AddElem(key_b) # Переносим выделенное на 50 по X и 25 по Y L.MoveSelection(50, 25, False, False) p = L.Elements.Item(key_a).BasePoint print("Символ", key_a, "теперь в", p.X, ";", p.Y) print("объектов в слое:", L.ElementKeys.Count) # Делаем копию выделенного выше по Y L.MoveSelection(0, 200, False, True) print("после копирования:", L.ElementKeys.Count) # Убираем за собой все, что добавили p = None keys = L.ElementKeys for i in range(keys.Count, 0, -1): if keys.Item(i) > n_before: L.DeleteElement(keys.Item(i))