9

我正在搅拌机中为 N 个对象编写脚本。运行我的脚本时,它会在工作时锁定用户界面。我想写一些东西来防止这种情况发生,这样我就可以看到屏幕上发生了什么,并使用我的自定义 UI 来显示进度条。关于如何在 python 或搅拌机中实现这一点的任何想法?大多数计算只需要几分钟,我知道这个请求可能会使它们花费比正常时间更长的时间。任何帮助,将不胜感激。

完成大部分工作的函数是 a for a in b循环。

4

2 回答 2

16

如果您想在 Blender 中进行大型计算,并且仍然拥有响应式 UI,您可能需要使用 python 计时器检查模型运算符。

它会是这样的:

class YourOperator(bpy.types.Operator):
    bl_idname = "youroperatorname"
    bl_label = "Your Operator"

    _updating = False
    _calcs_done = False
    _timer = None

    def do_calcs(self):
        # would be good if you can break up your calcs
        # so when looping over a list, you could do batches
        # of 10 or so by slicing through it.
        # do your calcs here and when finally done
       _calcs_done = True

    def modal(self, context, event):
        if event.type == 'TIMER' and not self._updating:
            self._updating = True
            self.do_calcs()
            self._updating = False
        if _calcs_done:
            self.cancel(context)

        return {'PASS_THROUGH'}

    def execute(self, context):
        context.window_manager.modal_handler_add(self)
        self._updating = False
        self._timer = context.window_manager.event_timer_add(0.5, context.window)
        return {'RUNNING_MODAL'}

    def cancel(self, context):
        context.window_manager.event_timer_remove(self._timer)
        self._timer = None
        return {'CANCELLED'}

您必须自己处理正确的模块导入和操作员注册。

我有一个 Conways Game Of Life 模态运算符实现来展示如何使用它:https ://www.dropbox.com/s/b73idbwv7mw6vgc/gol.blend?dl=0

于 2013-05-24T21:40:38.340 回答
1

我建议您使用greenletsspawn a new process。Greenlets 通常更容易使用,因为您不需要担心锁和竞争条件,但它们不能在所有情况下都使用。使用多进程线程模块肯定会解决这个问题。

于 2012-11-21T05:36:16.253 回答