【问题标题】:RPS, windows Form & Revit API (Python)RPS、Windows 窗体和 Revit API (Python)
【发布时间】:2018-01-24 22:39:34
【问题描述】:

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

我有两个主要问题:

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

List_object_has_no_attribute_Views

Local_variable_referenced_before_assignment

这是显示所选打印集的工作表的函数代码

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) 我可以删除一次打印集。如果我尝试删除另一个,我会收到以下错误,我需要重新启动表单(删除打印集的函数代码如下所示)

The_referenced_object_is_not_valid

def DelPrintSet(self, sender, args):

        self.curItem = CurrentSetsListBox.SelectedItems

        t = Transaction (doc, 'Delete printset')
        t.Start()

        for viewset in PrintSetForm.ViewSets:
            if viewset.Name in [str(item) for item in self.curItem]:
                doc.Delete(viewset.Id)
                doc.Regenerate()
            else:
                continue                

        self.Refresh()

        UpdateSetNames(CurrentSetsListBox)      

        t.Commit()      

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

全局 PrintSetForm_Load
def PrintSetForm_Load(self, sender):

Application.Exit()
Application.Restart()
#self.Refresh()
#self.ResetBindings()
#self.ActiveForm.Close()    
sd = PrintSetForm()
sd.ShowDialog()

这个 gif 显示了正在运行的表单:

Manage Print Sets

有什么想法或建议吗?

谢谢。

3) 如果我尝试使用 DataSource 填充 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()    

【问题讨论】:

    标签: winforms ironpython revit-api revit revitpythonshell


    【解决方案1】:

    1) 看看这是否有效:

    • 值得检查self.viewSetsLb 中是否选择了某些内容。我在下面的代码中添加了检查
    • view_set 变量可以初始化为布尔值而不是列表
    • for 循环中使用break 可以让事情变得更快捷
    • 我使用了更具 Python 风格的 for view in PrintSetForm.viewSets 而不是 for i in PrintSetForm.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()
    

    另外,你不应该需要构建一个刷新按钮,也许有一个类函数来重新填充 Printset 列表和 ListBox,并在每次操作后清除你调用的 Sheet ListBox?

    听起来你玩得很开心!

    【讨论】:

    • 感谢@Callum!添加您在每个函数中建议的代码行以刷新列表有效! PrintSetForm.ViewSets = FilteredElementCollector(doc).OfClass(ViewSheetSet).ToElements()
    【解决方案2】:

    听起来好像您对变量的范围和生命周期有疑问。例如,某些变量的生命周期可能仅限于表单显示,因此在表单关闭后无法访问。您可以更改这些变量的生命周期,例如,通过使它们成为静态类变量而不是局部实例变量。我建议你阅读.net static class variable scope

    【讨论】:

      猜你喜欢
      • 2017-12-04
      • 1970-01-01
      • 1970-01-01
      • 2021-09-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-27
      相关资源
      最近更新 更多