Идентификаторы элементов в Revit. Часть 1
Начнем небольшую серия статей о различных идентификаторах элемента, существующих в Revit.
Некоторый из идентификаторов существуют уже давным-давно, некоторые же появились относительно недавно.
Что хранить во внешней базе: Уникальный идентификатор (UniqueId) или числовой (Element.Id)
Вопрос: Я разрабатываю расширения для Revit, где я делаю импорт/экспорт данных для приложения для структурного анализа. Я не уверен, какой идентификатор мне нужно хранить во внешней базе данных для последующей идентификации элемента после экспорта из Revit.
Я хочу реализовать что-то типа этого:
- После того, как приложение по структурному анализу сделало некие изменения в модель, оно экспортировало эти изменения в некую внешнюю базу данных. Мое расширение будет обращаться к этой базе данных, возьмет «измененные» элементы, основываясь на идентификаторе элемента (т.е. document.get_Element(Id/UniqueId)) и применит эти изменения в модели Revit. Однако, эти идентификаторы используются внутри Revit и я не знаю как Revit их генерирует. Поэтому довольно сложно понять, какой же именно элемент бы изменен за пределами Revit.
- Пользователь также может сделать некие изменения в самом Revit и послать эти изменения в приложения для структурного анализа. Однако в приложении для структурного анализа нет каких-либо идентификаторов, подобно ревитовским. Поэтому, я думаю сам создать подобный идентификатор типа GUID. Но этот идентификатор не похож на тот, что используется в Revit. Как можно сгенерировать идентификатор для идентификации элемента, который я бы мог использовать как в Revit, так и в приложении для структурного анализа?
Я уже получил несколько предложений, например:
- На этапе экспорта данных из Revit, создать набор GUID’ов для экспортируемых элементов. Помимо GUID, нужно сохранить также и ElementId.
Как мне сгенерировать GUID для идентификации экспортируемого элемента?
- На этапе импорта данных в Revit, проверить существующий элемент на наличие GUID, в противном случае, создать его.
Таким образом, приложение для структурного анализа должно генерировать GUID тем же способом, что описан в пункте 1, чтобы идентификатор можно было использовать как в Revit, так и в приложения для структурного анализа. Поправьте меня, пожалуйста, если я где-то в чем-то ошибаюсь или что-то упустил.
Или может быть есть другие предложения? Буду рад любой помощи.
Ответ: Класс Document содержит метод GetElement(), с помощью которого можно получить элемент Revit по ElementId или по UniqueId.
Уникальный идентификатор UniqueId представлен в виде строки.
Получить элемент по этому идентификатору можно с помощью такого псевдокода:
- string uniqueId = something;
- Element fetch = doc.GetElement(uniqueId);
И наоборот, получить уникальный идентификатор элемента можно вот так:
- string elementGuid = element.UniqueId;
Имейте ввиду, что уникальный идентификатор Revit не является GUID’ом. Это строка. Часть этой строки – GUID, но вся строка целиком - не GUID. И обращаться с этим идентификатором нужно как со строкой.
Чтобы получить уникальный идентификатор элемента, используйте Element.UniqueId.
Чтобы получить элемент, по уникальному идентификатору, используйте: Document.GetElement(uniqueId)
Основное отличие между уникальным идентификатором UniqueId и числовым ElementId – это постоянство при совместной работе. Или наоборот, непостоянство, если посмотреть с другой стороны. Если ElementId уникален в пределах одного документа и может меняться при совместной работе над проектом, то UniqueId остается неизменным при совместной работе над проектом и при синхронизации локального файла с центральным.
Однако ни один из идентификаторов не является уникальным среди различных проектов Revit. А это значит, что различные модели Revit могут иметь одинаковые идентификаторы (как ElementId, так и UniqueId)
Для того чтобы отслеживать изменения элементов в модели как в Revit, так и в приложении для структурного анализа, как вы описали выше, я могу предложить следующие варианты:
- Если элементы был создан в Revit, то лучшим вариантом будет использование уникального идентификатора UniqueId в обоих системах.
- Если же элемент был создан вне Revit и вам нужно присвоить уникальный идентификатор элементу еще до того, как он появится в Revit, то я бы использовал обычный GUID, как вы и описали. Тем не менее, этот вариант гораздо сложнее, чем просто использовать Уникальный идентификатор Revit.
Для генерации GUID можно воспользоваться .NET API.
Обсуждение: http://adn-cis.org/forum/index.php?topic=732
Опубликовано 14.05.2014Отредактировано 14.05.2014 в 21:25:11