Масштабирует группу выделенных объектов относительно заданного центра с заданными коэффициентами масштабирования по осям.
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 SubPython:
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))