我是一名建筑师,越来越喜欢通过 Revit 进行编码。但不幸的是,由于我仍然是一个终极菜鸟,所以我需要任何愿意加入的人的帮助。我也是 Stackoverflow 菜鸟,所以我不知道在社区中发布这样的问题是否可以并异常(exception),这些问题更多辅导学生然后解决问题。但无论如何,事情是这样的: 我正在尝试创建一个应用程序,它将能够同时从 Revit 族编辑器中删除多个参数。我在 C# 方面取得了成功,但由于作为初学者更容易入门,我想转移到 Python,因此我进行了大量浏览,但由于 OOP 知识有限而没有任何帮助。 如何在列表框中显示 Family 参数名称,或者如果列表框中已有字符串名称,如何将所选项目与 FamilyParameterSet 中的实际参数进行比较?
我有一个起始代码,可以从家庭管理器收集所有参数。我将其转换到列表中。然后一种选择是使用要在列表框中列出的参数的名称属性,但我不知道返回并检查列表或循环列表以将参数集中的名称与从列表框中选择的名称进行比较。因此,我选择了另一种选择,将“族”参数直接放入列表框中,但随后我无法显示实际的“名称”属性。 这段 C# 代码可能对我有帮助,但我不知道如何在 Python 中重新创建它,因为我的 OOP 经验非常差。 Items on ListBox show up as a class name
doc = __revit__.ActiveUIDocument.Document
mgr = doc.FamilyManager;
fps = mgr.Parameters;
paramsList=list(fps)
senderlist =[]
class IForm(Form):
def __init__(self):
self.Text = "Remove multiple parameters"
lb = ListBox()
lb.SelectionMode = SelectionMode.MultiSimple
for n in fps:
lb.Items.Add(n.Definition.Name)
lb.Dock = DockStyle.Fill
lb.SelectedIndexChanged += self.OnChanged
self.Size = Size(400, 400)
self.CenterToScreen()
button = Button()
button.Text = "Delete Parameters"
button.Dock = DockStyle.Bottom
button.Click += self.RemoveParameter
self.Controls.Add(button)
def OnChanged(self, sender, event):
senderlist.append(sender.SelectedItem)
def RemoveParameter(self,sender,event):
for i in paramsList:
if i.Definition.Name in senderlist:
t = Transaction(doc, 'This is my new transaction')
t.Start()
mgr.RemoveParameter(i.Id)
t.Commit()
Application.Run(IForm())
我需要函数RemoveParameter 来获取系列参数的所有.Id 比例,以便将它们从系列参数集中删除。在代码的开头(对于不了解 Revit API 的人)“fps”表示 FamilyParameterSet,它被转换为 Python 列表“paramsList”。所以我需要从列表框中选定的项目中删除 FPS 的成员。
最佳答案
您从 Revit 到编码的旅程是熟悉的!
首先,您的代码中似乎存在一些来自 C# 的遗留问题。您需要牢记从 C# 到 Python 的几个关键转变 - 在您的情况下,根据运行代码时的错误,需要缩进两行:
Syntax Error: expected an indented block (line 17)
Syntax Error: expected an indented block (line 39)
经验法则是冒号 :
之后需要缩进,这也使代码更具可读性。前几行还有一些分号 ;
- 不需要它们!
否则代码就差不多了,我在下面的代码中添加了注释:
# the Winforms library first needs to be referenced with clr
import clr
clr.AddReference("System.Windows.Forms")
# Then all the Winforms components youre using need to be imported
from System.Windows.Forms import Application, Form, ListBox, Label, Button, SelectionMode, DockStyle
doc = __revit__.ActiveUIDocument.Document
mgr = doc.FamilyManager
fps = mgr.Parameters
paramsList=list(fps)
# senderlist = [] moved this into the Form object - welcome to OOP!
class IForm(Form):
def __init__(self):
self.Text = "Remove multiple parameters"
self.senderList = []
lb = ListBox()
lb.SelectionMode = SelectionMode.MultiSimple
lb.Parent = self # this essentially 'docks' the ListBox to the Form
for n in fps:
lb.Items.Add(n.Definition.Name)
lb.Dock = DockStyle.Fill
lb.SelectedIndexChanged += self.OnChanged
self.Size = Size(400, 400)
self.CenterToScreen()
button = Button()
button.Text = "Delete Parameters"
button.Dock = DockStyle.Bottom
button.Click += self.RemoveParameter
self.Controls.Add(button)
def OnChanged(self, sender, event):
self.senderList.append(sender.SelectedItem)
def RemoveParameter(self,sender,event):
for i in paramsList:
if i.Definition.Name in self.senderList:
t = Transaction(doc, 'This is my new transaction')
t.Start()
# wrap everything inside Transactions in 'try-except' blocks
# to avoid code breaking without closing the transaction
# and feedback any errors
try:
name = str(i.Definition.Name)
mgr.RemoveParameter(i) # only need to supply the Parameter (not the Id)
print 'Parameter deleted:',name # feedback to the user
except Exception as e:
print '!Failed to delete Parameter:',e
t.Commit()
self.senderList = [] # clear the list, so you can re-populate
Application.Run(IForm())
从这里开始,附加功能只是为用户完善它:
- 添加一个弹出对话框,让他们知道成功/失败
- 用户删除参数后,刷新
ListBox
- 过滤掉无法删除的
BuiltIn
参数(尝试删除一个并查看它抛出的错误)
让我知道这是如何工作的!
关于c# - IronPython 和 Revit API - 如何在列表框中显示项目属性(属性名称)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57437245/