/// <summary> /// 初始化Rects:ModefiedRects,OldRects,NewRects /// </summary> private void InitRects() { ///找到modifiedRects FindRectByLine findRect = new FindRectByLine(MovedLine); ///找到所有以line做边界线的矩形 ModefiedRects = TDPanel.DrawPanel.ListRect.SnipRectList.FindAll(findRect.BorderLinePredicate); ///初始化oldRects foreach (Rect rect in ModefiedRects) { OldRects.Add(new Rect(rect.X, rect.Y, rect.Width, rect.Height)); NewRects.Add(new Rect(rect.X, rect.Y, rect.Width, rect.Height)); } ///修改newRects数据 if (MovedLine.IsRow) { foreach (Rect rect in NewRects) { if (rect.Y < MovedLine.Position) ///rect在moveLine的上边 { rect.Height += (MovedToPos - MovedLine.Position); } else ///rect在moveLine的下边 { rect.Height += (MovedLine.Position - MovedToPos); rect.Y += (MovedToPos - MovedLine.Position); } } } else ///待移动的直线是纵向直线 { foreach (Rect rect in NewRects) { if (rect.X < MovedLine.Position) ///rect在moveLine的左边 { rect.Width += (MovedToPos - MovedLine.Position); } else ///rect在moveLine的右边 { rect.Width += (MovedLine.Position - MovedToPos); rect.X += (MovedToPos - MovedLine.Position); } } } }
/// <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; } } }