Changeset 11009 for branches/DataPreprocessing/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.Views/3.4/SymbolicExpressionTreeChart.cs
- Timestamp:
- 06/12/14 13:26:18 (10 years ago)
- Location:
- branches/DataPreprocessing
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/DataPreprocessing
- Property svn:ignore
-
old new 8 8 FxCopResults.txt 9 9 Google.ProtocolBuffers-0.9.1.dll 10 Google.ProtocolBuffers-2.4.1.473.dll 10 11 HeuristicLab 3.3.5.1.ReSharper.user 11 12 HeuristicLab 3.3.6.0.ReSharper.user 12 13 HeuristicLab.4.5.resharper.user 13 14 HeuristicLab.ExtLibs.6.0.ReSharper.user 15 HeuristicLab.Scripting.Development 14 16 HeuristicLab.resharper.user 15 17 ProtoGen.exe … … 17 19 _ReSharper.HeuristicLab 18 20 _ReSharper.HeuristicLab 3.3 21 _ReSharper.HeuristicLab 3.3 Tests 19 22 _ReSharper.HeuristicLab.ExtLibs 20 23 bin 21 24 protoc.exe 22 _ReSharper.HeuristicLab 3.3 Tests23 Google.ProtocolBuffers-2.4.1.473.dll
-
- Property svn:mergeinfo changed
- Property svn:ignore
-
branches/DataPreprocessing/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.Views
- Property svn:mergeinfo changed
/trunk/sources/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.Views merged: 10561,10565,10793,10799-10800,10862,10885,10953
- Property svn:mergeinfo changed
-
branches/DataPreprocessing/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.Views/3.4/SymbolicExpressionTreeChart.cs
r10538 r11009 27 27 using System.Linq; 28 28 using System.Windows.Forms; 29 using Point = System.Drawing.Point; 29 30 30 31 31 namespace HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.Views { … … 39 39 private const int preferredNodeWidth = 70; 40 40 private const int preferredNodeHeight = 46; 41 private constint minHorizontalDistance = 30;42 private constint minVerticalDistance = 30;41 private int minHorizontalDistance = 30; 42 private int minVerticalDistance = 30; 43 43 44 44 public SymbolicExpressionTreeChart() { … … 50 50 this.backgroundColor = Color.White; 51 51 this.textFont = new Font(FontFamily.GenericSansSerif, 12); 52 layoutEngine = new ReingoldTilfordLayoutEngine<ISymbolicExpressionTreeNode> { 52 53 visualTreeNodes = new Dictionary<ISymbolicExpressionTreeNode, VisualTreeNode<ISymbolicExpressionTreeNode>>(); 54 visualLines = new Dictionary<Tuple<ISymbolicExpressionTreeNode, ISymbolicExpressionTreeNode>, VisualTreeNodeConnection>(); 55 56 layoutEngine = new ReingoldTilfordLayoutEngine<ISymbolicExpressionTreeNode>(n => n.Subtrees) { 53 57 NodeWidth = preferredNodeWidth, 54 58 NodeHeight = preferredNodeHeight, … … 56 60 VerticalSpacing = minVerticalDistance 57 61 }; 62 reingoldTilfordToolStripMenuItem.Checked = true; 58 63 } 59 64 … … 105 110 set { 106 111 tree = value; 107 if (tree != null) { 108 //the layout engine needs to be initialized here so that the visualNodes and the visualLines dictionaries are populated 109 InitializeLayout(); 110 Repaint(); 111 } 112 Repaint(); 112 113 } 113 114 } … … 128 129 if (this.Width <= 1 || this.Height <= 1) 129 130 this.image = new Bitmap(1, 1); 130 else 131 else { 131 132 this.image = new Bitmap(Width, Height); 133 } 132 134 this.Repaint(); 135 } 136 137 public event EventHandler Repainted;//expose this event to notify the parent control that the tree was repainted 138 protected virtual void OnRepaint(object sender, EventArgs e) { 139 var repainted = Repainted; 140 if (repainted != null) { 141 repainted(sender, e); 142 } 133 143 } 134 144 … … 137 147 this.GenerateImage(); 138 148 this.Refresh(); 149 OnRepaint(this, EventArgs.Empty); 139 150 } 140 151 } … … 147 158 foreach (var visualNode in visualTreeNodes.Values) { 148 159 DrawTreeNode(graphics, visualNode); 160 if (visualNode.Content.SubtreeCount > 0) { 161 foreach (var visualSubtree in visualNode.Content.Subtrees.Select(s => visualTreeNodes[s])) { 162 DrawLine(graphics, visualNode, visualSubtree); 163 } 164 } 149 165 } 150 166 } … … 170 186 graphics.Clear(backgroundColor); 171 187 if (tree != null) { 172 DrawFunctionTree( tree,graphics, preferredNodeWidth, preferredNodeHeight, minHorizontalDistance, minVerticalDistance);188 DrawFunctionTree(graphics, preferredNodeWidth, preferredNodeHeight, minHorizontalDistance, minVerticalDistance); 173 189 } 174 190 } … … 236 252 237 253 private void SymbolicExpressionTreeChart_MouseMove(object sender, MouseEventArgs e) { 238 239 254 VisualTreeNode<ISymbolicExpressionTreeNode> visualTreeNode = FindVisualSymbolicExpressionTreeNodeAt(e.X, e.Y); 240 255 if (draggedSymbolicExpressionTree != null && … … 262 277 #endregion 263 278 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 279 private void CalculateLayout(int preferredWidth, int preferredHeight, int minHDistance, int minVDistance) { 280 layoutEngine.NodeWidth = preferredWidth; 281 layoutEngine.NodeHeight = preferredHeight; 282 layoutEngine.HorizontalSpacing = minHDistance; 283 layoutEngine.VerticalSpacing = minVDistance; 284 285 var actualRoot = tree.Root; 286 if (actualRoot.Symbol is ProgramRootSymbol && actualRoot.SubtreeCount == 1) { 287 actualRoot = tree.Root.GetSubtree(0); 288 } 289 290 var visualNodes = layoutEngine.CalculateLayout(actualRoot, Width, Height).ToList(); 270 291 visualTreeNodes = visualNodes.ToDictionary(x => x.Content, x => x); 271 292 visualLines = new Dictionary<Tuple<ISymbolicExpressionTreeNode, ISymbolicExpressionTreeNode>, VisualTreeNodeConnection>(); … … 278 299 279 300 #region methods for painting the symbolic expression tree 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); 301 private void DrawFunctionTree(Graphics graphics, int preferredWidth, int preferredHeight, int minHDistance, int minVDistance) { 302 CalculateLayout(preferredWidth, preferredHeight, minHDistance, minVDistance); 288 303 var visualNodes = visualTreeNodes.Values; 289 304 //draw nodes and connections 290 305 foreach (var visualNode in visualNodes) { 291 DrawTreeNode( visualNode);306 DrawTreeNode(graphics, visualNode); 292 307 var node = visualNode.Content; 293 308 foreach (var subtree in node.Subtrees) { … … 302 317 } 303 318 } 304 }305 }306 307 protected void DrawTreeNode(VisualTreeNode<ISymbolicExpressionTreeNode> visualTreeNode) {308 using (var graphics = Graphics.FromImage(image)) {309 graphics.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High;310 graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;311 DrawTreeNode(graphics, visualTreeNode);312 319 } 313 320 } … … 333 340 } 334 341 } 342 343 protected void DrawLine(Graphics graphics, VisualTreeNode<ISymbolicExpressionTreeNode> startNode, VisualTreeNode<ISymbolicExpressionTreeNode> endNode) { 344 var origin = new Point(startNode.X + startNode.Width / 2, startNode.Y + startNode.Height); 345 var target = new Point(endNode.X + endNode.Width / 2, endNode.Y); 346 graphics.Clip = new Region(new Rectangle(Math.Min(origin.X, target.X), origin.Y, Math.Max(origin.X, target.X), target.Y)); 347 var visualLine = GetVisualSymbolicExpressionTreeNodeConnection(startNode.Content, endNode.Content); 348 using (var linePen = new Pen(visualLine.LineColor)) { 349 linePen.DashStyle = visualLine.DashStyle; 350 graphics.DrawLine(linePen, origin, target); 351 } 352 } 335 353 #endregion 336 354 #region save image … … 348 366 Image image = new Bitmap(Width, Height); 349 367 using (Graphics g = Graphics.FromImage(image)) { 350 DrawFunctionTree( tree,g, preferredNodeWidth, preferredNodeHeight, minHorizontalDistance, minVerticalDistance);368 DrawFunctionTree(g, preferredNodeWidth, preferredNodeHeight, minHorizontalDistance, minVerticalDistance); 351 369 } 352 370 image.Save(filename); … … 358 376 using (Metafile file = new Metafile(filename, g.GetHdc())) { 359 377 using (Graphics emfFile = Graphics.FromImage(file)) { 360 DrawFunctionTree( tree,emfFile, preferredNodeWidth, preferredNodeHeight, minHorizontalDistance, minVerticalDistance);378 DrawFunctionTree(emfFile, preferredNodeWidth, preferredNodeHeight, minHorizontalDistance, minVerticalDistance); 361 379 } 362 380 } … … 377 395 378 396 private void reingoldTilfordToolStripMenuItem_Click(object sender, EventArgs e) { 379 layoutEngine = new ReingoldTilfordLayoutEngine<ISymbolicExpressionTreeNode> { 397 minHorizontalDistance = 30; 398 minVerticalDistance = 30; 399 layoutEngine = new ReingoldTilfordLayoutEngine<ISymbolicExpressionTreeNode>(n => n.Subtrees) { 380 400 NodeWidth = preferredNodeWidth, 381 401 NodeHeight = preferredNodeHeight, … … 383 403 VerticalSpacing = minVerticalDistance 384 404 }; 385 InitializeLayout(); 405 reingoldTilfordToolStripMenuItem.Checked = true; 406 boxesToolStripMenuItem.Checked = false; 386 407 Repaint(); 387 408 } 388 409 389 410 private void boxesToolStripMenuItem_Click(object sender, EventArgs e) { 390 layoutEngine = new BoxesLayoutEngine<ISymbolicExpressionTreeNode> { 411 minHorizontalDistance = 5; 412 minVerticalDistance = 5; 413 layoutEngine = new BoxesLayoutEngine<ISymbolicExpressionTreeNode>(n => n.Subtrees, n => n.GetLength(), n => n.GetDepth()) { 391 414 NodeWidth = preferredNodeWidth, 392 415 NodeHeight = preferredNodeHeight, … … 394 417 VerticalSpacing = minVerticalDistance 395 418 }; 396 InitializeLayout(); 419 reingoldTilfordToolStripMenuItem.Checked = false; 420 boxesToolStripMenuItem.Checked = true; 397 421 Repaint(); 398 422 }
Note: See TracChangeset
for help on using the changeset viewer.