Как получить ссылку (Reference) центра дуги
Вопрос: Как можно получить доступ к ссылке на центр дуги?
Работая с выдавливанием в файле семейства, можно получить доступ к его эскизу и геометрии каждого элемента выдавливания, например, с помощью вот такого кода на Managed C++:
- Extrusion ^ext = createExtrusion(...)
- CurveArrArray ^sketchCvArrArr = ext->Sketch->Profile;
- for each( CurveArray ^oneCvLoop in sketchCvArrArr )
- {
- for each( Curve ^oneSketchCv in oneCvLoop )
- {
- // ...
- }
- }
Получить конечные точки дуги можно с помощью метода 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#:
- [Transaction(TransactionMode.Manual)]
- public class Command : IExternalCommand
- {
- public Result Execute(
- ExternalCommandData commandData,
- ref string message,
- ElementSet elements)
- {
- UIApplication uiapp = commandData.Application;
- UIDocument uidoc = uiapp.ActiveUIDocument;
- Application app = uiapp.Application;
- Document doc = uidoc.Document;
- if (!doc.IsFamilyDocument)
- {
- message = "Откройте файл семейства";
- return Result.Failed;
- }
- Selection sel = uidoc.Selection;
- var extrusionRef = sel.PickObject(ObjectType.Element, new ExtrusionFilter(),
- "Выберите выдавливание");
- Extrusion extrusion =
- doc.GetElement(extrusionRef) as Extrusion;
- var curveArrArray =
- extrusion.Sketch.Profile;
- foreach (CurveArray curveArray in curveArrArray)
- {
- foreach (Curve curve in curveArray)
- {
- if (curve is Arc)
- {
- var modelCurveReference = curve.Reference;
- if (modelCurveReference != null)
- {
- var modelArc = doc.GetElement(modelCurveReference) as ModelArc;
- var centerPointReference = modelArc.CenterPointReference;
- }
- }
- }
- }
- return Result.Succeeded;
- }
- }
- public class ExtrusionFilter : ISelectionFilter
- {
- public bool AllowElement(Element elem)
- {
- return elem is Extrusion;
- }
- public bool AllowReference(Reference reference, XYZ position)
- {
- throw new NotImplementedException();
- }
- }
Источник: 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