DecombineElement method (Layer)

Разбивает составной объект на несколько элементов из составляющих его частей.

Применяется к:

Layer

Синтаксис:

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 Sub

Python:

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())