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

13/12/2014

Создание размера между центрами семейств

Вопрос: Я знаю, как создать размер между гранями двух семейств.

А как можно создать размер между центрами этих семейств?

Вот пример размеров, созданных вручную:

 

Ответ: Секрет в скрытых элементах, находящихся внутри экземпляра семейства.

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

Когда вы получаете доступ к геометрии, задайте свойства ComputeReferences и IncludeNonVisibleObjects :

Код - C#: [Выделить]
  1.  _opt = new Options();
  2.   _opt.ComputeReferences = true;
  3.   _opt.IncludeNonVisibleObjects = true;

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

В последняя версия RevitLookup позволяет добраться до невидимых объектов в геометрии элемента:

 

Для просмотра коллекции объектов геометрии, дважды щелкните на Geometry Objects. Там будет видна интересующая нас точка:

 

Последняя актуальная версия RevitLookup доступна на GitHub – RevitLookup GitHub Repository.

Я реализовал небольшой вспомогательный метод, в котором я получаю скрытые элементы геометрии экземпляра семейства, беру из геометрии точку и получаю опорный объект:

Код - C#: [Выделить]
  1.   /// <summary>
  2.   /// Возвращает опорный объект точки
  3.   /// из невидимых элементов геометрии заданного семейства.
  4.   /// </summary>
  5.   static Reference GetFamilyInstancePointReference(
  6.     FamilyInstance fi )
  7.   {
  8.     return fi.get_Geometry( _opt )
  9.       .OfType<Point>()
  10.       .Select<Point, Reference>( x => x.Reference )
  11.       .FirstOrDefault();
  12.   }

Также я реализовал новую команду CmdDimensionInstanceOrigin в примерах The Building Coder. Команда предлагает пользователю выбрать два экземпляра семейства и создает размер между центрами этих семейств:

Код - C#: [Выделить]
  1. [Transaction( TransactionMode.Manual )]
  2. class CmdDimensionInstanceOrigin : IExternalCommand
  3. {
  4.   static Options _opt = null;
  5.  
  6.   public Result Execute(
  7.     ExternalCommandData commandData,
  8.     ref string message,
  9.     ElementSet elements )
  10.   {
  11.     UIApplication app = commandData.Application;
  12.     UIDocument uidoc = app.ActiveUIDocument;
  13.     Document doc = uidoc.Document;
  14.  
  15.     JtPairPicker<FamilyInstance> picker
  16.       = new JtPairPicker<FamilyInstance>( uidoc );
  17.  
  18.     Result rc = picker.Pick();
  19.  
  20.     if( Result.Failed == rc )
  21.     {
  22.       message = "Нужно как минимум два экземпляра семейства в модели.";
  23.     }
  24.     else if( Result.Succeeded == rc )
  25.     {
  26.       IList<FamilyInstance> a = picker.Selected;
  27.  
  28.       _opt = new Options();
  29.       _opt.ComputeReferences = true;
  30.       _opt.IncludeNonVisibleObjects = true;
  31.  
  32.       XYZ[] pts = new XYZ[2];
  33.       Reference[] refs = new Reference[2];
  34.  
  35.       pts[0] = ( a[0].Location as LocationPoint ).Point;
  36.       pts[1] = ( a[1].Location as LocationPoint ).Point;
  37.  
  38.       refs[0] = GetFamilyInstancePointReference( a[0] );
  39.       refs[1] = GetFamilyInstancePointReference( a[1] );
  40.  
  41.       CmdDimensionWallsIterateFaces
  42.         .CreateDimensionElement( doc.ActiveView,
  43.         pts[0], refs[0], pts[1], refs[1] );
  44.     }
  45.     return rc;
  46.   }
  47. }

Результат выполнения:

 

Источник: http://thebuildingcoder.typepad.com/blog/2014/11/picking-pairs-and-dimensioning-family-instance-origin.html#3

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

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