Python: Traceback (most recent call last):
  File "C:\Users\Admin\Downloads\Folder for serial\untitled.blend\Text", line 142, in <module>
  File "C:\Users\Admin\Downloads\Folder for serial\untitled.blend\Text", line 61, in create_ogive
ValueError: bpy_struct: item.attr = val: sequences of dimension 0 should contain 3 items, not 4
```
import bpy
import math

# Удаление всех объектов в сцене
bpy.ops.object.select_all(action='SELECT')
bpy.ops.object.delete(use_global=False)

# Параметры патрона
# Гильза
case_diameter = 6.0  # мм
case_length = 40.0  # мм
case_wall_thickness = 0.5  # мм
case_flare_length = 2.0  # мм (длина двойного свеса)
case_flare_angle = 10  # градусы
rifling_depth = 0.3  # мм (глубина канавок)
rifling_pitch = 20  # мм (расстояние между канавками)

# Пуля
bullet_diameter = 6.0  # мм
bullet_length = 35.0  # мм
bullet_head_length = 5.0  # мм (длина головки)
bullet_core_diameter = 2.0  # мм (диаметр сердечника)
bullet_core_length = 30.0  # мм
bullet_base_taper = 0.2  # мм (угол сужения основания)

# Капсюль
primer_diameter = 1.0  # мм
primer_height = 1.5  # мм

# Функция для создания цилиндра с заданными параметрами
def create_cylinder(name, diameter, height, location=(0,0,0), rotation=(0,0,0)):
    bpy.ops.mesh.primitive_cylinder_add(
        radius=diameter / 2,
        depth=height,
        location=location,
        rotation=rotation
    )
    obj = bpy.context.active_object
    obj.name = name
    return obj

# Функция для создания тора (для рифленого корпуса гильзы)
def create_torus(name, major_radius, minor_radius, location=(0,0,0), rotation=(0,0,0)):
    bpy.ops.mesh.primitive_torus_add(
        major_radius=major_radius,
        minor_radius=minor_radius,
        location=location,
        rotation=rotation
    )
    obj = bpy.context.active_object
    obj.name = name
    return obj

# Функция для создания огивы с использованием кривой Безье
def create_ogive(name, base_diameter, top_diameter, height, location=(0,0,0)):
    curves = bpy.data.curves.new(name, type='CURVE')
    curves.dimensions = '3D'
    bezier = curves.splines.new('BEZIER')
    bezier.bezier_points.add(1)
    
    bezier.bezier_points[0].co = (0, 0, 0, 1)
    bezier.bezier_points[0].handle_right = (height / 3, 0, 0, 1)
    
    bezier.bezier_points[1].co = (height, 0, 0, 1)
    bezier.bezier_points[1].handle_left = (height - height / 3, 0, 0, 1)
    
    ogive_obj = bpy.data.objects.new(name, curves)
    bpy.context.collection.objects.link(ogive_obj)
    ogive_obj.location = location
    
    # Превращаем кривую в меш
    bpy.context.view_layer.objects.active = ogive_obj
    bpy.ops.object.convert(target='MESH')
    
    # Масштабируем огиву до нужного диаметра
    ogive_obj.scale = (base_diameter / 2, base_diameter / 2, 1)
    
    return ogive_obj

# Создание гильзы
# Внешняя часть гильзы
case_outer = create_cylinder("Case_Outer", case_diameter, case_length + case_flare_length, location=(0,0,0))

# Внутренняя часть гильзы (для создания стенок)
case_inner_diameter = case_diameter - 2 * case_wall_thickness
case_inner_length = case_length
case_inner = create_cylinder("Case_Inner", case_inner_diameter, case_inner_length + case_flare_length, location=(0,0,0))

# Создание фланца (двойного свеса) на конце гильзы
flare_height = case_flare_length
flare_angle_rad = math.radians(case_flare_angle)
flare_radius = case_inner_diameter / 2 + case_wall_thickness

# Добавление фланца через модификатор "Boolean"
# Создадим конус для объединения с внешней частью гильзы
flare = create_cylinder("Case_Flare", flare_radius + flare_height * math.tan(flare_angle_rad), flare_height, location=(0,0,-case_length - flare_height / 2))
flare.rotation_euler[0] = math.radians(90)  # Поворачиваем фланец на 90 градусов по оси X

# Объединяем внешний корпус и фланец
bpy.context.view_layer.objects.active = case_outer
modifier = case_outer.modifiers.new(name="Bool_Flare", type='BOOLEAN')
modifier.operation = 'UNION'
modifier.object = flare
bpy.ops.object.modifier_apply(modifier="Bool_Flare")

# Удаляем объект фланца
bpy.data.objects.remove(flare, do_unlink=True)

# Выполняем булеву операцию вычитания внутренней части из внешней
bpy.context.view_layer.objects.active = case_outer
modifier = case_outer.modifiers.new(name="Bool_Hollow", type='BOOLEAN')
modifier.operation = 'DIFFERENCE'
modifier.object = case_inner
bpy.ops.object.modifier_apply(modifier="Bool_Hollow")

# Удаляем внутреннюю часть гильзы
bpy.data.objects.remove(case_inner, do_unlink=True)

# Назначаем материал гильзы
mat_case = bpy.data.materials.new(name="Case_Material")
mat_case.diffuse_color = (0.8, 0.8, 0.8, 1)  # Серый цвет
case_outer.data.materials.append(mat_case)

# Добавление рифления на гильзу
num_rifles = 8  # Количество канавок
for i in range(num_rifles):
    angle = (360 / num_rifles) * i
    rifle = create_torus("Rifle_{}".format(i), major_radius=(case_diameter / 2) - 0.1, minor_radius=rifling_depth, location=(0,0,0))
    rifle.rotation_euler[2] = math.radians(angle)
    # Boolean модификатор вычитания канавки из гильзы
    bpy.context.view_layer.objects.active = case_outer
    modifier = case_outer.modifiers.new(name="Bool_Rifle_{}".format(i), type='BOOLEAN')
    modifier.operation = 'DIFFERENCE'
    modifier.object = rifle
    bpy.ops.object.modifier_apply(modifier="Bool_Rifle_{}".format(i))
    # Удаляем временный тор
    bpy.data.objects.remove(rifle, do_unlink=True)

# Создание пули
# Создание огивы пули
ogive_height = bullet_head_length
ogive = create_ogive("Bullet_Ogive", base_diameter=bullet_diameter, top_diameter=bullet_diameter / 2, height=ogive_height, location=(0,0,case_length / 2 + bullet_length + ogive_height / 2))

# Создание тела пули
bullet_body = create_cylinder("Bullet_Body", bullet_diameter, bullet_length, location=(0,0,case_length / 2 + bullet_length / 2))

# Создание основания пули с легким сужением
base_taper = create_cylinder("Bullet_Base", bullet_diameter - bullet_base_taper, bullet_base_taper, location=(0,0,case_length / 2 - bullet_base_taper / 2))
base_taper.rotation_euler[2] = math.radians(0)

# Создание сердечника пули
bullet_core = create_cylinder("Bullet_Core", bullet_core_diameter, bullet_core_length, location=(0,0,case_length / 2 + bullet_core_length / 2))

# Объединяем огиву и тело пули
bpy.ops.object.select_all(action='DESELECT')
ogive.select_set(True)
bullet_body.select_set(True)
bpy.context.view_layer.objects.active = bullet_body
bpy.ops.object.join()
bullet_total = bpy.context.active_object
bullet_total.name = "Bullet_Frame"

# Добавляем сердечник внутрь пули
bpy.ops.object.select_all(action='DESELECT')
bullet_total.select_set(True)
bullet_core.select_set(True)
bpy.context.view_layer.objects.active = bullet_total
bpy.ops.object.join()
bullet_total.name = "Bullet"

# Объединяем с сужением основания
bpy.ops.object.select_all(action='DESELECT')
bullet_total.select_set(True)
base_taper.select_set(True)
bpy.context.view_layer.objects.active = bullet_total
bpy.ops.object.join()
bullet_total.name = "Bullet"

# Назначаем материал пули
mat_bullet = bpy.data.materials.new(name="Bullet_Material")
mat_bullet.diffuse_color = (0.1, 0.1, 0.1, 1)  # Тёмно-серый цвет
bullet_total.data.materials.append(mat_bullet)

# Создание капсюля
primer = create_cylinder("Primer", primer_diameter, primer_height, location=(0,0,-(case_length / 2 + primer_height / 2)))

# Назначаем материал капсюля
mat_primer = bpy.data.materials.new(name="Primer_Material")
mat_primer.diffuse_color = (1, 0, 0, 1)  # Красный цвет
primer.data.materials.append(mat_primer)

# Добавление деталей капсюля (например, маленькие отверстия или индикаторы)
# Для упрощения создадим несколько маленьких цилиндров
num_primer_details = 4
for i in range(num_primer_details):
    angle = (360 / num_primer_details) * i
    radius = primer_diameter / 2 * 0.8
    x = radius * math.cos(math.radians(angle))
    y = radius * math.sin(math.radians(angle))
    detail = create_cylinder("Primer_Detail_{}".format(i), 0.1, 0.5, location=(x, y, -(case_length / 2 + primer_height / 2)))
    detail.rotation_euler[2] = math.radians(angle)
    # Вычитание деталей из капсюля
    bpy.context.view_layer.objects.active = primer
    modifier = primer.modifiers.new(name="Bool_Primer_Detail_{}".format(i), type='BOOLEAN')
    modifier.operation = 'DIFFERENCE'
    modifier.object = detail
    bpy.ops.object.modifier_apply(modifier="Bool_Primer_Detail_{}".format(i))
    # Удаляем временный объект детали
    bpy.data.objects.remove(detail, do_unlink=True)

# Создание новой коллекции "Cartridge"
cartridge_collection = bpy.data.collections.new("Cartridge")
bpy.context.scene.collection.children.link(cartridge_collection)

# Ссылки на объекты, которые нужно переместить в коллекцию "Cartridge"
cartridge_objects = [case_outer, bullet_total, primer]

# Перемещение объектов в коллекцию "Cartridge"
for obj in cartridge_objects:
    # Проверяем, находится ли объект уже в коллекции
    if obj.name not in cartridge_collection.objects:
        # Удаляем объект из текущей коллекции
        bpy.context.scene.collection.objects.unlink(obj)
        # Добавляем объект в новую коллекцию
        cartridge_collection.objects.link(obj)

# Назначение имени всей коллекции
cartridge_collection.name = "Cartridge"

# Добавление сглаживания (Subdivision Surface) для более гладкой модели
bpy.ops.object.select_all(action='DESELECT')
cartridge_collection.objects.select_all(action='SELECT')
bpy.ops.object.shade_smooth()

# Масштабирование для удобства (по желанию)
# Например, чтобы патрон отображался с меньшими размерами
# bpy.ops.object.select_all(action='SELECT')
# bpy.ops.transform.resize(value=(0.1, 0.1, 0.1))

print("Модель патрона 6,0×40 мм успешно создана!")
```