I am using gpt to generate some code. This is supposed to allow me choose two surface, and calculate their distance. However, I got an error:Python:
AttributeError: ‘BMFaceSeq’ object has no attribute ‘index’
Here’s my source code:
bl_info = {
“name”: “Display Distance Between Two Faces”,
“blender”: (3, 6, 0), # 更新为Blender 3.6版本
“category”: “Object”,
}
import bpy
import bmesh
class OBJECT_OT_select_face(bpy.types.Operator):
“”“选择一个面”“”
bl_idname = “object.select_face”
bl_label = “Select Face”
is_face_a: bpy.props.BoolProperty(name=“Is Face A”, default=True)
@classmethod
def poll(cls, context):
return context.object and context.object.type == ‘MESH’
def execute(self, context):
obj = context.object
bpy.ops.object.mode_set(mode=‘EDIT’)
bm = bmesh.from_edit_mesh(obj.data)
# 获取当前被选中的面
selected_faces = [f for f in bm.faces if f.select]
if self.is_face_a:
if len(selected_faces) == 1:
context.scene.face_a_index = bm.faces.index(selected_faces[0]) # 存储面A的索引
self.report({‘INFO’}, f"Face A selected: {context.scene.face_a_index}“)
else:
self.report({‘WARNING’}, “Please select exactly one face for Face A.”)
else:
if len(selected_faces) == 1:
context.scene.face_b_index = bm.faces.index(selected_faces[0]) # 存储面B的索引
self.report({‘INFO’}, f"Face B selected: {context.scene.face_b_index}”)
else:
self.report({‘WARNING’}, “Please select exactly one face for Face B.”)
bpy.ops.object.mode_set(mode=‘OBJECT’)
return {‘FINISHED’}
class OBJECT_OT_calculate_distance(bpy.types.Operator):
“”“计算选择的两个面之间的距离”“”
bl_idname = “object.calculate_distance”
bl_label = “Calculate Distance”
@classmethod
def poll(cls, context):
return context.object and context.object.type == ‘MESH’
def execute(self, context):
obj = context.object
if obj and obj.type == ‘MESH’:
bm = bmesh.from_edit_mesh(obj.data)
face_a_index = context.scene.face_a_index
face_b_index = context.scene.face_b_index
if face_a_index == -1 or face_b_index == -1:
self.report({‘WARNING’}, “Please select both faces.”)
return {‘CANCELLED’}
face_a = bm.faces[face_a_index]
face_b = bm.faces[face_b_index]
center_a = face_a.calc_center_median()
center_b = face_b.calc_center_median()
distance = (center_a - center_b).length
self.report({'INFO'}, f"Distance between faces: {distance:.2f} units")
return {'FINISHED'}
else:
self.report({'WARNING'}, "Please select a mesh object.")
return {'CANCELLED'}
class VIEW3D_PT_distance_display(bpy.types.Panel):
“”“在3D视图中创建面板”“”
bl_label = “Distance Display”
bl_idname = “VIEW3D_PT_distance_display”
bl_space_type = ‘VIEW_3D’
bl_region_type = ‘UI’
bl_category = “Distance”
def draw(self, context):
layout = self.layout
# 按钮选择面A
row = layout.row()
row.operator(OBJECT_OT_select_face.bl_idname, text="Select Face A").is_face_a = True
# 按钮选择面B
row = layout.row()
row.operator(OBJECT_OT_select_face.bl_idname, text="Select Face B").is_face_a = False
# 计算距离按钮
layout.operator(OBJECT_OT_calculate_distance.bl_idname, text="Calculate Distance")
def register():
bpy.utils.register_class(OBJECT_OT_select_face)
bpy.utils.register_class(OBJECT_OT_calculate_distance)
bpy.utils.register_class(VIEW3D_PT_distance_display)
# 初始化选择的面索引
bpy.types.Scene.face_a_index = bpy.props.IntProperty(name=“Face A Index”, default=-1)
bpy.types.Scene.face_b_index = bpy.props.IntProperty(name=“Face B Index”, default=-1)
def unregister():
bpy.utils.unregister_class(OBJECT_OT_select_face)
bpy.utils.unregister_class(OBJECT_OT_calculate_distance)
bpy.utils.unregister_class(VIEW3D_PT_distance_display)
# 清除自定义属性
del bpy.types.Scene.face_a_index
del bpy.types.Scene.face_b_index
if name == “main”:
register()