3.2 路径调整和合并
遍历多个设备的电源路径,通过设备的OID比对,将路径中的公共设备提取出来, 打上公共设备的标记,并且记录所属的路径id号,多个路径共享同一个公共设备的数据结构。此外,根据获取到的公共设备,调整电源路径的顺序,比如有3条设备电源路径,第一条和第三条有公共设备,第一条和第二条没有公共设备,那么将第二条和第三条路径调换位置,这样可以避免在绘制的时候第三条路径的连接线跨过第二条与第一条相连接,影响界面的美观。如果3条互相都有公共设备,那么根据公共设备的数目和位置来决定它们的顺序。
3.3 划分网络
如图4所示,规划绘图区域时,将画布划分为宽gridwidth、高gridheight的矩形状网格。图4中,以整个画布的左上角为原点,向右是X轴的正方向,向下是Y轴的正方向,将网格进行坐标划分。用(x,y)的坐标点来表示各个网格,下面步骤中所述的设备横坐标和纵坐标就是指设备的网格坐标。
3.4 设备位置计算
如果是单条路径,那么它的设备坐标顺序就应该是(0,0)、(1,0)、(2,0)、(3,0)、(4,0)、(5,0)、(5,1)、(4,1)、(3,1)、(2,1)、(1,1)、(0,1)等,在画布上呈S型布局。
这个算法只要遍历路径,把设备依次放入网格中就可以了。但要是多条路径的话,设备的位置算法要变得复杂,首先要对网格进行路径边界划分,确定每条路径大致布局;其次要处理公共设备的换行以及布局;最后遇到已经处理过的公共设备,要重新调整该路径的布局。每条路径都有一个初始边界,如画布分成6列,如果有2条路径的话,那么每条路径占3列,第一条路径的边界就是0,1,2,第二条路径的边界就是3,4,5。0是第一条路径的左边界,2是第一条路径的右边界,这个边界值其实就是网格的横坐标。假设第一条路径没有公共设备,那么它的前两行坐标顺序就是(0,0)→(1,0)→(2,0)→(2,1)→(1,1)→
(0,1)。路径中设备的初始走向是自左向右,换行后,就变成自右向左。
图5是计算单个设备位置的流程图。遍历路径中的设备,判断该设备与同路径中上一个设备是否连续,所谓的连续是指这两个设备的所属路径完全一致,在步骤二中每个设备都记录下了所属的路径id号,通过id号比对来判断是否连续。如果连续,再结合该设备的走向,如果是自左向右,则判断设备的横坐标是否大于右边界,如果大于则换行(纵坐标加1,横坐标不变),并将设备的走向改成自右向左;如果是自右向左,则判断设备的横坐标是否小于左边界,如果小于则换行,并将设备的走向改成自左向右;如果不需要换行,则纵坐标不变,横坐标根据设备走向加1或减1即可。
如果不连续,则强制换行,重新计算边界,将设备的多个路径id号取出来进行从小到大排序,最小的号赋值给begin,最大的号赋值给end,则新的边界如式(1)所示:
一条路径遍历后,设备会记下所在的坐标、走向以及设备在该路径下所处在行。当另一条路径再次遍历到该设备时,则比较当前路径所在行和设备所记录的行,如果路径的行大于设备的行,则修改设备的行,反之,修改路径的当前行。