Changeset 8556 for branches/HeuristicLab.EvolutionaryTracking/HeuristicLab.EvolutionaryTracking.Views/3.4/GenealogyGraphView.cs
- Timestamp:
- 09/03/12 15:09:52 (12 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/HeuristicLab.EvolutionaryTracking/HeuristicLab.EvolutionaryTracking.Views/3.4/GenealogyGraphView.cs
r8248 r8556 36 36 [Content(typeof(SymbolicExpressionTreeGenealogyGraph), IsDefaultView = true)] 37 37 public sealed partial class GenealogyGraphView : ItemView { 38 private VisualSymbolicExpressionTreeNode _selectedVisualSymbolicExpressionTreeNode; 39 38 private VisualSymbolicExpressionTreeNode selectedVisualSymbExprTreeNode; 40 39 public new SymbolicExpressionTreeGenealogyGraph Content { 41 40 get { return (SymbolicExpressionTreeGenealogyGraph)base.Content; } … … 43 42 } 44 43 44 private Dictionary<ISymbolicExpressionTreeNode, ISymbolicExpressionTreeNode> clonedNodeMap; 45 45 46 public GenealogyGraphView() 46 47 : base() { 47 48 InitializeComponent(); 49 // set button icons here because if set in the designer file, they get overwritten 50 this.moveModeButton.Image = Common.Resources.VSImageLibrary.Pointer; 51 this.zoomModeButton.Image = Common.Resources.VSImageLibrary.Zoom; 52 this.selectModeButton.Image = Common.Resources.VSImageLibrary.Object; 53 54 48 55 similarityModeSelector.SelectedIndex = 0; // set default similarity mode to "exact" 49 56 } … … 61 68 genealogyGraphChart.GenealogyGraphNodeClicked += graphChart_GenealogyGraphNodeClicked; 62 69 symbolicExpressionTreeChart.SymbolicExpressionTreeNodeClicked += treeChart_SymbolicExpressionTreeNodeClicked; 70 symbolicExpressionTreeChart.SymbolicExpressionTreeNodeDoubleClicked += treeChart_SymbolicExpressionTreeNodeDoubleClicked; 63 71 } 64 72 … … 71 79 else { 72 80 genealogyGraphChart.Graph = Content; 73 var best = Content. Values.OrderByDescending(x => genealogyGraphChart.Graph[x].Quality).First();74 symbolicExpressionTreeChart.Tree = (ISymbolicExpressionTree)best.Data;81 var best = Content.Nodes.OrderByDescending(x => x.Quality).First(); 82 symbolicExpressionTreeChart.Tree = best.SymbolicExpressionTree; 75 83 } 76 84 } … … 91 99 // the type hierarchy goes like this: VisualGenealogyGraphNode --> GenealogyGraphNode --> symbolicExpressionTree 92 100 var visualGenealogyGraphNode = (VisualGenealogyGraphNode)sender; 93 var genealogyGraphNode = ( GenealogyGraphNode)visualGenealogyGraphNode.Data;94 symbolicExpressionTreeChart.Tree = (ISymbolicExpressionTree)genealogyGraphNode.Data;101 var genealogyGraphNode = (SymbolicExpressionGenealogyGraphNode)visualGenealogyGraphNode.Data; 102 symbolicExpressionTreeChart.Tree = genealogyGraphNode.SymbolicExpressionTree; 95 103 // highlight the relevant fragment in the symbolic expression tree 96 if (_selectedVisualSymbolicExpressionTreeNode != null) { 104 selectedVisualSymbExprTreeNode = null; 105 106 bool repaint = false; 107 108 // paint highlighted nodes in symbolic expression tree 109 if (selectedVisualSymbExprTreeNode != null) { 110 // clear selected subtree from the tree chart 97 111 var nodes = symbolicExpressionTreeChart.Tree.IterateNodesBreadth() as List<ISymbolicExpressionTreeNode>; 98 var fragments = _selectedVisualSymbolicExpressionTreeNode.SymbolicExpressionTreeNode.IterateNodesBreadth() as List<ISymbolicExpressionTreeNode>; 99 int index = SymbolicExpressionTreeMatching.FindMatch(nodes, fragments, similarityModeSelector.SelectedIndex); 112 var fragments = selectedVisualSymbExprTreeNode.SymbolicExpressionTreeNode.IterateNodesBreadth() as List<ISymbolicExpressionTreeNode>; 113 var similarityLevel = Enum.GetNames(typeof(SimilarityLevel))[similarityModeSelector.SelectedIndex]; 114 int index = SymbolicExpressionTreeMatching.FindMatch(nodes, fragments, (SimilarityLevel)Enum.Parse(typeof(SimilarityLevel), similarityLevel)); 100 115 if (index != -1) { 101 _selectedVisualSymbolicExpressionTreeNode = symbolicExpressionTreeChart.GetVisualSymbolicExpressionTreeNode(nodes[index]); 102 var subtree = _selectedVisualSymbolicExpressionTreeNode.SymbolicExpressionTreeNode; 103 foreach (var visualNode in subtree.IterateNodesBreadth().Select(node => symbolicExpressionTreeChart.GetVisualSymbolicExpressionTreeNode(node))) { 104 visualNode.FillColor = Color.LightBlue; 105 } 106 symbolicExpressionTreeChart.Repaint(); 116 selectedVisualSymbExprTreeNode = symbolicExpressionTreeChart.GetVisualSymbolicExpressionTreeNode(nodes[index]); 117 var subtree = selectedVisualSymbExprTreeNode.SymbolicExpressionTreeNode; 118 foreach (var node in subtree.IterateNodesBreadth()) { 119 var visualNode = symbolicExpressionTreeChart.GetVisualSymbolicExpressionTreeNode(node); 120 visualNode.LineColor = Color.Blue; 121 } 122 repaint = true; 107 123 } 108 124 } 125 // paint graph nodes 109 126 var tree = symbolicExpressionTreeChart.Tree; 110 var graphNode = Content.GetNode(tree); 111 if (graphNode.InEdges != null) { 112 var arc = graphNode.InEdges.Find(a => a.Data != null); 113 if (arc != null) { 114 var fragment = arc.Data as ISymbolicExpressionTreeNode; 115 foreach (var node in fragment.IterateNodesBreadth()) { 116 var visualNode = symbolicExpressionTreeChart.GetVisualSymbolicExpressionTreeNode(node); 117 if (visualNode == null) 118 continue; 119 visualNode.FillColor = Color.LightGreen; 120 } 121 symbolicExpressionTreeChart.Repaint(); 122 } 123 } 127 var graphNodes = Content.Nodes.Where(n => n.SymbolicExpressionTree == tree).ToList(); 128 if (graphNodes.Count > 0) { 129 foreach (var graphNode in graphNodes) 130 if (graphNode != null && graphNode.InEdges != null) { 131 var arc = graphNode.InEdges.Find(a => a.Data != null); 132 if (arc != null) { 133 var fragment = arc.Data as ISymbolicExpressionTreeNode; 134 foreach (var node in fragment.IterateNodesBreadth()) { 135 var visualNode = symbolicExpressionTreeChart.GetVisualSymbolicExpressionTreeNode(node); 136 if (visualNode == null) 137 continue; 138 visualNode.LineColor = Color.Orange; 139 } 140 } 141 repaint = true; 142 } 143 } 144 if (repaint) 145 symbolicExpressionTreeChart.Repaint(); 124 146 } 125 147 … … 140 162 141 163 private void treeChart_SymbolicExpressionTreeNodeClicked(object sender, MouseEventArgs e) { 142 _selectedVisualSymbolicExpressionTreeNode = (VisualSymbolicExpressionTreeNode)sender; 143 // find out which individuals in the genealogy graph contain this specific subtree 144 var treeNode = _selectedVisualSymbolicExpressionTreeNode.SymbolicExpressionTreeNode; 164 ISymbolicExpressionTreeNode selectedSubtree = null; 165 genealogyGraphChart.Chart.UpdateEnabled = false; 166 switch (e.Button) { 167 case MouseButtons.Left: { 168 selectedVisualSymbExprTreeNode = (VisualSymbolicExpressionTreeNode)sender; 169 if (selectedVisualSymbExprTreeNode == null) return; 170 // find out which individuals in the genealogy graph contain this specific subtree 171 selectedSubtree = selectedVisualSymbExprTreeNode.SymbolicExpressionTreeNode; 172 // clone every node in the selected subtree so that edit operations are possible without altering the original subtree 173 // save the originalNode-->clone mapping to make it easier to work with subtrees 174 if (clonedNodeMap == null) 175 clonedNodeMap = new Dictionary<ISymbolicExpressionTreeNode, ISymbolicExpressionTreeNode>(); 176 clonedNodeMap.Clear(); 177 var selectedSubtreeClone = selectedSubtree.Clone() as SymbolicExpressionTreeNode; 178 var subtreeNodes = selectedSubtree.IterateNodesPostfix().ToList(); 179 var cloneNodes = selectedSubtreeClone.IterateNodesPostfix().ToList(); 180 for (int i = 0; i != subtreeNodes.Count; ++i) 181 clonedNodeMap.Add(subtreeNodes[i], cloneNodes[i]); 182 // highlight subtree nodes in the tree chart 183 foreach (var node in symbolicExpressionTreeChart.Tree.IterateNodesPostfix()) { 184 var visualNode = symbolicExpressionTreeChart.GetVisualSymbolicExpressionTreeNode(node); 185 visualNode.FillColor = Color.Transparent; 186 } 187 selectedSubtree.ForEachNodePostfix(node => { 188 symbolicExpressionTreeChart.GetVisualSymbolicExpressionTreeNode(node).FillColor = Color.LightBlue; 189 }); 190 } 191 break; 192 case MouseButtons.Middle: { 193 var visualNode = (VisualSymbolicExpressionTreeNode)sender; 194 if (selectedVisualSymbExprTreeNode == null || selectedVisualSymbExprTreeNode == visualNode) 195 return; 196 selectedSubtree = clonedNodeMap[selectedVisualSymbExprTreeNode.SymbolicExpressionTreeNode]; 197 var selectedNode = visualNode.SymbolicExpressionTreeNode; 198 if (clonedNodeMap.ContainsKey(selectedNode)) { 199 var selected = clonedNodeMap[selectedNode]; 200 var parent = selected.Parent; 201 parent.RemoveSubtree(parent.IndexOfSubtree(selected)); 202 selectedNode.ForEachNodePostfix(node => { 203 symbolicExpressionTreeChart.GetVisualSymbolicExpressionTreeNode(node).FillColor = Color.Transparent; 204 clonedNodeMap.Remove(node); 205 }); 206 } 207 } 208 break; 209 } 210 // update visual graph nodes that contain matching trees 145 211 Color[] colors = { Color.LightSkyBlue, Color.PaleGreen, Color.Tan }; 146 // update visual graph nodes147 genealogyGraphChart.Chart.UpdateEnabled = false;148 212 genealogyGraphChart.ClearAllNodes(); // clear node colors 149 // color each graph node according to the degree to which it matches the selected tree fragment 150 foreach (var i in Enum.GetValues(typeof(SymbolicExpressionTreeMatching.SimilarityLevel)).Cast<int>().Reverse()) { 151 var owners = genealogyGraphChart.Graph.TraceFragment(treeNode, i).ToList(); 152 if (owners.Any()) genealogyGraphChart.HighlightNodes(owners, colors[i]); // highlight matching individuals from the genealogy 213 // color each graph node according to the degree to which it matches the selected tree fragment 214 var similarityValues = Enum.GetValues(typeof(SimilarityLevel)).Cast<SimilarityLevel>().ToList(); 215 foreach (var graphNode in genealogyGraphChart.Graph.Nodes) { 216 var tree = graphNode.SymbolicExpressionTree; 217 for (int i = 0; i != similarityValues.Count; ++i) { 218 if (tree.ContainsFragment(selectedSubtree, similarityValues[i])) { 219 genealogyGraphChart.HighlightNode(graphNode, colors[i]); 220 break; 221 } 222 } 153 223 } 154 224 genealogyGraphChart.Chart.UpdateEnabled = true; 155 225 genealogyGraphChart.Chart.EnforceUpdate(); 156 157 // highlight subtree nodes in the tree chart158 foreach (var visualNode in symbolicExpressionTreeChart.Tree.IterateNodesPostfix().Select(node => symbolicExpressionTreeChart.GetVisualSymbolicExpressionTreeNode(node)))159 visualNode.FillColor = Color.Transparent;160 161 foreach (var visualNode in treeNode.IterateNodesPostfix().Select(node => symbolicExpressionTreeChart.GetVisualSymbolicExpressionTreeNode(node)))162 visualNode.FillColor = Color.LightBlue;163 164 226 // refresh the tree chart 165 227 symbolicExpressionTreeChart.Repaint(); 166 228 } 167 229 230 private void treeChart_SymbolicExpressionTreeNodeDoubleClicked(object sender, MouseEventArgs e) { 231 } 232 168 233 private void similarityModeSelector_SelectedIndexChanged(object sender, EventArgs e) { 169 if (_selectedVisualSymbolicExpressionTreeNode == null) return; 170 var treeNode = _selectedVisualSymbolicExpressionTreeNode.SymbolicExpressionTreeNode; 171 var owners = genealogyGraphChart.Graph.TraceFragment(treeNode, similarityModeSelector.SelectedIndex).ToList(); 234 if (selectedVisualSymbExprTreeNode == null) return; 235 var treeNode = selectedVisualSymbExprTreeNode.SymbolicExpressionTreeNode; 236 var similarityLevel = Enum.GetNames(typeof(SimilarityLevel))[similarityModeSelector.SelectedIndex]; 237 var owners = genealogyGraphChart.Graph.TraceFragment(treeNode, (SimilarityLevel)Enum.Parse(typeof(SimilarityLevel), similarityLevel)).ToList(); 172 238 if (owners.Any()) { 173 239 genealogyGraphChart.Chart.UpdateEnabled = false; 174 240 genealogyGraphChart.ClearAllNodes(); // clear the fill color of all nodes 175 genealogyGraphChart.HighlightNodes(owners, Color.LightSkyBlue); // highlight matching individuals from the genealogy 241 genealogyGraphChart.HighlightNodes(owners, Color.LightSkyBlue); 242 // highlight matching individuals from the genealogy 176 243 genealogyGraphChart.Chart.UpdateEnabled = true; 177 244 } 178 245 genealogyGraphChart.Chart.EnforceUpdate(); 179 246 // highlight subtree nodes in the tree chart 180 foreach (var visualNode in symbolicExpressionTreeChart.Tree.IterateNodesPostfix().Select(node => symbolicExpressionTreeChart.GetVisualSymbolicExpressionTreeNode(node))) 247 foreach (var node in symbolicExpressionTreeChart.Tree.IterateNodesPostfix()) { 248 var visualNode = symbolicExpressionTreeChart.GetVisualSymbolicExpressionTreeNode(node); 181 249 visualNode.FillColor = Color.Transparent; 182 foreach (var visualNode in treeNode.IterateNodesPostfix().Select(node => symbolicExpressionTreeChart.GetVisualSymbolicExpressionTreeNode(node))) 250 } 251 foreach (var node in treeNode.IterateNodesPostfix()) { 252 var visualNode = symbolicExpressionTreeChart.GetVisualSymbolicExpressionTreeNode(node); 183 253 visualNode.FillColor = Color.LightBlue; 254 } 184 255 } 185 256 #endregion
Note: See TracChangeset
for help on using the changeset viewer.