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

27/05/2015

Клонирование твердотельного объекта

Вопрос: Для клонирования твердотельных объектов мы использовали вот такой трюк:

Код - C#: [Выделить]
  static public Solid Clone( this Solid solid )

  {

    if( solid == null )

    {

      return null;

    }

    return BooleanOperationsUtils

      .ExecuteBooleanOperation( solid, solid,

        BooleanOperationsType.Union );

  }

С помощью этого метода мы копировали твердотельный объект и в дальнейшем использовали его для создания или редактирования объекта DirectShape. Этот способ работает замечательно в большинстве случаев. Однако на некоторых объектах DirectShape возникает исключение:

23/05/2015

Изоляция экземпляров семейства для дальнейшего экспорта в DWG

Проблема следующая: нужно взять оборудование, представленное в виде семейств категории Типовые модели на 3D виде и для каждого оборудования создать отдельный вид для дальнейшего экспорта в DWG.

Один из способов представлен ниже. Мы берем все экземпляры семейств типовых моделей на текущем виде, затем, соответствующие семейства. Потом создаем вид для каждого семейства создаем новый вид с названием семейства.

Опубликовано 23.05.2015     Читать далее >>>
22/05/2015

Список всех импортированных САПР файлов

Вы когда-нибудь беспокоились о том, есть ли у вас дубликаты импортов из САПР форматов?

Мой коллега Николай Шульга (Nikolay Shulga) из команды разработчиков Revit реализовал маленькую полезную утилиту для ответа на этот вопрос.

Вот что он пишет:

Когда-то я написал прототип приложения для вывода всех импортированных объектов в проект Revit. Идея состояла в том, чтобы вывести дублирующийся экземпляры. Люди часто импортируют одни и те же данные несколько раз.

Опубликовано 22.05.2015     Читать далее >>>
18/05/2015

Метод CopyElements и параметр View

Параметр View при использовании метода CopyElements, нужно использовать только в случае, если вы работает с элементами, зависимыми от конкретного вида, т.е. 2D элементами.

Это отметил Arnošt Löbel на форуме по Revit API в теме ElementTransformUtils.CopyElements из связанного документа.

Опубликовано 18.05.2015     Читать далее >>>
16/05/2015

Метод ScheduleDefinition.GetSchedulableFields возвращает больше полей чем в интерфейсе

Когда мы создаем спецификацию в Revit, то мы можем выбирать поля:

 

Соответствующий способ получить эти поля при помощи Revit API – это использование метода ViewSchedule.ScheduleDefinition.GetSchedulableFields(). Но по каким-то причинам он возвращает больше полей, чем мы видим в интерфейсе. Что за невидимые поля?

Опубликовано 16.05.2015     Читать далее >>>
14/05/2015

Еще раз о списке элементов инженерной системыАвтор: Виктор Чекалин

Еще раз о списке элементов инженерной системы

Я уже писал о том, как можно получить список элементов инженерной системы, а также об улучшении алгоритма.

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

Опубликовано 14.05.2015     Читать далее >>>
08/05/2015

Переключение между вариантами конструкции с помощью UI Automation

Рассмотрим приложение, демонстрирующее функциональность по определению, перечислению и установки варианта конструкции с помощью самостоятельного отдельного приложения.

Приложение было создано пользователем Revitalizer. Вот его комментарии:

Опубликовано 08.05.2015     Читать далее >>>
26/04/2015

Улучшение алгоритма по вычислению общей и полезной площади стен

Продолжаем обсуждать решение проблемы по вычислению общей и полезной площади стен. После того, как мы немного переделали алгоритм и стали использовать метод FindInserts для поиска всех проемов, пользователь Håkon Clausen нашел пару недочетов в этом алгоритме и оставил их в комментарии (ориг.):

Опубликовано 26.04.2015     Читать далее >>>
25/04/2015

Как задать виды для печати с помощью Revit API

Если вы хотим изменить настройки печати в Revit, то первое, с чего мы должны начать – это свойство Document.PrintManager. PrintManager.ViewSheetSetting используется для установки видов, которые вы хотите напечатать.

Однако, когда вы обращаетесь к методу PrintManager.ViewSheetSetting вы можете получить вот такое исключение: This property is only available when user choose Select of Print Range (Свойство доступно только когда пользователь выбрал ‘выбранные виды’ в настройках печати.)

Опубликовано 25.04.2015     Читать далее >>>
24/04/2015

Использование метода FindInserts для поиска всех проемов в стене

Недавно я представил новый пример использования класса SpatialElementGeometryCalculator для вычисления полезной и общей площади стен.

В статье обсуждалось несколько интересных моментов:

  • Использование класса SpatialElementGeometryCalculator
  • Портирование надстройки, написанной на VB.NET в C#
  • Использование временной транзакции для решения задач
  • Использование FilteredElementCollector для поиска всех проемов в стене
  • Оптимизация поиска при использовании FilteredElementCollector
Опубликовано 24.04.2015     Читать далее >>>
12/04/2015

Не добавляйте и не удаляйте элементы при перечислении коллекций элементов

Пользователь столкнулся с проблемой, что при загрузке семейства через API, Revit закрывается.

Вот его код:

Код - C#: [Выделить]
 UIApplication rvtApp = commandData.Application;

UIDocument rvtDoc = rvtApp.ActiveUIDocument;

 

FilteredElementCollector collector =

    new FilteredElementCollector(rvtDoc.Document)

    .OfClass(typeof(Family));

FilteredElementIterator itr =

    collector.GetElementIterator();

while (itr.MoveNext())

{

    Element elem = (Element)itr.Current;

    ReloadFamily(rvtApp, rvtDoc, elem);

}

Опубликовано 12.04.2015     Читать далее >>>
11/04/2015

Вычисление общей и полезной площади пверхности стен

Вопрос: мне нужно определить площадь, занимаемая окнами и дверями в стене. Я думал это можно легко сделать просто, взяв значение параметра HOST_AREA_COMPUTED, так как при первоначальном тестировании значение параметра показывало верную цифру. Но, при дальнейшем тестирование это оказалось не так.

В тестовом файле есть стена с двумя дверями. Внешне они выглядят одинаково, но для одной площадь равна 4м2, для другой – 2м2.

Почему так? Что же на самом деле возвращает параметр HOST_AREA_COMPUTED? Какой самый правильный способ определения площади окон и дверей в стене?

Опубликовано 11.04.2015     Читать далее >>>
10/04/2015

Надстройка для работы с Тонкими линиями с помощью UI Automation

Разработчика надстроек для Revit давно уже просят добавить методы для включения отключения тонких линий.

К счастью, в Revit 2015 R2 это наконец-то стало возможным.

Опубликовано 10.04.2015     Читать далее >>>
31/03/2015

Изменение размера области подрезки

Наблюдается странное поведение при изменении размера области подрезки.

Что я делал. Сначала я создал вид, затем установил область подрезки:

Код - C#: [Выделить]
 ViewFamilyType vTypeElev = Class1.getviewfamilytypes(

    ViewFamily.FloorPlan, RevitDoc).First<ViewFamilyType>();

var view = ViewPlan.Create(RevitDoc, vTypeElev.Id,

    RevitDoc.ActiveView.GenLevel.Id);

view.CropBoxActive = true;

BoundingBoxXYZ box = new BoundingBoxXYZ();

box.Min = new XYZ(100, 100, 0);

box.Max = new XYZ(200, 200, 100);

view.CropBox = box;

В этом случае все работает, как и ожидалось.

Однако, когда я только меняю область подрезки, без создания вида, то ничего не происходит.

Опубликовано 31.03.2015     Читать далее >>>
22/03/2015

Определение идентификатора или геометрических ссылок вершин кривой

Вопрос: Я пытаюсь получить вершины всех граней в Revit.

Я пробовал воспользоваться методом Edge.AsCurve().GetEndPoint(0/1), который возвращает координаты начальной и конечной точки кривой.

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

Опубликовано 22.03.2015     Читать далее >>>
21/03/2015

Событие по изменению выделенного элемента

Много разработчиков интересуются возможностью получить оповещения, когда меняется выделение текущего объекта в пользовательском интерфейсе.

Я уже обсуждал реализацию данной возможности в статье Использования события Idling для отслеживания выделения объектов (на англ.) и одним из ключевых аспектов обсуждения являлись так называемые уровни возникновения события, т.е. различные возможности приложения реагировать на изменения объектов в модели.

Опубликовано 21.03.2015     Читать далее >>>
10/03/2015

Пример использования метода PostRequestForElementTypePlacement

Метод NewFamilyInstance предоставляет возможность программно создать новый экземпляр семейства в проекте или вложенный экземпляр семейства в редакторе семейств.

Но он совсем не поддерживает какие-либо взаимодействие с пользователем.

Небольшое взаимодействие с пользователем появилось в методе PromptForFamilyInstancePlacement, который был представлен в Revit 2011 API.

По крайней мере он показывает пред просмотр экземпляра семейства и предлагает пользователю выбрать месторасположение экземпляра.

Опубликовано 10.03.2015     Читать далее >>>
09/03/2015

Открытие файла проекта в событиях Revit API

Вопрос: Довольно понятная и четкая ошибка возникает при попытке выполнить метод Application.OpenandActivateDocument() дважды (т.е. пока нет активных документов, метод работает).

Я пробую выполнить этот метод в обработчике события Idling. Я думал я могу выполнять открытие документа в обработчике события.

Опубликовано 09.03.2015     Читать далее >>>
08/03/2015

Определение типа поверхности под выбранной точкой

Вопрос: Я пишу надстройку для Revit 2015 где мне нужно вставить семейство в проект.

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

Опубликовано 08.03.2015     Читать далее >>>