端到端功能 节点位置分布与连线处理阶段性代码提交

This commit is contained in:
qinoy 2023-05-24 14:10:21 +08:00
parent 1506bf1270
commit d8b9ac9fe6
4 changed files with 72 additions and 6 deletions

View File

@ -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"}},

View File

@ -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];
}
/**
* 判断连线是否与矩形节点相交

View File

@ -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);