RotateSelection method (Layer)

Поворачивает группу выделенных объектов относительно заданного центра на заданный угол.

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

Layer

Синтаксис:

Visual Basic:

Function RotateSelection(Xc As Double, Yc As Double, AngleAs Double, Flags As Long) As Long

Xc, Yc - координаты центра поворота

Angle - угол поворота в градусах против часовой стрелки

Flags - флаги, зарезервирован, должен быть 0

Описание:

Поворачиваются объекты, набранные в выделение слоя (Selection); центр задается в координатах слоя. Метод возвращает 0 и при удачном повороте, и при пустом выделении, так что судить об успехе по ответу нельзя - проверять нужно сами объекты. Выделение после вызова сохраняется, а значение Flags на результат не влияет: 0 и 1 дали одно и то же.

Угол отсчитывается против часовой стрелки так, как карта видна на экране. В координатах слоя это выглядит иначе, потому что ось X направлена на север (вверх на карте), а Y - на восток (вправо): точка, лежащая от центра на оси X, после поворота на 90 градусов оказывается на оси Y с обратным знаком.

Пример:

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

Visual Basic:

Sub Layer_RotateSelection
'Берем активный слой карты
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, 2, 1)
L.Selection.Clear
L.Selection.AddElem KeyA
L.Selection.AddElem KeyB
'Поворачиваем пару вокруг первого символа на 90 градусов
L.RotateSelection X0, Y0, 90, 0
Set P = L.Elements.Item(KeyB).BasePoint
S = "Второй символ был в " & (X0 + 200) & "; " & Y0
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_RotateSelection():
    # Берем активный слой карты
    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, 2, 1)
    L.Selection.Clear()
    L.Selection.AddElem(key_a)
    L.Selection.AddElem(key_b)
    # Поворачиваем пару вокруг первого символа на 90 градусов
    L.RotateSelection(x0, y0, 90, 0)
    p = L.Elements.Item(key_b).BasePoint
    print("Второй символ был в", x0 + 200, ";", y0)
    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))