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

27/12/2014

Создание зависимостей труб по осевой линии

Заказчик хочет использовать Revit API для создания зависимостей двух труб по центру их осей. Я думаю, это вполне осуществимо, и вот такой у меня родился план действий:

  • Получить осевую линию труб с помощью метода Element.get_Geometry()
  • Создать новую зависимость методом Document.Create.NewAlignment()

Но, я получаю исключение ArgumentException “One of the conditions for the inputs was not satisfied. Consult the documentation for requirements for each argument” – Один из входящих параметров не удовлетворяет условию создания зависимости. Обратитесь к документации.

Беда…

Phil, из команды разработки, помог мне решить эту проблему и сделать код работоспособным. Основной момент заключается в том, что сначала необходимо физически выровнять трубы по центру. Что, собственно, и сказано в документации:

Элементы должны быть геометрически выровнены (метод не выровняет их самостоятельно)

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

Стоит отметить следующее:

  • Убедитесь, что свойство GeometryOptions.ComputeReferences установлено в значение true. Это гарантирует, что мы сможем извлечь геометрию из элемента
  • Убедитесь, что свойство GeometryOptions.IncludeNonVisibleObjects установлено в значение true и свойство GeometryOptions.View является планом этажа. Это гарантирует нам, что мы сможем получить скрытую осевую линию из геометрии.
  • Убедитесь, что трубы выровнены по оси. Это можно сделать с помощью метода ElementTransformUtils.MoveElement().

Полный код приведен ниже:

Код - C#: [Выделить]
  1.         //Предполагаем, что 2 трубы параллельны
  2.         //и текущий вид является планом этажа
  3.         private static Dimension
  4.             Align2PipesViaCenterline(Pipe pipeBase, Pipe pipe)
  5.         {
  6.             Dimension dimension = null;
  7.             Document doc = pipeBase.Document;
  8.             View view = doc.ActiveView;
  9.             Line baseLine = GetCenterline(pipeBase);
  10.             if (baseLine == null) return null;
  11.             Line line = GetCenterline(pipe);
  12.             if (line == null) return null;
  13.             var clone = line.Clone();
  14.             clone.MakeUnbound();
  15.             IntersectionResult result = clone.Project(baseLine.Origin);
  16.             if (result != null)
  17.             {
  18.                 var point = result.XYZPoint;
  19.                 var translate = baseLine.Origin - point;
  20.                 using (Transaction transaction = new Transaction(doc))
  21.                 {
  22.                     try
  23.                     {
  24.                         transaction.Start("Создание зависимости");
  25.                         ElementTransformUtils.MoveElement(
  26.                             doc, pipe.Id, translate);
  27.                         dimension = doc.Create.NewAlignment(view,
  28.                             baseLine.Reference, line.Reference);
  29.                         transaction.Commit();
  30.                     }
  31.                     catch (Exception ex)
  32.                     {
  33.                         Trace.WriteLine(ex.ToString());
  34.                         transaction.RollBack();
  35.                     }
  36.                 }
  37.             }
  38.             return dimension;
  39.         }
  40.  
  41.         private static Line GetCenterline(Pipe pipe)
  42.         {
  43.             Options options = new Options();
  44.             options.ComputeReferences = true; //!!!                       
  45.             if (pipe.Document.ActiveView != null)
  46.                 options.View = pipe.Document.ActiveView;
  47.             else
  48.                 options.DetailLevel = ViewDetailLevel.Fine;
  49.  
  50.             var geoElem = pipe.get_Geometry(options); //!!!
  51.  
  52.             foreach (var item in geoElem)
  53.             {
  54.                 Line lineObj = item as Line;
  55.                 if (lineObj != null)
  56.                 {
  57.                     return lineObj;
  58.                 }
  59.             }
  60.             return null;
  61.         }

Источник: http://adndevblog.typepad.com/aec/2014/12/revitapi-align-2-pipes-through-center-lines.html

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

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