几年前,我正在寻找一种方法将元素列表转换为当前选择(用于"复制到级别"或者"复制到当前视图"。我的特殊情况是来自" Smart Filter"的后期计划,允许用户选择多个姓氏/类型,而不仅仅是"结构框架(梁)"如Revit&#39 ; s内置过滤器。
解决方案HAD BEEN:
SelElementSet SelSet = uiDoc.Selection.Elements;
SelSet.Add(Element1);
SelSet.Remove(Element2);
问题是,这似乎不再适用于Revit 2016(+)。使用这些行运行代码现在会导致程序结束错误:
" Revit遇到System.MissingMethodException:Autodesk.Revit.UI.Selection.SelElementSet Autodesk.Revit.UI.Selection.Selection.get_Elements();" (我假设行" SelElementSet SelSet = uiDoc.Selection.Elements"调用.get_Elements)
我能够(在我的程序开始时)使用
获取当前选择Selection All_Guys = uiDoc.Selection;
从此我可以将所有内容转换为Ilist或List等,基于使用Tree节点删除特定类别/姓氏/族类型。但是我需要能够将这一切全部转换回当前选择(希望使用SelSet.Remove(Element2)来处理与过滤不匹配的元素),每次我使用SelElementSet时,我都会得到上面的程序结束错误
请注意,2014年9月,我问了一个类似的问题。我知道在这个网站上有强大的仲裁者,他们已经很难将问题标记为已经回答过 - 这属于一个类别"之前的答案已经不再有效了#34;请仔细阅读这个问题,并且因为你有权力而不要抛弃它。
答案 0 :(得分:1)
我发现这是因为为Revit 2015及更高版本删除了SelElementSet,并且已替换为以下(类型)结构。在我的例子中,我清除选择并添加指定的元素,但我也可以.... elementids.Remove(One_Element)来自另一个元素集合:
if (SmartCopyLoad.ResetSelection)
{
ICollection<ElementId> elementIds = uiDoc.Selection.GetElementIds();
elementIds.Clear();
foreach (Element One_Element in SmartCopy.MatchingElements) { elementIds.Add(One_Element.Id); }
uiDoc.Selection.SetElementIds(elementIds);
return Autodesk.Revit.UI.Result.Succeeded;
}
结果是指定的元素作为集合(如SelElementSet所允许的那样)。
另请注意,问题的主要部分是使用旧引用。我多年前的代码仍然引用了2014年的RevitAPI,它允许SelElementSet,但在Revit2016中不起作用。向他人发出警告:只有在旧软件中运行的程序需要时才使用旧引用。由于我们仅使用2015年及以后,我可以使用较新的参考文献。