代码之家  ›  专栏  ›  技术社区  ›  Salvo Dragotta

RPS、windows窗体和Revit API(Python)

  •  1
  • Salvo Dragotta  · 技术社区  · 7 年前

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

    我有两个主要问题:

    1) 我可以创建打印集,但除非重新启动表单,否则无法访问其内容。我得到以下错误(取决于我是否定义view\u 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\u加载
    def PrintSetForm\u加载(自身、发送方):

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

    此gif显示正在运行的窗体:

    Manage Print Sets

    有什么想法或建议吗?

    非常感谢。

    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()    
    
    2 回复  |  直到 7 年前
        1
  •  1
  •   Callum    7 年前

    1) 看看这是否有效:

    • 值得检查的是,在 self.viewSetsLb . 我在下面的代码中添加了一个检查
    • 这个 view_set 变量可以初始化为布尔值,而不是列表
    • 使用 break for 循环让事情变得更快速
    • 我用了更像蟒蛇的 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()
    

    此外,您不需要构建刷新按钮,也许有一个类函数可以重新填充打印集列表和列表框,并在每次操作后清除您调用的图纸列表框?

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

        2
  •  0
  •   Jeremy Tammik    7 年前

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