Удаляет у объектов слоя области пересечения с заданным контуром.
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 SubPython:
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))