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