通过 Selection.SetElementIds 修改对第一个元素的选择
Modify selection to first element by Selection.SetElementIds
我在编写让 med select 我的 selection 中的第一个元素的脚本时遇到问题。这对我很有用,因为我 select 我从一个时间表(在那里我可以看到我想使用的类似气流)中正确的空气终端,并使用 selection 中的命令 Create Similar。问题是当多个元素被 selected 时,这个命令不起作用。因此,我想要列表中的第一个对象。
这是我正在尝试的代码:
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]))
那将return以下错误信息:
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 脚本,但我希望有人能告诉我我在这里做错了什么,即使它很明显。
谢谢。
凯尔
编辑:
谢谢杰里米,为我解决了这个问题!诀窍是生成一个列表,而不是 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)
SetElementIds
采用 .NET ICollection<ElementId>
参数,正如您从 Revit API documentation.
中看到的那样
您的语句调用 .NET List
构造函数,该构造函数需要一个整数参数,该参数指定要分配 space 的元素数量 N
用于:List[ElementId](N)
.
sel[0]
是 ElementId
,不是整数,这会导致第一个错误。
sel[0].IntegerValue
是一个(非常大且半任意的)整数,因此不会导致错误。但是,您仍将 List
留空,未填充。
您应该为一个元素初始化 List
并添加:
ids = List[ElementId](1)
ids.Add(sel[0])
我在编写让 med select 我的 selection 中的第一个元素的脚本时遇到问题。这对我很有用,因为我 select 我从一个时间表(在那里我可以看到我想使用的类似气流)中正确的空气终端,并使用 selection 中的命令 Create Similar。问题是当多个元素被 selected 时,这个命令不起作用。因此,我想要列表中的第一个对象。 这是我正在尝试的代码:
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]))
那将return以下错误信息:
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 脚本,但我希望有人能告诉我我在这里做错了什么,即使它很明显。
谢谢。 凯尔
编辑: 谢谢杰里米,为我解决了这个问题!诀窍是生成一个列表,而不是 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)
SetElementIds
采用 .NET ICollection<ElementId>
参数,正如您从 Revit API documentation.
您的语句调用 .NET List
构造函数,该构造函数需要一个整数参数,该参数指定要分配 space 的元素数量 N
用于:List[ElementId](N)
.
sel[0]
是 ElementId
,不是整数,这会导致第一个错误。
sel[0].IntegerValue
是一个(非常大且半任意的)整数,因此不会导致错误。但是,您仍将 List
留空,未填充。
您应该为一个元素初始化 List
并添加:
ids = List[ElementId](1)
ids.Add(sel[0])