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

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");
let pos1 = Utils.getRelativePos(b.pageX, b.pageY, canvas)
sublinePos = pos1.y
obj = filterShapeAndLine('y',sublinePos)
obj = getShapeEdge('y',sublinePos)
subline1.css({
display : "block",
"z-index" : Model.orderList.length + 4,
@ -138,7 +138,7 @@ Designer.addFunction("selectVertical", function() {
top : newPos.y,
});
} 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) {
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
if(line.from[type] >= pos) {
flag = true
@ -221,21 +221,20 @@ function isLineBelowOrRight(line,type,pos) { // 筛选出要移动的线
for (let i = 0; i < line.points.length; i++) {
if (line.points[i][type] >= pos) {
flag = true
} else if(movedDistance < 0 && (pos + movedDistance < line.points[i][type]) && (line.points[i][type] < pos)) {
flag = true
}
}
return flag
}
function filterShapeAndLine(type,sublinePos) {
function filterShapeAndLine(type,sublinePos,movedDistance) {
var elements = Model.define.elements;
var shapeArr = []
var lineArr = []
var laneArr = [] // 泳池泳道
var passedShapes = [] // 穿过辅助线上(左)半部分的图形 要移动
var passedMoreShapes = [] // 穿过辅助线下(右)半部分的图形 不要移动
var passedShapesEdge = 0
var sublineSideShape = [] // 辅助线上(左)的图形
var sublineSideEdge = 0
var movingShapes = []; // 移动的图形
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) { // 辅助线穿过图形右半部分---不移动
passedMoreShapes.push(shapeArr[i])
}
else {
sublineSideShape.push(shapeArr[i]) // 在辅助线左侧--不需要移动
}
} else if(type == 'y') {
if (shapeArr[i].props[type] > sublinePos) { // 辅助线以下
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) {
passedMoreShapes.push(shapeArr[i])
}
else {
sublineSideShape.push(shapeArr[i])
}
}
}
for (let i = 0; i < lineArr.length; i++) { // 在所有的线中筛选出要移动的线
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])
}
}
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) {
// 获取选中形状上的连接线
let linkers = Utils.getOutlinkers(passedShapes);
@ -305,17 +290,73 @@ function filterShapeAndLine(type,sublinePos) {
return {
passedShapes,
passedMoreShapes,
passedShapesEdge,
sublineSideEdge,
movingShapes,
movingLines,
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) {
console.log('间距调节方法调用')
var obj = filterShapeAndLine(type,sublinePos)
var obj = filterShapeAndLine(type,sublinePos,movedDistance)
var movingLines = obj.movingLines
var movingShapes = obj.movingShapes
var passedShapes = obj.passedShapes
@ -335,35 +376,22 @@ function moveShapeAndFile(type,sublinePos,movedDistance) {
})
}
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 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++) {
if(movingLines[i].points[j][type] > sublinePos ) {
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) {
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) {
for (let j = 0; j < movingLines[i].points.length; j++) {
if(movingLines[i].points[j][type] == movingLines[i].from[type]) {
@ -372,23 +400,9 @@ function moveShapeAndFile(type,sublinePos,movedDistance) {
}
movingLines[i].from[type] += movedDistance
}
if (movingLines[i].to[type] > sublinePos && moreToIndex == -1) {
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) {
for (let j = 0; j < movingLines[i].points.length; j++) {
if(movingLines[i].points[j][type] == movingLines[i].to[type]) {
@ -396,8 +410,8 @@ function moveShapeAndFile(type,sublinePos,movedDistance) {
}
}
movingLines[i].to[type] += movedDistance
}
Designer.painter.renderLinker(movingLines[i])
}
Designer.op.hideTip();
@ -414,7 +428,7 @@ function moveShapeAndFile(type,sublinePos,movedDistance) {
}
function moveLanes(type,sublinePos,movedDistance) {
var obj = filterShapeAndLine(type,sublinePos)
var obj = filterShapeAndLine(type,sublinePos,movedDistance)
var movingLines = obj.movingLines
var movingShapes = obj.movingShapes
var passedShapes = obj.passedShapes
@ -718,7 +732,7 @@ Designer.addFunction("selectHorizontal", function() {
container.unbind("mousemove.drag");
let pos1 = Utils.getRelativePos(b.pageX, b.pageY, canvas)
sublinePos = pos1.x
obj = filterShapeAndLine('x',sublinePos)
obj = getShapeEdge('x',sublinePos)
subline1.css({
display : "block",
"z-index" : Model.orderList.length + 4,
@ -758,7 +772,7 @@ Designer.addFunction("selectHorizontal", function() {
left : newPos.x,
});
} 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) {
newPos.x = max
}