Уникальность наименования и класс NamingUtils
В Revit API полно сюрпризов. Вот один из них, которых правел нас к новому вспомогательному классу, который раньше был не замеченным.
Вопрос: У меня возникла довольно странная проблема с проверкой наименования при создании ParameterElementFilters. Ниже приведен пример кода, с котором создаются два фильтра ParameterElementFilters с одинаковыми настройками, за исключением незначительного отличия в именах:
- public void ParameterFilterElementError(
- Document doc )
- {
- ICollection<ElementId> ceilingCategory
- = new List<ElementId>();
- ceilingCategory.Add(
- doc.Settings.Categories.get_Item(
- BuiltInCategory.OST_Ceilings ).Id );
- using( Transaction tr = new Transaction( doc ) )
- {
- tr.Start( "Тест" );
- ParameterFilterElement.Create( doc,
- "HygienKlass 2", ceilingCategory );
- ParameterFilterElement.Create( doc,
- "Hygienklass 2", ceilingCategory );
- tr.Commit();
- }
- }
Имя первого фильтра - "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