端到端功能 节点位置分布与连线处理阶段性代码提交
This commit is contained in:
parent
1506bf1270
commit
d8b9ac9fe6
Binary file not shown.
@ -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"}},
|
||||
|
||||
@ -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];
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 判断连线是否与矩形节点相交
|
||||
|
||||
@ -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);
|
||||
|
||||
Loading…
Reference in New Issue
Block a user