Разбивает составной объект на несколько элементов из составляющих его частей.
Visual Basic:
Function DecombineElement(ElemID As Long, Flags As Long) As Boolean
ElemID - ID объекта слоя.
Flags - опции.
Если параметр Flags равен нулю, то каждый элемент, составляющий исходный, становится самостоятельным объектом.
Если параметр Flags равен единице, то, если исходный объект площадной, он разобъется на несколько не связанных площадных объектов, которые в свою очередь тоже могут быть составными объектами.
Например, составной объект из двух бубликов (четыре полигона, попарно один в другом) в случае Flags = 0 разобъется на четыре объекта, а в случае Flags = 1, на два бублика.
Один из вновь образованных объектов наследует ID исходного объекта. Остальные получают новые ID.
Все образованные объекты наследуют стиль исходного объекта для примитивов, или тип и режим исходного объекта для типового объекта.
Если исходный объект не составной, метод никаких действий не производит.
Метод возвращает True, если объект разбит, и False, если разбивать нечего: объект не составной, объекта с таким ключом в слое нет либо Flags задан значением, отличным от нуля и единицы. Так, у объекта из двух контуров, один из которых лежит внутри другого, Flags = 1 даёт False — такой объект и так состоит из одного бублика, — а Flags = 0 разбивает его на два объекта.
Разница флагов видна и на карте: при Flags = 0 внутренний контур становится самостоятельным площадным объектом поверх внешнего, поэтому вырез в объекте пропадает, а при Flags = 1 части остаются объектами с вырезами.
Новые объекты в группу слоя не попадают: если исходный объект был в группе, в ней остаётся только его ключ.
Visual Basic:
Sub Layer_DecombineElement 'Берем активный слой карты Set L = Zulu.ActiveMapDoc.Layers.Active Set R = L.GetBoundsRectangle D = (R.Xmax - R.Xmin) / 10 X = R.Xmax + D Y = R.Ymin 'Два квадрата в одном составном объекте 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 Set C2 = CreateObject("ZuluLib.Contour") C2.AddPoint X + 2 * D, Y C2.AddPoint X + 3 * D, Y C2.AddPoint X + 3 * D, Y + D C2.AddPoint X + 2 * D, Y + D Set PC = CreateObject("ZuluLib.PolyContour") PC.AddContour C1 PC.AddContour C2 Set St = CreateObject("ZuluLib.ElemStyle") St.FillStyle = 2 St.PatColor = RGB(255, 0, 0) ElemID = L.AddPolyContour(PC, St, -1, -1) 'Считаем объекты слоя до разбиения Set En = L.EnumElements En.MoveFirst n1 = 0 Do While Not En.IsEOF n1 = n1 + 1 En.MoveNext Loop 'Разбиваем составной объект на самостоятельные res = L.DecombineElement(ElemID, 0) Set En = L.EnumElements En.MoveFirst n2 = 0 Do While Not En.IsEOF n2 = n2 + 1 En.MoveNext Loop MsgBox "Объект " & ElemID & " разбит: " & res & vbCrLf & _ "Объектов в слое было " & n1 & ", стало " & n2 End SubPython:
import zulu def Macro_Layer_DecombineElement(): # Берем активный слой карты L = zulu.App.ActiveMapDoc.Layers.Active R = L.GetBoundsRectangle() d = (R.Xmax - R.Xmin) / 10 x = R.Xmax + d y = R.Ymin # Два квадрата в одном составном объекте PC = zulu.PolyContour() for x0 in (x, x + 2 * d): C = zulu.Contour() for px, py in ((x0, y), (x0 + d, y), (x0 + d, y + d), (x0, y + d)): C.AddPoint(px, py) PC.AddContour(C) St = zulu.ElemStyle() St.FillStyle = 2 St.PatColor = 255 elem_id = L.AddPolyContour(PC, St, -1, -1) def count(): En = L.EnumElements() En.MoveFirst() n = 0 while not En.IsEOF(): n += 1 En.MoveNext() return n # Разбиваем составной объект на самостоятельные n1 = count() res = L.DecombineElement(elem_id, 0) print("Объект", elem_id, "разбит:", res) print("Объектов в слое было", n1, ", стало", count())