Как объединить объекты в Blender с помощью Python?

Проблема: не объединяются объекты (Warning: Active object is not a selected mesh)
Имеется большая карта с огромным кол-вом объектов на ней.
5a462ddf19c33347329199.png
Нужно было объединить объекты, у которых совпадает начало названия
{"name", "name 1", (...),"name N"} -> "name"
Руками это делать довольно долго и муторно, поэтому решил воспользоваться возможностью написания для блендера скриптов на питоне.

Путём проб и ошибок были созданы два метода:
import collections, time
def selector(): # выделяет объекты, названия которых начинаются одинаково
    c = collections.Counter([x.name.split()[0] for x in C.scene.objects])
    _nr = [x for x in dict(c) if dict(c)[x] > 1]
    del c
    for nr in _nr:
        bpy.ops.object.select_all(action='DESELECT')
        print("Selecting all", nr)
        for obj in C.scene.objects:
            if not obj.name.startswith(nr): continue
            bpy.data.objects[obj.name].select = True
            print("Selected", obj.name)
        joiner()

def joiner(): # должен объединять объекты
    bpy.ops.object.join()
    time.sleep(.5)
    bpy.ops.object.select_all(action='DESELECT')

При вызове метода selector() кучи объектов с одинаковыми началами названий должны объединиться, но нет:
5a462fe9c6f81732957318.png

Мною было замечено, что когда selector() выделяет объекты, то все они подсвечиваются оранжевым:
5a46305bda420967101977.png
При этом, если самостоятельно вызвать joiner(), то в консоли пишет:
5a4630efbc027369869764.png
Объединение через Ctrl+J вызывает ту же ошибку(но она отображается в тулбаре).

Если же выделять вручную, то всегда остаётся один элемент, подсвеченный жёлтым:
5a4630b389a72395411867.png
В этом случае вызов joiner(), как и объединение через Ctrl+J, работают на ура. Все объекты сливаются именно в тот, который был подсвечен жёлтым.

Может кто сталкивался?
  • Вопрос задан
  • 977 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы