Exemple #1
0
        /// <summary>
        /// Marks all edges and nodes of this graph and returns the result as an array of Guids
        /// </summary>
        /// <returns>The resulting array of Guids</returns>
        public static Guid[] Mark(CurvesTopology top, Color verticesColor, Color edgesColor, Color diverterColor)
        {
            Guid[]           dots = new Guid[top.VertexLength + top.EdgeLength];
            ObjectAttributes oa   = RhinoDoc.ActiveDoc.CreateDefaultAttributes();

            oa.ColorSource = ObjectColorSource.ColorFromObject;

            //Graph vertices color
            for (int i = 0; i < top.VertexLength; i++)
            {
                if (top.NodeAt(i).IsDiverter)
                {
                    oa.ObjectColor = diverterColor;
                    dots[i]        = RhinoDoc.ActiveDoc.Objects.AddTextDot(i.ToString(), top.VertexAt(i), oa);
                    var sette = top.VertexAt(i);
                }
                else
                {
                    oa.ObjectColor = verticesColor;
                    dots[i]        = RhinoDoc.ActiveDoc.Objects.AddTextDot(i.ToString(), top.VertexAt(i), oa);
                    var sette = top.VertexAt(i);
                }
            }

            //Graph edges
            oa.ObjectColor = edgesColor;
            for (int i = 0; i < top.EdgeLength; i++)
            {
                var p = top.CurveAt(i).PointAtNormalizedLength(0.5);
                dots[i + top.VertexLength] = RhinoDoc.ActiveDoc.Objects.AddTextDot(i.ToString(), p, oa);
            }

            RhinoDoc.ActiveDoc.Views.Redraw();
            return(dots);
        }
        protected Curve ReconstructPath(int[] cameFrom, int currentNode, out int[] nodes, out int[] edges, out bool[] edgeDir, out double totLength)
        {
            List <int> resultNodes = new List <int>();

            for (; ;)
            {
                if (currentNode == -1)
                {
                    break;
                }
                resultNodes.Add(currentNode);
                currentNode = cameFrom[currentNode];
            }
            resultNodes.Reverse();
            nodes = resultNodes.ToArray();

            List <int>  resultEdges    = new List <int>();
            List <bool> resultEdgesRev = new List <bool>();

            currentNode = nodes[0];
            for (int i = 1; i < nodes.Length; i++)
            {
                int  nxt = nodes[i];
                bool rev;
                int  edgeIndex = FindEdge(currentNode, nxt, out rev);
                resultEdges.Add(edgeIndex);
                resultEdgesRev.Add(rev);
                currentNode = nxt;
            }
            edges   = resultEdges.ToArray();
            edgeDir = resultEdgesRev.ToArray();

            totLength = 0;
            PolyCurve pc = new PolyCurve();

            for (int i = 0; i < resultEdges.Count; i++)
            {
                int ei = resultEdges[i];
                var cv = m_top.CurveAt(ei).DuplicateCurve();
                if (!resultEdgesRev[i])
                {
                    cv.Reverse();
                }
                pc.Append(cv);
                totLength += m_dist[ei];
            }
            pc.RemoveNesting();

            return(pc);
        }