コード例 #1
0
        public override void Run(Canguro.Controller.CommandServices services)
        {
            services.StoreSelection();
            LineElement line = services.GetLine();
            List <LinkedList <LineElement> > graph = GetLineGraph(services.Model);
            ItemList <Joint> joints = services.Model.JointList;
            int numJoints           = joints.Count;

            bool[] colors = new bool[numJoints];

            Stack <LineElement> stack = new Stack <LineElement>();

            stack.Push(line);
            while (stack.Count > 0)
            {
                line            = stack.Pop();
                line.IsSelected = true;
                if (!colors[line.I.Id])
                {
                    line.I.IsSelected = true;
                    visit(graph, (int)line.I.Id, stack, line);
                    colors[line.I.Id] = true;
                }
                if (!colors[line.J.Id])
                {
                    line.J.IsSelected = true;
                    visit(graph, (int)line.J.Id, stack, line);
                    colors[line.J.Id] = true;
                }
            }

            services.RestoreSelection();

            services.Model.ChangeSelection(null);
        }
コード例 #2
0
ファイル: SplitCmd.cs プロジェクト: yf2009017/Treu-Structure
        /// <summary>
        /// Executes the command.
        /// Gets a number of segments and divides all selected line elements in equal length segments.
        /// </summary>
        /// <param name="services">CommandServices object to interact with the system</param>
        public override void Run(Canguro.Controller.CommandServices services)
        {
            List <Item> selection = services.GetSelection();

            if (selection.Count == 0)
            {
                return;
            }

            List <LineElement> lineList = new List <LineElement>();

            foreach (Item item in selection)
            {
                if (item != null && item is LineElement)
                {
                    lineList.Add((LineElement)item);
                }
            }
            if (lineList.Count == 0)
            {
                lineList.Add(services.GetLine());
            }
            int parts = (int)services.GetSingle(Culture.Get("getSplitParts") + " [2-100]");

            parts = (parts < 2) ? 2 : (parts > 100) ? 100 : parts;

            foreach (LineElement line in lineList)
            {
                Joint ji   = line.I;
                Joint jj   = line.J;
                Joint last = jj;
                Microsoft.DirectX.Vector3 v = new Microsoft.DirectX.Vector3(jj.X - ji.X, jj.Y - ji.Y, jj.Z - ji.Z);
                v.Multiply(1.0f / parts);
                if (parts > 1 && v.LengthSq() > 0)
                {
                    LineElement newLine = line;
                    for (int i = 0; i < parts - 1; i++)
                    {
                        jj = new Joint(ji.X + v.X, ji.Y + v.Y, ji.Z + v.Z);
                        services.Model.JointList.Add(jj);
                        newLine = Split(newLine, jj, services.Model);
                        services.Model.LineList.Add(newLine);
                        ji = jj;
                    }
                }
            }
        }