如何让我的变量脱离这个循环? - 搅拌机

时间:2015-11-19 00:55:29

标签: python object for-loop import blender

我正在尝试创建一个脚本,它读取.txt(存储.obj名称),然后在blender中创建costum按钮。如果单击其中一个按钮,则应根据txt中的名称打开文件。

它有效,但只打开列表中的最后一个obj。

我该如何解决?我想要这个工作!

到目前为止我的代码:

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,因为在循环之后绘制按钮,它具有列表中最后一项的值。但我不知道如何解决它。

2 个答案:

答案 0 :(得分:1)

我没有加载代码来测试这个,但从我看到的newbutton是一个变量。 for循环不断地反复设置相同的变量。这就是为什么你只得到列表中的最后一个值。

您可能想要做的是定义一个实例化对象的函数。该函数将需要将该对象构建到场景所需的所有参数。为循环的每次迭代调用该函数将使用预期数据实例化对场景的新对象,因为每个对象将封装您传递给它的参数。

我希望有所帮助!

答案 1 :(得分:1)

在blender界面中,按钮链接到操作员,单击该按钮会使操作员执行该任务。不是为每个按钮生成一个新的运算符,更好的方法是向运算符添加属性并设置每个按钮使用的属性。

通过向运算符类添加bpy.props,您可以为面板中显示的每个按钮设置一个属性,然后可以在运算符运行时访问该属性。

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