Пример чтения и запись геометрии слоя
-
Изучаем способы чтения и записи объектов слоя с точки зрения быстродействия.
Рассмотрены варианты простого и буферизованного доступа к слою на чтение и запись.
' ActiveX enumeration values definitions start (do not change!)
Const eMixedLayer = 70
Const eSelCreate = 1
' ActiveX enumeration values definitions end
'*********************************************************************************
'Читаем один символ, который в данный момент мигает, и рисуем вокруг него квадрат
'*********************************************************************************
Sub WriteOneHouse
'Получаем активный слой карты
Set L = Zulu.ActiveMapDoc.layers.Active
'Получаем слой для записи
Set Lw = Zulu.ActiveMapDoc.layers.GetItemByUserName("Houses")
'Проверяем, что есть мигающий объект
If L.CurrentID = -1 Then Exit Sub
'Получаем элемент для мигающего объекта
Set El = L.Elements.Item(L.CurrentID)
'Создаем объект контур
Set C = CreateObject("ZuluLib.Contour")
'Получаем центроид объекта (для символа совпадает с точкой привязки)
Set Pt = El.GetCenter
'Заполняем объект точками,образующими квадрат вокруг центра объекта
C.AddPoint Pt.X - 1000, Pt.Y - 1000
C.AddPoint Pt.X - 1000, Pt.Y + 1000
C.AddPoint Pt.X + 1000, Pt.Y + 1000
C.AddPoint Pt.X + 1000, Pt.Y - 1000
'Зписываем контурный объект в слой для записи
Lw.AddContour C, Nothing, -1, -1
End Sub
'*********************************************************************************
'Читаем по одному все потребители слоя и записываем для каждого из них площадной объект
'*********************************************************************************
Sub ReadWriteAll
'Объект для вывода в окно сообщений
Set Out = Zulu.OpenOutputChannel("Сообщения")
'Очищаем окно сообщений
Out.Clear
'Выводим сообщение о старте процедуры
Out.Put "Start" + CHR(10)
'Строка с именем слоя для записи
LayerName = "D:\ZuluData\Test\Houses"
'LayerName = "zulu://localhost:6473/Houses.zl"
'Создаем объект ZuluTools
Set Tools = CreateObject("ZuluLib.ZuluTools")
'Создаем слой для записи
Tools.LayerCreate LayerName, "Houses", eMixedLayer
'Создаем объект слой
Set Lw = CreateObject("ZuluLib.Layer")
'Открываем слой для записи
Lw.Open LayerName
'Получаем активный слой карты
Set L = Zulu.ActiveMapDoc.layers.Active
'Создаем объект контур
Set C = CreateObject("ZuluLib.Contour")
'Получаем коллекцию ключей всех потребителей слоя (TypeID = 3)
Set Keys = L.SelectByType (3, 0)
'По всем ID из коллекции ключей
For i = 1 To Keys.Count
'Выводим в окно сообщений номер текущего элемента
Out.Put CStr(i) + Chr(13)
'Получаем элемент для текущего ключа
Set El = L.Elements.Item(Keys(i))
'Получаем центроид объекта
Set Pt = El.GetCenter
'Очищаем объект контур
C.Clear
'Заполняем контурный объект координатами вокруг центра объекта
C.AddPoint Pt.X - 1000, Pt.Y - 1000
C.AddPoint Pt.X - 1000, Pt.Y + 1000
C.AddPoint Pt.X + 1000, Pt.Y + 1000
C.AddPoint Pt.X + 1000, Pt.Y - 1000
'Зписываем контурный объект в слой для записи
Lw.AddContour C, Nothing, -1, -1
Next
'Выводим сообщение о завершении процедуры
Out.Put CHR(10) + "Finish" + CHR(10)
End Sub
'*********************************************************************************
'Читаем все потребители слоя и записываем для каждого из них площадной объект,
'используя буферизованный доступ при чтении и записи
'*********************************************************************************
Sub ReadWriteFast
'Объект для вывода в окно сообщений
Set Out = Zulu.OpenOutputChannel("Сообщения")
'Очищаем окно сообщений
Out.Clear
'Выводим сообщение о старте процедуры
Out.Put "Start" + CHR(10)
'Строка с именем слоя для записи
LayerName = "D:\ZuluData\Test\Houses"
'LayerName = "zulu://localhost:6473/Houses.zl"
'Создаем объект ZuluTools
Set Tools = CreateObject("ZuluLib.ZuluTools")
'Создаем слой для записи
Tools.LayerCreate LayerName, "Houses", eMixedLayer
'Создаем объект слой
Set Lw = CreateObject("ZuluLib.Layer")
'Открываем слой для записи
Lw.Open LayerName
'Получаем активный слой карты
Set L = Zulu.ActiveMapDoc.layers.Active
'Создаем объект контур
Set C = CreateObject("ZuluLib.Contour")
'Выделяем в исходном слое все потребители
L.Selection.ModifyByType eSelCreate, 3, 0
'Получаем итератор для буферизованного чтения
Set En = L.EnumElements
'Задаем перечисление только выделенных объектов
En.SetSelectedOnly True
'Очищаем группу (ее параметры итератор запомнил при создании)
L.Selection.Clear
'Встаем на первый объект для перечисления
En.MoveFirst
'Счетчик текущих объектов
cnt = 0
'Активируем режим буферизованной записи
Lw.StartSequentialWriteMode
'Запускаем цикл перечисления выделенных объектов
Do
'Выходим из цикла, когда перечислять больше нечего
If En.IsEOF = true Then Exit Do
'Увеличиваем счетчик текущих объектов
cnt = cnt + 1
'Выводим в окно сообщений номер текущего элемента
Out.Put CStr(cnt) + Chr(13)
'Получаем центр текущего объекта
Set Pt = En.GetCenter
'Заполняем контурный объект координатами вокруг центра объекта
C.AddPoint Pt.X - 1000, Pt.Y - 1000
C.AddPoint Pt.X - 1000, Pt.Y + 1000
C.AddPoint Pt.X + 1000, Pt.Y + 1000
C.AddPoint Pt.X + 1000, Pt.Y - 1000
'Зписываем контурный объект в слой для записи
Lw.AddContour C, Nothing, -1, -1
'Переходим к следующему элементу итератора
En.MoveNext
Loop
'Завершаем режим буферизованной записи
Lw.FinishSequentialWriteMode
'Выводим сообщение о завершении процедуры
Out.Put CHR(10) + "Finish" + CHR(10)
End Sub
'*********************************************************************************
'Тест производительности одиночного чтения всех объектов слоя
'*********************************************************************************
Sub ReadAll
'Объект для вывода в окно сообщений
Set Out = Zulu.OpenOutputChannel("Сообщения")
'Очищаем окно сообщений
Out.Clear
'Выводим сообщение о старте процедуры
Out.Put "Start" + CHR(10)
'Получаем активный слой карты
Set L = Zulu.ActiveMapDoc.layers.Active
'Получаем коллекцию ключей всех объектов слоя
Set Keys = L.ElementKeys
'По всем ID из коллекции ключей
For i = 1 To Keys.Count
'Выводим в окно сообщений номер текущего элемента
Out.Put CStr(i) + Chr(13)
'Получаем элемент для текущего ключа
Set El = L.Elements.Item(Keys(i))
'Получаем центроид объекта
Set Pt = El.GetCenter
Next
'Выводим сообщение о завершении процедуры
Out.Put CHR(10) + "Finish" + CHR(10)
End Sub
'*********************************************************************************
'Тест производительности буферизованного чтения всех объектов слоя
'*********************************************************************************
Sub ReadAllFast
'Объект для вывода в окно сообщений
Set Out = Zulu.OpenOutputChannel("Сообщения")
'Очищаем окно сообщений
Out.Clear
'Выводим сообщение о старте процедуры
Out.Put "Start" + CHR(10)
'Получаем активный слой карты
Set L = Zulu.ActiveMapDoc.layers.Active
'Получаем итератор для буферизованного чтения
Set En = L.EnumElements
'Встаем на первый объект для перечисления
En.MoveFirst
'Счетчик текущих объектов
cnt = 0
'Запускаем цикл перечисления выделенных объектов
Do
'Выходим из цикла, когда перечислять больше нечего
If En.IsEOF = true Then Exit Do
'Увеличиваем счетчик текущих объектов
cnt = cnt + 1
'Выводим в окно сообщений номер текущего элемента
Out.Put CStr(cnt) + Chr(13)
'Получаем центр текущего объекта
Set Pt = En.GetCenter
'Переходим к следующему элементу итератора
En.MoveNext
Loop
'Выводим сообщение о завершении процедуры
Out.Put CHR(10) + "Finish" + CHR(10)
End Sub
Последнее обновление — 16.12.2019 09:49:23