Возвращает коллекцию ElementKeyPairs пар ключей объектов двух слоев, удовлетворивших заданным критериям пересечения.
Ответ содержит набор пар ключей, где первый ключ - это ключ объекта исходного слоя, а второй ключ - объекта второго слоя, в который попал объект исходного слоя.
Visual Basic:
Function IntersectByLayer(Layer As Layer, Crit As eCrossCriteria, SelectedOnly As Boolean, CrossType As Long, nMode As Long, flags As Long) As ElementKeyPairs
Layer - слой для пересечения с данным слоем.
Crit - критерий пересечения может принимать значения из набора eCrossCriteria.
SelectedOnly - анализировать только выделенные объекты исходного слоя.
CrossType - ID типа объектов исходного слоя, участвующих в анализе:
-1 - все объекты
-2 - только площадные
-3 - только символьные
-4 - только линейные
-5 - только текстовые
-6 - все типизированные.
nMode - номер режима объектов, участвующих в анализе ( -1 для любых режимов).
flags - флаги.
1 - пересекать только с выделенными объектами второго слоя.
Пары читаются по номеру от 0 до Count - 1: ключ объекта исходного слоя дает KeyFirst, ключ объекта второго слоя - KeySecond.
Значения CrossType от -2 до -5 отбирают примитивы соответствующего вида, поэтому у слоя, все объекты которого типовые, они дают пустой ответ; для такого слоя годятся -1 и -6.
Вторым слоем может быть и слой в памяти, созданный методом AddInMemory: так удобно пересекать слой с областью, построенной на ходу.
Пересечение слоя с областью, которая строится тут же в слое в памяти.
Visual Basic:
Sub Layer_IntersectByLayer 'Берем карту и ее активный слой Set M = Zulu.ActiveMapDoc Set L = M.Layers.Active Set R = L.GetBoundsRectangle 'Кладем в слой в памяти контур на левую нижнюю четверть слоя Idx = M.Layers.AddInMemory("Область") Set N = M.Layers.Item(Idx) Set C = CreateObject("ZuluLib.Contour") C.AddPoint R.Xmin, R.Ymin C.AddPoint (R.Xmin + R.Xmax) / 2, R.Ymin C.AddPoint (R.Xmin + R.Xmax) / 2, (R.Ymin + R.Ymax) / 2 C.AddPoint R.Xmin, (R.Ymin + R.Ymax) / 2 N.AddContour C, CreateObject("ZuluLib.ElemStyle"), -1, -1 'Объекты слоя, попавшие в область целиком или частично Set Pairs = L.IntersectByLayer(N, 4, False, -1, -1, 0) S = "Пар ключей: " & Pairs.Count If Pairs.Count > 0 Then S = S & vbCrLf & "первая пара: " & Pairs.KeyFirst(0) & " и " & Pairs.KeySecond(0) End If M.Layers.Remove Idx MsgBox S End SubPython:
import zulu def Macro_Layer_IntersectByLayer(): # Берем карту и ее активный слой M = zulu.App.ActiveMapDoc L = M.Layers.Active R = L.GetBoundsRectangle() # Кладем в слой в памяти контур на левую нижнюю четверть слоя idx = M.Layers.AddInMemory("Область") n = M.Layers.Item(idx) c = zulu.Contour() c.AddPoint(R.Xmin, R.Ymin) c.AddPoint((R.Xmin + R.Xmax) / 2, R.Ymin) c.AddPoint((R.Xmin + R.Xmax) / 2, (R.Ymin + R.Ymax) / 2) c.AddPoint(R.Xmin, (R.Ymin + R.Ymax) / 2) n.AddContour(c, zulu.ElemStyle(), -1, -1) # Объекты слоя, попавшие в область целиком или частично pairs = L.IntersectByLayer(n, 4, False, -1, -1, 0) print("Пар ключей:", pairs.Count) if pairs.Count > 0: print("первая пара:", pairs.KeyFirst(0), "и", pairs.KeySecond(0)) M.Layers.Remove(idx)