1

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) プリント セットを 1 回削除できます。別のものを削除しようとすると、次のエラーが表示され、フォームを再起動する必要があります (以下に示す印刷セットを削除する関数のコード)

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 定義
PrintSetForm_Load(self、送信者):

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

この gif は、動作中のフォームを示しています。

印刷セットの管理

アイデアや提案はありますか?

ありがとうございました。

3) SheetsLb に DataSource を設定しようとすると、最初にクリックしたセットだけが表示されます。

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()    
4

2 に答える 2

0

変数のスコープと有効期間に問題があるようです。たとえば、一部の変数はフォームの表示に限定された有効期間を持つ場合があり、そのためフォームを閉じた後はアクセスできません。これらの変数の有効期間は、ローカル インスタンス変数の代わりに静的クラス変数にすることで変更できます。.net static class variable scopeを読むことをお勧めします。

于 2018-01-25T06:07:18.477 に答える