MoveSelection method (Layer)

Перемещение или дублирование группы выделенных объектов слоя.

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

Layer

Синтаксис:

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 Sub

Python:

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))