Как получить мою переменную из этого цикла? – Блендер

Я пытаюсь создать скрипт, который читает .txt (где хранятся имена .obj), а затем создает кнопки costum в блендере. Если вы нажмете одну из кнопок, она должна открыть файл в соответствии с именем в 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, потому что после цикла, который рисует кнопки, он имеет значение последнего элемента в списке. Но я не знаю, как это исправить.

В интерфейсе блендера кнопка привязана к оператору, нажатие кнопки приводит к тому, что оператор выполняет свою задачу. Вместо того, чтобы генерировать новый оператор для каждой кнопки, лучшим подходом было бы добавить свойство к оператору и установить свойство, используемое для каждой кнопки.

Добавляя 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 

Я не загружал код для проверки этого, но из того, что я вижу, newbutton – это одна переменная. Цикл for постоянно устанавливает одну и ту же переменную. Вот почему вы получаете последнее значение в списке.

То, что вы можете сделать, это определить функцию, которая создает экземпляр вашего объекта. Эта функция потребует всех параметров, необходимых для создания этого объекта для сцены. Вызов этой функции для каждой итерации цикла создаст новый объект для сцены с ожидаемыми данными, поскольку каждый объект будет инкапсулировать параметры, которые вы передаете ему.

Надеюсь, это поможет!