diff --git a/MainWindow.xaml b/MainWindow.xaml index ed51c4033958746219d228e5930129dac700a650..2bd60b0d59c15040c0c6b14d1cd0b551e53dad48 100644 --- a/MainWindow.xaml +++ b/MainWindow.xaml @@ -43,6 +43,18 @@ Grid.Row="0" Click="EdmondsKarpButton_Click"/> + <!-- Second Button in the first row --> + <Button x:Name="Export" + Content="Export" + Width="150" + Height="40" + VerticalAlignment="Center" + HorizontalAlignment="Left" + Margin="520,10,0,10" + Grid.Row="0" + Click="ExportToLatexButton_Click"/> + + <!-- Placeholder for graph viewer --> <Grid x:Name="GraphViewerGrid" Grid.Row="1"/> </Grid> diff --git a/MainWindow.xaml.cs b/MainWindow.xaml.cs index f3884fef038157edbe35e30efb5509da197caa2a..ac73aee1486b4d727d724ffb2144a1ae0480cf4e 100644 --- a/MainWindow.xaml.cs +++ b/MainWindow.xaml.cs @@ -271,5 +271,84 @@ namespace FlowForge edge.Attr.ArrowheadLength = 1; } } + + private string GenerateTikzCode() + { + if (_flowGraph == null) + throw new InvalidOperationException("Flow graph is not initialized."); + + var tikzBuilder = new System.Text.StringBuilder(); + tikzBuilder.AppendLine("\\documentclass[tikz,border=3mm]{standalone}"); + tikzBuilder.AppendLine("\\usetikzlibrary{arrows.meta,positioning}"); + tikzBuilder.AppendLine("\\usepackage{amsmath}"); + tikzBuilder.AppendLine("\\begin{document}"); + + // Global scaling and styles for smaller nodes and text + tikzBuilder.AppendLine("\\begin{tikzpicture}[scale=3,->,>=stealth,shorten >=1pt,auto,node distance=2cm,thick,"); + tikzBuilder.AppendLine("main node/.style={circle,draw,minimum size=1mm,inner sep=1pt,font=\\scriptsize}]"); + + // Nodes + foreach (var vertex in _flowGraph.Graph.Vertices) + { + if (_nodePositions.ContainsKey(vertex.Id)) + { + var position = _nodePositions[vertex.Id]; + // Format x and y as floating-point values with two decimal places + string formattedX = (position.X / 100.0).ToString("F2", System.Globalization.CultureInfo.InvariantCulture); + string formattedY = (position.Y / 100.0).ToString("F2", System.Globalization.CultureInfo.InvariantCulture); + + tikzBuilder.AppendLine($"\\node[main node] ({vertex.Id}) at ({formattedX},{formattedY}) {{{vertex.Id}}};"); + } + } + + // Edges + foreach (var edge in _flowGraph.GetEdges()) + { + string label = $"{edge.Residual}/{edge.MaxFlow}"; + tikzBuilder.AppendLine($"\\path[every node/.style={{font=\\tiny}}] ({edge.Source.Id}) edge node {{\\texttt{{{label}}}}} ({edge.Target.Id});"); + } + + tikzBuilder.AppendLine("\\end{tikzpicture}"); + tikzBuilder.AppendLine("\\end{document}"); + + return tikzBuilder.ToString(); + } + + + + + private void ExportGraphToLatex(string filePath) + { + try + { + string tikzCode = GenerateTikzCode(); + System.IO.File.WriteAllText(filePath, tikzCode); + MessageBox.Show($"Graph successfully exported to LaTeX file:\n{filePath}", "Export Successful", MessageBoxButton.OK, MessageBoxImage.Information); + } + catch (Exception ex) + { + MessageBox.Show($"Error exporting graph: {ex.Message}", "Export Failed", MessageBoxButton.OK, MessageBoxImage.Error); + } + } + + private void ExportToLatexButton_Click(object sender, RoutedEventArgs e) + { + if (_flowGraph == null) + { + MessageBox.Show("Please run an algorithm first.", "Error", MessageBoxButton.OK, MessageBoxImage.Error); + return; + } + + var saveFileDialog = new Microsoft.Win32.SaveFileDialog + { + Filter = "TeX files (*.tex)|*.tex", + Title = "Export Graph to LaTeX" + }; + + if (saveFileDialog.ShowDialog() == true) + { + ExportGraphToLatex(saveFileDialog.FileName); + } + } } } \ No newline at end of file