|
@@ -0,0 +1,928 @@
|
|
|
|
+import { mathUtil } from '../MathUtil.js'
|
|
|
|
+import SingleDoor from '../Geometry/SingleDoor.js'
|
|
|
|
+import DoubleDoor from '../Geometry/DoubleDoor.js'
|
|
|
|
+import SlideDoor from '../Geometry/SlideDoor.js'
|
|
|
|
+import SingleWindow from '../Geometry/SingleWindow.js'
|
|
|
|
+import FrenchWindow from '../Geometry/FrenchWindow.js'
|
|
|
|
+import BayWindow from '../Geometry/BayWindow.js'
|
|
|
|
+import Pass from '../Geometry/Pass.js'
|
|
|
|
+import { coordinate } from '../Coordinate'
|
|
|
|
+import { floorplanService } from './FloorplanService'
|
|
|
|
+import { wallService } from './WallService.js'
|
|
|
|
+import VectorType from '../enum/VectorType.js'
|
|
|
|
+
|
|
|
|
+import Constant from '../Constant'
|
|
|
|
+
|
|
|
|
+export class SymbolService {
|
|
|
|
+ constructor() {
|
|
|
|
+ this.enterImg = null
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // 新建symbol
|
|
|
|
+ createSymbol(start, end, geoType, parent, symbolId) {
|
|
|
|
+ let symbol = null
|
|
|
|
+ switch (geoType) {
|
|
|
|
+ case VectorType.BayWindow:
|
|
|
|
+ symbol = new BayWindow(start, end, symbolId)
|
|
|
|
+ break
|
|
|
|
+ case VectorType.FrenchWindow:
|
|
|
|
+ symbol = new FrenchWindow(start, end, symbolId)
|
|
|
|
+ break
|
|
|
|
+ case VectorType.SingleDoor:
|
|
|
|
+ symbol = new SingleDoor(start, end, symbolId)
|
|
|
|
+ break
|
|
|
|
+ case VectorType.DoubleDoor:
|
|
|
|
+ symbol = new DoubleDoor(start, end, symbolId)
|
|
|
|
+ break
|
|
|
|
+ case VectorType.SlideDoor:
|
|
|
|
+ symbol = new SlideDoor(start, end, symbolId)
|
|
|
|
+ break
|
|
|
|
+ case VectorType.SingleWindow:
|
|
|
|
+ symbol = new SingleWindow(start, end, symbolId)
|
|
|
|
+ break
|
|
|
|
+ case VectorType.Pass:
|
|
|
|
+ symbol = new Pass(start, end, symbolId)
|
|
|
|
+ break
|
|
|
|
+ }
|
|
|
|
+ if (symbol != null) {
|
|
|
|
+ symbol.setSymbolParent(parent)
|
|
|
|
+ symbol.setPoints2d()
|
|
|
|
+ floorplanService.addSymbol(symbol)
|
|
|
|
+ }
|
|
|
|
+ if (parent) {
|
|
|
|
+ const wall = floorplanService.getWall(parent)
|
|
|
|
+ wallService.addChildren(wall, symbol.vectorId)
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return symbol
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ addSymbol(position, symbolType, wallId) {
|
|
|
|
+ const symbolLen = this.getDefaultSymbolLen(symbolType)
|
|
|
|
+ const wall = floorplanService.getWall(wallId)
|
|
|
|
+ const wallLine = wallService.getLine(wall)
|
|
|
|
+ position = mathUtil.getJoinLinePoint(position, wallLine)
|
|
|
|
+ // const twoParallels = mathUtil.getParallelLineForDistance(vSymbolLine, symbolLen / 2)
|
|
|
|
+ // const point1 = mathUtil.getIntersectionPoint(twoParallels.line1, wallLine)
|
|
|
|
+ // const point2 = mathUtil.getIntersectionPoint(twoParallels.line2, wallLine)
|
|
|
|
+ // 不能超出墙的范围
|
|
|
|
+ // const newPositions = this.getNewForContainSymbols(point1, point2, wallId)
|
|
|
|
+ // if (wallService.isContain(wall, point1) && wallService.isContain(wall, point2) && newPositions != null && !newPositions.collision) {
|
|
|
|
+ // const symbol = this.createSymbol(point1, point2, symbolType, wallId)
|
|
|
|
+ // return symbol.vectorId
|
|
|
|
+ // }
|
|
|
|
+
|
|
|
|
+ const newPositions = this.getNewPosForSymbol(position, wallId, null, symbolLen)
|
|
|
|
+ if (newPositions.state) {
|
|
|
|
+ const symbol = this.createSymbol(newPositions.position1, newPositions.position2, symbolType, wallId)
|
|
|
|
+ return symbol.vectorId
|
|
|
|
+ }
|
|
|
|
+ return null
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ isSymbol(geoType) {
|
|
|
|
+ switch (geoType) {
|
|
|
|
+ case 'BayWindow':
|
|
|
|
+ return true
|
|
|
|
+ case 'FrenchWindow':
|
|
|
|
+ return true
|
|
|
|
+ case 'SingleDoor':
|
|
|
|
+ return true
|
|
|
|
+ case 'DoubleDoor':
|
|
|
|
+ return true
|
|
|
|
+ case 'SlideDoor':
|
|
|
|
+ return true
|
|
|
|
+ case 'SingleWindow':
|
|
|
|
+ return true
|
|
|
|
+ case 'Pass':
|
|
|
|
+ return true
|
|
|
|
+ }
|
|
|
|
+ return false
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ getDefaultSymbolLen(geoType) {
|
|
|
|
+ let len = 0
|
|
|
|
+ switch (geoType) {
|
|
|
|
+ case 'BayWindow':
|
|
|
|
+ len = 1.5
|
|
|
|
+ break
|
|
|
|
+ case 'FrenchWindow':
|
|
|
|
+ len = 1.5
|
|
|
|
+ break
|
|
|
|
+ case 'SingleDoor':
|
|
|
|
+ len = 0.8
|
|
|
|
+ break
|
|
|
|
+ case 'DoubleDoor':
|
|
|
|
+ len = 1.5
|
|
|
|
+ break
|
|
|
|
+ case 'SlideDoor':
|
|
|
|
+ len = 1.5
|
|
|
|
+ break
|
|
|
|
+ case 'SingleWindow':
|
|
|
|
+ len = 0.8
|
|
|
|
+ break
|
|
|
|
+ case 'Pass':
|
|
|
|
+ len = 0.8
|
|
|
|
+ break
|
|
|
|
+ }
|
|
|
|
+ return len
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ //从墙上去掉symbol的所属
|
|
|
|
+ deleteSymbolForWall(wall, symbolId) {
|
|
|
|
+ if (wall) {
|
|
|
|
+ let index = wall.children.indexOf(symbolId)
|
|
|
|
+ if (index > -1) {
|
|
|
|
+ wall.children.splice(index, 1)
|
|
|
|
+ }
|
|
|
|
+ let symbol = floorplanService.getSymbol(symbolId)
|
|
|
|
+ symbol.parent = null
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ deleteSymbol(symbolId) {
|
|
|
|
+ const symbol = floorplanService.getSymbol(symbolId)
|
|
|
|
+ if (symbol.parent) {
|
|
|
|
+ let wall = floorplanService.getWall(symbol.parent)
|
|
|
|
+ this.deleteSymbolForWall(wall, symbolId)
|
|
|
|
+ }
|
|
|
|
+ floorplanService.deleteSymbol(symbolId)
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // 更新symbol的归属
|
|
|
|
+ changeSymbolForBelong(symbolId, wallId) {
|
|
|
|
+ const symbol = floorplanService.getSymbol(symbolId)
|
|
|
|
+ const parentId = symbol.parent
|
|
|
|
+ const parent = floorplanService.getWall(parentId)
|
|
|
|
+
|
|
|
|
+ this.deleteSymbolForWall(parent, symbolId)
|
|
|
|
+ symbol.setSymbolParent(wallId)
|
|
|
|
+ let wall = floorplanService.getWall(wallId)
|
|
|
|
+ wallService.addChildren(wall, symbolId)
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // 拆分墙的时候,symbol也要相应的改变
|
|
|
|
+ // wall拆分成wallId1和wallId2,一般情况wallId和wallId1是相同的
|
|
|
|
+ reBelongForSplitWall(wallId, wallId1, wallId2) {
|
|
|
|
+ const wall = floorplanService.getWall(wallId)
|
|
|
|
+ for (let i = 0; i < wall.children.length; ++i) {
|
|
|
|
+ const symbolId = wall.children[i]
|
|
|
|
+ if (wallId != wallId1 && this.isContainSymbolForWall(symbolId, wallId1)) {
|
|
|
|
+ this.changeSymbolForBelong(symbolId, wallId1)
|
|
|
|
+ } else if (wallId != wallId2 && this.isContainSymbolForWall(symbolId, wallId2)) {
|
|
|
|
+ this.changeSymbolForBelong(symbolId, wallId2)
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // wallId对应的墙是否包含symbol
|
|
|
|
+ isContainSymbolForWall(symbolId, wallId) {
|
|
|
|
+ const wall = floorplanService.getWall(wallId)
|
|
|
|
+ const symbol = floorplanService.getSymbol(symbolId)
|
|
|
|
+ const point = { x: (symbol.startPoint.x + symbol.endPoint.x) / 2, y: (symbol.startPoint.y + symbol.endPoint.y) / 2 }
|
|
|
|
+
|
|
|
|
+ if (wallService.isContain(wall, point)) {
|
|
|
|
+ return true
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // 更新symbol的归属
|
|
|
|
+ // 墙可能删除了,也可能合并了等等
|
|
|
|
+ changeSymbolForBelong(symbolId, wallId) {
|
|
|
|
+ const symbol = floorplanService.getSymbol(symbolId)
|
|
|
|
+ const parentId = symbol.parent
|
|
|
|
+ let parent = floorplanService.getWall(parentId)
|
|
|
|
+ this.deleteSymbolForWall(parent, symbolId)
|
|
|
|
+ symbol.setSymbolParent(wallId)
|
|
|
|
+ let wall = floorplanService.getWall(wallId)
|
|
|
|
+ wallService.addChildren(wall, symbolId)
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // 墙角pointId移动的时候,周围的symbol都跟着变化
|
|
|
|
+ updateSymbolsPositionsForWallCorner(pointId) {
|
|
|
|
+ const point = floorplanService.getPoint(pointId)
|
|
|
|
+ const parent = point.parent
|
|
|
|
+ for (const key in parent) {
|
|
|
|
+ this.updateSymbolsPositionsForWall(key)
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // wallId对应的wall改变的时候,上面的symbol也跟着改变
|
|
|
|
+ updateSymbolsPositionsForWall(wallId) {
|
|
|
|
+ const wall = floorplanService.getWall(wallId)
|
|
|
|
+ const symbolIds = wall.children
|
|
|
|
+ for (let i = 0; i < symbolIds.length; ++i) {
|
|
|
|
+ const symbol = floorplanService.getSymbol(symbolIds[i])
|
|
|
|
+ this.updateSEForChangeWall(symbol)
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // 更新Symbold的startPoint,endPoint和points2d,随着wall来
|
|
|
|
+ updateSEForChangeWall(symbol) {
|
|
|
|
+ const symbolId = symbol.vectorId
|
|
|
|
+ //const symbol = floorplanService.getSymbol(symbolId);
|
|
|
|
+ const wall = floorplanService.getWall(symbol.parent)
|
|
|
|
+
|
|
|
|
+ const startPoint = floorplanService.getPoint(wall.start)
|
|
|
|
+ const endPoint = floorplanService.getPoint(wall.end)
|
|
|
|
+
|
|
|
|
+ const line = mathUtil.createLine1(startPoint, endPoint)
|
|
|
|
+ const newStart = mathUtil.getJoinLinePoint(symbol.startPoint, line)
|
|
|
|
+ const newEnd = mathUtil.getJoinLinePoint(symbol.endPoint, line)
|
|
|
|
+
|
|
|
|
+ const dif = { x: 0, y: 0 }
|
|
|
|
+ const min = 0.001 //不要超出一点
|
|
|
|
+ let containFlag = true
|
|
|
|
+ if (!wallService.isContain(wall, newStart)) {
|
|
|
|
+ // symbol的start与wall的start挨的近
|
|
|
|
+ if (mathUtil.getDistance(newStart, startPoint) < mathUtil.getDistance(newStart, endPoint)) {
|
|
|
|
+ dif.x = startPoint.x - newStart.x
|
|
|
|
+ dif.y = startPoint.y - newStart.y
|
|
|
|
+ } else {
|
|
|
|
+ dif.x = endPoint.x - newStart.x
|
|
|
|
+ dif.y = endPoint.y - newStart.y
|
|
|
|
+ }
|
|
|
|
+ newStart.x += dif.x
|
|
|
|
+ newStart.y += dif.y
|
|
|
|
+
|
|
|
|
+ if (
|
|
|
|
+ wallService.isContain(wall, {
|
|
|
|
+ x: newEnd.x + dif.x,
|
|
|
|
+ y: newEnd.y + dif.y,
|
|
|
|
+ })
|
|
|
|
+ ) {
|
|
|
|
+ newEnd.x += dif.x
|
|
|
|
+ newEnd.y += dif.y
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ containFlag = false
|
|
|
|
+ } else if (!wallService.isContain(wall, newEnd)) {
|
|
|
|
+ if (mathUtil.getDistance(newEnd, startPoint) < mathUtil.getDistance(newEnd, endPoint)) {
|
|
|
|
+ dif.x = startPoint.x - newEnd.x
|
|
|
|
+ dif.y = startPoint.y - newEnd.y
|
|
|
|
+ } else {
|
|
|
|
+ dif.x = endPoint.x - newEnd.x
|
|
|
|
+ dif.y = endPoint.y - newEnd.y
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ newEnd.x += dif.x
|
|
|
|
+ newEnd.y += dif.y
|
|
|
|
+
|
|
|
|
+ if (
|
|
|
|
+ wallService.isContain(wall, {
|
|
|
|
+ x: newStart.x + dif.x,
|
|
|
|
+ y: newStart.y + dif.y,
|
|
|
|
+ })
|
|
|
|
+ ) {
|
|
|
|
+ newStart.x += dif.x
|
|
|
|
+ newStart.y += dif.y
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ containFlag = false
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // 是否与wall上别的symbol部分重合
|
|
|
|
+ if (!containFlag) {
|
|
|
|
+ this.updateSEForCollideSymbols(symbolId, newStart, newEnd)
|
|
|
|
+ } else {
|
|
|
|
+ this.setPosition(symbol, newStart, 'start')
|
|
|
|
+ this.setPosition(symbol, newEnd, 'end')
|
|
|
|
+ symbol.setPoints2d()
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ //需要考虑碰撞
|
|
|
|
+ updateSEForCollideSymbols(symbolId, newStart, newEnd) {
|
|
|
|
+ const symbol = floorplanService.getSymbol(symbolId)
|
|
|
|
+ // 是否与wall上别的symbol部分重合
|
|
|
|
+ const newPositions = this.getNewForContainSymbols(newStart, newEnd, symbol.parent, symbolId)
|
|
|
|
+ // if (newPositions != null) {
|
|
|
|
+ // this.setPosition(symbol, newPositions.position1, 'start')
|
|
|
|
+ // this.setPosition(symbol, newPositions.position2, 'end')
|
|
|
|
+ // symbol.setPoints2d()
|
|
|
|
+ // }
|
|
|
|
+
|
|
|
|
+ // if (mathUtil.getDistance(symbol.startPoint, symbol.endPoint) < Constant.minSymbolLen) {
|
|
|
|
+ // this.deleteSymbol(symbolId)
|
|
|
|
+ // }
|
|
|
|
+ if (newPositions != null) {
|
|
|
|
+ if (mathUtil.getDistance(newPositions.position1, newPositions.position2) < Constant.minSymbolLen) {
|
|
|
|
+ this.deleteSymbol(symbolId)
|
|
|
|
+ } else {
|
|
|
|
+ this.setPosition(symbol, newPositions.position1, 'start')
|
|
|
|
+ this.setPosition(symbol, newPositions.position2, 'end')
|
|
|
|
+ symbol.setPoints2d()
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ //position1, position2表示exceptSymbolId新的坐标
|
|
|
|
+ getNewForContainSymbols(position1, position2, wallId, exceptSymbolId) {
|
|
|
|
+ const min = 0.01
|
|
|
|
+ const wall = floorplanService.getWall(wallId)
|
|
|
|
+ let points = []
|
|
|
|
+ for (let i = 0; i < wall.children.length; ++i) {
|
|
|
|
+ const symbolId = wall.children[i]
|
|
|
|
+ if (symbolId == exceptSymbolId) {
|
|
|
|
+ continue
|
|
|
|
+ }
|
|
|
|
+ const symbol = floorplanService.getSymbol(symbolId)
|
|
|
|
+ points.push({
|
|
|
|
+ x: symbol.startPoint.x,
|
|
|
|
+ y: symbol.startPoint.y,
|
|
|
|
+ index: 1,
|
|
|
|
+ vectorId: symbolId,
|
|
|
|
+ })
|
|
|
|
+ points.push({
|
|
|
|
+ x: symbol.endPoint.x,
|
|
|
|
+ y: symbol.endPoint.y,
|
|
|
|
+ index: 2,
|
|
|
|
+ vectorId: symbolId,
|
|
|
|
+ })
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ points.push({
|
|
|
|
+ x: position1.x,
|
|
|
|
+ y: position1.y,
|
|
|
|
+ index: 1,
|
|
|
|
+ vectorId: exceptSymbolId,
|
|
|
|
+ })
|
|
|
|
+ points.push({
|
|
|
|
+ x: position2.x,
|
|
|
|
+ y: position2.y,
|
|
|
|
+ index: 2,
|
|
|
|
+ vectorId: exceptSymbolId,
|
|
|
|
+ })
|
|
|
|
+
|
|
|
|
+ const startPoint = floorplanService.getPoint(wall.start)
|
|
|
|
+ points = points.sort(sortNumber.bind(this))
|
|
|
|
+ function sortNumber(a, b) {
|
|
|
|
+ return mathUtil.getDistance(startPoint, a) - mathUtil.getDistance(startPoint, b)
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ for (let i = 0; i < points.length - 1; ++i) {
|
|
|
|
+ if (points[i].vectorId == exceptSymbolId) {
|
|
|
|
+ if (i == 0 || i == points.length - 2) {
|
|
|
|
+ if (mathUtil.getDistance(points[i], points[i + 1]) < Constant.minSymbolLen) {
|
|
|
|
+ return null
|
|
|
|
+ } else if (points[i + 1].vectorId == exceptSymbolId) {
|
|
|
|
+ return {
|
|
|
|
+ position1: position1,
|
|
|
|
+ position2: { x: points[i + 1].x, y: points[i + 1].y },
|
|
|
|
+ }
|
|
|
|
+ } else if (points[i + 1].vectorId != exceptSymbolId) {
|
|
|
|
+ return {
|
|
|
|
+ position1: position1,
|
|
|
|
+ position2: { x: points[i + 1].x, y: points[i + 1].y },
|
|
|
|
+ collision: true,
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ //不在其他symbol内部
|
|
|
|
+ else if (points[i + 1].vectorId == exceptSymbolId && points[i - 1].vectorId != points[i + 2].vectorId) {
|
|
|
|
+ if (mathUtil.getDistance({ x: points[i - 1].x, y: points[i - 1].y }, { x: points[i + 2].x, y: points[i + 2].y }) < Constant.minSymbolLen) {
|
|
|
|
+ return null
|
|
|
|
+ } else {
|
|
|
|
+ return {
|
|
|
|
+ position1: { x: points[i - 1].x, y: points[i - 1].y },
|
|
|
|
+ position2: { x: points[i + 2].x, y: points[i + 2].y },
|
|
|
|
+ //collision: true,
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ return null
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ getNewPosForSymbol(point, wallId, exceptSymbolId, currentSymbolLen) {
|
|
|
|
+ const wall = floorplanService.getWall(wallId)
|
|
|
|
+ const startPoint = floorplanService.getPoint(wall.start)
|
|
|
|
+ const endPoint = floorplanService.getPoint(wall.end)
|
|
|
|
+ const wallLine = wallService.getLine(wall)
|
|
|
|
+ const vSymbolLine = mathUtil.getVerticalLine(wallLine, point)
|
|
|
|
+ let symbolLen = currentSymbolLen
|
|
|
|
+ if (exceptSymbolId) {
|
|
|
|
+ const currentSymbol = floorplanService.getSymbol(exceptSymbolId)
|
|
|
|
+ symbolLen = currentSymbol.len
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ const twoParallels = mathUtil.getParallelLineForDistance(vSymbolLine, symbolLen / 2)
|
|
|
|
+ let point1 = mathUtil.getIntersectionPoint(twoParallels.line1, wallLine)
|
|
|
|
+ let point2 = mathUtil.getIntersectionPoint(twoParallels.line2, wallLine)
|
|
|
|
+
|
|
|
|
+ //如果在墙外部,就平移到墙内部
|
|
|
|
+ if (mathUtil.getDistance(startPoint, endPoint) < symbolLen) {
|
|
|
|
+ mathUtil.clonePoint(point1, startPoint)
|
|
|
|
+ mathUtil.clonePoint(point2, endPoint)
|
|
|
|
+ } else {
|
|
|
|
+ let dx, dy
|
|
|
|
+ let _point1 = {}
|
|
|
|
+ let _point2 = {}
|
|
|
|
+ if (!wallService.isContain(wall, point1)) {
|
|
|
|
+ dx = startPoint.x - point1.x
|
|
|
|
+ dy = startPoint.y - point1.y
|
|
|
|
+ _point2.x = point2.x + dx
|
|
|
|
+ _point2.y = point2.y + dy
|
|
|
|
+ if (!wallService.isContain(wall, _point2)) {
|
|
|
|
+ dx = endPoint.x - point1.x
|
|
|
|
+ dy = endPoint.y - point1.y
|
|
|
|
+
|
|
|
|
+ point2.x += dx
|
|
|
|
+ point2.y += dy
|
|
|
|
+ mathUtil.clonePoint(point1, endPoint)
|
|
|
|
+ } else {
|
|
|
|
+ point2.x += dx
|
|
|
|
+ point2.y += dy
|
|
|
|
+ mathUtil.clonePoint(point1, startPoint)
|
|
|
|
+ }
|
|
|
|
+ } else if (!wallService.isContain(wall, point2)) {
|
|
|
|
+ dx = startPoint.x - point2.x
|
|
|
|
+ dy = startPoint.y - point2.y
|
|
|
|
+ _point1.x = point1.x + dx
|
|
|
|
+ _point1.y = point1.y + dy
|
|
|
|
+ if (!wallService.isContain(wall, _point1)) {
|
|
|
|
+ dx = endPoint.x - point2.x
|
|
|
|
+ dy = endPoint.y - point2.y
|
|
|
|
+
|
|
|
|
+ point1.x += dx
|
|
|
|
+ point1.y += dy
|
|
|
|
+ mathUtil.clonePoint(point2, endPoint)
|
|
|
|
+ } else {
|
|
|
|
+ point1.x += dx
|
|
|
|
+ point1.y += dy
|
|
|
|
+ mathUtil.clonePoint(point2, startPoint)
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ let points = []
|
|
|
|
+ for (let i = 0; i < wall.children.length; ++i) {
|
|
|
|
+ const symbolId = wall.children[i]
|
|
|
|
+ if (symbolId == exceptSymbolId) {
|
|
|
|
+ continue
|
|
|
|
+ }
|
|
|
|
+ const symbol = floorplanService.getSymbol(symbolId)
|
|
|
|
+ points.push({
|
|
|
|
+ x: symbol.startPoint.x,
|
|
|
|
+ y: symbol.startPoint.y,
|
|
|
|
+ index: 1, //表示start
|
|
|
|
+ vectorId: symbolId,
|
|
|
|
+ })
|
|
|
|
+ points.push({
|
|
|
|
+ x: symbol.endPoint.x,
|
|
|
|
+ y: symbol.endPoint.y,
|
|
|
|
+ index: 2, //表示end
|
|
|
|
+ vectorId: symbolId,
|
|
|
|
+ })
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ points.push({
|
|
|
|
+ x: startPoint.x,
|
|
|
|
+ y: startPoint.y,
|
|
|
|
+ index: 1,
|
|
|
|
+ vectorId: wallId,
|
|
|
|
+ type: VectorType.Wall,
|
|
|
|
+ })
|
|
|
|
+ points.push({
|
|
|
|
+ x: endPoint.x,
|
|
|
|
+ y: endPoint.y,
|
|
|
|
+ index: 2,
|
|
|
|
+ vectorId: wallId,
|
|
|
|
+ type: VectorType.Wall,
|
|
|
|
+ })
|
|
|
|
+
|
|
|
|
+ points = points.sort(sortNumber.bind(this))
|
|
|
|
+ function sortNumber(a, b) {
|
|
|
|
+ return mathUtil.getDistance(startPoint, a) - mathUtil.getDistance(startPoint, b)
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ let flag = true
|
|
|
|
+ for (let i = 0; i < points.length - 1; ++i) {
|
|
|
|
+ if (mathUtil.isContainForSegment(point, points[i], points[i + 1])) {
|
|
|
|
+ if (mathUtil.getDistance(points[i], points[i + 1]) > symbolLen) {
|
|
|
|
+ //完全在一个symbol内部或者symbol内有其他的symbol
|
|
|
|
+ if (points[i].vectorId == points[i + 1].vectorId && points[i].type != VectorType.Wall) {
|
|
|
|
+ return {
|
|
|
|
+ position1: point1,
|
|
|
|
+ position2: point2,
|
|
|
|
+ collision: true,
|
|
|
|
+ state: false,
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ //完全在wall内部
|
|
|
|
+ else if (points[i].vectorId == points[i + 1].vectorId && points[i].type == VectorType.Wall) {
|
|
|
|
+ return {
|
|
|
|
+ position1: point1,
|
|
|
|
+ position2: point2,
|
|
|
|
+ collision: true,
|
|
|
|
+ state: true,
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ //一端在墙/门/窗外部
|
|
|
|
+ else if (!mathUtil.isContainForSegment(point1, points[i], points[i + 1]) || !mathUtil.isContainForSegment(point2, points[i], points[i + 1])) {
|
|
|
|
+ return {
|
|
|
|
+ position1: point1,
|
|
|
|
+ position2: point2,
|
|
|
|
+ collision: true,
|
|
|
|
+ state: false,
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ } else if (mathUtil.getDistance(points[i], points[i + 1]) < Constant.minSymbolLen) {
|
|
|
|
+ return {
|
|
|
|
+ position1: point1,
|
|
|
|
+ position2: point2,
|
|
|
|
+ collision: true,
|
|
|
|
+ state: false,
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ //大于最小距离,小于本来的长度。
|
|
|
|
+ else if (points[i].vectorId != points[i + 1].vectorId) {
|
|
|
|
+ return {
|
|
|
|
+ position1: { x: points[i].x, y: points[i].y },
|
|
|
|
+ position2: { x: points[i + 1].x, y: points[i + 1].y },
|
|
|
|
+ collision: true,
|
|
|
|
+ state: true,
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ //完全在一个symbol内部
|
|
|
|
+ else if (points[i].vectorId == points[i + 1].vectorId && points[i].type != VectorType.Wall) {
|
|
|
|
+ return {
|
|
|
|
+ position1: point1,
|
|
|
|
+ position2: point2,
|
|
|
|
+ collision: true,
|
|
|
|
+ state: false,
|
|
|
|
+ }
|
|
|
|
+ } else if (points[i].vectorId == points[i + 1].vectorId && points[i].type == VectorType.Wall) {
|
|
|
|
+ return {
|
|
|
|
+ position1: { x: points[i].x, y: points[i].y },
|
|
|
|
+ position2: { x: points[i + 1].x, y: points[i + 1].y },
|
|
|
|
+ collision: true,
|
|
|
|
+ state: true,
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ flag = false
|
|
|
|
+ } else if (mathUtil.getDistance(point, points[i]) < Constant.minRealDis) {
|
|
|
|
+ return {
|
|
|
|
+ position1: point1,
|
|
|
|
+ position2: point2,
|
|
|
|
+ collision: true,
|
|
|
|
+ state: false,
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ if (flag) {
|
|
|
|
+ return {
|
|
|
|
+ position1: point1,
|
|
|
|
+ position2: point2,
|
|
|
|
+ collision: false,
|
|
|
|
+ state: true,
|
|
|
|
+ }
|
|
|
|
+ } else {
|
|
|
|
+ //console.error(566)
|
|
|
|
+ return {
|
|
|
|
+ position1: point1,
|
|
|
|
+ position2: point2,
|
|
|
|
+ collision: false,
|
|
|
|
+ state: true,
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ // return {
|
|
|
|
+ // position1: point1,
|
|
|
|
+ // position2: point2,
|
|
|
|
+ // collision: false,
|
|
|
|
+ // state: true,
|
|
|
|
+ // }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ setPosition(symbol, position, dir) {
|
|
|
|
+ if (dir == 'start') {
|
|
|
|
+ mathUtil.clonePoint(symbol.startPoint, position)
|
|
|
|
+ } else if (dir == 'end') {
|
|
|
|
+ mathUtil.clonePoint(symbol.endPoint, position)
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // 只考虑symbol的端点可能不在墙面上了,这时候要更新
|
|
|
|
+ // 用在移动墙面的时候,邻居墙的symbols可能要变
|
|
|
|
+ updateSymbolsPositionsForNeighWall(wallId) {
|
|
|
|
+ const wall = floorplanService.getWall(wallId)
|
|
|
|
+ const symbolIds = wall.children
|
|
|
|
+ for (let i = 0; i < symbolIds.length; ++i) {
|
|
|
|
+ this.updateSEForWallSize(symbolIds[i])
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // 更新symbol的start或者end,一般是symbol的端点在墙外了
|
|
|
|
+ updateSEForWallSize(symbolId) {
|
|
|
|
+ const symbol = floorplanService.getSymbol(symbolId)
|
|
|
|
+ const wall = floorplanService.getWall(symbol.parent)
|
|
|
|
+ const startPoint = floorplanService.getPoint(wall.start)
|
|
|
|
+ const endPoint = floorplanService.getPoint(wall.end)
|
|
|
|
+ const newStart = {
|
|
|
|
+ x: symbol.startPoint.x,
|
|
|
|
+ y: symbol.startPoint.y,
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ const newEnd = {
|
|
|
|
+ x: symbol.endPoint.x,
|
|
|
|
+ y: symbol.endPoint.y,
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ const dif = { x: 0, y: 0 }
|
|
|
|
+
|
|
|
|
+ if (!wallService.isContain(wall, newStart)) {
|
|
|
|
+ // symbol的start与wall的start挨的近
|
|
|
|
+ if (mathUtil.getDistance(newStart, startPoint) < mathUtil.getDistance(newStart, endPoint)) {
|
|
|
|
+ dif.x = startPoint.x - newStart.x
|
|
|
|
+ dif.y = startPoint.y - newStart.y
|
|
|
|
+ } else {
|
|
|
|
+ dif.x = endPoint.x - newStart.x
|
|
|
|
+ dif.y = endPoint.y - newStart.y
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ newStart.x += dif.x
|
|
|
|
+ newStart.y += dif.y
|
|
|
|
+ } else if (!wallService.isContain(wall, newEnd)) {
|
|
|
|
+ if (mathUtil.getDistance(newEnd, startPoint) < mathUtil.getDistance(newEnd, endPoint)) {
|
|
|
|
+ dif.x = startPoint.x - newEnd.x
|
|
|
|
+ dif.y = startPoint.y - newEnd.y
|
|
|
|
+ } else {
|
|
|
|
+ dif.x = endPoint.x - newEnd.x
|
|
|
|
+ dif.y = endPoint.y - newEnd.y
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ newEnd.x += dif.x
|
|
|
|
+ newEnd.y += dif.y
|
|
|
|
+ } else {
|
|
|
|
+ return null
|
|
|
|
+ }
|
|
|
|
+ this.updateSEForCollideSymbols(symbolId, newStart, newEnd)
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ updateSymbolForLen(symbolId, len) {
|
|
|
|
+ const symbol = floorplanService.getSymbol(symbolId)
|
|
|
|
+ const start = symbol.startPoint
|
|
|
|
+ const end = symbol.endPoint
|
|
|
|
+ const line = mathUtil.createLine1(start, end)
|
|
|
|
+ const midPoint = { x: (start.x + end.x) / 2, y: (start.y + end.y) / 2 }
|
|
|
|
+ const vertLine = mathUtil.getVerticalLine(line, midPoint)
|
|
|
|
+
|
|
|
|
+ const wall = floorplanService.getWall(symbol.parent)
|
|
|
|
+ const startPoint = floorplanService.getPoint(wall.start)
|
|
|
|
+ const endPoint = floorplanService.getPoint(wall.end)
|
|
|
|
+
|
|
|
|
+ if (len == null || typeof len === 'undefined') {
|
|
|
|
+ len = mathUtil.getDistance(start, end)
|
|
|
|
+ const distance = mathUtil.getDistance(startPoint, endPoint)
|
|
|
|
+ if (len > distance) {
|
|
|
|
+ len = distance
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ const lines = mathUtil.getParallelLineForDistance(vertLine, len / 2)
|
|
|
|
+
|
|
|
|
+ const join1 = mathUtil.getIntersectionPoint(lines.line1, line)
|
|
|
|
+ const join2 = mathUtil.getIntersectionPoint(lines.line2, line)
|
|
|
|
+
|
|
|
|
+ const symbolInfo = {}
|
|
|
|
+ if (mathUtil.getDistance(start, join1) < mathUtil.getDistance(start, join2)) {
|
|
|
|
+ symbolInfo.start = join1
|
|
|
|
+ symbolInfo.end = join2
|
|
|
|
+ } else {
|
|
|
|
+ symbolInfo.start = join2
|
|
|
|
+ symbolInfo.end = join1
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ let startFlag = false
|
|
|
|
+ let endFlag = false
|
|
|
|
+ let dx, dy
|
|
|
|
+ const nearestPosition = this.getNearestPosition(symbol.parent, symbolId, true)
|
|
|
|
+ if (nearestPosition.startPosition != null && mathUtil.PointInSegment(nearestPosition.startPosition, symbolInfo.start, symbolInfo.end)) {
|
|
|
|
+ // start堵住了,end需要增加
|
|
|
|
+ //dx = symbolInfo.end.x - symbol.endPoint.x
|
|
|
|
+ //dy = symbolInfo.end.y - symbol.endPoint.y
|
|
|
|
+ dx = symbolInfo.start.x - nearestPosition.startPosition.x
|
|
|
|
+ dy = symbolInfo.start.y - nearestPosition.startPosition.y
|
|
|
|
+ mathUtil.clonePoint(symbolInfo.start, nearestPosition.startPosition)
|
|
|
|
+ symbolInfo.end.x -= dx
|
|
|
|
+ symbolInfo.end.y -= dy
|
|
|
|
+
|
|
|
|
+ startFlag = true
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if (nearestPosition.endPosition != null && mathUtil.PointInSegment(nearestPosition.endPosition, symbolInfo.start, symbolInfo.end)) {
|
|
|
|
+ // end堵住了,start需要增加
|
|
|
|
+ dx = symbolInfo.end.x - nearestPosition.endPosition.x
|
|
|
|
+ dy = symbolInfo.end.y - nearestPosition.endPosition.y
|
|
|
|
+ mathUtil.clonePoint(symbolInfo.end, nearestPosition.endPosition)
|
|
|
|
+ if (!startFlag) {
|
|
|
|
+ symbolInfo.start.x -= dx
|
|
|
|
+ symbolInfo.start.y -= dy
|
|
|
|
+ //这时候可能start又超出范围了
|
|
|
|
+ if (mathUtil.PointInSegment(nearestPosition.startPosition, symbolInfo.start, symbolInfo.end)) {
|
|
|
|
+ mathUtil.clonePoint(symbolInfo.start, nearestPosition.startPosition)
|
|
|
|
+ startFlag = true
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ endFlag = true
|
|
|
|
+ }
|
|
|
|
+ symbolInfo.vectorId = symbolId
|
|
|
|
+ mathUtil.clonePoint(symbol.startPoint, symbolInfo.start)
|
|
|
|
+ mathUtil.clonePoint(symbol.endPoint, symbolInfo.end)
|
|
|
|
+ symbol.setPoints2d()
|
|
|
|
+
|
|
|
|
+ return {
|
|
|
|
+ block: startFlag & endFlag,
|
|
|
|
+ start: symbolInfo.start,
|
|
|
|
+ end: symbolInfo.end,
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ getNearestPosition(wallId, symbolId, isExceedWall, position1, position2) {
|
|
|
|
+ const wall = floorplanService.getWall(wallId)
|
|
|
|
+ const startPoint = floorplanService.getPoint(wall.start)
|
|
|
|
+ const endPoint = floorplanService.getPoint(wall.end)
|
|
|
|
+ const symbolIds = wall.children
|
|
|
|
+ let symbol = floorplanService.getSymbol(symbolId)
|
|
|
|
+
|
|
|
|
+ if (!symbol && !symbolId) {
|
|
|
|
+ symbol = {}
|
|
|
|
+ symbol = {
|
|
|
|
+ struct: {},
|
|
|
|
+ }
|
|
|
|
+ symbol.startPoint = position1
|
|
|
|
+ symbol.endPoint = position2
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ let minSdis = 10000
|
|
|
|
+ let minEdis = 10000
|
|
|
|
+ let startPosition = null
|
|
|
|
+ let endPosition = null
|
|
|
|
+
|
|
|
|
+ // 与startPosition同属symbol端点(另一头)
|
|
|
|
+ let startPosition2 = null
|
|
|
|
+ // 与endPosition同属symbol端点(另一头)
|
|
|
|
+ let endPosition2 = null
|
|
|
|
+
|
|
|
|
+ for (let i = 0; i < symbolIds.length; ++i) {
|
|
|
|
+ if (symbolIds[i] == symbolId) {
|
|
|
|
+ continue
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ const otherSymbol = floorplanService.getSymbol(symbolIds[i])
|
|
|
|
+
|
|
|
|
+ const dis1 = mathUtil.getDistance(symbol.startPoint, otherSymbol.startPoint)
|
|
|
|
+ const dis2 = mathUtil.getDistance(symbol.startPoint, otherSymbol.endPoint)
|
|
|
|
+ if (minSdis > Math.min(dis1, dis2)) {
|
|
|
|
+ if (dis1 < dis2) {
|
|
|
|
+ startPosition = otherSymbol.startPoint
|
|
|
|
+ startPosition2 = otherSymbol.endPoint
|
|
|
|
+ } else {
|
|
|
|
+ startPosition = otherSymbol.endPoint
|
|
|
|
+ startPosition2 = otherSymbol.startPoint
|
|
|
|
+ }
|
|
|
|
+ if (mathUtil.getDistance(symbol.startPoint, startPosition) > mathUtil.getDistance(symbol.endPoint, startPosition)) {
|
|
|
|
+ startPosition = null
|
|
|
|
+ startPosition2 = null
|
|
|
|
+ } else {
|
|
|
|
+ minSdis = Math.min(dis1, dis2)
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ const dis3 = mathUtil.getDistance(symbol.endPoint, otherSymbol.startPoint)
|
|
|
|
+ const dis4 = mathUtil.getDistance(symbol.endPoint, otherSymbol.endPoint)
|
|
|
|
+ if (minEdis > Math.min(dis3, dis4)) {
|
|
|
|
+ if (dis3 < dis4) {
|
|
|
|
+ endPosition = otherSymbol.startPoint
|
|
|
|
+ endPosition2 = otherSymbol.endPoint
|
|
|
|
+ } else {
|
|
|
|
+ endPosition = otherSymbol.endPoint
|
|
|
|
+ endPosition2 = otherSymbol.startPoint
|
|
|
|
+ }
|
|
|
|
+ if (mathUtil.getDistance(symbol.endPoint, endPosition) > mathUtil.getDistance(symbol.startPoint, endPosition)) {
|
|
|
|
+ endPosition = null
|
|
|
|
+ endPosition2 = null
|
|
|
|
+ } else {
|
|
|
|
+ minEdis = Math.min(dis3, dis4)
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if (isExceedWall) {
|
|
|
|
+ if (startPosition == null) {
|
|
|
|
+ if (mathUtil.getDistance(startPoint, symbol.startPoint) > mathUtil.getDistance(startPoint, symbol.endPoint)) {
|
|
|
|
+ startPosition = endPoint
|
|
|
|
+ startPosition2 = endPoint
|
|
|
|
+ } else {
|
|
|
|
+ startPosition = startPoint
|
|
|
|
+ startPosition2 = startPoint
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if (endPosition == null) {
|
|
|
|
+ if (mathUtil.getDistance(startPoint, symbol.startPoint) > mathUtil.getDistance(startPoint, symbol.endPoint)) {
|
|
|
|
+ endPosition = startPoint
|
|
|
|
+ endPosition2 = startPoint
|
|
|
|
+ } else {
|
|
|
|
+ endPosition = endPoint
|
|
|
|
+ endPosition2 = endPoint
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ return {
|
|
|
|
+ startPosition: startPosition,
|
|
|
|
+ startPosition2: startPosition2,
|
|
|
|
+ endPosition: endPosition,
|
|
|
|
+ endPosition2: endPosition2,
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // point是目标点,selectState表示start还是end
|
|
|
|
+ // 只是不允许start和end互换位置
|
|
|
|
+ moveSymbolSinglePoint(targetPosition, symbolId, selectState) {
|
|
|
|
+ const symbol = floorplanService.getSymbol(symbolId)
|
|
|
|
+ const symbolLine = mathUtil.createLine1(symbol.startPoint, symbol.endPoint)
|
|
|
|
+
|
|
|
|
+ const vSymbolLine = mathUtil.getVerticalLine(symbolLine, targetPosition)
|
|
|
|
+ targetPosition = mathUtil.getIntersectionPoint(vSymbolLine, symbolLine)
|
|
|
|
+
|
|
|
|
+ const midPoint = {
|
|
|
|
+ x: (symbol.startPoint.x + symbol.endPoint.x) / 2,
|
|
|
|
+ y: (symbol.startPoint.y + symbol.endPoint.y) / 2,
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // 是否超过了wall外
|
|
|
|
+ const wall = floorplanService.getWall(symbol.parent)
|
|
|
|
+ const startPoint = floorplanService.getPoint(wall.start)
|
|
|
|
+ const endPoint = floorplanService.getPoint(wall.end)
|
|
|
|
+
|
|
|
|
+ if (selectState == 'start') {
|
|
|
|
+ // symbol的start和end位置交换了
|
|
|
|
+ if (!mathUtil.PointInSegment(midPoint, targetPosition, symbol.endPoint)) {
|
|
|
|
+ return null
|
|
|
|
+ } else {
|
|
|
|
+ // start-start
|
|
|
|
+ if (mathUtil.getDistance(symbol.startPoint, startPoint) < mathUtil.getDistance(symbol.endPoint, startPoint)) {
|
|
|
|
+ // 超出了
|
|
|
|
+ if (mathUtil.getDistance(targetPosition, midPoint) > mathUtil.getDistance(startPoint, midPoint)) {
|
|
|
|
+ mathUtil.clonePoint(targetPosition, startPoint)
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ // start-end
|
|
|
|
+ else {
|
|
|
|
+ // 超出了
|
|
|
|
+ if (mathUtil.getDistance(targetPosition, midPoint) > mathUtil.getDistance(endPoint, midPoint)) {
|
|
|
|
+ mathUtil.clonePoint(targetPosition, endPoint)
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ } else if (selectState == 'end') {
|
|
|
|
+ // symbol的start和end位置交换了
|
|
|
|
+ if (!mathUtil.PointInSegment(midPoint, targetPosition, symbol.startPoint)) {
|
|
|
|
+ return null
|
|
|
|
+ } else {
|
|
|
|
+ // start-start
|
|
|
|
+ if (mathUtil.getDistance(symbol.endPoint, endPoint) < mathUtil.getDistance(symbol.startPoint, endPoint)) {
|
|
|
|
+ // 超出了
|
|
|
|
+ if (mathUtil.getDistance(targetPosition, midPoint) > mathUtil.getDistance(endPoint, midPoint)) {
|
|
|
|
+ mathUtil.clonePoint(targetPosition, endPoint)
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ // start-end
|
|
|
|
+ else {
|
|
|
|
+ // 超出了
|
|
|
|
+ if (mathUtil.getDistance(targetPosition, midPoint) > mathUtil.getDistance(startPoint, midPoint)) {
|
|
|
|
+ mathUtil.clonePoint(targetPosition, startPoint)
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return {
|
|
|
|
+ dir: selectState,
|
|
|
|
+ position: targetPosition,
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ setSymbolInfo(symbolInfo) {
|
|
|
|
+ let symbol = floorplanService.getSymbol(symbolInfo.vectorId)
|
|
|
|
+ symbol.openSide = symbolInfo.openSide
|
|
|
|
+ symbol.startPoint = symbolInfo.start
|
|
|
|
+ symbol.endPoint = symbolInfo.end
|
|
|
|
+ symbol.points2d = JSON.parse(JSON.stringify(symbolInfo.points2d))
|
|
|
|
+ symbol.enter = symbolInfo.enter
|
|
|
|
+ symbol.parent = symbolInfo.parent
|
|
|
|
+ return symbol
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ setEnterImg(img) {
|
|
|
|
+ this.enterImg = img
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ getEnterImg() {
|
|
|
|
+ return this.enterImg
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+const symbolService = new SymbolService()
|
|
|
|
+export { symbolService }
|