Ну хорошего, правильного метода, к сожалению, в API так и не появилось. Тем не менее, есть обходной путь, правда, не без недочётов. Всё с помощью того же метода Selection.PickObjects:
public IList<Reference> PickObjects(
ObjectType objectType,
ISelectionFilter selectionFilter,
string statusPrompt,
IList<Reference> pPreSelected
)
Последним его аргументом указывается список предварительно выбранных reference-ов. К сожалению, опять же, всё не так просто, эти Reference-ы нужно правильно приготовить.
Допустим, Вы нашли element в СВЯЗАННОМ файле. Тогда сначала получаем:
var reference = new Reference(element);
var stableRepresentation = reference.CreateLinkReference(linkedInstance).ConvertToStableRepresentation(doc); // здесь doc - ОСНОВНОЙ документ
У Вас тогда в stableRepresentation будет строка вида:
1a5ab77d-1ae2-4e82-872d-63be5c36dec1-00039e53:RVTLINK/1a5ab77d-1ae2-4e82-872d-63be5c36dec1-00039e52:1224485
Её нужно слегка поправить до вида:
1a5ab77d-1ae2-4e82-872d-63be5c36dec1-00039e53:0:RVTLINK/1a5ab77d-1ae2-4e82-872d-63be5c36dec1-00039e52:1224485
потом получаем уже непосредственно Reference методом:
var reference = Reference.ParseFromStableRepresentation(doc, fixedStableRepresentation);
Вот его уже можно добавлять в список pPreSelected, который скармливается методу Selection.PickObjects.
ISelectionFilter (3 параметр) можно создать простейший:
public class NoSelectionFilter : ISelectionFilter
{
public bool AllowElement(Element elem)
{
return false;
}
public bool AllowReference(Reference reference, XYZ position)
{
return false;
}
}
Теперь, соответственно, всё готово, можно вызывать:
uidoc
.Selection
.PickObjects(ObjectType.LinkedElement, new NoSelectionFilter(), "select", references);
Не забудьте только в try-catch(OperationCanceledException) обернуть.
Недостатки метода понятны, можно убрать часть выделенного + по сути диалог получается, Revit ждёт, когда пользователь нажмёт "Готово" или "Отмена"