мой первый плагин

Автор Тема: мой первый плагин  (Прочитано 6203 раз)

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

Оффлайн goblyaАвтор темы

  • ADN OPEN
  • Сообщений: 13
  • Карма: 0
мой первый плагин
« : 22-01-2015, 01:34:17 »
Доброго времени суток!
Недавно начал изучать Revit API. Столкнулся со следующей проблемой.Для начала пытаюсь сделать плагин(или как это правильно называется?).Чтобы он показывал имя системы выбранного воздуховода.Но вместо имени системы мне выдает "autodesk.revit.db.parametr". И еще вопрос как сделать так чтобы при выделении можно выбрать было только воздуховод? код прикладываю
Код - C# [Выбрать]
  1. [TransactionAttribute(TransactionMode.Manual)]
  2. [RegenerationAttribute(RegenerationOption.Manual)]
  3. public class Lab1PlaceGroup : IExternalCommand
  4. {
  5.     public Result Execute(
  6.       ExternalCommandData commandData,
  7.       ref string message,
  8.       ElementSet elements)
  9.     {
  10.         UIApplication uiApp = commandData.Application;
  11.         Document doc = uiApp.ActiveUIDocument.Document;
  12.  
  13.         Reference pickedRef = null;
  14.         Selection sel = uiApp.ActiveUIDocument.Selection;
  15.         pickedRef = sel.PickObject(ObjectType.Element, "Please select a duct");
  16.         Element elem =doc.GetElement(pickedRef);
  17.  
  18.         Parameter Namesystem = elem.get_Parameter(BuiltInParameter.RBS_SYSTEM_NAME_PARAM);
  19.         TaskDialog.Show("Systems", Namesystem.ToString());
  20.         return Result.Succeeded;
  21.     }
  22. }
  23.  
« Последнее редактирование: 22-01-2015, 01:37:41 от Александр Ривилис »

Отмечено как Решение goblya 22-01-2015, 23:27:20

Оффлайн Виктор Чекалин

  • Administrator
  • *****
  • Сообщений: 694
  • Карма: 111
  • Skype: chekalin-v
Re: мой первый плагин
« Ответ #1 : 22-01-2015, 08:04:36 »
goblya, приветсвую на форуме.

Пока отвечу здесь. Но в дальнейшем создавайте отдельную тему для каждого вопроса.

По имени системы. Во-первых, получить название любого объекта, не только системы, можно гораздо проще:
Код - C# [Выбрать]
  1. Element elem =doc.GetElement(pickedRef);
  2. var name = elem.Name; // сразу вернет название

А выводится autodesk.revit.db.parametr, так как метод ToString() по умолчанию возвращает полное имя класса, что вы и увидели.
Чтобы значение строкового параметра, надо воспользоваться методом Parameter.AsString()
Код - C# [Выбрать]
  1. Parameter Namesystem = elem.get_Parameter(BuiltInParameter.RBS_SYSTEM_NAME_PARAM);
  2. TaskDialog.Show("Systems", Namesystem.AsString();

Оффлайн Виктор Чекалин

  • Administrator
  • *****
  • Сообщений: 694
  • Карма: 111
  • Skype: chekalin-v
Re: мой первый плагин
« Ответ #2 : 22-01-2015, 08:11:26 »
Для того, чтобы при выделении можно было выбрать только объект определенного типа, нужно воспользоваться перегруженным методом Selection.PickObject(ObjectType, ISelectionFilter) или  Selection.PickObject(ObjectType, ISelectionFilter, String)

В качестве ISelectionFilter, нужно передать экземпляр класса, реализующего интерфейс ISelectionFilter. В реализации класса определяется, какие элементы доступны для выделения.
Наример, для воздуховода:
Код - C# [Выбрать]
  1.     class DuctSelectionFilter : ISelectionFilter
  2.     {
  3.         public bool AllowElement(Element elem)
  4.         {
  5.             return elem is Duct; // разрешить выделение, если тип элемента - Duct
  6.         }
  7.  
  8.         public bool AllowReference(Reference reference, XYZ position)
  9.         {
  10.             throw new NotImplementedException();
  11.         }
  12.     }

Использование:
Код - C# [Выбрать]
  1. pickedRef = sel.PickObject(ObjectType.Element, new DuctSelectionFilter(), "Please select a duct");

Оффлайн goblyaАвтор темы

  • ADN OPEN
  • Сообщений: 13
  • Карма: 0
Re: мой первый плагин
« Ответ #3 : 22-01-2015, 23:26:52 »
спасибо большое.
насчет
Код - C# [Выбрать]
  1.     Element elem =doc.GetElement(pickedRef);
  2.     var name = elem.Name; // сразу вернет название
  3.  
так он возвращает не имя системы, а тип соединений данного воздуховода у меня он выдал "Тройники".
На счет AsString - как раз то что нужно!
В этой строчке
Код - C# [Выбрать]
  1. return elem is Duct;
мне VS выделила красным, но решение оказалось простое либо добавить в начало
Код - C# [Выбрать]
  1. using Autodesk.Revit.DB.Mechanical;
либо заменить duct на
Код - C# [Выбрать]
  1. Autodesk.Revit.DB.Mechanical.Duct
Еще рас спасибо большое, теперь я у Вас тут пропишусь  :)
« Последнее редактирование: 23-01-2015, 08:23:43 от Виктор Чекалин »

Оффлайн Виктор Чекалин

  • Administrator
  • *****
  • Сообщений: 694
  • Карма: 111
  • Skype: chekalin-v
Re: мой первый плагин
« Ответ #4 : 23-01-2015, 08:26:34 »
так он возвращает не имя системы, а тип соединений данного воздуховода у меня он выдал "Тройники".
Упс.. действительно. Не внимательно вопрос прочитал. Вариант с параметром верный.

мне VS выделила красным, но решение оказалось простое либо добавить в начало
Код - C#: [Выделить]
using Autodesk.Revit.DB.Mechanical;
Да, так как класс Duct находится в namespace Autodesk.Revit.DB.Mechanical.