如何让我的变量脱离这个循环? - 搅拌机
How to get my variable out of this loop? - Blender
我正在尝试制作一个脚本,该脚本读取 .txt(存储 .obj 名称的位置),然后在搅拌机中制作服装 - 按钮。如果单击其中一个按钮,它应该会根据 txt 中的名称打开文件。
有效,但只会打开列表中的最后一个对象。
我该如何解决?我想让它起作用!
到目前为止我的代码:
import bpy
class directoryPan(bpy.types.Panel):
bl_space_type = "VIEW_3D"
bl_region_type = "TOOLS"
bl_label = "Biblio"
bl_category = "Import" #
def draw(self, context):
self.layout.row().label("Import :")
self.layout.operator("import.stuff", icon ='FILE')
obj_list = []
biblio_one = open("C:\Users\Jasmin\Desktop\liste.txt")
for line in biblio_one:
obj_list.append(line.rstrip())
biblio_one.close()
print("start")
for i in obj_list:
newbutton = i
import_obj = "import." + i
self.layout.operator(import_obj, icon ='FILE')
######
class ScanFileOperator(bpy.types.Operator):
bl_idname = import_obj
bl_label = newbutton
def execute(self, context):
pfad = "C:\Users\Jasmin\Desktop\" + newbutton+ ".obj" ###
bpy.ops.import_scene.obj(filepath= pfad, filter_glob="*.obj;*.mtl", use_ngons=True, use_edges=True, use_smooth_groups=True, use_split_objects=True, use_split_groups=True, use_groups_as_vgroups=False, use_image_search=True, split_mode='ON', global_clamp_size=0, axis_forward='-Z', axis_up='Y')
bpy.ops.object.origin_set(type = 'GEOMETRY_ORIGIN')
return {'FINISH'}
def register():
bpy.utils.register_module(__name__)
def unregister():
bpy.utils.unregister_module(__name__)
if __name__ == "__main__":
register()
我知道问题出在新按钮上,因为在绘制按钮的循环之后,它具有列表中最后一项的值。但是我不知道怎么解决。
我还没有加载代码来对此进行测试,但据我所知,newbutton 是一个变量。 for 循环不断地设置相同的变量。这就是为什么你只得到列表中的最后一个值。
您可能想要做的是定义一个实例化您的对象的函数。该函数将需要将该对象构建到场景所需的所有参数。为循环的每次迭代调用该函数将为具有预期数据的场景实例化一个新对象,因为每个对象都会封装您传递给它的参数。
希望对您有所帮助!
在 blender 的界面中,一个按钮链接到一个操作员,单击该按钮会使操作员执行其任务。与其为每个按钮生成新的运算符,更好的方法是向运算符添加 属性 并设置每个按钮使用的 属性。
通过将 bpy.props
添加到运算符 class 中,您会得到一个 属性,可以为每个按钮设置它,因为它显示在面板中,然后可以在运算符是 运行.
class ScanFileOperator(bpy.types.Operator):
'''Import an obj into the current scene'''
bl_idname = 'import.scanfile'
bl_label = 'Import an obj'
bl_options = {'REGISTER', 'UNDO'}
objfile = bpy.props.StringProperty(name="obj filename")
def execute(self, context):
print('importing', self.objfile)
return {'FINISHED'}
class directoryPan(bpy.types.Panel):
bl_space_type = "VIEW_3D"
bl_region_type = "TOOLS"
bl_label = "Biblio"
bl_category = "Import"
def draw(self, context):
col = self.layout.column()
col.label("Import :")
obj_list = []
biblio_one = ['obj1','obj2','obj3','obj4','obj5',]
for line in biblio_one:
obj_list.append(line.rstrip())
for i in obj_list:
import_obj = "import." + i
col.operator('import.scanfile', text='Import - '+i,
icon ='FILE').objfile = import_obj
我正在尝试制作一个脚本,该脚本读取 .txt(存储 .obj 名称的位置),然后在搅拌机中制作服装 - 按钮。如果单击其中一个按钮,它应该会根据 txt 中的名称打开文件。
有效,但只会打开列表中的最后一个对象。
我该如何解决?我想让它起作用!
到目前为止我的代码:
import bpy
class directoryPan(bpy.types.Panel):
bl_space_type = "VIEW_3D"
bl_region_type = "TOOLS"
bl_label = "Biblio"
bl_category = "Import" #
def draw(self, context):
self.layout.row().label("Import :")
self.layout.operator("import.stuff", icon ='FILE')
obj_list = []
biblio_one = open("C:\Users\Jasmin\Desktop\liste.txt")
for line in biblio_one:
obj_list.append(line.rstrip())
biblio_one.close()
print("start")
for i in obj_list:
newbutton = i
import_obj = "import." + i
self.layout.operator(import_obj, icon ='FILE')
######
class ScanFileOperator(bpy.types.Operator):
bl_idname = import_obj
bl_label = newbutton
def execute(self, context):
pfad = "C:\Users\Jasmin\Desktop\" + newbutton+ ".obj" ###
bpy.ops.import_scene.obj(filepath= pfad, filter_glob="*.obj;*.mtl", use_ngons=True, use_edges=True, use_smooth_groups=True, use_split_objects=True, use_split_groups=True, use_groups_as_vgroups=False, use_image_search=True, split_mode='ON', global_clamp_size=0, axis_forward='-Z', axis_up='Y')
bpy.ops.object.origin_set(type = 'GEOMETRY_ORIGIN')
return {'FINISH'}
def register():
bpy.utils.register_module(__name__)
def unregister():
bpy.utils.unregister_module(__name__)
if __name__ == "__main__":
register()
我知道问题出在新按钮上,因为在绘制按钮的循环之后,它具有列表中最后一项的值。但是我不知道怎么解决。
我还没有加载代码来对此进行测试,但据我所知,newbutton 是一个变量。 for 循环不断地设置相同的变量。这就是为什么你只得到列表中的最后一个值。
您可能想要做的是定义一个实例化您的对象的函数。该函数将需要将该对象构建到场景所需的所有参数。为循环的每次迭代调用该函数将为具有预期数据的场景实例化一个新对象,因为每个对象都会封装您传递给它的参数。
希望对您有所帮助!
在 blender 的界面中,一个按钮链接到一个操作员,单击该按钮会使操作员执行其任务。与其为每个按钮生成新的运算符,更好的方法是向运算符添加 属性 并设置每个按钮使用的 属性。
通过将 bpy.props
添加到运算符 class 中,您会得到一个 属性,可以为每个按钮设置它,因为它显示在面板中,然后可以在运算符是 运行.
class ScanFileOperator(bpy.types.Operator):
'''Import an obj into the current scene'''
bl_idname = 'import.scanfile'
bl_label = 'Import an obj'
bl_options = {'REGISTER', 'UNDO'}
objfile = bpy.props.StringProperty(name="obj filename")
def execute(self, context):
print('importing', self.objfile)
return {'FINISHED'}
class directoryPan(bpy.types.Panel):
bl_space_type = "VIEW_3D"
bl_region_type = "TOOLS"
bl_label = "Biblio"
bl_category = "Import"
def draw(self, context):
col = self.layout.column()
col.label("Import :")
obj_list = []
biblio_one = ['obj1','obj2','obj3','obj4','obj5',]
for line in biblio_one:
obj_list.append(line.rstrip())
for i in obj_list:
import_obj = "import." + i
col.operator('import.scanfile', text='Import - '+i,
icon ='FILE').objfile = import_obj