Чтение из слоя дополнительных пользовательских данных в указанный поток.
Visual Basic:
Function ReadData(Name As String, Stream As Unknown, Code As Long) As Boolean
Name - строковый идентификатор набора данных.
Stream - интерфейс IStream, передаваемый как IUnknown.
Code - зарезервировано, должно быть 1.
Действие метода равносильно обращению к пользовательским данным слоя через CustomData: взять индекс набора методом GetIndexByName и прочитать его методом GetItemData.
Set Data = Layer.CustomData Data.GetItemData Data.GetIndexByName(Name), StreamНабор с таким именем должен уже быть в слое - его кладет туда метод WriteData. Если имени в слое нет, метод возвращает False и поток остается пустым. Кроме своих наборов в CustomData лежат служебные записи слоя («zulu_sys_ext_xmin», «_zt.tl» и другие).
В качестве потока в макросе на VBScript годится ADODB.Stream: записанные им байты читаются обратно тем же объектом. Значение Code на результат не влияет.
В макросах на python метод недоступен: объект-поток создать нечем - ни win32com, ни comtypes в поставке нет.
Пример кладет в слой свой набор данных и читает его обратно.
Visual Basic:
Sub Layer_ReadData 'Берем активный слой карты Set L = Zulu.ActiveMapDoc.Layers.Active 'Пишем свой набор в слой Set S1 = CreateObject("ADODB.Stream") S1.Type = 2 S1.Charset = "utf-8" S1.Open S1.WriteText "проба пера 123" S1.Position = 0 Ok = L.WriteData("МойНабор", S1, 1) 'Читаем его обратно в чистый поток Set S2 = CreateObject("ADODB.Stream") S2.Type = 2 S2.Charset = "utf-8" S2.Open Res = L.ReadData("МойНабор", S2, 1) S2.Position = 0 T = "Записано: " & Ok & vbCrLf & "прочитано: " & Res T = T & vbCrLf & "байт: " & S2.Size & vbCrLf & "текст: " & S2.ReadText MsgBox T End Sub