我必须在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应该是内置的并且可用。
答案 0 :(得分:0)
modal operator将继续运行,并允许在运营商运行时更新视口。
运营商可以使用report()
通知其在blender标头中的进度,但这通常不适用于持续更新。
您可以使用custom property存储进度值并在panel中显示。