EraseOutsideRegion method (Layer)

Удаляет у объектов слоя области, не имеющие пересечения с заданным регионом (поликонтуром).

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

Layer

Синтаксис:

Visual Basic:

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

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

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

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

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

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

Описание:

Метод возвращает 0, если операция выполнена, и -1, если Options не равен 0, 1 или 2 либо регион пуст.

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

У площадного объекта удаляется часть, лежащая снаружи региона. Линия, пересекающая регион, обрезается по нему.

При Options = 0 в операции участвуют все объекты слоя, поэтому всё, что лежит за пределами региона, удаляется.

После вызова группа слоя становится пустой при любом значении Options; мишень сохраняется.

Примечание:

Линии и площадные объекты, целиком попавшие в регион, остаются без изменения.

Линии и площадные объекты, не имеющие пересечения с регионом, удаляются полностью.

Пример:

Visual Basic:

Sub Layer_EraseOutsideRegion
'Берем активный слой карты
Set L = Zulu.ActiveMapDoc.Layers.Active
Set R = L.GetBoundsRectangle
D = (R.Xmax - R.Xmin) / 10
X = R.Xmax + D
Y = R.Ymin
'Квадрат правее слоя
Set Sq = CreateObject("ZuluLib.Contour")
Sq.AddPoint X, Y
Sq.AddPoint X + D, Y
Sq.AddPoint X + D, Y + D
Sq.AddPoint X, Y + D
Set St = CreateObject("ZuluLib.ElemStyle")
St.FillStyle = 2
St.PatColor = RGB(255, 0, 0)
ElemID = L.AddContour(Sq, St, -1, -1)
'Регион-рамка: накрывает весь квадрат, кроме выреза в середине
Set Outer = CreateObject("ZuluLib.Contour")
Outer.AddPoint X - D, Y - D
Outer.AddPoint X + 2 * D, Y - D
Outer.AddPoint X + 2 * D, Y + 2 * D
Outer.AddPoint X - D, Y + 2 * D
Set Hole = CreateObject("ZuluLib.Contour")
Hole.AddPoint X + D / 4, Y + D / 4
Hole.AddPoint X + 3 * D / 4, Y + D / 4
Hole.AddPoint X + 3 * D / 4, Y + 3 * D / 4
Hole.AddPoint X + D / 4, Y + 3 * D / 4
Set Reg = CreateObject("ZuluLib.PolyContour")
Reg.AddContour Outer
Reg.AddContour Hole
'Стираем только в выделенном квадрате: под вырезом региона появится вырез в квадрате
L.Selection.Clear
L.Selection.AddElem ElemID
S = "Площадь до: " & Round(L.Elements.Item(ElemID).PolyContour.Square, 1)
S = S & vbCrLf & "EraseOutsideRegion = " & L.EraseOutsideRegion(Reg, 2)
S = S & vbCrLf & "Площадь после: " & Round(L.Elements.Item(ElemID).PolyContour.Square, 1)
MsgBox S
End Sub

Python:

import zulu

def Macro_Layer_EraseOutsideRegion():
    # Берем активный слой карты
    L = zulu.App.ActiveMapDoc.Layers.Active
    R = L.GetBoundsRectangle()
    d = (R.Xmax - R.Xmin) / 10
    x = R.Xmax + d
    y = R.Ymin

    def contour(points):
        C = zulu.Contour()
        for px, py in points:
            C.AddPoint(px, py)
        return C

    # Квадрат правее слоя
    St = zulu.ElemStyle()
    St.FillStyle = 2
    St.PatColor = 255
    elem_id = L.AddContour(contour(((x, y), (x + d, y), (x + d, y + d), (x, y + d))),
                           St, -1, -1)
    # Регион-рамка: накрывает весь квадрат, кроме выреза в середине
    Reg = zulu.PolyContour()
    Reg.AddContour(contour(((x - d, y - d), (x + 2 * d, y - d),
                            (x + 2 * d, y + 2 * d), (x - d, y + 2 * d))))
    Reg.AddContour(contour(((x + d / 4, y + d / 4), (x + 3 * d / 4, y + d / 4),
                            (x + 3 * d / 4, y + 3 * d / 4), (x + d / 4, y + 3 * d / 4))))
    # Стираем только в выделенном квадрате: под вырезом региона появится вырез в квадрате
    L.Selection.Clear()
    L.Selection.AddElem(elem_id)
    print("Площадь до:", round(L.Elements.Item(elem_id).PolyContour.Square, 1))
    print("EraseOutsideRegion =", L.EraseOutsideRegion(Reg, 2))
    print("Площадь после:", round(L.Elements.Item(elem_id).PolyContour.Square, 1))