-
Notifications
You must be signed in to change notification settings - Fork 2
Open
Description
from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import A4, A3
from reportlab.lib.units import mm
from reportlab.lib.colors import black, red, blue, green
import math
def create_subwoofer_box_drawing():
# Создаем PDF документ
pdf_filename = "subwoofer_box_drawing.pdf"
c = canvas.Canvas(pdf_filename, pagesize=A3)
# Параметры короба
external_width = 900
external_height = 500
external_depth = 600
material_thickness = 20
# Внутренние размеры
internal_width = external_width - 2 * material_thickness
internal_height = external_height - 2 * material_thickness
internal_depth = external_depth - 2 * material_thickness
# Параметры порта
port_height = 400
port_width = 60
port_length = 115
# Начальные координаты для чертежа
x_offset = 50
y_offset = 700
# Заголовок
c.setFont("Helvetica-Bold", 16)
c.drawString(100, 1050, "ЧЕРТЕЖ САБВУФЕРА ДЛЯ 2x MACHETE FI-T R15")
# Основные параметры
c.setFont("Helvetica", 10)
info_text = [
f"Внешние габариты: {external_width}x{external_height}x{external_depth} мм",
f"Материал: МДФ {material_thickness} мм",
f"Объем: ~208 литров",
f"Настройка порта: 35 Гц",
f"Порт: {port_width}x{port_height} мм, длина {port_length} мм"
]
for i, text in enumerate(info_text):
c.drawString(100, 1020 - i * 20, text)
# ВИД СПЕРЕДИ
c.setFont("Helvetica-Bold", 12)
c.drawString(x_offset, y_offset + 300, "ВИД СПЕРЕДИ")
# Рамка вида спереди
c.rect(x_offset, y_offset, external_width/2, external_height/2)
# Отверстия для динамиков
speaker_diameter = 360
speaker1_x = x_offset + 150
speaker2_x = x_offset + 450
speaker_y = y_offset + 150
# Динамик 1
c.circle(speaker1_x, speaker_y, speaker_diameter/4)
c.setFont("Helvetica", 8)
c.drawString(speaker1_x - 20, speaker_y - 10, "15\"")
# Динамик 2
c.circle(speaker2_x, speaker_y, speaker_diameter/4)
c.drawString(speaker2_x - 20, speaker_y - 10, "15\"")
# Порт
port_x = x_offset + 320
port_y = y_offset + 50
c.rect(port_x, port_y, port_width/2, port_height/2)
c.setFont("Helvetica", 8)
c.drawString(port_x + 10, port_y - 15, f"Порт {port_width}x{port_height}")
# Размерные линии вида спереди
# Ширина
c.line(x_offset, y_offset - 20, x_offset + external_width/2, y_offset - 20)
c.line(x_offset, y_offset - 15, x_offset, y_offset - 25)
c.line(x_offset + external_width/2, y_offset - 15, x_offset + external_width/2, y_offset - 25)
c.drawString(x_offset + external_width/4 - 20, y_offset - 35, f"{external_width} мм")
# Высота
c.line(x_offset - 20, y_offset, x_offset - 20, y_offset + external_height/2)
c.line(x_offset - 15, y_offset, x_offset - 25, y_offset)
c.line(x_offset - 15, y_offset + external_height/2, x_offset - 25, y_offset + external_height/2)
c.drawString(x_offset - 60, y_offset + external_height/4 - 10, f"{external_height} мм")
# ВИД СВЕРХУ
c.setFont("Helvetica-Bold", 12)
c.drawString(x_offset + 500, y_offset + 300, "ВИД СВЕРХУ (РАЗРЕЗ)")
# Рамка вида сверху
c.rect(x_offset + 500, y_offset, external_width/2, external_depth/2)
# Внутреннее пространство
internal_x = x_offset + 500 + material_thickness/2
internal_y = y_offset + material_thickness/2
c.rect(internal_x, internal_y, internal_width/2, internal_depth/2)
# Порт внутри
port_internal_x = internal_x + internal_width/2 - port_length/2
port_internal_y = internal_y + 100
c.rect(port_internal_x, port_internal_y, port_length/2, port_width/2)
# Стрелки потока воздуха
c.setFillColor(blue)
for i in range(3):
arrow_y = port_internal_y + port_width/4
start_x = port_internal_x + 10 + i * 15
end_x = start_x + 10
c.line(start_x, arrow_y, end_x, arrow_y)
c.polygon([end_x, arrow_y, end_x - 3, arrow_y - 2, end_x - 3, arrow_y + 2])
c.setFillColor(black)
# Размерные линии вида сверху
# Глубина
c.line(x_offset + 500 - 20, y_offset, x_offset + 500 - 20, y_offset + external_depth/2)
c.line(x_offset + 500 - 15, y_offset, x_offset + 500 - 25, y_offset)
c.line(x_offset + 500 - 15, y_offset + external_depth/2, x_offset + 500 - 25, y_offset + external_depth/2)
c.drawString(x_offset + 500 - 60, y_offset + external_depth/4 - 10, f"{external_depth} мм")
# Длина порта
c.line(port_internal_x, port_internal_y - 20, port_internal_x + port_length/2, port_internal_y - 20)
c.line(port_internal_x, port_internal_y - 15, port_internal_x, port_internal_y - 25)
c.line(port_internal_x + port_length/2, port_internal_y - 15, port_internal_x + port_length/2, port_internal_y - 25)
c.drawString(port_internal_x + port_length/4 - 15, port_internal_y - 35, f"{port_length} мм")
# ВИД СБОКУ
y_offset_side = 350
c.setFont("Helvetica-Bold", 12)
c.drawString(x_offset, y_offset_side + 150, "ВИД СБОКУ (КОНСТРУКЦИЯ ПОРТА)")
# Конструкция порта
base_x = x_offset
base_y = y_offset_side
# Лицевая панель
c.rect(base_x, base_y, material_thickness, 100)
c.drawString(base_x + 5, base_y + 40, "Лицевая\nпанель")
# Полка порта
c.rect(base_x + material_thickness, base_y + 30, 40, material_thickness)
c.drawString(base_x + material_thickness + 5, base_y + 15, "Полка\nпорта")
# Перегородка порта
c.rect(base_x + material_thickness + 40, base_y, material_thickness, 100)
c.drawString(base_x + material_thickness + 45, base_y + 40, "Перегородка\nпорта")
# Стрелки потока
c.setFillColor(green)
for i in range(4):
arrow_x = base_x + material_thickness + 5
arrow_y = base_y + 50 + i * 10
c.line(arrow_x, arrow_y, arrow_x + 30, arrow_y)
c.polygon([arrow_x + 30, arrow_y, arrow_x + 27, arrow_y - 2, arrow_x + 27, arrow_y + 2])
c.setFillColor(black)
# ТАБЛИЦА ДЕТАЛЕЙ
c.setFont("Helvetica-Bold", 12)
c.drawString(x_offset + 400, y_offset_side + 150, "СПЕЦИФИКАЦИЯ ДЕТАЛЕЙ")
parts = [
("Поз.", "Наименование", "Размер, мм", "Кол."),
("1", "Лицевая панель", "500 x 900", "1"),
("2", "Задняя панель", "500 x 900", "1"),
("3", "Боковая панель", "500 x 560", "2"),
("4", "Верх/Низ", "560 x 860", "2"),
("5", "Перегородка порта", "460 x 115", "1"),
("6", "Полка порта", "115 x 860", "1")
]
# Рисуем таблицу
table_x = x_offset + 400
table_y = y_offset_side + 120
for i, row in enumerate(parts):
y_pos = table_y - i * 20
c.rect(table_x, y_pos - 15, 40, 15) # Поз.
c.rect(table_x + 40, y_pos - 15, 200, 15) # Наименование
c.rect(table_x + 240, y_pos - 15, 100, 15) # Размер
c.rect(table_x + 340, y_pos - 15, 40, 15) # Кол.
c.setFont("Helvetica", 8)
c.drawString(table_x + 5, y_pos - 7, row[0])
c.drawString(table_x + 45, y_pos - 7, row[1])
c.drawString(table_x + 245, y_pos - 7, row[2])
c.drawString(table_x + 345, y_pos - 7, row[3])
# Легенда
c.setFont("Helvetica-Bold", 10)
c.drawString(100, 200, "ЛЕГЕНДА:")
c.setFont("Helvetica", 9)
legend_items = [
"○ - Отверстия под динамики 15\"",
"□ - Щелевой фазоинвертор",
"→ - Направление воздушного потока",
"▬ - Толщина материала 20 мм"
]
for i, item in enumerate(legend_items):
c.drawString(100, 180 - i * 15, item)
# Инструкция по сборке
c.setFont("Helvetica-Bold", 10)
c.drawString(400, 200, "ИНСТРУКЦИЯ ПО СБОРКЕ:")
c.setFont("Helvetica", 8)
instructions = [
"1. Собрать каркас из деталей 2,3,4",
"2. Установить полку порта (6)",
"3. Установить перегородку порта (5)",
"4. Закрепить лицевую панель (1)",
"5. Герметизировать все швы",
"6. Обтянуть ковролином"
]
for i, instruction in enumerate(instructions):
c.drawString(400, 180 - i * 12, instruction)
c.save()
print(f"Чертеж сохранен как: {pdf_filename}")
Дополнительная функция для создания упрощенного чертежа в консоли
def create_ascii_drawing():
print("\n" + "="*80)
print("ASCII ЧЕРТЕЖ САБВУФЕРА ДЛЯ 2x MACHETE FI-T R15")
print("="*80)
print("\nВИД СПЕРЕДИ:")
print("""
+-------------------------------------------------------+
| |
| [OOOO] [====] [OOOO] |
| [ 15" ] [ ] [ 15" ] |
| [OOOO] [ПОРТ] [OOOO] |
| (1) (60x400) (2) |
| |
+-------------------------------------------------------+
Ширина: 900 мм Высота: 500 мм
""")
print("\nВИД СВЕРХУ (РАЗРЕЗ):")
print("""
+-------------------------------------------------------+
| |
| ВНУТРЕННЕЕ ПРОСТРАНСТВО (~208л) |
| |
| +--------------------------------+ |
| | | |
| | ТУННЕЛЬ ПОРТА | ← Воздушный поток |
| | (длина 115мм) | |
| | | |
| +--------------------------------+ |
| |
+-------------------------------------------------------+
Глубина: 600 мм
""")
print("\nСПЕЦИФИКАЦИЯ ДЕТАЛЕЙ:")
print("+" + "-"*50 + "+")
print("| Поз. | Наименование | Размер | Кол. |")
print("+" + "-"*50 + "+")
print("| 1 | Лицевая панель | 500x900 | 1 |")
print("| 2 | Задняя панель | 500x900 | 1 |")
print("| 3 | Боковая панель | 500x560 | 2 |")
print("| 4 | Верх/Низ | 560x860 | 2 |")
print("| 5 | Перегородка порта | 460x115 | 1 |")
print("| 6 | Полка порта | 115x860 | 1 |")
print("+" + "-"*50 + "+")
if name == "main":
try:
create_subwoofer_box_drawing()
create_ascii_drawing()
print("\nЧертеж успешно создан!")
except Exception as e:
print(f"Ошибка при создании чертежа: {e}")
Metadata
Metadata
Assignees
Labels
No labels