Как получить мою переменную из этого цикла? – Блендер
Я пытаюсь создать скрипт, который читает .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, потому что после цикла, который рисует кнопки, он имеет значение последнего элемента в списке. Но я не знаю, как это исправить.
- Spyder Python "в настоящее время не поддерживаются"
- Доступ к объектам python внутри объектов в Python
- python: будет ли класс со многими методами занимать больше времени для инициализации?
- Как удалить объект из списка внутри списка?
- Python – аккуратный способ создания нескольких объектов?
В интерфейсе блендера кнопка привязана к оператору, нажатие кнопки приводит к тому, что оператор выполняет свою задачу. Вместо того, чтобы генерировать новый оператор для каждой кнопки, лучшим подходом было бы добавить свойство к оператору и установить свойство, используемое для каждой кнопки.
Добавляя 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 постоянно устанавливает одну и ту же переменную. Вот почему вы получаете последнее значение в списке.
То, что вы можете сделать, это определить функцию, которая создает экземпляр вашего объекта. Эта функция потребует всех параметров, необходимых для создания этого объекта для сцены. Вызов этой функции для каждой итерации цикла создаст новый объект для сцены с ожидаемыми данными, поскольку каждый объект будет инкапсулировать параметры, которые вы передаете ему.
Надеюсь, это поможет!
- Python – Удаление объекта из списка
- Возможно ли динамически генерировать атрибут в объекте python?
- Форсировать создание нового объекта памяти python
- Как определить, что помещать внутри функции __init__ в класс python?
- Данные как отношение между объектами в Python
- представлять файл как объект с python
- имя объекта печати / экземпляра в python
- Python: Как вы можете обращаться к объекту или словарю взаимозаменяемо?
- Как создать неинтуитивный класс?