EraseInsidePolygon method (Layer)

Удаляет у объектов слоя области пересечения с заданным контуром.

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

Layer

Синтаксис:

Visual Basic:

Function EraseInsidePolygon(polygon As Contour, Options As Long) As Long

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

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

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

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

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

Описание:

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

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

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

Примечание:

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

Объекты, не имеющие пересечения с контуром, остаются без изменения.

Пример:

Visual Basic:

Sub Layer_EraseInsidePolygon
'Берем активный слой карты
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 C = CreateObject("ZuluLib.Contour")
C.AddPoint X + D / 2, Y - D
C.AddPoint X + 2 * D, Y - D
C.AddPoint X + 2 * D, Y + 2 * D
C.AddPoint X + D / 2, Y + 2 * D
'Стираем только в выделенном квадрате
L.Selection.Clear
L.Selection.AddElem ElemID
S = "Площадь до: " & Round(L.Elements.Item(ElemID).PolyContour.Square, 1)
S = S & vbCrLf & "EraseInsidePolygon = " & L.EraseInsidePolygon(C, 2)
S = S & vbCrLf & "Площадь после: " & Round(L.Elements.Item(ElemID).PolyContour.Square, 1)
MsgBox S
End Sub

Python:

import zulu

def Macro_Layer_EraseInsidePolygon():
    # Берем активный слой карты
    L = zulu.App.ActiveMapDoc.Layers.Active
    R = L.GetBoundsRectangle()
    d = (R.Xmax - R.Xmin) / 10
    x = R.Xmax + d
    y = R.Ymin
    # Квадрат правее слоя
    Sq = zulu.Contour()
    for px, py in ((x, y), (x + d, y), (x + d, y + d), (x, y + d)):
        Sq.AddPoint(px, py)
    St = zulu.ElemStyle()
    St.FillStyle = 2
    St.PatColor = 255
    elem_id = L.AddContour(Sq, St, -1, -1)
    # Контур, накрывающий правую половину квадрата
    C = zulu.Contour()
    for px, py in ((x + d / 2, y - d), (x + 2 * d, y - d),
                   (x + 2 * d, y + 2 * d), (x + d / 2, y + 2 * d)):
        C.AddPoint(px, py)
    # Стираем только в выделенном квадрате
    L.Selection.Clear()
    L.Selection.AddElem(elem_id)
    print("Площадь до:", round(L.Elements.Item(elem_id).PolyContour.Square, 1))
    print("EraseInsidePolygon =", L.EraseInsidePolygon(C, 2))
    print("Площадь после:", round(L.Elements.Item(elem_id).PolyContour.Square, 1))