Пример #1
0
        /// <summary>
        /// 将一个矩形分割成多个矩形
        /// </summary>
        /// <param name="isRow">按横分割</param>
        /// <param name="partNum">分割矩形数</param>
        /// <returns></returns>
        internal List <Rect> PartRect(Rect rect, bool isRow, int partNum)
        {
            List <Rect> newRects = new List <Rect>();

            if (isRow)///按行分割
            {
                int step = rect.Height / partNum;
                int i    = 0;
                for (; i < partNum - 1; i++)
                {
                    newRects.Add(
                        TDPanel.CreateRect(
                            rect.X,
                            rect.Y + i * step,
                            rect.Width,
                            step,
                            rect));
                }
                ///最后一个特殊处理,以解决可能不能整除的问题
                newRects.Add(
                    TDPanel.CreateRect(
                        rect.X,
                        rect.Y + i * step,
                        rect.Width,
                        rect.Height - i * step,
                        rect));
            }
            else
            {
                int i    = 0;
                int step = rect.Width / partNum;
                for (; i < partNum - 1; i++)
                {
                    newRects.Add(
                        TDPanel.CreateRect(
                            rect.X + i * step,
                            rect.Y,
                            step,
                            rect.Height,
                            rect));
                }
                ///最后一个特殊处理,以解决可能不能整除的问题
                newRects.Add(
                    TDPanel.CreateRect(
                        rect.X + i * step,
                        rect.Y,
                        rect.Width - i * step,
                        rect.Height,
                        rect));
            }
            SnipRectList.AddRange(newRects);
            return(newRects);
        }
Пример #2
0
        /// <summary>
        /// 添加直线
        /// </summary>
        /// <param name="command"></param>
        public void AddLine(AddLineCommand command)
        {
            if (!command.IsRedo)///是第一次插入直线,而非重做撤销的插入直线命令
            {
                ///找到所有被分割之矩形
                PartitionLine  line        = new PartitionLine(command.Start, command.End, command.Position, command.IsRow);
                FindRectByLine findRect    = new FindRectByLine(line);
                List <Rect>    resultRects = SnipRectList.FindAll(findRect.PartitionLinePredicate);

                for (int i = 0; i < resultRects.Count; i++)
                {
                    command.RemovedRects.Add(resultRects[i]);
                    if (line.IsRow)
                    {
                        Rect firstRect = TDPanel.CreateRect(
                            resultRects[i].X,
                            resultRects[i].Y,
                            resultRects[i].Width,
                            line.Position - resultRects[i].Y
                            );
                        Rect secondRect = TDPanel.CreateRect(
                            resultRects[i].X,
                            line.Position,
                            resultRects[i].Width,
                            resultRects[i].Y + resultRects[i].Height - line.Position
                            );

                        // SnipRectList.Remove(resultRects[i]);
                        resultRects[i].IsDeleted = true;

                        SnipRectList.Add(firstRect);
                        SnipRectList.Add(secondRect);
                        command.AddedRects.Add(firstRect);
                        command.AddedRects.Add(secondRect);
                    }
                    else
                    {
                        Rect firstRect = TDPanel.CreateRect(
                            resultRects[i].X,
                            resultRects[i].Y,
                            line.Position - resultRects[i].X,
                            resultRects[i].Height
                            );
                        Rect secondRect = TDPanel.CreateRect(
                            line.Position,
                            resultRects[i].Y,
                            resultRects[i].Width + resultRects[i].X - line.Position,
                            resultRects[i].Height
                            );
                        //SnipRectList.Remove(resultRects[i]);
                        resultRects[i].IsDeleted = true;
                        SnipRectList.Add(firstRect);
                        SnipRectList.Add(secondRect);
                        command.AddedRects.Add(firstRect);
                        command.AddedRects.Add(secondRect);
                    }
                }
                command.IsRedo = true;
            }
            else///重做撤销的插入直线命令
            {
                foreach (Rect rect in command.RemovedRects)
                {
                    rect.IsDeleted = true;
                }

                foreach (Rect rect in command.AddedRects)
                {
                    rect.IsDeleted = false;
                }
            }
        }