Построить перила по профилю лестницы

Автор Тема: Построить перила по профилю лестницы  (Прочитано 2991 раз)

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

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

  • ADN OPEN
  • **
  • Сообщений: 87
  • Карма: 0
Добрый день.
Прошу помощи разобраться с лестницами, а точнее как по пути лестницы построить ограждение.
Вот на чем я застопорился:
Код - C# [Выбрать]
  1.                 public void Stairs()
  2.                 {
  3.                         UIDocument uidoc = this.ActiveUIDocument;
  4.                         Document doc = uidoc.Document;
  5.                         Selection sel = uidoc.Selection;
  6.                         ICollection<ElementId> collection=sel.GetElementIds();
  7.                         CurveArrArray curArrar = new CurveArrArray();
  8.                         CurveArray curArr = new CurveArray();
  9.                         ReferenceArray reArr = new ReferenceArray();
  10.                        
  11.                         foreach (ElementId id in collection)
  12.                         {
  13.                                 Stairs stairs = doc.GetElement(id) as Stairs;
  14.                                 ICollection<ElementId> stL = stairs.GetStairsLandings();
  15.                                 foreach (ElementId el in stL) {
  16.                                         StairsLanding landing = stairs.Document.GetElement(el) as StairsLanding;
  17.                                         CurveLoop getPath = landing.GetStairsPath();
  18.                                         Plane getplane = getPath.GetPlane();
  19.                                        
  20.                                         using (Transaction tr = new Transaction(doc))
  21.                                         {
  22.                                                 tr.Start("test");
  23.                                                 Arc ark1 = Arc.Create(getplane, 10,0, Math.PI);
  24.                                                 Arc ark2 = Arc.Create(getplane, 10,Math.PI, Math.PI*2);
  25.                                                 curArr.Append(ark1);
  26.                                                 curArr.Append(ark2);
  27.                                                
  28.                                                 SweepProfile prof = this.Application.Create.NewCurveLoopsProfile(curArr);
  29.                                                
  30.                                                 Sweep sweep = doc.FamilyCreate.NewSweep(true,prof, 0, ProfilePlaneLocation.Start);
  31.                                                
  32.                                                 tr.Commit();
  33.                                         }
  34.                                 }
  35.                                
  36.                         }
  37.                 }
Чтобы создать новый сдвиг по 3D пути, нужно 4 аргумента. У меня возникли проблемы с двумя
ReferenceArray path и SweepProfile profileУ лестницы я могу получить CurveLoop. Как мне изCurveLoop сделать ReferenceArray?
Заранее спасибо.

Оффлайн Александр Игнатович

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
Добрый день!

Что-то смешались у Вас кони, люди (с)

Сначала Вы пытаетесь получить лестницы (Stairs), они существуют в проекте, затем пытаетесь создать геометрию семейства. Даже не запуская код, можно с уверенностью сказать, что выпадет с InvalidOperationException при получении doc.FamilyCreate (если раньше не отвалится с NullReferenceException в случае, если выбрано что-то не являющееся лестницей))


Скорее всего, Вам подойдет следующий метод создания ограждения (код на Iron Python Shell):
Код - Python [Выбрать]
  1. from Autodesk.Revit.DB.Architecture import *
  2.  
  3. railingTypeId = doc.GetDefaultElementTypeId(ElementTypeGroup.StairsRailingType)
  4.  
  5. tx = Transaction(doc, "ss")
  6. tx.Start()
  7.  
  8. Railing.Create(doc, selection[0].Id, railingTypeId, RailingPlacementPosition.Treads) # перед запуском нужно обязательно выбрать лестницу
  9.  
  10. tx.Commit()

Думаю, на C# перевести проблем не будет. Вот ссылка на метод создания ограждения лестницы: http://www.revitapidocs.com/2017.1/1c9de88b-8038-4ac9-37bd-9b6fd5e1f801.htm

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

  • ADN OPEN
  • **
  • Сообщений: 87
  • Карма: 0
Спасибо за ответ, но это не совсем то.
Для эксперимента я хотел получить путь у лестницы и уже по этому пути сделать сдвиг окружности. Сами ограждения в данном случае не совсем подходят так как изначально, когда они создаются при создании лестницы они периодически некорректно соединятся в местах переходов, вот возникла идея сделать это все сдвигом.

Оффлайн Александр Игнатович

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
Тогда можно попробовать генерировать Solid правильной формы, используя GeometryCreationUtilities  + BooleanOperationsUtils и создавать геометрию с помощью DirectShape.

Насчет лестниц есть небольшая проблемка в контексте данной задачи. Методы GetStairsPath() у StairsRun и StairsLanding возвращают кривые, спроецированные на базовый уровень лестницы, так что их придется "поднимать" в 3d

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

  • ADN OPEN
  • **
  • Сообщений: 87
  • Карма: 0
Спасибо, попробую