ScaleSelection method (Layer)

Масштабирует группу выделенных объектов относительно заданного центра с заданными коэффициентами масштабирования по осям.

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

Layer

Синтаксис:

Visual Basic:

Function ScaleSelection(Xc As Double, Yc As Double, KxAs Double, Ky As Double, KeepLink As Boolean) As Long

Xc, Yc - координаты центра масштабирования

Kx, Ky - коэффициенты масштабирования по осям X и Y

KeepLink - признак сохранения связности (если такая была) масштабируемых объектов с объектами, оставшимися на месте

Описание:

Масштабируются объекты, набранные в выделение слоя (Selection). Расстояние каждой точки от центра умножается на коэффициент своей оси: при Kx = Ky = 2 объекты удаляются от центра вдвое, а коэффициент 1 оставляет координату по своей оси без изменений. Сам центр остается на месте.

Метод возвращает 0 и при удачном масштабировании, и при пустом выделении, так что судить об успехе по ответу нельзя - проверять нужно сами объекты. Выделение после вызова сохраняется.

Тем же способом объекты переносят (MoveSelection) и поворачивают (RotateSelection).

Пример:

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

Visual Basic:

Sub Layer_ScaleSelection
'Берем активный слой карты
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 + 200, Y0 + 100, 2, 1)
L.Selection.Clear
L.Selection.AddElem KeyA
L.Selection.AddElem KeyB
'Растягиваем пару вдвое относительно первого символа
L.ScaleSelection X0, Y0, 2, 2, False
Set P = L.Elements.Item(KeyB).BasePoint
S = "Второй символ был в " & (X0 + 200) & "; " & (Y0 + 100)
S = S & vbCrLf & "стал в " & P.X & "; " & P.Y
'Убираем за собой все, что добавили
Set P = 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_ScaleSelection():
    # Берем активный слой карты
    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 + 200, y0 + 100, 2, 1)
    L.Selection.Clear()
    L.Selection.AddElem(key_a)
    L.Selection.AddElem(key_b)
    # Растягиваем пару вдвое относительно первого символа
    L.ScaleSelection(x0, y0, 2, 2, False)
    p = L.Elements.Item(key_b).BasePoint
    print("Второй символ был в", x0 + 200, ";", y0 + 100)
    print("стал в", p.X, ";", p.Y)
    # Убираем за собой все, что добавили
    p = None
    keys = L.ElementKeys
    for i in range(keys.Count, 0, -1):
        if keys.Item(i) > n_before:
            L.DeleteElement(keys.Item(i))