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

07/01/2014

Как получить ссылку (Reference) центра дуги

Вопрос: Как можно получить доступ к ссылке на центр дуги?

Работая с выдавливанием в файле семейства, можно получить доступ к его эскизу и геометрии каждого элемента выдавливания, например, с помощью вот такого кода на Managed C++:

Код - C++: [Выделить]
  1.   Extrusion ^ext = createExtrusion(...)
  2.   CurveArrArray ^sketchCvArrArr = ext->Sketch->Profile;
  3.   for each( CurveArray ^oneCvLoop in sketchCvArrArr )
  4.   {
  5.     for each( Curve ^oneSketchCv in oneCvLoop )
  6.     {
  7.       // ...
  8.     }
  9.   }

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

Тем не менее, мы не нашли какой-либо способ, с помощью которого можно добраться до центра нарисованной дуги.

Класс ModelArc содержит свойство CenterPointReference.

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

Наша цель – использовать центр дуги в качестве пересечения двух рабочих плоскостей.

Можете предложить какой-нибудь подходящий способ?

Ответ: Если мы посмотрим на иерархию классов ModelCurve (линия модели) и Curve (кривая), то мы увидим, что прямое явное преобразование невозможно.

Свойство CenterPointReference объявлено в классе CurveElement, поэтому и класс ModelCurve также содержит это свойство, т.к. класс CurveElement является базовым для ModelCurve. Вы можете создать объект класса ModelArc имея геометрическую дугу (Curve), но в этом случае эта дуга появится в проекте, и элемент будет добавлена во внутреннюю базу данных Revit.

Сама кривая (Curve), создается только в памяти. Если у вас есть кривая (Curve), то вы можете вызвать метод Document.Create.NewModelCurve, с помощью которого будет создан новый элемент и добавлен в проект. Однако, вы по-прежнему не сможете получить доступ к тому, что вы ищете.

С другой стороны, геометрическая кривая имеет свойство Curve.Reference, которое можно использовать для доступа к существующей линии модели. А из линии модели вы уже сможете получить ссылку на центр дуги, если конечно же линия модели является дугой.

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

 

Этот метод достаточно надежен, так как Document::GetElement(Reference) всегда возвращает актуальную линию модели.

Код команды на C#:

Код - C#: [Выделить]
  1.     [Transaction(TransactionMode.Manual)]
  2.     public class Command : IExternalCommand
  3.     {
  4.         public Result Execute(
  5.           ExternalCommandData commandData,
  6.           ref string message,
  7.           ElementSet elements)
  8.         {
  9.             UIApplication uiapp = commandData.Application;
  10.             UIDocument uidoc = uiapp.ActiveUIDocument;
  11.             Application app = uiapp.Application;
  12.             Document doc = uidoc.Document;
  13.  
  14.  
  15.             if (!doc.IsFamilyDocument)
  16.             {
  17.                 message = "Откройте файл семейства";
  18.                 return Result.Failed;               
  19.             }
  20.            
  21.  
  22.             Selection sel = uidoc.Selection;
  23.  
  24.             var extrusionRef = sel.PickObject(ObjectType.Element, new ExtrusionFilter(),
  25.                 "Выберите выдавливание");
  26.  
  27.             Extrusion extrusion =
  28.                 doc.GetElement(extrusionRef) as Extrusion;
  29.  
  30.             var curveArrArray =
  31.                 extrusion.Sketch.Profile;
  32.  
  33.  
  34.             foreach (CurveArray curveArray in curveArrArray)
  35.             {
  36.                 foreach (Curve curve in curveArray)
  37.                 {
  38.                     if (curve is Arc)
  39.                     {
  40.                         var modelCurveReference = curve.Reference;
  41.                         if (modelCurveReference != null)
  42.                         {
  43.                             var modelArc = doc.GetElement(modelCurveReference) as ModelArc;
  44.  
  45.                             var centerPointReference = modelArc.CenterPointReference;
  46.                            
  47.                         }
  48.                     }
  49.                 }
  50.             }
  51.  
  52.             return Result.Succeeded;
  53.         }
  54.     }
  55.  
  56.     public class ExtrusionFilter : ISelectionFilter
  57.     {
  58.         public bool AllowElement(Element elem)
  59.         {
  60.             return elem is Extrusion;
  61.         }
  62.  
  63.         public bool AllowReference(Reference reference, XYZ position)
  64.         {
  65.             throw new NotImplementedException();
  66.         }
  67.     }

 

Источник: http://thebuildingcoder.typepad.com/blog/2014/01/happy-new-year.html#2

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

Опубликовано 07.01.2014
Отредактировано 27.01.2014 в 15:26:45