选择对象使用ISelectionFilter不允许我选择任何东西,为什么?

2024-05-28 20:08:45 发布

您现在位置:Python中文网/ 问答频道 /正文

我尝试通过使用GUI选择一个单独的空间供Revit MEP 2019使用,并将选择存储在脚本中以供将来使用。代码是用pyrovit编写的。脚本既可以从shell运行,也可以从addin按钮运行,但是当进入选择模式(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)") 

我不知道问题出在哪里,我最好的猜测是在过滤器定义里面。帮助字符串“选择空间(房间)”将正确显示在左下角,并且除了视口以外的所有内容都将变为灰色,就像我应该在视图中选择某个对象时一样。鼠标变成了某种“禁止”的符号。在

我将非常感谢你的帮助。请提前向任何愿意帮忙的人表示感谢!在


Tags: fromimportui内容dbreturnguispace
1条回答
网友
1楼 · 发布于 2024-05-28 20:08:45

您可以在pyRevitMEP source code中找到示例。我还解释了如何使用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()

您可以在这里找到另一个运行在pyrovit下的示例:[pyRevitMEP] ConnectTo : connect MEP elements

相关问题 更多 >

    热门问题