python - 带有 ISelectionFilter 的 PickObjects 不允许我选择任何东西,为什么?
问题描述
我正在尝试通过使用 GUI 选择一个空间以在 Revit MEP 2019 中使用,并存储选择以供在脚本中进一步使用。代码是用 pyRevit 编写的。该脚本从 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)")
我不明白问题出在哪里,我最好的猜测是在过滤器定义中。帮助字符串“选择空间(房间)”在左下角正确显示,当我应该在视图中选择某些内容时,除了视口之外的所有内容都会变成灰色。鼠标变成了某种“禁止”的符号。
我将非常感谢一些帮助。提前感谢任何可能希望提供帮助的人!
解决方案
您可以在pyRevitMEP 源代码中找到示例。我还写了一篇文章来解释如何使用 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
推荐阅读
- java - 如何在 Java 中将 sun.nio.fs.ZipPath 转换为 sun.nio.fs.UnixPath?
- java - 在 Hibernate Search 运行时选择分析器
- winforms - 当我从列表视图中拖动项目时,如何在包含列表视图的表单中触发拖动或拖放事件?
- c++ - 在 C++ 中使用 new 分配大于 2GB 的单个对象(在 Windows 上)
- terraform - 如何在 Terraform 中按名称应用我的资源之一?
- airflow - 如何管理气流 dags 之间的 python 包?
- python - 删除 try 和 except 块中的重复项
- javascript - 位于共享文件夹中的 Web 应用程序下载文件
- python - python 相当于 javascript 的 responseType = "arraybuffer";
- java - 我的问题是关于 find(Node root ,int level) 方法。这是关于在给定二叉树中查找最深节点的代码