Создание зависимостей труб по осевой линии
Заказчик хочет использовать 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().
Полный код приведен ниже:
- //Предполагаем, что 2 трубы параллельны
- //и текущий вид является планом этажа
- private static Dimension
- Align2PipesViaCenterline(Pipe pipeBase, Pipe pipe)
- {
- Dimension dimension = null;
- Document doc = pipeBase.Document;
- View view = doc.ActiveView;
- Line baseLine = GetCenterline(pipeBase);
- if (baseLine == null) return null;
- Line line = GetCenterline(pipe);
- if (line == null) return null;
- var clone = line.Clone();
- clone.MakeUnbound();
- IntersectionResult result = clone.Project(baseLine.Origin);
- if (result != null)
- {
- var point = result.XYZPoint;
- var translate = baseLine.Origin - point;
- using (Transaction transaction = new Transaction(doc))
- {
- try
- {
- transaction.Start("Создание зависимости");
- ElementTransformUtils.MoveElement(
- doc, pipe.Id, translate);
- dimension = doc.Create.NewAlignment(view,
- baseLine.Reference, line.Reference);
- transaction.Commit();
- }
- catch (Exception ex)
- {
- Trace.WriteLine(ex.ToString());
- transaction.RollBack();
- }
- }
- }
- return dimension;
- }
- private static Line GetCenterline(Pipe pipe)
- {
- Options options = new Options();
- options.ComputeReferences = true; //!!!
- if (pipe.Document.ActiveView != null)
- options.View = pipe.Document.ActiveView;
- else
- options.DetailLevel = ViewDetailLevel.Fine;
- var geoElem = pipe.get_Geometry(options); //!!!
- foreach (var item in geoElem)
- {
- Line lineObj = item as Line;
- if (lineObj != null)
- {
- return lineObj;
- }
- }
- return null;
- }
Источник: 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