Разрезает объекты слоя заданным регионом (поликонтуром).
Visual Basic:
Function SplitByRegion(Region As PolyContour, Options As Long) As Long
Region - поликонтур, пересекаемый со слоем
Options - параметр, определяющий, какие объекты слоя участвуют в операции:
0 - все объкеты слоя.
1 - только объекты мишени (TargetSelection).
2 - только выделенные объекты (Selection).
- Объекты, имеющие область пересечения с регионом, разделяются на два объекта, один из которых совпадает с областью пересечения, второй содержит оставшуюся часть. Один из образованных объектов наследует ID разрезаемого объекта. Второй объект получает новый уникальный ID.
- Объекты, целиком попавшие внутрь региона или не имеющие с ним пересечения, остаются без изменения.
Метод возвращает 0 и когда объекты разрезаны, и когда регион их не задел, поэтому судить о результате нужно по самим объектам.
Работает так же, как SplitByPolygon, только режущая область может состоять из нескольких контуров: объект, который регион накрыл частично, делится на две части - одна остается у прежнего ключа, вторая становится новым объектом.
Регион из нескольких контуров режет объект один раз: все части, попавшие в регион, становятся одним новым объектом, а не отдельным объектом на каждый контур, а оставшаяся часть сохраняет прежний ключ.
Контуры набираются в регион методом AddContour объекта PolyContour.
Пример добавляет в слой свой квадрат за краем данных, разрезает его регионом из двух контуров и убирает за собой.
Visual Basic:
Sub Layer_SplitByRegion 'Берем активный слой карты Set L = Zulu.ActiveMapDoc.Layers.Active Set R = L.GetBoundsRectangle nBefore = L.GetLargestID X0 = R.Xmax + 500 Y0 = R.Ymin 'Свой квадрат 200x200 за краем данных слоя Set C = CreateObject("ZuluLib.Contour") C.AddPoint X0, Y0 C.AddPoint X0 + 200, Y0 C.AddPoint X0 + 200, Y0 + 200 C.AddPoint X0, Y0 + 200 Key = L.AddContour(C, CreateObject("ZuluLib.ElemStyle"), -1, -1) S = "Площадь была: " & L.Elements.Item(Key).Area & ", объектов: " & L.ElementKeys.Count 'Регион из двух контуров: срезаем у квадрата оба края Set PC = CreateObject("ZuluLib.PolyContour") Set C1 = CreateObject("ZuluLib.Contour") C1.AddPoint X0 - 50, Y0 - 50 C1.AddPoint X0 + 50, Y0 - 50 C1.AddPoint X0 + 50, Y0 + 250 C1.AddPoint X0 - 50, Y0 + 250 PC.AddContour C1 Set C2 = CreateObject("ZuluLib.Contour") C2.AddPoint X0 + 150, Y0 - 50 C2.AddPoint X0 + 250, Y0 - 50 C2.AddPoint X0 + 250, Y0 + 250 C2.AddPoint X0 + 150, Y0 + 250 PC.AddContour C2 L.SplitByRegion PC, 0 S = S & vbCrLf & "стала: " & L.Elements.Item(Key).Area & ", объектов: " & L.ElementKeys.Count 'Убираем за собой все, что добавили Set Keys = L.ElementKeys For i = Keys.Count To 1 Step -1 If Keys.Item(i) > nBefore Then L.DeleteElement Keys.Item(i) Next MsgBox S End SubPython:
import zulu def Macro_Layer_SplitByRegion(): # Берем активный слой карты L = zulu.App.ActiveMapDoc.Layers.Active R = L.GetBoundsRectangle() n_before = L.GetLargestID() x0 = R.Xmax + 500 y0 = R.Ymin # Свой квадрат 200x200 за краем данных слоя c = zulu.Contour() c.AddPoint(x0, y0) c.AddPoint(x0 + 200, y0) c.AddPoint(x0 + 200, y0 + 200) c.AddPoint(x0, y0 + 200) key = L.AddContour(c, zulu.ElemStyle(), -1, -1) print("Площадь была:", L.Elements.Item(key).Area, ", объектов:", L.ElementKeys.Count) # Регион из двух контуров: срезаем у квадрата оба края pc = zulu.PolyContour() c1 = zulu.Contour() c1.AddPoint(x0 - 50, y0 - 50) c1.AddPoint(x0 + 50, y0 - 50) c1.AddPoint(x0 + 50, y0 + 250) c1.AddPoint(x0 - 50, y0 + 250) pc.AddContour(c1) c2 = zulu.Contour() c2.AddPoint(x0 + 150, y0 - 50) c2.AddPoint(x0 + 250, y0 - 50) c2.AddPoint(x0 + 250, y0 + 250) c2.AddPoint(x0 + 150, y0 + 250) pc.AddContour(c2) L.SplitByRegion(pc, 0) print("стала:", L.Elements.Item(key).Area, ", объектов:", L.ElementKeys.Count) # Убираем за собой все, что добавили keys = L.ElementKeys for i in range(keys.Count, 0, -1): if keys.Item(i) > n_before: L.DeleteElement(keys.Item(i))