定期在Blender中将有关计算进度的反馈打印到控制台

时间:2018-02-08 14:08:23

标签: python asynchronous blender

我必须在Blender中自动执行长计算,并且我想定期将当前进度打印到python控制台。我知道我必须以某种方式使用异步函数,我知道asyncio。但是,即使在阅读了几个代码片段后,我也无法弄清楚如何定期报告反馈。

我想要做的是: 我有一个我想要应用布尔修饰符的对象列表。处理完每个对象后,我会增加一个计数器。每隔5秒钟,我想将计数器打印到控制台,这样用户就会知道已处理了多少个对象,实质上是一种进度条。 但是,Blender在使用asyncio时仍然会锁定,我不知道在哪里或如何解决这个问题。

这是我的代码:

async def test():
  get_model_a()
  get_model_b()
  build_tower(0)
  split_layer()
  garbage_test()
  async for progress in bool_modifier():
    print ("cutting stone " + str(progress))
  print(str(cut_stones) + " stones cut")
  print("Done")

async def bool_modifier():
  global cut_stones;
  for obj in bpy.data.objects:
    await asyncio.sleep(5)
    if "Tower" in obj.name:
      select_object(obj)
      bpy.ops.object.modifier_add(type='BOOLEAN')
      bpy.context.object.modifiers["Boolean"].object = model_a
      bpy.ops.object.modifier_apply(modifier="Boolean")
      cut_stones +=1
    yield cut_stones

cut_stones = None
model_a = None
model_b = None

loop = asyncio.get_event_loop()
try:
    loop.run_until_complete(test())
finally:
    loop.run_until_complete(loop.shutdown_asyncgens())
    loop.close()

所有其他方法运行速度很快,因此我不需要任何反馈,但应用布尔运算符可能需要一个多小时。除了提供反馈之外,脚本还可以实现预期目标。我使用的是Blender 2.79版本,因此asyncio应该是内置的并且可用。

1 个答案:

答案 0 :(得分:0)

modal operator将继续运行,并允许在运营商运行时更新视口。

运营商可以使用report()通知其在blender标头中的进度,但这通常不适用于持续更新。

您可以使用custom property存储进度值并在panel中显示。