Blender运行时错误:loopcut_slide需View3D Region与Editmesh
解决Blender脚本循环切割的RuntimeError问题
问题概述
运行Blender脚本时持续触发如下错误:
File "C:\Users\meinuser\OneDrive\Dokumente\wasprivates\Diagramm1.blend\script.py", line 105, in <module> File "C:\Program Files\Blender Foundation\Blender 3.5\3.5\scripts\modules\bpy\ops.py", line 111, in _call_ ret = _op_call(self.idname_py(), C_dict, kw, C_exec, C_undo) RuntimeError: Operator bpy.ops.mesh.loopcut_slide.poll() expected a view3d region & editmesh
需求是为场景内所有网格沿Y轴添加15条循环切割,代码由手动操作后从控制台复制而来,但执行失败。
错误原因
bpy.ops.mesh.loopcut_slide严重依赖Blender的**3D视图区域(View3D Region)**上下文,脚本在非交互模式(或上下文缺失时)运行会触发poll检查失败- 手动复制的参数中硬编码了
edge_index:11,该索引仅对应手动操作时当前对象的特定边,换对象或场景会失效,且无法控制切割轴向 - 未明确指定循环切割的Y轴方向,手动操作的方向基于视图选择,脚本中未对应配置
解决方案
方法1:修复bpy.ops代码(仅适用于交互模式)
若必须使用bpy.ops,需确保上下文存在,同时替换硬编码参数并指定轴向:
import bpy obj_name = "Cube" obj = bpy.data.objects.get(obj_name) if obj and obj.type == 'MESH': # 激活对象并切换到编辑模式 bpy.context.view_layer.objects.active = obj bpy.ops.object.mode_set(mode='EDIT') bpy.ops.mesh.select_all(action='SELECT') # 使用loopcut替代loopcut_slide,直接指定Y轴方向 bpy.ops.mesh.loopcut( number_cuts=15, smoothness=0, falloff='INVERSE_SQUARE', cut_normal=(0, 1, 0) # 沿Y轴切割 ) bpy.ops.object.mode_set(mode='OBJECT')
注:此方法仅在Blender交互界面中运行有效,后台/无头模式仍可能因上下文缺失报错
方法2:使用BMesh API(推荐,无上下文依赖)
BMesh是Blender底层网格操作API,不依赖视图上下文,稳定且支持批量处理:
import bpy import bmesh def add_loop_cuts_along_axis(obj, axis='Y', num_cuts=15): if not obj or obj.type != 'MESH': return # 转换轴向为向量 axis_vec = {'X': (1,0,0), 'Y':(0,1,0), 'Z':(0,0,1)}.get(axis.upper(), (0,1,0)) # 初始化BMesh bm = bmesh.new() bm.from_mesh(obj.data) # 选中所有边用于循环切割 for edge in bm.edges: edge.select = True # 执行循环切割 bmesh.ops.loopcut( bm, edges=bm.edges, cuts=num_cuts, smoothness=0, falloff='INVERSE_SQUARE', normal=axis_vec # 指定切割轴向 ) # 将修改应用到原网格并释放资源 bm.to_mesh(obj.data) bm.free() # 处理单个指定对象 obj_name = "Cube" obj = bpy.data.objects.get(obj_name) add_loop_cuts_along_axis(obj, 'Y', 15) # 批量处理场景中所有网格对象(取消注释启用) # for obj in bpy.context.scene.objects: # add_loop_cuts_along_axis(obj, 'Y', 15)
此方法支持后台运行,无需依赖3D视图上下文,且可灵活处理多个网格对象
内容的提问来源于stack exchange,提问作者Fischkopf
相关产品推荐
相关产品推荐

