CadQuery python: построение сложной фаски объекта

Пытаюсь смоделировать болт в CadQuery python:

import cadquery as cq
from math import sqrt, tan, radians

# Параметры модели
head_diameter = 10.0  # Диаметр по вершинам (описанная окружность)
head_height = 5.0     # Высота головки
shaft_diameter = 5.0  # Диаметр стержня
shaft_length = 20.0   # Длина стержня

# Расчетные параметры
R = head_diameter / 2                 # Радиус описанной окружности
r = R * sqrt(3)/2                     # Радиус вписанной окружности
chamfer_size = (R - r) / tan(45)      # Размер фаски для угла 45°

#1. Создаем шестигранную головку
bolt_head = (
    cq.Workplane("XY")
    .polygon(6, 2*R)                  # Создаем шестигранник
    .extrude(head_height)              # Выдавливаем на высоту головки
    .translate((0, 0, -1 * (head_height/2)))
)

bolt_head = bolt_head.edges("Z").chamfer(1)

# 2. Создаем стержень
bolt_shaft = (
    cq.Workplane("XY")
    .circle(shaft_diameter/2)
    .extrude(-shaft_length)
)

# 3. Объединяем компоненты
bolt = bolt_head.union(bolt_shaft)

Получается вот такая кракозябра: введите сюда описание изображения

Теперь вопрос. Как срезать вершины углов на головке болта под 45 градусов. Цель получить вот такую головку болта: введите сюда описание изображения


Ответы (2 шт):

Автор решения: strawdog

Я не специалист в cadquery, пришлось немного покопаться в api. Пришел к выводу, что самым простым способом решить вашу проблему будет многократное вычитание solid-объектов. Пример (без точных размеров, разумеется) ниже:

import cadquery as cq

cap = cq.Solid.makeCone(10,8,2) # создаете начальный конус
for i in (0, 60, 120, 180, 240, -60): 
    # создаете призму
    box = cq.Solid.makeBox(12,12,2, (8, -6, 0))
    # вращаете ее на i градусов
    box = box.rotate((0, 0, 0), (0, 0, 1), i)
    # вычитаете призму из конуса
    cap = cap.cut(box)
cap

введите сюда описание изображения

→ Ссылка
Автор решения: Филипп Шувалов

Немного пошел другим путем. Зато с размерами и контролем.Спасибо strawdog за идею которую можно развивать!!!

    import cadquery as cq
    from cadquery import Solid
    from math import sqrt, tan, radians, atan, pi
    
    
    # ========== ПАРАМЕТРЫ МОДЕЛИ ==========
    HEAD_DIAMETER = 33.53    # Диаметр головки по вершинам
    HEAD_HEIGHT = 12.5       # Высота шестигранной части
    SHAFT_DIAMETER = 10.0   # Диаметр стержня
    SHAFT_LENGTH = 70.0     # Длина стержня
    CHAMFER_ANGLE = 45.0    # Угол скоса вершин
            
    # Расчетные константы
    R = HEAD_DIAMETER / 2
    r = R * sqrt(3)/2  # Радиус вписанной окружности    
    
    
    # ========== ПАРАМЕТРЫ СЕКУЩЕГО КОНУСА ==========
    BASE_RADIUS = (HEAD_DIAMETER / 2)*1.2 # Внешний радиус основания
    TOP_RADIUS = 5.0 # Внешний радиус вершины
    HEIGHT = ((BASE_RADIUS - TOP_RADIUS) / tan((CHAMFER_ANGLE*pi)/180)) # Общая высота конуса
    WALL_THICKNESS = BASE_RADIUS - (HEAD_DIAMETER/2)      # Толщина стенок
    H_TARGET = HEIGHT*(((BASE_RADIUS-WALL_THICKNESS)-r)/
                       ((BASE_RADIUS-WALL_THICKNESS)-(TOP_RADIUS-WALL_THICKNESS))) # подача по оси Z для достижения вписанной окружности        
    # =======================================
    
    # Базовый шестигранник
    head = cq.Workplane("XY").polygon(6, HEAD_DIAMETER).extrude(-HEAD_HEIGHT)
    
    # Внешний конус
    outer = cq.Solid.makeCone(BASE_RADIUS, TOP_RADIUS, HEIGHT, (0, 0, 0))
    
    # Внутренний конус
    inner = cq.Solid.makeCone(
        BASE_RADIUS - WALL_THICKNESS, 
        TOP_RADIUS - WALL_THICKNESS, 
        HEIGHT
    )
    
    # Вырезаем внутреннюю часть конуса
    hollow_cone = outer.cut(inner)
    
    head = head.translate((0, 0, H_TARGET)).cut(hollow_cone)

Итог моделирования через секущий конус

→ Ссылка