
import bpy

def append_layered_action_5_0(source_obj_name, target_obj_name):
    source_obj = bpy.data.objects.get(source_obj_name)
    target_obj = bpy.data.objects.get(target_obj_name)
    
    if not (source_obj and target_obj):
        print("Ошибка: Объекты не найдены")
        return

    src_action = source_obj.animation_data.action
    tgt_action = target_obj.animation_data.action
    
    # 1. Получаем слои (обычно первый)
    src_layer = src_action.layers[0]
    tgt_layer = tgt_action.layers[0]

    # 2. Получаем стрипы
    src_strip = src_layer.strips[0]
    tgt_strip = tgt_layer.strips[0]

    # Смещение (опираемся на конец диапазона целевого экшена)
    offset = tgt_action.frame_range[1]

    # 3. Итерируемся по channelbags в исходном стрипе
    for src_bag in src_strip.channelbags:
        # Ищем или создаем соответствующий bag в целевом стрипе
        # Обычно они сопоставляются по имени или типу (например, 'Keyframe Channel Bag')
        # В простейшем случае берем первый или сопоставляем по индексу
        dst_bag = None
        if len(tgt_strip.channelbags) > 0:
            # Пытаемся найти по названию (если оно есть) или берем тот же индекс
            dst_bag = tgt_strip.channelbags[0]
        
        if not dst_bag:
            # Если в целевом стрипе нет сумок, это странно, но можно создать
            # (Метод создания может зависеть от конкретного подтипа стрипа в 5.0)
            continue

        #print(f"Обработка channelbag: {src_bag.name}, кривых: {len(src_bag.fcurves)}")

        # 4. Итерируемся по fcurves внутри сумки
        for src_fcurve in src_bag.fcurves:
            dst_fcurve = dst_bag.fcurves.find(src_fcurve.data_path, index=src_fcurve.array_index)
            
            if not dst_fcurve:
                dst_fcurve = dst_bag.fcurves.new(data_path=src_fcurve.data_path, index=src_fcurve.array_index)
            
            # 5. Копируем ключи с офсетом
            for keyframe in src_fcurve.keyframe_points:
                new_frame = keyframe.co[0] + offset
                new_value = keyframe.co[1]
                
                new_kp = dst_fcurve.keyframe_points.insert(new_frame, new_value, options={'FAST'})
                new_kp.interpolation = keyframe.interpolation

        # Обновляем интерполяцию
        for fc in dst_bag.fcurves:
            fc.update()

    print(f"Анимация успешно дозаписана. Новый конец: {tgt_action.frame_range[1]}")

append_layered_action_5_0('Armature.001', 'Armature')

