端到端功能 节点与连线布局调整
This commit is contained in:
parent
8d2f525b8b
commit
a9ea67c8da
Binary file not shown.
@ -104,7 +104,7 @@ public class GraphLayout {
|
|||||||
if (i == 0) {
|
if (i == 0) {
|
||||||
position[i][0] = 100.0;
|
position[i][0] = 100.0;
|
||||||
position[i][1] = 100.0;
|
position[i][1] = 100.0;
|
||||||
realTimeY = 100.0;
|
realTimeY = position[i][1];
|
||||||
isPosition[i] = true;
|
isPosition[i] = true;
|
||||||
if (existOutLink(i)){ // 如果存在后置节点 并且后置节点还未渲染
|
if (existOutLink(i)){ // 如果存在后置节点 并且后置节点还未渲染
|
||||||
realTimeY = calculationRearNodePosition(i, realTimeY);
|
realTimeY = calculationRearNodePosition(i, realTimeY);
|
||||||
@ -115,6 +115,7 @@ public class GraphLayout {
|
|||||||
position[i][0] = 100.0;
|
position[i][0] = 100.0;
|
||||||
position[i][1] = realTimeY + shapeH + vertInterval;
|
position[i][1] = realTimeY + shapeH + vertInterval;
|
||||||
realTimeY = position[i][1];
|
realTimeY = position[i][1];
|
||||||
|
isPosition[i] = true;
|
||||||
// 存在后置节点
|
// 存在后置节点
|
||||||
if (existOutLink(i)){
|
if (existOutLink(i)){
|
||||||
realTimeY = calculationRearNodePosition(i, realTimeY);
|
realTimeY = calculationRearNodePosition(i, realTimeY);
|
||||||
@ -145,14 +146,16 @@ public class GraphLayout {
|
|||||||
private double calculationRearNodePosition(int nodeIndex, double realTimeY){
|
private double calculationRearNodePosition(int nodeIndex, double realTimeY){
|
||||||
// 获取后置节点的索引
|
// 获取后置节点的索引
|
||||||
List<Integer> rearNodeIndexSet = getRearNodeIndex(nodeIndex);
|
List<Integer> rearNodeIndexSet = getRearNodeIndex(nodeIndex);
|
||||||
|
List<Integer> unIsPosition = new ArrayList<>();
|
||||||
for (int i = 0; i < rearNodeIndexSet.size(); i++) {
|
for (int i = 0; i < rearNodeIndexSet.size(); i++) {
|
||||||
int rearNodeIndex = rearNodeIndexSet.get(i).intValue();
|
int rearNodeIndex = rearNodeIndexSet.get(i).intValue();
|
||||||
if (!isPosition[rearNodeIndex]) {
|
if (!isPosition[rearNodeIndex]) {
|
||||||
|
unIsPosition.add(rearNodeIndex);
|
||||||
position[rearNodeIndex][0] = position[nodeIndex][0] + shapeW + horizInterval; // 上一个节点的x坐标 + 图形宽度 + 间隔 = 当前节点的x坐标
|
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坐标一致
|
position[rearNodeIndex][1] = position[nodeIndex][1]; // 上一个节点的y坐标 与 第一个后置节点的y坐标一致
|
||||||
}else {
|
}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];
|
realTimeY = position[rearNodeIndex][1];
|
||||||
}
|
}
|
||||||
isPosition[rearNodeIndex] = true;
|
isPosition[rearNodeIndex] = true;
|
||||||
@ -171,13 +174,13 @@ public class GraphLayout {
|
|||||||
* @return 节点坐标
|
* @return 节点坐标
|
||||||
*/
|
*/
|
||||||
public double[][] vertLayOut(){
|
public double[][] vertLayOut(){
|
||||||
double realTimeX = 0.0; // 实时记录图形最高的Y
|
double realTimeX = 0.0; // 实时记录图形位置x
|
||||||
for (int i = 0; i < nodeList.size(); i++) {
|
for (int i = 0; i < nodeList.size(); i++) {
|
||||||
// 第一个节点直接放到画布的左上角
|
// 第一个节点直接放到画布的左上角
|
||||||
if (i == 0) {
|
if (i == 0) {
|
||||||
position[i][0] = 100.0;
|
position[i][0] = 100.0;
|
||||||
position[i][1] = 100.0;
|
position[i][1] = 100.0;
|
||||||
realTimeX = 100.0;
|
realTimeX = position[i][1];
|
||||||
isPosition[i] = true;
|
isPosition[i] = true;
|
||||||
if (existOutLink(i)){ // 如果存在后置节点 并且后置节点还未渲染
|
if (existOutLink(i)){ // 如果存在后置节点 并且后置节点还未渲染
|
||||||
realTimeX = calculationRearNodePoiInVertLayOut(i, realTimeX);
|
realTimeX = calculationRearNodePoiInVertLayOut(i, realTimeX);
|
||||||
@ -188,6 +191,7 @@ public class GraphLayout {
|
|||||||
position[i][0] = realTimeX + shapeW + horizInterval;
|
position[i][0] = realTimeX + shapeW + horizInterval;
|
||||||
position[i][1] = 100.0;
|
position[i][1] = 100.0;
|
||||||
realTimeX = position[i][0];
|
realTimeX = position[i][0];
|
||||||
|
isPosition[i] = true;
|
||||||
if (existOutLink(i)){
|
if (existOutLink(i)){
|
||||||
realTimeX = calculationRearNodePoiInVertLayOut(i, realTimeX);
|
realTimeX = calculationRearNodePoiInVertLayOut(i, realTimeX);
|
||||||
}
|
}
|
||||||
@ -212,14 +216,16 @@ public class GraphLayout {
|
|||||||
private double calculationRearNodePoiInVertLayOut(int nodeIndex, double realTimeX){
|
private double calculationRearNodePoiInVertLayOut(int nodeIndex, double realTimeX){
|
||||||
// 获取后置节点的索引
|
// 获取后置节点的索引
|
||||||
List<Integer> rearNodeIndexSet = getRearNodeIndex(nodeIndex);
|
List<Integer> rearNodeIndexSet = getRearNodeIndex(nodeIndex);
|
||||||
|
List<Integer> unIsPosition = new ArrayList<>();
|
||||||
for (int i = 0; i < rearNodeIndexSet.size(); i++) {
|
for (int i = 0; i < rearNodeIndexSet.size(); i++) {
|
||||||
int rearNodeIndex = rearNodeIndexSet.get(i).intValue();
|
int rearNodeIndex = rearNodeIndexSet.get(i).intValue();
|
||||||
if (!isPosition[rearNodeIndex]) {
|
if (!isPosition[rearNodeIndex]) {
|
||||||
|
unIsPosition.add(rearNodeIndex);
|
||||||
position[rearNodeIndex][1] = position[nodeIndex][1] + shapeH + vertInterval; // 当前节点的坐标y = 前置节点的坐标y + 图形高度 + 垂直间隔
|
position[rearNodeIndex][1] = position[nodeIndex][1] + shapeH + vertInterval; // 当前节点的坐标y = 前置节点的坐标y + 图形高度 + 垂直间隔
|
||||||
if (i == 0){
|
if (unIsPosition.size() == 1){
|
||||||
position[rearNodeIndex][0] = position[nodeIndex][0]; // 当前节点的如果为第一个后置节点 则 坐标x的值一致
|
position[rearNodeIndex][0] = position[nodeIndex][0]; // 当前节点的如果为第一个后置节点 则 坐标x的值一致
|
||||||
}else {
|
}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];
|
realTimeX = position[rearNodeIndex][0];
|
||||||
}
|
}
|
||||||
isPosition[rearNodeIndex] = true;
|
isPosition[rearNodeIndex] = true;
|
||||||
|
|||||||
@ -127,17 +127,23 @@ public class GraphLinkerRender {
|
|||||||
*/
|
*/
|
||||||
private double[][] calculationLinkerPointInHorizLayOut(double[] fromPoi, double[] toPoi){
|
private double[][] calculationLinkerPointInHorizLayOut(double[] fromPoi, double[] toPoi){
|
||||||
double fromX = fromPoi[0],fromY = fromPoi[1],toX = toPoi[0],toY = toPoi[1];
|
double fromX = fromPoi[0],fromY = fromPoi[1],toX = toPoi[0],toY = toPoi[1];
|
||||||
if (fromY == toY) { // 水平
|
if (fromY == toY) { // 水平 方向上 存在从左向右直连的情况 但不存在从右向左直连的情况 水平方向上 从左向右 应是 右出 向上 左折 向下
|
||||||
double[] startPoint = (fromX < toX)
|
return fromX < toX
|
||||||
? new double[]{fromX + SubProcessConst.SUB_PROCESS_SHAPE_W, fromY + SubProcessConst.SUB_PROCESS_SHAPE_H / 2}
|
? new double[][]
|
||||||
: new double[]{fromX, fromY + SubProcessConst.SUB_PROCESS_SHAPE_H / 2};
|
{
|
||||||
double turnPointX = (fromX < toX)
|
{fromX + SubProcessConst.SUB_PROCESS_SHAPE_W, fromY + SubProcessConst.SUB_PROCESS_SHAPE_H / 2},
|
||||||
? fromX + SubProcessConst.SUB_PROCESS_SHAPE_W + (toX - (fromX + SubProcessConst.SUB_PROCESS_SHAPE_W)) / 2
|
{fromX + SubProcessConst.SUB_PROCESS_SHAPE_W + SubProcessConst.SHAPE_HORIZ_INTERVAL / 2, fromY + SubProcessConst.SUB_PROCESS_SHAPE_H / 2},
|
||||||
: toX + SubProcessConst.SUB_PROCESS_SHAPE_W + (fromX - (toX + SubProcessConst.SUB_PROCESS_SHAPE_W)) / 2;
|
{fromX + SubProcessConst.SUB_PROCESS_SHAPE_W + SubProcessConst.SHAPE_HORIZ_INTERVAL / 2, fromY + SubProcessConst.SUB_PROCESS_SHAPE_H / 2},
|
||||||
double[] endPoint = (fromX < toX)
|
{toX, toY + SubProcessConst.SUB_PROCESS_SHAPE_H / 2}
|
||||||
? 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};
|
: new double[][]
|
||||||
return new double[][]{startPoint, {turnPointX, toY + (SubProcessConst.SUB_PROCESS_SHAPE_H / 2)},{turnPointX, toY + (SubProcessConst.SUB_PROCESS_SHAPE_H / 2)}, endPoint};
|
{
|
||||||
|
{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) { // 垂直
|
}else if (fromX == toX) { // 垂直
|
||||||
// 节点横向分布 连线按照大原则 垂直 不存在 fromY < toY 的情况 也就是不存在 连线从上到下直连的情况
|
// 节点横向分布 连线按照大原则 垂直 不存在 fromY < toY 的情况 也就是不存在 连线从上到下直连的情况
|
||||||
double[] startPoint = new double[]{fromX + SubProcessConst.SUB_PROCESS_SHAPE_W, fromY + SubProcessConst.SUB_PROCESS_SHAPE_H / 2};
|
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}
|
{toX + SubProcessConst.SUB_PROCESS_SHAPE_W / 2, toY}
|
||||||
};
|
};
|
||||||
}else if (fromX > toX && fromY < toY){ // 目标节点在第三象限
|
}else if (fromX > toX && fromY < toY){ // 目标节点在第三象限
|
||||||
return new double[][]{
|
return toY - fromY == SubProcessConst.SHAPE_VERT_INTERVAL
|
||||||
{fromX + SubProcessConst.SUB_PROCESS_SHAPE_W / 2, fromY + SubProcessConst.SUB_PROCESS_SHAPE_H},
|
? new double[][]
|
||||||
{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},
|
{fromX + SubProcessConst.SUB_PROCESS_SHAPE_W / 2, fromY + SubProcessConst.SUB_PROCESS_SHAPE_H},
|
||||||
{toX + SubProcessConst.SUB_PROCESS_SHAPE_W / 2, toY}
|
{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){ // 目标节点在第四象限
|
}else if (fromX < toX && fromY < toY){ // 目标节点在第四象限
|
||||||
return new double[][]{
|
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},
|
||||||
|
|||||||
@ -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.apps.coe.pal.pal.repository.designer.util.ShapeUtil;
|
||||||
import com.actionsoft.bpms.util.UtilString;
|
import com.actionsoft.bpms.util.UtilString;
|
||||||
import com.actionsoft.exception.AWSException;
|
import com.actionsoft.exception.AWSException;
|
||||||
|
import com.alibaba.fastjson.JSONArray;
|
||||||
import com.alibaba.fastjson.JSONObject;
|
import com.alibaba.fastjson.JSONObject;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@ -44,8 +45,9 @@ public class GraphNodeExpandHandle {
|
|||||||
if (relationModel == null)
|
if (relationModel == null)
|
||||||
throw new AWSException("未找到当前节点所标识的子流程文件信息");
|
throw new AWSException("未找到当前节点所标识的子流程文件信息");
|
||||||
relationFileId = relationModel.getRelationFileId();
|
relationFileId = relationModel.getRelationFileId();
|
||||||
|
// 先去与总图存储的同级目录下读取 如果为空说明是初次读取
|
||||||
childProcessDefine = apiManager.getChildProcessDefine(repositoryId, 0, relationFileId);
|
childProcessDefine = apiManager.getChildProcessDefine(repositoryId, 0, relationFileId);
|
||||||
if (UtilString.isEmpty(childProcessDefine)){ // 初次展开 去源文件目录读取
|
if (UtilString.isEmpty(childProcessDefine)){ // 初次读取 去源文件目录读取
|
||||||
BaseModel childProcessBaseModel = apiManager.getDefinition(relationFileId, 0);
|
BaseModel childProcessBaseModel = apiManager.getDefinition(relationFileId, 0);
|
||||||
childProcessDefine = childProcessBaseModel.getDefinition();
|
childProcessDefine = childProcessBaseModel.getDefinition();
|
||||||
}
|
}
|
||||||
@ -67,7 +69,7 @@ public class GraphNodeExpandHandle {
|
|||||||
* @return 范围标注框
|
* @return 范围标注框
|
||||||
* @throws AWSException
|
* @throws AWSException
|
||||||
*/
|
*/
|
||||||
public JSONObject toAssembleScopeLimitationShape() throws AWSException{
|
private JSONObject toAssembleScopeLimitationShape() throws AWSException{
|
||||||
JSONObject scopeLimitationShape = ShapeUtil.getProcessShapeDefinition(SubProcessConst.SUB_PROCESS_METHOD_ID, "展开范围标注");
|
JSONObject scopeLimitationShape = ShapeUtil.getProcessShapeDefinition(SubProcessConst.SUB_PROCESS_METHOD_ID, "展开范围标注");
|
||||||
JSONObject childProcessDefineObj = JSONObject.parseObject(childProcessDefine);
|
JSONObject childProcessDefineObj = JSONObject.parseObject(childProcessDefine);
|
||||||
JSONObject childProcessPage = childProcessDefineObj.getJSONObject("page");
|
JSONObject childProcessPage = childProcessDefineObj.getJSONObject("page");
|
||||||
@ -110,8 +112,22 @@ public class GraphNodeExpandHandle {
|
|||||||
JSONObject elements = childProcessDefineObj.getJSONObject("elements");
|
JSONObject elements = childProcessDefineObj.getJSONObject("elements");
|
||||||
for (String key : elements.keySet()) {
|
for (String key : elements.keySet()) {
|
||||||
JSONObject ele = elements.getJSONObject(key);
|
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坐标 的图形
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user