ADN Open CIS
Сообщество программистов Autodesk в СНГ

14/05/2014

Идентификаторы элементов в Revit. Часть 1

Начнем небольшую серия статей о различных идентификаторах элемента, существующих в Revit.

Некоторый из идентификаторов существуют уже давным-давно, некоторые же появились относительно недавно.

Что хранить во внешней базе: Уникальный идентификатор (UniqueId) или числовой (Element.Id)

Вопрос: Я разрабатываю расширения для Revit, где я делаю импорт/экспорт данных для приложения для структурного анализа. Я не уверен, какой идентификатор мне нужно хранить во внешней базе данных для последующей идентификации элемента после экспорта из Revit.

Я хочу реализовать что-то типа этого:

  1. После того, как приложение по структурному анализу сделало некие изменения в модель, оно экспортировало эти изменения в некую внешнюю базу данных. Мое расширение будет обращаться к этой базе данных, возьмет «измененные» элементы, основываясь на идентификаторе элемента (т.е. document.get_Element(Id/UniqueId)) и применит эти изменения в модели Revit. Однако, эти идентификаторы используются внутри Revit и я не знаю как Revit их генерирует. Поэтому довольно сложно понять, какой же именно элемент бы изменен за пределами Revit.
  2. Пользователь также может сделать некие изменения в самом Revit и послать эти изменения в приложения для структурного анализа. Однако в приложении для структурного анализа нет каких-либо идентификаторов, подобно ревитовским. Поэтому, я думаю сам создать подобный идентификатор типа GUID. Но этот идентификатор не похож на тот, что используется в Revit. Как можно сгенерировать идентификатор для идентификации элемента, который я бы мог использовать как в Revit, так и в приложении для структурного анализа?

Я уже получил несколько предложений, например:

  1. На этапе экспорта данных из Revit, создать набор GUID’ов для экспортируемых элементов. Помимо GUID, нужно сохранить также и ElementId.

Как мне сгенерировать GUID для идентификации экспортируемого элемента?

  1. На этапе импорта данных в Revit, проверить существующий элемент на наличие GUID, в противном случае, создать его.

Таким образом, приложение для структурного анализа должно генерировать GUID тем же способом, что описан в пункте 1, чтобы идентификатор можно было использовать как в Revit, так и в приложения для структурного анализа. Поправьте меня, пожалуйста, если я где-то в чем-то ошибаюсь или что-то упустил.

Или может быть есть другие предложения? Буду рад любой помощи.

Ответ: Класс Document содержит метод GetElement(), с помощью которого можно получить элемент Revit по ElementId или по UniqueId.

Уникальный идентификатор UniqueId представлен в виде строки.

Получить элемент по этому идентификатору можно с помощью такого псевдокода:

Код - C#: [Выделить]
  1.   string uniqueId = something;
  2.   Element fetch = doc.GetElement(uniqueId);

И наоборот, получить уникальный идентификатор элемента можно вот так:

Код - C#: [Выделить]
  1.   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://thebuildingcoder.typepad.com/blog/2014/04/element-id-export-unique-navisworks-and-other-ids.html#2

Обсуждение: http://adn-cis.org/forum/index.php?topic=732

Опубликовано 14.05.2014
Отредактировано 14.05.2014 в 21:25:11