忍者ブログ
2024/11/21

マルチプログレスバー

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

コメント

ただいまコメントを受けつけておりません。

2016/08/14

マルチプログレスバー


処理系統が複雑になってくると、プログレスバーを複数表示したい場面が多くなってきます。
そういうときに、何も考えずに使っても追加したプログレスバーがメインウインドウにドッキングされるものが欲しかったので作りました。
multi_prog_win = None
class MultiProgressWin(object):
    WIDTH = 300
    def __init__(self, title="MultiProgressWin", max=100, display_text=""):
        self.showwin = False
        if multi_prog_win is None:
            global multi_prog_win
            multi_prog_win = cmds.window(t=title, w=self.WIDTH, s=False)
            cmds.showWindow(multi_prog_win)
            self.showwin = True
        self.__add_bar(display_text, max)
        cmds.refresh()

    def __add_bar(self, display_text, max):
        self.layout = cmds.columnLayout(p=multi_prog_win)
        self.text = cmds.text(display_text, p=self.layout)
        self.bar = cmds.progressBar(maxValue=max, w=self.WIDTH, p=self.layout, progress=0)

        # デフォルトの高さが39ずつ増えていたのでキリが良いように40増やしてみる
        preHeight = cmds.window(multi_prog_win, q=True, height=True)
        global multi_prog_win
        cmds.window(multi_prog_win, edit=True, h=preHeight + 40)

    def update(self, display_text=None, step=1):
        '''
        プログレスバーを動かす。
        通常は1ずつ増加
        '''
        cmds.progressBar(self.bar, e=True, step=step)
        if display_text is not None:
            cmds.text(self.text, e=True, l=display_text)
            cmds.refresh()

        progress = cmds.progressBar(self.bar, q=True, progress=True)
        max      = cmds.progressBar(self.bar, q=True, maxValue=True)

        global multi_prog_win
        preHeight = cmds.window(multi_prog_win, q=True, height=True)

        if progress == max and preHeight - 40 > 0: # 0以下になったときのエラー回避
            cmds.window(multi_prog_win, edit=True, h=preHeight - 40)

    def reset(self, display_text=None):
        '''
        プログレスバーのリセット
        '''
        cmds.progressBar(self.bar, e=True, progress=0)
        if display_text is not None:
            cmds.text(self.text, e=True, l=display_text)
            cmds.refresh()

    def kill(self):
        '''
        作ったものを削除。
        Windowを生成していたらWindowが消えるが、
        追加プログレスバーの場合だったらプログレスバーだけ消える
        '''
        if self.showwin is False:
            cmds.deleteUI(self.layout, control=True)
            return
        global multi_prog_win
        cmds.deleteUI(multi_prog_win)
        del multi_prog_win

↑動くとこんな感じです。
雑なコードですが…上の様に動かすコードはこのようになります。
def test(text=u"一つ追加"):
    pw = MultiProgressWin(display_text=text, max=100)
    for i in range(100):
        pw.update(text)
        time.sleep(0.02)
    pw.kill()


def test2():
    text=u"追加一つ目"
    pw = MultiProgressWin(display_text=text, max=100)
    for i in range(100):
        pw.update(text)
        time.sleep(0.02)
        if i == 50:
            test(u"二つ目追加!!")
            text=u"2つ目が終わったので再開"
    pw.kill()

pw = MultiProgressWin(display_text="ベースのプログレスバー" ,max=5)

time.sleep(1)

pw.update()
time.sleep(1)

pw.update("プログレスバー1つ追加するよ")
time.sleep(1)

test()

pw.update("ベースのプログレスバー")
time.sleep(1)


pw.update("プログレスバー2つ追加するよ")
time.sleep(1)

test2()

pw.update()
time.sleep(1)

pw.reset("リセットもできる")
time.sleep(2)

pw.kill()

test関数が外部モジュールに存在していた場合も問題ないことは一応確認しました。
global変数を使っていたり、中々に強引なのでちょっと心配ですが自分の用件は満たせそうなのでひとまずこれで良しとします。
ウインドウやバーの幅、位置の調整機能はついてないので必要であれば改造くださいまし。

あと、追加のプログレスバーが消えた場合にウインドウが自動的に最適なサイズになってくれれば気持ちいいんですが、どうやればいいんでしょう?

2016/08/16 赤めがね@redglasses67さんがバーの増減に応じてウインドウが適切なサイズになるように追記してくださいました。
↓修正したコードで実行したらこんな感じ。完璧です!

 

拍手[4回]

PR

コメント

プロフィール

HN:
モチオ
性別:
非公開
自己紹介:
テクニカルアーティスト(アニメーション出身)サポート対象Softimage/MotionBuilder/Mayaなど 言語 javascript / PHP / Python / VBAなど Webアプリも少しだけ作れる

P R