IronPython 和 Revit API - 如何在列表框中显示项目属性(属性名称)?

IronPython and Revit API - How to display item attributes in listbox (attribute name)?

我是一名建筑师,后来爱上了通过 Revit 进行编码。但不幸的是,由于仍然是一个终极菜鸟,我需要任何愿意加入的人的帮助。我也是 Whosebug 菜鸟,所以我不知道它是否还可以,并且在社区中排除 post 之类的问题这些更多的是辅导,然后是解决问题。但无论如何,它是这样的: 我正在尝试创建一个能够同时从 Revit 族编辑器中删除多个参数的应用程序。我在 C# 上取得了成功,但由于我想转移到 Python 因为作为初学者更容易进入,所以我做了很多浏览,但由于 OOP 知识有限而没有任何帮助。 如何在列表框中显示 Family 参数名称,或者如果列表框中已有字符串名称,我如何将所选项目与 FamilyParameterSet 中的实际参数进行比较?

我有一个启动代码,可以从家庭管理器中收集所有参数。我把它投到列表中。然后一个选项是使用要在列表框中列出的参数的名称属性,但我不知道返回并检查列表或循环列表以将参数集中的名称与从列表框中选择的名称进行比较。所以我选择了另一个选项,将 Family 参数直接放入列表框中,但我无法显示实际的 Name 属性。 这段 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 拥有 Family 参数的所有 .Id 比例,以便将它们从 Family 参数集中删除。在代码的开头(对于不了解 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())

从这里开始,附加功能正在为用户完善:

  • 添加一个弹出对话框让他们知道success/failure
  • 用户删除参数后,刷新 ListBox
  • 过滤掉BuiltIn个无法删除的参数(尝试删除一个并查看它抛出的错误)

告诉我这是怎么回事!