Определение типа воздуховода

Автор Тема: Определение типа воздуховода  (Прочитано 12819 раз)

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

Тема содержит сообщение с Решением. Нажмите здесь чтобы посмотреть его.

Оффлайн Сергей ОдеговАвтор темы

  • ADN OPEN
  • Сообщений: 48
  • Карма: 0
  • Skype: sergey_mmt
Здравствуйте!
Как определить прямоугольный воздуховод или овальный (в частности круглый)?
Перебор я делаю так
Код - 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.  

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

  • Administrator
  • *****
  • Сообщений: 694
  • Карма: 111
  • Skype: chekalin-v
Re: Определение типа воздуховода
« Ответ #1 : 15-05-2015, 09:06:15 »
multys, день добрый.

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


Получить имя семейства можно из типа. Т.е. сначала берете тип воздуховода 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.             }

Оффлайн Сергей ОдеговАвтор темы

  • ADN OPEN
  • Сообщений: 48
  • Карма: 0
  • Skype: sergey_mmt
Re: Определение типа воздуховода
« Ответ #2 : 15-05-2015, 09:08:31 »
Спасибо сейчас попробую....

Оффлайн Сергей ОдеговАвтор темы

  • ADN OPEN
  • Сообщений: 48
  • Карма: 0
  • Skype: sergey_mmt
Re: Определение типа воздуховода
« Ответ #3 : 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.  



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

  • Administrator
  • *****
  • Сообщений: 694
  • Карма: 111
  • Skype: chekalin-v
Re: Определение типа воздуховода
« Ответ #4 : 15-05-2015, 09:56:19 »
почему то ошибка возникает на этой строке:

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

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

Диаметр можно получить только для круглого.
С справке по Revit API так и говорится:


Возникает исключение, если фигура не круглая.

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

  • Administrator
  • *****
  • Сообщений: 694
  • Карма: 111
  • Skype: chekalin-v
Re: Определение типа воздуховода
« Ответ #5 : 15-05-2015, 09:58:33 »
Упс, не сразу увидели изображение с ошибкой.
Как то странно, вы пишите, что ошибка возникает на строке где извлекается диаметр, но текст ошибки говорит о том, что она возникает при извлечении ширины.

Но суть не меняется. Длина и ширина для овальных или прямоугольных только. Диаметр - только для круглых.

Оффлайн Сергей ОдеговАвтор темы

  • ADN OPEN
  • Сообщений: 48
  • Карма: 0
  • Skype: sergey_mmt
Re: Определение типа воздуховода
« Ответ #6 : 15-05-2015, 10:00:57 »
Ну понятно... )))
Как же в таком случае поступить. Если в проекте кроме прямоугольных еще и круглые.
Если не рисовать круглый воздуховод, то для прямоугольных считает все ок.

Оффлайн Сергей ОдеговАвтор темы

  • ADN OPEN
  • Сообщений: 48
  • Карма: 0
  • Skype: sergey_mmt
Re: Определение типа воздуховода
« Ответ #7 : 15-05-2015, 10:02:32 »
Может проверить круглый Shape или прямоугольный. Вчера пробовал. но так и не смог добраться до свойства Shape и Rectangular ... Они в Connector сидят? Подскажите как проверить тогда?

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

  • Administrator
  • *****
  • Сообщений: 694
  • Карма: 111
  • Skype: chekalin-v
Re: Определение типа воздуховода
« Ответ #8 : 15-05-2015, 10:06:57 »
Как же в таком случае поступить.
Я бы как всегда начал с того, что в итоге получить надо?:) Толщину изоляции или толщину материала воздуховода?
Что-то мне показывает, что это надо по другому делать, а не хардкодить значения толщины:)

Оффлайн Сергей ОдеговАвтор темы

  • ADN OPEN
  • Сообщений: 48
  • Карма: 0
  • Skype: sergey_mmt
Re: Определение типа воздуховода
« Ответ #9 : 15-05-2015, 10:23:05 »
Значения ниоткуда не берутся, они мной задаются вручную в программе. Они не низменны - прописаны в СП
Это не значение толщины изоляции и не толщина материала.... да это собственно и не важно, на мой взгляд.
Ведь получается исключение возникает, а почему оно возникает?
Вот смотрите, если в проекте я рисую прямоугольные воздуховоды и назначаю переменные которым присваивается Ширина и Высота и все работает без исключений, то почему я не могу присвоить переменной диаметр, конечно при этом нарисовать круглый воздухвод?

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

  • Administrator
  • *****
  • Сообщений: 694
  • Карма: 111
  • Skype: chekalin-v
Re: Определение типа воздуховода
« Ответ #10 : 15-05-2015, 10:39:53 »
Это не значение толщины изоляции и не толщина материала.... да это собственно и не важно, на мой взгляд.
Это смотря с какой стороны посмотреть. Просто очень часто задачу пытаются решить не теми методами, которую ее надо решать, а используют костыли. Т.е. да, мы можем найти решение, как избавится от ошибки, путем различных проверок, но это будет костыльное решение. Возможно есть более элегантное решение.

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

Вот смотрите, если в проекте я рисую прямоугольные воздуховоды и назначаю переменные которым присваивается Ширина и Высота и все работает без исключений, то почему я не могу присвоить переменной диаметр, конечно при этом нарисовать круглый воздухвод?
Не понял. Если вы работаете с круглым воздуховодом, то при попытке получить диаметр не будет ошибки. Если с прямоугольным, то будет.

Оффлайн Сергей ОдеговАвтор темы

  • ADN OPEN
  • Сообщений: 48
  • Карма: 0
  • Skype: sergey_mmt
Re: Определение типа воздуховода
« Ответ #11 : 15-05-2015, 10:43:47 »
А если одновременно и с теми и с другими. Как объяснить программе что есть и круглые и прямоугольные и что для прямоугольных надо брать Ширину и Высоту, а для круглых Диаметр?

Отмечено как Решение Сергей Одегов 15-05-2015, 11:53:06

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

  • Administrator
  • *****
  • Сообщений: 694
  • Карма: 111
  • Skype: chekalin-v
Re: Определение типа воздуховода
« Ответ #12 : 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.                 }

Оффлайн Сергей ОдеговАвтор темы

  • ADN OPEN
  • Сообщений: 48
  • Карма: 0
  • Skype: sergey_mmt
Re: Определение типа воздуховода
« Ответ #13 : 15-05-2015, 11:40:46 »
Да Спасибо. Но, так мы просто проверим есть ли вообще круглые или прямоугольные воздуховоды.
А если у категории воздуховодов один общий параметр, а значения у него должны быть разные в зависимости от того круглый воздуховод или прямоугольный.
Как определить именно у какого конкретно воздуховода есть диаметр, а у какого ширина и высота и в соответствии с этим уже параметр назначить.

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

  • Administrator
  • *****
  • Сообщений: 694
  • Карма: 111
  • Skype: chekalin-v
Re: Определение типа воздуховода
« Ответ #14 : 15-05-2015, 13:06:47 »
А если у категории воздуховодов один общий параметр, а значения у него должны быть разные в зависимости от того круглый воздуховод или прямоугольный.
Как определить именно у какого конкретно воздуховода есть диаметр, а у какого ширина и высота и в соответствии с этим уже параметр назначить.
Так и определить, предложенным выше кодом. если есть диаметр, значит круглый, значит используем диаметр и записываем значение параметра, если нет диаметра, то берем ширину и высоту и их используем для записи в значение параметра.
Вам просто нужно соединить два куска кода: мой и ваш и все получится.