SplitByRegion method (Layer)

Разрезает объекты слоя заданным регионом (поликонтуром).

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

Layer

Синтаксис:

Visual Basic:

Function SplitByRegion(Region As PolyContour, Options As Long) As Long

Region - поликонтур, пересекаемый со слоем

Options - параметр, определяющий, какие объекты слоя участвуют в операции:

0 - все объкеты слоя.

1 - только объекты мишени (TargetSelection).

2 - только выделенные объекты (Selection).

Примечание:

- Объекты, имеющие область пересечения с регионом, разделяются на два объекта, один из которых совпадает с областью пересечения, второй содержит оставшуюся часть. Один из образованных объектов наследует ID разрезаемого объекта. Второй объект получает новый уникальный ID.

- Объекты, целиком попавшие внутрь региона или не имеющие с ним пересечения, остаются без изменения.

Описание:

Метод возвращает 0 и когда объекты разрезаны, и когда регион их не задел, поэтому судить о результате нужно по самим объектам.

Работает так же, как SplitByPolygon, только режущая область может состоять из нескольких контуров: объект, который регион накрыл частично, делится на две части - одна остается у прежнего ключа, вторая становится новым объектом.

Регион из нескольких контуров режет объект один раз: все части, попавшие в регион, становятся одним новым объектом, а не отдельным объектом на каждый контур, а оставшаяся часть сохраняет прежний ключ.

Контуры набираются в регион методом AddContour объекта PolyContour.

Пример:

Пример добавляет в слой свой квадрат за краем данных, разрезает его регионом из двух контуров и убирает за собой.

Visual Basic:

Sub Layer_SplitByRegion
'Берем активный слой карты
Set L = Zulu.ActiveMapDoc.Layers.Active
Set R = L.GetBoundsRectangle
nBefore = L.GetLargestID
X0 = R.Xmax + 500
Y0 = R.Ymin
'Свой квадрат 200x200 за краем данных слоя
Set C = CreateObject("ZuluLib.Contour")
C.AddPoint X0, Y0
C.AddPoint X0 + 200, Y0
C.AddPoint X0 + 200, Y0 + 200
C.AddPoint X0, Y0 + 200
Key = L.AddContour(C, CreateObject("ZuluLib.ElemStyle"), -1, -1)
S = "Площадь была: " & L.Elements.Item(Key).Area & ", объектов: " & L.ElementKeys.Count
'Регион из двух контуров: срезаем у квадрата оба края
Set PC = CreateObject("ZuluLib.PolyContour")
Set C1 = CreateObject("ZuluLib.Contour")
C1.AddPoint X0 - 50, Y0 - 50
C1.AddPoint X0 + 50, Y0 - 50
C1.AddPoint X0 + 50, Y0 + 250
C1.AddPoint X0 - 50, Y0 + 250
PC.AddContour C1
Set C2 = CreateObject("ZuluLib.Contour")
C2.AddPoint X0 + 150, Y0 - 50
C2.AddPoint X0 + 250, Y0 - 50
C2.AddPoint X0 + 250, Y0 + 250
C2.AddPoint X0 + 150, Y0 + 250
PC.AddContour C2
L.SplitByRegion PC, 0
S = S & vbCrLf & "стала: " & L.Elements.Item(Key).Area & ", объектов: " & L.ElementKeys.Count
'Убираем за собой все, что добавили
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 Sub

Python:

import zulu

def Macro_Layer_SplitByRegion():
    # Берем активный слой карты
    L = zulu.App.ActiveMapDoc.Layers.Active
    R = L.GetBoundsRectangle()
    n_before = L.GetLargestID()
    x0 = R.Xmax + 500
    y0 = R.Ymin
    # Свой квадрат 200x200 за краем данных слоя
    c = zulu.Contour()
    c.AddPoint(x0, y0)
    c.AddPoint(x0 + 200, y0)
    c.AddPoint(x0 + 200, y0 + 200)
    c.AddPoint(x0, y0 + 200)
    key = L.AddContour(c, zulu.ElemStyle(), -1, -1)
    print("Площадь была:", L.Elements.Item(key).Area, ", объектов:", L.ElementKeys.Count)
    # Регион из двух контуров: срезаем у квадрата оба края
    pc = zulu.PolyContour()
    c1 = zulu.Contour()
    c1.AddPoint(x0 - 50, y0 - 50)
    c1.AddPoint(x0 + 50, y0 - 50)
    c1.AddPoint(x0 + 50, y0 + 250)
    c1.AddPoint(x0 - 50, y0 + 250)
    pc.AddContour(c1)
    c2 = zulu.Contour()
    c2.AddPoint(x0 + 150, y0 - 50)
    c2.AddPoint(x0 + 250, y0 - 50)
    c2.AddPoint(x0 + 250, y0 + 250)
    c2.AddPoint(x0 + 150, y0 + 250)
    pc.AddContour(c2)
    L.SplitByRegion(pc, 0)
    print("стала:", L.Elements.Item(key).Area, ", объектов:", L.ElementKeys.Count)
    # Убираем за собой все, что добавили
    keys = L.ElementKeys
    for i in range(keys.Count, 0, -1):
        if keys.Item(i) > n_before:
            L.DeleteElement(keys.Item(i))