import cairosvg def generate_chart(members): # Размеры прямоугольника узла node_width = 150 node_height = 50 # Размеры холста canvas_width = 800 canvas_height = 600 # Радиус узла (для закругленных прямоугольников) node_radius = 10 # Цвета background_color = "#F2F2F2" node_color = "#EFEFEF" node_stroke_color = "#999" node_text_color = "#333" line_color = "#CCC" # Список строк SVG-кода svg_lines = [] # Рассчитываем координаты для каждого узла coordinates = {} for member in members: x = member['x'] y = member['y'] coordinates[member['id']] = {'x': x, 'y': y} # Рисуем линии-связи между узлами for member in members: member_id = member['id'] x1 = coordinates[member_id]['x'] * node_width + node_width / 2 y1 = coordinates[member_id]['y'] * node_height + node_height / 2 for parent_id in member['parents']: x2 = coordinates[parent_id]['x'] * node_width + node_width / 2 y2 = coordinates[parent_id]['y'] * node_height + node_height / 2 svg_lines.append(f'') # Рисуем узлы for member in members: member_id = member['id'] x = coordinates[member_id]['x'] * node_width y = coordinates[member_id]['y'] * node_height # Рисуем фоновый прямоугольник svg_lines.append(f'') # Добавляем текст в центр узла member_name = member['name'][:16] text_x = x + node_width / 2 text_y = y + node_height / 2 svg_lines.append(f'{member_name}') # Создаем SVG-код svg = f'' for line in svg_lines: svg += line svg += '' # конвертировать SVG в PNG png_data = cairosvg.svg2png(bytestring=svg_data) return png_data