设计器快捷调整间距优化直线拐点

This commit is contained in:
yangl 2022-09-22 15:51:22 +08:00
parent ce8b780fc6
commit b38e4a78a1
2 changed files with 76 additions and 62 deletions

View File

@ -98,7 +98,7 @@ Designer.addFunction("selectVertical", function() {
container.unbind("mousemove.drag"); container.unbind("mousemove.drag");
let pos1 = Utils.getRelativePos(b.pageX, b.pageY, canvas) let pos1 = Utils.getRelativePos(b.pageX, b.pageY, canvas)
sublinePos = pos1.y sublinePos = pos1.y
obj = filterShapeAndLine('y',sublinePos) obj = getShapeEdge('y',sublinePos)
subline1.css({ subline1.css({
display : "block", display : "block",
"z-index" : Model.orderList.length + 4, "z-index" : Model.orderList.length + 4,
@ -138,7 +138,7 @@ Designer.addFunction("selectVertical", function() {
top : newPos.y, top : newPos.y,
}); });
} else { // 减少 } else { // 减少
let maxY = obj.passedShapesEdge - obj.sublineSideEdge > 0 ? obj.passedShapesEdge : obj.sublineSideEdge let maxY = obj.passedShapesEdge - obj.sublineSideEdge > 0 ? obj.passedShapesEdge + 3 : obj.sublineSideEdge + 3 // +3 不能完全碰到边界
if (newPos.y < maxY) { if (newPos.y < maxY) {
newPos.y = maxY newPos.y = maxY
} }
@ -210,7 +210,7 @@ Designer.addFunction("selectVertical", function() {
含有泳池泳道时要改变泳池泳道的高() 含有泳池泳道时要改变泳池泳道的高()
*/ */
function isLineBelowOrRight(line,type,pos) { // 筛选出要移动的线 function isLineBelowOrRight(line,type,pos,movedDistance) { // 筛选出要移动的线
let flag = false let flag = false
if(line.from[type] >= pos) { if(line.from[type] >= pos) {
flag = true flag = true
@ -221,21 +221,20 @@ function isLineBelowOrRight(line,type,pos) { // 筛选出要移动的线
for (let i = 0; i < line.points.length; i++) { for (let i = 0; i < line.points.length; i++) {
if (line.points[i][type] >= pos) { if (line.points[i][type] >= pos) {
flag = true flag = true
} else if(movedDistance < 0 && (pos + movedDistance < line.points[i][type]) && (line.points[i][type] < pos)) {
flag = true
} }
} }
return flag return flag
} }
function filterShapeAndLine(type,sublinePos) { function filterShapeAndLine(type,sublinePos,movedDistance) {
var elements = Model.define.elements; var elements = Model.define.elements;
var shapeArr = [] var shapeArr = []
var lineArr = [] var lineArr = []
var laneArr = [] // 泳池泳道 var laneArr = [] // 泳池泳道
var passedShapes = [] // 穿过辅助线上(左)半部分的图形 要移动 var passedShapes = [] // 穿过辅助线上(左)半部分的图形 要移动
var passedMoreShapes = [] // 穿过辅助线下(右)半部分的图形 不要移动 var passedMoreShapes = [] // 穿过辅助线下(右)半部分的图形 不要移动
var passedShapesEdge = 0
var sublineSideShape = [] // 辅助线上(左)的图形
var sublineSideEdge = 0
var movingShapes = []; // 移动的图形 var movingShapes = []; // 移动的图形
var movingLines = [] var movingLines = []
@ -260,9 +259,6 @@ function filterShapeAndLine(type,sublinePos) {
} else if(shapeArr[i].props.x + shapeArr[i].props.w/2 < sublinePos && shapeArr[i].props.x + shapeArr[i].props.w >= sublinePos) { // 辅助线穿过图形右半部分---不移动 } else if(shapeArr[i].props.x + shapeArr[i].props.w/2 < sublinePos && shapeArr[i].props.x + shapeArr[i].props.w >= sublinePos) { // 辅助线穿过图形右半部分---不移动
passedMoreShapes.push(shapeArr[i]) passedMoreShapes.push(shapeArr[i])
} }
else {
sublineSideShape.push(shapeArr[i]) // 在辅助线左侧--不需要移动
}
} else if(type == 'y') { } else if(type == 'y') {
if (shapeArr[i].props[type] > sublinePos) { // 辅助线以下 if (shapeArr[i].props[type] > sublinePos) { // 辅助线以下
movingShapes.push(shapeArr[i]) movingShapes.push(shapeArr[i])
@ -272,26 +268,15 @@ function filterShapeAndLine(type,sublinePos) {
} else if(shapeArr[i].props.y + shapeArr[i].props.h/2 < sublinePos && shapeArr[i].props.y + shapeArr[i].props.h >= sublinePos) { } else if(shapeArr[i].props.y + shapeArr[i].props.h/2 < sublinePos && shapeArr[i].props.y + shapeArr[i].props.h >= sublinePos) {
passedMoreShapes.push(shapeArr[i]) passedMoreShapes.push(shapeArr[i])
} }
else {
sublineSideShape.push(shapeArr[i])
}
} }
} }
for (let i = 0; i < lineArr.length; i++) { // 在所有的线中筛选出要移动的线 for (let i = 0; i < lineArr.length; i++) { // 在所有的线中筛选出要移动的线
let index = movingLines.findIndex(item => item.id == lineArr[i].id) let index = movingLines.findIndex(item => item.id == lineArr[i].id)
if(isLineBelowOrRight(lineArr[i],type,sublinePos) && index == -1) { if(isLineBelowOrRight(lineArr[i],type,sublinePos,movedDistance) && index == -1) {
movingLines.push(lineArr[i]) movingLines.push(lineArr[i])
} }
} }
if (sublineSideShape.length > 0 && type == 'y') {
sublineSideEdge = Math.max.apply(Math,sublineSideShape.map(item => { return (item.props.y + item.props.h) }))
} else if (sublineSideShape.length > 0 && type == 'x') {
sublineSideEdge = Math.max.apply(Math,sublineSideShape.map(item => { return (item.props.x + item.props.w) }))
}
if (passedShapes.concat(passedMoreShapes).length > 0) {
passedShapesEdge = Math.max.apply(Math,passedShapes.concat(passedMoreShapes).map(item => { return item.props[type] }))
}
if (passedShapes.length > 0) { if (passedShapes.length > 0) {
// 获取选中形状上的连接线 // 获取选中形状上的连接线
let linkers = Utils.getOutlinkers(passedShapes); let linkers = Utils.getOutlinkers(passedShapes);
@ -305,17 +290,73 @@ function filterShapeAndLine(type,sublinePos) {
return { return {
passedShapes, passedShapes,
passedMoreShapes, passedMoreShapes,
passedShapesEdge,
sublineSideEdge,
movingShapes, movingShapes,
movingLines, movingLines,
laneArr laneArr
} }
} }
function getShapeEdge(type,sublinePos) {
var elements = Model.define.elements;
var shapeArr = []
var passedShapes = [] // 穿过辅助线上(左)半部分的图形 要移动
var passedMoreShapes = [] // 穿过辅助线下(右)半部分的图形 不要移动
var sublineSideShape = [] // 辅助线上(左)的图形
var passedShapesEdge = 0
var sublineSideEdge = 0
for(let shapeId in elements) {
if (elements[shapeId].points == undefined) {
shapeArr.push(elements[shapeId])
}
}
for (let i = 0; i < shapeArr.length; i++) {
if(type == 'x') {
if (shapeArr[i].props[type] > sublinePos) {
} else if((shapeArr[i].props.x <= sublinePos) && (shapeArr[i].props.x + shapeArr[i].props.w/2>= sublinePos)) { // 辅助线穿过图形左半部分---移动
passedShapes.push(shapeArr[i])
} else if(shapeArr[i].props.x + shapeArr[i].props.w/2 < sublinePos && shapeArr[i].props.x + shapeArr[i].props.w >= sublinePos) { // 辅助线穿过图形右半部分---不移动
passedMoreShapes.push(shapeArr[i])
}
else {
sublineSideShape.push(shapeArr[i]) // 在辅助线左侧--不需要移动
}
} else if(type == 'y') {
if (shapeArr[i].props[type] > sublinePos) { // 辅助线以下
} else if((shapeArr[i].props.y <= sublinePos) && (shapeArr[i].props.y + shapeArr[i].props.h/2>= sublinePos)) { // 辅助线穿过图形上半
passedShapes.push(shapeArr[i])
} else if(shapeArr[i].props.y + shapeArr[i].props.h/2 < sublinePos && shapeArr[i].props.y + shapeArr[i].props.h >= sublinePos) {
passedMoreShapes.push(shapeArr[i])
}
else {
sublineSideShape.push(shapeArr[i])
}
}
}
if (sublineSideShape.length > 0 && type == 'y') {
sublineSideEdge = Math.max.apply(Math,sublineSideShape.map(item => { return (item.props.y + item.props.h) }))
} else if (sublineSideShape.length > 0 && type == 'x') {
sublineSideEdge = Math.max.apply(Math,sublineSideShape.map(item => { return (item.props.x + item.props.w) }))
}
if (passedShapes.concat(passedMoreShapes).length > 0) {
passedShapesEdge = Math.max.apply(Math,passedShapes.concat(passedMoreShapes).map(item => { return item.props[type] }))
}
return {
passedShapesEdge,
sublineSideEdge,
}
}
function moveShapeAndFile(type,sublinePos,movedDistance) { function moveShapeAndFile(type,sublinePos,movedDistance) {
console.log('间距调节方法调用') console.log('间距调节方法调用')
var obj = filterShapeAndLine(type,sublinePos) var obj = filterShapeAndLine(type,sublinePos,movedDistance)
var movingLines = obj.movingLines var movingLines = obj.movingLines
var movingShapes = obj.movingShapes var movingShapes = obj.movingShapes
var passedShapes = obj.passedShapes var passedShapes = obj.passedShapes
@ -335,35 +376,22 @@ function moveShapeAndFile(type,sublinePos,movedDistance) {
}) })
} }
for (let i = 0; i < movingLines.length; i++) { for (let i = 0; i < movingLines.length; i++) {
let fromIndex = passedShapes.findIndex(item => item.id == movingLines[i].from.id) let fromIndex = passedShapes.findIndex(item => item.id == movingLines[i].from.id) // 该线是否是需要移动的形状上的起点
let toIndex = passedShapes.findIndex(item => item.id == movingLines[i].to.id) let toIndex = passedShapes.findIndex(item => item.id == movingLines[i].to.id)
let moreFromIndex = passedMoreShapes.findIndex(item => item.id == movingLines[i].from.id) // 该线是否是不需要移动的形状上的起点 let moreFromIndex = passedMoreShapes.findIndex(item => item.id == movingLines[i].from.id) // 该线是否是不需要移动的形状上的起点
let moreToIndex = passedMoreShapes.findIndex(item => item.id == movingLines[i].to.id) // 上同 let moreToIndex = passedMoreShapes.findIndex(item => item.id == movingLines[i].to.id)
for (let j = 0; j < movingLines[i].points.length; j++) { for (let j = 0; j < movingLines[i].points.length; j++) {
if(movingLines[i].points[j][type] > sublinePos ) { if(movingLines[i].points[j][type] > sublinePos ) {
movingLines[i].points[j][type] += movedDistance movingLines[i].points[j][type] += movedDistance
} else if(movedDistance < 0 && (sublinePos + movedDistance < movingLines[i].points[j][type]) && (movingLines[i].points[j][type] < sublinePos)) {
movingLines[i].points[j][type] += sublinePos + movedDistance - movingLines[i].points[j][type]
} }
} }
if (movingLines[i].from[type] > sublinePos && moreFromIndex == -1) { if (movingLines[i].from[type] > sublinePos && moreFromIndex == -1) {
movingLines[i].from[type] += movedDistance movingLines[i].from[type] += movedDistance
if(type == 'y') {
if(movingLines[i].from.x == movingLines[i].to.x && movingLines[i].points.length == 2) { // 直线拐点为中点
for (let k = 0; k < movingLines[i].points.length; k++) {
movingLines[i].points[k].x = movingLines[i].from.x
movingLines[i].points[k].y = (movingLines[i].from.y + movingLines[i].to.y) / 2
}
}
} else {
if(movingLines[i].from.y == movingLines[i].to.y && movingLines[i].points.length == 2) { // 直线拐点为中点
for (let k = 0; k < movingLines[i].points.length; k++) {
movingLines[i].points[k].y = movingLines[i].from.y
movingLines[i].points[k].x = (movingLines[i].from.x + movingLines[i].to.x) / 2
}
}
}
} else if(movingLines[i].from[type] <= sublinePos && fromIndex !== -1) { } else if(movingLines[i].from[type] <= sublinePos && fromIndex !== -1) {
for (let j = 0; j < movingLines[i].points.length; j++) { for (let j = 0; j < movingLines[i].points.length; j++) {
if(movingLines[i].points[j][type] == movingLines[i].from[type]) { if(movingLines[i].points[j][type] == movingLines[i].from[type]) {
@ -372,23 +400,9 @@ function moveShapeAndFile(type,sublinePos,movedDistance) {
} }
movingLines[i].from[type] += movedDistance movingLines[i].from[type] += movedDistance
} }
if (movingLines[i].to[type] > sublinePos && moreToIndex == -1) { if (movingLines[i].to[type] > sublinePos && moreToIndex == -1) {
movingLines[i].to[type] += movedDistance movingLines[i].to[type] += movedDistance
if(type == 'y') {
if(movingLines[i].from.x == movingLines[i].to.x && movingLines[i].points.length == 2) { // 直线拐点为中点
for (let j = 0; j < movingLines[i].points.length; j++) {
movingLines[i].points[j].x = movingLines[i].from.x
movingLines[i].points[j].y = (movingLines[i].from.y + movingLines[i].to.y) / 2
}
}
} else {
if(movingLines[i].from.y == movingLines[i].to.y && movingLines[i].points.length == 2) { // 直线拐点为中点
for (let j = 0; j < movingLines[i].points.length; j++) {
movingLines[i].points[j].y = movingLines[i].from.y
movingLines[i].points[j].x = (movingLines[i].from.x + movingLines[i].to.x) / 2
}
}
}
} else if(passedShapes.length > 0 && movingLines[i].to[type] <= sublinePos && toIndex !== -1) { } else if(passedShapes.length > 0 && movingLines[i].to[type] <= sublinePos && toIndex !== -1) {
for (let j = 0; j < movingLines[i].points.length; j++) { for (let j = 0; j < movingLines[i].points.length; j++) {
if(movingLines[i].points[j][type] == movingLines[i].to[type]) { if(movingLines[i].points[j][type] == movingLines[i].to[type]) {
@ -396,8 +410,8 @@ function moveShapeAndFile(type,sublinePos,movedDistance) {
} }
} }
movingLines[i].to[type] += movedDistance movingLines[i].to[type] += movedDistance
} }
Designer.painter.renderLinker(movingLines[i]) Designer.painter.renderLinker(movingLines[i])
} }
Designer.op.hideTip(); Designer.op.hideTip();
@ -414,7 +428,7 @@ function moveShapeAndFile(type,sublinePos,movedDistance) {
} }
function moveLanes(type,sublinePos,movedDistance) { function moveLanes(type,sublinePos,movedDistance) {
var obj = filterShapeAndLine(type,sublinePos) var obj = filterShapeAndLine(type,sublinePos,movedDistance)
var movingLines = obj.movingLines var movingLines = obj.movingLines
var movingShapes = obj.movingShapes var movingShapes = obj.movingShapes
var passedShapes = obj.passedShapes var passedShapes = obj.passedShapes
@ -718,7 +732,7 @@ Designer.addFunction("selectHorizontal", function() {
container.unbind("mousemove.drag"); container.unbind("mousemove.drag");
let pos1 = Utils.getRelativePos(b.pageX, b.pageY, canvas) let pos1 = Utils.getRelativePos(b.pageX, b.pageY, canvas)
sublinePos = pos1.x sublinePos = pos1.x
obj = filterShapeAndLine('x',sublinePos) obj = getShapeEdge('x',sublinePos)
subline1.css({ subline1.css({
display : "block", display : "block",
"z-index" : Model.orderList.length + 4, "z-index" : Model.orderList.length + 4,
@ -758,7 +772,7 @@ Designer.addFunction("selectHorizontal", function() {
left : newPos.x, left : newPos.x,
}); });
} else { // 减少 } else { // 减少
let max = obj.passedShapesEdge - obj.sublineSideEdge > 0 ? obj.passedShapesEdge : obj.sublineSideEdge let max = obj.passedShapesEdge - obj.sublineSideEdge > 0 ? obj.passedShapesEdge + 3 : obj.sublineSideEdge + 3 // +3 不能完全碰到边界
if (newPos.x < max) { if (newPos.x < max) {
newPos.x = max newPos.x = max
} }