Вырезает элементы, входящие в группу слоя из элементов, входящих в мишень этого же слоя.
Вызов этого метода аналогичен выполнению команды системы Zulu Правка\Вырезать из мишени группу для случая, когда редактируемый и активный слой совпадают.
Visual Basic:
Sub CutSelectedElementsFromTarget
Группа слоя — это выделенные объекты, свойство Selection; мишень — свойство TargetSelection. Из объекта мишени вырезается то, что перекрыто объектами группы: у площадного объекта мишени на месте перекрытия появляется вырез, а его площадь уменьшается на площадь перекрытия. Сами объекты группы остаются в слое без изменений.
После вызова группа очищается, а мишень сохраняется.
Visual Basic:
Sub Layer_CutSelectedElementsFromTarget 'Берем активный слой карты Set L = Zulu.ActiveMapDoc.Layers.Active Set R = L.GetBoundsRectangle D = (R.Xmax - R.Xmin) / 10 X = R.Xmax + D Y = R.Ymin Set St = CreateObject("ZuluLib.ElemStyle") St.FillStyle = 2 St.PatColor = RGB(255, 0, 0) 'Большой квадрат - он станет мишенью Set C1 = CreateObject("ZuluLib.Contour") C1.AddPoint X, Y C1.AddPoint X + D, Y C1.AddPoint X + D, Y + D C1.AddPoint X, Y + D Big = L.AddContour(C1, St, -1, -1) 'Малый квадрат внутри него - он станет группой Set C2 = CreateObject("ZuluLib.Contour") C2.AddPoint X + D / 4, Y + D / 4 C2.AddPoint X + D / 2, Y + D / 4 C2.AddPoint X + D / 2, Y + D / 2 C2.AddPoint X + D / 4, Y + D / 2 Small = L.AddContour(C2, St, -1, -1) 'Мишень - большой квадрат, группа - малый L.TargetSelection.Clear L.TargetSelection.AddElem Big L.Selection.Clear L.Selection.AddElem Small 'Вырезаем группу из мишени L.CutSelectedElementsFromTarget 'Смотрим, что стало с мишенью Set En = L.EnumElements En.MoveFirst Do While Not En.IsEOF If En.ElemID = Big Then Exit Do En.MoveNext Loop MsgBox "Мишень " & Big & ": площадь " & Round(En.Area, 1) & ", вершин " & En.GetPoints.Count End SubPython:
import zulu def Macro_Layer_CutSelectedElementsFromTarget(): # Берем активный слой карты L = zulu.App.ActiveMapDoc.Layers.Active R = L.GetBoundsRectangle() d = (R.Xmax - R.Xmin) / 10 x = R.Xmax + d y = R.Ymin St = zulu.ElemStyle() St.FillStyle = 2 St.PatColor = 255 # Большой квадрат - он станет мишенью C1 = zulu.Contour() for px, py in ((x, y), (x + d, y), (x + d, y + d), (x, y + d)): C1.AddPoint(px, py) big = L.AddContour(C1, St, -1, -1) # Малый квадрат внутри него - он станет группой C2 = zulu.Contour() for px, py in ((x + d / 4, y + d / 4), (x + d / 2, y + d / 4), (x + d / 2, y + d / 2), (x + d / 4, y + d / 2)): C2.AddPoint(px, py) small = L.AddContour(C2, St, -1, -1) # Мишень - большой квадрат, группа - малый L.TargetSelection.Clear() L.TargetSelection.AddElem(big) L.Selection.Clear() L.Selection.AddElem(small) # Вырезаем группу из мишени L.CutSelectedElementsFromTarget() # Смотрим, что стало с мишенью En = L.EnumElements() En.MoveFirst() while not En.IsEOF() and En.ElemID != big: En.MoveNext() print("Мишень", big, ": площадь", round(En.Area, 1), ", вершин", En.GetPoints().Count)