Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
03/05/14 14:48:13 (10 years ago)
Author:
pfleck
Message:
  • merged trunk
Location:
branches/DataPreprocessing
Files:
2 deleted
7 edited
4 copied

Legend:

Unmodified
Added
Removed
  • branches/DataPreprocessing

  • branches/DataPreprocessing/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.Views

  • branches/DataPreprocessing/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.Views/3.4/GraphicalSymbolicExpressionTreeView.Designer.cs

    r9456 r10538  
    1919 */
    2020#endregion
     21
     22using System.Drawing;
    2123
    2224namespace HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.Views {
     
    5961      this.symbolicExpressionTreeChart.Spacing = 5;
    6062      this.symbolicExpressionTreeChart.TabIndex = 0;
    61       this.symbolicExpressionTreeChart.TextFont = new System.Drawing.Font("Times New Roman", 6F);
     63      this.symbolicExpressionTreeChart.TextFont = new System.Drawing.Font(FontFamily.GenericSerif, 8F);
    6264      //
    6365      // FunctionTreeView
  • branches/DataPreprocessing/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.Views/3.4/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.Views-3.4.csproj

    r8600 r10538  
    110110  </ItemGroup>
    111111  <ItemGroup>
     112    <Compile Include="Formatters\SymbolicExpressionTreeLatexFormatter.cs" />
     113    <Compile Include="LayoutEngines\BoxesLayoutEngine.cs" />
     114    <Compile Include="LayoutEngines\ILayoutEngine.cs" />
     115    <Compile Include="LayoutEngines\LayoutNode.cs" />
     116    <Compile Include="LayoutEngines\ReingoldTilfordLayoutEngine.cs" />
    112117    <Compile Include="Plugin.cs" />
    113118    <Compile Include="SymbolicExpressionGrammarAllowedChildSymbolsControl.cs">
     
    160165      <DependentUpon>SymbolicExpressionView.cs</DependentUpon>
    161166    </Compile>
    162     <Compile Include="VisualSymbolicExpressionTreeNode.cs" />
    163     <Compile Include="VisualSymbolicExpressionTreeNodeConnection.cs" />
     167    <Compile Include="VisualTreeNode.cs" />
     168    <Compile Include="VisualTreeNodeConnection.cs" />
    164169  </ItemGroup>
    165170  <ItemGroup>
     
    267272    </BootstrapperPackage>
    268273  </ItemGroup>
     274  <ItemGroup />
    269275  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
    270276  <!-- To modify your build process, add your task inside one of the targets below and uncomment it.
     
    276282  -->
    277283  <PropertyGroup>
    278    <PreBuildEvent Condition=" '$(OS)' == 'Windows_NT' ">set Path=%25Path%25;$(ProjectDir);$(SolutionDir)
     284    <PreBuildEvent Condition=" '$(OS)' == 'Windows_NT' ">set Path=%25Path%25;$(ProjectDir);$(SolutionDir)
    279285set ProjectDir=$(ProjectDir)
    280286set SolutionDir=$(SolutionDir)
     
    283289call PreBuildEvent.cmd
    284290</PreBuildEvent>
    285 <PreBuildEvent Condition=" '$(OS)' != 'Windows_NT' ">
     291    <PreBuildEvent Condition=" '$(OS)' != 'Windows_NT' ">
    286292export ProjectDir=$(ProjectDir)
    287293export SolutionDir=$(SolutionDir)
  • branches/DataPreprocessing/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.Views/3.4/SymbolicExpressionGrammarAllowedChildSymbolsControl.cs

    r9456 r10538  
    2929using HeuristicLab.PluginInfrastructure;
    3030
     31using VisualSymbolicExpressionTreeNode = HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.Views.VisualTreeNode<HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.ISymbolicExpressionTreeNode>;
     32
    3133namespace HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.Views {
    3234  public sealed partial class SymbolicExpressionGrammarAllowedChildSymbolsControl : UserControl {
     
    162164
    163165      VisualSymbolicExpressionTreeNode clickedNode = (VisualSymbolicExpressionTreeNode)sender;
    164       var selectedNode = clickedNode.SymbolicExpressionTreeNode;
     166      var selectedNode = clickedNode.Content;
    165167      if (selectedNode.SubtreeCount == 0) {
    166168        if (!selectedSymbolicExpressionTreeNodes.Contains(selectedNode))
     
    207209        var visualNode = symbolicExpressionTreeChart.FindVisualSymbolicExpressionTreeNodeAt(coordinates.X, coordinates.Y);
    208210        if (visualNode != null) {
    209           var node = visualNode.SymbolicExpressionTreeNode;
     211          var node = visualNode.Content;
    210212          var root = symbolicExpressionTreeChart.Tree.Root;
    211213          if (node == root || node.Parent == root) e.Effect = DragDropEffects.Copy;
     
    223225      var symbols = data as IEnumerable<ISymbol>;
    224226
    225       if (node.SymbolicExpressionTreeNode == root) {
     227      if (node.Content == root) {
    226228        if (symbol != null)
    227229          Grammar.AddAllowedChildSymbol(root.Symbol, symbol);
     
    229231          foreach (var s in symbols) Grammar.AddAllowedChildSymbol(root.Symbol, s);
    230232      } else {
    231         int argumentIndex = root.IndexOfSubtree(node.SymbolicExpressionTreeNode);
     233        int argumentIndex = root.IndexOfSubtree(node.Content);
    232234        if (symbol != null)
    233235          Grammar.AddAllowedChildSymbol(root.Symbol, symbol, argumentIndex);
  • branches/DataPreprocessing/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.Views/3.4/SymbolicExpressionTreeChart.Designer.cs

    r9456 r10538  
    4949      this.contextMenuStrip = new System.Windows.Forms.ContextMenuStrip(this.components);
    5050      this.saveImageToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
     51      this.exportPgfLaTeXToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
     52      this.layoutEngineToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
     53      this.reingoldTilfordToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
     54      this.boxesToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
    5155      this.saveFileDialog = new System.Windows.Forms.SaveFileDialog();
    5256      this.contextMenuStrip.SuspendLayout();
     
    5660      //
    5761      this.contextMenuStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
    58             this.saveImageToolStripMenuItem});
     62            this.saveImageToolStripMenuItem,
     63            this.exportPgfLaTeXToolStripMenuItem,
     64            this.layoutEngineToolStripMenuItem});
    5965      this.contextMenuStrip.Name = "contextMenuStrip";
    60       this.contextMenuStrip.Size = new System.Drawing.Size(135, 26);
     66      this.contextMenuStrip.Size = new System.Drawing.Size(166, 70);
    6167      //
    6268      // saveImageToolStripMenuItem
    6369      //
    6470      this.saveImageToolStripMenuItem.Name = "saveImageToolStripMenuItem";
    65       this.saveImageToolStripMenuItem.Size = new System.Drawing.Size(134, 22);
     71      this.saveImageToolStripMenuItem.Size = new System.Drawing.Size(165, 22);
    6672      this.saveImageToolStripMenuItem.Text = "Save Image";
    6773      this.saveImageToolStripMenuItem.Click += new System.EventHandler(this.saveImageToolStripMenuItem_Click);
     74      //
     75      // exportPgfLaTeXToolStripMenuItem
     76      //
     77      this.exportPgfLaTeXToolStripMenuItem.Name = "exportPgfLaTeXToolStripMenuItem";
     78      this.exportPgfLaTeXToolStripMenuItem.Size = new System.Drawing.Size(165, 22);
     79      this.exportPgfLaTeXToolStripMenuItem.Text = "Export Pgf/LaTeX";
     80      this.exportPgfLaTeXToolStripMenuItem.Click += new System.EventHandler(this.exportLatexToolStripMenuItem_Click);
     81      //
     82      // layoutEngineToolStripMenuItem
     83      //
     84      this.layoutEngineToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
     85            this.reingoldTilfordToolStripMenuItem,
     86            this.boxesToolStripMenuItem});
     87      this.layoutEngineToolStripMenuItem.Name = "layoutEngineToolStripMenuItem";
     88      this.layoutEngineToolStripMenuItem.Size = new System.Drawing.Size(165, 22);
     89      this.layoutEngineToolStripMenuItem.Text = "Layout Engine:";
     90      //
     91      // reingoldTilfordToolStripMenuItem
     92      //
     93      this.reingoldTilfordToolStripMenuItem.Name = "reingoldTilfordToolStripMenuItem";
     94      this.reingoldTilfordToolStripMenuItem.Size = new System.Drawing.Size(161, 22);
     95      this.reingoldTilfordToolStripMenuItem.Text = "Reingold-Tilford";
     96      this.reingoldTilfordToolStripMenuItem.Click += new System.EventHandler(this.reingoldTilfordToolStripMenuItem_Click);
     97      //
     98      // boxesToolStripMenuItem
     99      //
     100      this.boxesToolStripMenuItem.Name = "boxesToolStripMenuItem";
     101      this.boxesToolStripMenuItem.Size = new System.Drawing.Size(161, 22);
     102      this.boxesToolStripMenuItem.Text = "Boxes";
     103      this.boxesToolStripMenuItem.Click += new System.EventHandler(this.boxesToolStripMenuItem_Click);
    68104      //
    69105      // saveFileDialog
    70106      //
    71107      this.saveFileDialog.Filter = "Bitmap (*.bmp)|*.bmp|EMF (*.emf)|*.emf";
    72       this.saveFileDialog.FilterIndex = 1;
     108      //
    73109      // SymbolicExpressionTreeChart
    74110      //
    75       this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
    76111      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit;
    77112      this.ContextMenuStrip = this.contextMenuStrip;
     113      this.DoubleBuffered = true;
    78114      this.Name = "SymbolicExpressionTreeChart";
    79115      this.MouseClick += new System.Windows.Forms.MouseEventHandler(this.SymbolicExpressionTreeChart_MouseClick);
     
    93129    protected System.Windows.Forms.ToolStripMenuItem saveImageToolStripMenuItem;
    94130    protected System.Windows.Forms.SaveFileDialog saveFileDialog;
     131    private System.Windows.Forms.ToolStripMenuItem exportPgfLaTeXToolStripMenuItem;
     132    private System.Windows.Forms.ToolStripMenuItem layoutEngineToolStripMenuItem;
     133    private System.Windows.Forms.ToolStripMenuItem reingoldTilfordToolStripMenuItem;
     134    private System.Windows.Forms.ToolStripMenuItem boxesToolStripMenuItem;
    95135  }
    96136}
  • branches/DataPreprocessing/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.Views/3.4/SymbolicExpressionTreeChart.cs

    r9587 r10538  
    2424using System.Drawing;
    2525using System.Drawing.Imaging;
     26using System.IO;
     27using System.Linq;
    2628using System.Windows.Forms;
     29using Point = System.Drawing.Point;
    2730
    2831namespace HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.Views {
    2932  public partial class SymbolicExpressionTreeChart : UserControl {
    3033    private Image image;
    31     private StringFormat stringFormat;
    32     private Dictionary<ISymbolicExpressionTreeNode, VisualSymbolicExpressionTreeNode> visualTreeNodes;
    33     private Dictionary<Tuple<ISymbolicExpressionTreeNode, ISymbolicExpressionTreeNode>, VisualSymbolicExpressionTreeNodeConnection> visualLines;
     34    private readonly StringFormat stringFormat;
     35    private Dictionary<ISymbolicExpressionTreeNode, VisualTreeNode<ISymbolicExpressionTreeNode>> visualTreeNodes;
     36    private Dictionary<Tuple<ISymbolicExpressionTreeNode, ISymbolicExpressionTreeNode>, VisualTreeNodeConnection> visualLines;
     37    private ILayoutEngine<ISymbolicExpressionTreeNode> layoutEngine;
     38
     39    private const int preferredNodeWidth = 70;
     40    private const int preferredNodeHeight = 46;
     41    private const int minHorizontalDistance = 30;
     42    private const int minVerticalDistance = 30;
    3443
    3544    public SymbolicExpressionTreeChart() {
     
    4049      this.lineColor = Color.Black;
    4150      this.backgroundColor = Color.White;
    42       this.textFont = new Font("Times New Roman", 8);
     51      this.textFont = new Font(FontFamily.GenericSansSerif, 12);
     52      layoutEngine = new ReingoldTilfordLayoutEngine<ISymbolicExpressionTreeNode> {
     53        NodeWidth = preferredNodeWidth,
     54        NodeHeight = preferredNodeHeight,
     55        HorizontalSpacing = minHorizontalDistance,
     56        VerticalSpacing = minVerticalDistance
     57      };
    4358    }
    4459
     
    4863    }
    4964
     65    #region Public properties
    5066    private int spacing;
    5167    public int Spacing {
     
    89105      set {
    90106        tree = value;
    91         visualTreeNodes = new Dictionary<ISymbolicExpressionTreeNode, VisualSymbolicExpressionTreeNode>();
    92         visualLines = new Dictionary<Tuple<ISymbolicExpressionTreeNode, ISymbolicExpressionTreeNode>, VisualSymbolicExpressionTreeNodeConnection>();
    93107        if (tree != null) {
    94           foreach (ISymbolicExpressionTreeNode node in tree.IterateNodesPrefix()) {
    95             visualTreeNodes[node] = new VisualSymbolicExpressionTreeNode(node);
    96             if (node.Parent != null) visualLines[Tuple.Create(node.Parent, node)] = new VisualSymbolicExpressionTreeNodeConnection();
    97           }
    98         }
    99         Repaint();
     108          //the layout engine needs to be initialized here so that the visualNodes and the visualLines dictionaries are populated
     109          InitializeLayout();
     110          Repaint();
     111        }
    100112      }
    101113    }
     
    106118      set { suspendRepaint = value; }
    107119    }
     120    #endregion
    108121
    109122    protected override void OnPaint(PaintEventArgs e) {
     
    140153    }
    141154
    142     public void RepaintNode(VisualSymbolicExpressionTreeNode visualNode) {
     155    public void RepaintNode(VisualTreeNode<ISymbolicExpressionTreeNode> visualNode) {
    143156      if (!suspendRepaint) {
    144157        using (var graphics = Graphics.FromImage(image)) {
     
    157170        graphics.Clear(backgroundColor);
    158171        if (tree != null) {
    159           int height = this.Height / tree.Depth;
    160           DrawFunctionTree(tree, graphics, 0, 0, this.Width, height);
    161         }
    162       }
    163     }
    164 
    165     public VisualSymbolicExpressionTreeNode GetVisualSymbolicExpressionTreeNode(ISymbolicExpressionTreeNode symbolicExpressionTreeNode) {
     172          DrawFunctionTree(tree, graphics, preferredNodeWidth, preferredNodeHeight, minHorizontalDistance, minVerticalDistance);
     173        }
     174      }
     175    }
     176
     177    public VisualTreeNode<ISymbolicExpressionTreeNode> GetVisualSymbolicExpressionTreeNode(ISymbolicExpressionTreeNode symbolicExpressionTreeNode) {
    166178      if (visualTreeNodes.ContainsKey(symbolicExpressionTreeNode))
    167179        return visualTreeNodes[symbolicExpressionTreeNode];
     
    169181    }
    170182
    171     public VisualSymbolicExpressionTreeNodeConnection GetVisualSymbolicExpressionTreeNodeConnection(ISymbolicExpressionTreeNode parent, ISymbolicExpressionTreeNode child) {
     183    public VisualTreeNodeConnection GetVisualSymbolicExpressionTreeNodeConnection(ISymbolicExpressionTreeNode parent, ISymbolicExpressionTreeNode child) {
    172184      if (child.Parent != parent) throw new ArgumentException();
    173185      var key = Tuple.Create(parent, child);
    174       VisualSymbolicExpressionTreeNodeConnection connection = null;
     186      VisualTreeNodeConnection connection = null;
    175187      visualLines.TryGetValue(key, out connection);
    176188      return connection;
     
    186198
    187199    protected virtual void SymbolicExpressionTreeChart_MouseClick(object sender, MouseEventArgs e) {
    188       VisualSymbolicExpressionTreeNode visualTreeNode = FindVisualSymbolicExpressionTreeNodeAt(e.X, e.Y);
     200      var visualTreeNode = FindVisualSymbolicExpressionTreeNodeAt(e.X, e.Y);
    189201      if (visualTreeNode != null) {
    190202        OnSymbolicExpressionTreeNodeClicked(visualTreeNode, e);
     
    200212
    201213    protected virtual void SymbolicExpressionTreeChart_MouseDoubleClick(object sender, MouseEventArgs e) {
    202       VisualSymbolicExpressionTreeNode visualTreeNode = FindVisualSymbolicExpressionTreeNodeAt(e.X, e.Y);
     214      VisualTreeNode<ISymbolicExpressionTreeNode> visualTreeNode = FindVisualSymbolicExpressionTreeNodeAt(e.X, e.Y);
    203215      if (visualTreeNode != null)
    204216        OnSymbolicExpressionTreeNodeDoubleClicked(visualTreeNode, e);
     
    212224    }
    213225
    214     private VisualSymbolicExpressionTreeNode draggedSymbolicExpressionTree;
     226    private VisualTreeNode<ISymbolicExpressionTreeNode> draggedSymbolicExpressionTree;
    215227    private MouseButtons dragButtons;
    216228    private void SymbolicExpressionTreeChart_MouseDown(object sender, MouseEventArgs e) {
     
    224236
    225237    private void SymbolicExpressionTreeChart_MouseMove(object sender, MouseEventArgs e) {
    226       VisualSymbolicExpressionTreeNode visualTreeNode = FindVisualSymbolicExpressionTreeNodeAt(e.X, e.Y);
     238
     239      VisualTreeNode<ISymbolicExpressionTreeNode> visualTreeNode = FindVisualSymbolicExpressionTreeNodeAt(e.X, e.Y);
    227240      if (draggedSymbolicExpressionTree != null &&
    228241        draggedSymbolicExpressionTree != visualTreeNode) {
     
    239252    }
    240253
    241     public VisualSymbolicExpressionTreeNode FindVisualSymbolicExpressionTreeNodeAt(int x, int y) {
     254    public VisualTreeNode<ISymbolicExpressionTreeNode> FindVisualSymbolicExpressionTreeNodeAt(int x, int y) {
    242255      foreach (var visualTreeNode in visualTreeNodes.Values) {
    243256        if (x >= visualTreeNode.X && x <= visualTreeNode.X + visualTreeNode.Width &&
     
    249262    #endregion
    250263
     264    private void InitializeLayout() {
     265      var actualRoot = tree.Root.SubtreeCount == 1 ? tree.Root.GetSubtree(0) : tree.Root;
     266      layoutEngine.Initialize(actualRoot, n => n.Subtrees, n => n.GetLength(), n => n.GetDepth());
     267      layoutEngine.CalculateLayout(this.Width, this.Height);
     268      var visualNodes = layoutEngine.GetVisualNodes().ToList();
     269      //populate the visual nodes and visual connections dictionaries
     270      visualTreeNodes = visualNodes.ToDictionary(x => x.Content, x => x);
     271      visualLines = new Dictionary<Tuple<ISymbolicExpressionTreeNode, ISymbolicExpressionTreeNode>, VisualTreeNodeConnection>();
     272      foreach (var node in visualNodes.Select(n => n.Content)) {
     273        foreach (var subtree in node.Subtrees) {
     274          visualLines.Add(new Tuple<ISymbolicExpressionTreeNode, ISymbolicExpressionTreeNode>(node, subtree), new VisualTreeNodeConnection());
     275        }
     276      }
     277    }
     278
    251279    #region methods for painting the symbolic expression tree
    252     private void DrawFunctionTree(ISymbolicExpressionTree tree, Graphics graphics, int x, int y, int width, int height) {
    253       DrawFunctionTree(tree.Root, graphics, x, y, width, height, Point.Empty);
    254     }
    255 
    256     /// <summary>
    257     ///
    258     /// </summary>
    259     /// <param name="functionTree"> function tree to draw</param>
    260     /// <param name="graphics">graphics object to draw on</param>
    261     /// <param name="x">x coordinate of drawing area</param>
    262     /// <param name="y">y coordinate of drawing area</param>
    263     /// <param name="width">width of drawing area</param>
    264     /// <param name="height">height of drawing area</param>
    265     private void DrawFunctionTree(ISymbolicExpressionTreeNode node, Graphics graphics, int x, int y, int width, int height, Point connectionPoint) {
    266       VisualSymbolicExpressionTreeNode visualTreeNode = visualTreeNodes[node];
    267       float center_x = x + width / 2;
    268       float center_y = y + height / 2;
    269       int actualWidth = width - spacing;
    270       int actualHeight = height - spacing;
    271 
    272       using (var textBrush = new SolidBrush(visualTreeNode.TextColor))
    273       using (var nodeLinePen = new Pen(visualTreeNode.LineColor))
    274       using (var nodeFillBrush = new SolidBrush(visualTreeNode.FillColor)) {
    275 
    276         //calculate size of node
    277         if (actualWidth >= visualTreeNode.PreferredWidth && actualHeight >= visualTreeNode.PreferredHeight) {
    278           visualTreeNode.Width = visualTreeNode.PreferredWidth;
    279           visualTreeNode.Height = visualTreeNode.PreferredHeight;
    280           visualTreeNode.X = (int)center_x - visualTreeNode.Width / 2;
    281           visualTreeNode.Y = (int)center_y - visualTreeNode.Height / 2;
    282         }
    283           //width too small to draw in desired sized
    284         else if (actualWidth < visualTreeNode.PreferredWidth && actualHeight >= visualTreeNode.PreferredHeight) {
    285           visualTreeNode.Width = actualWidth;
    286           visualTreeNode.Height = visualTreeNode.PreferredHeight;
    287           visualTreeNode.X = x;
    288           visualTreeNode.Y = (int)center_y - visualTreeNode.Height / 2;
    289         }
    290           //height too small to draw in desired sized
    291         else if (actualWidth >= visualTreeNode.PreferredWidth && actualHeight < visualTreeNode.PreferredHeight) {
    292           visualTreeNode.Width = visualTreeNode.PreferredWidth;
    293           visualTreeNode.Height = actualHeight;
    294           visualTreeNode.X = (int)center_x - visualTreeNode.Width / 2;
    295           visualTreeNode.Y = y;
    296         }
    297           //width and height too small to draw in desired size
    298         else {
    299           visualTreeNode.Width = actualWidth;
    300           visualTreeNode.Height = actualHeight;
    301           visualTreeNode.X = x;
    302           visualTreeNode.Y = y;
    303         }
    304 
    305         //draw terminal node
    306         if (node.SubtreeCount == 0) {
    307           graphics.FillRectangle(nodeFillBrush, visualTreeNode.X, visualTreeNode.Y, visualTreeNode.Width, visualTreeNode.Height);
    308           graphics.DrawRectangle(nodeLinePen, visualTreeNode.X, visualTreeNode.Y, visualTreeNode.Width, visualTreeNode.Height);
    309         } else {
    310           graphics.FillEllipse(nodeFillBrush, visualTreeNode.X, visualTreeNode.Y, visualTreeNode.Width, visualTreeNode.Height);
    311           graphics.DrawEllipse(nodeLinePen, visualTreeNode.X, visualTreeNode.Y, visualTreeNode.Width, visualTreeNode.Height);
    312         }
    313 
    314         //draw name of symbol
    315         var text = node.ToString();
    316         graphics.DrawString(text, textFont, textBrush, new RectangleF(visualTreeNode.X, visualTreeNode.Y, visualTreeNode.Width, visualTreeNode.Height), stringFormat);
    317 
    318         //draw connection line to parent node
    319         if (!connectionPoint.IsEmpty && node.Parent != null) {
    320           var visualLine = GetVisualSymbolicExpressionTreeNodeConnection(node.Parent, node);
    321           using (Pen linePen = new Pen(visualLine.LineColor)) {
     280    private void DrawFunctionTree(ISymbolicExpressionTree symbExprTree, Graphics graphics, int preferredWidth, int preferredHeight, int minHDistance, int minVDistance) {
     281      //we assume here that the layout has already been initialized when the symbolic expression tree was changed
     282      //recalculate layout according to new node widths and spacing
     283      layoutEngine.NodeWidth = preferredWidth;
     284      layoutEngine.NodeHeight = preferredHeight;
     285      layoutEngine.HorizontalSpacing = minHDistance;
     286      layoutEngine.VerticalSpacing = minVDistance;
     287      layoutEngine.CalculateLayout(Width, Height);
     288      var visualNodes = visualTreeNodes.Values;
     289      //draw nodes and connections
     290      foreach (var visualNode in visualNodes) {
     291        DrawTreeNode(visualNode);
     292        var node = visualNode.Content;
     293        foreach (var subtree in node.Subtrees) {
     294          var visualLine = GetVisualSymbolicExpressionTreeNodeConnection(node, subtree);
     295          var visualSubtree = visualTreeNodes[subtree];
     296          var origin = new Point(visualNode.X + visualNode.Width / 2, visualNode.Y + visualNode.Height);
     297          var target = new Point(visualSubtree.X + visualSubtree.Width / 2, visualSubtree.Y);
     298          graphics.Clip = new Region(new Rectangle(Math.Min(origin.X, target.X), origin.Y, Math.Max(origin.X, target.X), target.Y));
     299          using (var linePen = new Pen(visualLine.LineColor)) {
    322300            linePen.DashStyle = visualLine.DashStyle;
    323             graphics.DrawLine(linePen, connectionPoint, new Point(visualTreeNode.X + visualTreeNode.Width / 2, visualTreeNode.Y));
     301            graphics.DrawLine(linePen, origin, target);
    324302          }
    325303        }
    326 
    327         //calculate areas for the subtrees according to their tree size and call drawFunctionTree
    328         Point connectFrom = new Point(visualTreeNode.X + visualTreeNode.Width / 2, visualTreeNode.Y + visualTreeNode.Height);
    329         int[] xBoundaries = new int[node.SubtreeCount + 1];
    330         xBoundaries[0] = x;
    331         for (int i = 0; i < node.SubtreeCount; i++) {
    332           xBoundaries[i + 1] = (int)(xBoundaries[i] + (width * (double)node.GetSubtree(i).GetLength()) / (node.GetLength() - 1));
    333           DrawFunctionTree(node.GetSubtree(i), graphics, xBoundaries[i], y + height, xBoundaries[i + 1] - xBoundaries[i], height, connectFrom);
    334         }
    335       }
    336     }
    337 
    338     protected void DrawTreeNode(VisualSymbolicExpressionTreeNode visualTreeNode) {
     304      }
     305    }
     306
     307    protected void DrawTreeNode(VisualTreeNode<ISymbolicExpressionTreeNode> visualTreeNode) {
    339308      using (var graphics = Graphics.FromImage(image)) {
    340309        graphics.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High;
     
    344313    }
    345314
    346     protected void DrawTreeNode(Graphics graphics, VisualSymbolicExpressionTreeNode visualTreeNode) {
     315    protected void DrawTreeNode(Graphics graphics, VisualTreeNode<ISymbolicExpressionTreeNode> visualTreeNode) {
    347316      graphics.Clip = new Region(new Rectangle(visualTreeNode.X, visualTreeNode.Y, visualTreeNode.Width + 1, visualTreeNode.Height + 1));
    348317      graphics.Clear(backgroundColor);
    349       var node = visualTreeNode.SymbolicExpressionTreeNode;
     318      var node = visualTreeNode.Content;
    350319      using (var textBrush = new SolidBrush(visualTreeNode.TextColor))
    351320      using (var nodeLinePen = new Pen(visualTreeNode.LineColor))
     
    365334    }
    366335    #endregion
    367 
    368336    #region save image
    369337    private void saveImageToolStripMenuItem_Click(object sender, EventArgs e) {
     
    380348      Image image = new Bitmap(Width, Height);
    381349      using (Graphics g = Graphics.FromImage(image)) {
    382         int height = this.Height / tree.Depth;
    383         DrawFunctionTree(tree, g, 0, 0, Width, height);
     350        DrawFunctionTree(tree, g, preferredNodeWidth, preferredNodeHeight, minHorizontalDistance, minVerticalDistance);
    384351      }
    385352      image.Save(filename);
     
    391358        using (Metafile file = new Metafile(filename, g.GetHdc())) {
    392359          using (Graphics emfFile = Graphics.FromImage(file)) {
    393             int height = this.Height / tree.Depth;
    394             DrawFunctionTree(tree, emfFile, 0, 0, Width, height);
     360            DrawFunctionTree(tree, emfFile, preferredNodeWidth, preferredNodeHeight, minHorizontalDistance, minVerticalDistance);
    395361          }
    396362        }
     
    399365    }
    400366    #endregion
     367    #region export pgf/tikz
     368    private void exportLatexToolStripMenuItem_Click(object sender, EventArgs e) {
     369      using (var dialog = new SaveFileDialog { Filter = "Tex (*.tex)|*.tex" }) {
     370        if (dialog.ShowDialog() != DialogResult.OK) return;
     371        string filename = dialog.FileName.ToLower();
     372        var formatter = new SymbolicExpressionTreeLatexFormatter();
     373        File.WriteAllText(filename, formatter.Format(Tree));
     374      }
     375    }
     376    #endregion
     377
     378    private void reingoldTilfordToolStripMenuItem_Click(object sender, EventArgs e) {
     379      layoutEngine = new ReingoldTilfordLayoutEngine<ISymbolicExpressionTreeNode> {
     380        NodeWidth = preferredNodeWidth,
     381        NodeHeight = preferredNodeHeight,
     382        HorizontalSpacing = minHorizontalDistance,
     383        VerticalSpacing = minVerticalDistance
     384      };
     385      InitializeLayout();
     386      Repaint();
     387    }
     388
     389    private void boxesToolStripMenuItem_Click(object sender, EventArgs e) {
     390      layoutEngine = new BoxesLayoutEngine<ISymbolicExpressionTreeNode> {
     391        NodeWidth = preferredNodeWidth,
     392        NodeHeight = preferredNodeHeight,
     393        HorizontalSpacing = minHorizontalDistance,
     394        VerticalSpacing = minVerticalDistance
     395      };
     396      InitializeLayout();
     397      Repaint();
     398    }
    401399  }
    402400}
Note: See TracChangeset for help on using the changeset viewer.