Создание размера между центрами семейств
Вопрос: Я знаю, как создать размер между гранями двух семейств.
А как можно создать размер между центрами этих семейств?
Вот пример размеров, созданных вручную:
Ответ: Секрет в скрытых элементах, находящихся внутри экземпляра семейства.
В вашем случае, вы можете воспользоваться невидимой центральной точкой, находящейся в геометрии экземпляра семейства.
Когда вы получаете доступ к геометрии, задайте свойства ComputeReferences и IncludeNonVisibleObjects :
- _opt = new Options();
- _opt.ComputeReferences = true;
- _opt.IncludeNonVisibleObjects = true;
С опцией включения скрытых элементов, геометрия включает в себя точку, из которой вы сможете извлечь опорный объект (Reference), который в дальнейшем использовать для создания размера.
В последняя версия RevitLookup позволяет добраться до невидимых объектов в геометрии элемента:
Для просмотра коллекции объектов геометрии, дважды щелкните на Geometry Objects. Там будет видна интересующая нас точка:
Последняя актуальная версия RevitLookup доступна на GitHub – RevitLookup GitHub Repository.
Я реализовал небольшой вспомогательный метод, в котором я получаю скрытые элементы геометрии экземпляра семейства, беру из геометрии точку и получаю опорный объект:
- /// <summary>
- /// Возвращает опорный объект точки
- /// из невидимых элементов геометрии заданного семейства.
- /// </summary>
- static Reference GetFamilyInstancePointReference(
- FamilyInstance fi )
- {
- return fi.get_Geometry( _opt )
- .OfType<Point>()
- .Select<Point, Reference>( x => x.Reference )
- .FirstOrDefault();
- }
Также я реализовал новую команду CmdDimensionInstanceOrigin в примерах The Building Coder. Команда предлагает пользователю выбрать два экземпляра семейства и создает размер между центрами этих семейств:
- [Transaction( TransactionMode.Manual )]
- class CmdDimensionInstanceOrigin : IExternalCommand
- {
- static Options _opt = null;
- public Result Execute(
- ExternalCommandData commandData,
- ref string message,
- ElementSet elements )
- {
- UIApplication app = commandData.Application;
- UIDocument uidoc = app.ActiveUIDocument;
- Document doc = uidoc.Document;
- JtPairPicker<FamilyInstance> picker
- = new JtPairPicker<FamilyInstance>( uidoc );
- Result rc = picker.Pick();
- if( Result.Failed == rc )
- {
- message = "Нужно как минимум два экземпляра семейства в модели.";
- }
- else if( Result.Succeeded == rc )
- {
- IList<FamilyInstance> a = picker.Selected;
- _opt = new Options();
- _opt.ComputeReferences = true;
- _opt.IncludeNonVisibleObjects = true;
- XYZ[] pts = new XYZ[2];
- Reference[] refs = new Reference[2];
- pts[0] = ( a[0].Location as LocationPoint ).Point;
- pts[1] = ( a[1].Location as LocationPoint ).Point;
- refs[0] = GetFamilyInstancePointReference( a[0] );
- refs[1] = GetFamilyInstancePointReference( a[1] );
- CmdDimensionWallsIterateFaces
- .CreateDimensionElement( doc.ActiveView,
- pts[0], refs[0], pts[1], refs[1] );
- }
- return rc;
- }
- }
Результат выполнения:
Обсуждение: http://adn-cis.org/forum/index.php?topic=1697
Опубликовано 13.12.2014