anisya-so8oleva/ graphics-pyimport matplotlib.pyplot as plt
import matplotlib.patches as patches
from matplotlib.path import Path
import numpy as np
# Настройка русского шрифта (если не отображается, замените на Arial)
plt.rcParams['font.family'] = 'DejaVu Sans'
plt.rcParams['font.sans-serif'] = ['DejaVu Sans', 'Arial', 'Liberation Sans', 'Microsoft Sans Serif']
plt.rcParams['axes.unicode_minus'] = False
# =============================================
# ЛИСТ 1. Схема генплана Калининской АЭС
# =============================================
def draw_site_plan():
fig, ax = plt.subplots(figsize=(10, 8))
ax.set_xlim(0, 100)
ax.set_ylim(0, 80)
ax.set_title("Рисунок 1 — Схема генерального плана промплощадки Калининской АЭС (М 1:5000)", fontsize=12, fontweight='bold')
ax.axis('off')
# Кольцевая дорога
ring = patches.Rectangle((10, 10), 80, 60, linewidth=2, edgecolor='black', facecolor='none', linestyle='-')
ax.add_patch(ring)
# Главный корпус
main_building = patches.Rectangle((30, 30), 40, 25, linewidth=1, edgecolor='black', facecolor='lightgray')
ax.add_patch(main_building)
ax.text(50, 42, 'ГЛАВНЫЙ КОРПУС', ha='center', fontsize=8, fontweight='bold')
ax.text(50, 38, '(реакторное и турбинное отделения)', ha='center', fontsize=7)
ax.text(50, 34, 'I степень огнестойкости', ha='center', fontsize=7)
# ДГС
dgs = patches.Rectangle((15, 55), 12, 10, linewidth=1, edgecolor='black', facecolor='yellow')
ax.add_patch(dgs)
ax.text(21, 60, 'ДГС', ha='center', fontsize=8, fontweight='bold')
ax.text(21, 56, '(кат. В)', ha='center', fontsize=7)
# АБК
abk = patches.Rectangle((75, 55), 12, 10, linewidth=1, edgecolor='black', facecolor='lightgreen')
ax.add_patch(abk)
ax.text(81, 60, 'АБК', ha='center', fontsize=8, fontweight='bold')
ax.text(81, 56, '(Ф4.3)', ha='center', fontsize=7)
# Насосная станция
pump = patches.Rectangle((75, 15), 10, 8, linewidth=1, edgecolor='black', facecolor='lightblue')
ax.add_patch(pump)
ax.text(80, 19, 'Насосная', ha='center', fontsize=7)
ax.text(80, 16, 'станция', ha='center', fontsize=7)
# Маслохозяйство
oil = patches.Rectangle((15, 15), 10, 8, linewidth=1, edgecolor='black', facecolor='orange')
ax.add_patch(oil)
ax.text(20, 19, 'Масло-', ha='center', fontsize=7)
ax.text(20, 16, 'хозяйство', ha='center', fontsize=7)
# Водородная станция
hydrogen = patches.Rectangle((55, 10), 10, 8, linewidth=1, edgecolor='black', facecolor='red', alpha=0.7)
ax.add_patch(hydrogen)
ax.text(60, 14, 'Водородная', ha='center', fontsize=7, color='white')
ax.text(60, 11, '(кат. А)', ha='center', fontsize=7, color='white')
# Пожарные гидранты (кружки)
hydrant_positions = [(20, 25), (35, 25), (50, 25), (65, 25), (80, 25),
(20, 65), (35, 65), (50, 65), (65, 65), (80, 65)]
for x, y in hydrant_positions:
circle = patches.Circle((x, y), 1.5, linewidth=1, edgecolor='red', facecolor='red')
ax.add_patch(circle)
ax.text(x, y-2, 'ПГ', ha='center', fontsize=6, color='red')
# Въезды
ax.annotate('ВЪЕЗД №1', xy=(50, 8), ha='center', fontsize=8, fontweight='bold',
arrowprops=dict(arrowstyle='->', lw=1.5))
ax.annotate('ВЪЕЗД №2', xy=(50, 72), ha='center', fontsize=8, fontweight='bold',
arrowprops=dict(arrowstyle='->', lw=1.5))
# Экспликация
props = dict(boxstyle='round', facecolor='white', alpha=0.8)
ax.text(5, 5, 'Условные обозначения:', fontsize=8, fontweight='bold')
ax.text(5, 2, '□ Серый — главный корпус', fontsize=7)
ax.text(5, -1, '□ Желтый — ДГС', fontsize=7)
ax.text(5, -4, '● Красный — пожарный гидрант (ПГ)', fontsize=7)
ax.text(5, -7, '═══ Кольцевой проезд (6 м)', fontsize=7)
plt.tight_layout()
plt.savefig('list1_site_plan.png', dpi=150, bbox_inches='tight')
plt.close()
print("✅ Лист 1 сохранён: list1_site_plan.png")
# =============================================
# ЛИСТ 2. План ДГС с эвакуационными путями
# =============================================
def draw_dgs_plan():
fig, ax = plt.subplots(figsize=(10, 8))
ax.set_xlim(0, 100)
ax.set_ylim(0, 80)
ax.set_title("Рисунок 2 — План 1-го этажа здания ДГС с нанесением эвакуационных путей (М 1:100)", fontsize=12, fontweight='bold')
ax.axis('off')
# Контур здания
building = patches.Rectangle((5, 5), 90, 70, linewidth=2, edgecolor='black', facecolor='none')
ax.add_patch(building)
# Дизельный зал
diesel = patches.Rectangle((10, 40), 35, 30, linewidth=1, edgecolor='black', facecolor='lightyellow')
ax.add_patch(diesel)
ax.text(27, 60, 'ДИЗЕЛЬНЫЙ ЗАЛ', ha='center', fontsize=9, fontweight='bold')
ax.text(27, 55, '(категория В)', ha='center', fontsize=8)
# Дизеля
for i, x in enumerate([15, 22, 29, 36]):
dg = patches.Rectangle((x, 45), 5, 5, linewidth=1, edgecolor='black', facecolor='gray')
ax.add_patch(dg)
ax.text(x+2.5, 47.5, f'ДГ{i+1}', ha='center', fontsize=6, color='white')
# Масляный подвал
oil_basement = patches.Rectangle((55, 40), 35, 30, linewidth=1, edgecolor='black', facecolor='orange', alpha=0.5)
ax.add_patch(oil_basement)
ax.text(72, 60, 'МАСЛЯНЫЙ ПОДВАЛ', ha='center', fontsize=9, fontweight='bold')
ax.text(72, 55, '(категория В)', ha='center', fontsize=8)
# Щитовая
control = patches.Rectangle((10, 10), 25, 20, linewidth=1, edgecolor='black', facecolor='lightblue')
ax.add_patch(control)
ax.text(22, 22, 'ЩИТОВАЯ', ha='center', fontsize=8, fontweight='bold')
ax.text(22, 18, 'управления', ha='center', fontsize=7)
# Мастерская
workshop = patches.Rectangle((55, 10), 35, 20, linewidth=1, edgecolor='black', facecolor='lightgreen')
ax.add_patch(workshop)
ax.text(72, 22, 'МАСТЕРСКАЯ', ha='center', fontsize=8, fontweight='bold')
# Лестничная клетка
stairs = patches.Rectangle((40, 5), 20, 25, linewidth=2, edgecolor='black', facecolor='lightgray', hatch='//')
ax.add_patch(stairs)
ax.text(50, 22, 'ЛЕСТНИЧНАЯ КЛЕТКА', ha='center', fontsize=7, fontweight='bold')
ax.text(50, 18, '(тип Н2, подпор)', ha='center', fontsize=6)
# Противопожарные перегородки (красные линии)
ax.plot([45, 45], [40, 70], 'r-', linewidth=3)
ax.plot([45, 45], [5, 30], 'r-', linewidth=3)
ax.plot([10, 55], [40, 40], 'r-', linewidth=3)
ax.plot([55, 90], [40, 40], 'r-', linewidth=3)
# Противопожарные двери
door_positions = [(45, 55), (45, 25), (35, 40), (55, 40)]
for x, y in door_positions:
door = patches.Rectangle((x-2, y-2), 4, 4, linewidth=1, edgecolor='red', facecolor='red', alpha=0.7)
ax.add_patch(door)
# Эвакуационные стрелки (зеленые)
arrows = [
((27, 40), (27, 35), '→'),
((72, 40), (72, 35), '→'),
((22, 10), (22, 5), '↓'),
((72, 10), (72, 5), '↓'),
((50, 5), (50, 2), '↓'),
]
for start, end, direction in arrows:
ax.annotate('', xy=end, xytext=start, arrowprops=dict(arrowstyle='->', lw=2, color='green'))
# Эвакуационные выходы
exit_sign = patches.Rectangle((45, 2), 10, 3, linewidth=1, edgecolor='green', facecolor='lightgreen')
ax.add_patch(exit_sign)
ax.text(50, 3.5, 'ВЫХОД', ha='center', fontsize=7, fontweight='bold')
# Экспликация
ax.text(5, 75, 'Условные обозначения:', fontsize=8, fontweight='bold')
ax.text(5, 72, '█ Красная линия — противопожарная перегородка 1-го типа (EI 45)', fontsize=6, color='red')
ax.text(5, 69, '■ Красный квадрат — противопожарная дверь (EI 30)', fontsize=6, color='red')
ax.text(5, 66, '→ Зеленая стрелка — направление эвакуации', fontsize=6, color='green')
ax.text(5, 63, '□ Зеленый прямоугольник — эвакуационный выход', fontsize=6, color='green')
plt.tight_layout()
plt.savefig('list2_dgs_plan.png', dpi=150, bbox_inches='tight')
plt.close()
print("✅ Лист 2 сохранён: list2_dgs_plan.png")
# =============================================
# ЛИСТ 3. Кабельный туннель (разрез и план)
# =============================================
def draw_cable_tunnel():
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 6))
# ---- ЛЕВАЯ ЧАСТЬ: поперечный разрез ----
ax1.set_xlim(0, 100)
ax1.set_ylim(0, 80)
ax1.set_title('а) Поперечный разрез кабельного туннеля (М 1:50)', fontsize=10, fontweight='bold')
ax1.axis('off')
# Стенки туннеля
tunnel = patches.Rectangle((20, 20), 60, 50, linewidth=2, edgecolor='black', facecolor='none')
ax1.add_patch(tunnel)
# Стеллажи
for x in [25, 75]:
for y in [25, 35, 45, 55]:
shelf = patches.Rectangle((x, y), 8, 3, linewidth=1, edgecolor='black', facecolor='brown')
ax1.add_patch(shelf)
# Кабели на стеллаже
cables = patches.Rectangle((x+1, y+0.5), 6, 2, linewidth=0.5, edgecolor='black', facecolor='gray')
ax1.add_patch(cables)
# Противопожарная перегородка
wall = patches.Rectangle((48, 20), 4, 50, linewidth=2, edgecolor='red', facecolor='red', alpha=0.5)
ax1.add_patch(wall)
ax1.text(50, 15, 'Противопожарная перегородка 1-го типа (EI 45)', ha='center', fontsize=7, color='red')
# Дверь
door = patches.Rectangle((48, 40), 4, 10, linewidth=1, edgecolor='darkred', facecolor='red', alpha=0.8)
ax1.add_patch(door)
ax1.text(50, 35, 'Дверь EI 30', ha='center', fontsize=6, color='darkred')
# Размеры
ax1.annotate('', xy=(20, 18), xytext=(80, 18), arrowprops=dict(arrowstyle='<->', lw=1))
ax1.text(50, 15, '1,8 м (ширина туннеля)', ha='center', fontsize=7)
ax1.annotate('', xy=(18, 20), xytext=(18, 70), arrowprops=dict(arrowstyle='<->', lw=1))
ax1.text(15, 45, '2,2 м', ha='center', fontsize=7, rotation=90)
# ---- ПРАВАЯ ЧАСТЬ: план туннеля ----
ax2.set_xlim(0, 100)
ax2.set_ylim(0, 50)
ax2.set_title('б) Фрагмент плана кабельного туннеля', fontsize=10, fontweight='bold')
ax2.axis('off')
# Туннель
tunnel_plan = patches.Rectangle((5, 15), 90, 20, linewidth=2, edgecolor='black', facecolor='none')
ax2.add_patch(tunnel_plan)
# Перегородки через 60 м
for x in [20, 45, 70]:
wall_plan = patches.Rectangle((x, 15), 3, 20, linewidth=2, edgecolor='red', facecolor='red', alpha=0.5)
ax2.add_patch(wall_plan)
ax2.text(x+1.5, 12, f'Перегородка\n{x}м', ha='center', fontsize=6, color='red')
# Двери
for x in [20, 45, 70]:
door_plan = patches.Rectangle((x, 22), 3, 6, linewidth=1, edgecolor='darkred', facecolor='red', alpha=0.8)
ax2.add_patch(door_plan)
# Подписи секций
ax2.text(12, 10, 'Секция 1', ha='center', fontsize=7)
ax2.text(32, 10, 'Секция 2', ha='center', fontsize=7)
ax2.text(57, 10, 'Секция 3', ha='center', fontsize=7)
ax2.text(82, 10, 'Секция 4', ha='center', fontsize=7)
# Размер шага
ax2.annotate('', xy=(20, 8), xytext=(45, 8), arrowprops=dict(arrowstyle='<->', lw=1))
ax2.text(32.5, 6, '60 м', ha='center', fontsize=7)
plt.tight_layout()
plt.savefig('list3_cable_tunnel.png', dpi=150, bbox_inches='tight')
plt.close()
print("✅ Лист 3 сохранён: list3_cable_tunnel.png")
# =============================================
# ЛИСТ 4. Таблица мероприятий
# =============================================
def draw_measures_table():
fig, ax = plt.subplots(figsize=(12, 8))
ax.axis('off')
ax.set_title("Рисунок 4 — План-график мероприятий по устранению нарушений требований пожарной безопасности", fontsize=12, fontweight='bold')
# Данные таблицы
data = [
["1", "Повреждение уплотнений на противопожарных дверях кабельных туннелей (секции 3,5,8)", "Нач. кабельного хозяйства Смирнов С.С.", "01.03.2021", ""],
["2", "Отсутствие актов скрытых работ на кабельные проходки", "Нач. ОКС Васильев В.В.", "01.03.2021", ""],
["3", "Неисправность доводчиков (2 шт.) и отсутствие уплотнения на двери ЛК реакторного отделения", "Нач. цеха эксплуатации Новиков Н.Н.", "01.02.2021", ""],
["4", "Не выполнена перекатка пожарных рукавов ВПВ машинного зала", "Нач. службы эксплуатации Михайлов М.М.", "15.12.2020", ""],
["5", "Отсутствуют копии сертификатов на противопожарные двери ДГС", "Гл. инженер Иванов И.И.", "01.02.2021", ""],
]
columns = ["№ п/п", "Наименование нарушения", "Ответственный", "Срок", "Отметка о выполнении"]
# Создание таблицы
table = ax.table(cellText=data, colLabels=columns, loc='center', cellLoc='left')
table.auto_set_font_size(False)
table.set_fontsize(9)
table.scale(1.2, 1.8)
# Цвета
for (i, j), cell in table.get_celld().items():
if i == 0:
cell.set_facecolor('#40466e')
cell.set_text_props(weight='bold', color='white')
else:
if i % 2 == 0:
cell.set_facecolor('#f2f2f2')
else:
cell.set_facecolor('#ffffff')
# Подписи
ax.text(0.1, 0.15, 'Подготовил: Начальник отдела пожарной безопасности ________ Петров П.П.', fontsize=9, transform=fig.transFigure)
ax.text(0.1, 0.08, 'Утверждаю: Главный инженер Калининской АЭС ________ Иванов И.И.', fontsize=9, transform=fig.transFigure)
plt.tight_layout()
plt.savefig('list4_measures_table.png', dpi=150, bbox_inches='tight')
plt.close()
print("✅ Лист 4 сохранён: list4_measures_table.png")
# =============================================
# ЗАПУСК ВСЕХ ФУНКЦИЙ
# =============================================
if __name__ == "__main__":
print("=" * 50)
print("Начинаю генерацию графической части курсовой работы...")
print("=" * 50)
draw_site_plan()
draw_dgs_plan()
draw_cable_tunnel()
draw_measures_table()
print("=" * 50)
print("✅ Готово! Созданы файлы:")
print(" - list1_site_plan.png")
print(" - list2_dgs_plan.png")
print(" - list3_cable_tunnel.png")
print(" - list4_measures_table.png")
print("=" * 50)
print("Сохраните эти файлы и вставьте в курсовую работу.")
Обновлено 14 дней назад Открыть в SourceCraft