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);
            }
        }
Beispiel #3
0
        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);
        }
Beispiel #4
0
 public void Init(GraphMetaData gm)
 {
     transform.SetParent(gm.Visualisation.transform, false);
     _graph = gm.Graph;
 }
Beispiel #5
0
        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);
        }