diff --git a/com.actionsoft.apps.coe.method.process.subprocess/lib/com.actionsoft.apps.coe.method.process.subprocess.jar b/com.actionsoft.apps.coe.method.process.subprocess/lib/com.actionsoft.apps.coe.method.process.subprocess.jar index ef064dc0..039cc274 100644 Binary files a/com.actionsoft.apps.coe.method.process.subprocess/lib/com.actionsoft.apps.coe.method.process.subprocess.jar and b/com.actionsoft.apps.coe.method.process.subprocess/lib/com.actionsoft.apps.coe.method.process.subprocess.jar differ diff --git a/com.actionsoft.apps.coe.method.process.subprocess/method/process.subprocess/diagram.schema.tpl b/com.actionsoft.apps.coe.method.process.subprocess/method/process.subprocess/diagram.schema.tpl index 719d1871..3c5a9967 100644 --- a/com.actionsoft.apps.coe.method.process.subprocess/method/process.subprocess/diagram.schema.tpl +++ b/com.actionsoft.apps.coe.method.process.subprocess/method/process.subprocess/diagram.schema.tpl @@ -546,7 +546,7 @@ path:[ {lineStyle:{lineWidth:0}, fillStyle:{type:"none"}, actions:{ref:"roundRectangle"}} ]}); -Schema.addShape({name:"scopeLimitation", title:"", text:"", category:"process_subprocess", groupName:"", props:{w:100, h:70},anchors:[], +Schema.addShape({name:"scopeLimitation", title:"", text:"", category:"process_subprocess", groupName:"", props:{w:100, h:70}, fillStyle:{type:"none"}, path:[ {lineStyle:{lineWidth:1, lineStyle:"dashed",lineColor:"184,184,184"}, actions:{ref:"roundRectangle"}}, diff --git a/com.actionsoft.apps.coe.method.process.subprocess/src/com/actionsoft/apps/coe/method/process/subprocess/graph/GraphLinkerRender.java b/com.actionsoft.apps.coe.method.process.subprocess/src/com/actionsoft/apps/coe/method/process/subprocess/graph/GraphLinkerRender.java index e04fd355..a01bb47c 100644 --- a/com.actionsoft.apps.coe.method.process.subprocess/src/com/actionsoft/apps/coe/method/process/subprocess/graph/GraphLinkerRender.java +++ b/com.actionsoft.apps.coe.method.process.subprocess/src/com/actionsoft/apps/coe/method/process/subprocess/graph/GraphLinkerRender.java @@ -33,9 +33,10 @@ public class GraphLinkerRender { /** * 组装连线 + * @param direction 排布方向 * @return */ - public JSONArray toAssembleLinker(){ + public JSONArray toAssembleLinker(String direction){ JSONArray linkers = new JSONArray(); for (int i = 0; i < vertexPosition.length; i++) { double[] fromPoi = vertexPosition[i]; @@ -43,7 +44,9 @@ public class GraphLinkerRender { if (nextNodeIndex.size() > 0){ // 说明当前节点有连线 for (Integer nodeIndex : nextNodeIndex) { double[] toPoi = vertexPosition[nodeIndex]; - double[][] turnPoi = calculationStartAndEndAndTurningPoint(fromPoi, toPoi); + double[][] turnPoi = "horizontal".equals(direction) + ? calculationLinkerPointInHorizLayOut(fromPoi, toPoi) + : calculationLinkerPointInVertLayOut(fromPoi, toPoi); double[] angleArr = calculationLinkerAngle(fromPoi, toPoi, turnPoi[1], turnPoi[turnPoi.length - 2]); // 构建连线 JSONObject linkerObj = JSONObject.parseObject(LinkerDefConstant.linker); @@ -122,7 +125,7 @@ public class GraphLinkerRender { * @param toPoi 终点图形节点坐标(左上角) * @return [0]: 连线起始点坐标、[1]: 连线第一个折点、[2]: 连线第二个折点、[3]: 连线第三个折点(如果存在)、[n]: 最后一个为连线终点 中间都为折点 */ - private double[][] calculationStartAndEndAndTurningPoint(double[] fromPoi, double[] toPoi){ + private double[][] calculationLinkerPointInHorizLayOut(double[] fromPoi, double[] toPoi){ double fromX = fromPoi[0],fromY = fromPoi[1],toX = toPoi[0],toY = toPoi[1]; if (fromY == toY) { // 水平 double[] startPoint = (fromX < toX) @@ -206,6 +209,69 @@ public class GraphLinkerRender { return new double[2][2]; } + /** + * 纵向排布 + * 计算两个坐标之间连线的起点、折点、终点 + * @param fromPoi 起始图形节点坐标(左上角) + * @param toPoi 终点图形节点坐标(左上角) + * @return [0]: 连线起始点坐标、[1]: 连线第一个折点、[2]: 连线第二个折点、[3]: 连线第三个折点(如果存在)、[n]: 最后一个为连线终点 中间都为折点 + */ + private double[][] calculationLinkerPointInVertLayOut(double[] fromPoi, double[] toPoi){ + double fromX = fromPoi[0],fromY = fromPoi[1],toX = toPoi[0],toY = toPoi[1]; + if (fromY == toY){ // 水平 分析可知 水平方向上不会出现 从左到右直连的情况 只有 右边节点右侧锚点出 向上走 左折 连到左侧节点上方锚点 + double[] startPoi = new double[]{fromX + SubProcessConst.SUB_PROCESS_SHAPE_W, fromY + SubProcessConst.SUB_PROCESS_SHAPE_H / 2}; + double[] turnPoi1 = new double[]{fromX + SubProcessConst.SUB_PROCESS_SHAPE_W + SubProcessConst.SHAPE_HORIZ_INTERVAL / 2, fromY + SubProcessConst.SUB_PROCESS_SHAPE_H / 2}; + double[] turnPoi2 = new double[]{fromX + SubProcessConst.SUB_PROCESS_SHAPE_W + SubProcessConst.SHAPE_HORIZ_INTERVAL / 2, fromY - SubProcessConst.SHAPE_VERT_INTERVAL / 2}; + double[] turnPoi3 = new double[]{toX + SubProcessConst.SUB_PROCESS_SHAPE_W / 2, toY - SubProcessConst.SHAPE_VERT_INTERVAL / 2}; + double[] endPoi = new double[]{toX + SubProcessConst.SUB_PROCESS_SHAPE_W / 2, toY}; + return new double[][]{startPoi, turnPoi1, turnPoi2, turnPoi3, endPoi}; + }else if (fromX == toX){ // 垂直 分析可知 垂直方向上应该不会有 toY < fromY 的情况 鉴于数据不确定性 先写上 + double[] startPoi = fromY < toY + ? new double[]{fromX + SubProcessConst.SUB_PROCESS_SHAPE_W / 2, fromY + SubProcessConst.SUB_PROCESS_SHAPE_H} + : new double[]{fromX + SubProcessConst.SUB_PROCESS_SHAPE_W, fromY + SubProcessConst.SUB_PROCESS_SHAPE_H / 2}; + double[] endPoi = new double[]{toX + SubProcessConst.SUB_PROCESS_SHAPE_W / 2, toY}; + return fromY < toY + ? new double[][]{ + startPoi, + {fromX + SubProcessConst.SUB_PROCESS_SHAPE_W / 2, fromY + SubProcessConst.SUB_PROCESS_SHAPE_H + SubProcessConst.SHAPE_VERT_INTERVAL / 2}, + {fromX + SubProcessConst.SUB_PROCESS_SHAPE_W / 2, fromY + SubProcessConst.SUB_PROCESS_SHAPE_H + SubProcessConst.SHAPE_VERT_INTERVAL / 2}, + endPoi} + : new double[][]{ + startPoi, + {fromX + SubProcessConst.SUB_PROCESS_SHAPE_W + SubProcessConst.SHAPE_HORIZ_INTERVAL / 2, fromY + SubProcessConst.SUB_PROCESS_SHAPE_H / 2}, + {fromX + SubProcessConst.SUB_PROCESS_SHAPE_W + SubProcessConst.SHAPE_HORIZ_INTERVAL / 2, toY - SubProcessConst.SHAPE_VERT_INTERVAL / 2}, + {toX + SubProcessConst.SUB_PROCESS_SHAPE_W / 2, toY - SubProcessConst.SHAPE_VERT_INTERVAL / 2}, + endPoi}; + }else { // 分布在四个象限内 + if (fromX > toX && fromY > toY){ // 目标节点在第二象限 + return new double[][]{ + {fromX + SubProcessConst.SUB_PROCESS_SHAPE_W, fromY + SubProcessConst.SUB_PROCESS_SHAPE_H / 2}, + {fromX + SubProcessConst.SUB_PROCESS_SHAPE_W + SubProcessConst.SHAPE_HORIZ_INTERVAL / 2, fromY + SubProcessConst.SUB_PROCESS_SHAPE_H / 2}, + {fromX + SubProcessConst.SUB_PROCESS_SHAPE_W + SubProcessConst.SHAPE_HORIZ_INTERVAL / 2, toY - SubProcessConst.SHAPE_VERT_INTERVAL / 2}, + {toX + SubProcessConst.SUB_PROCESS_SHAPE_W / 2, toY - SubProcessConst.SHAPE_VERT_INTERVAL / 2}, + {toX + SubProcessConst.SUB_PROCESS_SHAPE_W / 2, toY} + }; + }else if (fromX > toX && fromY < toY){ // 目标节点在第三象限 + return new double[][]{ + {fromX + SubProcessConst.SUB_PROCESS_SHAPE_W / 2, fromY + SubProcessConst.SUB_PROCESS_SHAPE_H}, + {fromX + SubProcessConst.SUB_PROCESS_SHAPE_W / 2, fromY + SubProcessConst.SUB_PROCESS_SHAPE_H + SubProcessConst.SHAPE_VERT_INTERVAL / 2}, + {toX + SubProcessConst.SUB_PROCESS_SHAPE_W / 2, toY - SubProcessConst.SHAPE_VERT_INTERVAL / 2}, + {toX + SubProcessConst.SUB_PROCESS_SHAPE_W / 2, toY} + }; + }else if (fromX < toX && fromY < toY){ // 目标节点在第四象限 + return new double[][]{ + {fromX + SubProcessConst.SUB_PROCESS_SHAPE_W / 2, fromY + SubProcessConst.SUB_PROCESS_SHAPE_H}, + {fromX + SubProcessConst.SUB_PROCESS_SHAPE_W / 2, fromY + SubProcessConst.SUB_PROCESS_SHAPE_H + SubProcessConst.SHAPE_VERT_INTERVAL / 2}, + {toX + SubProcessConst.SUB_PROCESS_SHAPE_W / 2, toY - SubProcessConst.SHAPE_VERT_INTERVAL / 2}, + {toX + SubProcessConst.SUB_PROCESS_SHAPE_W / 2, toY} + }; + }else { + // fromX < toX && fromY > toY 目标节点在第一象限 分析可知 纵向排布的情况下 应该不会出现目标节点在第一象限的情况 + } + } + return new double[2][2]; + } + /** * 判断连线是否与矩形节点相交 diff --git a/com.actionsoft.apps.coe.method.process.subprocess/src/com/actionsoft/apps/coe/method/process/subprocess/web/SubProcessWeb.java b/com.actionsoft.apps.coe.method.process.subprocess/src/com/actionsoft/apps/coe/method/process/subprocess/web/SubProcessWeb.java index f412dca1..ef04e294 100644 --- a/com.actionsoft.apps.coe.method.process.subprocess/src/com/actionsoft/apps/coe/method/process/subprocess/web/SubProcessWeb.java +++ b/com.actionsoft.apps.coe.method.process.subprocess/src/com/actionsoft/apps/coe/method/process/subprocess/web/SubProcessWeb.java @@ -265,11 +265,11 @@ public class SubProcessWeb extends ActionWeb { // 获取节点分布 GraphLayout graphLayout = new GraphLayout(graphAdjMatrix.getAdjMatrix(), nodeList); - double[][] position = graphLayout.horizLayOut(); + double[][] position = "horizontal".equals(direction) ? graphLayout.horizLayOut() : graphLayout.vertLayOut(); // 组装连线 GraphLinkerRender linkerRender = new GraphLinkerRender(nodeList, position, graphAdjMatrix); - JSONArray linkers = linkerRender.toAssembleLinker(); + JSONArray linkers = linkerRender.toAssembleLinker(direction); // 新建模型 PALRepositoryModel parentModel = PALRepositoryCache.getCache().get(locationId);