Сокращает чило вершин полигонов и полилиний выделенных объектов слоя при помощи алгоритма Рамера — Дугласа — Пекера
Visual Basic:
Function SimplifySelectionGeometry(Tolerance As Double) As Long
Tolerance - допуск в см, параметр алгоритма
Упрощаются объекты, набранные в выделение слоя (Selection). Допуск - это наибольшее расстояние, на которое упрощенная линия может отойти от исходной: вершины, отклоняющиеся меньше чем на Tolerance, выбрасываются.
Вершины, отклоняющиеся от линии меньше чем на допуск, выбрасываются: если допуск меньше отклонений, линия не меняется, если больше - уходят все промежуточные вершины. Две крайние вершины остаются всегда, поэтому дальше увеличивать допуск бесполезно.
Метод возвращает 0 и при упрощении, и при пустом выделении, поэтому судить о результате нужно по числу вершин - NumTops у PolyLine объекта.
Пример добавляет в слой свою ломаную-зигзаг за краем данных, упрощает ее и убирает за собой.
Visual Basic:
Sub Layer_SimplifySelectionGeometry 'Берем активный слой карты Set L = Zulu.ActiveMapDoc.Layers.Active Set R = L.GetBoundsRectangle nBefore = L.GetLargestID 'Своя ломаная из 21 вершины с отклонениями в 2 см Set PL = CreateObject("ZuluLib.PolyLine") For i = 0 To 20 PL.AddPoint R.Xmax + 100 + i * 10, R.Ymin + (i Mod 2) * 2 Next Key = L.AddPolyLine(PL, CreateObject("ZuluLib.ElemStyle"), 6, 1) S = "Вершин было: " & L.Elements.Item(Key).PolyLine.NumTops 'Упрощаем с допуском 5 см L.Selection.Clear L.Selection.AddElem Key L.SimplifySelectionGeometry 5 S = S & vbCrLf & "стало: " & L.Elements.Item(Key).PolyLine.NumTops 'Убираем за собой все, что добавили L.Selection.Clear 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_SimplifySelectionGeometry(): # Берем активный слой карты L = zulu.App.ActiveMapDoc.Layers.Active R = L.GetBoundsRectangle() n_before = L.GetLargestID() # Своя ломаная из 21 вершины с отклонениями в 2 см pl = zulu.PolyLine() for i in range(21): pl.AddPoint(R.Xmax + 100 + i * 10, R.Ymin + (i % 2) * 2) key = L.AddPolyLine(pl, zulu.ElemStyle(), 6, 1) print("Вершин было:", L.Elements.Item(key).PolyLine.NumTops) # Упрощаем с допуском 5 см L.Selection.Clear() L.Selection.AddElem(key) L.SimplifySelectionGeometry(5) print("стало:", L.Elements.Item(key).PolyLine.NumTops) # Убираем за собой все, что добавили L.Selection.Clear() keys = L.ElementKeys for i in range(keys.Count, 0, -1): if keys.Item(i) > n_before: L.DeleteElement(keys.Item(i))