Key-value хранилище

Реализация Key-value хранилища внутри Revit файла.

Если не хочется вникать просто скопируйте код и не забудьте поправить импорты если нужно:

Ограничения: ключ и значение могут быть только строками.

Пример использования

storage = Storage(doc, Guid("f06287CD-BB06-47AC-88E0-705D5411F962"))
 
storage.set("key1", "value")
print storage.get("key1")
storage.remove("key1")
print storage.has("key1")

Реализация

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/e7e2d8c6-fbee-4afb-81df-16a45d023fb5/Refit-Storage-scheme-2.png

Подробное описание работы с ExtensibleStorage см. по ссылкам ниже.

Основные этапы будут следующие:

  1. Создать или взять из памяти экземпляр Schema c одним единственным полем-словарем
  2. Создать или взять через коллектор экземпляр **DataStorage** c нужной Schema
  3. Создать или извлечь из **DataStorage** Entity объект
  4. Создать или извлечь из Entity словарь (Dictionary<string, string>)
  5. Записать по ключу значение в словарь
  6. Поместить измененный словарь обратно в Entity
  7. Поместить измененный Entity обратно в **DataStorage**

Весь этот ужас возьмет на себя класс Storage.

Schema

Взять существующую схему по Guid

schema = Schema.Lookup(self._schema_guid)

Либо создать новую с помощью SchemaBuilder:

Методом AddMapField() мы создаём новое поле, в которое будем сохранять словарь, указав что ключ и значение у нас будут типа str. К сожалению поддержки объектов любого типа для значений нет, только Entity

Cхему возвращает метод .Finish()

schema_builder = DB.ExtensibleStorage.SchemaBuilder(self._schema_guid)
schema_builder.SetSchemaName("Storage")
schema_builder.AddMapField("MapField", str, str)
schema = schema_builder.Finish()