Всем привет. У элементов существует метод
GetGeneratingElementIds, который позволяет получить идентификаторы элементов, которые являются генераторами для проверяемого геометрического объекта.
Имеется вот такой код:
private void CheckInserts(Element element, Options options, ICollection<Element> checkedElements)
{
try
{
if (element is HostObject hostObject)
{
var inserts = hostObject.FindInserts(true, true, true, true).ToList();
inserts.ForEach(insertId =>
{
var insertElement = element.Document.GetElement(insertId);
var stop = false;
var geometryElement = hostObject.get_Geometry(options);
if (geometryElement != null)
{
foreach (GeometryObject geometryObject in geometryElement)
{
if (stop)
break;
if (geometryObject is Solid solid)
{
foreach (Face face in solid.Faces)
{
try
{
if (hostObject.GetGeneratingElementIds(face).Any(x => x == insertId))
{
if (checkedElements.All(x => x.Id != insertId))
{
checkedElements.Add(insertElement);
stop = true;
break;
}
}
}
catch (Exception exception)
{
// может возникать неясная ошибка в методе GetGeneratingElementIds (в справке не описана)
Debug.Print(exception.Message + Environment.NewLine + exception.StackTrace);
}
}
}
}
}
});
}
}
catch (Exception exception)
{
_loginAction($"При поиске вхождений элемента {element.Id.IntegerValue} произошла ошибка: {exception.Message}");
}
}
И вот метод GetGeneratingElementIds может кидать такую ошибку
It is invalid to use in looking up the necessary information.
Если проверяемых элементов не много, то особо не страшно - ошибка "проглатывается", да и ладно. Но когда таких элементов десятки тысяч, то постоянное срабатывание try{} catch{} становится очень затратным.
Есть ли какой-либо способ проверить геометрический (GeometryObject) заранее, чтобы не отправлять его в метод GetGeneratingElementIds? При отладке по свойствам не заметил разницы у граней (face), которые выдавали ошибку и граней, которые не выдавали ошибку