пятница, 17 января 2020 г.

[Revit API] - UniqueId в зазеркалье

    Согласно документации Revit API для хранения информации об элементах во внешних хранилищах данных рекомендуется использовать UniqueId.
Это надёжно, UniqueId остаётся неизменным в пределах модели в отличие от ElementId. 

Однако UniqueId всё же может меняться в процессе работы в модели при казалось бы безобидной операции  - "Зеркало".

Выберите какой-нибудь элемент, запишите его UniqueId и ElementId:
Я выбрал балку, вот её свойства:


Затем примените команду "Зеркало". 
Перед заданием оси симметрии убираем галочку "Копировать" в панели параметров.



UniqueId и ElementId элемента изменились после выполнения команды:


На мой взгляд это явная недоработка, я не обнаружил описания такого поведения в документации. Рекомендаций для разрешения этой проблемы я не даю, зависит от конкретной задачи. Учитывайте эту особенность при разработке плагинов, где предполагается обновление элементов в пределах модели, либо работа с внешними источниками данных.

Успехов!

4 комментария:

  1. Если переместить объект с галочкой "Разъединить", происходить то же самое. Причем, в UniqueId меняется только последний байт в

    ОтветитьУдалить
    Ответы
    1. Благодарю за дополнение. То же самое происходит и при повороте элемента с галкой "Разъединить"

      Удалить
  2. Всё происходящее вполне естественно. Когда вы нажимаете зеркалить, это не значит что элемент каким-то магическим образом выворачивается наизнанку. Просто старый элемент убирается и создаётся его копия в которой геометрия отзеркалена. Потому и новый айдишник, это не "недороботка", а вполне штатное поведение инструментов.

    ОтветитьУдалить
    Ответы
    1. Алексей, как для пользователя, так и для программиста такое поведение неочевидно, по крайней мере об этом ничего не нашёл в документации или в справке.

      Основная проблема - при выполнении казалось бы простой операции, не предполагающей копирования элемента, ломается взаимосвязь элемента модели и внешнего источника данных по UniqueId.

      На мой взгляд, при нажатии на кнопку "Зеркало" должна быть применена соответствующая трансформация и обновлены взаимосвязи между элементами, а не создаваться новый элемент.

      Судя по тому что при перемещении и повороте элемента при нажатой галке "Разъединить" также слетают идентификаторы, скорее всего, решили не заморачиваться с обновлением/удалением связей между элементами.

      Удалить