Bakalarska_praca/Backend/arch.py
2025-04-05 23:39:54 +02:00

123 lines
5.3 KiB
Python

from pptx import Presentation
from pptx.util import Inches
from pptx.enum.shapes import MSO_AUTO_SHAPE_TYPE, MSO_CONNECTOR
# Vytvorenie novej prezentácie
prs = Presentation()
slide_layout = prs.slide_layouts[5] # Prázdny slide
slide = prs.slides.add_slide(slide_layout)
# Definícia základných rozmerov a pozícií
left_margin = Inches(0.5)
top_margin = Inches(0.5)
block_width = Inches(3)
block_height = Inches(0.7)
vertical_gap = Inches(0.3)
horizontal_gap = Inches(0.5)
# Blok 1: Používateľský dotaz & Chat history
box1 = slide.shapes.add_shape(MSO_AUTO_SHAPE_TYPE.RECTANGLE, left_margin, top_margin, block_width, block_height)
box1.text = "Používateľský dotaz\n& Chat history"
# Blok 2: ConversationalAgent (pod box1)
box2_top = top_margin + block_height + vertical_gap
box2 = slide.shapes.add_shape(MSO_AUTO_SHAPE_TYPE.RECTANGLE, left_margin, box2_top, block_width, block_height)
box2.text = "ConversationalAgent"
# Blok 3: Klasifikácia dotazu (pod box2)
box3_top = box2_top + block_height + vertical_gap
box3 = slide.shapes.add_shape(MSO_AUTO_SHAPE_TYPE.RECTANGLE, left_margin, box3_top, block_width, block_height)
box3.text = "Klasifikácia dotazu"
# Vetvenie: Pozície pre dve vetvy
branch_top = box3_top + block_height + vertical_gap
# Ľavá vetva ("Vyhladavanie")
left_branch_left = left_margin - Inches(0.2)
box4A = slide.shapes.add_shape(MSO_AUTO_SHAPE_TYPE.RECTANGLE, left_branch_left, branch_top, block_width, block_height)
box4A.text = "ElasticsearchStore\nvyhľadávanie"
box5A_top = branch_top + block_height + vertical_gap
box5A = slide.shapes.add_shape(MSO_AUTO_SHAPE_TYPE.RECTANGLE, left_branch_left, box5A_top, block_width, block_height)
box5A.text = "Generovanie\ndynamického promptu"
box6A_top = box5A_top + block_height + vertical_gap
box6A = slide.shapes.add_shape(MSO_AUTO_SHAPE_TYPE.RECTANGLE, left_branch_left, box6A_top, block_width, block_height)
box6A.text = "Generovanie\nodpovede"
box7A_top = box6A_top + block_height + vertical_gap
box7A = slide.shapes.add_shape(MSO_AUTO_SHAPE_TYPE.RECTANGLE, left_branch_left, box7A_top, block_width, block_height)
box7A.text = "Finalizácia\nodpovede"
# Pravá vetva ("Upresnenie")
right_branch_left = left_margin + block_width + horizontal_gap
box4B = slide.shapes.add_shape(MSO_AUTO_SHAPE_TYPE.RECTANGLE, right_branch_left, branch_top, block_width, block_height)
box4B.text = "Kombinovanie\ndotazov"
box5B_top = branch_top + block_height + vertical_gap
box5B = slide.shapes.add_shape(MSO_AUTO_SHAPE_TYPE.RECTANGLE, right_branch_left, box5B_top, block_width, block_height)
box5B.text = "ElasticsearchStore\nvyhľadávanie"
box6B_top = box5B_top + block_height + vertical_gap
box6B = slide.shapes.add_shape(MSO_AUTO_SHAPE_TYPE.RECTANGLE, right_branch_left, box6B_top, block_width, block_height)
box6B.text = "Generovanie\ndynamického promptu"
box7B_top = box6B_top + block_height + vertical_gap
box7B = slide.shapes.add_shape(MSO_AUTO_SHAPE_TYPE.RECTANGLE, right_branch_left, box7B_top, block_width, block_height)
box7B.text = "Generovanie\nodpovedí (2 modely)"
box8B_top = box7B_top + block_height + vertical_gap
box8B = slide.shapes.add_shape(MSO_AUTO_SHAPE_TYPE.RECTANGLE, right_branch_left, box8B_top, block_width, block_height)
box8B.text = "Validácia a\nhodnotenie odpovedí"
box9B_top = box8B_top + block_height + vertical_gap
box9B = slide.shapes.add_shape(MSO_AUTO_SHAPE_TYPE.RECTANGLE, right_branch_left, box9B_top, block_width, block_height)
box9B.text = "Finalizácia\nodpovede"
# Finálny blok: Výstup (zlúčenie vetiev)
final_box_top = max(box7A_top, box9B_top) + block_height + vertical_gap
final_box = slide.shapes.add_shape(MSO_AUTO_SHAPE_TYPE.RECTANGLE, left_margin, final_box_top, block_width, block_height)
final_box.text = "Výstup"
# Funkcia na pridanie šípok medzi blokmi
def add_connector(slide, start_shape, end_shape):
start_x = start_shape.left + start_shape.width / 2
start_y = start_shape.top + start_shape.height
end_x = end_shape.left + end_shape.width / 2
end_y = end_shape.top
connector = slide.shapes.add_connector(MSO_CONNECTOR.STRAIGHT, start_x, start_y, end_x, end_y)
# Aktuálna verzia python-pptx nepodporuje nastavenie šípky, preto tento riadok odstraňte alebo zakomentujte:
# connector.line.end_arrowhead.style = 1
return connector
# Prepojenie blokov
add_connector(slide, box1, box2)
add_connector(slide, box2, box3)
# Vetvenie z Box3 do oboch vetiev
mid_point = box3.left + box3.width / 2
branch_mid_y = box3.top + box3.height + vertical_gap/2
# Do ľavej vetvy:
connector_left = slide.shapes.add_connector(MSO_CONNECTOR.STRAIGHT, mid_point, box3.top + box3.height, left_branch_left + block_width/2, branch_mid_y)
# Do pravej vetvy:
connector_right = slide.shapes.add_connector(MSO_CONNECTOR.STRAIGHT, mid_point, box3.top + box3.height, right_branch_left + block_width/2, branch_mid_y)
# Prepojenie blokov v ľavej vetve
add_connector(slide, box4A, box5A)
add_connector(slide, box5A, box6A)
add_connector(slide, box6A, box7A)
# Prepojenie blokov v pravej vetve
add_connector(slide, box4B, box5B)
add_connector(slide, box5B, box6B)
add_connector(slide, box6B, box7B)
add_connector(slide, box7B, box8B)
add_connector(slide, box8B, box9B)
# Spojenie oboch vetiev s finálnym blokom "Výstup"
add_connector(slide, box7A, final_box)
add_connector(slide, box9B, final_box)
# Uloženie prezentácie
prs.save("architecture_diagram.pptx")