IntersectByLayer method (Layer)

Возвращает коллекцию ElementKeyPairs пар ключей объектов двух слоев, удовлетворивших заданным критериям пересечения.

Ответ содержит набор пар ключей, где первый ключ - это ключ объекта исходного слоя, а второй ключ - объекта второго слоя, в который попал объект исходного слоя.

Применяется к:

Layer

Синтаксис:

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 Sub

Python:

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)