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

ADN Club => Revit API => Тема начата: Сергей Одегов от 14-05-2015, 18:48:29

Название: Определение типа воздуховода
Отправлено: Сергей Одегов от 14-05-2015, 18:48:29
Здравствуйте!
Как определить прямоугольный воздуховод или овальный (в частности круглый)?
Перебор я делаю так
Код - C# [Выбрать]
  1.  private IEnumerable<Duct> FindDucts(Document document)
  2.         {
  3.             var collector = new FilteredElementCollector(document);
  4.  
  5.             return collector
  6.                 .OfClass(typeof (Duct))
  7.                 .ToElements()
  8.                 .OfType<Duct>();
  9.  
Название: Re: Определение типа воздуховода
Отправлено: Виктор Чекалин от 15-05-2015, 09:06:15
multys, день добрый.

Если мы зайдем в свойства типа любого воздуховода, то мы увидим, что интересующая вас информация это есть ни что иное как наименование семейства
(https://adn-cis.org/forum/proxy.php?request=http%3A%2F%2Fs11.postimg.org%2F3qdch3aa7%2F2015_05_15_1057.jpg&hash=90c88bb998a26de4cb3f8a645c7892d4) (http://postimg.org/image/3qdch3aa7/)

Получить имя семейства можно из типа. Т.е. сначала берете тип воздуховода duct.DuctType, затем у этого типа берете свойство DuctType.FamilyName:

Код - C# [Выбрать]
  1.             var collector = new FilteredElementCollector(document);
  2.  
  3.             var ducts= collector
  4.                 .OfClass(typeof (Duct))
  5.                 .ToElements()
  6.                 .OfType<Duct>()
  7.                 .ToList();
  8.            
  9.             foreach (Duct duct in ducts) {
  10.                 var ductType = duct.DuctType;
  11.                 var familyName = ductType.FamilyName;
  12.                 Debug.Print("{0} - {1}", duct.Name, familyName);
  13.             }
Название: Re: Определение типа воздуховода
Отправлено: Сергей Одегов от 15-05-2015, 09:08:31
Спасибо сейчас попробую....
Название: Re: Определение типа воздуховода
Отправлено: Сергей Одегов от 15-05-2015, 09:40:03
Не понимаю что мне надо сделать, чтобы заработало....
Я выполняю проверку функцией и возвращаю нужное мне значение.
Предварительно выбираю все воздуховоды методом описным выше. Ведь я все воздуховоды выбираю и круглые и овальные и прямоугольные, верно?
почему то ошибка возникает на этой строке:

Код - C# [Выбрать]
  1. var ductDiametr = duct.Diameter * 0.3048;
  2.  
Что я не учел подскажите.
Код функции которая возвращает значение. Полученное значение потом просто назначается общему параметру, который создан мной заранее при помощи интерфейса и назначен категории воздуховоды.

Код - C# [Выбрать]
  1. private string CalculateThiknessIfInsulation(Duct duct)
  2.         {
  3.  
  4.             var ductDiametr = duct.Diameter * 0.3048;
  5.  
  6.  
  7.             var ductWidth = duct.Width * 0.3048;
  8.             var ductHeight = duct.Height * 0.3048;
  9.            
  10.            
  11.             if ((ductWidth >= ductHeight) && (ductWidth <= 1))
  12.                 return "0.8 мм";
  13.             else if ((ductWidth <= ductHeight) && (ductHeight <= 1))
  14.                 return "0.8 мм";
  15.             else
  16.             {
  17.                 return "0.9 мм";
  18.             }
  19.  
  20.   }
  21.  


Название: Re: Определение типа воздуховода
Отправлено: Виктор Чекалин от 15-05-2015, 09:56:19
почему то ошибка возникает на этой строке:

Код - C#: [Выделить]
var ductDiametr = duct.Diameter * 0.3048;
 

А какой диаметр у прямоугольного воздуховода? или овального?

Диаметр можно получить только для круглого.
С справке по Revit API так и говорится:
(https://adn-cis.org/forum/proxy.php?request=http%3A%2F%2Fs12.postimg.org%2Fzennt9l1l%2F2015_05_15_1155.jpg&hash=fa8cabf21e86ce12982208e2ec710b85) (http://postimg.org/image/zennt9l1l/)

Возникает исключение, если фигура не круглая.
Название: Re: Определение типа воздуховода
Отправлено: Виктор Чекалин от 15-05-2015, 09:58:33
Упс, не сразу увидели изображение с ошибкой.
Как то странно, вы пишите, что ошибка возникает на строке где извлекается диаметр, но текст ошибки говорит о том, что она возникает при извлечении ширины.

Но суть не меняется. Длина и ширина для овальных или прямоугольных только. Диаметр - только для круглых.
Название: Re: Определение типа воздуховода
Отправлено: Сергей Одегов от 15-05-2015, 10:00:57
Ну понятно... )))
Как же в таком случае поступить. Если в проекте кроме прямоугольных еще и круглые.
Если не рисовать круглый воздуховод, то для прямоугольных считает все ок.
Название: Re: Определение типа воздуховода
Отправлено: Сергей Одегов от 15-05-2015, 10:02:32
Может проверить круглый Shape или прямоугольный. Вчера пробовал. но так и не смог добраться до свойства Shape и Rectangular ... Они в Connector сидят? Подскажите как проверить тогда?
Название: Re: Определение типа воздуховода
Отправлено: Виктор Чекалин от 15-05-2015, 10:06:57
Как же в таком случае поступить.
Я бы как всегда начал с того, что в итоге получить надо?:) Толщину изоляции или толщину материала воздуховода?
Что-то мне показывает, что это надо по другому делать, а не хардкодить значения толщины:)
Название: Re: Определение типа воздуховода
Отправлено: Сергей Одегов от 15-05-2015, 10:23:05
Значения ниоткуда не берутся, они мной задаются вручную в программе. Они не низменны - прописаны в СП
Это не значение толщины изоляции и не толщина материала.... да это собственно и не важно, на мой взгляд.
Ведь получается исключение возникает, а почему оно возникает?
Вот смотрите, если в проекте я рисую прямоугольные воздуховоды и назначаю переменные которым присваивается Ширина и Высота и все работает без исключений, то почему я не могу присвоить переменной диаметр, конечно при этом нарисовать круглый воздухвод?
Название: Re: Определение типа воздуховода
Отправлено: Виктор Чекалин от 15-05-2015, 10:39:53
Это не значение толщины изоляции и не толщина материала.... да это собственно и не важно, на мой взгляд.
Это смотря с какой стороны посмотреть. Просто очень часто задачу пытаются решить не теми методами, которую ее надо решать, а используют костыли. Т.е. да, мы можем найти решение, как избавится от ошибки, путем различных проверок, но это будет костыльное решение. Возможно есть более элегантное решение.

Ведь получается исключение возникает, а почему оно возникает?
Потому что нет диаметра у прямоугольника.

Вот смотрите, если в проекте я рисую прямоугольные воздуховоды и назначаю переменные которым присваивается Ширина и Высота и все работает без исключений, то почему я не могу присвоить переменной диаметр, конечно при этом нарисовать круглый воздухвод?
Не понял. Если вы работаете с круглым воздуховодом, то при попытке получить диаметр не будет ошибки. Если с прямоугольным, то будет.
Название: Re: Определение типа воздуховода
Отправлено: Сергей Одегов от 15-05-2015, 10:43:47
А если одновременно и с теми и с другими. Как объяснить программе что есть и круглые и прямоугольные и что для прямоугольных надо брать Ширину и Высоту, а для круглых Диаметр?
Название: Re: Определение типа воздуховода
Отправлено: Виктор Чекалин от 15-05-2015, 10:46:44
В общем в качестве решения, можно работать не со свойствами, а с параметрами. Проверить, если есть параметр диаметр, то берем его, если есть параметр ширины и длины, то берем их. Ошибко не будет.
Например вот так:
Код - C# [Выбрать]
  1.                 //ищем параметр ДИаметр
  2.                 var ductDiameterParam = duct.get_Parameter(BuiltInParameter.RBS_CURVE_DIAMETER_PARAM);
  3.                
  4.                 if (ductDiameterParam!=null)
  5.                 {
  6.                         // Если он найден, то берем его значение
  7.                         // можно через свойство
  8.                         var ductDiametr = duct.Diameter * 0.3048;
  9.                        
  10.                         // можно через значение параметра
  11.                         var ductDiametr2 = duct.ductDiameterParam.AsDouble() * 0.3048;
  12.                 }
  13.                
  14.                 // Ищем параметр Ширина
  15.                 var ductWitdthParam = duct.get_Parameter(BuiltInParameter.RBS_CURVE_WIDTH_PARAM);
  16.                
  17.                 // ищем паратмер Высота
  18.                 var ductHeightParam = duct.get_Parameter(BuiltInParameter.RBS_CURVE_HIEGHT_PARAM);
  19.                 if (ductWitdthParam != null && ductHeightParam != null)
  20.                 {
  21.                         // если есть ширина и высота, то берем значения параметров
  22.                         var width = ductWitdthParam.AsDouble();
  23.                         var height = ductHeightParam.AsDouble();
  24.                 }
Название: Re: Определение типа воздуховода
Отправлено: Сергей Одегов от 15-05-2015, 11:40:46
Да Спасибо. Но, так мы просто проверим есть ли вообще круглые или прямоугольные воздуховоды.
А если у категории воздуховодов один общий параметр, а значения у него должны быть разные в зависимости от того круглый воздуховод или прямоугольный.
Как определить именно у какого конкретно воздуховода есть диаметр, а у какого ширина и высота и в соответствии с этим уже параметр назначить.
Название: Re: Определение типа воздуховода
Отправлено: Виктор Чекалин от 15-05-2015, 13:06:47
А если у категории воздуховодов один общий параметр, а значения у него должны быть разные в зависимости от того круглый воздуховод или прямоугольный.
Как определить именно у какого конкретно воздуховода есть диаметр, а у какого ширина и высота и в соответствии с этим уже параметр назначить.
Так и определить, предложенным выше кодом. если есть диаметр, значит круглый, значит используем диаметр и записываем значение параметра, если нет диаметра, то берем ширину и высоту и их используем для записи в значение параметра.
Вам просто нужно соединить два куска кода: мой и ваш и все получится.
Название: Re: Определение типа воздуховода
Отправлено: Сергей Одегов от 15-05-2015, 13:18:53
Да Виктор, абсолютно верно. Спасибо. Вы меня извините я тут совсем новичок. Может у меня будут глупые вопросы... но разобраться мне необходимо