2.5 排列操作
排列操作可细分为水平/垂直方向的最小、最大、中间、等距及窗口中点方式。同样,基于撤销与重做需求来处理其额外信息。
若要撤销排列操作,则需记住排列前各对象的位置,如其上端、左端、中心点值等信息,当然,记住其中一个信息即可。
是吗?如果是水平方向排列,记住左端当然可以撤销,但对于垂直方向而言,毫无意义。
因此,应该记下中心点值信处,这样,水平垂直方向都可以撤销。
嗨,中心点值是二维的,而上端或左端只是一维的,当然是不等价的。如果不记中心点值,同时记下左端与上端信息,效果才是一样一样的。
若要重做排列操作,呃,好象不需要处理什么,只需再排列一次即可。
基于此分析,应在开始排列之前记录所选对象的位置信息,故可在TCbwExecuteItem::SetOperateObject中处理,即直接加入流入XML节点处理
撤销时处理代码:
重做时代码:
运行查看结果,结果撤销时,导线出现小问题,即不能全部恢复原始状态。
下图显示的是具体运行效果,左图为原始状态,中图为水平左端对齐,右图为撤销结果。可以看到,撤销后,导线没有处理好。
看来还需要专门处理一下导线。
为了能撤销到原始状态,则需把相关的导线全部取出来。所幸软件是自己编的,要什么东东都可以很方便地取得。以前的函数AllConnectedObjects现在可又多了一个用处。
思路继续,在操作时,取得了相关的导线,然后将它们的信息保存,在撤销时,再取得现在的相关导线,全部删除,再恢复以前的相关导线,万事就OK了。
重做呢?哦,既然已回到起点,结果状态又是排列过程算出来的,就不用再处理了。
编程试试。
再运行检查,得到了期望的结果。
下图中,第一张图为原始图,全选后左对齐得到第二张图,再上对齐得到第三张图,撤销得到第四张图,再撤销得到第五张图。