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)

