Добавляет в группу объекты слоя, расположенные относительно составного контура по заданному критерию.
Visual Basic:
Sub AddByPolyContour(PolyC As PolyContour, Crit As eCrossCriteria)
PolyC - составной контур в координатах слоя.
Crit - критерий взаимного расположения объекта и контура.
Метод работает так же, как AddByContour, и принимает те же значения Crit, но область задается составным контуром: контур, лежащий внутри другого, становится вырезом, и объекты в вырезе считаются лежащими вне области. Найденные объекты добавляются к тем, что уже есть в группе. Объект Contour метод не принимает (ошибка «Type mismatch», в Python - TypeError).
Пример выделяет в активном слое объекты, целиком лежащие в его габаритах за исключением центральной части.
Visual Basic:
Sub Selection_AddByPolyContour Const eFullyInside = 1 'Берем активный слой карты, его группу и габариты Set L = Zulu.ActiveMapDoc.Layers.Active Set S = L.Selection Set R = L.GetBoundsRectangle DX = (R.Xmax - R.Xmin) / 4 DY = (R.Ymax - R.Ymin) / 4 'Внешний контур - габариты слоя Set C1 = CreateObject("ZuluLib.Contour") C1.AddPoint R.Xmin, R.Ymin C1.AddPoint R.Xmax, R.Ymin C1.AddPoint R.Xmax, R.Ymax C1.AddPoint R.Xmin, R.Ymax 'Вырез - центральная часть Set C2 = CreateObject("ZuluLib.Contour") C2.AddPoint R.Xmin + DX, R.Ymin + DY C2.AddPoint R.Xmax - DX, R.Ymin + DY C2.AddPoint R.Xmax - DX, R.Ymax - DY C2.AddPoint R.Xmin + DX, R.Ymax - DY Set PC = CreateObject("ZuluLib.PolyContour") PC.AddContour C1 PC.AddContour C2 S.Clear S.AddByPolyContour PC, eFullyInside MsgBox "Объектов вне центральной части: " & S.ElementKeys.Count & " из " & L.ElementKeys.Count S.Clear End SubPython:
import zulu eFullyInside = 1 def Macro_Selection_AddByPolyContour(): # Берем активный слой карты, его группу и габариты L = zulu.App.ActiveMapDoc.Layers.Active S = L.Selection R = L.GetBoundsRectangle() dx = (R.Xmax - R.Xmin) / 4 dy = (R.Ymax - R.Ymin) / 4 # Внешний контур - габариты слоя C1 = zulu.Contour() for px, py in ((R.Xmin, R.Ymin), (R.Xmax, R.Ymin), (R.Xmax, R.Ymax), (R.Xmin, R.Ymax)): C1.AddPoint(px, py) # Вырез - центральная часть C2 = zulu.Contour() for px, py in ((R.Xmin + dx, R.Ymin + dy), (R.Xmax - dx, R.Ymin + dy), (R.Xmax - dx, R.Ymax - dy), (R.Xmin + dx, R.Ymax - dy)): C2.AddPoint(px, py) PC = zulu.PolyContour() PC.AddContour(C1) PC.AddContour(C2) S.Clear() S.AddByPolyContour(PC, eFullyInside) print("Объектов вне центральной части:", S.ElementKeys.Count, "из", L.ElementKeys.Count) S.Clear()