From 5bd745ee3ede256992c4cd4d64104068b464d4f5 Mon Sep 17 00:00:00 2001 From: qinoy Date: Wed, 31 May 2023 14:18:02 +0800 Subject: [PATCH] =?UTF-8?q?=E7=AB=AF=E5=88=B0=E7=AB=AF=E5=8A=9F=E8=83=BD?= =?UTF-8?q?=20=E8=8A=82=E7=82=B9=E5=B1=95=E5=BC=80=20=E7=BA=B5=E5=90=91?= =?UTF-8?q?=E5=B8=83=E5=B1=80=E8=BF=9E=E7=BA=BF=E5=A4=84=E7=90=86=E9=83=A8?= =?UTF-8?q?=E5=88=86=E4=BB=A3=E7=A0=81=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...oft.apps.coe.method.process.subprocess.jar | Bin 47882 -> 49449 bytes .../graph/GraphNodeExpandHandle.java | 187 ++++++++++++++++-- 2 files changed, 174 insertions(+), 13 deletions(-) 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 5d564a2be4667c62beb0d105673a6d7b0b515acb..b6d36d70ab41a5c54e60567045cff5d5180c48d9 100644 GIT binary patch delta 9588 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 XJdj@}17uV6hqT_w0Nd2`Z>#?Uy%}L> delta 7981 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 scopeShapeX) { // 当前元素在待展开节点的右侧 - props.put("x", props.getDoubleValue("x") + scopeShapeW); + props.put("x", props.getDoubleValue("x") + scopeShapeW - SubProcessConst.SUB_PROCESS_SHAPE_W); } if (props.getDoubleValue("y") > scopeShapeY) { // 当前元素在待展开节点的下侧 - props.put("y", props.getDoubleValue("y") + scopeShapeH); + props.put("y", props.getDoubleValue("y") + scopeShapeH - SubProcessConst.SUB_PROCESS_SHAPE_H); } addEndToEndGraphElements(ele); @@ -414,29 +414,41 @@ class NodeExpandLinkerRender{ private List nodeIds; // 图形节点ID集合 private double[][] vertexPosition; // 所有节点的坐标 private NodeExpandAdjMatrix expandAdjMatrix; // 节点矩阵 + private JSONObject scopeLimitationShape; // 范围标注框 - public NodeExpandLinkerRender(double[][] vertexPosition, NodeExpandAdjMatrix expandAdjMatrix) { + public NodeExpandLinkerRender(double[][] vertexPosition, NodeExpandAdjMatrix expandAdjMatrix, JSONObject scopeLimitationShape) { this.nodeIds = expandAdjMatrix.getNodeIds(); this.vertexPosition = vertexPosition; this.expandAdjMatrix = expandAdjMatrix; + this.scopeLimitationShape = scopeLimitationShape; } /** * 根据连线方向 组装连线 * @param direction 连线方向 + * @param shapeId 当前待展开节点ID * @return */ - public JSONArray toAssembleLinker(String direction){ + public JSONArray toAssembleLinker(String direction, String shapeId){ JSONArray linkers = new JSONArray(); + int index = nodeIds.indexOf(shapeId); for (int i = 0; i < vertexPosition.length; i++) { + boolean currentExpandNodeIsStart = false; + if (i == index){ + currentExpandNodeIsStart = true; // 当前待展开的节点此处应是范围选择框为连线的出发点 + } double[] fromPoi = vertexPosition[i]; List nextNodeIndex = expandAdjMatrix.getNeighbors(i); if (nextNodeIndex.size() > 0){ // 说明当前节点有连线 for (Integer nodeIndex : nextNodeIndex) { + boolean currentExpandNodeIsEnd = false; + if (nodeIndex.intValue() == index){ + currentExpandNodeIsEnd = true; // 当前待展开的节点 此处应是范围选择框为连线的终点 + } double[] toPoi = vertexPosition[nodeIndex]; double[][] turnPoi = "horizontal".equals(direction) - ? calculationLinkerPointInHorizLayOut(fromPoi, toPoi) - : calculationLinkerPointInVertLayOut(fromPoi, toPoi); + ? calculationLinkerPointInHorizLayOut(fromPoi, toPoi, currentExpandNodeIsStart, currentExpandNodeIsEnd) + : calculationLinkerPointInVertLayOut(fromPoi, toPoi, currentExpandNodeIsStart, currentExpandNodeIsEnd); double[] angleArr = calculationLinkerAngle(fromPoi, toPoi, turnPoi[1], turnPoi[turnPoi.length - 2]); // 构建连线 JSONObject linkerObj = JSONObject.parseObject(LinkerDefConstant.linker); @@ -473,13 +485,162 @@ class NodeExpandLinkerRender{ return linkers; } - private double[][] calculationLinkerPointInVertLayOut(double[] fromPoi, double[] toPoi) { - return null; + private double[][] calculationLinkerPointInVertLayOut(double[] fromPoi, double[] toPoi, boolean currentExpandNodeIsStart, boolean currentExpandNodeIsEnd) { + double fromX = fromPoi[0],fromY = fromPoi[1],toX = toPoi[0],toY = toPoi[1]; + double scopeShapeW = scopeLimitationShape.getDoubleValue("w"), scopeShapeH = scopeLimitationShape.getDoubleValue("h"); + if (fromY == toY){ // 水平 分析可知 水平方向上不会出现 从左到右直连的情况 只有 右边节点右侧锚点出 向上走 左折 连到左侧节点上方锚点 + double[] startPoi = new double[]{fromX + (currentExpandNodeIsStart ? scopeShapeW : SubProcessConst.SUB_PROCESS_SHAPE_W), fromY + (currentExpandNodeIsStart ? scopeShapeH : SubProcessConst.SUB_PROCESS_SHAPE_H) / 2}; + double[] turnPoi1 = new double[]{fromX + (currentExpandNodeIsStart ? scopeShapeW : SubProcessConst.SUB_PROCESS_SHAPE_W) + SubProcessConst.SHAPE_HORIZ_INTERVAL / 2, fromY + (currentExpandNodeIsStart ? scopeShapeH : SubProcessConst.SUB_PROCESS_SHAPE_H) / 2}; + double[] turnPoi2 = new double[]{fromX + (currentExpandNodeIsStart ? scopeShapeW : SubProcessConst.SUB_PROCESS_SHAPE_W) + SubProcessConst.SHAPE_HORIZ_INTERVAL / 2, toY - SubProcessConst.SHAPE_VERT_INTERVAL / 2}; + double[] turnPoi3 = new double[]{toX + (currentExpandNodeIsEnd ? scopeShapeW : SubProcessConst.SUB_PROCESS_SHAPE_W) / 2, toY - SubProcessConst.SHAPE_VERT_INTERVAL / 2}; + double[] endPoi = new double[]{toX + (currentExpandNodeIsEnd ? scopeShapeW : 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 + (currentExpandNodeIsStart ? scopeShapeW : SubProcessConst.SUB_PROCESS_SHAPE_W) / 2, fromY + (currentExpandNodeIsStart ? scopeShapeH : SubProcessConst.SUB_PROCESS_SHAPE_H)} + : new double[]{fromX + (currentExpandNodeIsStart ? scopeShapeW : SubProcessConst.SUB_PROCESS_SHAPE_W), fromY + (currentExpandNodeIsStart ? scopeShapeH : SubProcessConst.SUB_PROCESS_SHAPE_H) / 2}; + double[] endPoi = new double[]{toX + (currentExpandNodeIsEnd ? scopeShapeW : SubProcessConst.SUB_PROCESS_SHAPE_W) / 2, toY}; + return fromY < toY + ? new double[][]{ + startPoi, + {fromX + (currentExpandNodeIsStart ? scopeShapeW : SubProcessConst.SUB_PROCESS_SHAPE_W) / 2, fromY + (currentExpandNodeIsStart ? scopeShapeH : SubProcessConst.SUB_PROCESS_SHAPE_H) + SubProcessConst.SHAPE_VERT_INTERVAL / 2}, + {toX + (currentExpandNodeIsEnd ? scopeShapeW : SubProcessConst.SUB_PROCESS_SHAPE_W) / 2, toY - SubProcessConst.SHAPE_VERT_INTERVAL / 2}, + endPoi} + : new double[][]{ + startPoi, + {fromX + ((currentExpandNodeIsStart || currentExpandNodeIsEnd) ? scopeShapeW : SubProcessConst.SUB_PROCESS_SHAPE_W) + SubProcessConst.SHAPE_HORIZ_INTERVAL / 2, fromY + (currentExpandNodeIsStart ? scopeShapeH : SubProcessConst.SUB_PROCESS_SHAPE_H) / 2}, + {fromX + ((currentExpandNodeIsStart || currentExpandNodeIsEnd) ? scopeShapeW : SubProcessConst.SUB_PROCESS_SHAPE_W) + SubProcessConst.SHAPE_HORIZ_INTERVAL / 2, toY - SubProcessConst.SHAPE_VERT_INTERVAL / 2}, + {toX + (currentExpandNodeIsEnd ? scopeShapeW : SubProcessConst.SUB_PROCESS_SHAPE_W) / 2, toY - SubProcessConst.SHAPE_VERT_INTERVAL / 2}, + endPoi}; + }else { // 分布在四个象限内 + if (fromX > toX && fromY > toY){ // 目标节点在第二象限 + return new double[][]{ + {fromX + (currentExpandNodeIsStart ? scopeShapeW : SubProcessConst.SUB_PROCESS_SHAPE_W), fromY + (currentExpandNodeIsStart ? scopeShapeH : SubProcessConst.SUB_PROCESS_SHAPE_H) / 2}, + {fromX + (currentExpandNodeIsStart ? scopeShapeW : SubProcessConst.SUB_PROCESS_SHAPE_W) + SubProcessConst.SHAPE_HORIZ_INTERVAL / 2, fromY + (currentExpandNodeIsStart ? scopeShapeH : SubProcessConst.SUB_PROCESS_SHAPE_H) / 2}, + {fromX + (currentExpandNodeIsStart ? scopeShapeW : SubProcessConst.SUB_PROCESS_SHAPE_W) + SubProcessConst.SHAPE_HORIZ_INTERVAL / 2, toY - SubProcessConst.SHAPE_VERT_INTERVAL / 2}, + {toX + (currentExpandNodeIsEnd ? scopeShapeW : SubProcessConst.SUB_PROCESS_SHAPE_W) / 2, toY - SubProcessConst.SHAPE_VERT_INTERVAL / 2}, + {toX + (currentExpandNodeIsEnd ? scopeShapeW : SubProcessConst.SUB_PROCESS_SHAPE_W) / 2, toY} + }; + }else if (fromX > toX && fromY < toY){ // 目标节点在第三象限 + return toY - fromY == SubProcessConst.SHAPE_VERT_INTERVAL + ? new double[][] + { + {fromX + (currentExpandNodeIsStart ? scopeShapeW : SubProcessConst.SUB_PROCESS_SHAPE_W) / 2, fromY + (currentExpandNodeIsStart ? scopeShapeH : SubProcessConst.SUB_PROCESS_SHAPE_H)}, + {fromX + (currentExpandNodeIsStart ? scopeShapeW : SubProcessConst.SUB_PROCESS_SHAPE_W) / 2, fromY + (currentExpandNodeIsStart ? scopeShapeH : SubProcessConst.SUB_PROCESS_SHAPE_H) + SubProcessConst.SHAPE_VERT_INTERVAL / 2}, + {toX + (currentExpandNodeIsEnd ? scopeShapeW : SubProcessConst.SUB_PROCESS_SHAPE_W) / 2, toY - SubProcessConst.SHAPE_VERT_INTERVAL / 2}, + {toX + (currentExpandNodeIsEnd ? scopeShapeW : SubProcessConst.SUB_PROCESS_SHAPE_W) / 2, toY} + } + : new double[][] + { + {fromX + (currentExpandNodeIsStart ? scopeShapeW : SubProcessConst.SUB_PROCESS_SHAPE_W) / 2, fromY + (currentExpandNodeIsStart ? scopeShapeH : SubProcessConst.SUB_PROCESS_SHAPE_H)}, + {fromX + (currentExpandNodeIsStart ? scopeShapeW : SubProcessConst.SUB_PROCESS_SHAPE_W) / 2, fromY + (currentExpandNodeIsStart ? scopeShapeH : SubProcessConst.SUB_PROCESS_SHAPE_H) + SubProcessConst.SHAPE_VERT_INTERVAL / 2}, + {toX + (currentExpandNodeIsEnd ? scopeShapeW : SubProcessConst.SUB_PROCESS_SHAPE_W) + SubProcessConst.SHAPE_HORIZ_INTERVAL / 2, fromY + (currentExpandNodeIsStart ? scopeShapeH : SubProcessConst.SUB_PROCESS_SHAPE_H) + SubProcessConst.SHAPE_VERT_INTERVAL / 2}, + {toX + (currentExpandNodeIsEnd ? scopeShapeW : SubProcessConst.SUB_PROCESS_SHAPE_W) + SubProcessConst.SHAPE_HORIZ_INTERVAL / 2, toY - SubProcessConst.SHAPE_VERT_INTERVAL / 2}, + {toX + (currentExpandNodeIsEnd ? scopeShapeW : SubProcessConst.SUB_PROCESS_SHAPE_W) / 2, toY - SubProcessConst.SHAPE_VERT_INTERVAL / 2}, + {toX + (currentExpandNodeIsEnd ? scopeShapeW : SubProcessConst.SUB_PROCESS_SHAPE_W) / 2, toY} + }; + }else if (fromX < toX && fromY < toY){ // 目标节点在第四象限 + return new double[][]{ + {fromX + (currentExpandNodeIsStart ? scopeShapeW : SubProcessConst.SUB_PROCESS_SHAPE_W) / 2, fromY + (currentExpandNodeIsStart ? scopeShapeH : SubProcessConst.SUB_PROCESS_SHAPE_H)}, + {fromX + (currentExpandNodeIsStart ? scopeShapeW : SubProcessConst.SUB_PROCESS_SHAPE_W) / 2, fromY + (currentExpandNodeIsStart ? scopeShapeH : SubProcessConst.SUB_PROCESS_SHAPE_H) + SubProcessConst.SHAPE_VERT_INTERVAL / 2}, + {toX + (currentExpandNodeIsEnd ? scopeShapeW : SubProcessConst.SUB_PROCESS_SHAPE_W) / 2, toY - SubProcessConst.SHAPE_VERT_INTERVAL / 2}, + {toX + (currentExpandNodeIsEnd ? scopeShapeW : SubProcessConst.SUB_PROCESS_SHAPE_W) / 2, toY} + }; + }else { + // fromX < toX && fromY > toY 目标节点在第一象限 分析可知 纵向排布的情况下 应该不会出现目标节点在第一象限的情况 + } + } + return new double[2][2]; } - private double[][] calculationLinkerPointInHorizLayOut(double[] fromPoi, double[] toPoi) { - - return null; + private double[][] calculationLinkerPointInHorizLayOut(double[] fromPoi, double[] toPoi, boolean currentExpandNodeIsStart, boolean currentExpandNodeIsEnd) { + double fromX = fromPoi[0],fromY = fromPoi[1],toX = toPoi[0],toY = toPoi[1]; + 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}; + double[] endPoint = new double[]{toX + SubProcessConst.SUB_PROCESS_SHAPE_W / 2, toY}; + return new double[][]{startPoint, + {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}, + endPoint}; + }else { + if (fromX < toX && fromY > toY){ // 目标节点在第一象限 + double[] startPoint = new double[]{fromX + SubProcessConst.SUB_PROCESS_SHAPE_W, fromY + SubProcessConst.SUB_PROCESS_SHAPE_H / 2}; + double turnPointX = fromX + SubProcessConst.SUB_PROCESS_SHAPE_W + SubProcessConst.SHAPE_HORIZ_INTERVAL / 2; + if (fromX + SubProcessConst.SUB_PROCESS_SHAPE_W + SubProcessConst.SHAPE_HORIZ_INTERVAL == toX){ // 相邻节点 存在两个折点 + double[] endPoint = new double[]{toX, toY + SubProcessConst.SUB_PROCESS_SHAPE_H / 2}; + return new double[][]{startPoint,{turnPointX, fromY + SubProcessConst.SUB_PROCESS_SHAPE_H / 2},{turnPointX, toY + SubProcessConst.SUB_PROCESS_SHAPE_H / 2}, endPoint}; + }else { // 不相邻节点 存在三个折点 + double[] endPoint = new double[]{toX + SubProcessConst.SUB_PROCESS_SHAPE_W / 2, toY}; + return new double[][]{ + startPoint, + {turnPointX, fromY + SubProcessConst.SUB_PROCESS_SHAPE_H / 2}, + {turnPointX, toY - SubProcessConst.SHAPE_VERT_INTERVAL / 2}, + {toX + SubProcessConst.SUB_PROCESS_SHAPE_W / 2, toY - SubProcessConst.SHAPE_VERT_INTERVAL / 2}, + endPoint + }; + } + }else if (fromX > toX && fromY > toY){ // 目标节点在第二象限 无论节点是否相邻 都按照三个折点走 + double[] startPoint = new double[]{fromX + SubProcessConst.SUB_PROCESS_SHAPE_W, fromY + SubProcessConst.SUB_PROCESS_SHAPE_H / 2}; + double[] endPoint = new double[]{toX + SubProcessConst.SUB_PROCESS_SHAPE_W / 2, toY}; + return new double[][]{ + startPoint, + {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}, + endPoint + }; + }else if (fromX > toX && fromY < toY){ // 目标节点在第三象限 + double[] startPoint = new double[]{fromX + SubProcessConst.SUB_PROCESS_SHAPE_W / 2, fromY + SubProcessConst.SUB_PROCESS_SHAPE_H}; + double[] endPoint = new double[]{toX + SubProcessConst.SUB_PROCESS_SHAPE_W / 2, toY}; + return new double[][]{ + startPoint, + {fromX + SubProcessConst.SUB_PROCESS_SHAPE_W / 2, toY - SubProcessConst.SHAPE_VERT_INTERVAL / 2}, + {toX + SubProcessConst.SUB_PROCESS_SHAPE_W / 2, toY - SubProcessConst.SHAPE_VERT_INTERVAL / 2}, + endPoint + }; + }else if (fromX < toX && fromY < toY){ // 目标节点在第四象限 + double[] startPoint = new double[]{fromX + SubProcessConst.SUB_PROCESS_SHAPE_W, fromY + SubProcessConst.SUB_PROCESS_SHAPE_H / 2}; + if (fromX + SubProcessConst.SUB_PROCESS_SHAPE_W + SubProcessConst.SHAPE_HORIZ_INTERVAL == toX){ // 相邻节点 存在两个折点 + double turnPointX = fromX + SubProcessConst.SUB_PROCESS_SHAPE_W + SubProcessConst.SHAPE_HORIZ_INTERVAL / 2; + double[] endPoint = new double[]{toX, toY + SubProcessConst.SUB_PROCESS_SHAPE_H / 2}; + return new double[][]{ + startPoint, + {turnPointX, fromY + SubProcessConst.SUB_PROCESS_SHAPE_H / 2}, + {turnPointX, toY + SubProcessConst.SUB_PROCESS_SHAPE_H / 2}, + endPoint + }; + }else { // 不相邻节点 存在三个折点 + double[] endPoint = new double[]{toX + SubProcessConst.SUB_PROCESS_SHAPE_W / 2, toY + SubProcessConst.SUB_PROCESS_SHAPE_H}; + return new double[][]{ + startPoint, + {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.SUB_PROCESS_SHAPE_H + SubProcessConst.SHAPE_VERT_INTERVAL / 2}, + endPoint + }; + } + } + } + return new double[2][2]; } /**