RUS  ENG 

Пример чтения и запись геометрии слоя

Дмитрий Емельянов , 16 декабря 2019

Пример чтения и запись геометрии слоя

    Изучаем способы чтения и записи объектов слоя с точки зрения быстродействия.
    Рассмотрены варианты простого и буферизованного доступа к слою на чтение и запись.
  • Пример подробно разобран в видеоролике Макросы. Урок 4. Чтение и запись геометрии слоя


  • ' 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

    Скачать пример (10.72 КБ)


    Возврат к списку

    Последнее обновление — 16.12.2019 09:49:23