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

13/09/2014

Уникальность наименования и класс NamingUtils

В Revit API полно сюрпризов. Вот один из них, которых правел нас к новому вспомогательному классу, который раньше был не замеченным.

Вопрос: У меня возникла довольно странная проблема с проверкой наименования при создании ParameterElementFilters. Ниже приведен пример кода, с котором создаются два фильтра ParameterElementFilters с одинаковыми настройками, за исключением незначительного отличия в именах:

Код - C#: [Выделить]
  1.   public void ParameterFilterElementError(
  2.     Document doc )
  3.   {
  4.     ICollection<ElementId> ceilingCategory
  5.       = new List<ElementId>();
  6.  
  7.     ceilingCategory.Add(
  8.       doc.Settings.Categories.get_Item(
  9.         BuiltInCategory.OST_Ceilings ).Id );
  10.  
  11.     using( Transaction tr = new Transaction( doc ) )
  12.     {
  13.       tr.Start( "Тест" );
  14.  
  15.       ParameterFilterElement.Create( doc,
  16.         "HygienKlass 2", ceilingCategory );
  17.  
  18.       ParameterFilterElement.Create( doc,
  19.         "Hygienklass 2", ceilingCategory );
  20.  
  21.       tr.Commit();
  22.     }
  23.   }

Имя первого фильтра - "HygienKlass 2", а второго -  "Hygienklass 2". В этом случае возникает исключение, в котором говорится, что имена одинаковые.

Есть ли способ это исправить?

Ответ: API ведет себя точно так же, как и пользовательский интерфейс в данном случае.

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

 

Ограничение, касающееся уникальности наименований нигде не упоминается в файле справке по Revit API, которое кстати касается не только фильтров.

Думаю, в будущем мы улучшим информативность этого сообщения и добавим более понятное объяснение.

Правила, по которым Revit проверяет уникальность имен, а также по которым он сортирует списки и деревья определенно могут оказаться неожиданными в некоторых случаях.

По этой причине, а также потому что используются не совсем стандартные методы сравнения строк, в Revit API был добавлен метод NamingUtils.CompareNames. Особенно это касается числовых последовательностей.

Класс NamingUtils содержит несколько методов, связанных с наименованием элементов. На текущий момент их два:

  • CompareNames – сравнивает две строки с помощью правил, определенных в Revit
  • IsValidName – Определяет, может ли строка использоваться с качестве наименования элемента Revit.

Источник: http://thebuildingcoder.typepad.com/blog/2014/09/unique-names-and-the-namingutils-class.html

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

Опубликовано 13.09.2014