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')