Skip to content

саб #3

@zavetan9605-spec

Description

@zavetan9605-spec

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

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions