RPS,windows 表格和 Revit API (Python)
RPS, windows Form & Revit API (Python)
我一直在尝试构建一个表单来创建和删除 Revit 打印集。
我有 2 个主要问题:
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()
我试图为 restart/refresh 表单构建一个函数,但它不起作用(代码如下):
全球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()
听起来好像您对变量的作用域和生命周期有疑问。例如,某些变量的生命周期可能仅限于窗体显示,因此在窗体关闭后将无法访问。您可以更改这些变量的生命周期,例如,将它们设为静态 class 变量而不是局部实例变量。我建议您阅读 .net static class variable scope。
1) 看看这是否有效:
- 值得检查一下是否在
self.viewSetsLb
中选择了某些内容。我在下面的代码中添加了一个检查
view_set
变量可以初始化为布尔值而不是列表
- 在
for
循环中使用 break
让事情变得更快捷
- 我使用了更多的 pythonic
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()
此外,您不需要构建刷新按钮,也许有一个 class 函数可以重新填充打印集列表和列表框,并清除您在每次操作后调用的 Sheet 列表框?
听起来你玩得很开心,伙计!
我一直在尝试构建一个表单来创建和删除 Revit 打印集。
我有 2 个主要问题:
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()
我试图为 restart/refresh 表单构建一个函数,但它不起作用(代码如下):
全球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()
听起来好像您对变量的作用域和生命周期有疑问。例如,某些变量的生命周期可能仅限于窗体显示,因此在窗体关闭后将无法访问。您可以更改这些变量的生命周期,例如,将它们设为静态 class 变量而不是局部实例变量。我建议您阅读 .net static class variable scope。
1) 看看这是否有效:
- 值得检查一下是否在
self.viewSetsLb
中选择了某些内容。我在下面的代码中添加了一个检查 view_set
变量可以初始化为布尔值而不是列表- 在
for
循环中使用break
让事情变得更快捷 - 我使用了更多的 pythonic
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()
此外,您不需要构建刷新按钮,也许有一个 class 函数可以重新填充打印集列表和列表框,并清除您在每次操作后调用的 Sheet 列表框?
听起来你玩得很开心,伙计!