Поворачивает группу выделенных объектов относительно заданного центра на заданный угол.
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 SubPython:
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))