Winforms RPS、windows窗体和;Revit API(Python)

Winforms RPS、windows窗体和;Revit API(Python),winforms,ironpython,revit-api,revit,revitpythonshell,Winforms,Ironpython,Revit Api,Revit,Revitpythonshell,我一直在尝试构建一个表单来创建和删除Revit打印集 我有两个主要问题: 1) 我可以创建打印集,但除非重新启动表单,否则无法访问其内容。我得到以下错误(取决于我是否定义了view\u set变量) 这是显示所选打印集图纸的功能代码 def DisplaySheetsInSet (self, sender, args): self.curItem = CurrentSetsListBox.SelectedItem PrintSetForm_Load

我一直在尝试构建一个表单来创建和删除Revit打印集

我有两个主要问题:

1) 我可以创建打印集,但除非重新启动表单,否则无法访问其内容。我得到以下错误(取决于我是否定义了view\u set变量)

这是显示所选打印集图纸的功能代码

def DisplaySheetsInSet (self, sender, args):        

    self.curItem = CurrentSetsListBox.SelectedItem

    PrintSetForm_Load

    try:
        view_set=[]
        for i in PrintSetForm.ViewSets:

            if i.Name == str(self.curItem):
                view_set = i
            else:
                continue

        Sheets=[sheet.Name for sheet in view_set.Views]

        SheetsLb.BeginUpdate()
        SheetsLb.Items.Clear()

        for sheet in Sheets:        
            SheetsLb.Items.Add(sheet) 

        SheetsLb.EndUpdate()

    except Exception as e:
        popup (str(e)
2) 我可以删除一次打印集。如果我尝试删除另一个,我会出现以下错误,需要重新启动表单(删除打印集的函数代码如下所示)

我尝试构建一个函数来重新启动/刷新表单,但它不起作用(代码如下):

全局打印集表单加载
def PrintSetForm_加载(自身、发送方):

此gif显示正在运行的表单:

有什么想法或建议吗

多谢各位

3) 如果我尝试用数据源填充SheetsLb,只会显示单击的第一组数据

Sheets=[sheet.Name for sheet in view_set.Views]
SheetNumber=[sheet.get_Parameter(BuiltInParameter.SHEET_NUMBER).AsString() for sheet in view_set.Views]

SheetsLb.BeginUpdate()
SheetsLb.DataSource =  None
SheetsLb.Items.Clear()
UpdatedList=[]
for number,name in zip(SheetNumber,Sheets):
    UpdatedList.append(number+" - "+ name + " [ ] ")

SheetsLb.DataSource=UpdatedList

SheetsLb.EndUpdate()    

听起来好像您对变量的作用域和生存期有问题。例如,某些变量的生存期可能仅限于表单显示,因此在表单关闭后无法访问。您可以更改这些变量的生存期,例如,通过使它们成为静态类变量而不是本地实例变量。我建议你仔细阅读。

1)看看这是否有效:

  • 检查
    self.viewSetsLb
    中是否选择了某些内容是值得的。我在下面的代码中添加了一个复选框
  • view\u set
    变量可以初始化为布尔值,而不是列表
  • for
    循环中使用
    break
    ,可以让事情变得更加快速
  • 我在PrintSetForm.viewSets.viewSets中使用了更具pythonic风格的
    视图,而不是在PrintSetForm.viewSets.viewSets中使用了
    视图,使其清晰明了
此代码适用于我:

self.curItem = self.viewSetsLb.SelectedItem 

if not self.viewSetsLb.SelectedItem:
    print 'No Printset selected!'
    return

view_set = False

for view in PrintSetForm.viewSets:
    if view.Name == str(self.curItem):
        view_set = view
        break
    else:
        continue

Sheets=[sheet.Name for sheet in view_set.Views]

self.sheetsLb.BeginUpdate()
self.sheetsLb.Items.Clear()     
for sheet in Sheets:        
    self.sheetsLb.Items.Add(sheet)      
self.sheetsLb.EndUpdate()
2) 这是因为
PrintSetForm.ViewSets
列表中的数据已过期。每次更改某些内容(如删除视图集)时,请重新填充此列表:

PrintSetForm.ViewSets = FilteredElementCollector(doc).OfClass(ViewSheetSet).ToElements()
另外,您不需要构建一个刷新按钮,也许有一个类函数可以重新填充打印集列表和列表框,并在每次操作后清除您调用的工作表列表框


听起来你玩得很开心,伙计

谢谢@Callum!在每个函数中添加您建议的代码行以刷新列表成功!PrintSetForm.ViewSets=FilterDeleteCollector(doc).OfClass(ViewSheetSet).ToElements()
self.curItem = self.viewSetsLb.SelectedItem 

if not self.viewSetsLb.SelectedItem:
    print 'No Printset selected!'
    return

view_set = False

for view in PrintSetForm.viewSets:
    if view.Name == str(self.curItem):
        view_set = view
        break
    else:
        continue

Sheets=[sheet.Name for sheet in view_set.Views]

self.sheetsLb.BeginUpdate()
self.sheetsLb.Items.Clear()     
for sheet in Sheets:        
    self.sheetsLb.Items.Add(sheet)      
self.sheetsLb.EndUpdate()
PrintSetForm.ViewSets = FilteredElementCollector(doc).OfClass(ViewSheetSet).ToElements()