通过Selection.SetElementIds将选择内容修改为第一个元素

时间:2019-01-23 10:43:12

标签: revit-api revitpythonshell pyrevit

我在编写一个脚本时遇到了麻烦,该脚本可以让med选择我选择的第一个元素。这对我很有用,因为我从时间表中选择了正确的航站楼(可以在其中看到要使用的类似气流),然后从选择中使用命令创建相似的气流。问题在于选择多个元素时此命令不起作用。因此,我想要列表中的第一个对象。 这是我正在尝试的代码:

from Autodesk.Revit.UI.Selection.Selection import SetElementIds
from System.Collections.Generic import List

uidoc = __revit__.ActiveUIDocument
doc = __revit__.ActiveUIDocument.Document
selection = [ doc.GetElement( elId ) for elId in __revit__.ActiveUIDocument.Selection.GetElementIds() ]
sel=[]
for i in selection:
    sel.append(i.Id)
uidoc.Selection.SetElementIds(List[ElementId](sel[0]))

这将返回以下错误消息:

Exception : Microsoft.Scripting.ArgumentTypeException: expected int, got ElementId 好,那我会尝试替换

uidoc.Selection.SetElementIds(List[ElementId](sel[0]))

使用

uidoc.Selection.SetElementIds(List[ElementId](sel[0].IntegerValue))

This seems to work, but selection is not modified

我才刚刚开始编写RPS脚本,但我希望有人能告诉我在这里我做错了什么,即使那很明显。

谢谢。 凯尔(Kyrre)

编辑: 谢谢杰里米,为我解决了这个问题!诀窍是生成列表,而不是python列表。 .add方法是我没有得到的。

如果有人感兴趣,请输入最终代码:

from Autodesk.Revit.UI.Selection.Selection import SetElementIds
from System.Collections.Generic import List
from Autodesk.Revit.DB import ElementId
uidoc = __revit__.ActiveUIDocument
doc = __revit__.ActiveUIDocument.Document
selection = [ doc.GetElement( elId ) for elId in __revit__.ActiveUIDocument.Selection.GetElementIds() ]
sel=[]
for i in selection:
    sel.append(i.Id)
ids=List[ElementId](1)
ids.Add(sel[0]) 
uidoc.Selection.SetElementIds(ids)

1 个答案:

答案 0 :(得分:1)

如您从Revit API documentation所见,

SetElementIds带有.NET ICollection<ElementId>参数。

您的语句调用.NET List构造函数,该构造函数需要一个整数参数来指定元素数量N来分配以下空间:List[ElementId](N)

sel[0]ElementId,而不是整数,它会导致第一个错误。

sel[0].IntegerValue是一个(很大且半任意的)整数,因此不会引起错误。但是,您仍然将List空的,不填充的。

您应该为一个元素初始化List并添加:

ids = List[ElementId](1)
ids.Add(sel[0])