[Revit API]. Создание типа для системного семейства Текст (TextNoteType)

Автор Тема: [Revit API]. Создание типа для системного семейства Текст (TextNoteType)  (Прочитано 4297 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Александр Пекшев aka ModisАвтор темы

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Стояла у меня задача, для выполнения которой требовалось создание собственного типа для системного семейства Текст (Текстовое примечание).
Немного поискав информацию на просторах интернета, я наткнулся на данный пример, объясняющий, что для создания типа требуется создавать дубликат существующего типа. Вот только в примере совсем не уделено внимание тому, как и какие параметры задавать. Особенно остро стоит вопрос задания значения для параметра «Цвет».
Почитав в теме комментарии, я понял, что вопрос волновал многих и, к моему сожалению, в комментариях нет правильного ответа. Я решил исправить эту маленькую несправедливость и сделал небольшой пример создания типа для системного семейства Текст. Все пояснения я оставил в виде комментариев к коду.
Вот и сам пример:
Код - C# [Выбрать]
  1. using System.Drawing;
  2. using Autodesk.Revit.Attributes;
  3. using Autodesk.Revit.DB;
  4. using Autodesk.Revit.UI;
  5.  
  6. namespace TextNoteTypeExample
  7. {
  8.     [Transaction(TransactionMode.Manual)]
  9.     public class Command : IExternalCommand
  10.     {
  11.         public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
  12.         {
  13.             // Текущий документ
  14.             Document doc = commandData.Application.ActiveUIDocument.Document;
  15.             /* Создание типа для текста (текстовое примечание) «с нуля»
  16.              * не предусмотрено в Revit API. Решением является дублирование
  17.              * существующего типа и задание ему нужных значений параметров. */
  18.  
  19.             //Поэтому сначала получаем все типы для текста в документе и берем первый попавшийся:
  20.             var existingTextNoteType =
  21.                 new FilteredElementCollector(doc).OfClass(typeof(TextNoteType)).FirstElement() as TextNoteType;
  22.             if (existingTextNoteType != null)
  23.                 using (Transaction tr = new Transaction(doc, "TextNoteTypeExample"))
  24.                 {
  25.                     tr.Start();
  26.                     /* При создании дубликата типа требуется указать новое имя.
  27.                      * В данном примере я опущу валидацию имени для нового типа,
  28.                      * однако Вы должны учитывать, что имя должно быть уникальным
  29.                      * для текущего документа (т.е. нельзя создать двух типов
  30.                      * с одинаковым именем) и не должно содержать следующие символы:
  31.                      * \ : { } [ ] | ; < > ? ` ~
  32.                      * А также не должно содержать непечатаемых символов */
  33.                     var newTextNoteType = existingTextNoteType.Duplicate("MyNewTextNoteType");
  34.                     if (newTextNoteType != null)
  35.                     {
  36.                         /* Теперь заполним значения основных параметров
  37.                          * (те параметры, которые отображаются в окне Свойства типа в Revit)
  38.                          * в том же порядке, в каком они отображаются в окне Свойства типа.
  39.                          * Я постараюсь подробнее описать значения параметров */
  40.  
  41.                         /*Самый сложный параметр – это цвет. Цвет задается в виде целого
  42.                          * числа и те, кто с этим еще не сталкивался, не сразу понимают,
  43.                          * как задать это значение. На самом деле все просто – это число –
  44.                          * это цвета Windows. Подробностей я не расскажу, так как тема
  45.                          * цветов сложная и объемная.
  46.                          * В нашем случае я возьму именованный цвет и конвертирую его в
  47.                          * целочисленное значение цвета Windows. Для этого потребуется
  48.                          * добавить ссылку на библиотеку System.Drawings */
  49.                         System.Drawing.Color color = System.Drawing.Color.DodgerBlue;
  50.                         newTextNoteType.get_Parameter(BuiltInParameter.LINE_COLOR).Set(ColorTranslator.ToWin32(color));
  51.                         /* Вес линии задается как целочисленное значение и соответствует
  52.                          * номеру в окне Вес линий. В примере я задаю 1, но если вам нужно
  53.                          * другое значение, то вы должны следить за тем, чтобы
  54.                          * не задать номера, отсутствующего в документе */
  55.                         newTextNoteType.get_Parameter(BuiltInParameter.LINE_PEN).Set(1);
  56.                         // С задним планом все просто: 0 – непрозрачный, 1 - прозрачный
  57.                         newTextNoteType.get_Parameter(BuiltInParameter.TEXT_BACKGROUND).Set(1);
  58.                         // Показать границу: 0 – нет, 1 - да
  59.                         newTextNoteType.get_Parameter(BuiltInParameter.TEXT_BOX_VISIBILITY).Set(1);
  60.                         /* Смещение выноски/границы задается в футах (независимо от того,
  61.                          * в каких единицах отображается в окне Свойства типа). Чтобы не забивать
  62.                          * себе голову переводом единиц, воспользуемся классом UnitUtils.
  63.                          * (Хотя я и задаю значение 0.0 все равно советую использовать
  64.                          * конвертер, чтобы при последующем использовании случайно не задать неверное значение) */
  65.                         newTextNoteType.get_Parameter(BuiltInParameter.LEADER_OFFSET_SHEET)
  66.                             .Set(UnitUtils.ConvertToInternalUnits(0.0, DisplayUnitType.DUT_MILLIMETERS));
  67.                         /* Стрелка выноски задается в виде ElementId. Т.е. нужно в документе
  68.                          * найти все имеющиеся засечки (Element Type) и у требуемой засечки
  69.                          * получить Id. В контексте данной темы я не рассматриваю варианты
  70.                          * поиска засечек и просто подам значение «нет»*/
  71.                         newTextNoteType.get_Parameter(BuiltInParameter.LEADER_ARROWHEAD).Set(ElementId.InvalidElementId);
  72.                         /*Шрифт текста – значение параметра задается как обычная строка и
  73.                          * должно соответствовать имени шрифта, имеющегося в системе.
  74.                          * Предположительно, чувствительно к регистру. Я не проводил
  75.                          * экспериментов, устанавливая неверное значение. Как получить список
  76.                          * шрифтов в системе можете прочитать тут -
  77.                          * https://docs.microsoft.com/en-us/dotnet/framework/wpf/advanced/how-to-enumerate-system-fonts */
  78.                         newTextNoteType.get_Parameter(BuiltInParameter.TEXT_FONT).Set("Arial Black");
  79.                         // Размер текста также хранится в футах. В примере я задаю размер в миллиметрах
  80.                         newTextNoteType.get_Parameter(BuiltInParameter.TEXT_SIZE)
  81.                             .Set(UnitUtils.ConvertToInternalUnits(3.0, DisplayUnitType.DUT_MILLIMETERS));
  82.                         // Для отступа также, как и для размера текста
  83.                         newTextNoteType.get_Parameter(BuiltInParameter.TEXT_TAB_SIZE)
  84.                             .Set(UnitUtils.ConvertToInternalUnits(10.0, DisplayUnitType.DUT_MILLIMETERS));
  85.                         // Значения параметров «Жирный», «Курсив» и «Подчеркнутый»
  86.                         // задаются как целое число: 0 – нет, 1 - да
  87.                         newTextNoteType.get_Parameter(BuiltInParameter.TEXT_STYLE_BOLD).Set(0);
  88.                         newTextNoteType.get_Parameter(BuiltInParameter.TEXT_STYLE_ITALIC).Set(1);
  89.                         newTextNoteType.get_Parameter(BuiltInParameter.TEXT_STYLE_UNDERLINE).Set(1);
  90.                         // Коэффициент ширины задается как число с плавающей
  91.                         // запятой (double) и принимает значение от 0.1 до 10.0
  92.                         newTextNoteType.get_Parameter(BuiltInParameter.TEXT_WIDTH_SCALE).Set(1.0);
  93.                     }
  94.  
  95.                     tr.Commit();
  96.                 }
  97.  
  98.             return Result.Succeeded;
  99.         }
  100.     }
  101. }

Запустив данный код в Revit, получим новый тип с верными значениями всех заданных параметров:



На этом у меня все. Спасибо за внимание