繁体   English   中英

Blender Python脚本,试图在进行大型计算时阻止UI锁定

[英]Blender Python scripting, trying to prevent UI lock up while doing large calculations

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

执行大部分工作的功能是用于in b循环。

如果您想在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

我建议您使用greenlets生成一个新进程 Greenlets通常更容易使用,因为您不需要担心锁和竞争条件,但它们不能在任何情况下使用。 使用多进程线程模块肯定会解决这个问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM