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 c4d5d81f..1b017e3b 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/src/com/actionsoft/apps/coe/method/process/subprocess/graph/GraphLayout.java b/com.actionsoft.apps.coe.method.process.subprocess/src/com/actionsoft/apps/coe/method/process/subprocess/graph/GraphLayout.java index 5416e5a9..c94ddc5f 100644 --- a/com.actionsoft.apps.coe.method.process.subprocess/src/com/actionsoft/apps/coe/method/process/subprocess/graph/GraphLayout.java +++ b/com.actionsoft.apps.coe.method.process.subprocess/src/com/actionsoft/apps/coe/method/process/subprocess/graph/GraphLayout.java @@ -104,7 +104,7 @@ public class GraphLayout { if (i == 0) { position[i][0] = 100.0; position[i][1] = 100.0; - realTimeY = 100.0; + realTimeY = position[i][1]; isPosition[i] = true; if (existOutLink(i)){ // 如果存在后置节点 并且后置节点还未渲染 realTimeY = calculationRearNodePosition(i, realTimeY); @@ -115,6 +115,7 @@ public class GraphLayout { position[i][0] = 100.0; position[i][1] = realTimeY + shapeH + vertInterval; realTimeY = position[i][1]; + isPosition[i] = true; // 存在后置节点 if (existOutLink(i)){ realTimeY = calculationRearNodePosition(i, realTimeY); @@ -145,14 +146,16 @@ public class GraphLayout { private double calculationRearNodePosition(int nodeIndex, double realTimeY){ // 获取后置节点的索引 List rearNodeIndexSet = getRearNodeIndex(nodeIndex); + List unIsPosition = new ArrayList<>(); for (int i = 0; i < rearNodeIndexSet.size(); i++) { int rearNodeIndex = rearNodeIndexSet.get(i).intValue(); if (!isPosition[rearNodeIndex]) { + unIsPosition.add(rearNodeIndex); position[rearNodeIndex][0] = position[nodeIndex][0] + shapeW + horizInterval; // 上一个节点的x坐标 + 图形宽度 + 间隔 = 当前节点的x坐标 - if (i == 0) { + if (unIsPosition.size() == 1) { position[rearNodeIndex][1] = position[nodeIndex][1]; // 上一个节点的y坐标 与 第一个后置节点的y坐标一致 }else { - position[rearNodeIndex][1] = realTimeY + shapeH + i * vertInterval; // 非第一个后置节点的y坐标 = 上一个节点的y坐标 + 图形高度 + 后置节点索引 * 垂直间隔 + position[rearNodeIndex][1] = realTimeY + shapeH + (unIsPosition.size() - 1) * vertInterval; // 非第一个后置节点的y坐标 = 上一个节点的y坐标 + 图形高度 + 后置节点索引 * 垂直间隔 realTimeY = position[rearNodeIndex][1]; } isPosition[rearNodeIndex] = true; @@ -171,13 +174,13 @@ public class GraphLayout { * @return 节点坐标 */ public double[][] vertLayOut(){ - double realTimeX = 0.0; // 实时记录图形最高的Y + double realTimeX = 0.0; // 实时记录图形位置x for (int i = 0; i < nodeList.size(); i++) { // 第一个节点直接放到画布的左上角 if (i == 0) { position[i][0] = 100.0; position[i][1] = 100.0; - realTimeX = 100.0; + realTimeX = position[i][1]; isPosition[i] = true; if (existOutLink(i)){ // 如果存在后置节点 并且后置节点还未渲染 realTimeX = calculationRearNodePoiInVertLayOut(i, realTimeX); @@ -188,6 +191,7 @@ public class GraphLayout { position[i][0] = realTimeX + shapeW + horizInterval; position[i][1] = 100.0; realTimeX = position[i][0]; + isPosition[i] = true; if (existOutLink(i)){ realTimeX = calculationRearNodePoiInVertLayOut(i, realTimeX); } @@ -212,14 +216,16 @@ public class GraphLayout { private double calculationRearNodePoiInVertLayOut(int nodeIndex, double realTimeX){ // 获取后置节点的索引 List rearNodeIndexSet = getRearNodeIndex(nodeIndex); + List unIsPosition = new ArrayList<>(); for (int i = 0; i < rearNodeIndexSet.size(); i++) { int rearNodeIndex = rearNodeIndexSet.get(i).intValue(); if (!isPosition[rearNodeIndex]) { + unIsPosition.add(rearNodeIndex); position[rearNodeIndex][1] = position[nodeIndex][1] + shapeH + vertInterval; // 当前节点的坐标y = 前置节点的坐标y + 图形高度 + 垂直间隔 - if (i == 0){ + if (unIsPosition.size() == 1){ position[rearNodeIndex][0] = position[nodeIndex][0]; // 当前节点的如果为第一个后置节点 则 坐标x的值一致 }else { - position[rearNodeIndex][0] = position[nodeIndex][0] + shapeW + i * horizInterval; // 非第一个后置节点的坐标x = 上一个节点的坐标x + 图形宽度 + 第几个后置节点 * 横向间隔 + position[rearNodeIndex][0] = position[nodeIndex][0] + shapeW + (unIsPosition.size() - 1) * horizInterval; // 非第一个后置节点的坐标x = 上一个节点的坐标x + 图形宽度 + 第几个后置节点 * 横向间隔 realTimeX = position[rearNodeIndex][0]; } isPosition[rearNodeIndex] = true; 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 a01bb47c..db09bc02 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 @@ -127,17 +127,23 @@ public class GraphLinkerRender { */ 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) - ? new double[]{fromX + SubProcessConst.SUB_PROCESS_SHAPE_W, fromY + SubProcessConst.SUB_PROCESS_SHAPE_H / 2} - : new double[]{fromX, fromY + SubProcessConst.SUB_PROCESS_SHAPE_H / 2}; - double turnPointX = (fromX < toX) - ? fromX + SubProcessConst.SUB_PROCESS_SHAPE_W + (toX - (fromX + SubProcessConst.SUB_PROCESS_SHAPE_W)) / 2 - : toX + SubProcessConst.SUB_PROCESS_SHAPE_W + (fromX - (toX + SubProcessConst.SUB_PROCESS_SHAPE_W)) / 2; - double[] endPoint = (fromX < toX) - ? new double[]{toX, toY + SubProcessConst.SUB_PROCESS_SHAPE_H / 2} - : new double[]{toX + SubProcessConst.SUB_PROCESS_SHAPE_W, toY + SubProcessConst.SUB_PROCESS_SHAPE_H / 2}; - return new double[][]{startPoint, {turnPointX, toY + (SubProcessConst.SUB_PROCESS_SHAPE_H / 2)},{turnPointX, toY + (SubProcessConst.SUB_PROCESS_SHAPE_H / 2)}, endPoint}; + if (fromY == toY) { // 水平 方向上 存在从左向右直连的情况 但不存在从右向左直连的情况 水平方向上 从左向右 应是 右出 向上 左折 向下 + return fromX < toX + ? 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, fromY + SubProcessConst.SUB_PROCESS_SHAPE_H / 2}, + {toX, toY + SubProcessConst.SUB_PROCESS_SHAPE_H / 2} + } + : 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, fromY - 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 的情况 也就是不存在 连线从上到下直连的情况 double[] startPoint = new double[]{fromX + SubProcessConst.SUB_PROCESS_SHAPE_W, fromY + SubProcessConst.SUB_PROCESS_SHAPE_H / 2}; @@ -252,12 +258,23 @@ public class GraphLinkerRender { {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} - }; + return toY - fromY == SubProcessConst.SHAPE_VERT_INTERVAL + ? 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} + } + : 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 + SubProcessConst.SHAPE_HORIZ_INTERVAL / 2, fromY + SubProcessConst.SUB_PROCESS_SHAPE_H + SubProcessConst.SHAPE_VERT_INTERVAL / 2}, + {toX + 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}, diff --git a/com.actionsoft.apps.coe.method.process.subprocess/src/com/actionsoft/apps/coe/method/process/subprocess/graph/GraphNodeExpandHandle.java b/com.actionsoft.apps.coe.method.process.subprocess/src/com/actionsoft/apps/coe/method/process/subprocess/graph/GraphNodeExpandHandle.java index 3143de26..ec8fc35b 100644 --- a/com.actionsoft.apps.coe.method.process.subprocess/src/com/actionsoft/apps/coe/method/process/subprocess/graph/GraphNodeExpandHandle.java +++ b/com.actionsoft.apps.coe.method.process.subprocess/src/com/actionsoft/apps/coe/method/process/subprocess/graph/GraphNodeExpandHandle.java @@ -8,6 +8,7 @@ import com.actionsoft.apps.coe.pal.pal.repository.designer.relation.model.Design import com.actionsoft.apps.coe.pal.pal.repository.designer.util.ShapeUtil; import com.actionsoft.bpms.util.UtilString; import com.actionsoft.exception.AWSException; +import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import java.util.List; @@ -44,8 +45,9 @@ public class GraphNodeExpandHandle { if (relationModel == null) throw new AWSException("未找到当前节点所标识的子流程文件信息"); relationFileId = relationModel.getRelationFileId(); + // 先去与总图存储的同级目录下读取 如果为空说明是初次读取 childProcessDefine = apiManager.getChildProcessDefine(repositoryId, 0, relationFileId); - if (UtilString.isEmpty(childProcessDefine)){ // 初次展开 去源文件目录读取 + if (UtilString.isEmpty(childProcessDefine)){ // 初次读取 去源文件目录读取 BaseModel childProcessBaseModel = apiManager.getDefinition(relationFileId, 0); childProcessDefine = childProcessBaseModel.getDefinition(); } @@ -67,7 +69,7 @@ public class GraphNodeExpandHandle { * @return 范围标注框 * @throws AWSException */ - public JSONObject toAssembleScopeLimitationShape() throws AWSException{ + private JSONObject toAssembleScopeLimitationShape() throws AWSException{ JSONObject scopeLimitationShape = ShapeUtil.getProcessShapeDefinition(SubProcessConst.SUB_PROCESS_METHOD_ID, "展开范围标注"); JSONObject childProcessDefineObj = JSONObject.parseObject(childProcessDefine); JSONObject childProcessPage = childProcessDefineObj.getJSONObject("page"); @@ -110,8 +112,22 @@ public class GraphNodeExpandHandle { JSONObject elements = childProcessDefineObj.getJSONObject("elements"); for (String key : elements.keySet()) { JSONObject ele = elements.getJSONObject(key); - + JSONObject props = ele.getJSONObject("props"); + props.put("x", scopeShapeX + props.getDoubleValue("x")); + props.put("y", scopeShapeY + props.getDoubleValue("y")); + // 元素分为两类 一类为图形 一类为连线 + if ("linker".equals(ele.getString("name"))){ // 连线的话折点需要额外处理 + JSONArray points = ele.getJSONArray("points"); + for (Object p : points) { + JSONObject point = (JSONObject) p; + point.put("x", point.getDoubleValue("x") + scopeShapeX); + point.put("y", point.getDoubleValue("y") + scopeShapeY); + } + } } + + // 找到总图中 x坐标 >= 范围标注框x坐标 y坐标 >= 范围标注框y坐标 的图形 + } /**