Превращение всех элементов в DirectShape
Новый интересный пример использования DirectShape предоставил наь Nikolay Shulga, старший инженер из команды разработчиков Revit.
Вот что он пишет:
- Название: Превращение
- Мотивация: Мне было интересно, может ли DirectShape использоваться для упрощения модели – удаление связей, сделать ее только для чтения, возможно увеличить производительность.
- Алгоритм: конвертировать все элементы Revit в DirectShape, не меняя геометрии и сохраняя категории объектов
- Реализация: представлена ниже
- Некоторые особенности: скопировать геометрию элемента и исользовать ее везде где только возможно.
- Варианты использования: заблокировать изменение проекта, сделать копию для презенатции или дальнейшего экспорта.
- Подходящяя модель для примера: любоая модель. Имейте ввиду, что код изменит текущий проект. Не забудьте сделать копию.
Данный пример очень кстати, так как интерес к использованию DirectShape неуклонно растет.
Я реализовал новую команду CmdFlatten в примерах The Building Coder для тестирования и демонстрации данного примера.
Исходный код Николая был создан для следующей версии Revit, поэтому потребовалась небольшая адаптация для совместимости с текущей версией.
Изменения можно увидеть в логах коммитов на GitHub/
Вот итоговый результат для Revit 2016:
- const string _direct_shape_appGUID = "Flatten";
- Result Flatten(
- Document doc,
- ElementId viewId )
- {
- FilteredElementCollector col
- = new FilteredElementCollector( doc, viewId )
- .WhereElementIsNotElementType();
- Options geometryOptions = new Options();
- using( Transaction tx = new Transaction( doc ) )
- {
- if( tx.Start( "Преобразование элементов в DirectShapes" )
- == TransactionStatus.Started )
- {
- foreach( Element e in col )
- {
- GeometryElement gelt = e.get_Geometry(
- geometryOptions );
- if( null != gelt )
- {
- string appDataGUID = e.Id.ToString();
- // Создаем DirectShape
- // заменяя элемент в проекте
- // так как нет API для корректного переноса графических стилей
- // в новый проект.
- // Но можно также сделать копию оригнального проекта и
- // уже работать с копией
- DirectShape ds
- = DirectShape.CreateElement( doc,
- e.Category.Id, _direct_shape_appGUID,
- appDataGUID );
- try
- {
- ds.SetShape(
- new List<GeometryObject>( gelt ) );
- // Удаляем исходные элементы
- doc.Delete( e.Id );
- }
- catch( Autodesk.Revit.Exceptions
- .ArgumentException ex )
- {
- Debug.Print(
- "Не удалось заменить {0}; exception {1} {2}",
- Util.ElementDescription( e ),
- ex.GetType().FullName,
- ex.Message );
- }
- }
- }
- tx.Commit();
- }
- }
- return Result.Succeeded;
- }
- public Result Execute(
- ExternalCommandData commandData,
- ref string message,
- ElementSet elements )
- {
- UIApplication uiapp = commandData.Application;
- UIDocument uidoc = uiapp.ActiveUIDocument;
- Document doc = uidoc.Document;
- return Flatten( doc, uidoc.ActiveView.Id );
- }
Вот простой пример превращения стены в DirectShape:
А вот сгенерированный DirectShape, который заменил исходный элемент, сохраняя при этом категорию объекта:
Теперь попробуем на более сложной модели:
Как видите, все экземпляры семейств пропали в текущей реализации:
Если вам нужно их сохранить, то вомзожно нужно покопаться глубже в геометрии, например, извлечь все твердотельные объекты из экземпляра семейств.
Текущая же версия представлена в модуле CmdFlatten.cs в примерах The Building Coder версии 2016.0.123.0.
Спасибо Николаю за реализацию!
Источник: http://thebuildingcoder.typepad.com/blog/2015/11/flatten-all-elements-to-directshape.html
Обсуждение: http://adn-cis.org/forum/index.php?topic=
Опубликовано 26.02.2016