gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 12:00:01 26 4
gpt4 key购买 nike

我是一名建筑师,通过 Revit 逐渐喜欢上了编码。但不幸的是,由于仍然是一个终极菜鸟,我需要任何愿意加入的人的帮助。我也是 Stackoverflow 菜鸟,所以我不知道它是否还可以,并且除了在社区中发布这样的问题之外更多辅导,然后解决问题。但无论如何,它是这样的:我正在尝试创建一个能够同时从 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 proportes,以便将它们从 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())

从这里开始,附加功能只是为用户完善它:

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

让我知道这是如何工作的!

关于c# - IronPython 和 Revit API - 如何在列表框中显示项目属性(属性名称)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57437245/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com