/// <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); }
/// <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; } } }