【问题标题】:PickObjects with ISelectionFilter will not allow me to select anything, why?带有 ISelectionFilter 的 PickObjects 不允许我选择任何东西,为什么?
【发布时间】:2019-12-11 01:16:12
【问题描述】:

我正在尝试通过使用 GUI 选择一个空间以在 Revit MEP 2019 中使用,并存储选择以供在脚本中进一步使用。代码是用 pyRevit 编写的。该脚本从 shell 和插件按钮运行,但是当进入选择模式(PickObject 方法)时,我根本不允许选择任何东西。我没有收到任何错误,只是在 GUI 中输入选择工具时没有任何内容可供选择。

我已在代码中注释了我尝试过但不起作用的代码。

from Autodesk.Revit              import DB,UI
from Autodesk.Revit.DB           import BuiltInCategory
from Autodesk.Revit.UI.Selection import ISelectionFilter,ObjectType

# Definitions:

# Define a space selection filter so that only spaces are selectable
class SpaceSelectionFilter(ISelectionFilter):
    def AllowElement(element):
        #if element.Category.Name == "Spaces":
        #if element.ToString() == "Autodesk.Revit.DB.Mechanical.Space":
        if element.Category.Id.IntegerValue== int(BuiltInCategory.OST_MEPSpaces):
            return True
        return False

    def AllowReference(reference, point):
        return False

# Function that enables using PickObject from the PythonRevitShell
def shell_pickobject():
    __window__.Hide() 
    elementReference = uidoc.Selection.PickObject(UI.Selection.ObjectType.Element,spaceFilter,"Select a space(room)") 
    __window__.Show()
    __window__.TopMost = True
    return elementReference

# Procedure:    

# Create a selection filter
spaceFilter = SpaceSelectionFilter()

# User picks a space    
ref =  shell_pickobject()

# The following line works also outside of the shell_pickobject() function when used from the GUI addin-button, but spaces are still not selectable.
# elementReference = uidoc.Selection.PickObject(UI.Selection.ObjectType.Element,spaceFilter,"Select a space(room)") 

我不明白问题出在哪里,我最好的猜测是在过滤器定义中。帮助字符串“选择空间(房间)”正确显示在左下角,当我应该在视图中选择某些内容时,除了视口之外的所有内容都会变成灰色。鼠标变成了某种“禁止”的符号。

非常感谢您对此的帮助。提前感谢任何可能希望提供帮助的人!

【问题讨论】:

    标签: python revit-api revit revitpythonshell pyrevit


    【解决方案1】:

    您可以在pyRevitMEP source code 中找到示例。我还做了an article 解释如何使用 ISelectionFilter :[Revit] ISelectionFilter example using python。这是一个示例(使用 revitpythonshell 运行):

    from Autodesk.Revit.UI.Selection import ISelectionFilter
    
    class CustomISelectionFilter(ISelectionFilter):
        def __init__(self, category_name):
            self.category_name = category_name
        def AllowElement(self, e):
            if e.Category.Name == self.category_name:
                return True
            else:
                return False
        def AllowReference(self, ref, point):
            return true
    
    try:
        ductsel = uidoc.Selection.PickObject(ObjectType.Element,
        CustomISelectionFilter("Ducts"),
        "Select a Duct")            
    except Exceptions.OperationCanceledException:
        TaskDialog.Show("Operation canceled","Canceled by the user")
    
    __window__.Close()
    

    您可以在此处找到另一个在 pyRevit 下运行的示例:[pyRevitMEP] ConnectTo : connect MEP elements

    【讨论】:

    • 非常感谢!我认为唯一的错误实际上是我在 AllowElement() 方法中构造 if 语句的方式。无论如何,更通用的 CustomSelectionFilter 非常优雅!另外,感谢 python 启发提示!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多