private ParallelCoordinatesVisualisation CreateConnection(GraphMetaData graph) { var connection = Instantiate(Template); connection.SetColors(_colorAnimation.CurrentValue); if (graph) { graph.Visualisation.DataField.SetColors(_colorAnimation.CurrentValue); } connection.transform.parent = transform; var orderedGraphs = Manager.GetAllGraphs() .Where(g => !g.Graph.IsNewlyCreated) .OrderBy(g => g.Layout.Position) .ToList(); var graphPos = orderedGraphs.IndexOf(graph); if (graphPos < 0 || graphPos >= _connections.Count) { _connections.Add(connection); } else { _connections.Insert(graphPos, connection); } return(connection); }
private void SyncConnectionCount(GraphMetaData graph) { var graphs = Manager.GetAllGraphs(); var graphCount = graphs.Count(g => !g.Graph.IsNewlyCreated); while (Mathf.Max(graphCount - 1, 0) < _connections.Count) { var connection = _connections.FirstOrDefault(c => c.Left == graph || c.Right == graph); if (!connection) { connection = _connections.Last(); } var adjustConnection = _connections.FirstOrDefault(c => c.Left == connection.Right); if (adjustConnection) { adjustConnection.Left = null; } RemoveConnection(connection); } while (graphCount > _connections.Count + 1) { CreateConnection(graph); } }
private int GetNearestLine(GraphMetaData left, GraphMetaData right) { var dataXL = left.Graph.DimX.ScaledData; var dataYL = left.Graph.DimY.ScaledData; var dataXR = right.Graph.DimX.ScaledData; var dataYR = right.Graph.DimY.ScaledData; Debug.Assert(dataXL.Length == dataYL.Length && dataYL.Length == dataYR.Length && dataYR.Length == dataXR.Length); var gapTotal = left.Graph.transform.InverseTransformPoint(right.Graph.transform.position).z; var gapPercent = left.Graph.transform.InverseTransformPoint(transform.position).z / gapTotal; var nearestLine = -1; var nearestDistance = -1f; for (var i = 0; i < left.Graph.DimX.ScaledData.Length; i++) { var startLocal = new Vector3(dataXL[i], dataYL[i], 0); var startWorld = left.Visualisation.transform.TransformPoint(startLocal); var endLocal = new Vector3(dataXR[i], dataYR[i], 0); var endWorld = right.Visualisation.transform.TransformPoint(endLocal); var linePos = startWorld + gapPercent * (endWorld - startWorld); var distance = Mathf.Abs((transform.position - linePos).magnitude); if (nearestDistance > distance || nearestDistance < 0) { nearestDistance = distance; nearestLine = i; } //Gizmos.color = Color.red; //Gizmos.DrawCube(linePos, Vector3.one * 0.01f); } //if (nearestLine >= 0) //{ // var startLocal = new Vector3(dataXL[nearestLine], dataYL[nearestLine], 0); // var startWorld = left.Visualisation.transform.TransformPoint(startLocal); // var endLocal = new Vector3(dataXR[nearestLine], dataYR[nearestLine], 0); // var endWorld = right.Visualisation.transform.TransformPoint(endLocal); // Gizmos.color = Color.blue; // Gizmos.DrawLine(startWorld, endWorld); //} return(nearestLine); }
public void Init(GraphMetaData gm) { transform.SetParent(gm.Visualisation.transform, false); _graph = gm.Graph; }
private void UpdateGraph(GraphMetaData g, RemoteGraph remoteGraph) { g.Graph.IsColored = remoteGraph.isColored; g.Graph.IsSelected = remoteGraph.isSelected; g.Graph.IsFlipped = remoteGraph.isFlipped; g.Graph.IsPickedUp = remoteGraph.isPickedUp; g.Graph.SortAxis = remoteGraph.sortAxis; if (remoteGraph.sortIncline) { GraphMetaData prevGraph = null; foreach (var graph in _graphManager.GetAllGraphs()) { if (graph.Layout.Position < g.Layout.Position) { if (prevGraph == null || prevGraph.Layout.Position < graph.Layout.Position) { prevGraph = graph; } } } if (prevGraph) { g.Graph.SortInclineHack(prevGraph.Graph.DimY, false); g.Graph.SortIncline = true; } } else if (remoteGraph.sortInclineNextHack) { GraphMetaData nextGraph = null; foreach (var graph in _graphManager.GetAllGraphs()) { if (graph.Layout.Position > g.Layout.Position) { if (nextGraph == null || nextGraph.Layout.Position > graph.Layout.Position) { nextGraph = graph; } } } if (nextGraph) { g.Graph.SortInclineHack(nextGraph.Graph.DimY, true); g.Graph.SortIncline = true; } } else { g.Graph.SortIncline = false; } if (g.Graph.IsNewlyCreated && !remoteGraph.isNewlyCreated) { _graphManager.RegisterGraph(g); } g.Graph.IsNewlyCreated = remoteGraph.isNewlyCreated; var color = new Color(); var colorSuccess = ColorUtility.TryParseHtmlString(remoteGraph.color, out color); if (colorSuccess) { g.Graph.Color = color; } else { Debug.LogWarning("Could not parse color " + remoteGraph.color); } if (String.IsNullOrEmpty(remoteGraph.dimX)) { g.Graph.DimX = null; } else if (g.Graph.DimX == null || g.Graph.DimX.Name != remoteGraph.dimX) { _dataProvider.LoadDataAsync(remoteGraph.dimX, (dim) => { g.Graph.DimX = dim; }); } if (String.IsNullOrEmpty(remoteGraph.dimY)) { g.Graph.DimY = null; } else if (g.Graph.DimY == null || g.Graph.DimY.Name != remoteGraph.dimY) { _dataProvider.LoadDataAsync(remoteGraph.dimY, (dim) => { g.Graph.DimY = dim; }); } g.Layout.Position = _surface.PixelToUnityCoord(remoteGraph.pos); g.Layout.Width = _surface.PixelToUnityCoord(remoteGraph.width); }