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

30/09/2015

Создание крыши

Изначально вопрос бы задан на форуме Revit API и Stack Overflow:

Вопрос: У меня проблема с программным созданием крыши. Я знаю, как создавать лестницы, к примеру, используя CreateSketchedLanding с корректными параметрами. Но вот как воздать крышу с нуля, не пойму. Может кто-нибудь направить меня в нужное русло?

Ответ: Пожалуйста, всегда ищите нужную информацию в файле справки Revit API и онлайн помощи до того, как задавать подобные вопросы.

Вот один из моих недавних примеров по разделу Крыши:

Код - C#: [Выделить]
  1.   // Перед запуском примера, выделите несколько стен
  2.   // над которыми будет создана крыша. Удостоверьтесь, что в
  3.   // проекте есть уровень «Крыша»
  4.  
  5.   Level level
  6.     = new FilteredElementCollector( doc )
  7.       .OfClass( typeof( Level ) )
  8.       .Where<Element>( e =>
  9.         !string.IsNullOrEmpty( e.Name )
  10.         && e.Name.Equals( "Крыша" ) )
  11.       .FirstOrDefault<Element>() as Level;
  12.  
  13.   RoofType roofType
  14.     = new FilteredElementCollector( doc )
  15.       .OfClass( typeof( RoofType ) )
  16.       .FirstOrDefault<Element>() as RoofType;
  17.  
  18.   // Ссылка на приложен
  19.   Application application = doc.Application;
  20.  
  21.   // Определяем контур нашей крыше по выделенным стенам
  22.   CurveArray footprint = application.Create
  23.     .NewCurveArray();
  24.  
  25.   UIDocument uidoc = new UIDocument( doc );
  26.  
  27.   ICollection<ElementId> selectedIds
  28.     = uidoc.Selection.GetElementIds();
  29.  
  30.   if( selectedIds.Count != 0 )
  31.   {
  32.     foreach( ElementId id in selectedIds )
  33.     {
  34.       Element element = doc.GetElement( id );
  35.       Wall wall = element as Wall;
  36.       if( wall != null )
  37.       {
  38.         LocationCurve wallCurve = wall.Location as LocationCurve;
  39.         footprint.Append( wallCurve.Curve );
  40.         continue;
  41.       }
  42.  
  43.       ModelCurve modelCurve = element as ModelCurve;
  44.       if( modelCurve != null )
  45.       {
  46.         footprint.Append( modelCurve.GeometryCurve );
  47.       }
  48.     }
  49.   }
  50.   else
  51.   {
  52.     throw new Exception(
  53.       "Пожалуйста, выберите замкнутые кривые или замкнутые стены "
  54.       + "или комбинацию стен и кривых, образующих замкнутое пространство"
  55.       + " для создания крыши по контуру." );
  56.   }
  57.  
  58.   ModelCurveArray footPrintToModelCurveMapping
  59.     = new ModelCurveArray();
  60.  
  61.   FootPrintRoof footprintRoof
  62.     = doc.Create.NewFootPrintRoof(
  63.       footprint, level, roofType,
  64.       out footPrintToModelCurveMapping );
  65.  
  66.   ModelCurveArrayIterator iterator
  67.     = footPrintToModelCurveMapping.ForwardIterator();
  68.  
  69.   iterator.Reset();
  70.   while( iterator.MoveNext() )
  71.   {
  72.     ModelCurve modelCurve = iterator.Current as ModelCurve;
  73.     footprintRoof.set_DefinesSlope( modelCurve, true );
  74.     footprintRoof.set_SlopeAngle( modelCurve, 0.5 );
  75.   }

Для тестирования проверьте, что в модели есть стены, над которыми можно разместить крышу и что в модели есть уровень с именем «Крыша».

Я создал простой прямоугольник из стен, выбрал их и запустил команду.

Этот код создает крышу по контуру.

Revit позволяет также создавать другие типы крыш.

Важно понимать, как работает Revit и что обозначают разные типы крыш с точки зрения пользователя до того, как реализовывать создание с помощью API.

Крыша по контуру определяется горизонтальным контуром и создается с помощью метода Document.NewFootPrintRoof. такие крыши могут быть плоскими, или вы можете задать наклон для каждой стороны крыши.

В Building Coder Xtra labs есть еще рабочие примеры создания крыш в команде Lab2_0_CreateLittleHouse in Labs2.cs

 

На сайте The Building Coder также есть несколько примеров по созданию крыш (на англ.):

Источник: http://thebuildingcoder.typepad.com/blog/2015/09/revit-answer-day-and-creating-a-roof.html

Автор перевода: Виктор Чекалин

Обсуждение: http://adn-cis.org/forum/index.php?topic=3060

Опубликовано 30.09.2015