Запись в слой дополнительных пользовательских данных.
Visual Basic:
Function WriteData(Name As String, Stream As Unknown, Code As Long) As Boolean
Name - строковый идентификатор набора данных.
Stream - интерфейс IStream, передаваемый как IUnknown.
Code - зарезервировано, должно быть 1.
Записываемый блок данных из указанного потока регистрируется в коллекции дополнительных данных слоя под указанным именем. Дальнейший доступ к данным может осуществлятся методом ReadData или через объект CustomData.
Действие метода равносильно обращению к пользовательским данным слоя через CustomData: добавить набор методом PutItemData и зафиксировать изменения методом Commit.
При успехе метод возвращает True. Набор появляется в CustomData рядом со служебными записями слоя, и записей становится на одну больше. Запись под уже занятым именем не добавляет второй набор, а заменяет содержимое прежнего - число наборов остается тем же, а ReadData отдает новый текст. Значение Code на результат не влияет.
В качестве потока в макросе на VBScript годится ADODB.Stream: записанные им байты читаются обратно тем же объектом.
В макросах на python метод недоступен: объект-поток создать нечем - ни win32com, ни comtypes в поставке нет.
Пример кладет в слой свой набор данных и показывает, что он появился в наборах слоя.
Visual Basic:
Sub Layer_WriteData 'Берем активный слой карты Set L = Zulu.ActiveMapDoc.Layers.Active S = "Наборов в слое было: " & L.CustomData.Count 'Готовим поток с текстом 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 CD = L.CustomData S = S & vbCrLf & "записано: " & Ok & ", наборов стало: " & CD.Count S = S & vbCrLf & "номер набора: " & CD.GetIndexByName("МойНабор") 'Читаем набор обратно в чистый поток Set S2 = CreateObject("ADODB.Stream") S2.Type = 2 S2.Charset = "utf-8" S2.Open L.ReadData "МойНабор", S2, 1 S2.Position = 0 S = S & vbCrLf & "прочитано: " & S2.ReadText MsgBox S End Sub